| <!DOCTYPE html> |
| <!-- |
| Copyright (c) 2013 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="/base/task.html"> |
| <link rel="import" href="/core/test_utils.html"> |
| <link rel="import" href="/core/timeline_track_view.html"> |
| <link rel="import" href="/extras/importer/trace_event_importer.html"> |
| |
| <script> |
| 'use strict'; |
| |
| tv.b.unittest.testSuite(function() { |
| var Selection = tv.c.Selection; |
| var SelectionState = tv.c.trace_model.SelectionState; |
| var Task = tv.b.Task; |
| |
| test('instantiate', function() { |
| var model = new tv.c.TraceModel(); |
| var num_threads = 500; |
| model.importTraces([], false, false, function() { |
| var p100 = model.getOrCreateProcess(100); |
| for (var i = 0; i < num_threads; i++) { |
| var t = p100.getOrCreateThread(101 + i); |
| if (i % 2 == 0) { |
| t.sliceGroup.beginSlice('cat', 'a', 100); |
| t.sliceGroup.endSlice(110); |
| } else { |
| t.sliceGroup.beginSlice('cat', 'b', 50); |
| t.sliceGroup.endSlice(120); |
| } |
| } |
| }); |
| |
| var timeline = new tv.c.TimelineTrackView(); |
| timeline.model = model; |
| timeline.focusElement = timeline; |
| timeline.tabIndex = 0; |
| timeline.style.maxHeight = '600px'; |
| this.addHTMLOutput(timeline); |
| }); |
| |
| test('addAllEventsMatchingFilterToSelectionAsTask', function() { |
| var model = new tv.c.TraceModel(); |
| var p1 = model.getOrCreateProcess(1); |
| var t1 = p1.getOrCreateThread(1); |
| |
| t1.sliceGroup.pushSlice( |
| new tv.c.trace_model.ThreadSlice('', 'a', 0, 1, {}, 3)); |
| t1.sliceGroup.pushSlice( |
| new tv.c.trace_model.ThreadSlice('', 'b', 0, 1.1, {}, 2.8)); |
| |
| var t1asg = t1.asyncSliceGroup; |
| t1asg.slices.push( |
| tv.c.test_utils.newAsyncSliceNamed('a', 0, 1, t1, t1)); |
| t1asg.slices.push( |
| tv.c.test_utils.newAsyncSliceNamed('b', 1, 2, t1, t1)); |
| |
| var timeline = new tv.c.TimelineTrackView(); |
| timeline.model = model; |
| |
| var expected = [t1asg.slices[0], |
| t1.sliceGroup.slices[0]]; |
| var result = new tv.c.Selection(); |
| var filterTask = timeline.addAllEventsMatchingFilterToSelectionAsTask( |
| new tv.c.TitleOrCategoryFilter('a'), result); |
| Task.RunSynchronously(filterTask); |
| assert.equal(result.length, 2); |
| assert.equal(result[0], expected[0]); |
| assert.equal(result[1], expected[1]); |
| |
| var expected = [t1asg.slices[1], |
| t1.sliceGroup.slices[1]]; |
| var result = new tv.c.Selection(); |
| var filterTask = timeline.addAllEventsMatchingFilterToSelectionAsTask( |
| new tv.c.TitleOrCategoryFilter('b'), result); |
| Task.RunSynchronously(filterTask); |
| assert.equal(result.length, 2); |
| assert.equal(result[0], expected[0]); |
| assert.equal(result[1], expected[1]); |
| }); |
| |
| test('emptyThreadsDeleted', function() { |
| var model = new tv.c.TraceModel(); |
| var p1 = model.getOrCreateProcess(1); |
| var t1 = p1.getOrCreateThread(1); |
| |
| var timeline = new tv.c.TimelineTrackView(); |
| timeline.model = model; |
| |
| assert.isFalse(timeline.hasVisibleContent); |
| }); |
| |
| test('filteredCounters', function() { |
| var model = new tv.c.TraceModel(); |
| var c1 = model.kernel.getOrCreateCpu(0); |
| c1.getOrCreateCounter('', 'b'); |
| |
| var p1 = model.getOrCreateProcess(1); |
| var ctr = p1.getOrCreateCounter('', 'a'); |
| var series = new tv.c.trace_model.CounterSeries('a', 0); |
| series.addCounterSample(0, 1); |
| ctr.addSeries(series); |
| |
| var timeline = new tv.c.TimelineTrackView(); |
| timeline.model = model; |
| |
| assert.isTrue(timeline.hasVisibleContent); |
| }); |
| |
| test('filteredCpus', function() { |
| var model = new tv.c.TraceModel(); |
| var c1 = model.kernel.getOrCreateCpu(1); |
| c1.getOrCreateCounter('', 'a'); |
| |
| var timeline = new tv.c.TimelineTrackView(); |
| timeline.model = model; |
| |
| assert.isTrue(timeline.hasVisibleContent); |
| }); |
| |
| test('filteredProcesses', function() { |
| var model = new tv.c.TraceModel(); |
| var p1 = model.getOrCreateProcess(1); |
| p1.getOrCreateCounter('', 'a'); |
| |
| var timeline = new tv.c.TimelineTrackView(); |
| timeline.model = model; |
| |
| assert.isTrue(timeline.hasVisibleContent); |
| }); |
| |
| test('filteredThreads', function() { |
| var model = new tv.c.TraceModel(); |
| var p1 = model.getOrCreateProcess(1); |
| var t1 = p1.getOrCreateThread(2); |
| t1.sliceGroup.pushSlice(tv.c.test_utils.newSlice(0, 1)); |
| |
| var timeline = new tv.c.TimelineTrackView(); |
| timeline.model = model; |
| |
| assert.isTrue(timeline.hasVisibleContent); |
| }); |
| |
| test('interestRange', function() { |
| var events = [ |
| {name: 'a', args: {}, pid: 52, ts: 520, cat: 'foo', tid: 53, ph: 'B'}, |
| {name: 'b', args: {}, pid: 52, ts: 560, cat: 'foo', tid: 53, ph: 'B'}, |
| {name: 'c', args: {}, pid: 52, ts: 560, cat: 'foo', tid: 53, ph: 'B'}, |
| {name: 'c', args: {}, pid: 52, ts: 629, cat: 'foo', tid: 53, ph: 'E'}, |
| {name: 'b', args: {}, pid: 52, ts: 631, cat: 'foo', tid: 53, ph: 'E'}, |
| {name: 'a', args: {}, pid: 52, ts: 634, cat: 'foo', tid: 53, ph: 'E'} |
| ]; |
| var model = new tv.c.TraceModel(events); |
| var trackView = new tv.c.TimelineTrackView(); |
| trackView.model = model; |
| this.addHTMLOutput(trackView); |
| |
| var slice = model.processes[52].threads[53].sliceGroup.slices[2]; |
| trackView.viewport.interestRange.setMinAndMax(slice.start, slice.end); |
| }); |
| |
| test('emptyInterestRange', function() { |
| var events = [ |
| {name: 'a', args: {}, pid: 52, ts: 520, cat: 'foo', tid: 53, ph: 'B'}, |
| {name: 'b', args: {}, pid: 52, ts: 560, cat: 'foo', tid: 53, ph: 'B'}, |
| {name: 'c', args: {}, pid: 52, ts: 560, cat: 'foo', tid: 53, ph: 'B'}, |
| {name: 'c', args: {}, pid: 52, ts: 629, cat: 'foo', tid: 53, ph: 'E'}, |
| {name: 'b', args: {}, pid: 52, ts: 631, cat: 'foo', tid: 53, ph: 'E'}, |
| {name: 'a', args: {}, pid: 52, ts: 634, cat: 'foo', tid: 53, ph: 'E'} |
| ]; |
| var model = new tv.c.TraceModel(events); |
| var trackView = new tv.c.TimelineTrackView(); |
| trackView.model = model; |
| this.addHTMLOutput(trackView); |
| trackView.viewport.interestRange.reset(); |
| }); |
| |
| |
| test('thinnestInterestRange', function() { |
| var events = [ |
| {name: 'a', args: {}, pid: 52, ts: 520, cat: 'foo', tid: 53, ph: 'B'}, |
| {name: 'b', args: {}, pid: 52, ts: 560, cat: 'foo', tid: 53, ph: 'B'}, |
| {name: 'c', args: {}, pid: 52, ts: 560, cat: 'foo', tid: 53, ph: 'B'}, |
| {name: 'c', args: {}, pid: 52, ts: 629, cat: 'foo', tid: 53, ph: 'E'}, |
| {name: 'b', args: {}, pid: 52, ts: 631, cat: 'foo', tid: 53, ph: 'E'}, |
| {name: 'a', args: {}, pid: 52, ts: 634, cat: 'foo', tid: 53, ph: 'E'} |
| ]; |
| var model = new tv.c.TraceModel(events); |
| var trackView = new tv.c.TimelineTrackView(); |
| trackView.model = model; |
| this.addHTMLOutput(trackView); |
| trackView.viewport.interestRange.reset(); |
| |
| var slice = model.processes[52].threads[53].sliceGroup.slices[2]; |
| trackView.viewport.interestRange.setMinAndMax(slice.start, slice.start); |
| }); |
| }); |
| </script> |