1
1
'use strict' ;
2
2
3
3
require ( '../../helper' ) ;
4
+ var debug = require ( '../../../batch/util/debug' ) ( 'scheduler-test' ) ;
4
5
var assert = require ( '../../support/assert' ) ;
5
6
var Scheduler = require ( '../../../batch/scheduler/scheduler' ) ;
6
7
var FixedCapacity = require ( '../../../batch/scheduler/capacity/fixed' ) ;
7
8
8
9
describe ( 'scheduler' , function ( ) {
9
10
11
+ var USER_FINISHED = true ;
12
+
10
13
var USER_A = 'userA' ;
11
14
var USER_B = 'userB' ;
12
15
var USER_C = 'userC' ;
@@ -24,6 +27,27 @@ describe('scheduler', function() {
24
27
} . bind ( this ) , 50 ) ;
25
28
} ;
26
29
30
+ function ManualTaskRunner ( ) {
31
+ this . userTasks = { } ;
32
+ }
33
+
34
+ ManualTaskRunner . prototype . run = function ( user , callback ) {
35
+ if ( ! this . userTasks . hasOwnProperty ( user ) ) {
36
+ this . userTasks [ user ] = [ ] ;
37
+ }
38
+ this . userTasks [ user ] . push ( callback ) ;
39
+ } ;
40
+
41
+ ManualTaskRunner . prototype . dispatch = function ( user , isDone ) {
42
+ if ( this . userTasks . hasOwnProperty ( user ) ) {
43
+ var cb = this . userTasks [ user ] . shift ( ) ;
44
+ if ( cb ) {
45
+ return cb ( null , isDone ) ;
46
+ }
47
+ }
48
+ } ;
49
+
50
+
27
51
// simulate one by one or infinity capacity
28
52
var capacities = [ new FixedCapacity ( 1 ) , new FixedCapacity ( 2 ) , new FixedCapacity ( Infinity ) ] ;
29
53
@@ -54,42 +78,47 @@ describe('scheduler', function() {
54
78
scheduler . schedule ( ) ;
55
79
} ) ;
56
80
57
- it ( 'regression #2' , function ( done ) {
58
- var taskRunner = new TaskRunner ( {
59
- userA : 2 ,
60
- userB : 2 ,
61
- userC : 2 ,
62
- userD : 1
63
- } ) ;
81
+ it ( 'regression #2: it should restart task after it was done but got re-scheduled' , function ( done ) {
82
+ var taskRunner = new ManualTaskRunner ( ) ;
64
83
var scheduler = new Scheduler ( capacity , taskRunner ) ;
84
+ debug ( 'Adding users A and B' ) ;
65
85
scheduler . add ( USER_A ) ;
66
86
scheduler . add ( USER_B ) ;
67
87
68
- scheduler . on ( 'done' , function ( ) {
69
- var results = taskRunner . results ;
88
+ var acquiredUsers = [ ] ;
70
89
71
- assert . equal ( results . length , 7 ) ;
90
+ scheduler . on ( 'done' , function ( ) {
91
+ debug ( 'Users %j' , acquiredUsers ) ;
92
+ assert . equal ( acquiredUsers [ 0 ] , USER_A ) ;
93
+ assert . equal ( acquiredUsers [ 1 ] , USER_B ) ;
94
+ assert . equal ( acquiredUsers [ 2 ] , USER_A ) ;
95
+ assert . equal ( acquiredUsers [ 3 ] , USER_B ) ;
72
96
73
- assert . equal ( results [ 0 ] , USER_A ) ;
74
- assert . equal ( results [ 1 ] , USER_B ) ;
75
- assert . equal ( results [ 2 ] , USER_C ) ;
76
- assert . equal ( results [ 3 ] , 'userD' ) ;
77
- assert . equal ( results [ 4 ] , USER_A ) ;
78
- assert . equal ( results [ 5 ] , USER_B ) ;
79
- assert . equal ( results [ 6 ] , USER_C ) ;
97
+ assert . equal ( acquiredUsers . length , 4 ) ;
80
98
81
99
return done ( ) ;
82
100
} ) ;
83
101
84
- setTimeout ( function ( ) {
85
- scheduler . add ( USER_C ) ;
86
- } , 10 ) ;
87
-
88
- setTimeout ( function ( ) {
89
- scheduler . add ( 'userD' ) ;
90
- } , 20 ) ;
102
+ scheduler . on ( 'acquired' , function ( user ) {
103
+ debug ( 'Acquired user %s' , user ) ;
104
+ acquiredUsers . push ( user ) ;
105
+ } ) ;
91
106
92
107
scheduler . schedule ( ) ;
108
+
109
+ debug ( 'User A will be mark as DONE' ) ;
110
+ taskRunner . dispatch ( USER_A , USER_FINISHED ) ;
111
+
112
+ debug ( 'User B should be running' ) ;
113
+ debug ( 'User A submit a new task' ) ;
114
+ scheduler . add ( USER_A ) ;
115
+
116
+ debug ( 'User B will get another task to run' ) ;
117
+ taskRunner . dispatch ( USER_B ) ;
118
+
119
+ debug ( 'User A should start working on this new task' ) ;
120
+ taskRunner . dispatch ( USER_A , USER_FINISHED ) ;
121
+ taskRunner . dispatch ( USER_B , USER_FINISHED ) ;
93
122
} ) ;
94
123
95
124
it ( 'should run tasks' , function ( done ) {
0 commit comments