// META: timeout=long // META: script=/resources/test-only-api.js // META: script=resources/pressure-helpers.js // META: global=window,dedicatedworker,sharedworker 'use strict'; pressure_test(async (t, mockPressureService) => { const sampleRateInHz = 10; const readings = ['nominal', 'fair', 'serious', 'critical']; // Normative values for rate obfuscation parameters. // https://w3c.github.io/compute-pressure/#rate-obfuscation-normative-parameters. const minPenaltyTimeInMs = 5000; const minChangesThreshold = 50; const changes = await new Promise(async resolve => { const observerChanges = []; const observer = new PressureObserver(changes => { observerChanges.push(changes); }, {sampleRate: sampleRateInHz}); observer.observe('cpu'); mockPressureService.startPlatformCollector(sampleRateInHz); let i = 0; // mockPressureService.updatesDelivered() does not necessarily match // pressureChanges.length, as system load and browser optimizations can // cause the actual timer used by mockPressureService to deliver readings // to be a bit slower or faster than requested. while (observerChanges.length < minChangesThreshold) { mockPressureService.setPressureUpdate( 'cpu', readings[i++ % readings.length]); // Allow tasks to run (avoid a micro-task loop). await new Promise((resolve) => t.step_timeout(resolve, 0)); await t.step_wait( () => mockPressureService.updatesDelivered() >= i, `At least ${i} readings have been delivered`); } observer.disconnect(); resolve(observerChanges); }); assert_equals(changes.length, minChangesThreshold); for (let i = 0; i < (changes.length - 1); i++) { // Because no penalty should be triggered, the timestamp difference // between samples should be less than the minimum penalty. assert_less_than( changes[i + 1][0].time - changes[i][0].time, minPenaltyTimeInMs, 'Not in sample time boundaries'); } }, 'No rate obfuscation mitigation should happen, when number of changes is below minimum changes before penalty');