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

154 строки
3.8 KiB
JavaScript

/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
const { PushDB, PushService, PushServiceWebSocket } = serviceExports;
const userAgentID = "3c7462fc-270f-45be-a459-b9d631b0d093";
function run_test() {
do_get_profile();
setPrefs({
userAgentID,
});
run_next_test();
}
add_task(async function test_notification_error() {
let db = PushServiceWebSocket.newPushDB();
registerCleanupFunction(() => {
return db.drop().then(_ => db.close());
});
let originAttributes = "";
let records = [
{
channelID: "f04f1e46-9139-4826-b2d1-9411b0821283",
pushEndpoint: "https://example.org/update/success-1",
scope: "https://example.com/a",
originAttributes,
version: 1,
quota: Infinity,
systemRecord: true,
},
{
channelID: "3c3930ba-44de-40dc-a7ca-8a133ec1a866",
pushEndpoint: "https://example.org/update/error",
scope: "https://example.com/b",
originAttributes,
version: 2,
quota: Infinity,
systemRecord: true,
},
{
channelID: "b63f7bef-0a0d-4236-b41e-086a69dfd316",
pushEndpoint: "https://example.org/update/success-2",
scope: "https://example.com/c",
originAttributes,
version: 3,
quota: Infinity,
systemRecord: true,
},
];
for (let record of records) {
await db.put(record);
}
let scopes = [];
let notifyPromise = promiseObserverNotification(
PushServiceComponent.pushTopic,
(subject, data) => scopes.push(data) == 2
);
let ackDone;
let ackPromise = new Promise(
resolve => (ackDone = after(records.length, resolve))
);
PushService.init({
serverURI: "wss://push.example.org/",
db: makeStub(db, {
getByKeyID(prev, channelID) {
if (channelID == "3c3930ba-44de-40dc-a7ca-8a133ec1a866") {
return Promise.reject("splines not reticulated");
}
return prev.call(this, channelID);
},
}),
makeWebSocket(uri) {
return new MockWebSocket(uri, {
onHello(request) {
this.serverSendMsg(
JSON.stringify({
messageType: "hello",
status: 200,
uaid: userAgentID,
})
);
this.serverSendMsg(
JSON.stringify({
messageType: "notification",
updates: records.map(({ channelID, version }) => ({
channelID,
version: ++version,
})),
})
);
},
// Should acknowledge all received updates, even if updating
// IndexedDB fails.
onACK: ackDone,
});
},
});
await notifyPromise;
ok(
scopes.includes("https://example.com/a"),
"Missing scope for notification A"
);
ok(
scopes.includes("https://example.com/c"),
"Missing scope for notification C"
);
await ackPromise;
let aRecord = await db.getByIdentifiers({
scope: "https://example.com/a",
originAttributes,
});
equal(
aRecord.channelID,
"f04f1e46-9139-4826-b2d1-9411b0821283",
"Wrong channel ID for record A"
);
strictEqual(aRecord.version, 2, "Should return the new version for record A");
let bRecord = await db.getByIdentifiers({
scope: "https://example.com/b",
originAttributes,
});
equal(
bRecord.channelID,
"3c3930ba-44de-40dc-a7ca-8a133ec1a866",
"Wrong channel ID for record B"
);
strictEqual(
bRecord.version,
2,
"Should return the previous version for record B"
);
let cRecord = await db.getByIdentifiers({
scope: "https://example.com/c",
originAttributes,
});
equal(
cRecord.channelID,
"b63f7bef-0a0d-4236-b41e-086a69dfd316",
"Wrong channel ID for record C"
);
strictEqual(cRecord.version, 4, "Should return the new version for record C");
});