gecko-dev/dom/push/test/xpcshell/test_notification_ack.js

166 строки
4.3 KiB
JavaScript

/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
const { PushDB, PushService, PushServiceWebSocket } = serviceExports;
var userAgentID = "5ab1d1df-7a3d-4024-a469-b9e1bb399fad";
function run_test() {
do_get_profile();
setPrefs({ userAgentID });
run_next_test();
}
add_task(async function test_notification_ack() {
let db = PushServiceWebSocket.newPushDB();
registerCleanupFunction(() => {
return db.drop().then(_ => db.close());
});
let records = [
{
channelID: "21668e05-6da8-42c9-b8ab-9cc3f4d5630c",
pushEndpoint: "https://example.com/update/1",
scope: "https://example.org/1",
originAttributes: "",
version: 1,
quota: Infinity,
systemRecord: true,
},
{
channelID: "9a5ff87f-47c9-4215-b2b8-0bdd38b4b305",
pushEndpoint: "https://example.com/update/2",
scope: "https://example.org/2",
originAttributes: "",
version: 2,
quota: Infinity,
systemRecord: true,
},
{
channelID: "5477bfda-22db-45d4-9614-fee369630260",
pushEndpoint: "https://example.com/update/3",
scope: "https://example.org/3",
originAttributes: "",
version: 3,
quota: Infinity,
systemRecord: true,
},
];
for (let record of records) {
await db.put(record);
}
let notifyCount = 0;
let notifyPromise = promiseObserverNotification(
PushServiceComponent.pushTopic,
() => ++notifyCount == 3
);
let acks = 0;
let ackDone;
let ackPromise = new Promise(resolve => (ackDone = resolve));
PushService.init({
serverURI: "wss://push.example.org/",
db,
makeWebSocket(uri) {
return new MockWebSocket(uri, {
onHello(request) {
equal(
request.uaid,
userAgentID,
"Should send matching device IDs in handshake"
);
this.serverSendMsg(
JSON.stringify({
messageType: "hello",
uaid: userAgentID,
status: 200,
})
);
this.serverSendMsg(
JSON.stringify({
messageType: "notification",
updates: [
{
channelID: "21668e05-6da8-42c9-b8ab-9cc3f4d5630c",
version: 2,
},
],
})
);
},
onACK(request) {
equal(request.messageType, "ack", "Should send acknowledgements");
let updates = request.updates;
switch (++acks) {
case 1:
deepEqual(
[
{
channelID: "21668e05-6da8-42c9-b8ab-9cc3f4d5630c",
version: 2,
code: 100,
},
],
updates,
"Wrong updates for acknowledgement 1"
);
this.serverSendMsg(
JSON.stringify({
messageType: "notification",
updates: [
{
channelID: "9a5ff87f-47c9-4215-b2b8-0bdd38b4b305",
version: 4,
},
{
channelID: "5477bfda-22db-45d4-9614-fee369630260",
version: 6,
},
],
})
);
break;
case 2:
deepEqual(
[
{
channelID: "9a5ff87f-47c9-4215-b2b8-0bdd38b4b305",
version: 4,
code: 100,
},
],
updates,
"Wrong updates for acknowledgement 2"
);
break;
case 3:
deepEqual(
[
{
channelID: "5477bfda-22db-45d4-9614-fee369630260",
version: 6,
code: 100,
},
],
updates,
"Wrong updates for acknowledgement 3"
);
ackDone();
break;
default:
ok(false, "Unexpected acknowledgement " + acks);
}
},
});
},
});
await notifyPromise;
await ackPromise;
});