tests: add computed/metrics/interactive-test.js to tsconfig (#13071)

This commit is contained in:
Connor Clark 2022-12-13 14:33:02 -08:00 коммит произвёл GitHub
Родитель 80709e6c7d
Коммит e154f3dcf6
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
3 изменённых файлов: 73 добавлений и 31 удалений

Просмотреть файл

@ -7,17 +7,31 @@
import assert from 'assert/strict';
import {Interactive} from '../../../computed/metrics/interactive.js';
import {getURLArtifactFromDevtoolsLog, readJson} from '../../test-utils.js';
const trace = readJson('../../fixtures/traces/progressive-app-m60.json', import.meta);
const devtoolsLog = readJson('../../fixtures/traces/progressive-app-m60.devtools.log.json', import.meta);
import {getURLArtifactFromDevtoolsLog, loadTraceFixture} from '../../test-utils.js';
const {trace, devtoolsLog} = loadTraceFixture('progressive-app-m60');
const URL = getURLArtifactFromDevtoolsLog(devtoolsLog);
function generateNetworkRecords(records, timeOrigin) {
/**
* Simple wrapper to just coerce return type to LanternMetric.
* @param {LH.Artifacts.MetricComputationDataInput} data
* @param {LH.Artifacts.ComputedContext} context
* @return {Promise<LH.Artifacts.LanternMetric>}
*/
async function getResult(data, context) {
const result = await Interactive.request(data, context);
return /** @type {LH.Artifacts.LanternMetric} */ (result);
}
/**
* @param {Array<Partial<LH.Artifacts.NetworkRequest> & {start: number, end: number}>} partialRecords
* @param {number} timeOrigin
* @return {LH.Artifacts.NetworkRequest[]}
*/
function generateNetworkRecords(partialRecords, timeOrigin) {
const timeOriginInMs = timeOrigin / 1000;
return records.map(item => {
return {
return partialRecords.map(item => {
const record = {
protocol: 'http',
failed: item.failed || false,
statusCode: item.statusCode || 200,
@ -26,16 +40,20 @@ function generateNetworkRecords(records, timeOrigin) {
startTime: (item.start + timeOriginInMs) / 1000,
endTime: item.end === -1 ? -1 : (item.end + timeOriginInMs) / 1000,
};
return /** @type {LH.Artifacts.NetworkRequest} */ (record);
});
}
describe('Metrics: TTI', () => {
/** @type {{gatherMode: LH.Result.GatherMode}} */
const gatherContext = {gatherMode: 'navigation'};
it('should compute a simulated value', async () => {
const settings = {throttlingMethod: 'simulate'};
const settings = /** @type {LH.Config.Settings} */ (
{throttlingMethod: 'simulate'}
);
const context = {settings, computedCache: new Map()};
const result = await Interactive.request({trace, devtoolsLog, gatherContext, settings, URL},
context);
const result = await getResult({trace, devtoolsLog, gatherContext, settings, URL}, context);
expect({
timing: Math.round(result.timing),
@ -49,9 +67,11 @@ describe('Metrics: TTI', () => {
});
it('should compute an observed value (desktop)', async () => {
const settings = {throttlingMethod: 'provided', formFactor: 'desktop'};
const settings = /** @type {LH.Config.Settings} */ (
{throttlingMethod: 'provided', formFactor: 'desktop'}
);
const context = {settings, computedCache: new Map()};
const result = await Interactive.request({trace, devtoolsLog, gatherContext, settings},
const result = await getResult({trace, devtoolsLog, gatherContext, settings, URL},
context);
assert.equal(Math.round(result.timing), 1582);
@ -59,9 +79,11 @@ describe('Metrics: TTI', () => {
});
it('should compute an observed value (mobile)', async () => {
const settings = {throttlingMethod: 'provided', formFactor: 'mobile'};
const settings = /** @type {LH.Config.Settings} */ (
{throttlingMethod: 'provided', formFactor: 'mobile'}
);
const context = {settings, computedCache: new Map()};
const result = await Interactive.request({trace, devtoolsLog, gatherContext, settings},
const result = await getResult({trace, devtoolsLog, gatherContext, settings, URL},
context);
assert.equal(Math.round(result.timing), 1582);
@ -73,12 +95,12 @@ describe('Metrics: TTI', () => {
const timeOrigin = 220023532;
const firstContentfulPaint = 2500 * 1000 + timeOrigin;
const traceEnd = 10000 * 1000 + timeOrigin;
const processedTrace = {timestamps: {timeOrigin, firstContentfulPaint, traceEnd}};
const cpu = [];
const processedTrace = /** @type {LH.Artifacts.ProcessedNavigation} */ (
{timestamps: {timeOrigin, firstContentfulPaint, traceEnd}}
);
const network = generateNetworkRecords([], timeOrigin);
const result = Interactive.findOverlappingQuietPeriods(cpu, network, processedTrace);
const result = Interactive.findOverlappingQuietPeriods([], network, processedTrace);
assert.deepEqual(result.cpuQuietPeriod, {start: 0, end: traceEnd / 1000});
assert.deepEqual(result.networkQuietPeriod, {start: 0, end: traceEnd / 1000});
});
@ -87,13 +109,13 @@ describe('Metrics: TTI', () => {
const timeOrigin = 220023532;
const firstContentfulPaint = 2500 * 1000 + timeOrigin;
const traceEnd = 5000 * 1000 + timeOrigin;
const processedTrace = {timestamps: {timeOrigin, firstContentfulPaint, traceEnd}};
const cpu = [];
const processedTrace = /** @type {LH.Artifacts.ProcessedNavigation} */ (
{timestamps: {timeOrigin, firstContentfulPaint, traceEnd}}
);
const network = generateNetworkRecords([], timeOrigin);
assert.throws(() => {
Interactive.findOverlappingQuietPeriods(cpu, network, processedTrace);
Interactive.findOverlappingQuietPeriods([], network, processedTrace);
}, /NO.*IDLE_PERIOD/);
});
@ -101,9 +123,10 @@ describe('Metrics: TTI', () => {
const timeOrigin = 220023532;
const firstContentfulPaint = 2500 * 1000 + timeOrigin;
const traceEnd = 10000 * 1000 + timeOrigin;
const processedTrace = {timestamps: {timeOrigin, firstContentfulPaint, traceEnd}};
const processedTrace = /** @type {LH.Artifacts.ProcessedNavigation} */ (
{timestamps: {timeOrigin, firstContentfulPaint, traceEnd}}
);
const cpu = [];
const network = generateNetworkRecords([
{start: 1400, end: 1900},
{start: 2000, end: 9000},
@ -112,7 +135,7 @@ describe('Metrics: TTI', () => {
], timeOrigin);
assert.throws(() => {
Interactive.findOverlappingQuietPeriods(cpu, network, processedTrace);
Interactive.findOverlappingQuietPeriods([], network, processedTrace);
}, /NO.*NETWORK_IDLE_PERIOD/);
});
@ -120,7 +143,9 @@ describe('Metrics: TTI', () => {
const timeOrigin = 220023532;
const firstContentfulPaint = 2500 * 1000 + timeOrigin;
const traceEnd = 10000 * 1000 + timeOrigin;
const processedTrace = {timestamps: {timeOrigin, firstContentfulPaint, traceEnd}};
const processedTrace = /** @type {LH.Artifacts.ProcessedNavigation} */ (
{timestamps: {timeOrigin, firstContentfulPaint, traceEnd}}
);
const cpu = [
{start: 3000, end: 8000},
@ -138,9 +163,10 @@ describe('Metrics: TTI', () => {
const timeOrigin = 220023532;
const firstContentfulPaint = 2500 * 1000 + timeOrigin;
const traceEnd = 10000 * 1000 + timeOrigin;
const processedTrace = {timestamps: {timeOrigin, firstContentfulPaint, traceEnd}};
const processedTrace = /** @type {LH.Artifacts.ProcessedNavigation} */ (
{timestamps: {timeOrigin, firstContentfulPaint, traceEnd}}
);
const cpu = [];
let network = generateNetworkRecords([
{start: 0, end: -1, finished: false},
{start: 0, end: 11000, failed: true},
@ -150,7 +176,7 @@ describe('Metrics: TTI', () => {
// Triple the requests to ensure it's not just the 2-quiet kicking in
network = network.concat(network).concat(network);
const result = Interactive.findOverlappingQuietPeriods(cpu, network, processedTrace);
const result = Interactive.findOverlappingQuietPeriods([], network, processedTrace);
assert.deepEqual(result.cpuQuietPeriod, {start: 0, end: traceEnd / 1000});
assert.deepEqual(result.networkQuietPeriod, {start: 0, end: traceEnd / 1000});
});
@ -159,7 +185,9 @@ describe('Metrics: TTI', () => {
const timeOrigin = 220023532;
const firstContentfulPaint = 10000 * 1000 + timeOrigin;
const traceEnd = 45000 * 1000 + timeOrigin;
const processedTrace = {timestamps: {timeOrigin, firstContentfulPaint, traceEnd}};
const processedTrace = /** @type {LH.Artifacts.ProcessedNavigation} */ (
{timestamps: {timeOrigin, firstContentfulPaint, traceEnd}}
);
const cpu = [
// quiet period before FMP

Просмотреть файл

@ -106,6 +106,18 @@ function loadSourceMapAndUsageFixture(name) {
};
}
/**
* @param {string} name
* @return {{devtoolsLog: LH.DevtoolsLog, trace: LH.Trace}}
*/
function loadTraceFixture(name) {
const dir = `${LH_ROOT}/core/test/fixtures/traces`;
return {
devtoolsLog: JSON.parse(fs.readFileSync(`${dir}/${name}.devtools.log.json`, 'utf-8')),
trace: JSON.parse(fs.readFileSync(`${dir}/${name}.json`, 'utf-8')),
};
}
/**
* @template {unknown[]} TParams
* @template TReturn
@ -337,6 +349,7 @@ export {
createDecomposedPromise,
flushAllTimersAndMicrotasks,
makeMocksForGatherRunner,
loadTraceFixture,
fnAny,
mockCommands,
createScript,

Просмотреть файл

@ -105,8 +105,9 @@
],
"files": [
// Opt-in to typechecking for some core tests and test-support files.
"core/test/audits/script-treemap-data-test.js",
"cli/test/fixtures/static-server.js",
"core/test/audits/script-treemap-data-test.js",
"core/test/computed/metrics/interactive-test.js",
"core/test/fixtures/config-plugins/lighthouse-plugin-simple/plugin-simple.js",
],
}