summaryrefslogtreecommitdiffstats
path: root/toolkit/modules/subprocess
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/modules/subprocess')
-rw-r--r--toolkit/modules/subprocess/moz.build6
-rw-r--r--toolkit/modules/subprocess/test/xpcshell/.eslintrc.js5
-rw-r--r--toolkit/modules/subprocess/test/xpcshell/data_test_script.py55
-rw-r--r--toolkit/modules/subprocess/test/xpcshell/data_text_file.txt0
-rw-r--r--toolkit/modules/subprocess/test/xpcshell/head.js14
-rw-r--r--toolkit/modules/subprocess/test/xpcshell/test_subprocess.js769
-rw-r--r--toolkit/modules/subprocess/test/xpcshell/test_subprocess_getEnvironment.js17
-rw-r--r--toolkit/modules/subprocess/test/xpcshell/test_subprocess_pathSearch.js73
-rw-r--r--toolkit/modules/subprocess/test/xpcshell/xpcshell.ini14
9 files changed, 1 insertions, 952 deletions
diff --git a/toolkit/modules/subprocess/moz.build b/toolkit/modules/subprocess/moz.build
index c4548c8f6..e9c6e1198 100644
--- a/toolkit/modules/subprocess/moz.build
+++ b/toolkit/modules/subprocess/moz.build
@@ -4,9 +4,7 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-EXTRA_PP_JS_MODULES += [
- 'Subprocess.jsm',
-]
+EXTRA_PP_JS_MODULES += ['Subprocess.jsm']
EXTRA_JS_MODULES.subprocess += [
'subprocess_common.jsm',
@@ -27,6 +25,4 @@ else:
'subprocess_worker_unix.js',
]
-XPCSHELL_TESTS_MANIFESTS += ['test/xpcshell/xpcshell.ini']
-
SPHINX_TREES['toolkit_modules/subprocess'] = ['docs']
diff --git a/toolkit/modules/subprocess/test/xpcshell/.eslintrc.js b/toolkit/modules/subprocess/test/xpcshell/.eslintrc.js
deleted file mode 100644
index fc63a79b7..000000000
--- a/toolkit/modules/subprocess/test/xpcshell/.eslintrc.js
+++ /dev/null
@@ -1,5 +0,0 @@
-"use strict";
-
-module.exports = { // eslint-disable-line no-undef
- "extends": "../../../../../testing/xpcshell/xpcshell.eslintrc.js",
-};
diff --git a/toolkit/modules/subprocess/test/xpcshell/data_test_script.py b/toolkit/modules/subprocess/test/xpcshell/data_test_script.py
deleted file mode 100644
index 035d8ac56..000000000
--- a/toolkit/modules/subprocess/test/xpcshell/data_test_script.py
+++ /dev/null
@@ -1,55 +0,0 @@
-#!/usr/bin/env python2
-from __future__ import print_function
-
-import os
-import signal
-import struct
-import sys
-
-
-def output(line):
- sys.stdout.write(struct.pack('@I', len(line)))
- sys.stdout.write(line)
- sys.stdout.flush()
-
-
-def echo_loop():
- while True:
- line = sys.stdin.readline()
- if not line:
- break
-
- output(line)
-
-
-if sys.platform == "win32":
- import msvcrt
- msvcrt.setmode(sys.stderr.fileno(), os.O_BINARY)
-
-
-cmd = sys.argv[1]
-if cmd == 'echo':
- echo_loop()
-elif cmd == 'exit':
- sys.exit(int(sys.argv[2]))
-elif cmd == 'env':
- for var in sys.argv[2:]:
- output(os.environ.get(var, ''))
-elif cmd == 'pwd':
- output(os.path.abspath(os.curdir))
-elif cmd == 'print_args':
- for arg in sys.argv[2:]:
- output(arg)
-elif cmd == 'ignore_sigterm':
- signal.signal(signal.SIGTERM, signal.SIG_IGN)
-
- output('Ready')
- while True:
- try:
- signal.pause()
- except AttributeError:
- import time
- time.sleep(3600)
-elif cmd == 'print':
- sys.stdout.write(sys.argv[2])
- sys.stderr.write(sys.argv[3])
diff --git a/toolkit/modules/subprocess/test/xpcshell/data_text_file.txt b/toolkit/modules/subprocess/test/xpcshell/data_text_file.txt
deleted file mode 100644
index e69de29bb..000000000
--- a/toolkit/modules/subprocess/test/xpcshell/data_text_file.txt
+++ /dev/null
diff --git a/toolkit/modules/subprocess/test/xpcshell/head.js b/toolkit/modules/subprocess/test/xpcshell/head.js
deleted file mode 100644
index b3175d08a..000000000
--- a/toolkit/modules/subprocess/test/xpcshell/head.js
+++ /dev/null
@@ -1,14 +0,0 @@
-"use strict";
-
-const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
-
-Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "AppConstants",
- "resource://gre/modules/AppConstants.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "OS",
- "resource://gre/modules/osfile.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "Services",
- "resource://gre/modules/Services.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "Subprocess",
- "resource://gre/modules/Subprocess.jsm");
diff --git a/toolkit/modules/subprocess/test/xpcshell/test_subprocess.js b/toolkit/modules/subprocess/test/xpcshell/test_subprocess.js
deleted file mode 100644
index 1b8e02820..000000000
--- a/toolkit/modules/subprocess/test/xpcshell/test_subprocess.js
+++ /dev/null
@@ -1,769 +0,0 @@
-"use strict";
-
-Cu.import("resource://gre/modules/AppConstants.jsm");
-Cu.import("resource://gre/modules/Task.jsm");
-Cu.import("resource://gre/modules/Timer.jsm");
-
-
-const env = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment);
-
-const MAX_ROUND_TRIP_TIME_MS = AppConstants.DEBUG || AppConstants.ASAN ? 18 : 9;
-const MAX_RETRIES = 5;
-
-let PYTHON;
-let PYTHON_BIN;
-let PYTHON_DIR;
-
-const TEST_SCRIPT = do_get_file("data_test_script.py").path;
-
-let read = pipe => {
- return pipe.readUint32().then(count => {
- return pipe.readString(count);
- });
-};
-
-
-let readAll = Task.async(function* (pipe) {
- let result = [];
- let string;
- while ((string = yield pipe.readString())) {
- result.push(string);
- }
-
- return result.join("");
-});
-
-
-add_task(function* setup() {
- PYTHON = yield Subprocess.pathSearch(env.get("PYTHON"));
-
- PYTHON_BIN = OS.Path.basename(PYTHON);
- PYTHON_DIR = OS.Path.dirname(PYTHON);
-});
-
-
-add_task(function* test_subprocess_io() {
- let proc = yield Subprocess.call({
- command: PYTHON,
- arguments: ["-u", TEST_SCRIPT, "echo"],
- });
-
- Assert.throws(() => { proc.stdout.read(-1); },
- /non-negative integer/);
- Assert.throws(() => { proc.stdout.read(1.1); },
- /non-negative integer/);
-
- Assert.throws(() => { proc.stdout.read(Infinity); },
- /non-negative integer/);
- Assert.throws(() => { proc.stdout.read(NaN); },
- /non-negative integer/);
-
- Assert.throws(() => { proc.stdout.readString(-1); },
- /non-negative integer/);
- Assert.throws(() => { proc.stdout.readString(1.1); },
- /non-negative integer/);
-
- Assert.throws(() => { proc.stdout.readJSON(-1); },
- /positive integer/);
- Assert.throws(() => { proc.stdout.readJSON(0); },
- /positive integer/);
- Assert.throws(() => { proc.stdout.readJSON(1.1); },
- /positive integer/);
-
-
- const LINE1 = "I'm a leaf on the wind.\n";
- const LINE2 = "Watch how I soar.\n";
-
-
- let outputPromise = read(proc.stdout);
-
- yield new Promise(resolve => setTimeout(resolve, 100));
-
- let [output] = yield Promise.all([
- outputPromise,
- proc.stdin.write(LINE1),
- ]);
-
- equal(output, LINE1, "Got expected output");
-
-
- // Make sure it succeeds whether the write comes before or after the
- // read.
- let inputPromise = proc.stdin.write(LINE2);
-
- yield new Promise(resolve => setTimeout(resolve, 100));
-
- [output] = yield Promise.all([
- read(proc.stdout),
- inputPromise,
- ]);
-
- equal(output, LINE2, "Got expected output");
-
-
- let JSON_BLOB = {foo: {bar: "baz"}};
-
- inputPromise = proc.stdin.write(JSON.stringify(JSON_BLOB) + "\n");
-
- output = yield proc.stdout.readUint32().then(count => {
- return proc.stdout.readJSON(count);
- });
-
- Assert.deepEqual(output, JSON_BLOB, "Got expected JSON output");
-
-
- yield proc.stdin.close();
-
- let {exitCode} = yield proc.wait();
-
- equal(exitCode, 0, "Got expected exit code");
-});
-
-
-add_task(function* test_subprocess_large_io() {
- let proc = yield Subprocess.call({
- command: PYTHON,
- arguments: ["-u", TEST_SCRIPT, "echo"],
- });
-
- const LINE = "I'm a leaf on the wind.\n";
- const BUFFER_SIZE = 4096;
-
- // Create a message that's ~3/4 the input buffer size.
- let msg = Array(BUFFER_SIZE * .75 / 16 | 0).fill("0123456789abcdef").join("") + "\n";
-
- // This sequence of writes and reads crosses several buffer size
- // boundaries, and causes some branches of the read buffer code to be
- // exercised which are not exercised by other tests.
- proc.stdin.write(msg);
- proc.stdin.write(msg);
- proc.stdin.write(LINE);
-
- let output = yield read(proc.stdout);
- equal(output, msg, "Got the expected output");
-
- output = yield read(proc.stdout);
- equal(output, msg, "Got the expected output");
-
- output = yield read(proc.stdout);
- equal(output, LINE, "Got the expected output");
-
- proc.stdin.close();
-
-
- let {exitCode} = yield proc.wait();
-
- equal(exitCode, 0, "Got expected exit code");
-});
-
-
-add_task(function* test_subprocess_huge() {
- let proc = yield Subprocess.call({
- command: PYTHON,
- arguments: ["-u", TEST_SCRIPT, "echo"],
- });
-
- // This should be large enough to fill most pipe input/output buffers.
- const MESSAGE_SIZE = 1024 * 16;
-
- let msg = Array(MESSAGE_SIZE).fill("0123456789abcdef").join("") + "\n";
-
- proc.stdin.write(msg);
-
- let output = yield read(proc.stdout);
- equal(output, msg, "Got the expected output");
-
- proc.stdin.close();
-
-
- let {exitCode} = yield proc.wait();
-
- equal(exitCode, 0, "Got expected exit code");
-});
-
-
-add_task(function* test_subprocess_round_trip_perf() {
- let roundTripTime = Infinity;
- for (let i = 0; i < MAX_RETRIES && roundTripTime > MAX_ROUND_TRIP_TIME_MS; i++) {
- let proc = yield Subprocess.call({
- command: PYTHON,
- arguments: ["-u", TEST_SCRIPT, "echo"],
- });
-
-
- const LINE = "I'm a leaf on the wind.\n";
-
- let now = Date.now();
- const COUNT = 1000;
- for (let j = 0; j < COUNT; j++) {
- let [output] = yield Promise.all([
- read(proc.stdout),
- proc.stdin.write(LINE),
- ]);
-
- // We don't want to log this for every iteration, but we still need
- // to fail if it goes wrong.
- if (output !== LINE) {
- equal(output, LINE, "Got expected output");
- }
- }
-
- roundTripTime = (Date.now() - now) / COUNT;
-
- yield proc.stdin.close();
-
- let {exitCode} = yield proc.wait();
-
- equal(exitCode, 0, "Got expected exit code");
- }
-
- ok(roundTripTime <= MAX_ROUND_TRIP_TIME_MS,
- `Expected round trip time (${roundTripTime}ms) to be less than ${MAX_ROUND_TRIP_TIME_MS}ms`);
-});
-
-
-add_task(function* test_subprocess_stderr_default() {
- const LINE1 = "I'm a leaf on the wind.\n";
- const LINE2 = "Watch how I soar.\n";
-
- let proc = yield Subprocess.call({
- command: PYTHON,
- arguments: ["-u", TEST_SCRIPT, "print", LINE1, LINE2],
- });
-
- equal(proc.stderr, undefined, "There should be no stderr pipe by default");
-
- let stdout = yield readAll(proc.stdout);
-
- equal(stdout, LINE1, "Got the expected stdout output");
-
-
- let {exitCode} = yield proc.wait();
-
- equal(exitCode, 0, "Got expected exit code");
-});
-
-
-add_task(function* test_subprocess_stderr_pipe() {
- const LINE1 = "I'm a leaf on the wind.\n";
- const LINE2 = "Watch how I soar.\n";
-
- let proc = yield Subprocess.call({
- command: PYTHON,
- arguments: ["-u", TEST_SCRIPT, "print", LINE1, LINE2],
- stderr: "pipe",
- });
-
- let [stdout, stderr] = yield Promise.all([
- readAll(proc.stdout),
- readAll(proc.stderr),
- ]);
-
- equal(stdout, LINE1, "Got the expected stdout output");
- equal(stderr, LINE2, "Got the expected stderr output");
-
-
- let {exitCode} = yield proc.wait();
-
- equal(exitCode, 0, "Got expected exit code");
-});
-
-
-add_task(function* test_subprocess_stderr_merged() {
- const LINE1 = "I'm a leaf on the wind.\n";
- const LINE2 = "Watch how I soar.\n";
-
- let proc = yield Subprocess.call({
- command: PYTHON,
- arguments: ["-u", TEST_SCRIPT, "print", LINE1, LINE2],
- stderr: "stdout",
- });
-
- equal(proc.stderr, undefined, "There should be no stderr pipe by default");
-
- let stdout = yield readAll(proc.stdout);
-
- equal(stdout, LINE1 + LINE2, "Got the expected merged stdout output");
-
-
- let {exitCode} = yield proc.wait();
-
- equal(exitCode, 0, "Got expected exit code");
-});
-
-
-add_task(function* test_subprocess_read_after_exit() {
- const LINE1 = "I'm a leaf on the wind.\n";
- const LINE2 = "Watch how I soar.\n";
-
- let proc = yield Subprocess.call({
- command: PYTHON,
- arguments: ["-u", TEST_SCRIPT, "print", LINE1, LINE2],
- stderr: "pipe",
- });
-
-
- let {exitCode} = yield proc.wait();
- equal(exitCode, 0, "Process exited with expected code");
-
-
- let [stdout, stderr] = yield Promise.all([
- readAll(proc.stdout),
- readAll(proc.stderr),
- ]);
-
- equal(stdout, LINE1, "Got the expected stdout output");
- equal(stderr, LINE2, "Got the expected stderr output");
-});
-
-
-add_task(function* test_subprocess_lazy_close_output() {
- let proc = yield Subprocess.call({
- command: PYTHON,
- arguments: ["-u", TEST_SCRIPT, "echo"],
- });
-
- const LINE1 = "I'm a leaf on the wind.\n";
- const LINE2 = "Watch how I soar.\n";
-
- let writePromises = [
- proc.stdin.write(LINE1),
- proc.stdin.write(LINE2),
- ];
- let closedPromise = proc.stdin.close();
-
-
- let output1 = yield read(proc.stdout);
- let output2 = yield read(proc.stdout);
-
- yield Promise.all([...writePromises, closedPromise]);
-
- equal(output1, LINE1, "Got expected output");
- equal(output2, LINE2, "Got expected output");
-
-
- let {exitCode} = yield proc.wait();
-
- equal(exitCode, 0, "Got expected exit code");
-});
-
-
-add_task(function* test_subprocess_lazy_close_input() {
- let proc = yield Subprocess.call({
- command: PYTHON,
- arguments: ["-u", TEST_SCRIPT, "echo"],
- });
-
- let readPromise = proc.stdout.readUint32();
- let closedPromise = proc.stdout.close();
-
-
- const LINE = "I'm a leaf on the wind.\n";
-
- proc.stdin.write(LINE);
- proc.stdin.close();
-
- let len = yield readPromise;
- equal(len, LINE.length);
-
- yield closedPromise;
-
-
- // Don't test for a successful exit here. The process may exit with a
- // write error if we close the pipe after it's written the message
- // size but before it's written the message.
- yield proc.wait();
-});
-
-
-add_task(function* test_subprocess_force_close() {
- let proc = yield Subprocess.call({
- command: PYTHON,
- arguments: ["-u", TEST_SCRIPT, "echo"],
- });
-
- let readPromise = proc.stdout.readUint32();
- let closedPromise = proc.stdout.close(true);
-
- yield Assert.rejects(
- readPromise,
- function(e) {
- equal(e.errorCode, Subprocess.ERROR_END_OF_FILE,
- "Got the expected error code");
- return /File closed/.test(e.message);
- },
- "Promise should be rejected when file is closed");
-
- yield closedPromise;
- yield proc.stdin.close();
-
-
- let {exitCode} = yield proc.wait();
-
- equal(exitCode, 0, "Got expected exit code");
-});
-
-
-add_task(function* test_subprocess_eof() {
- let proc = yield Subprocess.call({
- command: PYTHON,
- arguments: ["-u", TEST_SCRIPT, "echo"],
- });
-
- let readPromise = proc.stdout.readUint32();
-
- yield proc.stdin.close();
-
- yield Assert.rejects(
- readPromise,
- function(e) {
- equal(e.errorCode, Subprocess.ERROR_END_OF_FILE,
- "Got the expected error code");
- return /File closed/.test(e.message);
- },
- "Promise should be rejected on EOF");
-
- let {exitCode} = yield proc.wait();
-
- equal(exitCode, 0, "Got expected exit code");
-});
-
-
-add_task(function* test_subprocess_invalid_json() {
- let proc = yield Subprocess.call({
- command: PYTHON,
- arguments: ["-u", TEST_SCRIPT, "echo"],
- });
-
- const LINE = "I'm a leaf on the wind.\n";
-
- proc.stdin.write(LINE);
- proc.stdin.close();
-
- let count = yield proc.stdout.readUint32();
- let readPromise = proc.stdout.readJSON(count);
-
- yield Assert.rejects(
- readPromise,
- function(e) {
- equal(e.errorCode, Subprocess.ERROR_INVALID_JSON,
- "Got the expected error code");
- return /SyntaxError/.test(e);
- },
- "Promise should be rejected on EOF");
-
- let {exitCode} = yield proc.wait();
-
- equal(exitCode, 0, "Got expected exit code");
-});
-
-
-if (AppConstants.isPlatformAndVersionAtLeast("win", "6")) {
- add_task(function* test_subprocess_inherited_descriptors() {
- let {ctypes, libc, win32} = Cu.import("resource://gre/modules/subprocess/subprocess_win.jsm");
-
- let secAttr = new win32.SECURITY_ATTRIBUTES();
- secAttr.nLength = win32.SECURITY_ATTRIBUTES.size;
- secAttr.bInheritHandle = true;
-
- let handles = win32.createPipe(secAttr, 0);
-
-
- let proc = yield Subprocess.call({
- command: PYTHON,
- arguments: ["-u", TEST_SCRIPT, "echo"],
- });
-
-
- // Close the output end of the pipe.
- // Ours should be the only copy, so reads should fail after this.
- handles[1].dispose();
-
- let buffer = new ArrayBuffer(1);
- let succeeded = libc.ReadFile(handles[0], buffer, buffer.byteLength,
- null, null);
-
- ok(!succeeded, "ReadFile should fail on broken pipe");
- equal(ctypes.winLastError, win32.ERROR_BROKEN_PIPE, "Read should fail with ERROR_BROKEN_PIPE");
-
-
- proc.stdin.close();
-
- let {exitCode} = yield proc.wait();
-
- equal(exitCode, 0, "Got expected exit code");
- });
-}
-
-
-add_task(function* test_subprocess_wait() {
- let proc = yield Subprocess.call({
- command: PYTHON,
- arguments: ["-u", TEST_SCRIPT, "exit", "42"],
- });
-
- let {exitCode} = yield proc.wait();
-
- equal(exitCode, 42, "Got expected exit code");
-});
-
-
-add_task(function* test_subprocess_pathSearch() {
- let promise = Subprocess.call({
- command: PYTHON_BIN,
- arguments: ["-u", TEST_SCRIPT, "exit", "13"],
- environment: {
- PATH: PYTHON_DIR,
- },
- });
-
- yield Assert.rejects(
- promise,
- function(error) {
- return error.errorCode == Subprocess.ERROR_BAD_EXECUTABLE;
- },
- "Subprocess.call should fail for a bad executable");
-});
-
-
-add_task(function* test_subprocess_workdir() {
- let procDir = yield OS.File.getCurrentDirectory();
- let tmpDirFile = Components.classes["@mozilla.org/file/local;1"]
- .createInstance(Components.interfaces.nsILocalFile);
- tmpDirFile.initWithPath(OS.Constants.Path.tmpDir);
- tmpDirFile.normalize();
- let tmpDir = tmpDirFile.path;
-
- notEqual(procDir, tmpDir,
- "Current process directory must not be the current temp directory");
-
- function* pwd(options) {
- let proc = yield Subprocess.call(Object.assign({
- command: PYTHON,
- arguments: ["-u", TEST_SCRIPT, "pwd"],
- }, options));
-
- let pwdOutput = read(proc.stdout);
-
- let {exitCode} = yield proc.wait();
- equal(exitCode, 0, "Got expected exit code");
-
- return pwdOutput;
- }
-
- let dir = yield pwd({});
- equal(dir, procDir, "Process should normally launch in current process directory");
-
- dir = yield pwd({workdir: tmpDir});
- equal(dir, tmpDir, "Process should launch in the directory specified in `workdir`");
-
- dir = yield OS.File.getCurrentDirectory();
- equal(dir, procDir, "`workdir` should not change the working directory of the current process");
-});
-
-
-add_task(function* test_subprocess_term() {
- let proc = yield Subprocess.call({
- command: PYTHON,
- arguments: ["-u", TEST_SCRIPT, "echo"],
- });
-
- // Windows does not support killing processes gracefully, so they will
- // always exit with -9 there.
- let retVal = AppConstants.platform == "win" ? -9 : -15;
-
- // Kill gracefully with the default timeout of 300ms.
- let {exitCode} = yield proc.kill();
-
- equal(exitCode, retVal, "Got expected exit code");
-
- ({exitCode} = yield proc.wait());
-
- equal(exitCode, retVal, "Got expected exit code");
-});
-
-
-add_task(function* test_subprocess_kill() {
- let proc = yield Subprocess.call({
- command: PYTHON,
- arguments: ["-u", TEST_SCRIPT, "echo"],
- });
-
- // Force kill with no gracefull termination timeout.
- let {exitCode} = yield proc.kill(0);
-
- equal(exitCode, -9, "Got expected exit code");
-
- ({exitCode} = yield proc.wait());
-
- equal(exitCode, -9, "Got expected exit code");
-});
-
-
-add_task(function* test_subprocess_kill_timeout() {
- let proc = yield Subprocess.call({
- command: PYTHON,
- arguments: ["-u", TEST_SCRIPT, "ignore_sigterm"],
- });
-
- // Wait for the process to set up its signal handler and tell us it's
- // ready.
- let msg = yield read(proc.stdout);
- equal(msg, "Ready", "Process is ready");
-
- // Kill gracefully with the default timeout of 300ms.
- // Expect a force kill after 300ms, since the process traps SIGTERM.
- const TIMEOUT = 300;
- let startTime = Date.now();
-
- let {exitCode} = yield proc.kill(TIMEOUT);
-
- // Graceful termination is not supported on Windows, so don't bother
- // testing the timeout there.
- if (AppConstants.platform != "win") {
- let diff = Date.now() - startTime;
- ok(diff >= TIMEOUT, `Process was killed after ${diff}ms (expected ~${TIMEOUT}ms)`);
- }
-
- equal(exitCode, -9, "Got expected exit code");
-
- ({exitCode} = yield proc.wait());
-
- equal(exitCode, -9, "Got expected exit code");
-});
-
-
-add_task(function* test_subprocess_arguments() {
- let args = [
- String.raw`C:\Program Files\Company\Program.exe`,
- String.raw`\\NETWORK SHARE\Foo Directory${"\\"}`,
- String.raw`foo bar baz`,
- String.raw`"foo bar baz"`,
- String.raw`foo " bar`,
- String.raw`Thing \" with "" "\" \\\" \\\\" quotes\\" \\`,
- ];
-
- let proc = yield Subprocess.call({
- command: PYTHON,
- arguments: ["-u", TEST_SCRIPT, "print_args", ...args],
- });
-
- for (let [i, arg] of args.entries()) {
- let val = yield read(proc.stdout);
- equal(val, arg, `Got correct value for args[${i}]`);
- }
-
- let {exitCode} = yield proc.wait();
-
- equal(exitCode, 0, "Got expected exit code");
-});
-
-
-// Windows XP can't handle launching Python with a partial environment.
-if (!AppConstants.isPlatformAndVersionAtMost("win", "5.2")) {
- add_task(function* test_subprocess_environment() {
- let proc = yield Subprocess.call({
- command: PYTHON,
- arguments: ["-u", TEST_SCRIPT, "env", "PATH", "FOO"],
- environment: {
- FOO: "BAR",
- },
- });
-
- let path = yield read(proc.stdout);
- let foo = yield read(proc.stdout);
-
- equal(path, "", "Got expected $PATH value");
- equal(foo, "BAR", "Got expected $FOO value");
-
- let {exitCode} = yield proc.wait();
-
- equal(exitCode, 0, "Got expected exit code");
- });
-}
-
-
-add_task(function* test_subprocess_environmentAppend() {
- let proc = yield Subprocess.call({
- command: PYTHON,
- arguments: ["-u", TEST_SCRIPT, "env", "PATH", "FOO"],
- environmentAppend: true,
- environment: {
- FOO: "BAR",
- },
- });
-
- let path = yield read(proc.stdout);
- let foo = yield read(proc.stdout);
-
- equal(path, env.get("PATH"), "Got expected $PATH value");
- equal(foo, "BAR", "Got expected $FOO value");
-
- let {exitCode} = yield proc.wait();
-
- equal(exitCode, 0, "Got expected exit code");
-
- proc = yield Subprocess.call({
- command: PYTHON,
- arguments: ["-u", TEST_SCRIPT, "env", "PATH", "FOO"],
- environmentAppend: true,
- });
-
- path = yield read(proc.stdout);
- foo = yield read(proc.stdout);
-
- equal(path, env.get("PATH"), "Got expected $PATH value");
- equal(foo, "", "Got expected $FOO value");
-
- ({exitCode} = yield proc.wait());
-
- equal(exitCode, 0, "Got expected exit code");
-});
-
-
-add_task(function* test_bad_executable() {
- // Test with a non-executable file.
-
- let textFile = do_get_file("data_text_file.txt").path;
-
- let promise = Subprocess.call({
- command: textFile,
- arguments: [],
- });
-
- yield Assert.rejects(
- promise,
- function(error) {
- if (AppConstants.platform == "win") {
- return /Failed to create process/.test(error.message);
- }
- return error.errorCode == Subprocess.ERROR_BAD_EXECUTABLE;
- },
- "Subprocess.call should fail for a bad executable");
-
- // Test with a nonexistent file.
- promise = Subprocess.call({
- command: textFile + ".doesNotExist",
- arguments: [],
- });
-
- yield Assert.rejects(
- promise,
- function(error) {
- return error.errorCode == Subprocess.ERROR_BAD_EXECUTABLE;
- },
- "Subprocess.call should fail for a bad executable");
-});
-
-
-add_task(function* test_cleanup() {
- let {SubprocessImpl} = Cu.import("resource://gre/modules/Subprocess.jsm");
-
- let worker = SubprocessImpl.Process.getWorker();
-
- let openFiles = yield worker.call("getOpenFiles", []);
- let processes = yield worker.call("getProcesses", []);
-
- equal(openFiles.size, 0, "No remaining open files");
- equal(processes.size, 0, "No remaining processes");
-});
diff --git a/toolkit/modules/subprocess/test/xpcshell/test_subprocess_getEnvironment.js b/toolkit/modules/subprocess/test/xpcshell/test_subprocess_getEnvironment.js
deleted file mode 100644
index 4606aec04..000000000
--- a/toolkit/modules/subprocess/test/xpcshell/test_subprocess_getEnvironment.js
+++ /dev/null
@@ -1,17 +0,0 @@
-"use strict";
-
-let env = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment);
-
-add_task(function* test_getEnvironment() {
- env.set("FOO", "BAR");
-
- let environment = Subprocess.getEnvironment();
-
- equal(environment.FOO, "BAR");
- equal(environment.PATH, env.get("PATH"));
-
- env.set("FOO", null);
-
- environment = Subprocess.getEnvironment();
- equal(environment.FOO || "", "");
-});
diff --git a/toolkit/modules/subprocess/test/xpcshell/test_subprocess_pathSearch.js b/toolkit/modules/subprocess/test/xpcshell/test_subprocess_pathSearch.js
deleted file mode 100644
index 5eb4cd412..000000000
--- a/toolkit/modules/subprocess/test/xpcshell/test_subprocess_pathSearch.js
+++ /dev/null
@@ -1,73 +0,0 @@
-"use strict";
-
-let envService = Cc["@mozilla.org/process/environment;1"].getService(Ci.nsIEnvironment);
-
-const PYTHON = envService.get("PYTHON");
-
-const PYTHON_BIN = OS.Path.basename(PYTHON);
-const PYTHON_DIR = OS.Path.dirname(PYTHON);
-
-const DOES_NOT_EXIST = OS.Path.join(OS.Constants.Path.tmpDir,
- "ThisPathDoesNotExist");
-
-const PATH_SEP = AppConstants.platform == "win" ? ";" : ":";
-
-
-add_task(function* test_pathSearchAbsolute() {
- let env = {};
-
- let path = yield Subprocess.pathSearch(PYTHON, env);
- equal(path, PYTHON, "Full path resolves even with no PATH.");
-
- env.PATH = "";
- path = yield Subprocess.pathSearch(PYTHON, env);
- equal(path, PYTHON, "Full path resolves even with empty PATH.");
-
- yield Assert.rejects(
- Subprocess.pathSearch(DOES_NOT_EXIST, env),
- function(e) {
- equal(e.errorCode, Subprocess.ERROR_BAD_EXECUTABLE,
- "Got the expected error code");
- return /File at path .* does not exist, or is not (executable|a normal file)/.test(e.message);
- },
- "Absolute path should throw for a nonexistent execuable");
-});
-
-
-add_task(function* test_pathSearchRelative() {
- let env = {};
-
- yield Assert.rejects(
- Subprocess.pathSearch(PYTHON_BIN, env),
- function(e) {
- equal(e.errorCode, Subprocess.ERROR_BAD_EXECUTABLE,
- "Got the expected error code");
- return /Executable not found:/.test(e.message);
- },
- "Relative path should not be found when PATH is missing");
-
- env.PATH = [DOES_NOT_EXIST, PYTHON_DIR].join(PATH_SEP);
-
- let path = yield Subprocess.pathSearch(PYTHON_BIN, env);
- equal(path, PYTHON, "Correct executable should be found in the path");
-});
-
-
-add_task({
- skip_if: () => AppConstants.platform != "win",
-}, function* test_pathSearch_PATHEXT() {
- ok(PYTHON_BIN.endsWith(".exe"), "Python executable must end with .exe");
-
- const python_bin = PYTHON_BIN.slice(0, -4);
-
- let env = {
- PATH: PYTHON_DIR,
- PATHEXT: [".com", ".exe", ".foobar"].join(";"),
- };
-
- let path = yield Subprocess.pathSearch(python_bin, env);
- equal(path, PYTHON, "Correct executable should be found in the path, with guessed extension");
-});
-// IMPORTANT: Do not add any tests beyond this point without removing
-// the `skip_if` condition from the previous task, or it will prevent
-// all succeeding tasks from running when it does not match.
diff --git a/toolkit/modules/subprocess/test/xpcshell/xpcshell.ini b/toolkit/modules/subprocess/test/xpcshell/xpcshell.ini
deleted file mode 100644
index 7b7d49a73..000000000
--- a/toolkit/modules/subprocess/test/xpcshell/xpcshell.ini
+++ /dev/null
@@ -1,14 +0,0 @@
-[DEFAULT]
-head = head.js
-tail =
-firefox-appdir = browser
-skip-if = os == 'android'
-subprocess = true
-support-files =
- data_text_file.txt
- data_test_script.py
-
-[test_subprocess.js]
-skip-if = os == 'win' # Path issues due to venv changes on the test machines
-[test_subprocess_getEnvironment.js]
-[test_subprocess_pathSearch.js]