gecko-dev/remote/test/browser/browser_agent.js
Andreas Tolfsen e221feba47 bug 1607500: remote: preserve task name in add_agent_task() r=remote-protocol-reviewers,whimboo
Similarly to bug 1603451, the name of the function passed to the
specialised add_agent_task() is lost because of the anonymous
function wrapper inside.

Differential Revision: https://phabricator.services.mozilla.com/D58967

--HG--
extra : moz-landing-system : lando
2020-01-08 08:34:46 +00:00

114 lines
3 KiB
JavaScript

/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
const { Preferences } = ChromeUtils.import(
"resource://gre/modules/Preferences.jsm"
);
const URL = Services.io.newURI("http://localhost:0");
// set up test conditions and clean up
function add_agent_task(originalTask) {
const task = async function() {
try {
await RemoteAgent.close();
await originalTask();
} finally {
Preferences.reset("remote.enabled");
Preferences.reset("remote.force-local");
}
};
Object.defineProperty(task, "name", {
value: originalTask.name,
writable: false,
});
add_plain_task(task);
}
add_agent_task(async function listening() {
is(RemoteAgent.listening, false, "Agent is not listening");
await RemoteAgent.listen(URL);
is(RemoteAgent.listening, true, "Agent is listening");
});
add_agent_task(async function listen() {
const port = getNonAtomicFreePort();
let boundURL;
function observer(subject, topic, data) {
Services.obs.removeObserver(observer, topic);
boundURL = Services.io.newURI(data);
}
Services.obs.addObserver(observer, "remote-listening");
await RemoteAgent.listen("http://localhost:" + port);
isnot(boundURL, undefined, "remote-listening observer notified");
is(
boundURL.port,
port,
`expected default port ${port}, got ${boundURL.port}`
);
});
add_agent_task(async function listenWhenDisabled() {
Preferences.set("remote.enabled", false);
try {
await RemoteAgent.listen(URL);
fail("listen() did not return exception");
} catch (e) {
is(e.result, Cr.NS_ERROR_NOT_AVAILABLE);
is(e.message, "Disabled by preference");
}
});
// TODO(ato): https://bugzil.la/1590829
add_agent_task(async function listenTakesString() {
await RemoteAgent.listen("http://localhost:0");
await RemoteAgent.close();
});
// TODO(ato): https://bugzil.la/1590829
add_agent_task(async function listenNonURL() {
try {
await RemoteAgent.listen("foobar");
fail("listen() did not reject non-URL");
} catch (e) {
is(e.result, Cr.NS_ERROR_MALFORMED_URI);
}
});
add_agent_task(async function listenRestrictedToLoopbackDevice() {
try {
await RemoteAgent.listen("http://0.0.0.0:0");
fail("listen() did not reject non-loopback device");
} catch (e) {
is(e.result, Cr.NS_ERROR_ILLEGAL_VALUE);
is(e.message, "Restricted to loopback devices");
}
});
add_agent_task(async function listenNonLoopbackDevice() {
Preferences.set("remote.force-local", false);
await RemoteAgent.listen("http://0.0.0.0:0");
});
add_agent_task(async function test_close() {
await RemoteAgent.listen(URL);
await RemoteAgent.close();
// no-op when not listening
await RemoteAgent.close();
});
function getNonAtomicFreePort() {
const so = Cc["@mozilla.org/network/server-socket;1"].createInstance(
Ci.nsIServerSocket
);
try {
so.init(-1, true /* aLoopbackOnly */, -1 /* aBackLog */);
return so.port;
} finally {
so.close();
}
}