123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- 'use strict';
- /*
- ======== A Handy Little Nodeunit Reference ========
- https://github.com/caolan/nodeunit
- Test methods:
- test.expect(numAssertions)
- test.done()
- Test assertions:
- test.ok(value, [message])
- test.equal(actual, expected, [message])
- test.notEqual(actual, expected, [message])
- test.deepEqual(actual, expected, [message])
- test.notDeepEqual(actual, expected, [message])
- test.strictEqual(actual, expected, [message])
- test.notStrictEqual(actual, expected, [message])
- test.throws(block, [error], [message])
- test.doesNotThrow(block, [error], [message])
- test.ifError(value)
- */
- var fs = require('fs');
- var exec = require('child_process').exec;
- var _which = require('which').sync;
- function which(command) {
- try {
- _which(command);
- return command;
- } catch (err) {
- return false;
- }
- }
- // Look for grep first (any OS). If not found (but on Windows) look for find,
- // which is Windows' horribly crippled grep alternative.
- var grep = which('grep') || process.platform === 'win32' && which('find');
- exports['exit'] = {
- setUp: function(done) {
- this.origCwd = process.cwd();
- process.chdir('test/fixtures');
- done();
- },
- tearDown: function(done) {
- process.chdir(this.origCwd);
- done();
- },
- 'grep': function(test) {
- test.expect(1);
- // Many unit tests depend on this.
- test.ok(grep, 'A suitable "grep" or "find" program was not found in the PATH.');
- test.done();
- },
- // The rest of the tests are built dynamically, to keep things sane.
- };
- // A few helper functions.
- function normalizeLineEndings(s) {
- return s.replace(/\r?\n/g, '\n');
- }
- // Capture command output, normalizing captured stdout to unix file endings.
- function run(command, callback) {
- exec(command, function(error, stdout) {
- callback(error ? error.code : 0, normalizeLineEndings(stdout));
- });
- }
- // Read a fixture file, normalizing file contents to unix file endings.
- function fixture(filename) {
- return normalizeLineEndings(String(fs.readFileSync(filename)));
- }
- function buildTests() {
- // Build individual unit tests for command output.
- var counts = [10, 100, 1000];
- var outputs = [' stdout stderr', ' stdout', ' stderr'];
- var pipes = ['', ' | ' + grep + ' "std"'];
- counts.forEach(function(count) {
- outputs.forEach(function(output) {
- pipes.forEach(function(pipe) {
- var command = 'node log.js 0 ' + count + output + ' 2>&1' + pipe;
- exports['exit']['output (' + command + ')'] = function(test) {
- test.expect(2);
- run(command, function(code, actual) {
- var expected = fixture(count + output.replace(/ /g, '-') + '.txt');
- // Sometimes, the actual file lines are out of order on Windows.
- // But since the point of this lib is to drain the buffer and not
- // guarantee output order, we only test the length.
- test.equal(actual.length, expected.length, 'should be the same length.');
- // The "fail" lines in log.js should NOT be output!
- test.ok(actual.indexOf('fail') === -1, 'should not output after exit is called.');
- test.done();
- });
- };
- });
- });
- });
- // Build individual unit tests for exit codes.
- var codes = [0, 1, 123];
- codes.forEach(function(code) {
- var command = 'node log.js ' + code + ' 10 stdout stderr';
- exports['exit']['exit code (' + command + ')'] = function(test) {
- test.expect(1);
- run(command, function(actual) {
- // The specified exit code should be passed through.
- test.equal(actual, code, 'should exit with ' + code + ' error code.');
- test.done();
- });
- };
- });
- }
- // Don't bother building tests if grep wasn't found, otherwise everything will
- // fail and the error will get lost.
- if (grep) {
- buildTests();
- }
|