@@ -3,6 +3,7 @@ import { Worker } from 'node:worker_threads';
3
3
// Import Logger, { LogLevel, StreamHandler } from '@matrixai/logger';
4
4
import path from 'node:path' ;
5
5
import WorkerPool from '#WorkerPool.js' ;
6
+ import * as errors from '#errors.js' ;
6
7
7
8
async function sleep ( ms : number ) {
8
9
return new Promise ( ( resolve ) => {
@@ -22,32 +23,64 @@ describe('WorkerPool', () => {
22
23
} ;
23
24
24
25
afterEach ( async ( ) => {
25
- await pool . terminate ( true ) ;
26
- console . log ( 'DONE!' ) ;
26
+ await pool ?. terminate ( true ) ;
27
27
} ) ;
28
28
29
- test ( 'asd' , async ( ) => {
29
+ test ( 'worker pool must have atleast 1 worker' , async ( ) => {
30
+ expect ( ( ) => new WorkerPool ( 0 , workerFactory ) ) . toThrow (
31
+ errors . ErrorWorkerHandlerMissing ,
32
+ ) ;
33
+ expect ( ( ) => new WorkerPool ( - 1 , workerFactory ) ) . toThrow (
34
+ errors . ErrorWorkerHandlerMissing ,
35
+ ) ;
36
+ pool = new WorkerPool ( 1 , workerFactory ) ;
37
+ await pool . terminate ( true ) ;
38
+ } ) ;
39
+ test ( 'can run tasks' , async ( ) => {
30
40
pool = new WorkerPool ( 3 , workerFactory ) ;
31
- pool . $poolStatus . subscribe ( ( v ) => {
32
- console . log ( '!queue state!' , v ) ;
33
- } ) ;
34
- let resolveP ;
35
- const taskP = new Promise ( ( resolve ) => {
36
- resolveP = resolve ;
37
- } ) ;
38
- let doneCount = 0 ;
39
41
const numTasks = 20 ;
40
42
for ( let i = 0 ; i < numTasks ; i ++ ) {
41
- pool . runTask ( { type : 'fac' , data : 5 } , ( result , error ) => {
42
- console . log ( { result, error } ) ;
43
- doneCount ++ ;
44
- if ( doneCount === numTasks ) resolveP ( result ) ;
43
+ pool . runTask ( { type : 'test' , data : undefined } , ( ) => {
44
+ // Do nothing
45
45
} ) ;
46
46
}
47
- console . log ( 'waiting' ) ;
48
- await taskP ;
49
- console . log ( 'waiting done' ) ;
47
+ await pool . settled ( ) ;
50
48
await pool . terminate ( false ) ;
51
- console . log ( 'term done' ) ;
52
49
} ) ;
50
+ test ( 'tasks return expected results' , async ( ) => {
51
+ pool = new WorkerPool ( 1 , workerFactory ) ;
52
+ const task1 = new Promise ( ( resolve , reject ) => {
53
+ pool . runTask ( { type : 'test' , data : undefined } , ( result , error ) => {
54
+ if ( error != null ) return reject ( error ) ;
55
+ return resolve ( result ) ;
56
+ } ) ;
57
+ } ) ;
58
+ await expect ( task1 ) . resolves . toBe ( 'hello world!' ) ;
59
+
60
+ const task2 = new Promise ( ( resolve , reject ) => {
61
+ pool . runTask ( { type : 'add' , data : { a : 2 , b : 2 } } , ( result , error ) => {
62
+ if ( error != null ) return reject ( error ) ;
63
+ return resolve ( result ) ;
64
+ } ) ;
65
+ } ) ;
66
+ await expect ( task2 ) . resolves . toBe ( 4 ) ;
67
+
68
+ const task3 = new Promise ( ( resolve , reject ) => {
69
+ pool . runTask ( { type : 'fac' , data : 5 } , ( result , error ) => {
70
+ if ( error != null ) return reject ( error ) ;
71
+ return resolve ( result ) ;
72
+ } ) ;
73
+ } ) ;
74
+ await expect ( task3 ) . resolves . toBe ( 120 ) ;
75
+
76
+ const task4 = new Promise ( ( resolve , reject ) => {
77
+ pool . runTask ( { type : 'sleep' , data : 10 } , ( result , error ) => {
78
+ if ( error != null ) return reject ( error ) ;
79
+ return resolve ( result ) ;
80
+ } ) ;
81
+ } ) ;
82
+ await expect ( task4 ) . resolves . toBe ( undefined ) ;
83
+ } ) ;
84
+ // TODO: zero copy of data
85
+ // TODO: apply the async resource.
53
86
} ) ;
0 commit comments