common = require("../common"); assert = common.assert var net = require("net"), repl = require("repl"), message = "Read, Eval, Print Loop", unix_socket_path = "/tmp/node-repl-sock", prompt_unix = "node via Unix socket> ", prompt_tcp = "node via TCP socket> ", prompt_multiline = "... ", server_tcp, server_unix, client_tcp, client_unix, timer; // absolute path to test/fixtures/a.js var moduleFilename = require("path").join(common.fixturesDir, "a.js"); common.error('repl test'); // function for REPL to run invoke_me = function (arg) { return "invoked " + arg; }; function send_expect(list) { if (list.length > 0) { var cur = list.shift(); common.error("sending " + JSON.stringify(cur.send)); cur.client.expect = cur.expect; cur.client.list = list; if (cur.send.length > 0) { cur.client.write(cur.send); } } } function clean_up() { client_tcp.end(); client_unix.end(); clearTimeout(timer); } function error_test() { // The other stuff is done so reuse unix socket var read_buffer = ""; client_unix.removeAllListeners('data'); client_unix.addListener('data', function (data) { read_buffer += data.toString('ascii', 0, data.length); common.error("Unix data: " + JSON.stringify(read_buffer) + ", expecting " + (client_unix.expect.exec ? client_unix.expect : JSON.stringify(client_unix.expect))); if (read_buffer.indexOf(prompt_unix) !== -1) { assert.ok(read_buffer.match(client_unix.expect)); common.error("match"); read_buffer = ""; if (client_unix.list && client_unix.list.length > 0) { send_expect(client_unix.list); } else { common.error("End of Error test, running TCP test."); tcp_test(); } } else if(read_buffer === prompt_multiline) { // Check that you meant to send a multiline test assert.strictEqual(prompt_multiline, client_unix.expect); read_buffer = ""; if (client_unix.list && client_unix.list.length > 0) { send_expect(client_unix.list); } else { common.error("End of Error test, running TCP test.\n"); tcp_test(); } } else { common.error("didn't see prompt yet, buffering."); } }); send_expect([ // Uncaught error throws and prints out { client: client_unix, send: "throw new Error('test error');", expect: /^Error: test error/ }, // Common syntax error is treated as multiline command { client: client_unix, send: "function test_func() {", expect: prompt_multiline }, // You can recover with the .break command { client: client_unix, send: ".break", expect: prompt_unix }, // Can parse valid JSON { client: client_unix, send: "JSON.parse('{\"valid\": \"json\"}');", expect: "{ valid: 'json' }"}, // invalid input to JSON.parse error is special case of syntax error, should throw { client: client_unix, send: "JSON.parse('{invalid: \\'json\\'}');", expect: /^SyntaxError: Unexpected token ILLEGAL/ } ]); } function tcp_test() { server_tcp = net.createServer(function (socket) { assert.strictEqual(server_tcp, socket.server); assert.strictEqual(server_tcp.type, 'tcp4'); socket.addListener("end", function () { socket.end(); }); repl.start(prompt_tcp, socket); }); server_tcp.listen(common.PORT, function () { var read_buffer = ""; client_tcp = net.createConnection(common.PORT); client_tcp.addListener('connect', function () { assert.equal(true, client_tcp.readable); assert.equal(true, client_tcp.writable); send_expect([ { client: client_tcp, send: "", expect: prompt_tcp }, { client: client_tcp, send: "invoke_me(333)\n", expect: ('\'' + "invoked 333" + '\'\n' + prompt_tcp) }, { client: client_tcp, send: "a += 1\n", expect: ("12346" + '\n' + prompt_tcp) }, { client: client_tcp, send: "require('" + moduleFilename + "').number\n", expect: ("42" + '\n' + prompt_tcp) } ]); }); client_tcp.addListener('data', function (data) { read_buffer += data.toString('ascii', 0, data.length); common.error("TCP data: " + JSON.stringify(read_buffer) + ", expecting " + JSON.stringify(client_tcp.expect)); if (read_buffer.indexOf(prompt_tcp) !== -1) { assert.strictEqual(client_tcp.expect, read_buffer); common.error("match"); read_buffer = ""; if (client_tcp.list && client_tcp.list.length > 0) { send_expect(client_tcp.list); } else { common.error("End of TCP test.\n"); clean_up(); } } else { common.error("didn't see prompt yet, buffering"); } }); client_tcp.addListener("error", function (e) { throw e; }); client_tcp.addListener("close", function () { server_tcp.close(); }); }); } function unix_test() { server_unix = net.createServer(function (socket) { assert.strictEqual(server_unix, socket.server); assert.strictEqual(server_unix.type, 'unix'); socket.addListener("end", function () { socket.end(); }); repl.start(prompt_unix, socket).context.message = message; }); server_unix.addListener('listening', function () { var read_buffer = ""; client_unix = net.createConnection(unix_socket_path); client_unix.addListener('connect', function () { assert.equal(true, client_unix.readable); assert.equal(true, client_unix.writable); send_expect([ { client: client_unix, send: "", expect: prompt_unix }, { client: client_unix, send: "message\n", expect: ('\'' + message + '\'\n' + prompt_unix) }, { client: client_unix, send: "invoke_me(987)\n", expect: ('\'' + "invoked 987" + '\'\n' + prompt_unix) }, { client: client_unix, send: "a = 12345\n", expect: ("12345" + '\n' + prompt_unix) } ]); }); client_unix.addListener('data', function (data) { read_buffer += data.toString('ascii', 0, data.length); common.error("Unix data: " + JSON.stringify(read_buffer) + ", expecting " + JSON.stringify(client_unix.expect)); if (read_buffer.indexOf(prompt_unix) !== -1) { assert.strictEqual(client_unix.expect, read_buffer); common.error("match"); read_buffer = ""; if (client_unix.list && client_unix.list.length > 0) { send_expect(client_unix.list); } else { common.error("End of Unix test, running Error test.\n"); process.nextTick(error_test); } } else { common.error("didn't see prompt yet, buffering."); } }); client_unix.addListener("error", function (e) { throw e; }); client_unix.addListener("close", function () { server_unix.close(); }); }); server_unix.listen(unix_socket_path); } unix_test(); timer = setTimeout(function () { assert.fail("Timeout"); }, 1000);