test_register_rollback.js (2920B)
1 /* Any copyright is dedicated to the Public Domain. 2 http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 "use strict"; 5 6 const userAgentID = "b2546987-4f63-49b1-99f7-739cd3c40e44"; 7 const channelID = "35a820f7-d7dd-43b3-af21-d65352212ae3"; 8 9 function run_test() { 10 do_get_profile(); 11 setPrefs({ 12 userAgentID, 13 requestTimeout: 1000, 14 retryBaseInterval: 150, 15 }); 16 run_next_test(); 17 } 18 19 add_task(async function test_register_rollback() { 20 let db = PushServiceWebSocket.newPushDB(); 21 registerCleanupFunction(() => { 22 return db.drop().then(_ => db.close()); 23 }); 24 25 let handshakes = 0; 26 let registers = 0; 27 let unregisterDone; 28 let unregisterPromise = new Promise(resolve => (unregisterDone = resolve)); 29 PushServiceWebSocket._generateID = () => channelID; 30 PushService.init({ 31 serverURI: "wss://push.example.org/", 32 db: makeStub(db, { 33 put() { 34 return Promise.reject("universe has imploded"); 35 }, 36 }), 37 makeWebSocket(uri) { 38 return new MockWebSocket(uri, { 39 onHello(request) { 40 handshakes++; 41 if (registers > 0) { 42 equal(request.uaid, userAgentID, "Handshake: wrong device ID"); 43 } else { 44 ok( 45 !request.uaid, 46 "Should not send UAID in handshake without local subscriptions" 47 ); 48 } 49 this.serverSendMsg( 50 JSON.stringify({ 51 messageType: "hello", 52 status: 200, 53 uaid: userAgentID, 54 }) 55 ); 56 }, 57 onRegister(request) { 58 equal(request.channelID, channelID, "Register: wrong channel ID"); 59 registers++; 60 this.serverSendMsg( 61 JSON.stringify({ 62 messageType: "register", 63 status: 200, 64 uaid: userAgentID, 65 channelID, 66 pushEndpoint: "https://example.com/update/rollback", 67 }) 68 ); 69 }, 70 onUnregister(request) { 71 equal(request.channelID, channelID, "Unregister: wrong channel ID"); 72 equal(request.code, 200, "Expected manual unregister reason"); 73 this.serverSendMsg( 74 JSON.stringify({ 75 messageType: "unregister", 76 status: 200, 77 channelID, 78 }) 79 ); 80 unregisterDone(); 81 }, 82 }); 83 }, 84 }); 85 86 // Should return a rejected promise if storage fails. 87 await Assert.rejects( 88 PushService.register({ 89 scope: "https://example.com/storage-error", 90 originAttributes: ChromeUtils.originAttributesToSuffix({ 91 inIsolatedMozBrowser: false, 92 }), 93 }), 94 /universe has imploded/, 95 "Expected error for unregister database failure" 96 ); 97 98 // Should send an out-of-band unregister request. 99 await unregisterPromise; 100 equal(handshakes, 1, "Wrong handshake count"); 101 equal(registers, 1, "Wrong register count"); 102 });