diff options
Diffstat (limited to 'dom/push/test/xpcshell/test_clearAll_successful.js')
-rw-r--r-- | dom/push/test/xpcshell/test_clearAll_successful.js | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/dom/push/test/xpcshell/test_clearAll_successful.js b/dom/push/test/xpcshell/test_clearAll_successful.js new file mode 100644 index 0000000000..a638fffaaf --- /dev/null +++ b/dom/push/test/xpcshell/test_clearAll_successful.js @@ -0,0 +1,130 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +var db; +var unregisterDefers = {}; +var userAgentID = "4ce480ef-55b2-4f83-924c-dcd35ab978b4"; + +function promiseUnregister(keyID, code) { + return new Promise(r => (unregisterDefers[keyID] = r)); +} + +function run_test() { + do_get_profile(); + setPrefs({ + userAgentID, + }); + run_next_test(); +} + +add_task(async function setup() { + db = PushServiceWebSocket.newPushDB(); + registerCleanupFunction(() => db.drop().then(() => db.close())); + + // Active subscriptions; should be expired then dropped. + await putTestRecord(db, "active-1", "https://example.info/some-page", 8); + await putTestRecord(db, "active-2", "https://example.com/another-page", 16); + + // Expired subscription; should be dropped. + await putTestRecord(db, "expired", "https://example.net/yet-another-page", 0); + + // A privileged subscription that should not be affected by sanitizing data + // because its quota is set to `Infinity`. + await putTestRecord(db, "privileged", "app://chrome/only", Infinity); + + let handshakeDone; + let handshakePromise = new Promise(r => (handshakeDone = r)); + PushService.init({ + serverURI: "wss://push.example.org/", + db, + makeWebSocket(uri) { + return new MockWebSocket(uri, { + onHello(request) { + this.serverSendMsg( + JSON.stringify({ + messageType: "hello", + uaid: userAgentID, + status: 200, + use_webpush: true, + }) + ); + handshakeDone(); + }, + onUnregister(request) { + let resolve = unregisterDefers[request.channelID]; + equal( + typeof resolve, + "function", + "Dropped unexpected channel ID " + request.channelID + ); + delete unregisterDefers[request.channelID]; + equal(request.code, 200, "Expected manual unregister reason"); + this.serverSendMsg( + JSON.stringify({ + messageType: "unregister", + channelID: request.channelID, + status: 200, + }) + ); + resolve(); + }, + }); + }, + }); + await handshakePromise; +}); + +add_task(async function test_sanitize() { + let modifiedScopes = []; + let changeScopes = []; + + let promiseCleared = Promise.all([ + // Active subscriptions should be unregistered. + promiseUnregister("active-1"), + promiseUnregister("active-2"), + promiseObserverNotification( + PushServiceComponent.subscriptionModifiedTopic, + (subject, data) => { + modifiedScopes.push(data); + return modifiedScopes.length == 3; + } + ), + + // Privileged should be recreated. + promiseUnregister("privileged"), + promiseObserverNotification( + PushServiceComponent.subscriptionChangeTopic, + (subject, data) => { + changeScopes.push(data); + return changeScopes.length == 1; + } + ), + ]); + + await PushService.clear({ + domain: "*", + }); + + await promiseCleared; + + deepEqual( + modifiedScopes.sort(compareAscending), + [ + "app://chrome/only", + "https://example.com/another-page", + "https://example.info/some-page", + ], + "Should modify active subscription scopes" + ); + + deepEqual( + changeScopes, + ["app://chrome/only"], + "Should fire change notification for privileged scope" + ); + + let remainingIDs = await getAllKeyIDs(db); + deepEqual(remainingIDs, [], "Should drop all subscriptions"); +}); |