@@ -3,6 +3,7 @@ import { Worker } from 'node:worker_threads';
33// Import Logger, { LogLevel, StreamHandler } from '@matrixai/logger';
44import path from 'node:path' ;
55import WorkerPool from '#WorkerPool.js' ;
6+ import * as errors from '#errors.js' ;
67
78async function sleep ( ms : number ) {
89 return new Promise ( ( resolve ) => {
@@ -22,32 +23,64 @@ describe('WorkerPool', () => {
2223 } ;
2324
2425 afterEach ( async ( ) => {
25- await pool . terminate ( true ) ;
26- console . log ( 'DONE!' ) ;
26+ await pool ?. terminate ( true ) ;
2727 } ) ;
2828
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 ( ) => {
3040 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 ;
3941 const numTasks = 20 ;
4042 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
4545 } ) ;
4646 }
47- console . log ( 'waiting' ) ;
48- await taskP ;
49- console . log ( 'waiting done' ) ;
47+ await pool . settled ( ) ;
5048 await pool . terminate ( false ) ;
51- console . log ( 'term done' ) ;
5249 } ) ;
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.
5386} ) ;
0 commit comments