Skip to content

Commit 76012f6

Browse files
committed
build: add coverage reporting with istanbul
1 parent d9e53bb commit 76012f6

37 files changed

+271
-140
lines changed

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
*.un~
22

3+
npm-debug.log
4+
5+
/coverage
6+
/lib-cov
37
/node_modules
48
/test/config.js
59

.npmignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
benchmark/
2+
coverage/
3+
lib-cov/
24
test/
35
tool/
46
.travis.yml

.travis.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@ node_js:
77
before_script:
88
- "mysql -e 'create database node_mysql;'"
99

10+
script:
11+
- "npm run-script test-travis"
12+
13+
after_script:
14+
- "npm install [email protected] && cat ./coverage/lcov.info | coveralls"
15+
1016
env:
1117
- MYSQL_HOST=localhost MYSQL_DATABASE=node_mysql MYSQL_USER=root MYSQL_PASSWORD=
1218

Readme.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
# mysql [![Build Status](https://travis-ci.org/felixge/node-mysql.svg?branch=master)](https://travis-ci.org/felixge/node-mysql) [![NPM version](https://badge.fury.io/js/mysql.svg)](http://badge.fury.io/js/mysql)
1+
# mysql
2+
3+
[![NPM version](https://badge.fury.io/js/mysql.svg)](http://badge.fury.io/js/mysql)
4+
[![Build Status](https://travis-ci.org/felixge/node-mysql.svg?branch=master)](https://travis-ci.org/felixge/node-mysql)
5+
[![Coverage Status](https://img.shields.io/coveralls/felixge/node-mysql.svg)](https://coveralls.io/r/felixge/node-mysql)
26

37
## Install
48

package.json

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
"require-all": "0.0.8"
1818
},
1919
"devDependencies": {
20+
"istanbul": "0.3.0",
21+
"rimraf": "2.2.8",
22+
"mkdirp": "0.5.0",
2023
"underscore": "1.6.0",
2124
"urun": "0.0.8",
2225
"utest": "0.0.8"
@@ -25,6 +28,8 @@
2528
"node": ">= 0.8"
2629
},
2730
"scripts": {
28-
"test": "node test/run.js"
31+
"test": "node test/run.js",
32+
"test-cov": "node test/run-cov.js",
33+
"test-travis": "node test/run-cov.js lcovonly"
2934
}
3035
}

test/FakeServer.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,16 @@
33

44
var common = require('./common');
55
var _ = require('underscore');
6-
var Charsets = require('../lib/protocol/constants/charsets');
6+
var Charsets = common.Charsets;
77
var Crypto = require('crypto');
88
var Net = require('net');
99
var tls = require('tls');
10-
var Packets = require('../lib/protocol/packets');
11-
var PacketWriter = require('../lib/protocol/PacketWriter');
12-
var Parser = require('../lib/protocol/Parser');
13-
var Types = require('../lib/protocol/constants/types');
14-
var Auth = require('../lib/protocol/Auth');
15-
var Errors = require('../lib/protocol/constants/errors');
10+
var Packets = common.Packets;
11+
var PacketWriter = common.PacketWriter;
12+
var Parser = common.Parser;
13+
var Types = common.Types;
14+
var Auth = require(common.lib + '/protocol/Auth');
15+
var Errors = common.Errors;
1616
var EventEmitter = require('events').EventEmitter;
1717
var Util = require('util');
1818

test/common.js

Lines changed: 41 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
var common = exports;
2-
var fs = require('fs');
3-
var path = require('path');
4-
var _ = require('underscore');
5-
var FakeServer = require('./FakeServer');
1+
var _ = require('underscore');
2+
var common = exports;
3+
var fs = require('fs');
4+
var mkdirp = require('mkdirp');
5+
var path = require('path');
66

7-
common.lib = path.join(__dirname, '../lib');
8-
common.fixtures = path.join(__dirname, 'fixtures');
7+
common.lib = path.resolve(__dirname, '..', (process.env.TEST_COVERAGE || ''), 'lib');
8+
common.fixtures = path.resolve(__dirname, 'fixtures');
99

1010
// Useful for triggering ECONNREFUSED errors on connect()
1111
common.bogusPort = 47378;
@@ -19,7 +19,29 @@ common.fakeServerSocket = __dirname + '/fake_server.sock';
1919

2020
common.testDatabase = process.env.MYSQL_DATABASE || 'test';
2121

22-
var Mysql = require('../');
22+
// Export common modules
23+
common.Charsets = require(common.lib + '/protocol/constants/charsets');
24+
common.ClientConstants = require(common.lib + '/protocol/constants/client');
25+
common.Connection = require(common.lib + '/Connection');
26+
common.ConnectionConfig = require(common.lib + '/ConnectionConfig');
27+
common.Errors = require(common.lib + '/protocol/constants/errors');
28+
common.Packets = require(common.lib + '/protocol/packets');
29+
common.PacketWriter = require(common.lib + '/protocol/PacketWriter');
30+
common.Parser = require(common.lib + '/protocol/Parser');
31+
common.PoolConfig = require(common.lib + '/PoolConfig');
32+
common.PoolConnection = require(common.lib + '/PoolConnection');
33+
common.SqlString = require(common.lib + '/protocol/SqlString');
34+
common.Types = require(common.lib + '/protocol/constants/types');
35+
36+
// Setup coverage hook
37+
if (process.env.TEST_COVERAGE) {
38+
process.on('exit', function () {
39+
writeCoverage(global.__coverage__ || {});
40+
});
41+
}
42+
43+
var Mysql = require(path.resolve(common.lib, '../index'));
44+
var FakeServer = require('./FakeServer');
2345

2446
common.isTravis = function() {
2547
return Boolean(process.env.CI);
@@ -129,3 +151,14 @@ function mergeTestConfig(config) {
129151
}
130152
return config;
131153
}
154+
155+
function writeCoverage(coverage) {
156+
var test = path.relative(__dirname, path.resolve(process.argv[1]));
157+
var ext = path.extname(test);
158+
var cov = test.substr(0, test.length - ext.length) + '.json';
159+
var out = path.resolve(__dirname, '..', process.env.TEST_COVERAGE, 'test', cov);
160+
161+
mkdirp.sync(path.dirname(out));
162+
163+
fs.writeFileSync(out, JSON.stringify(coverage));
164+
}

test/run-cov.js

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
var fs = require('fs');
2+
var istanbul = require('istanbul');
3+
var mkdirp = require('mkdirp');
4+
var path = require('path');
5+
var rimraf = require('rimraf');
6+
var spawn = require('child_process').spawn;
7+
8+
var istanbulcli = path.resolve(__dirname, '../node_modules/istanbul/lib/cli.js');
9+
var libcov = path.resolve(__dirname, '../lib-cov');
10+
11+
rimraf.sync(libcov);
12+
mkdirp.sync(libcov);
13+
copyFixtures(libcov);
14+
15+
instrument('index.js', function (err) {
16+
if (err) return handleError(err);
17+
instrument('lib', function (err) {
18+
if (err) return handleError(err);
19+
run(function (err, code) {
20+
if (err) return handleError(err);
21+
reportCoverage(collectCoverage(path.resolve(libcov, 'test')));
22+
rimraf.sync(libcov);
23+
process.exit(code);
24+
});
25+
});
26+
});
27+
28+
function collectCoverage(dir) {
29+
var collector = new istanbul.Collector();
30+
var coverage = require('require-all')({
31+
dirname : dir,
32+
filter : /^(test-.+?)\.json$/i
33+
});
34+
var obj = null;
35+
var objs = [coverage];
36+
37+
while ((obj = objs.shift())) {
38+
for (var key in obj) {
39+
if (/^test-/.test(key)) {
40+
collector.add(obj[key]);
41+
} else {
42+
objs.push(obj[key]);
43+
}
44+
}
45+
}
46+
47+
return collector;
48+
}
49+
50+
function copyFixtures(dest) {
51+
var fixtures = path.resolve(__dirname, '../fixtures');
52+
var into = path.resolve(dest, 'fixtures');
53+
var files = fs.readdirSync(fixtures);
54+
55+
mkdirp.sync(into);
56+
57+
files.forEach(function (file) {
58+
fs.writeFileSync(path.resolve(into, file), fs.readFileSync(path.resolve(fixtures, file)));
59+
});
60+
}
61+
62+
function handleError(err) {
63+
rimraf.sync(libcov);
64+
throw err;
65+
}
66+
67+
function instrument(target, callback) {
68+
var args = [istanbulcli, 'instrument', path.resolve(__dirname, '..', target), '-o', path.resolve(libcov, target)];
69+
var exec = process.argv[0];
70+
var proc = spawn(exec, args, {stdio: 'ignore'});
71+
72+
proc.on('error', callback);
73+
proc.on('exit', function (code) {
74+
callback(code === 0 ? null : new Error('non-zero exit code: ' + code));
75+
});
76+
}
77+
78+
function reportCoverage(collector) {
79+
var reporter = new istanbul.Reporter(null, path.resolve(__dirname, '../coverage'));
80+
var style = process.argv[2];
81+
82+
rimraf.sync(reporter.dir);
83+
mkdirp.sync(reporter.dir);
84+
85+
reporter.add(style || 'lcov');
86+
reporter.add('text-summary');
87+
reporter.write(collector, true, function(){});
88+
}
89+
90+
function run(callback) {
91+
var args = [path.resolve(__dirname, 'run.js')];
92+
var env = Object.create(null);
93+
var exec = process.argv[0];
94+
95+
for (var key in process.env) {
96+
env[key] = process.env[key];
97+
}
98+
99+
env.TEST_COVERAGE = 'lib-cov';
100+
101+
var proc = spawn(exec, args, {env: env, stdio: 'inherit'});
102+
103+
proc.on('error', callback);
104+
proc.on('exit', function (code) {
105+
callback(null, code);
106+
});
107+
}

test/unit/connection/test-callback-errors-are-not-caught.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1+
var assert = require('assert');
12
var common = require('../../common');
23
var connection = common.createConnection({port: common.fakeServerPort});
3-
var assert = require('assert');
44

55
var error = new Error('uncaught exception');
66
var server = common.createFakeServer();

test/unit/connection/test-connect-error-event.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
var assert = require('assert');
22
var common = require('../../common');
33
var connection = common.createConnection({port: common.fakeServerPort});
4-
var Errors = require(common.lib + '/protocol/constants/errors');
54

65
var server = common.createFakeServer();
76

@@ -19,5 +18,5 @@ server.listen(common.fakeServerPort, function (err) {
1918
});
2019

2120
server.on('connection', function (conn) {
22-
conn.deny('You suck.', Errors.ER_ACCESS_DENIED_ERROR);
21+
conn.deny('You suck.', common.Errors.ER_ACCESS_DENIED_ERROR);
2322
});

test/unit/connection/test-connect-timeout.js

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
var assert = require('assert');
2+
var common = require('../../common');
13
var os = require('os');
24
var interfaces = os.networkInterfaces();
35
var external = Object.keys(interfaces).some(function(name) {
@@ -7,13 +9,10 @@ var external = Object.keys(interfaces).some(function(name) {
79
});
810

911
if (!external) {
10-
console.log('skipping - no external network interfaces');
11-
return;
12+
common.skipTest('no external network interfaces');
1213
}
1314

14-
var common = require('../../common');
1515
var connection = common.createConnection({host: '1.1.1.1', port: common.fakeServerPort, connectTimeout: 500});
16-
var assert = require('assert');
1716

1817
var testTimeout = setTimeout(function() {
1918
connection.destroy();

test/unit/connection/test-connection-error.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1+
var assert = require('assert');
12
var common = require('../../common');
23
var connection = common.createConnection({port: common.fakeServerPort});
3-
var assert = require('assert');
4-
var Errors = require(common.lib + '/protocol/constants/errors');
54

65
var server = common.createFakeServer();
76

@@ -51,7 +50,7 @@ function end() {
5150
}
5251

5352
server.on('connection', function(incomingConnection) {
54-
incomingConnection.deny('You suck.', Errors.ER_HOST_NOT_PRIVILEGED);
53+
incomingConnection.deny('You suck.', common.Errors.ER_HOST_NOT_PRIVILEGED);
5554
});
5655

5756
process.on('exit', function() {

test/unit/connection/test-connection-ssl-ignore.js

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
var assert = require('assert');
2-
var common = require('../../common');
3-
var ClientConstants = require('../../../lib/protocol/constants/client');
4-
var connection = common.createConnection({
1+
var assert = require('assert');
2+
var common = require('../../common');
3+
var connection = common.createConnection({
54
port : common.fakeServerPort,
65
ssl : 'Amazon RDS'
76
});
@@ -24,6 +23,6 @@ server.listen(common.fakeServerPort, function(err) {
2423

2524
server.on('connection', function(incomingConnection) {
2625
incomingConnection.handshake({
27-
serverCapabilities1: ClientConstants.CLIENT_SSL
26+
serverCapabilities1: common.ClientConstants.CLIENT_SSL
2827
});
2928
});

test/unit/connection/test-connection-ssl-reject.js

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
var assert = require('assert');
2-
var common = require('../../common');
3-
var ClientConstants = require('../../../lib/protocol/constants/client');
4-
var connection = common.createConnection({
1+
var assert = require('assert');
2+
var common = require('../../common');
3+
var connection = common.createConnection({
54
port : common.fakeServerPort,
65
ssl : 'Amazon RDS'
76
});
@@ -23,6 +22,6 @@ server.listen(common.fakeServerPort, function(err) {
2322

2423
server.on('connection', function(incomingConnection) {
2524
incomingConnection.handshake({
26-
serverCapabilities1: ClientConstants.CLIENT_SSL
25+
serverCapabilities1: common.ClientConstants.CLIENT_SSL
2726
});
2827
});

test/unit/connection/test-connection-ssl.js

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
var assert = require('assert');
2-
var common = require('../../common');
3-
var ClientConstants = require('../../../lib/protocol/constants/client');
4-
var connection = common.createConnection({
1+
var assert = require('assert');
2+
var common = require('../../common');
3+
var connection = common.createConnection({
54
port : common.fakeServerPort,
65
ssl : {
76
ca : common.getSSLConfig().ca
@@ -23,6 +22,6 @@ server.listen(common.fakeServerPort, function(err) {
2322

2423
server.on('connection', function(incomingConnection) {
2524
incomingConnection.handshake({
26-
serverCapabilities1: ClientConstants.CLIENT_SSL
25+
serverCapabilities1: common.ClientConstants.CLIENT_SSL
2726
});
2827
});

test/unit/connection/test-custom-query-format.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1+
var assert = require('assert');
12
var common = require('../../common');
23
var connection = common.createConnection({port: common.fakeServerPort, queryFormat: queryFormat});
3-
var assert = require('assert');
44

55
function queryFormat(query, values, tz) {
66
if (!values) {

0 commit comments

Comments
 (0)