| <!DOCTYPE html> |
| <html> |
| <!-- |
| Copyright (c) 2012 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. |
| --> |
| <head> |
| <title>TimelineModel tests</title> |
| <script src="http://closure-library.googlecode.com/svn/trunk/closure/goog/base.js"></script> |
| <script src="../shared/js/cr.js"></script> |
| <script src="../shared/js/cr/event_target.js"></script> |
| <script src="test_utils.js"></script> |
| <script src="timeline_model.js"></script> |
| <script> |
| goog.require('goog.testing.jsunit'); |
| </script> |
| |
| </head> |
| <body> |
| <script> |
| 'use strict'; |
| var TimelineCpu = tracing.TimelineCpu; |
| var TimelineSlice = tracing.TimelineSlice; |
| var TimelineThreadSlice = tracing.TimelineThreadSlice; |
| var TimelineProcess = tracing.TimelineProcess; |
| var TimelineThread = tracing.TimelineThread; |
| var TimelineModel = tracing.TimelineModel; |
| var TimelineFilter = tracing.TimelineFilter; |
| var TimelineAsyncSlice = tracing.TimelineAsyncSlice; |
| var TimelineAsyncSliceGroup = tracing.TimelineAsyncSliceGroup; |
| var newAsyncSlice = test_utils.newAsyncSlice; |
| |
| function testThreadBounds_Empty() { |
| var t = new TimelineThread(new TimelineProcess(7), 1); |
| t.updateBounds(); |
| assertEquals(undefined, t.minTimestamp); |
| assertEquals(undefined, t.maxTimestamp); |
| } |
| |
| function testThreadBounds_SubRow() { |
| var t = new TimelineThread(new TimelineProcess(7), 1); |
| t.subRows[0].push(new TimelineThreadSlice('a', 0, 1, {}, 3)); |
| t.updateBounds(); |
| assertEquals(1, t.minTimestamp); |
| assertEquals(4, t.maxTimestamp); |
| } |
| |
| function testThreadBounds_AsyncSliceGroup() { |
| var t = new TimelineThread(new TimelineProcess(7), 1); |
| t.subRows[0].push(new TimelineThreadSlice('a', 0, 1, {}, 3)); |
| t.asyncSlices.push(newAsyncSlice(0.1, 5, t, t)); |
| t.updateBounds(); |
| assertEquals(0.1, t.minTimestamp); |
| assertEquals(5.1, t.maxTimestamp); |
| } |
| |
| function testModelBounds_EmptyModel() { |
| var m = new TimelineModel(); |
| m.updateBounds(); |
| assertEquals(undefined, m.minTimestamp); |
| assertEquals(undefined, m.maxTimestamp); |
| } |
| |
| function testModelBounds_OneEmptyThread() { |
| var m = new TimelineModel(); |
| var t = m.getOrCreateProcess(1).getOrCreateThread(1); |
| m.updateBounds(); |
| assertEquals(undefined, m.minTimestamp); |
| assertEquals(undefined, m.maxTimestamp); |
| } |
| |
| function testModelBounds_OneThread() { |
| var m = new TimelineModel(); |
| var t = m.getOrCreateProcess(1).getOrCreateThread(1); |
| t.subRows[0].push(new TimelineThreadSlice('a', 0, 1, {}, 3)); |
| m.updateBounds(); |
| assertEquals(1, m.minTimestamp); |
| assertEquals(4, m.maxTimestamp); |
| } |
| |
| function testModelBounds_OneThreadAndOneEmptyThread() { |
| var m = new TimelineModel(); |
| var t1 = m.getOrCreateProcess(1).getOrCreateThread(1); |
| t1.subRows[0].push(new TimelineThreadSlice('a', 0, 1, {}, 3)); |
| var t2 = m.getOrCreateProcess(1).getOrCreateThread(1); |
| m.updateBounds(); |
| assertEquals(1, m.minTimestamp); |
| assertEquals(4, m.maxTimestamp); |
| } |
| |
| function testCpuBounds_Empty() { |
| var cpu = new TimelineCpu(undefined, 1); |
| cpu.updateBounds(); |
| assertEquals(undefined, cpu.minTimestamp); |
| assertEquals(undefined, cpu.maxTimestamp); |
| } |
| |
| function testCpuBounds_OneSlice() { |
| var cpu = new TimelineCpu(undefined, 1); |
| cpu.slices.push(new TimelineSlice('a', 0, 1, {}, 3)); |
| cpu.updateBounds(); |
| assertEquals(1, cpu.minTimestamp); |
| assertEquals(4, cpu.maxTimestamp); |
| } |
| |
| function testModelBounds_OneCpu() { |
| var m = new TimelineModel(); |
| var cpu = m.getOrCreateCpu(1); |
| cpu.slices.push(new TimelineSlice('a', 0, 1, {}, 3)); |
| m.updateBounds(); |
| assertEquals(1, m.minTimestamp); |
| assertEquals(4, m.maxTimestamp); |
| } |
| |
| |
| function testModelBounds_OneCpuOneThread() { |
| var m = new TimelineModel(); |
| var cpu = m.getOrCreateCpu(1); |
| cpu.slices.push(new TimelineSlice('a', 0, 1, {}, 3)); |
| |
| var t = m.getOrCreateProcess(1).getOrCreateThread(1); |
| t.subRows[0].push(new TimelineThreadSlice('a', 0, 1, {}, 4)); |
| |
| m.updateBounds(); |
| assertEquals(1, m.minTimestamp); |
| assertEquals(5, m.maxTimestamp); |
| } |
| |
| function testPTIDFromPidAndTid() { |
| assertEquals('1:2', TimelineThread.getPTIDFromPidAndTid(1, 2)); |
| } |
| |
| function testAsyncSliceGroupBounds_Empty() { |
| var g = new TimelineAsyncSliceGroup(name); |
| g.updateBounds(); |
| assertEquals(undefined, g.minTimestamp); |
| assertEquals(undefined, g.maxTimestamp); |
| } |
| |
| function testAsyncSliceGroupBounds_Basic() { |
| var p1 = new TimelineProcess(1); |
| var t1 = new TimelineThread(p1, 1); |
| var g = new TimelineAsyncSliceGroup('a'); |
| g.push(newAsyncSlice(0, 1, t1, t1)); |
| g.push(newAsyncSlice(1, 1.5, t1, t1)); |
| assertEquals(2, g.length); |
| g.updateBounds(); |
| assertEquals(0, g.minTimestamp); |
| assertEquals(2.5, g.maxTimestamp); |
| } |
| |
| function testAsyncSliceGroup_rebuildSubRows_twoNonOverlappingSlices() { |
| var p1 = new TimelineProcess(1); |
| var t1 = new TimelineThread(p1, 1); |
| var g = new TimelineAsyncSliceGroup('a'); |
| g.slices.push(newAsyncSlice(0, 1, t1, t1)); |
| g.slices.push(newAsyncSlice(1, 1, t1, t1)); |
| |
| assertEquals(1, g.subRows.length); |
| assertEquals(2, g.subRows[0].length); |
| assertEquals(g.slices[0].subSlices[0], g.subRows[0][0]); |
| assertEquals(g.slices[1].subSlices[0], g.subRows[0][1]); |
| } |
| |
| function testAsyncSliceGroup_rebuildSubRows_twoOverlappingSlices() { |
| var p1 = new TimelineProcess(1); |
| var t1 = new TimelineThread(p1, 1); |
| var g = new TimelineAsyncSliceGroup('a'); |
| g.slices.push(newAsyncSlice(0, 1, t1, t1)); |
| g.slices.push(newAsyncSlice(0, 1.5, t1, t1)); |
| g.updateBounds(); |
| |
| assertEquals(2, g.subRows.length); |
| assertEquals(1, g.subRows[0].length); |
| assertEquals(g.slices[0], g.subRows[0][0]); |
| assertEquals(1, g.subRows[1].length); |
| assertEquals(g.slices[1], g.subRows[1][0]); |
| } |
| |
| function testAsyncSliceGroup_rebuildSubRows_threePartlyOverlappingSlices() { |
| var p1 = new TimelineProcess(1); |
| var t1 = new TimelineThread(p1, 1); |
| var g = new TimelineAsyncSliceGroup('a'); |
| g.slices.push(newAsyncSlice(0, 1, t1, t1)); |
| g.slices.push(newAsyncSlice(0, 1.5, t1, t1)); |
| g.slices.push(newAsyncSlice(1, 1.5, t1, t1)); |
| g.updateBounds(); |
| |
| assertEquals(2, g.subRows.length); |
| assertEquals(2, g.subRows[0].length); |
| assertEquals(g.slices[0].subSlices[0], g.subRows[0][0]); |
| assertEquals(g.slices[2].subSlices[0], g.subRows[0][1]); |
| assertEquals(1, g.subRows[1].length); |
| assertEquals(g.slices[1].subSlices[0], g.subRows[1][0]); |
| } |
| |
| function testAsyncSliceGroup_rebuildSubRows_twoOverlappingSlices() { |
| var p1 = new TimelineProcess(1); |
| var t1 = new TimelineThread(p1, 1); |
| var g = new TimelineAsyncSliceGroup('a'); |
| g.slices.push(newAsyncSlice(0, 1, t1, t1)); |
| g.slices.push(newAsyncSlice(0, 1.5, t1, t1)); |
| g.slices.push(newAsyncSlice(2, 1, t1, t1)); |
| g.updateBounds(); |
| |
| assertEquals(2, g.subRows.length); |
| assertEquals(2, g.subRows[0].length); |
| assertEquals(g.slices[0].subSlices[0], g.subRows[0][0]); |
| assertEquals(g.slices[2].subSlices[0], g.subRows[0][1]); |
| assertEquals(1, g.subRows[1].length); |
| assertEquals(g.slices[1].subSlices[0], g.subRows[1][0]); |
| } |
| |
| function testAsyncSliceGroup_computeSubGroups_twoThreadSpecificSlices() { |
| var p1 = new TimelineProcess(1); |
| var t1 = new TimelineThread(p1, 1); |
| var t2 = new TimelineThread(p1, 2); |
| var g = new TimelineAsyncSliceGroup('a'); |
| g.slices.push(newAsyncSlice(0, 1, t1, t1)); |
| g.slices.push(newAsyncSlice(0, 1, t2, t2)); |
| |
| var subGroups = g.computeSubGroups(); |
| assertEquals(2, subGroups.length); |
| |
| assertEquals(g.name, subGroups[0].name); |
| assertEquals(1, subGroups[0].slices.length); |
| assertEquals(g.slices[0], subGroups[0].slices[0]); |
| |
| assertEquals(g.name, subGroups[1].name); |
| assertEquals(1, subGroups[1].slices.length); |
| assertEquals(g.slices[1], subGroups[1].slices[0]); |
| } |
| |
| function testModelCanImportEmpty() { |
| var m; |
| m = new TimelineModel([]); |
| m = new TimelineModel(''); |
| } |
| |
| function testTimelineFilter() { |
| var s0 = new TimelineSlice('a', 0, 1, {}, 3); |
| assertFalse(new TimelineFilter('').matchSlice(s0)); |
| |
| assertTrue(new TimelineFilter('a').matchSlice(s0)); |
| assertFalse(new TimelineFilter('x').matchSlice(s0)); |
| |
| var s1 = new TimelineSlice('ba', 0, 1, {}, 3); |
| assertTrue(new TimelineFilter('a').matchSlice(s1)); |
| assertTrue(new TimelineFilter('ba').matchSlice(s1)); |
| assertFalse(new TimelineFilter('x').matchSlice(s1)); |
| } |
| |
| </script> |
| </body> |
| </html> |