bug 1600330: remote: test nsIRemoteAgent r=remote-protocol-reviewers,maja_zf,whimboo

Adds browser-chrome tests for the main entry point of the remote
agent, nsIRemoteAgent.

add_agent_task() wraps add_plain_task() (which again wraps the
original add_task()) so we can ensure that the agent isn't listening
before a test runs, and that any modified state such as preferences
is reset afterwards.

The tests rely heavily on the assumption that nsIRemoteAgent.close()
behaves as a no-op when the server is not listening.

This patch is a follow-up to bug 1590828.

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

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Andreas Tolfsen 2019-12-13 07:31:54 +00:00
parent ff89580849
commit b7a5c8548a
2 changed files with 110 additions and 0 deletions

View File

@ -6,6 +6,7 @@ support-files =
chrome-remote-interface.js
head.js
[browser_agent.js]
[browser_cdp.js]
[browser_main_target.js]
[browser_session.js]

View File

@ -0,0 +1,109 @@
/* 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(taskFn) {
add_plain_task(async () => {
try {
await RemoteAgent.close();
await taskFn();
} finally {
Preferences.reset("remote.enabled");
Preferences.reset("remote.force-local");
}
});
}
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();
}
}