Make test/*.js into a proper testsuite.

This commit is contained in:
Chris Andrews
2012-11-23 22:06:45 +00:00
parent 1ac5983177
commit 305af8e4dd
22 changed files with 326 additions and 189 deletions
+1
View File
@@ -5,3 +5,4 @@
*#
build
*.log
node_modules
+5
View File
@@ -107,6 +107,11 @@ The source is available at:
For issues, please use the Github issue tracker linked to the
repository. Github pull requests are very welcome.
## RUNNING THE TESTS
$ npm install
$ sudo ./node_modules/.bin/tap --tap test/*.test.js
## OTHER IMPLEMENTATIONS
This node extension is derived from the ruby-dtrace gem, via the Perl
+20 -9
View File
@@ -1,11 +1,22 @@
{
"name" : "dtrace-provider",
"version" : "0.2.4",
"description" : "Native DTrace providers for node.js applications",
"keywords" : ["dtrace"],
"homepage" : "https://github.com/chrisa/node-dtrace-provider#readme",
"author" : { "name" : "Chris Andrews", "email": "[email protected]" },
"main" : "./dtrace-provider.js",
"repository" : { "type" : "git", "url" : "http://github.com/chrisa/node-dtrace-provider.git" },
"engines": { "node" : ">=0.6" }
"name" : "dtrace-provider",
"version" : "0.2.4",
"description" : "Native DTrace providers for node.js applications",
"keywords" : ["dtrace"],
"homepage" : "https://github.com/chrisa/node-dtrace-provider#readme",
"author" : {
"name" : "Chris Andrews",
"email": "chris@nodnol.org"
},
"repository" : {
"type" : "git",
"url" : "http://github.com/chrisa/node-dtrace-provider.git"
},
"engines" : {
"node" : ">=0.6"
},
"devDependencies": {
"tap": "0.2.0"
},
"main" : "./dtrace-provider.js"
}
+41
View File
@@ -0,0 +1,41 @@
var test = require('tap').test;
var format = require('util').format;
var dtest = require('./dtrace-test').dtraceTest;
test(
'32-arg probe',
dtest(
function() {
var d = require('../dtrace-provider');
// define this provider here, even though we won't fire it, so that we
// can start dtrace with an otherwise unstable set of probes - -Z
// won't work here.
var provider = d.createDTraceProvider("testlibusdt");
var p = provider.addProbe(
"32probe",
"char *", "char *", "char *", "char *", "char *", "char *", "char *", "char *",
"char *", "char *", "char *", "char *", "char *", "char *", "char *", "char *",
"char *", "char *", "char *", "char *", "char *", "char *", "char *", "char *",
"char *", "char *", "char *", "char *", "char *", "char *", "char *", "char *");
provider.enable();
},
['dtrace', '-qn',
'testlibusdt*:::32probe{ printf("%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s\\n", copyinstr((user_addr_t)args[0]), copyinstr((user_addr_t)args[1]), copyinstr((user_addr_t)args[2]), copyinstr((user_addr_t)args[3]), copyinstr((user_addr_t)args[4]), copyinstr((user_addr_t)args[5]), copyinstr((user_addr_t)args[6]), copyinstr((user_addr_t)args[7]), copyinstr((user_addr_t)args[8]), copyinstr((user_addr_t)args[9]), copyinstr((user_addr_t)args[10]), copyinstr((user_addr_t)args[11]), copyinstr((user_addr_t)args[12]), copyinstr((user_addr_t)args[13]), copyinstr((user_addr_t)args[14]), copyinstr((user_addr_t)args[15]), copyinstr((user_addr_t)args[16]), copyinstr((user_addr_t)args[17]), copyinstr((user_addr_t)args[18]), copyinstr((user_addr_t)args[19]), copyinstr((user_addr_t)args[20]), copyinstr((user_addr_t)args[21]), copyinstr((user_addr_t)args[22]), copyinstr((user_addr_t)args[23]), copyinstr((user_addr_t)args[24]), copyinstr((user_addr_t)args[25]), copyinstr((user_addr_t)args[26]), copyinstr((user_addr_t)args[27]), copyinstr((user_addr_t)args[28]), copyinstr((user_addr_t)args[29]), copyinstr((user_addr_t)args[30]), copyinstr((user_addr_t)args[31])); }',
'-c', format('node %s/32probe-char_fire.js', __dirname)
],
function(t, traces) {
t.equal(traces.length, 1);
var letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F'];
var traced = traces[0].split(' ');
for (var i = 0; i < 32; i++) {
t.equal(traced[i], letters[i],
format('arg%d of a 32-arg probe firing should be %s', i, letters[i]));
}
}
)
);
+22
View File
@@ -0,0 +1,22 @@
// see 32probe-char.test.js
var d = require('../dtrace-provider');
var provider = d.createDTraceProvider("testlibusdt");
var probe = provider.addProbe(
"32probe",
"char *", "char *", "char *", "char *", "char *", "char *", "char *", "char *",
"char *", "char *", "char *", "char *", "char *", "char *", "char *", "char *",
"char *", "char *", "char *", "char *", "char *", "char *", "char *", "char *",
"char *", "char *", "char *", "char *", "char *", "char *", "char *", "char *");
provider.enable();
var letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F'];
probe.fire(function(p) {
return letters;
});
+39
View File
@@ -0,0 +1,39 @@
var test = require('tap').test;
var format = require('util').format;
var dtest = require('./dtrace-test').dtraceTest;
test(
'32-arg probe',
dtest(
function() {
var d = require('../dtrace-provider');
// define this provider here, even though we won't fire it, so that we
// can start dtrace with an otherwise unstable set of probes - -Z
// won't work here.
var provider = d.createDTraceProvider("testlibusdt");
var probe = provider.addProbe("32probe",
"int", "int", "int", "int", "int", "int", "int", "int",
"int", "int", "int", "int", "int", "int", "int", "int",
"int", "int", "int", "int", "int", "int", "int", "int",
"int", "int", "int", "int", "int", "int", "int", "int");
provider.enable();
},
['dtrace', '-qn',
'testlibusdt*:::32probe{ printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\\n", args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9], args[10], args[11], args[12], args[13], args[14], args[15], args[16], args[17], args[18], args[19], args[20], args[21], args[22], args[23], args[24], args[25], args[26], args[27], args[28], args[29], args[30], args[31]) }',
'-c', format('node %s/32probe_fire.js', __dirname)
],
function(t, traces) {
t.equal(traces.length, 32, 'got 32 traces');
var args = [];
for (var i = 1; i <= 32; i++) {
args.push(i);
var traced = traces[i - 1].split(' ');
args.forEach(function(n) {
t.equal(traced[n - 1], [n].toString(),
format('arg%d of a %d-arg probe firing should be %d', n - 1, i, n));
});
}
}
)
);
+21
View File
@@ -0,0 +1,21 @@
// see 32probe.test.js
var d = require('../dtrace-provider');
var provider = d.createDTraceProvider("testlibusdt");
var probe = provider.addProbe(
"32probe",
"int", "int", "int", "int", "int", "int", "int", "int",
"int", "int", "int", "int", "int", "int", "int", "int",
"int", "int", "int", "int", "int", "int", "int", "int",
"int", "int", "int", "int", "int", "int", "int", "int");
provider.enable();
var args = [];
for (var n = 1; n <= 32; n++) {
args.push(n);
probe.fire(function(p) {
return args;
});
}
-28
View File
@@ -1,28 +0,0 @@
// expected output:
//
// $ NODE_PATH=. sudo -E dtrace -Zn 'test*:::{trace(probemod)}' -c 'node test/disambiguation.js'
// dtrace: description 'test*:::' matched 0 probes
// dtrace: pid 73913 has exited
// CPU ID FUNCTION:NAME
// 0 33495 probe1:probe1 mod-0x100a11440
// 0 33498 probe1:probe1 mod-0x100e00160
var d = require('dtrace-provider');
var dtp = d.createDTraceProvider('test');
var p1 = dtp.addProbe('probe1', 'int', 'int');
var p2 = dtp.addProbe('probe2', 'int', 'int');
dtp.enable();
var dtp2 = d.createDTraceProvider('test');
var p1 = dtp2.addProbe('probe3', 'int', 'int');
var p2 = dtp2.addProbe('probe1', 'int', 'int');
dtp2.enable();
dtp.fire('probe1', function () {
return ([12, 3]);
});
dtp2.fire('probe1', function () {
return ([12, 73]);
});
+22
View File
@@ -0,0 +1,22 @@
var test = require('tap').test;
var format = require('util').format;
var dtest = require('./dtrace-test').dtraceTest;
test(
'module name disambiguation',
dtest(
function() { },
[
'dtrace', '-Zqn',
'test*:::{printf("%s\\n%s\\n", probename, probemod)}',
'-c', format('node %s/disambiguation_fire.js', __dirname)
],
function(t, traces) {
t.equal(traces.length, 8);
t.equal(traces[0], traces[2]);
t.notEqual(traces[1], traces[3]);
t.equal(traces[4], traces[6]);
t.notEqual(traces[5], traces[7]);
}
)
);
-28
View File
@@ -1,28 +0,0 @@
// expected output:
//
// $ NODE_PATH=. sudo -E dtrace -Zn 'test*:::{trace(probemod)}' -c 'node test/disambiguation2.js'
// dtrace: description 'test*:::' matched 0 probes
// dtrace: pid 73913 has exited
// CPU ID FUNCTION:NAME
// 0 33495 probe1:probe1 mymod1
// 0 33498 probe1:probe1 mymod2
var d = require('dtrace-provider');
var dtp = d.createDTraceProvider('test', 'mymod1');
var p1 = dtp.addProbe('probe1', 'int', 'int');
var p2 = dtp.addProbe('probe2', 'int', 'int');
dtp.enable();
var dtp2 = d.createDTraceProvider('test', 'mymod2');
var p1 = dtp2.addProbe('probe3', 'int', 'int');
var p2 = dtp2.addProbe('probe1', 'int', 'int');
dtp2.enable();
dtp.fire('probe1', function () {
return ([12, 3]);
});
dtp2.fire('probe1', function () {
return ([12, 73]);
});
+37
View File
@@ -0,0 +1,37 @@
var d = require('../dtrace-provider');
var dtp = d.createDTraceProvider('test');
dtp.addProbe('probe1', 'int', 'int');
dtp.addProbe('probe2', 'int', 'int');
dtp.enable();
var dtp2 = d.createDTraceProvider('test');
dtp2.addProbe('probe3', 'int', 'int');
dtp2.addProbe('probe1', 'int', 'int');
dtp2.enable();
var dtp3 = d.createDTraceProvider('test', 'mymod1');
dtp3.addProbe('probe1', 'int', 'int');
dtp3.addProbe('probe2', 'int', 'int');
dtp3.enable();
var dtp4 = d.createDTraceProvider('test', 'mymod2');
dtp4.addProbe('probe1', 'int', 'int');
dtp4.addProbe('probe3', 'int', 'int');
dtp4.enable();
dtp.fire('probe1', function () {
return ([12, 3]);
});
dtp2.fire('probe1', function () {
return ([12, 73]);
});
dtp3.fire('probe1', function () {
return ([12, 3]);
});
dtp4.fire('probe1', function () {
return ([12, 73]);
});
-30
View File
@@ -1,30 +0,0 @@
var util = require('util');
var d = require('../dtrace-provider');
var dtp = d.createDTraceProvider("testlibusdt");
var p = dtp.addProbe("32probe", "int", "int", "int", "int", "int", "int", "int", "int",
"int", "int", "int", "int", "int", "int", "int", "int",
"int", "int", "int", "int", "int", "int", "int", "int",
"int", "int", "int", "int", "int", "int", "int", "int");
dtp.enable();
util.debug("run: sudo dtrace -n 'testlibusdt*:::32probe{ printf(\"%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\", args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9], args[10], args[11], args[12], args[13], args[14], args[15], args[16], args[17], args[18], args[19], args[20], args[21], args[22], args[23], args[24], args[25], args[26], args[27], args[28], args[29], args[30], args[31]) }'")
var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32];
setTimeout(function() {
var args = [];
numbers.forEach(function(n) {
args.push(n);
dtp.fire("32probe", function(p) {
return args;
});
p.fire(function(p) {
return args;
});
});
}, 10000);
-31
View File
@@ -1,31 +0,0 @@
var util = require('util');
var d = require('../dtrace-provider');
var dtp = d.createDTraceProvider("testlibusdt");
var p = dtp.addProbe("32probe", "char *", "char *", "char *", "char *", "char *", "char *", "char *", "char *",
"char *", "char *", "char *", "char *", "char *", "char *", "char *", "char *",
"char *", "char *", "char *", "char *", "char *", "char *", "char *", "char *",
"char *", "char *", "char *", "char *", "char *", "char *", "char *", "char *");
dtp.enable();
util.debug("run: sudo dtrace -n 'testlibusdt*:::32probe{ printf(\"%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s\", copyinstr((user_addr_t)args[0]), copyinstr((user_addr_t)args[1]), copyinstr((user_addr_t)args[2]), copyinstr((user_addr_t)args[3]), copyinstr((user_addr_t)args[4]), copyinstr((user_addr_t)args[5]), copyinstr((user_addr_t)args[6]), copyinstr((user_addr_t)args[7]), copyinstr((user_addr_t)args[8]), copyinstr((user_addr_t)args[9]), copyinstr((user_addr_t)args[10]), copyinstr((user_addr_t)args[11]), copyinstr((user_addr_t)args[12]), copyinstr((user_addr_t)args[13]), copyinstr((user_addr_t)args[14]), copyinstr((user_addr_t)args[15]), copyinstr((user_addr_t)args[16]), copyinstr((user_addr_t)args[17]), copyinstr((user_addr_t)args[18]), copyinstr((user_addr_t)args[19]), copyinstr((user_addr_t)args[20]), copyinstr((user_addr_t)args[21]), copyinstr((user_addr_t)args[22]), copyinstr((user_addr_t)args[23]), copyinstr((user_addr_t)args[24]), copyinstr((user_addr_t)args[25]), copyinstr((user_addr_t)args[26]), copyinstr((user_addr_t)args[27]), copyinstr((user_addr_t)args[28]), copyinstr((user_addr_t)args[29]), copyinstr((user_addr_t)args[30]), copyinstr((user_addr_t)args[31])); }'")
var letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F'];
setTimeout(function() {
var args = [];
letters.forEach(function(l) {
args.push(l);
dtp.fire("32probe", function(p) {
return args;
});
p.fire(function(p) {
return args;
});
});
}, 10000);
+27
View File
@@ -0,0 +1,27 @@
var spawn = require('child_process').spawn;
exports.dtraceTest = function(setup, dtargv, test) {
return function(t) {
setup();
var dtrace = spawn(dtargv[0], dtargv.slice(1));
var traces = [];
dtrace.stdout.on('data', function (data) {
//console.error("DTRACE STDOUT:", data.toString());
traces.push(data.toString());
});
dtrace.stderr.on('data', function (data) {
console.error("DTRACE STDERR:", data.toString());
});
dtrace.on('exit', function (code) {
t.notOk(code, 'dtrace exited cleanly');
traces = traces.join('').split('\n')
.filter(function (t) { return t.trim().length });
test(t, traces);
t.end();
});
};
}
-19
View File
@@ -1,19 +0,0 @@
// expected output:
//
// $ sudo dtrace -Zn 'nodeapp*:::{ trace(arg0); }' -c 'node test/enabled-again.js'
// dtrace: description 'nodeapp*:::' matched 0 probes
// CPU ID FUNCTION:NAME
// 1 5456 func:probe1 1
// 1 5456 func:probe1 2
var d = require('../dtrace-provider');
var dtp = d.createDTraceProvider("nodeapp");
dtp.addProbe("probe1", "int");
dtp.enable();
dtp.fire("probe1", function(p) { return [1]; });
for (var i = 0; i<100; i++) {
dtp.enable();
}
dtp.fire("probe1", function(p) { return [2]; });
setTimeout(function() { }, 1000);
-22
View File
@@ -1,22 +0,0 @@
// expected output:
//
// $ sudo dtrace -Zn 'nodeapp*:::{ trace(arg0); }' -c 'node test/enabled-again.js'
// dtrace: description 'nodeapp*:::' matched 0 probes
// CPU ID FUNCTION:NAME
// 1 5456 func:probe1 1
// 1 5456 func:probe1 2
var d = require('../dtrace-provider');
var dtp = d.createDTraceProvider("nodeapp");
dtp.addProbe("probe1", "int");
dtp.enable();
dtp.fire("probe1", function(p) { return [1]; });
for (var i = 0; i < 2500; i++) {
dtp.enable();
dtp.fire("probe1", function(p) { return [i]; });
dtp.disable();
//gc();
}
dtp.fire("probe1", function(p) { return [42]; });
+22
View File
@@ -0,0 +1,22 @@
var test = require('tap').test;
var format = require('util').format;
var dtest = require('./dtrace-test').dtraceTest;
test(
'enabling and disabling a provider',
dtest(
function() { },
[
'dtrace', '-Zqn',
'nodeapp*:::{ printf("%d\\n", arg0); }',
'-c', format('node %s/enabled-disabled_fire.js', __dirname)
],
function(t, traces) {
t.equal(traces.length, 12);
for (var i = 0; i < 10; i++) {
t.equal(traces[i], [i].toString());
}
t.equal(traces[11], '42');
}
)
);
+14
View File
@@ -0,0 +1,14 @@
var d = require('../dtrace-provider');
var dtp = d.createDTraceProvider("nodeapp");
dtp.addProbe("probe1", "int");
dtp.enable();
dtp.fire("probe1", function(p) { return [0]; });
for (var i = 1; i <= 10; i++) {
dtp.enable();
dtp.fire("probe1", function(p) { return [i]; });
dtp.disable();
//gc();
}
dtp.fire("probe1", function(p) { return [42]; });
-19
View File
@@ -1,19 +0,0 @@
// expected output:
//
// $ sudo dtrace -Zn 'nodeapp*:::{ trace(arg0); }' -c 'node test/enabled_again.js'
// dtrace: description 'nodeapp*:::' matched 0 probes
// CPU ID FUNCTION:NAME
// 1 5456 func:probe1 1
// 1 5456 func:probe1 2
var d = require('../dtrace-provider');
var dtp = d.createDTraceProvider("nodeapp");
dtp.addProbe("probe1", "int");
dtp.enable();
dtp.fire("probe1", function(p) { return [1]; });
for (var i = 0; i<100; i++) {
dtp.enable();
}
dtp.fire("probe1", function(p) { return [2]; });
setTimeout(function() { }, 1000);
+34
View File
@@ -0,0 +1,34 @@
var test = require('tap').test;
var format = require('util').format;
var dtest = require('./dtrace-test').dtraceTest;
test(
'provider enabled again',
dtest(
function() { },
[
'dtrace', '-Zqn',
'nodeapp$target:::{ printf("%d %d\\n", epid, arg0); }',
'-c', format('node %s/enabledagain_fire.js', __dirname)
],
function(t, traces) {
t.equal(traces.length, 2, 'got 2 traces');
var i = 1;
var epid;
traces.forEach(function(trace) {
cols = trace.split(' ');
t.equal([i].toString(), cols[1], 'traced value correct');
if (epid) {
t.equal(epid, cols[0], 'same epid');
}
else {
epid = cols[0];
}
i++;
});
}
)
);
@@ -1,7 +1,7 @@
var d = require('../dtrace-provider');
var dtp = d.createDTraceProvider("nodeapp");
dtp.addProbe("probe1", "int");
//dtp.enable();
dtp.enable();
dtp.fire("probe1", function(p) { return [1]; });
dtp.enable();
dtp.fire("probe1", function(p) { return [2]; });
+18
View File
@@ -0,0 +1,18 @@
var test = require('tap').test;
var d = require('../dtrace-provider');
test(
'firing probes when provider not enabled',
function(t) {
var dtp = d.createDTraceProvider("nodeapp");
dtp.addProbe("probe1", "int");
//dtp.enable();
dtp.fire("probe1", function(p) {
t.notOk();
return [1];
});
t.ok(1, 'no problem');
t.end();
}
);