| <!DOCTYPE html> |
| <!-- |
| Copyright 2016 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="/tracing/model/clock_sync_manager.html"> |
| |
| <script> |
| 'use strict'; |
| |
| tr.b.unittest.testSuite(function() { |
| |
| var ClockDomainId = tr.model.ClockDomainId; |
| var ClockSyncManager = tr.model.ClockSyncManager; |
| |
| var testOptions = { |
| setUp: function() { |
| // Add a few testing clock domains to the list of permissible domains. |
| ClockDomainId.DOMAIN_1 = 'domain1'; |
| ClockDomainId.DOMAIN_2 = 'domain2'; |
| ClockDomainId.DOMAIN_3 = 'domain3'; |
| ClockDomainId.DOMAIN_4 = 'domain4'; |
| ClockDomainId.DOMAIN_5 = 'domain5'; |
| }, |
| |
| tearDown: function() { |
| delete ClockDomainId.DOMAIN_1; |
| delete ClockDomainId.DOMAIN_2; |
| delete ClockDomainId.DOMAIN_3; |
| delete ClockDomainId.DOMAIN_4; |
| delete ClockDomainId.DOMAIN_5; |
| } |
| }; |
| |
| test('addClockSyncMarker_throwsWithUnknownClockDomain', function() { |
| var mgr = new ClockSyncManager(); |
| |
| assert.throws(function() { |
| mgr.addClockSyncMarker('unknown', 'sync1', 100, 200); |
| }, '"unknown" is not in the list of known clock domain IDs.'); |
| }, testOptions); |
| |
| |
| test('addClockSyncMarker_throwsWhenSelfSyncing', function() { |
| var mgr = new ClockSyncManager(); |
| mgr.addClockSyncMarker(ClockDomainId.DOMAIN_1, 'sync1', 100, 200); |
| |
| assert.throws(function() { |
| mgr.addClockSyncMarker(ClockDomainId.DOMAIN_1, 'sync1', 200, 300); |
| }, 'A clock domain cannot sync with itself.'); |
| }, testOptions); |
| |
| test('addClockSyncMarker_throwsWhenAddingThirdSyncMarkerToSync', function() { |
| var mgr = new ClockSyncManager(); |
| mgr.addClockSyncMarker(ClockDomainId.DOMAIN_1, 'sync1', 100); |
| mgr.addClockSyncMarker(ClockDomainId.DOMAIN_2, 'sync1', 100); |
| |
| assert.throws(function() { |
| mgr.addClockSyncMarker(ClockDomainId.DOMAIN_3, 'sync1', 100); |
| }, 'Clock sync with ID "sync1" is already complete - cannot add a third ' + |
| 'clock sync marker to it.'); |
| }, testOptions); |
| |
| test('addClockSyncMarker_throwsWhenAddingDuplicateConnectors', function() { |
| var mgr = new ClockSyncManager(); |
| mgr.addClockSyncMarker(ClockDomainId.DOMAIN_1, 'sync1', 100); |
| mgr.addClockSyncMarker(ClockDomainId.DOMAIN_2, 'sync1', 100); |
| |
| mgr.addClockSyncMarker(ClockDomainId.DOMAIN_1, 'sync2', 100); |
| |
| assert.throws(function() { |
| mgr.addClockSyncMarker(ClockDomainId.DOMAIN_2, 'sync2', 100); |
| }, 'Cannot add multiple connectors between the same clock domains.'); |
| }, testOptions); |
| |
| test('addClockSyncMarker_throwsAfterGetModelTimeTransformer', function() { |
| var mgr = new ClockSyncManager(); |
| mgr.addClockSyncMarker(ClockDomainId.DOMAIN_1, 'sync1', 100); |
| mgr.addClockSyncMarker(ClockDomainId.DOMAIN_2, 'sync1', 100); |
| |
| mgr.getModelTimeTransformer(ClockDomainId.DOMAIN_1); |
| |
| assert.throws(function() { |
| mgr.addClockSyncMarker(ClockDomainId.DOMAIN_2, 'sync2', 100); |
| }, 'Cannot add new clock sync markers after getting a model time ' + |
| 'transformer.'); |
| }, testOptions); |
| |
| test('getModelTimeTransformer_oneIncompleteSync', function() { |
| var mgr = new ClockSyncManager(); |
| mgr.addClockSyncMarker(ClockDomainId.DOMAIN_1, 'sync1', 100); |
| |
| assert.strictEqual( |
| mgr.getModelTimeTransformer(ClockDomainId.DOMAIN_1)(100), 100); |
| }, testOptions); |
| |
| test('getModelTimeTransformer_oneCompleteSync', function() { |
| var mgr = new ClockSyncManager(); |
| mgr.addClockSyncMarker(ClockDomainId.DOMAIN_1, 'sync1', 100); |
| mgr.addClockSyncMarker(ClockDomainId.DOMAIN_2, 'sync1', 350); |
| |
| assert.strictEqual( |
| mgr.getModelTimeTransformer(ClockDomainId.DOMAIN_2)(350), 100); |
| assert.strictEqual( |
| mgr.getModelTimeTransformer(ClockDomainId.DOMAIN_1)(100), 100); |
| }, testOptions); |
| |
| test('getModelTimeTransformer_twoCompleteSyncs', function() { |
| var mgr = new ClockSyncManager(); |
| mgr.addClockSyncMarker(ClockDomainId.DOMAIN_1, 'sync1', 100); |
| mgr.addClockSyncMarker(ClockDomainId.DOMAIN_2, 'sync1', 350); |
| |
| mgr.addClockSyncMarker(ClockDomainId.DOMAIN_1, 'sync2', 200); |
| mgr.addClockSyncMarker(ClockDomainId.DOMAIN_3, 'sync2', 250); |
| |
| assert.strictEqual( |
| mgr.getModelTimeTransformer(ClockDomainId.DOMAIN_2)(350), 100); |
| assert.strictEqual( |
| mgr.getModelTimeTransformer(ClockDomainId.DOMAIN_1)(100), 100); |
| assert.strictEqual( |
| mgr.getModelTimeTransformer(ClockDomainId.DOMAIN_3)(250), 200); |
| }, testOptions); |
| |
| test('getModelTimeTransformer_twoSyncMarkersWithEndTs', function() { |
| var mgr = new ClockSyncManager(); |
| mgr.addClockSyncMarker(ClockDomainId.DOMAIN_1, 'sync1', 100, 200); |
| mgr.addClockSyncMarker(ClockDomainId.DOMAIN_2, 'sync1', 350); |
| |
| assert.strictEqual( |
| mgr.getModelTimeTransformer(ClockDomainId.DOMAIN_2)(350), 150); |
| assert.strictEqual( |
| mgr.getModelTimeTransformer(ClockDomainId.DOMAIN_1)(150), 150); |
| }, testOptions); |
| |
| test('getModelTimeTransformer_battorSyncUsesChromeStartTs_battorMaster', |
| function() { |
| var mgr = new ClockSyncManager(); |
| mgr.addClockSyncMarker(ClockDomainId.CHROME, 'sync1', 100, 200); |
| mgr.addClockSyncMarker(ClockDomainId.BATTOR, 'sync1', 350); |
| |
| assert.strictEqual( |
| mgr.getModelTimeTransformer(ClockDomainId.CHROME)(100), |
| 350); |
| }, testOptions); |
| |
| test('getModelTimeTransformer_battorSyncUsesChromeStartTs_chromeMaster', |
| function() { |
| var mgr = new ClockSyncManager(); |
| mgr.addClockSyncMarker(ClockDomainId.CHROME, 'sync1', 100, 200); |
| mgr.addClockSyncMarker(ClockDomainId.BATTOR, 'sync1', 350); |
| |
| // We have to add another clock domain attached to chrome to guarantee |
| // that the manager chooses chrome as the master clock domain and not |
| // battor, which it would usually select because battor comes first |
| // alphabetically and they'd both be connected to one other domain. |
| mgr.addClockSyncMarker(ClockDomainId.CHROME, 'sync2', 0, 50); |
| mgr.addClockSyncMarker(ClockDomainId.DOMAIN_1, 'sync2', 0); |
| |
| assert.strictEqual( |
| mgr.getModelTimeTransformer(ClockDomainId.BATTOR)(350), |
| 100); |
| }, testOptions); |
| |
| test('getModelTimeTransformer_throwsWithNoAgentMarker', function() { |
| var mgr = new ClockSyncManager(); |
| mgr.addClockSyncMarker(ClockDomainId.DOMAIN_1, 'sync1', 100); |
| |
| assert.throws(function() { |
| mgr.getModelTimeTransformer(ClockDomainId.DOMAIN_2); |
| }, 'No clock sync markers exist pairing clock domain "domain2" with model' + |
| ' clock domain "domain1".'); |
| }, testOptions); |
| |
| test('getModelTimeTransformer_throwsWithTwoDistinctGraphs', function() { |
| var mgr = new ClockSyncManager(); |
| mgr.addClockSyncMarker(ClockDomainId.DOMAIN_1, 'sync1', 100); |
| mgr.addClockSyncMarker(ClockDomainId.DOMAIN_2, 'sync1', 100); |
| |
| mgr.addClockSyncMarker(ClockDomainId.DOMAIN_1, 'sync2', 100); |
| mgr.addClockSyncMarker(ClockDomainId.DOMAIN_3, 'sync2', 100); |
| |
| mgr.addClockSyncMarker(ClockDomainId.DOMAIN_4, 'sync3', 100); |
| mgr.addClockSyncMarker(ClockDomainId.DOMAIN_5, 'sync3', 100); |
| |
| assert.throws(function() { |
| mgr.getModelTimeTransformer(ClockDomainId.DOMAIN_5); |
| }, 'Unable to select a master clock domain because no clock domain is ' + |
| 'directly connected to all others.'); |
| }, testOptions); |
| |
| test('getModelTimeTransformer_throwsWithIndirectlyConnectedGraph', |
| function() { |
| var mgr = new ClockSyncManager(); |
| mgr.addClockSyncMarker(ClockDomainId.DOMAIN_1, 'sync1', 100); |
| mgr.addClockSyncMarker(ClockDomainId.DOMAIN_2, 'sync1', 100); |
| |
| mgr.addClockSyncMarker(ClockDomainId.DOMAIN_2, 'sync2', 100); |
| mgr.addClockSyncMarker(ClockDomainId.DOMAIN_3, 'sync2', 100); |
| |
| mgr.addClockSyncMarker(ClockDomainId.DOMAIN_3, 'sync3', 100); |
| mgr.addClockSyncMarker(ClockDomainId.DOMAIN_4, 'sync3', 100); |
| |
| assert.throws(function() { |
| mgr.getModelTimeTransformer(ClockDomainId.DOMAIN_1); |
| }, 'Unable to select a master clock domain because no clock domain is ' + |
| 'directly connected to all others.'); |
| }, testOptions); |
| |
| test('getModelTimeTransformer_throwsWithNoClockSyncMarkers', function() { |
| var mgr = new ClockSyncManager(); |
| |
| assert.throws(function() { |
| mgr.getModelTimeTransformer(ClockDomainId.DOMAIN_1); |
| }, 'Unable to select a master clock domain because no clock domain is ' + |
| 'directly connected to all others.'); |
| }, testOptions); |
| }); |
| </script> |