michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: http://creativecommons.org/publicdomain/zero/1.0/ */ michael@0: michael@0: Cu.import("resource://gre/modules/devtools/dbg-server.jsm"); michael@0: Cu.import("resource://gre/modules/devtools/dbg-client.jsm"); michael@0: michael@0: let port = 2929; michael@0: michael@0: function run_test() michael@0: { michael@0: do_print("Starting test at " + new Date().toTimeString()); michael@0: initTestDebuggerServer(); michael@0: michael@0: add_test(test_socket_conn); michael@0: add_test(test_socket_shutdown); michael@0: add_test(test_pipe_conn); michael@0: michael@0: run_next_test(); michael@0: } michael@0: michael@0: function really_long() { michael@0: let ret = "0123456789"; michael@0: for (let i = 0; i < 18; i++) { michael@0: ret += ret; michael@0: } michael@0: return ret; michael@0: } michael@0: michael@0: function test_socket_conn() michael@0: { michael@0: do_check_eq(DebuggerServer._socketConnections, 0); michael@0: try_open_listener(); michael@0: do_print("Debugger server port is " + port); michael@0: do_check_eq(DebuggerServer._socketConnections, 1); michael@0: // Make sure opening the listener twice does nothing. michael@0: do_check_true(DebuggerServer.openListener(port)); michael@0: do_check_eq(DebuggerServer._socketConnections, 1); michael@0: michael@0: do_print("Starting long and unicode tests at " + new Date().toTimeString()); michael@0: let unicodeString = "(╯°□°)╯︵ ┻━┻"; michael@0: let transport = debuggerSocketConnect("127.0.0.1", port); michael@0: transport.hooks = { michael@0: onPacket: function(aPacket) { michael@0: this.onPacket = function(aPacket) { michael@0: do_check_eq(aPacket.unicode, unicodeString); michael@0: transport.close(); michael@0: } michael@0: // Verify that things work correctly when bigger than the output michael@0: // transport buffers and when transporting unicode... michael@0: transport.send({to: "root", michael@0: type: "echo", michael@0: reallylong: really_long(), michael@0: unicode: unicodeString}); michael@0: do_check_eq(aPacket.from, "root"); michael@0: }, michael@0: onClosed: function(aStatus) { michael@0: run_next_test(); michael@0: }, michael@0: }; michael@0: transport.ready(); michael@0: } michael@0: michael@0: function test_socket_shutdown() michael@0: { michael@0: do_check_eq(DebuggerServer._socketConnections, 1); michael@0: do_check_true(DebuggerServer.closeListener()); michael@0: do_check_eq(DebuggerServer._socketConnections, 0); michael@0: // Make sure closing the listener twice does nothing. michael@0: do_check_false(DebuggerServer.closeListener()); michael@0: do_check_eq(DebuggerServer._socketConnections, 0); michael@0: michael@0: do_print("Connecting to a server socket at " + new Date().toTimeString()); michael@0: let transport = debuggerSocketConnect("127.0.0.1", port); michael@0: transport.hooks = { michael@0: onPacket: function(aPacket) { michael@0: // Shouldn't reach this, should never connect. michael@0: do_check_true(false); michael@0: }, michael@0: michael@0: onClosed: function(aStatus) { michael@0: do_print("test_socket_shutdown onClosed called at " + new Date().toTimeString()); michael@0: // The connection should be refused here, but on slow or overloaded michael@0: // machines it may just time out. michael@0: let expected = [ Cr.NS_ERROR_CONNECTION_REFUSED, Cr.NS_ERROR_NET_TIMEOUT ]; michael@0: do_check_neq(expected.indexOf(aStatus), -1); michael@0: run_next_test(); michael@0: } michael@0: }; michael@0: michael@0: // Hack to get more logging for bug 775924. michael@0: transport.onDataAvailable = makeInfallible(function DT_onDataAvailable(aRequest, aContext, michael@0: aStream, aOffset, aCount) { michael@0: do_print("onDataAvailable. offset: "+aOffset+", count: "+aCount); michael@0: let buf = NetUtil.readInputStreamToString(aStream, aStream.available()); michael@0: transport._incoming += buf; michael@0: do_print("Read form stream("+buf.length+"): "+buf); michael@0: while (transport._processIncoming()) { michael@0: do_print("Look ma, I'm looping!"); michael@0: }; michael@0: }, "DebuggerTransport.prototype.onDataAvailable"); michael@0: michael@0: do_print("Initializing input stream at " + new Date().toTimeString()); michael@0: transport.ready(); michael@0: } michael@0: michael@0: function test_pipe_conn() michael@0: { michael@0: let transport = DebuggerServer.connectPipe(); michael@0: transport.hooks = { michael@0: onPacket: function(aPacket) { michael@0: do_check_eq(aPacket.from, "root"); michael@0: transport.close(); michael@0: }, michael@0: onClosed: function(aStatus) { michael@0: run_next_test(); michael@0: } michael@0: }; michael@0: michael@0: transport.ready(); michael@0: } michael@0: michael@0: function try_open_listener() michael@0: { michael@0: try { michael@0: do_check_true(DebuggerServer.openListener(port)); michael@0: } catch (e) { michael@0: // In case the port is unavailable, pick a random one between 2000 and 65000. michael@0: port = Math.floor(Math.random() * (65000 - 2000 + 1)) + 2000; michael@0: try_open_listener(); michael@0: } michael@0: } michael@0: michael@0: // Copied verbatim from dbg-transport.js. michael@0: // Hack to get more logging for bug 775924. michael@0: function makeInfallible(aHandler, aName) { michael@0: if (!aName) michael@0: aName = aHandler.name; michael@0: michael@0: return function (/* arguments */) { michael@0: try { michael@0: return aHandler.apply(this, arguments); michael@0: } catch (ex) { michael@0: let msg = "Handler function "; michael@0: if (aName) { michael@0: msg += aName + " "; michael@0: } michael@0: msg += "threw an exception: " + DevToolsUtils.safeErrorString(ex); michael@0: if (ex.stack) { michael@0: msg += "\nCall stack:\n" + ex.stack; michael@0: } michael@0: michael@0: do_print(msg + "\n"); michael@0: michael@0: if (Cu.reportError) { michael@0: /* michael@0: * Note that the xpcshell test harness registers an observer for michael@0: * console messages, so when we're running tests, this will cause michael@0: * the test to quit. michael@0: */ michael@0: Cu.reportError(msg); michael@0: } michael@0: return undefined; michael@0: } michael@0: } michael@0: }