| // 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. |
| |
| import type * as Protocol from '../../generated/protocol.js'; |
| |
| import * as SDK from './sdk.js'; |
| |
| describe('ServiceWorkerVersion', () => { |
| const REGISTRATION_PAYLOAD = {registrationId: 'foo', scopeURL: 'https://example.com', isDeleted: false} as |
| Protocol.ServiceWorker.ServiceWorkerRegistration; |
| |
| const VERSION_PAYLOAD = { |
| versionId: '12345', |
| scriptURL: 'http://example.com/script.js', |
| runningStatus: 'stopped', |
| status: 'new', |
| scriptLastModified: 1234567890, |
| scriptResponseTime: 12345, |
| controlledClients: ['client1', 'client2'], |
| targetId: 'target1', |
| routerRules: '[{"condition":{"requestMethod":"POST"},"source":["fetch","network"],"id":1}]', |
| } as Protocol.ServiceWorker.ServiceWorkerVersion; |
| |
| function makeVersion( |
| registrationPayload: Protocol.ServiceWorker.ServiceWorkerRegistration, |
| versionPayload: Protocol.ServiceWorker.ServiceWorkerVersion): SDK.ServiceWorkerManager.ServiceWorkerVersion { |
| return new SDK.ServiceWorkerManager.ServiceWorkerVersion( |
| new SDK.ServiceWorkerManager.ServiceWorkerRegistration(registrationPayload), versionPayload); |
| } |
| |
| it('initializes with a given payload', () => { |
| const version = makeVersion(REGISTRATION_PAYLOAD, VERSION_PAYLOAD); |
| |
| const expectedRouterRules = |
| [{condition: '{"requestMethod":"POST"}', source: '["fetch","network"]', id: 1} as |
| SDK.ServiceWorkerManager.ServiceWorkerRouterRule]; |
| |
| assert.strictEqual(version.id, VERSION_PAYLOAD.versionId); |
| assert.strictEqual(version.scriptURL, VERSION_PAYLOAD.scriptURL); |
| assert.strictEqual(version.runningStatus, VERSION_PAYLOAD.runningStatus); |
| assert.strictEqual(version.status, VERSION_PAYLOAD.status); |
| assert.strictEqual(version.scriptLastModified, VERSION_PAYLOAD.scriptLastModified); |
| assert.strictEqual(version.scriptResponseTime, VERSION_PAYLOAD.scriptResponseTime); |
| assert.deepEqual(version.controlledClients, VERSION_PAYLOAD.controlledClients); |
| assert.strictEqual(version.targetId, VERSION_PAYLOAD.targetId); |
| assert.deepEqual(version.routerRules, expectedRouterRules); |
| }); |
| |
| it('should update the version with the given payload', () => { |
| const version = makeVersion(REGISTRATION_PAYLOAD, VERSION_PAYLOAD); |
| |
| version.update({ |
| versionId: '67890', |
| scriptURL: 'http://example.com/script2.js', |
| runningStatus: 'starting', |
| status: 'installing', |
| scriptLastModified: 1234567891, |
| scriptResponseTime: 12346, |
| controlledClients: ['client3', 'client4'], |
| targetId: 'target2', |
| } as Protocol.ServiceWorker.ServiceWorkerVersion); |
| |
| assert.strictEqual(version.id, '67890'); |
| assert.strictEqual(version.scriptURL, 'http://example.com/script2.js'); |
| assert.strictEqual(version.runningStatus, 'starting'); |
| assert.strictEqual(version.status, 'installing'); |
| assert.strictEqual(version.scriptLastModified, 1234567891); |
| assert.strictEqual(version.scriptResponseTime, 12346); |
| assert.deepEqual(version.controlledClients, ['client3', 'client4']); |
| assert.strictEqual(version.targetId, 'target2'); |
| }); |
| |
| it('identifies when the worker is startable', () => { |
| const version = makeVersion( |
| REGISTRATION_PAYLOAD, |
| {...VERSION_PAYLOAD, runningStatus: 'stopped', status: 'activated'} as |
| Protocol.ServiceWorker.ServiceWorkerVersion); |
| |
| assert.isTrue(version.isStartable()); |
| }); |
| |
| it('identifies when the worker is not startable', () => { |
| let version = makeVersion( |
| {...REGISTRATION_PAYLOAD, isDeleted: true}, |
| {...VERSION_PAYLOAD, runningStatus: 'stopped', status: 'activated'} as |
| Protocol.ServiceWorker.ServiceWorkerVersion); |
| assert.isFalse(version.isStartable()); |
| |
| version = makeVersion( |
| REGISTRATION_PAYLOAD, |
| {...VERSION_PAYLOAD, runningStatus: 'stopped', status: 'new'} as Protocol.ServiceWorker.ServiceWorkerVersion); |
| assert.isFalse(version.isStartable()); |
| |
| version = makeVersion( |
| REGISTRATION_PAYLOAD, |
| {...VERSION_PAYLOAD, runningStatus: 'starting', status: 'activated'} as |
| Protocol.ServiceWorker.ServiceWorkerVersion); |
| assert.isFalse(version.isStartable()); |
| }); |
| |
| it('identifies when the worker is stopped and redundant', () => { |
| const version = makeVersion( |
| REGISTRATION_PAYLOAD, |
| {...VERSION_PAYLOAD, runningStatus: 'stopped', status: 'redundant'} as |
| Protocol.ServiceWorker.ServiceWorkerVersion); |
| |
| assert.isTrue(version.isStoppedAndRedundant()); |
| }); |
| |
| it('identifies when the worker is not stopped and redundant', () => { |
| let version = makeVersion( |
| REGISTRATION_PAYLOAD, |
| {...VERSION_PAYLOAD, runningStatus: 'stopped', status: 'activated'} as |
| Protocol.ServiceWorker.ServiceWorkerVersion); |
| assert.isFalse(version.isStoppedAndRedundant()); |
| |
| version = makeVersion( |
| REGISTRATION_PAYLOAD, |
| {...VERSION_PAYLOAD, runningStatus: 'starting', status: 'redundant'} as |
| Protocol.ServiceWorker.ServiceWorkerVersion); |
| assert.isFalse(version.isStoppedAndRedundant()); |
| }); |
| |
| it('identifies when the worker is stopped', () => { |
| let version = makeVersion( |
| REGISTRATION_PAYLOAD, |
| {...VERSION_PAYLOAD, runningStatus: 'stopped'} as Protocol.ServiceWorker.ServiceWorkerVersion); |
| assert.isTrue(version.isStopped()); |
| |
| version = makeVersion( |
| REGISTRATION_PAYLOAD, |
| {...VERSION_PAYLOAD, runningStatus: 'starting'} as Protocol.ServiceWorker.ServiceWorkerVersion); |
| assert.isFalse(version.isStopped()); |
| }); |
| |
| it('identifies when the worker is starting', () => { |
| let version = makeVersion( |
| REGISTRATION_PAYLOAD, |
| {...VERSION_PAYLOAD, runningStatus: 'starting'} as Protocol.ServiceWorker.ServiceWorkerVersion); |
| assert.isTrue(version.isStarting()); |
| |
| version = makeVersion( |
| REGISTRATION_PAYLOAD, |
| {...VERSION_PAYLOAD, runningStatus: 'stopped'} as Protocol.ServiceWorker.ServiceWorkerVersion); |
| assert.isFalse(version.isStarting()); |
| }); |
| |
| it('identifies when the worker is running', () => { |
| let version = makeVersion( |
| REGISTRATION_PAYLOAD, |
| {...VERSION_PAYLOAD, runningStatus: 'running'} as Protocol.ServiceWorker.ServiceWorkerVersion); |
| assert.isTrue(version.isRunning()); |
| |
| version = makeVersion( |
| REGISTRATION_PAYLOAD, |
| {...VERSION_PAYLOAD, runningStatus: 'stopped'} as Protocol.ServiceWorker.ServiceWorkerVersion); |
| assert.isFalse(version.isRunning()); |
| }); |
| |
| it('identifies when the worker is stopping', () => { |
| let version = makeVersion( |
| REGISTRATION_PAYLOAD, |
| {...VERSION_PAYLOAD, runningStatus: 'stopping'} as Protocol.ServiceWorker.ServiceWorkerVersion); |
| assert.isTrue(version.isStopping()); |
| |
| version = makeVersion( |
| REGISTRATION_PAYLOAD, |
| {...VERSION_PAYLOAD, runningStatus: 'stopped'} as Protocol.ServiceWorker.ServiceWorkerVersion); |
| assert.isFalse(version.isStopping()); |
| }); |
| |
| it('identifies when the worker is new', () => { |
| let version = makeVersion( |
| REGISTRATION_PAYLOAD, {...VERSION_PAYLOAD, status: 'new'} as Protocol.ServiceWorker.ServiceWorkerVersion); |
| assert.isTrue(version.isNew()); |
| |
| version = makeVersion( |
| REGISTRATION_PAYLOAD, {...VERSION_PAYLOAD, status: 'activated'} as Protocol.ServiceWorker.ServiceWorkerVersion); |
| assert.isFalse(version.isNew()); |
| }); |
| |
| it('identifies when the worker is installing', () => { |
| let version = makeVersion( |
| REGISTRATION_PAYLOAD, |
| {...VERSION_PAYLOAD, status: 'installing'} as Protocol.ServiceWorker.ServiceWorkerVersion); |
| assert.isTrue(version.isInstalling()); |
| |
| version = makeVersion( |
| REGISTRATION_PAYLOAD, {...VERSION_PAYLOAD, status: 'activated'} as Protocol.ServiceWorker.ServiceWorkerVersion); |
| assert.isFalse(version.isInstalling()); |
| }); |
| |
| it('identifies when the worker is installed', () => { |
| let version = makeVersion( |
| REGISTRATION_PAYLOAD, {...VERSION_PAYLOAD, status: 'installed'} as Protocol.ServiceWorker.ServiceWorkerVersion); |
| assert.isTrue(version.isInstalled()); |
| |
| version = makeVersion( |
| REGISTRATION_PAYLOAD, {...VERSION_PAYLOAD, status: 'activated'} as Protocol.ServiceWorker.ServiceWorkerVersion); |
| assert.isFalse(version.isInstalled()); |
| }); |
| |
| it('identifies when the worker is activating', () => { |
| let version = makeVersion( |
| REGISTRATION_PAYLOAD, |
| {...VERSION_PAYLOAD, status: 'activating'} as Protocol.ServiceWorker.ServiceWorkerVersion); |
| assert.isTrue(version.isActivating()); |
| |
| version = makeVersion( |
| REGISTRATION_PAYLOAD, {...VERSION_PAYLOAD, status: 'activated'} as Protocol.ServiceWorker.ServiceWorkerVersion); |
| assert.isFalse(version.isActivating()); |
| }); |
| |
| it('identifies when the worker is activated', () => { |
| let version = makeVersion( |
| REGISTRATION_PAYLOAD, {...VERSION_PAYLOAD, status: 'activated'} as Protocol.ServiceWorker.ServiceWorkerVersion); |
| assert.isTrue(version.isActivated()); |
| |
| version = makeVersion( |
| REGISTRATION_PAYLOAD, |
| {...VERSION_PAYLOAD, status: 'activating'} as Protocol.ServiceWorker.ServiceWorkerVersion); |
| assert.isFalse(version.isActivated()); |
| }); |
| |
| it('identifies when the worker is redundant', () => { |
| let version = makeVersion( |
| REGISTRATION_PAYLOAD, {...VERSION_PAYLOAD, status: 'redundant'} as Protocol.ServiceWorker.ServiceWorkerVersion); |
| assert.isTrue(version.isRedundant()); |
| |
| version = makeVersion( |
| REGISTRATION_PAYLOAD, |
| {...VERSION_PAYLOAD, status: 'activating'} as Protocol.ServiceWorker.ServiceWorkerVersion); |
| assert.isFalse(version.isRedundant()); |
| }); |
| |
| it('identifies when the worker is in installing mode', () => { |
| let version = makeVersion( |
| REGISTRATION_PAYLOAD, {...VERSION_PAYLOAD, status: 'new'} as Protocol.ServiceWorker.ServiceWorkerVersion); |
| assert.strictEqual(version.mode(), SDK.ServiceWorkerManager.ServiceWorkerVersion.Modes.INSTALLING); |
| |
| version = makeVersion( |
| REGISTRATION_PAYLOAD, |
| {...VERSION_PAYLOAD, status: 'installing'} as Protocol.ServiceWorker.ServiceWorkerVersion); |
| assert.strictEqual(version.mode(), SDK.ServiceWorkerManager.ServiceWorkerVersion.Modes.INSTALLING); |
| }); |
| |
| it('identifies when the worker is in waiting mode', () => { |
| const version = makeVersion( |
| REGISTRATION_PAYLOAD, {...VERSION_PAYLOAD, status: 'installed'} as Protocol.ServiceWorker.ServiceWorkerVersion); |
| assert.strictEqual(version.mode(), SDK.ServiceWorkerManager.ServiceWorkerVersion.Modes.WAITING); |
| }); |
| |
| it('identifies when the worker is in active mode', () => { |
| let version = makeVersion( |
| REGISTRATION_PAYLOAD, |
| {...VERSION_PAYLOAD, status: 'activating'} as Protocol.ServiceWorker.ServiceWorkerVersion); |
| assert.strictEqual(version.mode(), SDK.ServiceWorkerManager.ServiceWorkerVersion.Modes.ACTIVE); |
| |
| version = makeVersion( |
| REGISTRATION_PAYLOAD, {...VERSION_PAYLOAD, status: 'activated'} as Protocol.ServiceWorker.ServiceWorkerVersion); |
| assert.strictEqual(version.mode(), SDK.ServiceWorkerManager.ServiceWorkerVersion.Modes.ACTIVE); |
| }); |
| |
| it('identifies when the worker is in redundant mode', () => { |
| const version = makeVersion( |
| REGISTRATION_PAYLOAD, {...VERSION_PAYLOAD, status: 'redundant'} as Protocol.ServiceWorker.ServiceWorkerVersion); |
| assert.strictEqual(version.mode(), SDK.ServiceWorkerManager.ServiceWorkerVersion.Modes.REDUNDANT); |
| }); |
| |
| it('routerRules should be null if not provided', () => { |
| const VERSION_PAYLOAD_WITHOUT_ROUTER_RULES = { |
| versionId: '12345', |
| scriptURL: 'http://example.com/script.js', |
| runningStatus: 'stopped', |
| status: 'new', |
| scriptLastModified: 1234567890, |
| scriptResponseTime: 12345, |
| controlledClients: ['client1', 'client2'], |
| targetId: 'target1', |
| } as Protocol.ServiceWorker.ServiceWorkerVersion; |
| |
| const version = makeVersion(REGISTRATION_PAYLOAD, VERSION_PAYLOAD_WITHOUT_ROUTER_RULES); |
| |
| assert.isNull(version.routerRules); |
| }); |
| }); |