• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<!DOCTYPE HTML>
2<html>
3<!--
4Copyright (c) 2012 The Chromium Authors. All rights reserved.
5Use of this source code is governed by a BSD-style license that can be
6found in the LICENSE file.
7-->
8<head>
9<title>TimelineView tests</title>
10<script src="base.js"></script>
11<style>
12  .timeline-view {
13    border: 1px solid black;
14    margin: 10px;
15    height: 350px;
16  }
17  .timeline-find-dialog {
18    border: 1px solid black;
19    margin: 10px;
20  }
21</style>
22</head>
23<body>
24  <script>
25    base.require('unittest');
26    base.require('test_utils');
27    base.require('timeline_view');
28  </script>
29  <script>
30    'use strict';
31
32    var newSliceNamed = test_utils.newSliceNamed;
33
34    function createFullyPopulatedModel(opt_withError, opt_withMetadata) {
35      var withError = opt_withError !== undefined ? opt_withError : true;
36      var withMetadata = opt_withMetadata !== undefined ?
37          opt_withMetadata : true;
38
39      var num_tests = 50;
40      var testIndex = 0;
41      var startTime = 0;
42
43      var model = new tracing.TimelineModel();
44      for (testIndex = 0; testIndex < num_tests; ++testIndex) {
45        var process = model.getOrCreateProcess(10000 + testIndex);
46        if (testIndex % 2 == 0) {
47          var thread = process.getOrCreateThread('Thread Name Here');
48          thread.slices.push(
49              new tracing.TimelineSlice('foo', 'a', 0, startTime, {}, 1));
50          thread.slices.push(
51              new tracing.TimelineSlice('bar', 'b', 0,
52                                        startTime + 1.15, {}, .5));
53        } else {
54          var thread = process.getOrCreateThread('Name');
55          thread.slices.push(
56              new tracing.TimelineSlice('foo', 'a', 0,
57                                        startTime + .17, {}, .55));
58          thread.slices.push(
59              new tracing.TimelineSlice('bar', 'b', 0,
60                                        startTime + 1.1, {}, .7));
61        }
62      }
63      model.updateCategories_();
64
65      // Add a known problematic piece of data to test the import errors UI.
66      model.importErrors.push('Synthetic Import Error');
67      model.updateBounds();
68
69      // Add data with metadata information stored
70      model.metadata.push({name: 'a', value: 'testA'});
71      model.metadata.push({name: 'b', value: 'testB'});
72      model.metadata.push({name: 'c', value: 'testC'});
73
74      return model;
75    }
76
77    /*
78     * This test just instantiates a TimelineView and adds it to the DOM
79     * to help with non-unittest UI work.
80     */
81    function testInstantiateTimelineView() {
82      var model = createFullyPopulatedModel(true, true);
83
84      var view = new tracing.TimelineView();
85      view.style.height = '400px';
86      view.model = model;
87      view.tabIndex = 0;
88      view.focusElement = view;
89
90      var selection = new tracing.TimelineSelection();
91      view.timeline.addAllObjectsMatchingFilterToSelection({
92          matchSlice: function() { return true;}
93      }, selection);
94      view.timeline.selection = selection;
95
96      this.addHTMLOutput(undefined, view);
97    }
98
99    function testChangeModelToSomethingDifferent() {
100      var model00 = createFullyPopulatedModel(false, false);
101      var model11 = createFullyPopulatedModel(true, true);
102
103      var view = new tracing.TimelineView();
104      view.style.height = '400px';
105      view.model = model00;
106      view.model = undefined;
107      view.model = model11;
108      view.model = model00;
109    }
110
111
112    function testSetModelToSameThingAgain() {
113      var model = createFullyPopulatedModel(false, false);
114
115      // Create a view with am model.
116      var view = new tracing.TimelineView();
117      view.style.height = '400px';
118      view.model = model;
119
120      // Mutate the model and update the view.
121      var t123 = model.getOrCreateProcess(123).getOrCreateThread(123);
122      t123.pushSlice(newSliceNamed('somethingUnusual', 0, 5));
123      view.model = model;
124
125      // Verify that the new bits of the model show up in the view.
126      var selection = new tracing.TimelineSelection();
127      var filter = new tracing.TimelineTitleFilter('somethingUnusual');
128      view.timeline.addAllObjectsMatchingFilterToSelection(filter, selection);
129      assertEquals(selection.length, 1);
130    }
131
132    function testChangeModelToSomethingDifferent() {
133      var model00 = createFullyPopulatedModel(false, false);
134      var model11 = createFullyPopulatedModel(true, true);
135
136      var view = new tracing.TimelineView();
137      view.style.height = '400px';
138      view.model = model00;
139      view.model = undefined;
140      view.model = model11;
141      view.model = model00;
142    }
143
144
145    function testSetModelToSameThingAgain() {
146      var model = createFullyPopulatedModel(false, false);
147
148      // Create a view with am model.
149      var view = new tracing.TimelineView();
150      view.style.height = '400px';
151      view.model = model;
152
153      // Mutate the model and update the view.
154      var t123 = model.getOrCreateProcess(123).getOrCreateThread(123);
155      t123.pushSlice(newSliceNamed('somethingUnusual', 0, 5));
156      view.model = model;
157
158      // Verify that the new bits of the model show up in the view.
159      var selection = new tracing.TimelineSelection();
160      var filter = new tracing.TimelineTitleFilter('somethingUnusual');
161      view.timeline.addAllObjectsMatchingFilterToSelection(filter, selection);
162      assertEquals(selection.length, 1);
163    }
164
165    function testSetModelUpdatesCategories() {
166      var model = new tracing.TimelineModel();
167      var p1 = model.getOrCreateProcess(1);
168      var t1 = p1.getOrCreateThread(1);
169
170      t1.pushSlice(new tracing.TimelineThreadSlice('foo', 'a',
171                                                   0, 1, {}, 3));
172      t1.pushSlice(new tracing.TimelineThreadSlice('bar', 'b',
173                                                   0, 1.1, {}, 2.8));
174      t1.pushSlice(new tracing.TimelineThreadSlice('baz', 'b',
175                                                   0, 1.2, {}, 2.4));
176      model.updateCategories_();
177      model.updateBounds();
178
179      var view = new tracing.TimelineView();
180      view.settings.set('foo', true, 'categories');
181      view.settings.set('bar', false, 'categories');
182      view.model = model;
183
184      assertUndefined(view.timeline.categoryFilter_.categories_['foo']);
185      assertTrue(view.timeline.categoryFilter_.categories_['bar']);
186      assertUndefined(view.timeline.categoryFilter_.categories_['baz']);
187    }
188
189    function testUpdateCategoryFilterFromSettings() {
190      var view = new tracing.TimelineView();
191      view.timeline_ = {};
192      view.settings.set('foo', true, 'categories');
193      view.settings.set('bar', false, 'categories');
194      view.settings.set('baz', false, 'categories');
195      view.updateCategoryFilterFromSettings_();
196      assertUndefined(view.timeline_.categoryFilter.categories_['foo']);
197      assertTrue(view.timeline_.categoryFilter.categories_['bar']);
198      assertTrue(view.timeline_.categoryFilter.categories_['baz']);
199    }
200
201</script>
202</body>
203</html>
204