UNPKG

2.67 kBJavaScriptView Raw
1'use strict';
2
3// iron-node does not work with forked processes
4// This cli command will run a single file in the current process.
5// Intended to be used with iron-node for profiling purposes.
6
7var path = require('path');
8var EventEmitter = require('events').EventEmitter;
9var meow = require('meow');
10var Promise = require('bluebird');
11var pkgConf = require('pkg-conf');
12var arrify = require('arrify');
13var findCacheDir = require('find-cache-dir');
14var uniqueTempDir = require('unique-temp-dir');
15var CachingPrecompiler = require('./lib/caching-precompiler');
16var globals = require('./lib/globals');
17
18// Chrome gets upset when the `this` value is non-null for these functions.
19globals.setTimeout = setTimeout.bind(null);
20globals.clearTimeout = clearTimeout.bind(null);
21
22Promise.longStackTraces();
23var conf = pkgConf.sync('ava', {
24 defaults: {
25 babel: 'default'
26 }
27});
28
29// Define a minimal set of options from the main CLI.
30var cli = meow([
31 'Usage',
32 ' $ iron-node node_modules/ava/profile.js <test-file>',
33 '',
34 'Options',
35 ' --fail-fast Stop after first test failure',
36 ' --serial, -s Run tests serially',
37 ' --require, -r Module to preload (Can be repeated)',
38 ''
39], {
40 string: [
41 '_',
42 'require'
43 ],
44 boolean: [
45 'fail-fast',
46 'verbose',
47 'serial',
48 'tap'
49 ],
50 default: conf,
51 alias: {
52 r: 'require',
53 s: 'serial'
54 }
55});
56
57if (cli.input.length !== 1) {
58 throw new Error('Specify a test file');
59}
60
61var file = path.resolve(cli.input[0]);
62var cacheDir = findCacheDir({name: 'ava', files: [file]}) || uniqueTempDir();
63var opts = {
64 file: file,
65 failFast: cli.flags.failFast,
66 serial: cli.flags.serial,
67 require: arrify(cli.flags.require),
68 tty: false,
69 cacheDir: cacheDir,
70 precompiled: new CachingPrecompiler(cacheDir, conf.babel).generateHashForFile(file)
71};
72
73var events = new EventEmitter();
74
75// Mock the behavior of a parent process.
76process.send = function (data) {
77 if (data && data.ava) {
78 var name = data.name.replace(/^ava-/, '');
79
80 if (events.listenerCount(name)) {
81 events.emit(name, data.data);
82 } else {
83 console.log('UNHANDLED AVA EVENT:', name, data.data);
84 }
85
86 return;
87 }
88
89 console.log('NON AVA EVENT:', data);
90};
91
92events.on('test', function (data) {
93 console.log('TEST:', data.title, data.error);
94});
95
96events.on('results', function (data) {
97 console.profileEnd();
98 console.log('RESULTS:', data.stats);
99});
100
101events.on('stats', function () {
102 setImmediate(function () {
103 process.emit('ava-run');
104 });
105});
106
107// test-worker will read process.argv[2] for options
108process.argv[2] = JSON.stringify(opts);
109process.argv.length = 3;
110
111console.profile('AVA test-worker process');
112
113setImmediate(function () {
114 require('./lib/test-worker');
115});