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