blob: 77306f77fb8be561a9e40c60ec5736ed34036340 [file] [log] [blame]
<!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>