1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
7 tvcm.require('tvcm.events');
8 tvcm.require('tracing.test_utils');
9 tvcm.require('tracing.importer.timeline_stream_importer');
11 tvcm.unittest.testSuite('tracing.importer.timeline_stream_importer_test', function() { // @suppress longLineCheck
12 var FakeWebSocket = function() {
13 tvcm.EventTarget.call(this);
14 this.sendHook_ = undefined;
16 this.connected_ = false;
19 FakeWebSocket.prototype = {
20 __proto__: tvcm.EventTarget.prototype,
22 set connected(connected) {
23 if (this.connected_ == connected)
25 this.connected_ = connected;
27 tvcm.dispatchSimpleEvent(this, 'connect');
29 tvcm.dispatchSimpleEvent(this, 'disconnect');
34 return WebSocket.OPEN;
35 return WebSocket.CLOSED;
38 pushMessage: function(msg) {
39 this.messages_.push(JSON.stringify(msg));
42 get numPendingMessages() {
43 return this.messages_.length;
46 dispatchAllPendingMessages: function() {
47 var messages = this.messages_.splice(0, this.messages_.length);
48 for (var i = 0; i < messages.length; i++)
49 this.dispatchEvent({type: 'message', data: messages[i]});
53 * @param {function(message)} hook A function to call when send is
57 this.sendHook_ = hook;
60 send: function(message) {
62 this.sendHook_(message);
66 this.addEventListener('open', handler);
69 set onclose(handler) {
70 this.addEventListener('close', handler);
73 set onerror(handler) {
74 this.addEventListener('error', handler);
77 set onmessage(handler) {
78 this.addEventListener('message', handler);
82 test('importBasic', function() {
83 var model = new tracing.TraceModel();
84 var importer = new tracing.importer.TimelineStreamImporter(model);
86 assertFalse(importer.paused);
87 assertFalse(importer.connected);
89 var socket = new FakeWebSocket();
90 importer.connect(socket);
92 socket.connected = true;
93 assertTrue(importer.connected);
100 {s: 10, e: 11, l: 'alligator'},
101 {s: 14, e: 15, l: 'bandicoot'},
102 {s: 17, e: 18, l: 'cheetah'}
106 socket.dispatchAllPendingMessages();
108 assertNotUndefined(model.processes[1]);
109 assertNotUndefined(model.processes[1].threads[3]);
110 var t3 = model.processes[1].threads[3];
111 assertEquals(3, t3.sliceGroup.length);
113 assertEquals(model.bounds.min, 10);
114 assertEquals(model.bounds.max, 18);
117 test('pause', function() {
118 var model = new tracing.TraceModel();
119 var importer = new tracing.importer.TimelineStreamImporter(model);
121 assertFalse(importer.paused);
123 var socket = new FakeWebSocket();
124 importer.connect(socket);
125 socket.connected = true;
128 socket.sendHook = function(message) {
129 var data = JSON.parse(message);
131 assertEquals('pause', data['cmd']);
135 assertTrue(importer.paused);
138 socket.sendHook = function(message) {
139 var data = JSON.parse(message);
141 assertEquals('resume', data['cmd']);
145 assertFalse(importer.paused);
148 test('counters', function() {
149 var model = new tracing.TraceModel();
150 var importer = new tracing.importer.TimelineStreamImporter(model);
152 assertFalse(importer.paused);
153 assertFalse(importer.connected);
155 var socket = new FakeWebSocket();
156 importer.connect(socket);
158 socket.connected = true;
159 assertTrue(importer.connected);
205 socket.dispatchAllPendingMessages();
207 assertNotUndefined(model.processes[1]);
208 assertNotUndefined(model.processes[1].counters['streamed.Allocator']);
210 var counter = model.processes[1].counters['streamed.Allocator'];
211 assertNotUndefined(counter.series);
213 assertEquals(1, counter.series.length);
214 assertEquals(5, counter.series[0].length);
216 assertEquals(48, counter.series[0].getSample(2).value);
217 assertEquals(64, counter.timestamps[4]);
219 assertEquals(model.bounds.min, 2);
220 assertEquals(model.bounds.max, 64);
223 test('counterImportErrors', function() {
224 var model = new tracing.TraceModel();
225 var importer = new tracing.importer.TimelineStreamImporter(model);
227 assertFalse(importer.paused);
228 assertFalse(importer.connected);
230 var socket = new FakeWebSocket();
231 importer.connect(socket);
233 socket.connected = true;
234 assertTrue(importer.connected);
241 sn: ['Bytes', 'Nibbles', 'Bits'],
256 // Test for name change import error
262 sn: ['Bytes', 'NotNibbles', 'Bits'],
277 socket.dispatchAllPendingMessages();
279 assertNotUndefined(model.processes[1]);
280 assertTrue(model.hasImportWarnings);
281 assertEquals(model.importWarnings.length, 1);
283 // test for series number change
289 sn: ['Bytes', 'Bits'],
304 socket.dispatchAllPendingMessages();
305 assertEquals(model.importWarnings.length, 2);
307 // test for sn.length != sc.length
313 sn: ['Bytes', 'Nibbles', 'Bits'],
329 socket.dispatchAllPendingMessages();
330 assertEquals(model.importWarnings.length, 3);