debugger: fix --debug-brk
authortasogarepg <tasogare.pg@gmail.com>
Fri, 7 Sep 2012 18:18:39 +0000 (03:18 +0900)
committerFedor Indutny <fedor.indutny@gmail.com>
Tue, 18 Sep 2012 06:56:37 +0000 (10:56 +0400)
lib/module.js
test/fixtures/debug-target.js [new file with mode: 0644]
test/simple/test-debug-brk-file.js [new file with mode: 0644]

index f9cf2c5..094db87 100644 (file)
@@ -439,9 +439,9 @@ Module.prototype._compile = function(content, filename) {
     if (!resolvedArgv) {
       // we enter the repl if we're not given a filename argument.
       if (process.argv[1]) {
-        resolvedArg = Module._resolveFilename(process.argv[1], null);
+        resolvedArgv = Module._resolveFilename(process.argv[1], null);
       } else {
-        resolvedArg = 'repl';
+        resolvedArgv = 'repl';
       }
     }
 
diff --git a/test/fixtures/debug-target.js b/test/fixtures/debug-target.js
new file mode 100644 (file)
index 0000000..d617105
--- /dev/null
@@ -0,0 +1,4 @@
+var a = 0;
+a += 1;
+a += 2;
+a += 3;
diff --git a/test/simple/test-debug-brk-file.js b/test/simple/test-debug-brk-file.js
new file mode 100644 (file)
index 0000000..7b902d8
--- /dev/null
@@ -0,0 +1,87 @@
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+var common = require('../common');
+var assert = require('assert');
+var spawn = require('child_process').spawn;
+var path = require('path');
+var net = require('net');
+
+var isDone = false;
+var targetPath = path.resolve(common.fixturesDir, 'debug-target.js');
+
+var child = spawn(process.execPath, ['--debug-brk=' + common.PORT, targetPath]);
+child.stderr.on('data', function() {
+  child.emit('debug_start');
+});
+
+child.on('exit', function() {
+  assert(isDone);
+  console.log('ok');
+});
+
+child.once('debug_start', function() {
+  var msg = null;
+  var tmpBuf = '';
+
+  var conn = net.connect({port: common.PORT});
+  conn.setEncoding('utf8');
+  conn.on('data', function(data) {
+    tmpBuf += data;
+    parse();
+  });
+
+  function parse() {
+    if (!msg) {
+      msg = {
+        headers: null,
+        contentLength: 0
+      };
+    }
+    if (!msg.headers) {
+      var offset = tmpBuf.indexOf('\r\n\r\n');
+      if (offset < 0) return;
+      msg.headers = tmpBuf.substring(0, offset);
+      tmpBuf = tmpBuf.slice(offset + 4);
+      var matches = /Content-Length: (\d+)/.exec(msg.headers);
+      if (matches[1]) {
+        msg.contentLength = +(matches[1]);
+      }
+    }
+    if (msg.headers && Buffer.byteLength(tmpBuf) >= msg.contentLength) {
+      try {
+        var b = Buffer(tmpBuf);
+        var body = b.toString('utf8', 0, msg.contentLength);
+        tmpBuf = b.toString('utf8', msg.contentLength, b.length);
+        if (!body.length) return;
+        var obj = JSON.parse(body);
+        if (obj.type == 'event' && obj.event == 'break' && obj.body.script.name == targetPath) {
+          isDone = true;
+          var req = JSON.stringify({"seq":100, "type":"request", "command":"disconnect"});
+          conn.write('Content-Length: ' + req.length + '\r\n\r\n' + req);
+        }
+      } finally {
+        msg = null;
+        parse();
+      }
+    }
+  }
+});