@@ -45,7 +45,10 @@ options = exports.options = {
4545 deps : null ,
4646
4747 // define namespace your code will be attached to on global['your namespace']
48- namespace : null
48+ namespace : null ,
49+
50+ // max amount of ms child can be blocked, after that we assume running an infinite loop
51+ maxBlockDuration : 1000
4952} ;
5053
5154/**
@@ -55,6 +58,7 @@ options = exports.options = {
5558 */
5659function runOne ( opts , callback ) {
5760 var child ;
61+ var pingCheckTimeoutId ;
5862
5963 child = cp . fork (
6064 __dirname + '/child.js' ,
@@ -67,28 +71,44 @@ function runOne(opts, callback) {
6771 child . kill ( ) ;
6872 }
6973
74+ function complete ( err , data ) {
75+ kill ( ) ;
76+ clearTimeout ( pingCheckTimeoutId ) ;
77+ callback ( err , data )
78+ }
79+
7080 child . on ( 'message' , function ( msg ) {
71- if ( msg . event === 'assertionDone' ) {
72- log . add ( 'assertions' , msg . data ) ;
73- } else if ( msg . event === 'testDone' ) {
74- log . add ( 'tests' , msg . data ) ;
75- } else if ( msg . event === 'done' ) {
76- msg . data . code = opts . code . path ;
77- log . add ( 'summaries' , msg . data ) ;
78- if ( opts . coverage ) {
79- coverage . add ( msg . data . coverage ) ;
80- msg . data . coverage = coverage . get ( ) ;
81- msg . data . coverage . code = msg . data . code ;
82- log . add ( 'coverages' , msg . data . coverage ) ;
83- }
84- if ( opts . log . testing ) {
85- console . log ( 'done' ) ;
86- }
87- callback ( null , msg . data ) ;
88- kill ( ) ;
89- } else if ( msg . event === 'uncaughtException' ) {
90- callback ( _ . extend ( new Error ( ) , msg . data ) ) ;
91- kill ( ) ;
81+ switch ( msg . event ) {
82+ case 'ping' :
83+ clearTimeout ( pingCheckTimeoutId ) ;
84+ pingCheckTimeoutId = setTimeout ( function ( ) {
85+ complete ( new Error ( 'Process blocked for too long' ) ) ;
86+ } , opts . maxBlockDuration ) ;
87+ break ;
88+ case 'assertionDone' :
89+ log . add ( 'assertions' , msg . data ) ;
90+ break ;
91+ case 'testDone' :
92+ log . add ( 'tests' , msg . data ) ;
93+ break ;
94+ case 'done' :
95+ clearTimeout ( pingCheckTimeoutId ) ;
96+ msg . data . code = opts . code . path ;
97+ log . add ( 'summaries' , msg . data ) ;
98+ if ( opts . coverage ) {
99+ coverage . add ( msg . data . coverage ) ;
100+ msg . data . coverage = coverage . get ( ) ;
101+ msg . data . coverage . code = msg . data . code ;
102+ log . add ( 'coverages' , msg . data . coverage ) ;
103+ }
104+ if ( opts . log . testing ) {
105+ console . log ( 'done' ) ;
106+ }
107+ complete ( null , msg . data ) ;
108+ break ;
109+ case 'uncaughtException' :
110+ complete ( _ . extend ( new Error ( ) , msg . data ) ) ;
111+ break ;
92112 }
93113 } ) ;
94114
0 commit comments