blob: fc57950a455a2e572ed50494e476c08b0127e307 [file] [log] [blame]
<!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>