blob: 07e0821549e20946d1f59b44305cf1335b6466d1 [file] [edit]
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/*
* This file is automatically loaded and run by Karma because it automatically
* loads and injects all *.js files it finds.
*/
import * as Common from '../core/common/common.js';
import * as Host from '../core/host/host.js';
import * as Trace from '../models/trace/trace.js';
import * as TraceSourceMapsResolver from '../models/trace_source_maps_resolver/trace_source_maps_resolver.js';
import * as ThemeSupport from '../ui/legacy/theme_support/theme_support.js';
import {cleanTestDOM, setupTestDOM} from './DOMHooks.js';
import {createFakeSetting, resetHostConfig} from './EnvironmentHelpers.js';
import {TraceLoader} from './TraceLoader.js';
import {
checkForPendingActivity,
startTrackingAsyncActivity,
stopTrackingAsyncActivity,
} from './TrackAsyncOperations.js';
const LOADING_TIMEOUT = 5_000;
declare global {
namespace Mocha {
interface Suite {
hasOnly?: () => boolean;
}
interface Test {
// Custom extension: attached in beforeEach to signal to Karma that exclusive tests (e.g. it.only) are being run.
hasExclusiveTests?: boolean;
}
}
}
async function setupTestFont() {
document.documentElement.classList.add('platform-screenshot-test');
await new Promise((resolve, reject) => {
const timer = window.setTimeout(
() => reject('Failing loading the fonts from the network'),
LOADING_TIMEOUT,
);
const link = document.createElement('link');
link.rel = 'stylesheet';
link.href = 'https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100..900;1,100..900&display=swap';
link.onload = ev => {
clearTimeout(timer);
resolve(ev);
};
document.head.appendChild(link);
});
const loadFontsPromise = Promise
.all([
document.fonts.load('400 16px "Roboto"'), // Normal
document.fonts.load('500 16px "Roboto"'), // Medium
document.fonts.load('700 16px "Roboto"'), // Bold
document.fonts.load('italic 400 16px "Roboto"'),
document.fonts.load('italic 500 16px "Roboto"'),
document.fonts.load('italic 700 16px "Roboto"'),
])
.then(async () => {
return await document.fonts.ready;
});
await Promise.race([
loadFontsPromise,
new Promise(
(_res, rej) => setTimeout(
() => rej('Failing loading the fonts from the network'),
LOADING_TIMEOUT,
)),
]);
}
before(async function() {
// All setup function should manage their own timeout
this.timeout(0);
await setupTestFont();
// There is no way to provide after each file run via a test set up file.
// What we do instead is add and after all in all global test suits
// This is as close as we can get to after each file.
this.test?.parent?.suites.forEach(function(suite) {
suite.afterAll(function() {
TraceLoader.resetCache();
});
});
});
beforeEach(async function(this: Mocha.Context) {
if (this.currentTest) {
this.currentTest.hasExclusiveTests = this.currentTest.parent?.hasOnly?.();
}
stopTrackingAsyncActivity();
resetHostConfig();
// Clear out any Sinon stubs or spies between individual tests.
sinon.restore();
await setupTestDOM();
// Ensure that no trace data leaks between tests when testing the trace engine.
for (const handler of Object.values(Trace.Handlers.ModelHandlers)) {
handler.reset();
}
Trace.Helpers.SyntheticEvents.SyntheticEventsManager.reset();
TraceSourceMapsResolver.SourceMapsResolver.clearResolvedNodeNames();
// Don't retain host binding listeners across tests. Set this up before initializing ThemeSupport as
// ThemeSupport adds a host binding listener.
Host.InspectorFrontendHost.InspectorFrontendHostInstance.events = new Common.ObjectWrapper.ObjectWrapper();
// Some unit tests exercise code that assumes a ThemeSupport instance is available.
// Run this in a beforeEach in case an individual test overrides it.
const setting = createFakeSetting('ui-theme', 'default');
ThemeSupport.ThemeSupport.instance({forceNew: true, setting});
startTrackingAsyncActivity();
});
afterEach(async function() {
cleanTestDOM(this.currentTest?.fullTitle());
await checkForPendingActivity(this.currentTest?.fullTitle());
stopTrackingAsyncActivity();
// Clear out any Sinon stubs or spies between individual tests.
sinon.clock?.runToLast();
sinon.restore();
});