blob: e8733d773e73a5b6a1c45b47b3313313961e2c89 [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/base/math/range.html">
<link rel="import" href="/tracing/base/unit.html">
<link rel="import" href="/tracing/value/diagnostics/diagnostic_map.html">
<link rel="import" href="/tracing/value/diagnostics/generic.html">
<link rel="import" href="/tracing/value/histogram.html">
<link rel="import" href="/tracing/value/histogram_set.html">
<script>
'use strict';
tr.b.unittest.testSuite(function() {
// TODO(benjhayden): Test groupHistogramsRecursively.
test('importDicts', function() {
let n = new tr.v.Histogram('foo', tr.b.Unit.byName.unitlessNumber);
let histograms = new tr.v.HistogramSet([n]);
let histograms2 = new tr.v.HistogramSet();
histograms2.importDicts(histograms.asDicts());
assert.isDefined(histograms2.getHistogramNamed('foo'));
});
test('importDictsWithSampleDiagnostic', function() {
let n = new tr.v.Histogram('foo', tr.b.Unit.byName.count);
n.addSample(10, {bar: new tr.v.d.Generic('baz')});
let histograms = new tr.v.HistogramSet([n]);
let histograms2 = new tr.v.HistogramSet();
histograms2.importDicts(histograms.asDicts());
assert.isDefined(histograms2.getHistogramNamed('foo'));
let v = histograms2.getHistogramNamed('foo');
assert.lengthOf(v.getBinForValue(10).diagnosticMaps, 1);
let dm = v.getBinForValue(10).diagnosticMaps[0];
assert.strictEqual(dm.size, 1);
assert.instanceOf(dm.get('bar'), tr.v.d.Generic);
assert.strictEqual(dm.get('bar').value, 'baz');
});
test('relatedHistogramSetDiagnostic', function() {
let unit = tr.b.Unit.byName.unitlessNumber;
let a = new tr.v.Histogram('a', unit);
let b = new tr.v.Histogram('b', unit);
let c = new tr.v.Histogram('c', unit);
a.diagnostics.set('rvs', new tr.v.d.RelatedHistogramSet([b, c]));
// Don't serialize c just yet.
let histograms = new tr.v.HistogramSet([a, b]);
let sourceHistograms = histograms.sourceHistograms;
assert.strictEqual(tr.b.getOnlyElement(sourceHistograms), a);
let histograms2 = new tr.v.HistogramSet();
histograms2.importDicts(histograms.asDicts());
histograms2.resolveRelatedHistograms();
let a2 = histograms2.getHistogramNamed('a');
assert.isDefined(a2);
assert.strictEqual(a2.guid, a.guid);
assert.instanceOf(a2, tr.v.Histogram);
assert.notStrictEqual(a2, a);
let b2 = histograms2.getHistogramNamed('b');
assert.isDefined(b2);
assert.strictEqual(b2.guid, b.guid);
assert.instanceOf(b2, tr.v.Histogram);
assert.notStrictEqual(b2, b);
let rvs2 = a2.diagnostics.get('rvs');
assert.instanceOf(rvs2, tr.v.d.RelatedHistogramSet);
assert.lengthOf(rvs2, 2);
// Assert that b and c are in a2's RelatedHistogramSet.
let rvs2vs = [...rvs2];
let rvs2guids = rvs2vs.map(v => v.guid);
let b2i = rvs2guids.indexOf(b.guid);
assert.strictEqual(rvs2vs[b2i], b2);
let c2i = rvs2guids.indexOf(c.guid);
assert.strictEqual(rvs2vs[c2i].guid, c.guid);
assert.instanceOf(rvs2vs[c2i], tr.v.d.HistogramRef);
// Now serialize c and add it to histograms2.
// Related Histogram resolution is idempotent.
// Old histograms can refer to new histograms.
histograms2.importDicts([c.asDict()]);
histograms2.resolveRelatedHistograms();
let c2 = histograms2.getHistogramNamed('c');
assert.isDefined(c2);
assert.strictEqual(c2.guid, c.guid);
assert.notStrictEqual(c2, c);
// Now a real c2 Histogram should be in a2's RelatedHistogramSet.
rvs2vs = [...rvs2];
rvs2guids = rvs2vs.map(v => v.guid);
b2i = rvs2guids.indexOf(b.guid);
c2i = rvs2guids.indexOf(c.guid);
assert.strictEqual(b2, rvs2vs[b2i]);
assert.strictEqual(c2, rvs2vs[c2i]);
});
test('relatedHistogramMapDiagnostic', function() {
let unit = tr.b.Unit.byName.unitlessNumber;
let a = new tr.v.Histogram('a', unit);
let b = new tr.v.Histogram('b', unit);
let c = new tr.v.Histogram('c', unit);
let rvm = new tr.v.d.RelatedHistogramMap();
rvm.set('y', b);
rvm.set('z', c);
a.diagnostics.set('rvm', rvm);
// Don't serialize c just yet.
let histograms = new tr.v.HistogramSet([a, b]);
let sourceHistograms = histograms.sourceHistograms;
assert.strictEqual(tr.b.getOnlyElement(sourceHistograms), a);
let histograms2 = new tr.v.HistogramSet();
histograms2.importDicts(histograms.asDicts());
histograms2.resolveRelatedHistograms();
let a2 = histograms2.getHistogramNamed('a');
assert.isDefined(a2);
assert.strictEqual(a2.guid, a.guid);
assert.instanceOf(a2, tr.v.Histogram);
assert.notStrictEqual(a2, a);
let b2 = histograms2.getHistogramNamed('b');
assert.isDefined(b2);
assert.strictEqual(b2.guid, b.guid);
assert.instanceOf(b2, tr.v.Histogram);
assert.notStrictEqual(b2, b);
let rvm2 = a2.diagnostics.get('rvm');
assert.instanceOf(rvm2, tr.v.d.RelatedHistogramMap);
assert.lengthOf(rvm2, 2);
// Assert that b and c are in a2's RelatedHistogramMap.
// |c| should still be a HistogramRef since it wasn't in histograms2.
assert.strictEqual(rvm2.get('y'), b2);
assert.instanceOf(rvm2.get('z'), tr.v.d.HistogramRef);
// Now serialize c and add it to histograms2.
// Related Histogram resolution is idempotent.
// Old histograms can refer to new histograms.
histograms2.importDicts([c.asDict()]);
histograms2.resolveRelatedHistograms();
let c2 = histograms2.getHistogramNamed('c');
assert.isDefined(c2);
assert.strictEqual(c2.guid, c.guid);
assert.instanceOf(c2, tr.v.Histogram);
assert.notStrictEqual(c2, c);
// b2 should still be in a2's RelatedHistogramMap.
assert.strictEqual(rvm2.get('y'), b2);
// Now a real c2 Histogram should be in a2's RelatedHistogramMap.
assert.strictEqual(rvm2.get('z'), c2);
});
test('sourceHistogramsWithSampleDiagnostic', function() {
let unit = tr.b.Unit.byName.unitlessNumber;
let aHist = new tr.v.Histogram('a', unit);
aHist.addSample(1);
let bHist = new tr.v.Histogram('b', tr.b.Unit.byName.unitlessNumber);
bHist.addSample(1, {rvs: new tr.v.d.RelatedHistogramSet([aHist])});
let histograms = new tr.v.HistogramSet([aHist, bHist]);
assert.strictEqual(tr.b.getOnlyElement(histograms.sourceHistograms), bHist);
});
test('sharedDiagnostic', function() {
// Make a single Histogram, add a shared Diagnostic.
let aHist = new tr.v.Histogram('aHist', tr.b.Unit.byName.count);
let histograms = new tr.v.HistogramSet([aHist]);
let diagnostic = new tr.v.d.Generic('shared');
histograms.addSharedDiagnostic('generic', diagnostic);
// Serializing a single Histogram with a single shared diagnostic should
// produce 2 dicts.
let dicts = histograms.asDicts();
assert.lengthOf(dicts, 2);
assert.deepEqual(diagnostic.asDict(), dicts[0]);
// The serialized Histogram should refer to the shared diagnostic by its
// guid.
assert.strictEqual(dicts[1].diagnostics.generic, diagnostic.guid);
// Deserialize the dicts.
let histograms2 = new tr.v.HistogramSet();
histograms2.importDicts(dicts);
assert.lengthOf(histograms2, 1);
let aHist2 = histograms2.getHistogramNamed(aHist.name);
// The diagnostic reference should be deserialized as a DiagnosticRef until
// resolveRelatedHistograms is called.
assert.instanceOf(aHist2.diagnostics.get('generic'), tr.v.d.DiagnosticRef);
histograms2.resolveRelatedHistograms();
assert.instanceOf(aHist2.diagnostics.get('generic'), tr.v.d.Generic);
assert.strictEqual(diagnostic.value,
aHist2.diagnostics.get('generic').value);
});
test('getHistogramNamed_noHistogramFound', function() {
let aHist = new tr.v.Histogram('aHist', tr.b.Unit.byName.count);
let histograms = new tr.v.HistogramSet([aHist]);
assert.isUndefined(histograms.getHistogramNamed('bHist'));
});
test('getHistogramNamed_oneHistogramFound', function() {
let aHist = new tr.v.Histogram('aHist', tr.b.Unit.byName.count);
let histograms = new tr.v.HistogramSet([aHist]);
assert.equal(histograms.getHistogramNamed('aHist'), aHist);
});
test('getHistogramNamed_multipleHistogramsFound', function() {
let aHist1 = new tr.v.Histogram('aHist', tr.b.Unit.byName.count);
let aHist2 = new tr.v.Histogram('aHist', tr.b.Unit.byName.count);
let histograms = new tr.v.HistogramSet([aHist1, aHist2]);
assert.throws(() => histograms.getHistogramNamed('aHist'),
Error, 'Unexpectedly found multiple histograms named "aHist"');
});
test('deduplicateDiagnostics', function() {
let telemetryA = new tr.v.d.TelemetryInfo({
label: 'iteration A',
benchmarkStartMs: 1,
});
let telemetryB = new tr.v.d.TelemetryInfo({
label: 'iteration B',
benchmarkStartMs: 2,
});
let buildbotA = new tr.v.d.BuildbotInfo({
buildbotName: 'bot A',
});
let buildbotB = new tr.v.d.BuildbotInfo({
buildbotName: 'bot B',
});
let deviceA = new tr.v.d.DeviceInfo({
osName: 'A',
});
let deviceB = new tr.v.d.DeviceInfo({
osName: 'B',
});
let aHist = new tr.v.Histogram('a', tr.b.Unit.byName.count);
let telemetry0 = new tr.v.d.MergedTelemetryInfo();
telemetry0.addDiagnostic(telemetryA);
telemetry0.addDiagnostic(telemetryB);
telemetry0.addToHistogram(aHist);
let buildbot0 = new tr.v.d.MergedBuildbotInfo();
buildbot0.addDiagnostic(buildbotA);
buildbot0.addDiagnostic(buildbotB);
buildbot0.addToHistogram(aHist);
let device0 = new tr.v.d.MergedDeviceInfo();
device0.addDiagnostic(deviceA);
device0.addDiagnostic(deviceB);
device0.addToHistogram(aHist);
let bHist = new tr.v.Histogram('b', tr.b.Unit.byName.count);
let telemetry1 = new tr.v.d.MergedTelemetryInfo();
telemetry1.addDiagnostic(telemetryA);
telemetry1.addDiagnostic(telemetryB);
telemetry1.addToHistogram(bHist);
let buildbot1 = new tr.v.d.MergedBuildbotInfo();
buildbot1.addDiagnostic(buildbotA);
buildbot1.addDiagnostic(buildbotB);
buildbot1.addToHistogram(bHist);
let device1 = new tr.v.d.MergedDeviceInfo();
device1.addDiagnostic(deviceA);
device1.addDiagnostic(deviceB);
device1.addToHistogram(bHist);
let histograms = new tr.v.HistogramSet([aHist, bHist]);
assert.notStrictEqual(
tr.v.d.TelemetryInfo.getFromHistogram(aHist),
tr.v.d.TelemetryInfo.getFromHistogram(bHist));
assert.isTrue(
tr.v.d.TelemetryInfo.getFromHistogram(aHist).equals(
tr.v.d.TelemetryInfo.getFromHistogram(bHist)));
assert.notStrictEqual(
tr.v.d.DeviceInfo.getFromHistogram(aHist),
tr.v.d.DeviceInfo.getFromHistogram(bHist));
assert.isTrue(
tr.v.d.DeviceInfo.getFromHistogram(aHist).equals(
tr.v.d.DeviceInfo.getFromHistogram(bHist)));
assert.notStrictEqual(
tr.v.d.BuildbotInfo.getFromHistogram(aHist),
tr.v.d.BuildbotInfo.getFromHistogram(bHist));
assert.isTrue(
tr.v.d.BuildbotInfo.getFromHistogram(aHist).equals(
tr.v.d.BuildbotInfo.getFromHistogram(bHist)));
histograms.deduplicateDiagnostics();
assert.strictEqual(
tr.v.d.TelemetryInfo.getFromHistogram(aHist),
tr.v.d.TelemetryInfo.getFromHistogram(bHist));
assert.strictEqual(
tr.v.d.DeviceInfo.getFromHistogram(aHist),
tr.v.d.DeviceInfo.getFromHistogram(bHist));
assert.strictEqual(
tr.v.d.BuildbotInfo.getFromHistogram(aHist),
tr.v.d.BuildbotInfo.getFromHistogram(bHist));
let histograms2 = new tr.v.HistogramSet();
histograms2.importDicts(histograms.asDicts());
histograms2.resolveRelatedHistograms();
let aHist2 = histograms2.getHistogramNamed('a');
let bHist2 = histograms2.getHistogramNamed('b');
assert.strictEqual(
tr.v.d.TelemetryInfo.getFromHistogram(aHist2),
tr.v.d.TelemetryInfo.getFromHistogram(bHist2));
assert.strictEqual(
tr.v.d.DeviceInfo.getFromHistogram(aHist2),
tr.v.d.DeviceInfo.getFromHistogram(bHist2));
assert.strictEqual(
tr.v.d.BuildbotInfo.getFromHistogram(aHist2),
tr.v.d.BuildbotInfo.getFromHistogram(bHist2));
});
});
</script>