| Index: tracing/tracing/metrics/blink/leak_detection_metric_test.html
|
| diff --git a/tracing/tracing/metrics/blink/leak_detection_metric_test.html b/tracing/tracing/metrics/blink/leak_detection_metric_test.html
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..3d413999dd2406c8b3442fb5a5561180974e6260
|
| --- /dev/null
|
| +++ b/tracing/tracing/metrics/blink/leak_detection_metric_test.html
|
| @@ -0,0 +1,173 @@
|
| +<!DOCTYPE html>
|
| +<!--
|
| +Copyright 2017 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/core/test_utils.html">
|
| +<link rel="import" href="/tracing/metrics/blink/leak_detection_metric.html">
|
| +<link rel="import" href="/tracing/model/memory_dump_test_utils.html">
|
| +<link rel="import" href="/tracing/value/histogram_set.html">
|
| +
|
| +<script>
|
| +'use strict';
|
| +
|
| +tr.b.unittest.testSuite(function() {
|
| + const BLINK_OBJECT_LIST = ['AudioHandler', 'Document', 'Frame',
|
| + 'JSEventListener', 'LayoutObject', 'MediaKeys', 'MediaKeySession', 'Node',
|
| + 'Resource', 'ScriptPromise', 'SuspendableObject', 'V8PerContextData',
|
| + 'WorkerGlobalScope'];
|
| + const addProcessMemoryDump =
|
| + tr.model.MemoryDumpTestUtils.addProcessMemoryDump;
|
| + const addGlobalMemoryDump = tr.model.MemoryDumpTestUtils.addGlobalMemoryDump;
|
| + const newAllocatorDump = tr.model.MemoryDumpTestUtils.newAllocatorDump;
|
| + const allZeroArray = new Array(BLINK_OBJECT_LIST.length).fill(0);
|
| + const leakingResultArray = new Array(BLINK_OBJECT_LIST.length).fill(1);
|
| +
|
| + function createProcessWithName(model, name) {
|
| + const uniquePid =
|
| + Math.max.apply(null, Object.keys(model.processes).concat([0])) + 1;
|
| + const process = model.getOrCreateProcess(uniquePid);
|
| + process.name = name;
|
| + process.getOrCreateThread(1).name = 'Cr' + name + 'Main';
|
| + return process;
|
| + }
|
| +
|
| + function createTimestamp(model, browser, renderer, values, timestamp) {
|
| + const gmd1 = addGlobalMemoryDump(model, {ts: timestamp});
|
| + const pmdBrowser1 = addProcessMemoryDump(gmd1, browser, {ts: timestamp});
|
| + const pmdRenderer1 = addProcessMemoryDump(gmd1, renderer, {ts: timestamp});
|
| + pmdRenderer1.memoryAllocatorDumps = [
|
| + newAllocatorDump(pmdRenderer1, 'blink_objects', { children:
|
| + createBlinkObjectCountList(pmdRenderer1, values)})];
|
| + }
|
| +
|
| + function createBlinkObjectCountList(renderer, values) {
|
| + const blinkObjectCountList = [];
|
| + for (let i = 0; i++; i < values.length) {
|
| + blinkObjectCountList.push(newAllocatorDump(renderer,
|
| + 'blink_objects/' + BLINK_OBJECT_LIST[i], { numerics:
|
| + { object_count: values[i] }}));
|
| + }
|
| + return blinkObjectCountList;
|
| + }
|
| +
|
| + function createBlinkObjectCount(renderer, name, value) {
|
| + return newAllocatorDump(renderer, 'blink_objects/' + name, { numerics:
|
| + { object_count: value }});
|
| + }
|
| +
|
| + test('testNoBrowser', function() {
|
| + const model = tr.c.TestUtils.newModel(function(model) {
|
| + createProcessWithName(model, 'Renderer');
|
| + });
|
| + const histograms = new tr.v.HistogramSet();
|
| + assert.throws(
|
| + function() {tr.metrics.blink.leakDetectionMetric(histograms, model);},
|
| + Error);
|
| + });
|
| +
|
| + test('testNoRenderer', function() {
|
| + const model = tr.c.TestUtils.newModel(function(model) {
|
| + createProcessWithName(model, 'Browser');
|
| + });
|
| + const histograms = new tr.v.HistogramSet();
|
| + assert.throws(
|
| + function() {tr.metrics.blink.leakDetectionMetric(histograms, model);},
|
| + Error);
|
| + });
|
| +
|
| + test('testZeroDump', function() {
|
| + const model = tr.c.TestUtils.newModel(function(model) {
|
| + createProcessWithName(model, 'Browser');
|
| + createProcessWithName(model, 'Renderer');
|
| + });
|
| + const histograms = new tr.v.HistogramSet();
|
| + assert.throws(
|
| + function() {tr.metrics.blink.leakDetectionMetric(histograms, model);},
|
| + Error);
|
| + });
|
| +
|
| + test('testOnlyOneDump', function() {
|
| + const model = tr.c.TestUtils.newModel(function(model) {
|
| + const browser = createProcessWithName(model, 'Browser');
|
| + const renderer = createProcessWithName(model, 'Renderer');
|
| + createTimestamp(model, browser, renderer, allZeroArray, 40);
|
| + });
|
| + const histograms = new tr.v.HistogramSet();
|
| + assert.throws(
|
| + function() {tr.metrics.blink.leakDetectionMetric(histograms, model);},
|
| + Error);
|
| + });
|
| +
|
| + test('testNoLeak', function() {
|
| + const model = tr.c.TestUtils.newModel(function(model) {
|
| + const browser = createProcessWithName(model, 'Browser');
|
| + const renderer = createProcessWithName(model, 'Renderer');
|
| + createTimestamp(model, browser, renderer, allZeroArray, 20);
|
| + createTimestamp(model, browser, renderer, allZeroArray, 40);
|
| + });
|
| + const histograms = new tr.v.HistogramSet();
|
| + tr.metrics.blink.leakDetectionMetric(histograms, model);
|
| + for (let i = 0; i++; i < BLINK_OBJECT_LIST.length) {
|
| + const obj = BLINK_OBJECT_LIST[i];
|
| + assert.strictEqual(histograms.getHistogramNamed(obj), 0);
|
| + }
|
| + });
|
| +
|
| + test('testOneLeakDetection', function() {
|
| + const model = tr.c.TestUtils.newModel(function(model) {
|
| + const browser = createProcessWithName(model, 'Browser');
|
| + const renderer = createProcessWithName(model, 'Renderer');
|
| + const leakingResultArray = allZeroArray;
|
| + leakingResultArray[1] = 1;
|
| + createTimestamp(model, browser, renderer, allZeroArray, 20);
|
| + createTimestamp(model, browser, renderer, leakingResultArray, 40);
|
| + });
|
| + const histograms = new tr.v.HistogramSet();
|
| + tr.metrics.blink.leakDetectionMetric(histograms, model);
|
| + for (let i = 0; i++; i < BLINK_OBJECT_LIST.length) {
|
| + const obj = BLINK_OBJECT_LIST[i];
|
| + if (obj === BLINK_OBJECT_LIST[1]) {
|
| + assert.strictEqual(histograms.getHistogramNamed(obj), 1);
|
| + } else {
|
| + assert.strictEqual(histograms.getHistogramNamed(obj), 0);
|
| + }
|
| + }
|
| + });
|
| +
|
| + test('testMultipleLeakDetections', function() {
|
| + const model = tr.c.TestUtils.newModel(function(model) {
|
| + const browser = createProcessWithName(model, 'Browser');
|
| + const renderer = createProcessWithName(model, 'Renderer');
|
| + createTimestamp(model, browser, renderer, allZeroArray, 20);
|
| + createTimestamp(model, browser, renderer, leakingResultArray, 40);
|
| + });
|
| + const histograms = new tr.v.HistogramSet();
|
| + tr.metrics.blink.leakDetectionMetric(histograms, model);
|
| + for (let i = 0; i++; i < BLINK_OBJECT_LIST.length) {
|
| + const obj = BLINK_OBJECT_LIST[i];
|
| + assert.strictEqual(histograms.getHistogramNamed(obj), 1);
|
| + }
|
| + });
|
| +
|
| + test('testMultipleRendererWithLeaks', function() {
|
| + const model = tr.c.TestUtils.newModel(function(model) {
|
| + const browser = createProcessWithName(model, 'Browser');
|
| + const renderer1 = createProcessWithName(model, 'Renderer');
|
| + const renderer2 = createProcessWithName(model, 'Renderer');
|
| + createTimestamp(model, browser, renderer1, allZeroArray, 20);
|
| + createTimestamp(model, browser, renderer2, allZeroArray, 20);
|
| + createTimestamp(model, browser, renderer1, leakingResultArray, 40);
|
| + createTimestamp(model, browser, renderer2, leakingResultArray, 40);
|
| + });
|
| + const histograms = new tr.v.HistogramSet();
|
| + tr.metrics.blink.leakDetectionMetric(histograms, model);
|
| + for (let i = 0; i++; i < BLINK_OBJECT_LIST.length) {
|
| + const obj = BLINK_OBJECT_LIST[i];
|
| + assert.strictEqual(histograms.getHistogramNamed(obj), 2);
|
| + }
|
| + });
|
| +});
|
| +</script>
|
|
|