| <!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="/core/test_utils.html"> |
| <link rel="import" href="/core/timeline_track_view.html"> |
| <link rel="import" href="/core/trace_model/trace_model.html"> |
| |
| <script> |
| 'use strict'; |
| |
| tv.b.unittest.testSuite(function() { // @suppress longLineCheck |
| var AsyncSliceGroup = tv.c.trace_model.AsyncSliceGroup; |
| var AsyncSliceGroupTrack = tv.c.tracks.AsyncSliceGroupTrack; |
| var Process = tv.c.trace_model.Process; |
| var ProcessTrack = tv.c.tracks.ProcessTrack; |
| var Thread = tv.c.trace_model.Thread; |
| var ThreadTrack = tv.c.tracks.ThreadTrack; |
| var newAsyncSlice = tv.c.test_utils.newAsyncSlice; |
| var newAsyncSliceNamed = tv.c.test_utils.newAsyncSliceNamed; |
| |
| test('filterSubRows', function() { |
| var model = new tv.c.TraceModel(); |
| var p1 = new Process(model, 1); |
| var t1 = new Thread(p1, 1); |
| var g = new AsyncSliceGroup(t1); |
| g.push(newAsyncSlice(0, 1, t1, t1)); |
| var track = new AsyncSliceGroupTrack(new tv.c.TimelineViewport()); |
| track.group = g; |
| |
| assert.equal(track.children.length, 1); |
| assert.isTrue(track.hasVisibleContent); |
| }); |
| |
| test('rebuildSubRows_twoNonOverlappingSlices', function() { |
| var model = new tv.c.TraceModel(); |
| var p1 = new Process(model, 1); |
| var t1 = new Thread(p1, 1); |
| var g = new AsyncSliceGroup(t1); |
| var s1 = newAsyncSlice(0, 1, t1, t1); |
| var subs1 = newAsyncSliceNamed('b', 0, 1, t1, t1); |
| s1.subSlices = [subs1]; |
| g.push(s1); |
| g.push(newAsyncSlice(1, 1, t1, t1)); |
| var track = new AsyncSliceGroupTrack(new tv.c.TimelineViewport()); |
| track.group = g; |
| var subRows = track.subRows; |
| assert.equal(subRows.length, 2); |
| assert.equal(subRows[0].length, 2); |
| assert.equal(subRows[1].length, 1); |
| assert.equal(subRows[1][0], g.slices[0].subSlices[0]); |
| assert.sameMembers(g.slices[1].subSlices, []); |
| }); |
| |
| test('rebuildSubRows_twoOverlappingSlices', function() { |
| var model = new tv.c.TraceModel(); |
| var p1 = new Process(model, 1); |
| var t1 = new Thread(p1, 1); |
| var g = new AsyncSliceGroup(t1); |
| |
| var s1 = newAsyncSlice(0, 1, t1, t1); |
| var subs1 = newAsyncSliceNamed('b', 0, 1, t1, t1); |
| s1.subSlices = [subs1]; |
| var s2 = newAsyncSlice(0, 1.5, t1, t1); |
| var subs2 = newAsyncSliceNamed('b', 0, 1, t1, t1); |
| s2.subSlices = [subs2]; |
| g.push(s1); |
| g.push(s2); |
| |
| g.updateBounds(); |
| |
| var track = new AsyncSliceGroupTrack(new tv.c.TimelineViewport()); |
| track.group = g; |
| |
| var subRows = track.subRows; |
| |
| assert.equal(subRows.length, 4); |
| assert.equal(subRows[0].length, 1); |
| assert.equal(subRows[1].length, 1); |
| assert.equal(subRows[2].length, 1); |
| assert.equal(subRows[3].length, 1); |
| assert.equal(subRows[1][0], g.slices[0].subSlices[0]); |
| assert.equal(subRows[3][0], g.slices[1].subSlices[0]); |
| }); |
| |
| test('rebuildSubRows_threePartlyOverlappingSlices', function() { |
| var model = new tv.c.TraceModel(); |
| var p1 = new Process(model, 1); |
| var t1 = new Thread(p1, 1); |
| var g = new AsyncSliceGroup(t1); |
| g.push(newAsyncSlice(0, 1, t1, t1)); |
| g.push(newAsyncSlice(0, 1.5, t1, t1)); |
| g.push(newAsyncSlice(1, 1.5, t1, t1)); |
| g.updateBounds(); |
| var track = new AsyncSliceGroupTrack(new tv.c.TimelineViewport()); |
| track.group = g; |
| var subRows = track.subRows; |
| |
| assert.equal(subRows.length, 2); |
| assert.equal(subRows[0].length, 2); |
| assert.equal(subRows[0][0], g.slices[0]); |
| assert.equal(subRows[0][1], g.slices[2]); |
| assert.equal(subRows[1][0], g.slices[1]); |
| assert.equal(subRows[1].length, 1); |
| assert.sameMembers(g.slices[0].subSlices, []); |
| assert.sameMembers(g.slices[1].subSlices, []); |
| assert.sameMembers(g.slices[2].subSlices, []); |
| }); |
| |
| test('rebuildSubRows_threeOverlappingSlices', function() { |
| var model = new tv.c.TraceModel(); |
| var p1 = new Process(model, 1); |
| var t1 = new Thread(p1, 1); |
| var g = new AsyncSliceGroup(t1); |
| |
| g.push(newAsyncSlice(0, 1, t1, t1)); |
| g.push(newAsyncSlice(0, 1.5, t1, t1)); |
| g.push(newAsyncSlice(2, 1, t1, t1)); |
| g.updateBounds(); |
| |
| var track = new AsyncSliceGroupTrack(new tv.c.TimelineViewport()); |
| track.group = g; |
| |
| var subRows = track.subRows; |
| assert.equal(subRows.length, 2); |
| assert.equal(subRows[0].length, 2); |
| assert.equal(subRows[1].length, 1); |
| assert.equal(subRows[0][0], g.slices[0]); |
| assert.equal(subRows[1][0], g.slices[1]); |
| assert.equal(subRows[0][1], g.slices[2]); |
| }); |
| |
| // Tests that no slices and their sub slices overlap. |
| test('rebuildSubRows_NonOverlappingSubSlices', function() { |
| var model = new tv.c.TraceModel(); |
| var p1 = new Process(model, 1); |
| var t1 = new Thread(p1, 1); |
| var g = new AsyncSliceGroup(t1); |
| |
| var slice1 = newAsyncSlice(0, 5, t1, t1); |
| var slice1Child = newAsyncSlice(1, 2, t1, t1); |
| slice1.subSlices = [slice1Child]; |
| var slice2 = newAsyncSlice(3, 5, t1, t1); |
| var slice3 = newAsyncSlice(5, 4, t1, t1); |
| var slice3Child = newAsyncSlice(6, 2, t1, t1); |
| slice3.subSlices = [slice3Child]; |
| g.push(slice1); |
| g.push(slice2); |
| g.push(slice3); |
| g.updateBounds(); |
| |
| var track = new AsyncSliceGroupTrack(new tv.c.TimelineViewport()); |
| track.group = g; |
| |
| var subRows = track.subRows; |
| // Checks each sub row to see that we don't have any overlapping slices. |
| for (var i = 0; i < subRows.length; i++) { |
| var row = subRows[i]; |
| for (var j = 0; j < row.length; j++) { |
| for (var k = j + 1; k < row.length; k++) { |
| assert.isTrue(row[j].end <= row[k].start); |
| } |
| } |
| } |
| }); |
| |
| test('rebuildSubRows_NonOverlappingSubSlicesThreeNestedLevels', function() { |
| var model = new tv.c.TraceModel(); |
| var p1 = new Process(model, 1); |
| var t1 = new Thread(p1, 1); |
| var g = new AsyncSliceGroup(t1); |
| |
| var slice1 = newAsyncSlice(0, 4, t1, t1); |
| var slice1Child = newAsyncSlice(1, 2, t1, t1); |
| slice1.subSlices = [slice1Child]; |
| var slice2 = newAsyncSlice(2, 7, t1, t1); |
| var slice3 = newAsyncSlice(5, 5, t1, t1); |
| var slice3Child = newAsyncSlice(6, 3, t1, t1); |
| var slice3Child2 = newAsyncSlice(7, 1, t1, t1); |
| slice3.subSlices = [slice3Child]; |
| slice3Child.subSlices = [slice3Child2]; |
| g.push(slice1); |
| g.push(slice2); |
| g.push(slice3); |
| g.updateBounds(); |
| |
| var track = new AsyncSliceGroupTrack(new tv.c.TimelineViewport()); |
| track.group = g; |
| |
| var subRows = track.subRows; |
| // Checks each sub row to see that we don't have any overlapping slices. |
| for (var i = 0; i < subRows.length; i++) { |
| var row = subRows[i]; |
| for (var j = 0; j < row.length; j++) { |
| for (var k = j + 1; k < row.length; k++) { |
| assert.isTrue(row[j].end <= row[k].start); |
| } |
| } |
| } |
| }); |
| |
| test('asyncSliceGroupContainerMap', function() { |
| var vp = new tv.c.TimelineViewport(); |
| var containerToTrack = vp.containerToTrackObj; |
| var model = new tv.c.TraceModel(); |
| var process = model.getOrCreateProcess(123); |
| var thread = process.getOrCreateThread(456); |
| var group = new AsyncSliceGroup(thread); |
| |
| var processTrack = new ProcessTrack(vp); |
| var threadTrack = new ThreadTrack(vp); |
| var groupTrack = new AsyncSliceGroupTrack(vp); |
| processTrack.process = process; |
| threadTrack.thread = thread; |
| groupTrack.group = group; |
| processTrack.appendChild(threadTrack); |
| threadTrack.appendChild(groupTrack); |
| |
| assert.equal(processTrack.eventContainer, process); |
| assert.equal(threadTrack.eventContainer, thread); |
| assert.equal(groupTrack.eventContainer, group); |
| |
| assert.isUndefined(containerToTrack.getTrackByStableId('123')); |
| assert.isUndefined(containerToTrack.getTrackByStableId('123.456')); |
| assert.isUndefined( |
| containerToTrack.getTrackByStableId('123.456.AsyncSliceGroup')); |
| |
| vp.modelTrackContainer = { |
| addContainersToTrackMap: function(containerToTrackObj) { |
| processTrack.addContainersToTrackMap(containerToTrackObj); |
| }, |
| addEventListener: function() {} |
| }; |
| vp.rebuildContainerToTrackMap(); |
| |
| // Check that all tracks call childs' addContainersToTrackMap() |
| // by checking the resulting map. |
| assert.equal(containerToTrack.getTrackByStableId('123'), processTrack); |
| assert.equal(containerToTrack.getTrackByStableId('123.456'), threadTrack); |
| assert.equal(containerToTrack.getTrackByStableId('123.456.AsyncSliceGroup'), |
| groupTrack); |
| |
| // Check the track's eventContainer getter. |
| assert.equal(processTrack.eventContainer, process); |
| assert.equal(threadTrack.eventContainer, thread); |
| assert.equal(groupTrack.eventContainer, group); |
| }); |
| }); |
| </script> |