@@ -3,7 +3,7 @@ describe("TNS Workers", () => {
33 var originalTimeout ;
44 var DEFAULT_TIMEOUT_BEFORE_ASSERT = 500 ;
55
6- if ( global . NSObject ) { // if platform is iOS
6+ if ( global . NSObject ) { // if platform is iOS
77 DEFAULT_TIMEOUT_BEFORE_ASSERT = 1000 ;
88 } else { // if Android
99 // necessary in order to accommodate slower and older android emulators
@@ -136,7 +136,7 @@ describe("TNS Workers", () => {
136136 value : {
137137 str : "A message from main" ,
138138 number : 42 ,
139- obj : { prop : "value" , innerObj : { innnerProp : 67 } } ,
139+ obj : { prop : "value" , innerObj : { innnerProp : 67 } } ,
140140 bool : true ,
141141 nullValue : null
142142 } ,
@@ -251,7 +251,7 @@ describe("TNS Workers", () => {
251251 var messagesCount = 100 ;
252252 var allWorkersResponseCounter = 0 ;
253253
254- for ( let id = 0 ; id < workersCount ; id ++ ) {
254+ for ( let id = 0 ; id < workersCount ; id ++ ) {
255255 let worker = new Worker ( "./EvalWorker" ) ;
256256 let responseCounter = 0 ;
257257 worker . onmessage = ( msg ) => {
@@ -277,7 +277,7 @@ describe("TNS Workers", () => {
277277
278278 worker . postMessage ( {
279279 eval :
280- "onclose = () => {\
280+ "onclose = () => {\
281281 postMessage('closed');\
282282 close();\
283283 };\
@@ -301,7 +301,7 @@ describe("TNS Workers", () => {
301301
302302 worker . postMessage ( {
303303 eval :
304- "onerror = () => {\
304+ "onerror = () => {\
305305 postMessage('onerror called');\
306306 throw new Error('error');\
307307 };\
@@ -326,12 +326,60 @@ describe("TNS Workers", () => {
326326 } , DEFAULT_TIMEOUT_BEFORE_ASSERT ) ;
327327 } ) ;
328328
329+ it ( "Should not throw errors when accessing native objects and terminating" , ( done ) => {
330+ if ( global . NSObject ) {
331+ done ( ) ;
332+ return ;
333+ }
334+ let onerrorCounter = 0 ;
335+ const delay = ( ms ) => {
336+ new Promise ( ( resolve ) => setTimeout ( resolve , ms ) ) ;
337+ } ;
338+ const run = async ( ) => {
339+ const newWorker = ( ) => {
340+ return new Promise ( ( resolve ) => {
341+ const worker = new Worker ( "./NativeWorkWorker.js" ) ;
342+ worker . onerror = ( err ) => {
343+ onerrorCounter ++ ;
344+ resolve ( worker ) ;
345+ } ;
346+ worker . onmessage = ( result ) => {
347+ try {
348+ if ( result . data !== "success" ) {
349+ onerrorCounter ++ ;
350+ }
351+ if ( onerrorCounter === 0 ) {
352+ worker . terminate ( ) ;
353+ }
354+ } catch ( e ) {
355+ console . log ( e ) ;
356+ }
357+ resolve ( worker ) ;
358+ } ;
359+ worker . postMessage ( 'go!' ) ;
360+ } ) ;
361+ } ;
362+
363+ for ( let i = 0 ; i < 5 ; i ++ ) {
364+ const worker = await newWorker ( ) ;
365+ await delay ( 50 ) ;
366+ // worker.terminate();
367+ // await delay(90);
368+ // worker.terminate();
369+ }
370+ } ;
371+ run ( ) . then ( ( ) => {
372+ expect ( onerrorCounter ) . toBe ( 0 ) ;
373+ done ( ) ;
374+ } ) ;
375+ } ) ;
376+
329377 it ( "If error is thrown in close() should call onerror but should not execute any other tasks " , ( done ) => {
330378 var worker = new Worker ( "./EvalWorker.js" ) ;
331379
332380 worker . postMessage ( {
333381 eval :
334- "onmessage = (msg) => { postMessage(msg.data + ' pong'); };\
382+ "onmessage = (msg) => { postMessage(msg.data + ' pong'); };\
335383 onerror = (err) => { postMessage('pong'); return false; };\
336384 onclose = () => { throw new Error('error thrown from close()'); };\
337385 close();"
@@ -438,7 +486,7 @@ describe("TNS Workers", () => {
438486
439487 worker . postMessage ( {
440488 eval :
441- "onerror = function(err) { \
489+ "onerror = function(err) { \
442490 return false; \
443491 }; \
444492 throw 42;"
@@ -454,7 +502,7 @@ describe("TNS Workers", () => {
454502
455503 worker . postMessage ( {
456504 eval :
457- "onerror = function(err) { \
505+ "onerror = function(err) { \
458506 postMessage(err); \
459507 return true; \
460508 }; \
@@ -480,11 +528,11 @@ describe("TNS Workers", () => {
480528 } , DEFAULT_TIMEOUT_BEFORE_ASSERT ) ;
481529 } ) ;
482530
483- if ( global . NSObject ) { // platform is iOS
531+ if ( global . NSObject ) { // platform is iOS
484532 it ( "no crash during or after runtime teardown on iOS" , ( done ) => {
485533 // reduce number of workers on older (32-bit devices) to avoid sporadic failures due to timeout
486534 const numWorkers = ( interop . sizeof ( interop . types . id ) == 4 ) ? 4 : 10 ;
487- const timeout = DEFAULT_TIMEOUT_BEFORE_ASSERT * 3.5 ;
535+ const timeout = DEFAULT_TIMEOUT_BEFORE_ASSERT * 3.5 ;
488536
489537 let messageProducerTimeout = true ;
490538 let iteration = 0 ;
@@ -500,17 +548,17 @@ describe("TNS Workers", () => {
500548
501549 let onCloseEvents = 0 ;
502550 let onStartEvents = 0 ;
503- for ( let i = 0 ; i < numWorkers ; i ++ ) { ;
504- const worker = new Worker ( "./TeardownCrashWorker.js" ) ;
505- worker . onmessage = ( msg ) => {
506- if ( msg . data === "closing" ) {
507- onCloseEvents ++ ;
508- }
509- else if ( msg . data === "starting" ) {
510- onStartEvents ++ ;
511- worker . postMessage ( i ) ;
512- }
513- }
551+ for ( let i = 0 ; i < numWorkers ; i ++ ) {
552+ const worker = new Worker ( "./TeardownCrashWorker.js" ) ;
553+ worker . onmessage = ( msg ) => {
554+ if ( msg . data === "closing" ) {
555+ onCloseEvents ++ ;
556+ }
557+ else if ( msg . data === "starting" ) {
558+ onStartEvents ++ ;
559+ worker . postMessage ( i ) ;
560+ }
561+ }
514562 }
515563
516564 setTimeout ( ( ) => {
@@ -523,15 +571,15 @@ describe("TNS Workers", () => {
523571 done ( ) ;
524572 } , timeout ) ;
525573 } ) ;
526-
527- it ( "Check for leaked runtimes" , function ( done ) {
574+
575+ it ( "Check for leaked runtimes" , function ( done ) {
528576 setTimeout ( ( ) => {
529577 const runtimesCount = TNSRuntime . runtimes ( ) . count ;
530578 expect ( runtimesCount ) . toBe ( expectedAliveRuntimes , `Found ${ runtimesCount } runtimes alive. Expected ${ expectedAliveRuntimes } .` ) ;
531579 done ( ) ;
532580 } , 1000 ) ;
533581 } ) ;
534-
582+
535583 } // platform is iOS
536584
537585 function generateRandomString ( strLen ) {
0 commit comments