Skip to content

Commit 2ce4493

Browse files
committed
Added basic tests
1 parent bd42cda commit 2ce4493

File tree

15 files changed

+261
-55
lines changed

15 files changed

+261
-55
lines changed

bin/cli.js

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
var Log = require('../lib/logger'),
2-
logger = new Log(global.logLevel),
2+
logger = new Log(global.logLevel || 'info'),
33
BrowserStack = require('browserstack'),
44
qs = require('querystring'),
55
chalk = require('chalk'),
@@ -62,8 +62,9 @@ function terminateAllWorkers(callback) {
6262
}
6363
}
6464

65-
function cleanUpAndExit(signal, callback) {
65+
function cleanUpAndExit(signal, report, callback) {
6666
callback = callback || function() {};
67+
report = report || {};
6768
logger.trace('cleanUpAndExit: signal: %s', signal);
6869

6970
try {
@@ -84,11 +85,11 @@ function cleanUpAndExit(signal, callback) {
8485

8586
if (signal === 'SIGTERM') {
8687
logger.debug('Exiting');
87-
callback(null, config.status);
88+
callback(null, report);
8889
} else {
8990
terminateAllWorkers(function() {
9091
logger.debug('Exiting');
91-
callback(null, 1);
92+
callback(null, report);
9293
});
9394
}
9495
}
@@ -396,21 +397,21 @@ function runTests(config, callback) {
396397
}
397398
}
398399

399-
exports.test = function(config_file, callback) {
400+
exports.run = function(user_config, callback) {
400401
callback = callback || function() {};
401402

402403
try {
403-
config = new (require('../lib/config').config)(config_file);
404+
config = new (require('../lib/config').config)(user_config);
404405

405406
client = BrowserStack.createClient({
406407
username: config.username,
407408
password: config.key
408409
});
409-
runTests(config, function(error) {
410+
runTests(config, function(error, report) {
410411
if(error) {
411412
callback(error);
412413
} else {
413-
cleanUpAndExit('SIGTERM', callback);
414+
cleanUpAndExit('SIGTERM', report, callback);
414415
}
415416
});
416417
} catch (e) {

bin/runner.js

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
#! /usr/bin/env node
22

3-
var todo = process.argv[2];
3+
var todo = process.argv[2],
4+
path = require('path'),
5+
config;
46

57
if (todo === '--verbose') {
68
global.logLevel = process.env.LOG_LEVEL || 'debug';
@@ -16,11 +18,31 @@ if (todo === 'init') {
1618
return;
1719
}
1820

21+
var config_path = process.env.BROWSERSTACK_JSON || 'browserstack.json';
22+
config_path = path.resolve(path.relative(process.cwd(), config_path));
23+
24+
console.log('Using config:', config_path);
25+
try {
26+
config = require(config_path);
27+
} catch (e) {
28+
if (e.code === 'MODULE_NOT_FOUND') {
29+
console.err('Configuration file `browserstack.json` is missing.');
30+
throw new Error('Configuration file `browserstack.json` is missing.');
31+
} else {
32+
console.err('Invalid configuration in `browserstack.json` file');
33+
console.err(e.message);
34+
console.err(e.stack);
35+
throw new Error('Invalid configuration in `browserstack.json` file');
36+
}
37+
}
38+
1939
var runner = require('./cli.js');
20-
runner.test(process.env.BROWSERSTACK_JSON || 'browserstack.json', function(err) {
40+
runner.run(config, function(err) {
2141
if(err) {
22-
console.log(err);
23-
console.log(err.stack);
24-
console.log('Invalid Command');
42+
console.err(err);
43+
console.err(err.stack);
44+
console.err('Invalid Command');
45+
process.exit(1);
2546
}
47+
process.exit(0);
2648
});

lib/config.js

Lines changed: 3 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,4 @@
1-
var Log = require('./logger'),
2-
logger = new Log(global.logLevel),
3-
path = require('path'),
4-
fs = require('fs'),
1+
var fs = require('fs'),
52
pwd = process.cwd();
63

74
var formatPath = function(path) {
@@ -13,32 +10,12 @@ var formatPath = function(path) {
1310
path = path.slice(pwd.length + 1);
1411
}
1512
if (!fs.existsSync(path) && !fs.existsSync(path.split('?')[0])) {
16-
console.error('Test path: ' + path + ' is invalid.');
1713
throw new Error('Test path: ' + path + ' is invalid.');
1814
}
1915
return path;
2016
};
2117

22-
exports.config = function(config_path) {
23-
var config;
24-
25-
config_path = path.resolve(path.relative(process.cwd(), config_path));
26-
logger.debug('Using config:', config_path);
27-
28-
try {
29-
config = require(config_path);
30-
} catch (e) {
31-
if (e.code === 'MODULE_NOT_FOUND') {
32-
logger.info('Configuration file `browserstack.json` is missing.');
33-
throw new Error('Configuration file `browserstack.json` is missing.');
34-
} else {
35-
logger.info('Invalid configuration in `browserstack.json` file');
36-
logger.info(e.message);
37-
logger.info(e.stack);
38-
throw new Error('Invalid configuration in `browserstack.json` file');
39-
}
40-
}
41-
18+
exports.config = function(config) {
4219
var package_json = {};
4320
try {
4421
package_json = require(process.cwd() + '/package.json');
@@ -79,8 +56,7 @@ exports.config = function(config_path) {
7956
var that = this;
8057
['username', 'key', 'browsers', 'test_path'].forEach(function(param) {
8158
if (typeof config[param] === 'undefined' && typeof that[param] === 'undefined') {
82-
console.error('Configuration parameter `%s` is required.', param);
83-
throw new Error('Configuration parameter `%s` is required.', param);
59+
throw new Error('Configuration parameter ' + param + ' is required.');
8460
}
8561
});
8662

lib/configParser.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//beta browsers not handled
22
//+ not handled
33
var Log = require('./logger'),
4-
logger = new Log(global.logLevel);
4+
logger = new Log(global.logLevel || 'info');
55

66
var ConfigParser = {
77
finalBrowsers: [],

lib/local.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
var Log = require('./logger'),
2-
logger = new Log(global.logLevel),
2+
logger = new Log(global.logLevel || 'info'),
33
exec = require('child_process').execFile,
44
fs = require('fs'),
55
https = require('https'),

lib/logger.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
var fmt = require('util').format;
2-
var logLevels = {ERROR: 3, INFO: 6, DEBUG: 7, TRACE: 8};
2+
var logLevels = { SILENT: 0, ERROR: 3, INFO: 6, DEBUG: 7, TRACE: 8 };
33

44
function Log(level){
55
if ('string' === typeof level) {

lib/server.js

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
var Log = require('./logger'),
2-
logger = new Log(global.logLevel),
2+
logger = new Log(global.logLevel || 'info'),
33
http = require('http'),
44
url = require('url'),
55
path = require('path'),
@@ -11,7 +11,8 @@ var Log = require('./logger'),
1111
chalk = require('chalk'),
1212
mime = require('mime'),
1313
send = require('send'),
14-
vm = require('vm');
14+
vm = require('vm'),
15+
report = {};
1516

1617
exports.Server = function Server(bsClient, workers, config, callback) {
1718
var testFilePaths = (Array.isArray(config.test_path) ? config.test_path : [ config.test_path ])
@@ -222,6 +223,7 @@ exports.Server = function Server(bsClient, workers, config, callback) {
222223
}
223224

224225
var worker = workers[uuid];
226+
var browserInfo = worker.getTestBrowserInfo();
225227
var query = null;
226228

227229
try {
@@ -231,11 +233,15 @@ exports.Server = function Server(bsClient, workers, config, callback) {
231233
logger.info('[%s] Log: ' + qs.parse(body).data, worker.string);
232234
}
233235

236+
237+
report[browserInfo] = report[browserInfo] || { assertions: [], tests: [] };
238+
234239
logger.trace('[%s] _progress', worker.id, query);
235240

236241
if (query && query.tracebacks) {
237242
query.tracebacks.forEach(function(traceback) {
238-
logger.info('[%s] ' + chalk.red('Error:'), worker.getTestBrowserInfo(), formatTraceback(traceback));
243+
report[browserInfo]['assertions'].push(traceback);
244+
logger.info('[%s] ' + chalk.red('Error:'), browserInfo, formatTraceback(traceback));
239245
});
240246
}
241247
response.end();
@@ -250,6 +256,7 @@ exports.Server = function Server(bsClient, workers, config, callback) {
250256

251257
var worker = workers[uuid];
252258
worker._worker_key = uuid;
259+
var browserInfo = worker.getTestBrowserInfo();
253260

254261
var query = null;
255262
try {
@@ -261,14 +268,17 @@ exports.Server = function Server(bsClient, workers, config, callback) {
261268
if (query === null) {
262269
logger.info('[%s] Null response from remote Browser', request.headers['x-browser-string']);
263270
} else {
271+
report[browserInfo] = report[browserInfo] || { assertions: [], tests: [] };
272+
report[browserInfo]['tests'].push(query);
273+
264274
if (query.tracebacks && query.tracebacks.length > 0) {
265-
logger.info('[%s] ' + chalk['red']('Tracebacks:'), worker.getTestBrowserInfo());
275+
logger.info('[%s] ' + chalk['red']('Tracebacks:'), browserInfo);
266276
query.tracebacks.forEach(function(traceback) {
267277
logger.info(traceback);
268278
});
269279
}
270280
var color = query.failed ? 'red' : 'green';
271-
logger.info('[%s] ' + chalk[color](query.failed ? 'Failed:' : 'Passed:') + ' %d tests, %d passed, %d failed; ran for %dms', worker.getTestBrowserInfo(), query.total, query.passed, query.failed, query.runtime);
281+
logger.info('[%s] ' + chalk[color](query.failed ? 'Failed:' : 'Passed:') + ' %d tests, %d passed, %d failed; ran for %dms', browserInfo, query.total, query.passed, query.failed, query.runtime);
272282
config.status += query.failed;
273283
}
274284

@@ -278,7 +288,7 @@ exports.Server = function Server(bsClient, workers, config, callback) {
278288
logger.trace('[%s] _report: client.takeScreenshot | response:', worker.id, screenshot, error);
279289

280290
if (!error && screenshot.url && query && query.failed) {
281-
logger.info('[%s] ' + chalk.yellow('Screenshot:') + ' %s', worker.getTestBrowserInfo(), screenshot.url);
291+
logger.info('[%s] ' + chalk.yellow('Screenshot:') + ' %s', browserInfo, screenshot.url);
282292
}
283293

284294
checkAndTerminateWorker(worker, function(reusedWorker) {
@@ -289,14 +299,14 @@ exports.Server = function Server(bsClient, workers, config, callback) {
289299

290300
if (reusedWorker) {
291301
logger.trace('[%s] _report: checkAndTerminateWorker: reused worker', worker.id);
292-
logger.debug('[%s] Reused', worker.getTestBrowserInfo());
302+
logger.debug('[%s] Reused', browserInfo);
293303
worker.resetAck();
294304
worker.awaitAck();
295305
return;
296306
}
297307

298308
logger.trace('[%s] _report: checkAndTerminateWorker: terminated', worker.id);
299-
logger.debug('[%s] Terminated', worker.getTestBrowserInfo());
309+
logger.debug('[%s] Terminated', browserInfo);
300310

301311
clearTimeout(workers[uuid].ackTimeout);
302312
clearTimeout(workers[uuid].activityTimeout);
@@ -312,7 +322,7 @@ exports.Server = function Server(bsClient, workers, config, callback) {
312322
}
313323

314324
logger.trace('[%s] _report: checkAndTerminateWorker: all tests done', worker.id, config.status && 'with failures');
315-
callback(null, 'All Tests Done');
325+
callback(null, JSON.stringify(report));
316326
}
317327
});
318328
});

package.json

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@
1717
},
1818
"devDependencies": {
1919
"jshint": "2.5.6",
20-
"mocha": "1.15.1"
20+
"mocha": "1.15.1",
21+
"sinon": "^1.17.5"
2122
},
2223
"licenses": [
2324
{
@@ -32,8 +33,9 @@
3233
"scripts": {
3334
"lint": "node_modules/.bin/jshint lib/*.js bin/ tests/*.js",
3435
"test-unit": "node_modules/.bin/mocha tests/unit",
35-
"test-ci": "npm run lint && npm run test-unit && TEST_MODE=all tests/external-tests.js",
36-
"test": "npm run lint && npm run test-unit && TEST_MODE=required tests/external-tests.js",
36+
"test-behaviour": "node_modules/.bin/mocha tests/behaviour -R Spec",
37+
"test-ci": "npm run lint && npm run test-unit && npm run test-behaviour && TEST_MODE=all tests/external-tests.js",
38+
"test": "npm run lint && npm run test-unit && npm run test-behaviour && TEST_MODE=required tests/external-tests.js",
3739
"update-util": "webpack"
3840
}
3941
}

tests/behaviour/resources/even.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
function isEven(val) {
2+
return val % 2 === 0;
3+
}

tests/behaviour/resources/odd.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
function isOdd(val) {
2+
return val % 2 === 1;
3+
}

0 commit comments

Comments
 (0)