diff options
Diffstat (limited to '')
-rw-r--r-- | remote/test/unit/test_StreamRegistry.js | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/remote/test/unit/test_StreamRegistry.js b/remote/test/unit/test_StreamRegistry.js new file mode 100644 index 0000000000..ed68577540 --- /dev/null +++ b/remote/test/unit/test_StreamRegistry.js @@ -0,0 +1,172 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +const { AsyncShutdown } = ChromeUtils.import( + "resource://gre/modules/AsyncShutdown.jsm" +); +const { OS } = ChromeUtils.import("resource://gre/modules/osfile.jsm"); +const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm"); + +const { StreamRegistry } = ChromeUtils.import( + "chrome://remote/content/StreamRegistry.jsm" +); + +add_test(function test_constructor() { + const registry = new StreamRegistry(); + equal(registry.streams.size, 0); + + run_next_test(); +}); + +add_test(async function test_destructor() { + const registry = new StreamRegistry(); + const { file: file1, path: path1 } = await createFile("foo bar"); + const { file: file2, path: path2 } = await createFile("foo bar"); + + registry.add(file1); + registry.add(file2); + + equal(registry.streams.size, 2); + + await registry.destructor(); + equal(registry.streams.size, 0); + ok(!(await OS.File.exists(path1)), "temporary file has been removed"); + ok(!(await OS.File.exists(path2)), "temporary file has been removed"); + + run_next_test(); +}); + +add_test(async function test_addValidStreamType() { + const registry = new StreamRegistry(); + const { file } = await createFile("foo bar"); + + const handle = registry.add(file); + 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"); + equal(registry.streams.get(handle), file, "Expected OS.File stream found"); + + run_next_test(); +}); + +add_test(async function test_addCreatesDifferentHandles() { + const registry = new StreamRegistry(); + const { file } = await createFile("foo bar"); + + const handle1 = registry.add(file); + 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), file, "Expected OS.File stream found"); + + const handle2 = registry.add(file); + 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), file, "Expected OS.File stream found"); + + notEqual(handle1, handle2, "Different handles have been generated"); + + run_next_test(); +}); + +add_test(async function test_addInvalidStreamType() { + const registry = new StreamRegistry(); + Assert.throws(() => registry.add(new Blob([])), /UnsupportedError/); + + run_next_test(); +}); + +add_test(async function test_getForValidHandle() { + const registry = new StreamRegistry(); + const { file } = await createFile("foo bar"); + const handle = registry.add(file); + + equal(registry.streams.size, 1, "A single stream has been added"); + equal(registry.get(handle), file, "Expected OS.File stream found"); + + run_next_test(); +}); + +add_test(async function test_getForInvalidHandle() { + const registry = new StreamRegistry(); + const { file } = await createFile("foo bar"); + registry.add(file); + + equal(registry.streams.size, 1, "A single stream has been added"); + Assert.throws(() => registry.get("foo"), /TypeError/); + + run_next_test(); +}); + +add_test(async function test_removeForValidHandle() { + const registry = new StreamRegistry(); + const { file: file1, path: path1 } = await createFile("foo bar"); + const { file: file2, path: path2 } = await createFile("foo bar"); + + const handle1 = registry.add(file1); + const handle2 = registry.add(file2); + + equal(registry.streams.size, 2); + + await registry.remove(handle1); + equal(registry.streams.size, 1); + ok( + !(await OS.File.exists(path1)), + "temporary file for first stream has been removed" + ); + equal(registry.get(handle2), file2, "Second stream has not been closed"); + ok( + await OS.File.exists(path2), + "temporary file for second stream hasn't been removed" + ); + + run_next_test(); +}); + +add_test(async function test_removeForInvalidHandle() { + const registry = new StreamRegistry(); + const { file } = await createFile("foo bar"); + registry.add(file); + + equal(registry.streams.size, 1, "A single stream has been added"); + await Assert.rejects(registry.remove("foo"), /TypeError/); + + run_next_test(); +}); + +async function createFile(contents, options = {}) { + let { path = null, remove = true } = options; + + if (!path) { + const basePath = OS.Path.join(OS.Constants.Path.tmpDir, "remote-agent.txt"); + const { file, path: tmpPath } = await OS.File.openUnique(basePath, { + humanReadable: true, + }); + await file.close(); + path = tmpPath; + } + + let encoder = new TextEncoder(); + let array = encoder.encode(contents); + + const count = await OS.File.writeAtomic(path, array, { + encoding: "utf-8", + tmpPath: path + ".tmp", + }); + equal(count, contents.length, "All data has been written to file"); + + const file = await OS.File.open(path); + + // Automatically remove the file once the test has finished + if (remove) { + registerCleanupFunction(async () => { + await file.close(); + await OS.File.remove(path, { ignoreAbsent: true }); + }); + } + + return { file, path }; +} |