// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
(async function(testRunner) {
const {page, session, dp} = await testRunner.startBlank(
`Tests basic virtual time functionality in workers.`);
const WorkerVirtualTimeHelper = await testRunner.loadScript(
'../helpers/worker-virtual-time-helper.js');
const workerVirtualTimeHelper =
new WorkerVirtualTimeHelper(testRunner, session);
const { wp } = await workerVirtualTimeHelper.loadWorker(`
(async function() {
console.log('Started worker: ' + Date.now());
await new Promise(resolve => setTimeout(resolve, 500));
console.log('After a 500ms timeout: ' + Date.now());
})();
`);
wp.Emulation.setVirtualTimePolicy({
policy: 'pauseIfNetworkFetchesPending',
budget: 5000});
wp.Runtime.enable();
wp.Runtime.onConsoleAPICalled(({params}) => {
testRunner.log(params.args[0].value);
});
wp.Runtime.runIfWaitingForDebugger();
// From now on, VT runs in both page and the worker and one will
// block another if VT expires, so make sure we drive the time in
// page to avoid worker being blocked on the page.
dp.Emulation.onVirtualTimeBudgetExpired(() => {
dp.Emulation.setVirtualTimePolicy({
policy: 'pauseIfNetworkFetchesPending',
budget: 5000});
});
await wp.Emulation.onceVirtualTimeBudgetExpired();
testRunner.log(`virtual time expired, granting more`);
wp.Runtime.evaluate({
expression: `
(async function() {
console.log('After first budget expired: ' + Date.now());
await new Promise(resolve => setTimeout(resolve, 500));
console.log('Another 500ms later: ' + Date.now());
})()`
});
dp.Emulation.setVirtualTimePolicy({
policy: 'pauseIfNetworkFetchesPending', budget: 5000});
wp.Emulation.setVirtualTimePolicy({
policy: 'pauseIfNetworkFetchesPending', budget: 5000});
await wp.Emulation.onceVirtualTimeBudgetExpired();
testRunner.completeTest();
})