Chromium Code Reviews| Index: chrome/browser/resources/tracing/timeline_model_test.html |
| diff --git a/chrome/browser/resources/tracing/timeline_model_test.html b/chrome/browser/resources/tracing/timeline_model_test.html |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..4a1c58d3caf55839862fa48414ad7a4c112a2a88 |
| --- /dev/null |
| +++ b/chrome/browser/resources/tracing/timeline_model_test.html |
| @@ -0,0 +1,295 @@ |
| +<!DOCTYPE html> |
| +<html> |
| +<!-- |
| +Copyright (c) 2010 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></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="timeline_model.js"></script> |
| +<script> |
| + goog.require('goog.testing.jsunit'); |
| +</script> |
| + |
| +</head> |
| +<body> |
| +<script> |
| +function testBasicSingleThreadNonnestedParsing() { |
| + var events = [ |
| + {'name':'a','args':{},'pid':52,'ts':9524,'cat':'foo','tid':53,'ph':'B'}, |
|
arv (Not doing code reviews)
2011/10/21 17:09:18
space after :
nduca
2011/10/21 19:50:40
Done.
|
| + {'name':'a','args':{},'pid':52,'ts':9560,'cat':'foo','tid':53,'ph':'E'}, |
| + {'name':'b','args':{},'pid':52,'ts':9629,'cat':'foo','tid':53,'ph':'B'}, |
| + {'name':'b','args':{},'pid':52,'ts':9631,'cat':'foo','tid':53,'ph':'E'} |
| + ]; |
| + var m = new tracing.TimelineModel(events); |
| + assertEquals(1, m.numProcesses); |
| + var p = m.processes[52]; |
| + assertNotUndefined(p); |
| + |
| + assertEquals(1, p.numThreads); |
| + var t = p.threads[53]; |
| + assertNotUndefined(t); |
| + assertEquals(1, t.subRows.length); |
| + assertEquals(53, t.tid); |
| + var subRow = t.subRows[0]; |
| + assertEquals(2, subRow.length); |
| + var slice = subRow[0]; |
| + assertEquals('a', slice.title); |
| + assertEquals(0, slice.start); |
| + assertEquals((9560 - 9524) / 1000, slice.duration); |
| + assertEquals(0, slice.subSlices.length); |
| + |
| + slice = subRow[1]; |
| + assertEquals('b', slice.title); |
| + assertEquals((9629-9524) / 1000, slice.start); |
| + assertEquals((9631 - 9629) / 1000, slice.duration); |
| + assertEquals(0, slice.subSlices.length); |
| +} |
| + |
| +function testNestedParsing() { |
| + var events = [ |
| + {'name':'a','args':{},'pid':1,'ts':1,'cat':'foo','tid':1,'ph':'B'}, |
| + {'name':'b','args':{},'pid':1,'ts':2,'cat':'foo','tid':1,'ph':'B'}, |
| + {'name':'b','args':{},'pid':1,'ts':3,'cat':'foo','tid':1,'ph':'E'}, |
| + {'name':'a','args':{},'pid':1,'ts':4,'cat':'foo','tid':1,'ph':'E'}, |
| + ]; |
| + var m = new tracing.TimelineModel(events); |
| + var p = m.processes[1]; |
| + var t = p.threads[1]; |
| + assertEquals(2, t.subRows.length); |
| + var subRow = t.subRows[0]; |
| + assertEquals(1, subRow.length); |
| + var slice = subRow[0]; |
| + assertEquals('a', slice.title); |
| + assertEquals((4-1) / 1000, slice.duration); |
|
arv (Not doing code reviews)
2011/10/21 17:09:18
whitespace
nduca
2011/10/21 19:50:40
Done.
|
| + assertEquals(1, slice.subSlices.length); |
| + |
| + slice = slice.subSlices[0]; |
| + assertEquals('b', slice.title); |
| + assertEquals((2-1) / 1000, slice.start); |
| + assertEquals((3-2) / 1000, slice.duration); |
| + assertEquals(0, slice.subSlices.length); |
| + |
| + subRow = t.subRows[1]; |
| + slice = subRow[0]; |
| + assertEquals(t.subRows[0][0].subSlices[0], slice); |
| +} |
| + |
| +function testAutoclosing() { |
| + var events = [ |
| + // Slice that doesn't finish |
| + {'name':'a','args':{},'pid':1,'ts':1,'cat':'foo','tid':1,'ph':'B'}, |
| + |
| + // Slice that does finish to give an 'end time' to make autoclosing work |
| + {'name':'b','args':{},'pid':1,'ts':1,'cat':'foo','tid':2,'ph':'B'}, |
| + {'name':'b','args':{},'pid':1,'ts':2,'cat':'foo','tid':2,'ph':'E'}, |
| + ]; |
| + var m = new tracing.TimelineModel(events); |
| + var p = m.processes[1]; |
| + var t = p.threads[1]; |
| + var subRow = t.subRows[0]; |
| + var slice = subRow[0]; |
| + assertEquals('a', slice.title); |
| + assertTrue(slice.didNotFinish); |
| + assertEquals(0, slice.start); |
| + assertEquals((2-1) / 1000, slice.duration); |
| +} |
| + |
| + |
| +function testNestedAutoclosing() { |
| + var events = [ |
| + // Tasks that dont finish |
| + {'name':'a1','args':{},'pid':1,'ts':1,'cat':'foo','tid':1,'ph':'B'}, |
| + {'name':'a2','args':{},'pid':1,'ts':1.5,'cat':'foo','tid':1,'ph':'B'}, |
| + |
| + // Slice that does finish to give an 'end time' to make autoclosing work |
| + {'name':'b','args':{},'pid':1,'ts':1,'cat':'foo','tid':2,'ph':'B'}, |
| + {'name':'b','args':{},'pid':1,'ts':2,'cat':'foo','tid':2,'ph':'E'}, |
| + ]; |
| + var m = new tracing.TimelineModel(events); |
| + var p = m.processes[1]; |
| + var t = p.threads[1]; |
| + var subRow = t.subRows[0]; |
| + var slice = subRow[0]; |
| + assertEquals('a1', slice.title); |
| + assertTrue(slice.didNotFinish); |
| + assertEquals(0, slice.start); |
| + assertEquals((2-1) / 1000, slice.duration); |
| + |
| + var slice = slice.subSlices[0]; |
| + assertEquals('a2', slice.title); |
| + assertTrue(slice.didNotFinish); |
| + assertEquals((1.5-1) / 1000, slice.start); |
| + assertEquals((2-1.5) / 1000, slice.duration); |
| +} |
| + |
| +function testTaskColoring() { |
| + // The test below depends on hashing of 'a' != 'b'. Fail early if that assumption is incorrect. |
| + assertNotEquals(tracing.getStringHash('a'), tracing.getStringHash('b')); |
| + |
| + var events = [ |
| + {'name':'a','args':{},'pid':1,'ts':1,'cat':'foo','tid':1,'ph':'B'}, |
| + {'name':'a','args':{},'pid':1,'ts':2,'cat':'foo','tid':1,'ph':'E'}, |
| + {'name':'b','args':{},'pid':1,'ts':3,'cat':'foo','tid':1,'ph':'B'}, |
| + {'name':'b','args':{},'pid':1,'ts':4,'cat':'foo','tid':1,'ph':'E'}, |
| + {'name':'a','args':{},'pid':1,'ts':5,'cat':'foo','tid':1,'ph':'B'}, |
| + {'name':'a','args':{},'pid':1,'ts':6,'cat':'foo','tid':1,'ph':'E'}, |
| + ]; |
| + var m = new tracing.TimelineModel(events); |
| + var p = m.processes[1]; |
| + var t = p.threads[1]; |
| + var subRow = t.subRows[0]; |
| + var a1 = subRow[0]; |
| + assertEquals('a', a1.title); |
| + var b = subRow[1]; |
| + assertEquals('b', b.title); |
| + assertNotEquals(a1.colorId, b.colorId); |
| + var a2 = subRow[0]; |
| + assertEquals('a', a2.title); |
| + assertEquals(a1.colorId, a2.colorId); |
| +} |
| + |
| +function testMultipleThreadParsing() { |
| + var events = [ |
| + {'name':'a','args':{},'pid':1,'ts':1,'cat':'foo','tid':1,'ph':'B'}, |
| + {'name':'a','args':{},'pid':1,'ts':2,'cat':'foo','tid':1,'ph':'E'}, |
| + {'name':'b','args':{},'pid':1,'ts':3,'cat':'foo','tid':2,'ph':'B'}, |
| + {'name':'b','args':{},'pid':1,'ts':4,'cat':'foo','tid':2,'ph':'E'} |
| + ]; |
| + var m = new tracing.TimelineModel(events); |
| + assertEquals(1, m.numProcesses); |
| + var p = m.processes[1]; |
| + assertNotUndefined(p); |
| + |
| + assertEquals(2, p.numThreads); |
| + |
| + // Check thread 1 |
| + var t = p.threads[1]; |
| + assertNotUndefined(t); |
| + assertEquals(1, t.subRows.length); |
| + assertEquals(1, t.tid); |
| + |
| + var subRow = t.subRows[0]; |
| + assertEquals(1, subRow.length); |
| + var slice = subRow[0]; |
| + assertEquals('a', slice.title); |
| + assertEquals(0, slice.start); |
| + assertEquals((2-1) / 1000, slice.duration); |
| + assertEquals(0, slice.subSlices.length); |
| + |
| + // Check thread 2 |
| + var t = p.threads[2]; |
| + assertNotUndefined(t); |
| + assertEquals(1, t.subRows.length); |
| + assertEquals(2, t.tid); |
| + |
| + subRow = t.subRows[0]; |
| + assertEquals(1, subRow.length); |
| + slice = subRow[0]; |
| + assertEquals('b', slice.title); |
| + assertEquals((3-1) / 1000, slice.start); |
| + assertEquals((4 - 3) / 1000, slice.duration); |
| + assertEquals(0, slice.subSlices.length); |
| +} |
| + |
| +function testMultiplePidParsing() { |
| + var events = [ |
| + {'name':'a','args':{},'pid':1,'ts':1,'cat':'foo','tid':1,'ph':'B'}, |
| + {'name':'a','args':{},'pid':1,'ts':2,'cat':'foo','tid':1,'ph':'E'}, |
| + {'name':'b','args':{},'pid':2,'ts':3,'cat':'foo','tid':2,'ph':'B'}, |
| + {'name':'b','args':{},'pid':2,'ts':4,'cat':'foo','tid':2,'ph':'E'} |
| + ]; |
| + var m = new tracing.TimelineModel(events); |
| + assertEquals(2, m.numProcesses); |
| + var p = m.processes[1]; |
| + assertNotUndefined(p); |
| + |
| + assertEquals(1, p.numThreads); |
| + |
| + // Check process 1 thread 1 |
| + var t = p.threads[1]; |
| + assertNotUndefined(t); |
| + assertEquals(1, t.subRows.length); |
| + assertEquals(1, t.tid); |
| + |
| + var subRow = t.subRows[0]; |
| + assertEquals(1, subRow.length); |
| + var slice = subRow[0]; |
| + assertEquals('a', slice.title); |
| + assertEquals(0, slice.start); |
| + assertEquals((2-1) / 1000, slice.duration); |
| + assertEquals(0, slice.subSlices.length); |
| + |
| + // Check process 2 thread 2 |
| + var p = m.processes[2]; |
| + assertNotUndefined(p); |
| + assertEquals(1, p.numThreads); |
| + var t = p.threads[2]; |
| + assertNotUndefined(t); |
| + assertEquals(1, t.subRows.length); |
| + assertEquals(2, t.tid); |
| + |
| + subRow = t.subRows[0]; |
| + assertEquals(1, subRow.length); |
| + slice = subRow[0]; |
| + assertEquals('b', slice.title); |
| + assertEquals((3-1) / 1000, slice.start); |
| + assertEquals((4 - 3) / 1000, slice.duration); |
| + assertEquals(0, slice.subSlices.length); |
| + |
| + // Check getAllThreads. |
| + assertArrayEquals([m.processes[1].threads[1], m.processes[2].threads[2]], |
| + m.getAllThreads()) |
| +} |
| + |
| +// Thread names |
| +function testThreadNames() { |
| + var events = [ |
| + {'name': 'thread_name', args: {'name': 'Thread 1'}, 'pid': 1, 'ts': 0, 'tid': 1, 'ph': 'M'}, |
| + {'name':'a','args':{},'pid':1,'ts':1,'cat':'foo','tid':1,'ph':'B'}, |
| + {'name':'a','args':{},'pid':1,'ts':2,'cat':'foo','tid':1,'ph':'E'}, |
| + {'name':'b','args':{},'pid':2,'ts':3,'cat':'foo','tid':2,'ph':'B'}, |
| + {'name':'b','args':{},'pid':2,'ts':4,'cat':'foo','tid':2,'ph':'E'}, |
| + {'name': 'thread_name', args: {'name': 'Thread 2'}, 'pid': 2, 'ts': 0, 'tid': 2, 'ph': 'M'}, |
| + ]; |
| + var m = new tracing.TimelineModel(events); |
| + assertEquals('Thread 1', m.processes[1].threads[1].name); |
| + assertEquals('Thread 2', m.processes[2].threads[2].name); |
| +} |
| + |
| + |
| +function testImmediateParsing() { |
| + var events = [ |
| + // Need to include immediates inside a task so the timeline |
| + // recentering/zeroing doesn't clobber their timestamp. |
| + {'name':'a','args':{},'pid':1,'ts':1,'cat':'foo','tid':1,'ph':'B'}, |
| + {'name':'immediate','args':{},'pid':1,'ts':2,'cat':'foo','tid':1,'ph':'I'}, |
| + {'name':'a','args':{},'pid':1,'ts':4,'cat':'foo','tid':1,'ph':'E'}, |
| + ]; |
| + var m = new tracing.TimelineModel(events); |
| + var p = m.processes[1]; |
| + var t = p.threads[1]; |
| + assertEquals(2, t.subRows.length); |
| + var subRow = t.subRows[0]; |
| + assertEquals(1, subRow.length); |
| + var slice = subRow[0]; |
| + assertEquals('a', slice.title); |
| + assertEquals((4-1) / 1000, slice.duration); |
| + assertEquals(1, slice.subSlices.length); |
| + |
| + var immed = slice.subSlices[0]; |
| + assertEquals('immediate', immed.title); |
| + assertEquals((2-1) / 1000, immed.start); |
| + assertEquals(0, immed.duration); |
| + assertEquals(0, immed.subSlices.length); |
| + |
| + subRow = t.subRows[1]; |
| + assertEquals(immed, subRow[0]); |
| +} |
| +</script> |
| +</body> |
| +</html> |