summaryrefslogtreecommitdiffstats
path: root/devtools/shared/transport/tests/unit/test_transport_bulk.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/shared/transport/tests/unit/test_transport_bulk.js')
-rw-r--r--devtools/shared/transport/tests/unit/test_transport_bulk.js148
1 files changed, 148 insertions, 0 deletions
diff --git a/devtools/shared/transport/tests/unit/test_transport_bulk.js b/devtools/shared/transport/tests/unit/test_transport_bulk.js
new file mode 100644
index 000000000..a21216acf
--- /dev/null
+++ b/devtools/shared/transport/tests/unit/test_transport_bulk.js
@@ -0,0 +1,148 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+var { FileUtils } = Cu.import("resource://gre/modules/FileUtils.jsm", {});
+
+function run_test() {
+ initTestDebuggerServer();
+
+ add_task(function* () {
+ yield test_bulk_transfer_transport(socket_transport);
+ yield test_bulk_transfer_transport(local_transport);
+ DebuggerServer.destroy();
+ });
+
+ run_next_test();
+}
+
+/** * Tests ***/
+
+/**
+ * This tests a one-way bulk transfer at the transport layer.
+ */
+var test_bulk_transfer_transport = Task.async(function* (transportFactory) {
+ do_print("Starting bulk transfer test at " + new Date().toTimeString());
+
+ let clientDeferred = defer();
+ let serverDeferred = defer();
+
+ // Ensure test files are not present from a failed run
+ cleanup_files();
+ let reallyLong = really_long();
+ writeTestTempFile("bulk-input", reallyLong);
+
+ do_check_eq(Object.keys(DebuggerServer._connections).length, 0);
+
+ let transport = yield transportFactory();
+
+ // Sending from client to server
+ function write_data({copyFrom}) {
+ NetUtil.asyncFetch({
+ uri: NetUtil.newURI(getTestTempFile("bulk-input")),
+ loadUsingSystemPrincipal: true
+ }, function (input, status) {
+ copyFrom(input).then(() => {
+ input.close();
+ });
+ });
+ }
+
+ // Receiving on server from client
+ function on_bulk_packet({actor, type, length, copyTo}) {
+ do_check_eq(actor, "root");
+ do_check_eq(type, "file-stream");
+ do_check_eq(length, reallyLong.length);
+
+ let outputFile = getTestTempFile("bulk-output", true);
+ outputFile.create(Ci.nsIFile.NORMAL_FILE_TYPE, parseInt("666", 8));
+
+ let output = FileUtils.openSafeFileOutputStream(outputFile);
+
+ copyTo(output).then(() => {
+ FileUtils.closeSafeFileOutputStream(output);
+ return verify();
+ }).then(() => {
+ // It's now safe to close
+ transport.hooks.onClosed = () => {
+ clientDeferred.resolve();
+ };
+ transport.close();
+ });
+ }
+
+ // Client
+ transport.hooks = {
+ onPacket: function (aPacket) {
+ // We've received the initial start up packet
+ do_check_eq(aPacket.from, "root");
+
+ // Server
+ do_check_eq(Object.keys(DebuggerServer._connections).length, 1);
+ do_print(Object.keys(DebuggerServer._connections));
+ for (let connId in DebuggerServer._connections) {
+ DebuggerServer._connections[connId].onBulkPacket = on_bulk_packet;
+ }
+
+ DebuggerServer.on("connectionchange", (event, type) => {
+ if (type === "closed") {
+ serverDeferred.resolve();
+ }
+ });
+
+ transport.startBulkSend({
+ actor: "root",
+ type: "file-stream",
+ length: reallyLong.length
+ }).then(write_data);
+ },
+
+ onClosed: function () {
+ do_throw("Transport closed before we expected");
+ }
+ };
+
+ transport.ready();
+
+ return promise.all([clientDeferred.promise, serverDeferred.promise]);
+});
+
+/** * Test Utils ***/
+
+function verify() {
+ let reallyLong = really_long();
+
+ let inputFile = getTestTempFile("bulk-input");
+ let outputFile = getTestTempFile("bulk-output");
+
+ do_check_eq(inputFile.fileSize, reallyLong.length);
+ do_check_eq(outputFile.fileSize, reallyLong.length);
+
+ // Ensure output file contents actually match
+ let compareDeferred = defer();
+ NetUtil.asyncFetch({
+ uri: NetUtil.newURI(getTestTempFile("bulk-output")),
+ loadUsingSystemPrincipal: true
+ }, input => {
+ let outputData = NetUtil.readInputStreamToString(input, reallyLong.length);
+ // Avoid do_check_eq here so we don't log the contents
+ do_check_true(outputData === reallyLong);
+ input.close();
+ compareDeferred.resolve();
+ });
+
+ return compareDeferred.promise.then(cleanup_files);
+}
+
+function cleanup_files() {
+ let inputFile = getTestTempFile("bulk-input", true);
+ if (inputFile.exists()) {
+ inputFile.remove(false);
+ }
+
+ let outputFile = getTestTempFile("bulk-output", true);
+ if (outputFile.exists()) {
+ outputFile.remove(false);
+ }
+}