1b122baf563564a1d478804fb882fcba242a9949eChris Craik<!DOCTYPE html> 2b122baf563564a1d478804fb882fcba242a9949eChris Craik<!-- 3b122baf563564a1d478804fb882fcba242a9949eChris CraikCopyright (c) 2012 The Chromium Authors. All rights reserved. 4b122baf563564a1d478804fb882fcba242a9949eChris CraikUse of this source code is governed by a BSD-style license that can be 5b122baf563564a1d478804fb882fcba242a9949eChris Craikfound in the LICENSE file. 6b122baf563564a1d478804fb882fcba242a9949eChris Craik--> 7b122baf563564a1d478804fb882fcba242a9949eChris Craik 8cef7893435aa41160dd1255c43cb8498279738ccChris Craik<link rel="import" href="/tracing/base/iteration_helpers.html"> 9edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair<link rel="import" href="/tracing/importer/import.html"> 104a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair<link rel="import" href="/tracing/model/counter.html"> 114a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair<link rel="import" href="/tracing/model/model.html"> 124a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair<link rel="import" href="/tracing/model/slice.html"> 134a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair<link rel="import" href="/tracing/model/slice_group.html"> 144a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair<link rel="import" href="/tracing/model/stack_frame.html"> 154a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair<link rel="import" href="/tracing/model/thread_time_slice.html"> 16cef7893435aa41160dd1255c43cb8498279738ccChris Craik<link rel="import" href="/tracing/model/user_model/stub_expectation.html"> 17b122baf563564a1d478804fb882fcba242a9949eChris Craik 18b122baf563564a1d478804fb882fcba242a9949eChris Craik<script> 19b122baf563564a1d478804fb882fcba242a9949eChris Craik'use strict'; 20b122baf563564a1d478804fb882fcba242a9949eChris Craik 21b122baf563564a1d478804fb882fcba242a9949eChris Craik/** 22b122baf563564a1d478804fb882fcba242a9949eChris Craik * @fileoverview Helper functions for use in tracing tests. 23b122baf563564a1d478804fb882fcba242a9949eChris Craik */ 2446b43bff003ceda46cf9a5d40a47f7674996d2e0Zhen Wangtr.exportTo('tr.c', function() { 258d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi var ColorScheme = tr.b.ColorScheme; 268d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 2740f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik function _getStartAndCpuDurationFromDict( 2840f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik options, required, startFieldName, durationFieldName, endFieldName) { 2940f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik 3040f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik if (options[startFieldName] === undefined) { 3140f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik if (required) 3240f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik throw new Error('Too little information.'); 3340f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik else 3440f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik return {start: undefined, duration: undefined}; 3540f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik } 3640f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik if (options[durationFieldName] !== undefined && 3740f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik options[endFieldName] !== undefined) { 3840f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik throw new Error('Too much information.'); 3940f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik } 4040f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik if (options[durationFieldName] === undefined && 4140f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik options[endFieldName] === undefined) { 4240f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik if (required) 4340f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik throw new Error('Too little information.'); 4440f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik else 4540f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik return {start: undefined, duration: undefined}; 4640f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik } 4740f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik 4840f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik var duration; 4940f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik if (options[durationFieldName] !== undefined) { 5040f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik duration = options[durationFieldName]; 5140f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik } else { 5240f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik duration = options[endFieldName] - options[startFieldName]; 5340f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik } 5440f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik 5540f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik return { 5640f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik start: options[startFieldName], 5740f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik duration: duration 5840f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik }; 5940f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik } 6040f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik 6146b43bff003ceda46cf9a5d40a47f7674996d2e0Zhen Wang function _maybeGetCpuStartAndCpuDurationFromDict(options) { 6240f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik return _getStartAndCpuDurationFromDict( 6346b43bff003ceda46cf9a5d40a47f7674996d2e0Zhen Wang options, false, 'cpuStart', 'cpuDuration', 'cpuEnd'); 6446b43bff003ceda46cf9a5d40a47f7674996d2e0Zhen Wang } 6546b43bff003ceda46cf9a5d40a47f7674996d2e0Zhen Wang 6646b43bff003ceda46cf9a5d40a47f7674996d2e0Zhen Wang function TestUtils() { 6740f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik } 6840f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik 6946b43bff003ceda46cf9a5d40a47f7674996d2e0Zhen Wang TestUtils.getStartAndDurationFromDict = function(options) { 7040f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik return _getStartAndCpuDurationFromDict( 7146b43bff003ceda46cf9a5d40a47f7674996d2e0Zhen Wang options, true, 'start', 'duration', 'end'); 72cef7893435aa41160dd1255c43cb8498279738ccChris Craik }; 7340f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik 7446b43bff003ceda46cf9a5d40a47f7674996d2e0Zhen Wang TestUtils.newAsyncSlice = function(start, duration, startThread, endThread) { 7546b43bff003ceda46cf9a5d40a47f7674996d2e0Zhen Wang return TestUtils.newAsyncSliceNamed( 7646b43bff003ceda46cf9a5d40a47f7674996d2e0Zhen Wang 'a', start, duration, startThread, endThread); 77cef7893435aa41160dd1255c43cb8498279738ccChris Craik }; 78b122baf563564a1d478804fb882fcba242a9949eChris Craik 7946b43bff003ceda46cf9a5d40a47f7674996d2e0Zhen Wang TestUtils.newAsyncSliceNamed = function( 8046b43bff003ceda46cf9a5d40a47f7674996d2e0Zhen Wang name, start, duration, startThread, endThread) { 81b122baf563564a1d478804fb882fcba242a9949eChris Craik var asyncSliceConstructor = 8240f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik tr.model.AsyncSlice.getConstructor('', name); 83b122baf563564a1d478804fb882fcba242a9949eChris Craik 84b122baf563564a1d478804fb882fcba242a9949eChris Craik var s = new asyncSliceConstructor('', name, 0, start); 85b122baf563564a1d478804fb882fcba242a9949eChris Craik s.duration = duration; 86b122baf563564a1d478804fb882fcba242a9949eChris Craik s.startThread = startThread; 87b122baf563564a1d478804fb882fcba242a9949eChris Craik s.endThread = endThread; 88b122baf563564a1d478804fb882fcba242a9949eChris Craik return s; 89cef7893435aa41160dd1255c43cb8498279738ccChris Craik }; 90beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik 91cef7893435aa41160dd1255c43cb8498279738ccChris Craik function getColorId(colorId) { 92cef7893435aa41160dd1255c43cb8498279738ccChris Craik if (colorId) { 93cef7893435aa41160dd1255c43cb8498279738ccChris Craik if (colorId === 'random') { 948d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi colorId = Math.floor( 958d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi Math.random() * 968d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi ColorScheme.proprties.numGeneralPurposeColorIds); 9735472c7d721e54739b2d965c582e20ee9dde7093Chris Craik } 9835472c7d721e54739b2d965c582e20ee9dde7093Chris Craik } else { 9935472c7d721e54739b2d965c582e20ee9dde7093Chris Craik colorId = 0; 10035472c7d721e54739b2d965c582e20ee9dde7093Chris Craik } 101cef7893435aa41160dd1255c43cb8498279738ccChris Craik return colorId; 102cef7893435aa41160dd1255c43cb8498279738ccChris Craik } 10335472c7d721e54739b2d965c582e20ee9dde7093Chris Craik 104cef7893435aa41160dd1255c43cb8498279738ccChris Craik TestUtils.newAsyncSliceEx = function(options) { 105cef7893435aa41160dd1255c43cb8498279738ccChris Craik var sd = TestUtils.getStartAndDurationFromDict(options); 106cef7893435aa41160dd1255c43cb8498279738ccChris Craik 107cef7893435aa41160dd1255c43cb8498279738ccChris Craik var cat = options.cat ? options.cat : 'cat'; 108cef7893435aa41160dd1255c43cb8498279738ccChris Craik var title = options.title ? options.title : 'a'; 109cef7893435aa41160dd1255c43cb8498279738ccChris Craik var colorId = getColorId(options.colorId); 110beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik 111beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik var isTopLevel; 112beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik if (options.isTopLevel !== undefined) 113beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik isTopLevel = options.isTopLevel; 114beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik else 115beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik isTopLevel = false; 116beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik 11726c92f4cb78a275f1ebb94dd976f37bdd7d53ce7Chris Craik var asyncSliceConstructor = 11840f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik tr.model.AsyncSlice.getConstructor(cat, title); 11926c92f4cb78a275f1ebb94dd976f37bdd7d53ce7Chris Craik 12026c92f4cb78a275f1ebb94dd976f37bdd7d53ce7Chris Craik var slice = new asyncSliceConstructor( 12126c92f4cb78a275f1ebb94dd976f37bdd7d53ce7Chris Craik cat, 122beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik title, 123beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik colorId, 12440f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik sd.start, 125beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik options.args ? options.args : {}, 12640f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik sd.duration, isTopLevel); 127beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik 12826c92f4cb78a275f1ebb94dd976f37bdd7d53ce7Chris Craik if (options.id) 12926c92f4cb78a275f1ebb94dd976f37bdd7d53ce7Chris Craik slice.id = options.id; 13035472c7d721e54739b2d965c582e20ee9dde7093Chris Craik else 13140f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik slice.id = tr.b.GUID.allocate(); 13235472c7d721e54739b2d965c582e20ee9dde7093Chris Craik 133beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik if (options.startStackFrame) 134beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik slice.startStackFrame = options.startStackFrame; 135beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik if (options.endStackFrame) 136beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik slice.endStackFrame = options.endStackFrame; 137beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik if (options.important) 138beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik slice.important = options.important; 139beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik if (options.startThread) 140beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik slice.startThread = options.startThread; 141beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik if (options.endThread) 142beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik slice.endThread = options.endThread; 143beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik return slice; 144cef7893435aa41160dd1255c43cb8498279738ccChris Craik }; 145beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik 14646b43bff003ceda46cf9a5d40a47f7674996d2e0Zhen Wang TestUtils.newCounter = function(parent) { 14746b43bff003ceda46cf9a5d40a47f7674996d2e0Zhen Wang return TestUtils.newCounterNamed(parent, 'a'); 148cef7893435aa41160dd1255c43cb8498279738ccChris Craik }; 149b122baf563564a1d478804fb882fcba242a9949eChris Craik 15046b43bff003ceda46cf9a5d40a47f7674996d2e0Zhen Wang TestUtils.newCounterNamed = function(parent, name) { 15140f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik var s = new tr.model.Counter(parent, name, null, name); 152b122baf563564a1d478804fb882fcba242a9949eChris Craik return s; 153cef7893435aa41160dd1255c43cb8498279738ccChris Craik }; 154b122baf563564a1d478804fb882fcba242a9949eChris Craik 15546b43bff003ceda46cf9a5d40a47f7674996d2e0Zhen Wang TestUtils.newCounterCategory = function(parent, category, name) { 15640f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik var s = new tr.model.Counter(parent, name, category, name); 157b122baf563564a1d478804fb882fcba242a9949eChris Craik return s; 158cef7893435aa41160dd1255c43cb8498279738ccChris Craik }; 159b122baf563564a1d478804fb882fcba242a9949eChris Craik 16046b43bff003ceda46cf9a5d40a47f7674996d2e0Zhen Wang TestUtils.newCounterSeries = function() { 16140f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik var s = new tr.model.CounterSeries('a', 0); 162b122baf563564a1d478804fb882fcba242a9949eChris Craik return s; 163cef7893435aa41160dd1255c43cb8498279738ccChris Craik }; 164b122baf563564a1d478804fb882fcba242a9949eChris Craik 16546b43bff003ceda46cf9a5d40a47f7674996d2e0Zhen Wang TestUtils.newFlowEventEx = function(options) { 16626c92f4cb78a275f1ebb94dd976f37bdd7d53ce7Chris Craik if (options.start === undefined) 16726c92f4cb78a275f1ebb94dd976f37bdd7d53ce7Chris Craik throw new Error('Too little info'); 16826c92f4cb78a275f1ebb94dd976f37bdd7d53ce7Chris Craik 16926c92f4cb78a275f1ebb94dd976f37bdd7d53ce7Chris Craik var title = options.title ? options.title : 'a'; 17026c92f4cb78a275f1ebb94dd976f37bdd7d53ce7Chris Craik 17126c92f4cb78a275f1ebb94dd976f37bdd7d53ce7Chris Craik var colorId = options.colorId ? options.colorId : 0; 17226c92f4cb78a275f1ebb94dd976f37bdd7d53ce7Chris Craik 17346b43bff003ceda46cf9a5d40a47f7674996d2e0Zhen Wang var sd = TestUtils.getStartAndDurationFromDict(options); 17426c92f4cb78a275f1ebb94dd976f37bdd7d53ce7Chris Craik 17526c92f4cb78a275f1ebb94dd976f37bdd7d53ce7Chris Craik var id; 17626c92f4cb78a275f1ebb94dd976f37bdd7d53ce7Chris Craik if (options.id !== undefined) 17726c92f4cb78a275f1ebb94dd976f37bdd7d53ce7Chris Craik id = options.id; 17826c92f4cb78a275f1ebb94dd976f37bdd7d53ce7Chris Craik else 17940f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik id = tr.b.GUID.allocate(); 18026c92f4cb78a275f1ebb94dd976f37bdd7d53ce7Chris Craik 18140f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik var event = new tr.model.FlowEvent( 18226c92f4cb78a275f1ebb94dd976f37bdd7d53ce7Chris Craik options.cat ? options.cat : 'cat', 18326c92f4cb78a275f1ebb94dd976f37bdd7d53ce7Chris Craik id, 18426c92f4cb78a275f1ebb94dd976f37bdd7d53ce7Chris Craik title, 18526c92f4cb78a275f1ebb94dd976f37bdd7d53ce7Chris Craik colorId, 18640f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik sd.start, 18726c92f4cb78a275f1ebb94dd976f37bdd7d53ce7Chris Craik options.args ? options.args : {}, 18840f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik sd.duration); 18926c92f4cb78a275f1ebb94dd976f37bdd7d53ce7Chris Craik 19026c92f4cb78a275f1ebb94dd976f37bdd7d53ce7Chris Craik if (options.startStackFrame) 19126c92f4cb78a275f1ebb94dd976f37bdd7d53ce7Chris Craik event.startStackFrame = options.startStackFrame; 19226c92f4cb78a275f1ebb94dd976f37bdd7d53ce7Chris Craik if (options.endStackFrame) 19326c92f4cb78a275f1ebb94dd976f37bdd7d53ce7Chris Craik event.endStackFrame = options.endStackFrame; 19426c92f4cb78a275f1ebb94dd976f37bdd7d53ce7Chris Craik if (options.important) 19526c92f4cb78a275f1ebb94dd976f37bdd7d53ce7Chris Craik event.important = options.important; 19626c92f4cb78a275f1ebb94dd976f37bdd7d53ce7Chris Craik if (options.startSlice) { 19726c92f4cb78a275f1ebb94dd976f37bdd7d53ce7Chris Craik event.startSlice = options.startSlice; 19826c92f4cb78a275f1ebb94dd976f37bdd7d53ce7Chris Craik event.startSlice.outFlowEvents.push(event); 19926c92f4cb78a275f1ebb94dd976f37bdd7d53ce7Chris Craik } 20026c92f4cb78a275f1ebb94dd976f37bdd7d53ce7Chris Craik if (options.endSlice) { 20126c92f4cb78a275f1ebb94dd976f37bdd7d53ce7Chris Craik event.endSlice = options.endSlice; 20226c92f4cb78a275f1ebb94dd976f37bdd7d53ce7Chris Craik event.endSlice.inFlowEvents.push(event); 20326c92f4cb78a275f1ebb94dd976f37bdd7d53ce7Chris Craik } 20426c92f4cb78a275f1ebb94dd976f37bdd7d53ce7Chris Craik return event; 205cef7893435aa41160dd1255c43cb8498279738ccChris Craik }; 206b122baf563564a1d478804fb882fcba242a9949eChris Craik 20746b43bff003ceda46cf9a5d40a47f7674996d2e0Zhen Wang TestUtils.newThreadSlice = function(thread, state, start, duration, opt_cpu) { 20840f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik var s = new tr.model.ThreadTimeSlice( 209beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik thread, state, 'cat', start, {}, duration); 210beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik if (opt_cpu) 211beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik s.cpuOnWhichThreadWasRunning = opt_cpu; 212beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik return s; 213cef7893435aa41160dd1255c43cb8498279738ccChris Craik }; 214beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik 21546b43bff003ceda46cf9a5d40a47f7674996d2e0Zhen Wang TestUtils.newSampleNamed = function( 21646b43bff003ceda46cf9a5d40a47f7674996d2e0Zhen Wang thread, sampleName, category, frameNames, start) { 217b122baf563564a1d478804fb882fcba242a9949eChris Craik var model; 218b122baf563564a1d478804fb882fcba242a9949eChris Craik if (thread.parent) 219b122baf563564a1d478804fb882fcba242a9949eChris Craik model = thread.parent.model; 220b122baf563564a1d478804fb882fcba242a9949eChris Craik else 221b122baf563564a1d478804fb882fcba242a9949eChris Craik model = undefined; 2228d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi var sf = TestUtils.newStackTrace(model, frameNames); 22340f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik var s = new tr.model.Sample(undefined, thread, 224b122baf563564a1d478804fb882fcba242a9949eChris Craik sampleName, start, 225b122baf563564a1d478804fb882fcba242a9949eChris Craik sf, 226b122baf563564a1d478804fb882fcba242a9949eChris Craik 1); 227b122baf563564a1d478804fb882fcba242a9949eChris Craik return s; 228cef7893435aa41160dd1255c43cb8498279738ccChris Craik }; 229b122baf563564a1d478804fb882fcba242a9949eChris Craik 23046b43bff003ceda46cf9a5d40a47f7674996d2e0Zhen Wang TestUtils.newSliceEx = function(options) { 23146b43bff003ceda46cf9a5d40a47f7674996d2e0Zhen Wang var sd = TestUtils.getStartAndDurationFromDict(options); 232b122baf563564a1d478804fb882fcba242a9949eChris Craik 233b122baf563564a1d478804fb882fcba242a9949eChris Craik var title = options.title ? options.title : 'a'; 234b122baf563564a1d478804fb882fcba242a9949eChris Craik 235b122baf563564a1d478804fb882fcba242a9949eChris Craik var colorId = options.colorId ? options.colorId : 0; 236b122baf563564a1d478804fb882fcba242a9949eChris Craik 23746b43bff003ceda46cf9a5d40a47f7674996d2e0Zhen Wang var cpuSD = _maybeGetCpuStartAndCpuDurationFromDict(options); 238b122baf563564a1d478804fb882fcba242a9949eChris Craik 239beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik var type; 240beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik if (options.type) 241beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik type = options.type; 242beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik else 24340f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik type = tr.model.Slice; 244beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik 245beca7ae1f35e7f6605f4a21b5f4edeaa72000e39Chris Craik var slice = new type( 246b122baf563564a1d478804fb882fcba242a9949eChris Craik options.cat ? options.cat : 'cat', 247b122baf563564a1d478804fb882fcba242a9949eChris Craik title, 248b122baf563564a1d478804fb882fcba242a9949eChris Craik colorId, 24940f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik sd.start, 250b122baf563564a1d478804fb882fcba242a9949eChris Craik options.args ? options.args : {}, 25140f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik sd.duration, 25240f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik cpuSD.start, cpuSD.duration); 253b122baf563564a1d478804fb882fcba242a9949eChris Craik 254b122baf563564a1d478804fb882fcba242a9949eChris Craik 255b122baf563564a1d478804fb882fcba242a9949eChris Craik return slice; 256cef7893435aa41160dd1255c43cb8498279738ccChris Craik }; 257b122baf563564a1d478804fb882fcba242a9949eChris Craik 2588d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi TestUtils.newStackTrace = function(model, titles) { 259b122baf563564a1d478804fb882fcba242a9949eChris Craik var frame = undefined; 2608d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi titles.forEach(function(title) { 2618d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi frame = new tr.model.StackFrame(frame, tr.b.GUID.allocate(), title, 7); 262b122baf563564a1d478804fb882fcba242a9949eChris Craik if (model) 263b122baf563564a1d478804fb882fcba242a9949eChris Craik model.addStackFrame(frame); 2648d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi }); 265b122baf563564a1d478804fb882fcba242a9949eChris Craik return frame; 266cef7893435aa41160dd1255c43cb8498279738ccChris Craik }; 267b122baf563564a1d478804fb882fcba242a9949eChris Craik 26846b43bff003ceda46cf9a5d40a47f7674996d2e0Zhen Wang TestUtils.findSliceNamed = function(slices, name) { 26940f8da8088c9cd699f672242d0cdc3d677353bf8Chris Craik if (slices instanceof tr.model.SliceGroup) 270b122baf563564a1d478804fb882fcba242a9949eChris Craik slices = slices.slices; 271b122baf563564a1d478804fb882fcba242a9949eChris Craik for (var i = 0; i < slices.length; i++) 272b122baf563564a1d478804fb882fcba242a9949eChris Craik if (slices[i].title == name) 273b122baf563564a1d478804fb882fcba242a9949eChris Craik return slices[i]; 274b122baf563564a1d478804fb882fcba242a9949eChris Craik return undefined; 275cef7893435aa41160dd1255c43cb8498279738ccChris Craik }; 276b122baf563564a1d478804fb882fcba242a9949eChris Craik 2778d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi TestUtils.newInteractionRecord = function(parentModel, start, duration) { 278cef7893435aa41160dd1255c43cb8498279738ccChris Craik return new tr.model.um.StubExpectation({ 279cef7893435aa41160dd1255c43cb8498279738ccChris Craik parentModel: parentModel, start: start, duration: duration}); 280cef7893435aa41160dd1255c43cb8498279738ccChris Craik }; 2818d2b206a675ec20ea07100c35df34e65ee1e45e8Ruchi Kandoi 28246b43bff003ceda46cf9a5d40a47f7674996d2e0Zhen Wang TestUtils.newModel = function(customizeModelCallback) { 28346b43bff003ceda46cf9a5d40a47f7674996d2e0Zhen Wang return TestUtils.newModelWithEvents([], { 284edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair shiftWorldToZero: false, 285edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair pruneEmptyContainers: false, 286edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair customizeModelCallback: customizeModelCallback 287edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair }); 288cef7893435aa41160dd1255c43cb8498279738ccChris Craik }; 289edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair 29046b43bff003ceda46cf9a5d40a47f7674996d2e0Zhen Wang TestUtils.newModelWithEvents = function(events, opts) { 291edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair if (!(events instanceof Array)) 292edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair events = [events]; 293edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair 294edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair opts = opts || {}; 295edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair 296edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair var io = new tr.importer.ImportOptions(); 2974a4f2fe02baf385f6c24fc98c6e17bf6ac5e0724Dan Sinclair io.showImportWarnings = false; 298edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair io.customizeModelCallback = opts.customizeModelCallback; 299cef7893435aa41160dd1255c43cb8498279738ccChris Craik io.trackDetailedModelStats = opts.trackDetailedModelStats === undefined ? 300cef7893435aa41160dd1255c43cb8498279738ccChris Craik false : opts.trackDetailedModelStats; 301edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair io.shiftWorldToZero = opts.shiftWorldToZero === undefined ? 302edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair true : opts.shiftWorldToZero; 303edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair io.pruneEmptyContainers = opts.pruneEmptyContainers === undefined ? 304edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair true : opts.pruneEmptyContainers; 305edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair io.auditorConstructors = opts.auditorConstructors === undefined ? 306edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair [] : opts.auditorConstructors; 307edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair 308edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair var m = new tr.Model(); 309edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair var i = new tr.importer.Import(m, io); 310edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair i.importTraces(events); 311edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair return m; 312cef7893435aa41160dd1255c43cb8498279738ccChris Craik }; 313b122baf563564a1d478804fb882fcba242a9949eChris Craik 31446b43bff003ceda46cf9a5d40a47f7674996d2e0Zhen Wang TestUtils.newModelWithAuditor = function(customizeModelCallback, auditor) { 31546b43bff003ceda46cf9a5d40a47f7674996d2e0Zhen Wang return TestUtils.newModelWithEvents([], { 316edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair shiftWorldToZero: false, 317edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair pruneEmptyContainers: false, 318edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair customizeModelCallback: customizeModelCallback, 319edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair auditorConstructors: [auditor] 320edfe2194ee8a857cc1e78b4e4020f9b5e7210029Dan Sinclair }); 321cef7893435aa41160dd1255c43cb8498279738ccChris Craik }; 322b122baf563564a1d478804fb882fcba242a9949eChris Craik 32346b43bff003ceda46cf9a5d40a47f7674996d2e0Zhen Wang TestUtils.newFakeThread = function() { 324ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik var process = {model: {}}; 325ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik return new tr.model.Thread(process); 326cef7893435aa41160dd1255c43cb8498279738ccChris Craik }; 327cef7893435aa41160dd1255c43cb8498279738ccChris Craik 328cef7893435aa41160dd1255c43cb8498279738ccChris Craik /** @constructor */ 329cef7893435aa41160dd1255c43cb8498279738ccChris Craik TestUtils.SourceGenerator = function() { 330cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.sourceList_ = []; 331cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.currentLineCommentList_ = []; 332cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.currentIndent_ = 0; 333cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.currentLineEmpty_ = true; 334cef7893435aa41160dd1255c43cb8498279738ccChris Craik }; 335cef7893435aa41160dd1255c43cb8498279738ccChris Craik 336cef7893435aa41160dd1255c43cb8498279738ccChris Craik TestUtils.SourceGenerator.prototype = { 337cef7893435aa41160dd1255c43cb8498279738ccChris Craik push: function(/* arguments */) { 338cef7893435aa41160dd1255c43cb8498279738ccChris Craik if (this.currentLineEmpty_) { 339cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.sourceList_.push(' '.repeat(this.currentIndent_)); 340cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.currentLineEmpty_ = false; 341cef7893435aa41160dd1255c43cb8498279738ccChris Craik } 342cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.sourceList_.push.apply( 343cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.sourceList_, Array.prototype.slice.call(arguments)); 344cef7893435aa41160dd1255c43cb8498279738ccChris Craik }, 345cef7893435aa41160dd1255c43cb8498279738ccChris Craik 346cef7893435aa41160dd1255c43cb8498279738ccChris Craik pushComment: function(/* arguments */) { 347cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.currentLineCommentList_.push.apply( 348cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.currentLineCommentList_, Array.prototype.slice.call(arguments)); 349cef7893435aa41160dd1255c43cb8498279738ccChris Craik }, 350cef7893435aa41160dd1255c43cb8498279738ccChris Craik 351cef7893435aa41160dd1255c43cb8498279738ccChris Craik build: function() { 352cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.finishLine_(); 353cef7893435aa41160dd1255c43cb8498279738ccChris Craik return this.sourceList_.join(''); 354cef7893435aa41160dd1255c43cb8498279738ccChris Craik }, 355cef7893435aa41160dd1255c43cb8498279738ccChris Craik 356cef7893435aa41160dd1255c43cb8498279738ccChris Craik breakLine: function() { 357cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.finishLine_(); 358cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.push('\n'); 359cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.currentLineEmpty_ = true; 360cef7893435aa41160dd1255c43cb8498279738ccChris Craik }, 361cef7893435aa41160dd1255c43cb8498279738ccChris Craik 362cef7893435aa41160dd1255c43cb8498279738ccChris Craik finishLine_: function() { 363cef7893435aa41160dd1255c43cb8498279738ccChris Craik if (this.currentLineCommentList_.length === 0) 364cef7893435aa41160dd1255c43cb8498279738ccChris Craik return; 365cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.push(' // '); 366cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.push.apply(this, this.currentLineCommentList_); 367cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.push('.'); 368cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.currentLineCommentList_ = []; 369cef7893435aa41160dd1255c43cb8498279738ccChris Craik }, 370cef7893435aa41160dd1255c43cb8498279738ccChris Craik 371cef7893435aa41160dd1255c43cb8498279738ccChris Craik indentBlock: function(spaces, breakLine, blockCallback, opt_this) { 372cef7893435aa41160dd1255c43cb8498279738ccChris Craik opt_this = opt_this || this; 373cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.currentIndent_ += spaces; 374cef7893435aa41160dd1255c43cb8498279738ccChris Craik if (breakLine) 375cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.breakLine(); 376cef7893435aa41160dd1255c43cb8498279738ccChris Craik blockCallback.call(opt_this); 377cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.currentIndent_ -= spaces; 378cef7893435aa41160dd1255c43cb8498279738ccChris Craik }, 379cef7893435aa41160dd1255c43cb8498279738ccChris Craik 380cef7893435aa41160dd1255c43cb8498279738ccChris Craik formatSingleLineList: function(list, itemCallback, opt_this) { 381cef7893435aa41160dd1255c43cb8498279738ccChris Craik opt_this = opt_this || this; 382cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.push('['); 383cef7893435aa41160dd1255c43cb8498279738ccChris Craik tr.b.asArray(list).forEach(function(item, index) { 384cef7893435aa41160dd1255c43cb8498279738ccChris Craik if (index > 0) 385cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.push(', '); 386cef7893435aa41160dd1255c43cb8498279738ccChris Craik itemCallback.call(opt_this, item, index); 387cef7893435aa41160dd1255c43cb8498279738ccChris Craik }, this); 388cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.push(']'); 389cef7893435aa41160dd1255c43cb8498279738ccChris Craik }, 390cef7893435aa41160dd1255c43cb8498279738ccChris Craik 391cef7893435aa41160dd1255c43cb8498279738ccChris Craik formatMultiLineList: function(list, itemCallback, opt_this) { 392cef7893435aa41160dd1255c43cb8498279738ccChris Craik opt_this = opt_this || this; 393cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.push('['); 394cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.indentBlock(2, false /* don't break line */, function() { 395cef7893435aa41160dd1255c43cb8498279738ccChris Craik tr.b.asArray(list).forEach(function(item, index) { 396cef7893435aa41160dd1255c43cb8498279738ccChris Craik if (index > 0) 397cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.push(','); 398cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.breakLine(); 399cef7893435aa41160dd1255c43cb8498279738ccChris Craik itemCallback.call(opt_this, item, index); 400cef7893435aa41160dd1255c43cb8498279738ccChris Craik }, this); 401cef7893435aa41160dd1255c43cb8498279738ccChris Craik }, this); 402cef7893435aa41160dd1255c43cb8498279738ccChris Craik if (list.length > 0) 403cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.breakLine(); 404cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.push(']'); 405cef7893435aa41160dd1255c43cb8498279738ccChris Craik }, 406cef7893435aa41160dd1255c43cb8498279738ccChris Craik 407cef7893435aa41160dd1255c43cb8498279738ccChris Craik formatString: function(string) { 408cef7893435aa41160dd1255c43cb8498279738ccChris Craik if (string === undefined) 409cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.push('undefined'); 410cef7893435aa41160dd1255c43cb8498279738ccChris Craik else 411cef7893435aa41160dd1255c43cb8498279738ccChris Craik this.push('\'', string, '\''); 412cef7893435aa41160dd1255c43cb8498279738ccChris Craik } 413cef7893435aa41160dd1255c43cb8498279738ccChris Craik }; 414cef7893435aa41160dd1255c43cb8498279738ccChris Craik 415cef7893435aa41160dd1255c43cb8498279738ccChris Craik TestUtils.addSourceListing = function(test, source) { 416cef7893435aa41160dd1255c43cb8498279738ccChris Craik var testSourceEl = document.createElement('pre'); 417cef7893435aa41160dd1255c43cb8498279738ccChris Craik testSourceEl.style.fontFamily = 'monospace'; 418cef7893435aa41160dd1255c43cb8498279738ccChris Craik testSourceEl.textContent = source; 419cef7893435aa41160dd1255c43cb8498279738ccChris Craik 420cef7893435aa41160dd1255c43cb8498279738ccChris Craik var copyButtonEl = document.createElement('button'); 421cef7893435aa41160dd1255c43cb8498279738ccChris Craik copyButtonEl.textContent = 'Copy into to clipboard'; 422cef7893435aa41160dd1255c43cb8498279738ccChris Craik copyButtonEl.addEventListener('click', function() { 423cef7893435aa41160dd1255c43cb8498279738ccChris Craik var selection = window.getSelection(); 424cef7893435aa41160dd1255c43cb8498279738ccChris Craik 425cef7893435aa41160dd1255c43cb8498279738ccChris Craik // Store the original selection. 426cef7893435aa41160dd1255c43cb8498279738ccChris Craik var originalRanges = new Array(selection.rangeCount); 427cef7893435aa41160dd1255c43cb8498279738ccChris Craik for (var i = 0; i < originalRanges.length; i++) 428cef7893435aa41160dd1255c43cb8498279738ccChris Craik originalRanges[i] = selection.getRangeAt(i); 429cef7893435aa41160dd1255c43cb8498279738ccChris Craik 430cef7893435aa41160dd1255c43cb8498279738ccChris Craik // Copy the generated test source code into clipboard. 431cef7893435aa41160dd1255c43cb8498279738ccChris Craik selection.removeAllRanges(); 432cef7893435aa41160dd1255c43cb8498279738ccChris Craik var range = document.createRange(); 433cef7893435aa41160dd1255c43cb8498279738ccChris Craik range.selectNode(testSourceEl); 434cef7893435aa41160dd1255c43cb8498279738ccChris Craik selection.addRange(range); 435cef7893435aa41160dd1255c43cb8498279738ccChris Craik document.execCommand('copy'); 436cef7893435aa41160dd1255c43cb8498279738ccChris Craik 437cef7893435aa41160dd1255c43cb8498279738ccChris Craik // Restore the original selection. 438cef7893435aa41160dd1255c43cb8498279738ccChris Craik selection.removeAllRanges(); 439cef7893435aa41160dd1255c43cb8498279738ccChris Craik for (var i = 0; i < originalRanges.length; i++) 440cef7893435aa41160dd1255c43cb8498279738ccChris Craik selection.addRange(originalRanges[i]); 441cef7893435aa41160dd1255c43cb8498279738ccChris Craik }); 442cef7893435aa41160dd1255c43cb8498279738ccChris Craik 443cef7893435aa41160dd1255c43cb8498279738ccChris Craik var outputEl = document.createElement('div'); 444cef7893435aa41160dd1255c43cb8498279738ccChris Craik outputEl.appendChild(copyButtonEl); 445cef7893435aa41160dd1255c43cb8498279738ccChris Craik outputEl.appendChild(testSourceEl); 446cef7893435aa41160dd1255c43cb8498279738ccChris Craik test.addHTMLOutput(outputEl); 447cef7893435aa41160dd1255c43cb8498279738ccChris Craik }; 448cef7893435aa41160dd1255c43cb8498279738ccChris Craik 449cef7893435aa41160dd1255c43cb8498279738ccChris Craik TestUtils.newInstantEvent = function(options) { 450cef7893435aa41160dd1255c43cb8498279738ccChris Craik var title = options.title; 451cef7893435aa41160dd1255c43cb8498279738ccChris Craik var start = options.start; 452cef7893435aa41160dd1255c43cb8498279738ccChris Craik if ((title === undefined) || 453cef7893435aa41160dd1255c43cb8498279738ccChris Craik (title === '') || 454cef7893435aa41160dd1255c43cb8498279738ccChris Craik (start === undefined)) 455cef7893435aa41160dd1255c43cb8498279738ccChris Craik throw new Error('too little information'); 456cef7893435aa41160dd1255c43cb8498279738ccChris Craik 457cef7893435aa41160dd1255c43cb8498279738ccChris Craik var category = options.category || 'category'; 458cef7893435aa41160dd1255c43cb8498279738ccChris Craik var colorId = getColorId(options.colorId); 459cef7893435aa41160dd1255c43cb8498279738ccChris Craik var args = options.args || {}; 460cef7893435aa41160dd1255c43cb8498279738ccChris Craik return new tr.model.InstantEvent( 461cef7893435aa41160dd1255c43cb8498279738ccChris Craik category, title, colorId, start, args); 462cef7893435aa41160dd1255c43cb8498279738ccChris Craik }; 463ced05db70069f9d84c4b0dd9b3b26b94e3482336Chris Craik 464b122baf563564a1d478804fb882fcba242a9949eChris Craik return { 46546b43bff003ceda46cf9a5d40a47f7674996d2e0Zhen Wang TestUtils: TestUtils 466b122baf563564a1d478804fb882fcba242a9949eChris Craik }; 467b122baf563564a1d478804fb882fcba242a9949eChris Craik}); 468b122baf563564a1d478804fb882fcba242a9949eChris Craik</script> 469