3 Copyright (c) 2014 The Chromium Authors. All rights reserved.
4 Use of this source code is governed by a BSD-style license that can be
5 found in the LICENSE file.
8 <link rel="import" href="/tracing/test_utils.html">
9 <link rel="import" href="/tracing/importer/etw_importer.html">
10 <link rel="import" href="/tracing/importer/etw/thread_parser.html">
15 tvcm.unittest.testSuite(function() {
17 // Constants for Thread events.
18 var guid = '3D6FA8D1-FE05-11D0-9DDA-00C04FD7BA7C';
19 var kThreadStartOpcode = 1;
20 var kThreadEndOpcode = 2;
21 var kThreadDCStartOpcode = 3;
22 var kThreadCSwitchOpcode = 36;
24 var kThreadStartPayload32bitV1 =
25 'BAAAAEwHAAAAYLfzADC38wAAAAAAAAAAhdse9wAAAAD/AAAA';
27 var kThreadEndPayload32bitV1 = 'BAAAALQAAAA=';
30 var kThreadDCStartPayload64bitV2 =
31 'AAAAAAAAAAAAYPUCAPj//wAA9QIA+P//AAAAAAAAAAAAAAAAAAAAAIAlxwEA+P//gCXHA' +
32 'QD4//8AAAAAAAAAAAAAAAA=';
34 var kThreadStartPayload32bitV3 =
35 'LAIAACwTAAAAUJixACCYsQAA1QAAwNQAAwAAAOkDq3cA4P1/AAAAAAkFAgA=';
37 var kThreadStartPayload64bitV3 =
38 'eCEAAJQUAAAAMA4nAND//wDQDScA0P//MP0LBgAAAAAAgAsGAAAAAP8AAAAAAAAALP1YX' +
39 'AAAAAAAwBL/AAAAAAAAAAAIBQIA';
41 var kThreadCSwitchPayload32bitV2 = 'AAAAACwRAAAACQAAFwABABIAAAAmSAAA';
42 var kThreadCSwitchPayload64bitV2 = 'zAgAAAAAAAAIAAEAAAACBAEAAACHbYg0';
44 test('DecodeFields', function() {
46 var importer = new tracing.importer.EtwImporter('dummy', []);
47 var decoder = importer.decoder_;
48 var parser = new tracing.importer.etw.ThreadParser(importer);
52 // Validate a version 1 32-bit payload.
53 header = { guid: guid, opcode: kThreadStartOpcode, version: 1, is64: 0 };
54 decoder.reset(kThreadStartPayload32bitV1);
55 fields = parser.decodeFields(header, decoder);
57 assertTrue(fields.processId == 4);
58 assertTrue(fields.threadId == 1868);
59 assertTrue(fields.stackBase == 4088881152);
60 assertTrue(fields.stackLimit == 4088868864);
61 assertTrue(fields.userStackBase == 0);
62 assertTrue(fields.userStackLimit == 0);
63 assertTrue(fields.startAddr == 4145994629);
64 assertTrue(fields.win32StartAddr == 0);
65 assertTrue(fields.waitMode == -1);
67 // Validate an End version 1 32-bit payload.
68 header = { guid: guid, opcode: kThreadEndOpcode, version: 1, is64: 0 };
69 decoder.reset(kThreadStartPayload32bitV1);
70 fields = parser.decodeFields(header, decoder);
72 assertTrue(fields.processId == 4);
73 assertTrue(fields.threadId == 1868);
75 // Validate a version 2 64-bit payload.
76 header = { guid: guid, opcode: kThreadDCStartOpcode, version: 2, is64: 1 };
77 decoder.reset(kThreadDCStartPayload64bitV2);
78 fields = parser.decodeFields(header, decoder);
80 assertTrue(fields.processId == 0);
81 assertTrue(fields.threadId == 0);
82 assertTrue(fields.stackBase === 'fffff80002f56000');
83 assertTrue(fields.stackLimit == 'fffff80002f50000');
84 assertTrue(fields.userStackBase === '0000000000000000');
85 assertTrue(fields.userStackLimit === '0000000000000000');
86 assertTrue(fields.startAddr === 'fffff80001c72580');
87 assertTrue(fields.win32StartAddr === 'fffff80001c72580');
88 assertTrue(fields.tebBase === '0000000000000000');
89 assertTrue(fields.subProcessTag == 0);
91 // Validate a version 3 32-bit payload.
92 header = { guid: guid, opcode: kThreadStartOpcode, version: 3, is64: 0 };
93 decoder.reset(kThreadStartPayload32bitV3);
94 fields = parser.decodeFields(header, decoder);
96 assertTrue(fields.processId == 556);
97 assertTrue(fields.threadId == 4908);
98 assertTrue(fields.stackBase == 2979549184);
99 assertTrue(fields.stackLimit == 2979536896);
100 assertTrue(fields.userStackBase == 13959168);
101 assertTrue(fields.userStackLimit == 13942784);
102 assertTrue(fields.affinity == 3);
103 assertTrue(fields.win32StartAddr == 2007696361);
104 assertTrue(fields.tebBase == 2147344384);
105 assertTrue(fields.subProcessTag == 0);
106 assertTrue(fields.basePriority == 9);
107 assertTrue(fields.pagePriority == 5);
108 assertTrue(fields.ioPriority == 2);
109 assertTrue(fields.threadFlags == 0);
111 // Validate a version 3 64-bit payload.
112 header = { guid: guid, opcode: kThreadStartOpcode, version: 3, is64: 1 };
113 decoder.reset(kThreadStartPayload64bitV3);
114 fields = parser.decodeFields(header, decoder);
116 assertTrue(fields.processId == 8568);
117 assertTrue(fields.threadId == 5268);
118 assertTrue(fields.stackBase === 'ffffd000270e3000');
119 assertTrue(fields.stackLimit === 'ffffd000270dd000');
120 assertTrue(fields.userStackBase === '00000000060bfd30');
121 assertTrue(fields.userStackLimit === '00000000060b8000');
122 assertTrue(fields.affinity === '00000000000000ff');
123 assertTrue(fields.win32StartAddr === '000000005c58fd2c');
124 assertTrue(fields.tebBase === '00000000ff12c000');
125 assertTrue(fields.subProcessTag == 0);
126 assertTrue(fields.basePriority == 8);
127 assertTrue(fields.pagePriority == 5);
128 assertTrue(fields.ioPriority == 2);
129 assertTrue(fields.threadFlags == 0);
132 test('DecodeCSwitchFields', function() {
133 var importer = new tracing.importer.EtwImporter('dummy', []);
134 var decoder = importer.decoder_;
135 var parser = new tracing.importer.etw.ThreadParser(importer);
140 // Validate a version 2 CSwitch 32-bit payload.
141 header = { guid: guid, opcode: kThreadCSwitchOpcode, version: 2, is64: 0 };
142 decoder.reset(kThreadCSwitchPayload32bitV2);
143 fields = parser.decodeCSwitchFields(header, decoder);
145 assertTrue(fields.newThreadId == 0);
146 assertTrue(fields.oldThreadId == 4396);
147 assertTrue(fields.newThreadPriority == 0);
148 assertTrue(fields.oldThreadPriority == 9);
149 assertTrue(fields.previousCState == 0);
150 assertTrue(fields.spareByte == 0);
151 assertTrue(fields.oldThreadWaitReason == 23);
152 assertTrue(fields.oldThreadWaitMode == 0);
153 assertTrue(fields.oldThreadState == 1);
154 assertTrue(fields.oldThreadWaitIdealProcessor == 0);
155 assertTrue(fields.newThreadWaitTime == 18);
156 assertTrue(fields.reserved == 18470);
158 // Validate a version 2 CSwitch 64-bit payload.
159 header = { guid: guid, opcode: kThreadCSwitchOpcode, version: 2, is64: 1 };
160 decoder.reset(kThreadCSwitchPayload64bitV2);
161 fields = parser.decodeCSwitchFields(header, decoder);
163 assertTrue(fields.newThreadId == 2252);
164 assertTrue(fields.oldThreadId == 0);
165 assertTrue(fields.newThreadPriority == 8);
166 assertTrue(fields.oldThreadPriority == 0);
167 assertTrue(fields.previousCState == 1);
168 assertTrue(fields.spareByte == 0);
169 assertTrue(fields.oldThreadWaitReason == 0);
170 assertTrue(fields.oldThreadWaitMode == 0);
171 assertTrue(fields.oldThreadState == 2);
172 assertTrue(fields.oldThreadWaitIdealProcessor == 4);
173 assertTrue(fields.newThreadWaitTime == 1);
174 assertTrue(fields.reserved == 881356167);