chrome-devtools-frontend
Version:
Chrome DevTools UI
83 lines (76 loc) • 4.05 kB
text/typescript
// Copyright 2023 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.
import {
makeCompleteEvent,
} from '../../../testing/TraceHelpers.js';
import * as Trace from '../trace.js';
const DEVTOOLS_CATEGORY = 'disabled-by-default-devtools.timeline';
function milliToMicro(x: number): Trace.Types.Timing.Micro {
return Trace.Helpers.Timing.milliToMicro(Trace.Types.Timing.Milli(x));
}
function makeFakeBounds(min: number, max: number): Trace.Types.Timing.TraceWindowMicro {
return {
min: Trace.Types.Timing.Micro(min),
max: Trace.Types.Timing.Micro(max),
range: Trace.Types.Timing.Micro(max - min),
};
}
describe('MainThreadActivity', function() {
it('will use the trace bounds if there is no period of low utilitisation', async () => {
const events = [
makeCompleteEvent('Program', milliToMicro(100), milliToMicro(50), DEVTOOLS_CATEGORY),
makeCompleteEvent('Program', milliToMicro(200), milliToMicro(50), DEVTOOLS_CATEGORY),
makeCompleteEvent('Program', milliToMicro(300), milliToMicro(50), DEVTOOLS_CATEGORY),
makeCompleteEvent('Program', milliToMicro(400), milliToMicro(50), DEVTOOLS_CATEGORY),
];
const bounds = makeFakeBounds(milliToMicro(100), milliToMicro(450));
const win = Trace.Extras.MainThreadActivity.calculateWindow(bounds, events);
assert.strictEqual(win.min, bounds.min);
assert.strictEqual(win.max, bounds.max);
});
it('focuses the window to avoid periods of low utilisation', async () => {
const events = [
makeCompleteEvent('Program', milliToMicro(1), milliToMicro(50), DEVTOOLS_CATEGORY),
makeCompleteEvent('Program', milliToMicro(200), milliToMicro(50), DEVTOOLS_CATEGORY),
makeCompleteEvent('Program', milliToMicro(210), milliToMicro(50), DEVTOOLS_CATEGORY),
makeCompleteEvent('Program', milliToMicro(240), milliToMicro(50), DEVTOOLS_CATEGORY),
makeCompleteEvent('Program', milliToMicro(230), milliToMicro(50), DEVTOOLS_CATEGORY),
makeCompleteEvent('Program', milliToMicro(1_000), milliToMicro(50), DEVTOOLS_CATEGORY),
];
const bounds = makeFakeBounds(milliToMicro(1), milliToMicro(1_050));
const win = Trace.Extras.MainThreadActivity.calculateWindow(bounds, events);
// This trace has:
// 1 event at 1
// 4 events between 200 and 230ms
// 1 event at 1000ms
// Therefore, the window focuses on the time period of 1 to 280ms (280 is
// the end time of the event that starts at 230ms).
// The right number looks odd because when we zoom the window we adjust it
// positively by 5% for the upper bound to give it some breathing room.
assert.strictEqual(win.min, milliToMicro(1));
assert.strictEqual(win.max, milliToMicro(293.95));
});
it('uses the entire trace window if the period of low utilisation makes up the majority of the trace', async () => {
const events = [
makeCompleteEvent('Program', milliToMicro(100), milliToMicro(50), DEVTOOLS_CATEGORY),
makeCompleteEvent('Program', milliToMicro(200_000), milliToMicro(50_000), DEVTOOLS_CATEGORY),
makeCompleteEvent('Program', milliToMicro(300_000), milliToMicro(50_000), DEVTOOLS_CATEGORY),
makeCompleteEvent('Program', milliToMicro(400_000), milliToMicro(50_000), DEVTOOLS_CATEGORY),
makeCompleteEvent('Program', milliToMicro(4_000_000), milliToMicro(50_000), DEVTOOLS_CATEGORY),
];
// These events are very spaced out!
// 1 at 100ms
// 1 at 200,000ms
// 1 at 300,000ms
// 1 at 400,000ms
// 1 at 4million ms!
// This means that the area the autozoom picks is less than 10% of the
// total time span, meaning that we fallback to just showing the entire
// trace window.
const bounds = makeFakeBounds(milliToMicro(100), milliToMicro(4_050_000));
const win = Trace.Extras.MainThreadActivity.calculateWindow(bounds, events);
// We expect the window to equal the entire trace bounds.
assert.deepEqual(win, bounds);
});
});