summaryrefslogtreecommitdiffstats
path: root/remote/cdp/test/xpcshell/test_StreamRegistry.js
diff options
context:
space:
mode:
Diffstat (limited to 'remote/cdp/test/xpcshell/test_StreamRegistry.js')
-rw-r--r--remote/cdp/test/xpcshell/test_StreamRegistry.js153
1 files changed, 153 insertions, 0 deletions
diff --git a/remote/cdp/test/xpcshell/test_StreamRegistry.js b/remote/cdp/test/xpcshell/test_StreamRegistry.js
new file mode 100644
index 0000000000..329f33d275
--- /dev/null
+++ b/remote/cdp/test/xpcshell/test_StreamRegistry.js
@@ -0,0 +1,153 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+const { Stream, StreamRegistry } = ChromeUtils.importESModule(
+ "chrome://remote/content/cdp/StreamRegistry.sys.mjs"
+);
+
+add_task(function test_constructor() {
+ const registry = new StreamRegistry();
+ equal(registry.streams.size, 0);
+});
+
+add_task(async function test_destructor() {
+ const registry = new StreamRegistry();
+
+ const stream1 = await createFileStream("foo bar");
+ const stream2 = await createFileStream("foo bar");
+
+ registry.add(stream1);
+ registry.add(stream2);
+
+ equal(registry.streams.size, 2);
+
+ await registry.destructor();
+ equal(registry.streams.size, 0);
+
+ ok(!(await IOUtils.exists(stream1.path)), "temporary file has been removed");
+ ok(!(await IOUtils.exists(stream2.path)), "temporary file has been removed");
+});
+
+add_task(async function test_addValidStreamType() {
+ const registry = new StreamRegistry();
+
+ const stream = await createFileStream("foo bar");
+ const handle = registry.add(stream);
+
+ equal(registry.streams.size, 1, "A single stream has been added");
+ equal(typeof handle, "string", "Handle is of type string");
+ ok(registry.streams.has(handle), "Handle has been found");
+
+ const rv = registry.streams.get(handle);
+ equal(rv, stream, "Expected stream found");
+});
+
+add_task(async function test_addCreatesDifferentHandles() {
+ const registry = new StreamRegistry();
+ const stream = await createFileStream("foo bar");
+
+ const handle1 = registry.add(stream);
+ equal(registry.streams.size, 1, "A single stream has been added");
+ equal(typeof handle1, "string", "Handle is of type string");
+ ok(registry.streams.has(handle1), "Handle has been found");
+ equal(registry.streams.get(handle1), stream, "Expected stream found");
+
+ const handle2 = registry.add(stream);
+ equal(registry.streams.size, 2, "A single stream has been added");
+ equal(typeof handle2, "string", "Handle is of type string");
+ ok(registry.streams.has(handle2), "Handle has been found");
+ equal(registry.streams.get(handle2), stream, "Expected stream found");
+
+ notEqual(handle1, handle2, "Different handles have been generated");
+});
+
+add_task(async function test_addInvalidStreamType() {
+ const registry = new StreamRegistry();
+ Assert.throws(() => registry.add(new Blob([])), /UnsupportedError/);
+});
+
+add_task(async function test_getForValidHandle() {
+ const registry = new StreamRegistry();
+ const stream = await createFileStream("foo bar");
+ const handle = registry.add(stream);
+
+ equal(registry.streams.size, 1, "A single stream has been added");
+ equal(registry.get(handle), stream, "Expected stream found");
+});
+
+add_task(async function test_getForInvalidHandle() {
+ const registry = new StreamRegistry();
+ const stream = await createFileStream("foo bar");
+ registry.add(stream);
+
+ equal(registry.streams.size, 1, "A single stream has been added");
+ Assert.throws(() => registry.get("foo"), /TypeError/);
+});
+
+add_task(async function test_removeForValidHandle() {
+ const registry = new StreamRegistry();
+ const stream1 = await createFileStream("foo bar");
+ const stream2 = await createFileStream("foo bar");
+
+ const handle1 = registry.add(stream1);
+ const handle2 = registry.add(stream2);
+
+ equal(registry.streams.size, 2);
+
+ await registry.remove(handle1);
+ equal(registry.streams.size, 1);
+ equal(registry.get(handle2), stream2, "Second stream has not been closed");
+
+ ok(
+ !(await IOUtils.exists(stream1.path)),
+ "temporary file for first stream is removed"
+ );
+ ok(
+ await IOUtils.exists(stream2.path),
+ "temporary file for second stream is not removed"
+ );
+});
+
+add_task(async function test_removeForInvalidHandle() {
+ const registry = new StreamRegistry();
+ const stream = await createFileStream("foo bar");
+ registry.add(stream);
+
+ equal(registry.streams.size, 1, "A single stream has been added");
+ await Assert.rejects(registry.remove("foo"), /TypeError/);
+});
+
+/**
+ * Create a stream with the specified contents.
+ *
+ * @param {string} contents
+ * Contents of the file.
+ * @param {object} options
+ * @param {string=} options.path
+ * Path of the file. Defaults to the temporary directory.
+ * @param {boolean=} options.remove
+ * If true, automatically remove the file after the test. Defaults to true.
+ *
+ * @returns {Promise<Stream>}
+ */
+async function createFileStream(contents, options = {}) {
+ let { path = null, remove = true } = options;
+
+ if (!path) {
+ path = await IOUtils.createUniqueFile(
+ PathUtils.tempDir,
+ "remote-agent.txt"
+ );
+ }
+
+ await IOUtils.writeUTF8(path, contents);
+
+ const stream = new Stream(path);
+ if (remove) {
+ registerCleanupFunction(() => stream.destroy());
+ }
+
+ return stream;
+}