fune/devtools/shared/resources/tests/browser_resources_platform_messages.js

149 lines
4.3 KiB
JavaScript

/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
// Test the ResourceWatcher API around PLATFORM_MESSAGE
// Reproduces assertions from: devtools/shared/webconsole/test/chrome/test_nsiconsolemessage.html
const {
ResourceWatcher,
} = require("devtools/shared/resources/resource-watcher");
add_task(async function() {
// Disable the preloaded process as it creates processes intermittently
// which forces the emission of RDP requests we aren't correctly waiting for.
await pushPref("dom.ipc.processPrelaunch.enabled", false);
await testPlatformMessagesResources();
await testPlatformMessagesResourcesWithIgnoreExistingResources();
});
async function testPlatformMessagesResources() {
const {
client,
resourceWatcher,
targetList,
} = await initMultiProcessResourceWatcher();
const expectedMessages = [
"This is a cached message",
"This is another cached message",
"This is a live message",
"This is another live message",
];
const receivedMessages = [];
info(
"Log some messages *before* calling ResourceWatcher.watchResources in order to assert the behavior of already existing messages."
);
Services.console.logStringMessage(expectedMessages[0]);
Services.console.logStringMessage(expectedMessages[1]);
let done;
const onAllMessagesReceived = new Promise(resolve => (done = resolve));
const onAvailable = resources => {
for (const resource of resources) {
if (!expectedMessages.includes(resource.message)) {
continue;
}
is(
resource.targetFront,
targetList.targetFront,
"The targetFront property is the expected one"
);
receivedMessages.push(resource.message);
is(
resource.message,
expectedMessages[receivedMessages.length - 1],
`Received the expected «${resource.message}» message, in the expected order`
);
ok(
resource.timeStamp.toString().match(/^\d+$/),
"The resource has a timeStamp property"
);
if (receivedMessages.length == expectedMessages.length) {
done();
}
}
};
await resourceWatcher.watchResources(
[ResourceWatcher.TYPES.PLATFORM_MESSAGE],
{
onAvailable,
}
);
info(
"Now log messages *after* the call to ResourceWatcher.watchResources and after having received all existing messages"
);
Services.console.logStringMessage(expectedMessages[2]);
Services.console.logStringMessage(expectedMessages[3]);
info("Waiting for all expected messages to be received");
await onAllMessagesReceived;
ok(true, "All the expected messages were received");
Services.console.reset();
targetList.destroy();
await client.close();
}
async function testPlatformMessagesResourcesWithIgnoreExistingResources() {
const {
client,
resourceWatcher,
targetList,
} = await initMultiProcessResourceWatcher();
info(
"Check whether onAvailable will not be called with existing platform messages"
);
const expectedMessages = ["This is 1st message", "This is 2nd message"];
Services.console.logStringMessage(expectedMessages[0]);
Services.console.logStringMessage(expectedMessages[1]);
const availableResources = [];
await resourceWatcher.watchResources(
[ResourceWatcher.TYPES.PLATFORM_MESSAGE],
{
onAvailable: resources => {
for (const resource of resources) {
if (!expectedMessages.includes(resource.message)) {
continue;
}
availableResources.push(resource);
}
},
ignoreExistingResources: true,
}
);
is(
availableResources.length,
0,
"onAvailable wasn't called for existing platform messages"
);
info(
"Check whether onAvailable will be called with the future platform messages"
);
Services.console.logStringMessage(expectedMessages[0]);
Services.console.logStringMessage(expectedMessages[1]);
await waitUntil(() => availableResources.length === expectedMessages.length);
for (let i = 0; i < expectedMessages.length; i++) {
const { message } = availableResources[i];
const expected = expectedMessages[i];
is(message, expected, `Message[${i}] is correct`);
}
Services.console.reset();
targetList.destroy();
await client.close();
}