| <!DOCTYPE html> |
| <!-- |
| Copyright (c) 2014 The Chromium Authors. All rights reserved. |
| Use of this source code is governed by a BSD-style license that can be |
| found in the LICENSE file. |
| --> |
| |
| <link rel="import" href="/core/test_utils.html"> |
| <link rel="import" href="/extras/importer/etw/etw_importer.html"> |
| <link rel="import" href="/extras/importer/etw/thread_parser.html"> |
| |
| <script> |
| 'use strict'; |
| |
| tr.b.unittest.testSuite(function() { |
| |
| // Constants for Thread events. |
| var guid = '3D6FA8D1-FE05-11D0-9DDA-00C04FD7BA7C'; |
| var kThreadStartOpcode = 1; |
| var kThreadEndOpcode = 2; |
| var kThreadDCStartOpcode = 3; |
| var kThreadCSwitchOpcode = 36; |
| |
| var kThreadStartPayload32bitV1 = |
| 'BAAAAEwHAAAAYLfzADC38wAAAAAAAAAAhdse9wAAAAD/AAAA'; |
| |
| var kThreadEndPayload32bitV1 = 'BAAAALQAAAA='; |
| |
| |
| var kThreadDCStartPayload64bitV2 = |
| 'AAAAAAAAAAAAYPUCAPj//wAA9QIA+P//AAAAAAAAAAAAAAAAAAAAAIAlxwEA+P//gCXHA' + |
| 'QD4//8AAAAAAAAAAAAAAAA='; |
| |
| var kThreadStartPayload32bitV3 = |
| 'LAIAACwTAAAAUJixACCYsQAA1QAAwNQAAwAAAOkDq3cA4P1/AAAAAAkFAgA='; |
| |
| var kThreadStartPayload64bitV3 = |
| 'eCEAAJQUAAAAMA4nAND//wDQDScA0P//MP0LBgAAAAAAgAsGAAAAAP8AAAAAAAAALP1YX' + |
| 'AAAAAAAwBL/AAAAAAAAAAAIBQIA'; |
| |
| var kThreadCSwitchPayload32bitV2 = 'AAAAACwRAAAACQAAFwABABIAAAAmSAAA'; |
| var kThreadCSwitchPayload64bitV2 = 'zAgAAAAAAAAIAAEAAAACBAEAAACHbYg0'; |
| |
| test('DecodeFields', function() { |
| |
| var importer = new tr.e.importer.etw.EtwImporter('dummy', []); |
| var decoder = importer.decoder_; |
| var parser = new tr.e.importer.etw.ThreadParser(importer); |
| var header; |
| var fields; |
| |
| // Validate a version 1 32-bit payload. |
| header = { guid: guid, opcode: kThreadStartOpcode, version: 1, is64: 0 }; |
| decoder.reset(kThreadStartPayload32bitV1); |
| fields = parser.decodeFields(header, decoder); |
| |
| assert.equal(fields.processId, 4); |
| assert.equal(fields.threadId, 1868); |
| assert.equal(fields.stackBase, 4088881152); |
| assert.equal(fields.stackLimit, 4088868864); |
| assert.equal(fields.userStackBase, 0); |
| assert.equal(fields.userStackLimit, 0); |
| assert.equal(fields.startAddr, 4145994629); |
| assert.equal(fields.win32StartAddr, 0); |
| assert.equal(fields.waitMode, -1); |
| |
| // Validate an End version 1 32-bit payload. |
| header = { guid: guid, opcode: kThreadEndOpcode, version: 1, is64: 0 }; |
| decoder.reset(kThreadStartPayload32bitV1); |
| fields = parser.decodeFields(header, decoder); |
| |
| assert.equal(fields.processId, 4); |
| assert.equal(fields.threadId, 1868); |
| |
| // Validate a version 2 64-bit payload. |
| header = { guid: guid, opcode: kThreadDCStartOpcode, version: 2, is64: 1 }; |
| decoder.reset(kThreadDCStartPayload64bitV2); |
| fields = parser.decodeFields(header, decoder); |
| |
| assert.equal(fields.processId, 0); |
| assert.equal(fields.threadId, 0); |
| assert.strictEqual(fields.stackBase, 'fffff80002f56000'); |
| assert.equal(fields.stackLimit, 'fffff80002f50000'); |
| assert.strictEqual(fields.userStackBase, '0000000000000000'); |
| assert.strictEqual(fields.userStackLimit, '0000000000000000'); |
| assert.strictEqual(fields.startAddr, 'fffff80001c72580'); |
| assert.strictEqual(fields.win32StartAddr, 'fffff80001c72580'); |
| assert.strictEqual(fields.tebBase, '0000000000000000'); |
| assert.equal(fields.subProcessTag, 0); |
| |
| // Validate a version 3 32-bit payload. |
| header = { guid: guid, opcode: kThreadStartOpcode, version: 3, is64: 0 }; |
| decoder.reset(kThreadStartPayload32bitV3); |
| fields = parser.decodeFields(header, decoder); |
| |
| assert.equal(fields.processId, 556); |
| assert.equal(fields.threadId, 4908); |
| assert.equal(fields.stackBase, 2979549184); |
| assert.equal(fields.stackLimit, 2979536896); |
| assert.equal(fields.userStackBase, 13959168); |
| assert.equal(fields.userStackLimit, 13942784); |
| assert.equal(fields.affinity, 3); |
| assert.equal(fields.win32StartAddr, 2007696361); |
| assert.equal(fields.tebBase, 2147344384); |
| assert.equal(fields.subProcessTag, 0); |
| assert.equal(fields.basePriority, 9); |
| assert.equal(fields.pagePriority, 5); |
| assert.equal(fields.ioPriority, 2); |
| assert.equal(fields.threadFlags, 0); |
| |
| // Validate a version 3 64-bit payload. |
| header = { guid: guid, opcode: kThreadStartOpcode, version: 3, is64: 1 }; |
| decoder.reset(kThreadStartPayload64bitV3); |
| fields = parser.decodeFields(header, decoder); |
| |
| assert.equal(fields.processId, 8568); |
| assert.equal(fields.threadId, 5268); |
| assert.strictEqual(fields.stackBase, 'ffffd000270e3000'); |
| assert.strictEqual(fields.stackLimit, 'ffffd000270dd000'); |
| assert.strictEqual(fields.userStackBase, '00000000060bfd30'); |
| assert.strictEqual(fields.userStackLimit, '00000000060b8000'); |
| assert.strictEqual(fields.affinity, '00000000000000ff'); |
| assert.strictEqual(fields.win32StartAddr, '000000005c58fd2c'); |
| assert.strictEqual(fields.tebBase, '00000000ff12c000'); |
| assert.equal(fields.subProcessTag, 0); |
| assert.equal(fields.basePriority, 8); |
| assert.equal(fields.pagePriority, 5); |
| assert.equal(fields.ioPriority, 2); |
| assert.equal(fields.threadFlags, 0); |
| }); |
| |
| test('DecodeCSwitchFields', function() { |
| var importer = new tr.e.importer.etw.EtwImporter('dummy', []); |
| var decoder = importer.decoder_; |
| var parser = new tr.e.importer.etw.ThreadParser(importer); |
| var header; |
| var fields; |
| |
| |
| // Validate a version 2 CSwitch 32-bit payload. |
| header = { guid: guid, opcode: kThreadCSwitchOpcode, version: 2, is64: 0 }; |
| decoder.reset(kThreadCSwitchPayload32bitV2); |
| fields = parser.decodeCSwitchFields(header, decoder); |
| |
| assert.equal(fields.newThreadId, 0); |
| assert.equal(fields.oldThreadId, 4396); |
| assert.equal(fields.newThreadPriority, 0); |
| assert.equal(fields.oldThreadPriority, 9); |
| assert.equal(fields.previousCState, 0); |
| assert.equal(fields.spareByte, 0); |
| assert.equal(fields.oldThreadWaitReason, 23); |
| assert.equal(fields.oldThreadWaitMode, 0); |
| assert.equal(fields.oldThreadState, 1); |
| assert.equal(fields.oldThreadWaitIdealProcessor, 0); |
| assert.equal(fields.newThreadWaitTime, 18); |
| assert.equal(fields.reserved, 18470); |
| |
| // Validate a version 2 CSwitch 64-bit payload. |
| header = { guid: guid, opcode: kThreadCSwitchOpcode, version: 2, is64: 1 }; |
| decoder.reset(kThreadCSwitchPayload64bitV2); |
| fields = parser.decodeCSwitchFields(header, decoder); |
| |
| assert.equal(fields.newThreadId, 2252); |
| assert.equal(fields.oldThreadId, 0); |
| assert.equal(fields.newThreadPriority, 8); |
| assert.equal(fields.oldThreadPriority, 0); |
| assert.equal(fields.previousCState, 1); |
| assert.equal(fields.spareByte, 0); |
| assert.equal(fields.oldThreadWaitReason, 0); |
| assert.equal(fields.oldThreadWaitMode, 0); |
| assert.equal(fields.oldThreadState, 2); |
| assert.equal(fields.oldThreadWaitIdealProcessor, 4); |
| assert.equal(fields.newThreadWaitTime, 1); |
| assert.equal(fields.reserved, 881356167); |
| |
| }); |
| }); |
| </script> |
| |