@@ -3,6 +3,7 @@ import { readFileSync } from 'fs';
33import path from 'path' ;
44import { URL } from 'url' ;
55import { MessageChannel , MessagePort } from './MessageChannel' ;
6+ import psList from 'ps-list' ;
67
78console . log = jest . fn ( ) ;
89jest . setTimeout ( 10000 ) ;
@@ -13,6 +14,8 @@ describe('DenoWorker', () => {
1314 const echoScript = readFileSync ( echoFile , { encoding : 'utf-8' } ) ;
1415 const pingFile = path . resolve ( __dirname , './test/ping.js' ) ;
1516 const pingScript = readFileSync ( pingFile , { encoding : 'utf-8' } ) ;
17+ const infiniteFile = path . resolve ( __dirname , './test/infinite.js' ) ;
18+ const infiniteScript = readFileSync ( infiniteFile , { encoding : 'utf-8' } ) ;
1619
1720 afterEach ( ( ) => {
1821 if ( worker ) {
@@ -285,4 +288,158 @@ describe('DenoWorker', () => {
285288 expect ( final ) . toEqual ( 'pong' ) ;
286289 } ) ;
287290 } ) ;
291+
292+ describe ( 'terminate()' , ( ) => {
293+ it ( 'should kill the deno process when terminated immediately' , async ( ) => {
294+ let denoProcesses = await getDenoProcesses ( ) ;
295+ expect ( denoProcesses ) . toEqual ( [ ] ) ;
296+
297+ worker = new DenoWorker ( echoScript , {
298+ permissions : {
299+ allowNet : [ `https://google.com` ] ,
300+ } ,
301+ } ) ;
302+ worker . terminate ( ) ;
303+
304+ denoProcesses = await getDenoProcesses ( ) ;
305+ expect ( denoProcesses ) . toEqual ( [ ] ) ;
306+ } ) ;
307+
308+ it ( 'should kill the deno process when terminated after the initial connection' , async ( ) => {
309+ let denoProcesses = await getDenoProcesses ( ) ;
310+ expect ( denoProcesses ) . toEqual ( [ ] ) ;
311+
312+ worker = new DenoWorker ( echoScript , {
313+ permissions : {
314+ allowNet : [ `https://google.com` ] ,
315+ } ,
316+ } ) ;
317+
318+ let ret : any ;
319+ let resolve : any ;
320+ let promise = new Promise ( ( res , rej ) => {
321+ resolve = res ;
322+ } ) ;
323+ worker . onmessage = ( e ) => {
324+ ret = e . data ;
325+ resolve ( ) ;
326+ } ;
327+
328+ worker . postMessage ( {
329+ type : 'echo' ,
330+ message : 'Hello' ,
331+ } ) ;
332+
333+ await promise ;
334+
335+ worker . terminate ( ) ;
336+
337+ denoProcesses = await getDenoProcesses ( ) ;
338+ expect ( denoProcesses ) . toEqual ( [ ] ) ;
339+ } ) ;
340+
341+ it ( 'should kill the deno process when terminated while sending data' , async ( ) => {
342+ let denoProcesses = await getDenoProcesses ( ) ;
343+ expect ( denoProcesses ) . toEqual ( [ ] ) ;
344+
345+ worker = new DenoWorker ( echoScript , {
346+ permissions : {
347+ allowNet : [ `https://google.com` ] ,
348+ } ,
349+ } ) ;
350+
351+ let ret : any ;
352+ let resolve : any ;
353+ let promise = new Promise ( ( res , rej ) => {
354+ resolve = res ;
355+ } ) ;
356+ worker . onmessage = ( e ) => {
357+ ret = e . data ;
358+ resolve ( ) ;
359+ } ;
360+
361+ worker . terminate ( ) ;
362+
363+ worker . postMessage ( {
364+ type : 'echo' ,
365+ message : 'Hello' ,
366+ } ) ;
367+
368+ denoProcesses = await getDenoProcesses ( ) ;
369+ expect ( denoProcesses ) . toEqual ( [ ] ) ;
370+ } ) ;
371+
372+ it ( 'should kill the deno process when terminated while recieving data' , async ( ) => {
373+ let denoProcesses = await getDenoProcesses ( ) ;
374+ expect ( denoProcesses ) . toEqual ( [ ] ) ;
375+
376+ worker = new DenoWorker ( echoScript , {
377+ permissions : {
378+ allowNet : [ `https://google.com` ] ,
379+ } ,
380+ } ) ;
381+
382+ let ret : any ;
383+ let resolve : any ;
384+ let promise = new Promise ( ( res , rej ) => {
385+ resolve = res ;
386+ } ) ;
387+ worker . onmessage = ( e ) => {
388+ ret = e . data ;
389+ console . log ( 'Message' ) ;
390+ resolve ( ) ;
391+ } ;
392+
393+ worker . postMessage ( {
394+ type : 'echo' ,
395+ message : 'Hello' ,
396+ } ) ;
397+
398+ await Promise . resolve ( ) ;
399+
400+ worker . terminate ( ) ;
401+
402+ denoProcesses = await getDenoProcesses ( ) ;
403+ expect ( denoProcesses ) . toEqual ( [ ] ) ;
404+ } ) ;
405+
406+ it ( 'should kill the deno process when terminated while the script is in an infinite loop' , async ( ) => {
407+ let denoProcesses = await getDenoProcesses ( ) ;
408+ expect ( denoProcesses ) . toEqual ( [ ] ) ;
409+
410+ worker = new DenoWorker ( infiniteScript , {
411+ permissions : {
412+ allowNet : [ `https://google.com` ] ,
413+ } ,
414+ } ) ;
415+
416+ let ret : any ;
417+ let resolve : any ;
418+ let promise = new Promise ( ( res , rej ) => {
419+ resolve = res ;
420+ } ) ;
421+ worker . onmessage = ( e ) => {
422+ ret = e . data ;
423+ resolve ( ) ;
424+ } ;
425+
426+ await promise ;
427+
428+ worker . postMessage ( {
429+ type : 'echo' ,
430+ message : 'Hello' ,
431+ } ) ;
432+
433+ worker . terminate ( ) ;
434+
435+ denoProcesses = await getDenoProcesses ( ) ;
436+ expect ( denoProcesses ) . toEqual ( [ ] ) ;
437+ } ) ;
438+ } ) ;
288439} ) ;
440+
441+ async function getDenoProcesses ( ) {
442+ const list = await psList ( ) ;
443+ const denoProcesses = list . filter ( ( p ) => / ^ d e n o / . test ( p . name ) ) ;
444+ return denoProcesses ;
445+ }
0 commit comments