• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1'use strict';
2
3const common = require('../common');
4const assert = require('assert');
5const http = require('http');
6
7const { PerformanceObserver } = require('perf_hooks');
8const entries = [];
9const obs = new PerformanceObserver(common.mustCallAtLeast((items) => {
10  entries.push(...items.getEntries());
11}));
12
13obs.observe({ type: 'http' });
14
15const expected = 'Post Body For Test';
16const makeRequest = (options) => {
17  return new Promise((resolve, reject) => {
18    http.request(options, common.mustCall((res) => {
19      resolve();
20    })).on('error', reject).end(options.data);
21  });
22};
23
24const server = http.Server(common.mustCall((req, res) => {
25  let result = '';
26
27  req.setEncoding('utf8');
28  req.on('data', function(chunk) {
29    result += chunk;
30  });
31
32  req.on('end', common.mustCall(function() {
33    assert.strictEqual(result, expected);
34    res.writeHead(200);
35    res.end('hello world\n');
36  }));
37}, 2));
38
39server.listen(0, common.mustCall(async () => {
40  await Promise.all([
41    makeRequest({
42      port: server.address().port,
43      path: '/',
44      method: 'POST',
45      data: expected
46    }),
47    makeRequest({
48      port: server.address().port,
49      path: '/',
50      method: 'POST',
51      data: expected
52    }),
53  ]);
54  server.close();
55}));
56
57process.on('exit', () => {
58  let numberOfHttpClients = 0;
59  let numberOfHttpRequests = 0;
60  for (const entry of entries) {
61    assert.strictEqual(entry.entryType, 'http');
62    assert.strictEqual(typeof entry.startTime, 'number');
63    assert.strictEqual(typeof entry.duration, 'number');
64    if (entry.name === 'HttpClient') {
65      numberOfHttpClients++;
66    } else if (entry.name === 'HttpRequest') {
67      numberOfHttpRequests++;
68    }
69    assert.strictEqual(typeof entry.detail.req.method, 'string');
70    assert.strictEqual(typeof entry.detail.req.url, 'string');
71    assert.strictEqual(typeof entry.detail.req.headers, 'object');
72    assert.strictEqual(typeof entry.detail.res.statusCode, 'number');
73    assert.strictEqual(typeof entry.detail.res.statusMessage, 'string');
74    assert.strictEqual(typeof entry.detail.res.headers, 'object');
75  }
76  assert.strictEqual(numberOfHttpClients, 2);
77  assert.strictEqual(numberOfHttpRequests, 2);
78});
79