1 | 'use strict'
|
2 |
|
3 | const test = require('tap').test
|
4 | const endpoint = require('endpoint')
|
5 | const startpoint = require('startpoint')
|
6 | const SystemInfoDecoder = require('../format/system-info-decoder.js')
|
7 | const TraceEventDecoder = require('../format/trace-event-decoder.js')
|
8 |
|
9 | function traceEvent (data) {
|
10 |
|
11 | return Object.assign({ pid: 10, tid: 1, ph: 'X', cat: 'v8' }, data, { args: {} })
|
12 | }
|
13 |
|
14 | test('Format - trace event - combine', function (t) {
|
15 | const data = [
|
16 | traceEvent({ name: 'V8.GCScavenger', ts: 1400, dur: 500 }),
|
17 | traceEvent({ name: 'V8.GCIncrementalMarkingStart', ts: 2400, dur: 50 }),
|
18 | traceEvent({ name: 'V8.GCIncrementalMarking', ts: 3400, dur: 1000 }),
|
19 | traceEvent({ name: 'V8.GCIncrementalMarking', ts: 4400, dur: 1000 }),
|
20 | traceEvent({ name: 'V8.GCIncrementalMarkingFinalize', ts: 5400, dur: 50 }),
|
21 | traceEvent({ name: 'V8.GCIncrementalMarking', ts: 6400, dur: 1000 }),
|
22 | traceEvent({ name: 'V8.GCFinalizeMC', ts: 7400, dur: 1000 }),
|
23 | traceEvent({ name: 'V8.GCScavenger', ts: 8400, dur: 500 }),
|
24 | traceEvent({ name: 'V8.GCIncrementalMarking', ts: 9400, dur: 500 }),
|
25 | traceEvent({ name: 'V8.GCCompactor', ts: 10400, dur: 500 })
|
26 | ]
|
27 |
|
28 | const timeOffset = 33000000
|
29 | const systemInfoReader = new SystemInfoDecoder()
|
30 | systemInfoReader.end(JSON.stringify({
|
31 | clock: {
|
32 | hrtime: [0, 400000],
|
33 | unixtime: timeOffset
|
34 | }
|
35 | }))
|
36 | const decoder = new TraceEventDecoder(systemInfoReader)
|
37 |
|
38 | decoder.pipe(endpoint({ objectMode: true }, function (err, data) {
|
39 | if (err) return t.ifError(err)
|
40 |
|
41 | t.strictDeepEqual(data, [
|
42 | {
|
43 | pid: 10,
|
44 | tid: 1,
|
45 | ph: 'X',
|
46 | cat: 'v8',
|
47 | name: 'V8.GCScavenger',
|
48 | ts: 1400,
|
49 | dur: 500,
|
50 | args: {
|
51 | startTimestamp: 1 + timeOffset,
|
52 | endTimestamp: 1.5 + timeOffset
|
53 | }
|
54 | }, {
|
55 | pid: 10,
|
56 | tid: 1,
|
57 | ph: 'X',
|
58 | cat: 'v8',
|
59 | name: 'V8.GCMarkSweepCompact',
|
60 | ts: 2400,
|
61 | dur: 6000,
|
62 | args: {
|
63 | startTimestamp: 2 + timeOffset,
|
64 | endTimestamp: 8 + timeOffset
|
65 | }
|
66 | }, {
|
67 | pid: 10,
|
68 | tid: 1,
|
69 | ph: 'X',
|
70 | cat: 'v8',
|
71 | name: 'V8.GCScavenger',
|
72 | ts: 8400,
|
73 | dur: 500,
|
74 | args: {
|
75 | startTimestamp: 8 + timeOffset,
|
76 | endTimestamp: 8.5 + timeOffset
|
77 | }
|
78 | }, {
|
79 | pid: 10,
|
80 | tid: 1,
|
81 | ph: 'X',
|
82 | cat: 'v8',
|
83 | name: 'V8.GCIncrementalMarking',
|
84 | ts: 9400,
|
85 | dur: 500,
|
86 | args: {
|
87 | startTimestamp: 9 + timeOffset,
|
88 | endTimestamp: 9.5 + timeOffset
|
89 | }
|
90 | }, {
|
91 | pid: 10,
|
92 | tid: 1,
|
93 | ph: 'X',
|
94 | cat: 'v8',
|
95 | name: 'V8.GCCompactor',
|
96 | ts: 10400,
|
97 | dur: 500,
|
98 | args: {
|
99 | startTimestamp: 10 + timeOffset,
|
100 | endTimestamp: 10.5 + timeOffset
|
101 | }
|
102 | }
|
103 | ])
|
104 | t.end()
|
105 | }))
|
106 |
|
107 | decoder.end(JSON.stringify({
|
108 | traceEvents: data
|
109 | }))
|
110 | })
|
111 |
|
112 | test('Format - trace event - error', function (t) {
|
113 | const systemInfoReader = startpoint(
|
114 | new Error('expected error'),
|
115 | { objectMode: true }
|
116 | )
|
117 | const decoder = new TraceEventDecoder(systemInfoReader)
|
118 |
|
119 | decoder.pipe(endpoint({ objectMode: true }, function (err, data) {
|
120 | t.strictDeepEqual(err, new Error('expected error'))
|
121 | t.end()
|
122 | }))
|
123 |
|
124 | decoder.end(JSON.stringify({
|
125 | traceEvents: []
|
126 | }))
|
127 | })
|