UNPKG

3.74 kBJavaScriptView Raw
1'use strict'
2
3const test = require('tap').test
4const async = require('async')
5const summary = require('summary')
6const endpoint = require('endpoint')
7const CollectAndRead = require('./collect-and-read.js')
8
9function diff (data) {
10 const output = []
11 let last = data[0]
12 for (let i = 1; i < data.length; i++) {
13 output.push(data[i] - last)
14 last = data[i]
15 }
16 return output
17}
18
19test('cmd - collect - gc events', function (t) {
20 const cmd = new CollectAndRead({}, '--expose-gc', '-e', `
21 const t = [];
22
23 const interval1 = setInterval(function () {
24 for (let i = 0; i < 2000; i++) {
25 t.push(new Date())
26 }
27 }, 20)
28
29 const interval2 = setInterval(function () {
30 for (let i = 0; i < 500; i++) {
31 t.pop()
32 }
33 })
34
35 setTimeout(function () {
36 clearInterval(interval1)
37 clearInterval(interval2)
38 global.gc()
39 }, 200)
40 `)
41
42 cmd.on('error', t.ifError.bind(t))
43 cmd.on('ready', function () {
44 async.parallel({
45 traceEvent (done) {
46 cmd.traceEvent.pipe(endpoint({ objectMode: true }, done))
47 },
48
49 processStat (done) {
50 cmd.processStat.pipe(endpoint({ objectMode: true }, done))
51 }
52 }, function (err, output) {
53 if (err) return t.ifError(err)
54
55 const scavenge = output.traceEvent
56 .filter((event) => event.name === 'V8.GCScavenger')
57 const compactor = output.traceEvent
58 .filter((event) => event.name === 'V8.GCCompactor')
59
60 t.ok(scavenge.length >= 1)
61 t.ok(scavenge[0].args.startTimestamp <= scavenge[0].args.endTimestamp)
62 t.ok(Math.abs(scavenge[0].args.endTimestamp - Date.now()) < 10000)
63 t.ok(Math.abs(scavenge[0].args.startTimestamp - Date.now()) < 10000)
64
65 t.strictEqual(compactor.length, 1)
66 t.ok(compactor[0].args.startTimestamp <= compactor[0].args.endTimestamp)
67 t.ok(Math.abs(compactor[0].args.startTimestamp - Date.now()) < 10000)
68 t.ok(Math.abs(compactor[0].args.endTimestamp - Date.now()) < 10000)
69
70 t.end()
71 })
72 })
73})
74
75test('cmd - collect - data files have content', function (t) {
76 const cmd = new CollectAndRead({
77 sampleInterval: 100
78 }, '-e', 'setTimeout(() => {}, 1000)')
79 cmd.on('error', t.ifError.bind(t))
80 cmd.on('ready', function () {
81 async.parallel({
82 traceEvent (done) {
83 cmd.traceEvent.pipe(endpoint({ objectMode: true }, done))
84 },
85
86 processStat (done) {
87 cmd.processStat.pipe(endpoint({ objectMode: true }, done))
88 }
89 }, function (err, output) {
90 if (err) return t.ifError(err)
91
92 // expect time seperation to be 10ms, allow 20ms error
93 const sampleTimes = output.processStat.map((stat) => stat.timestamp)
94 const timeSeperation = summary(diff(sampleTimes)).mean()
95 t.ok(sampleTimes.length > 0, 'data is outputted')
96 t.ok(Math.abs(timeSeperation - 100) < 100)
97
98 t.end()
99 })
100 })
101})
102
103test('cmd - collect - startup delay is not included', function (t) {
104 const cmd = new CollectAndRead({}, '-e', `
105 function deltams (now) {
106 const delta = process.hrtime(now)
107 return delta[0] * 1e3 + delta[1] * 1e-6
108 }
109 const now = process.hrtime()
110 while (deltams(now) < 100) { }
111 setTimeout(() => {}, 100)
112 `)
113 cmd.on('error', t.ifError.bind(t))
114 cmd.on('ready', function () {
115 async.parallel({
116 traceEvent (done) {
117 cmd.traceEvent.pipe(endpoint({ objectMode: true }, done))
118 },
119
120 processStat (done) {
121 cmd.processStat.pipe(endpoint({ objectMode: true }, done))
122 }
123 }, function (err, output) {
124 if (err) return t.ifError(err)
125
126 const delay = output.processStat.map((stat) => stat.delay)
127 t.ok(delay[0] < 90, `startup delay was ${delay[0]}`)
128 t.end()
129 })
130 })
131})