@@ -522,16 +522,106 @@ describe('Pool', () => {
522
522
} ) ;
523
523
} ) ;
524
524
525
+ it ( 'should resolve pending acquisition request when single invalid resource returned' , done => {
526
+ const key = 'bolt://localhost:7687' ;
527
+ const acquisitionTimeout = 1000 ;
528
+ let counter = 0 ;
529
+
530
+ const pool = new Pool (
531
+ ( url , release ) => new Resource ( url , counter ++ , release ) ,
532
+ resource => {
533
+ } ,
534
+ resourceValidOnlyOnceValidationFunction ,
535
+ new PoolConfig ( 1 , acquisitionTimeout )
536
+ ) ;
537
+
538
+ pool . acquire ( key ) . then ( resource1 => {
539
+ expect ( resource1 . id ) . toEqual ( 0 ) ;
540
+ expect ( pool . activeResourceCount ( key ) ) . toEqual ( 1 ) ;
541
+
542
+ // release the resource before the acquisition timeout, it should be treated as invalid
543
+ setTimeout ( ( ) => {
544
+ expectNumberOfAcquisitionRequests ( pool , key , 1 ) ;
545
+ resource1 . close ( ) ;
546
+ } , acquisitionTimeout / 2 ) ;
547
+
548
+ pool . acquire ( key ) . then ( resource2 => {
549
+ expect ( resource2 . id ) . toEqual ( 1 ) ;
550
+ expectNoPendingAcquisitionRequests ( pool ) ;
551
+ expect ( pool . activeResourceCount ( key ) ) . toEqual ( 1 ) ;
552
+ done ( ) ;
553
+ } ) . catch ( error => {
554
+ done . fail ( error ) ;
555
+ } ) ;
556
+ } ) ;
557
+ } ) ;
558
+
559
+ it ( 'should work fine when invalid resources released and acquisition attempt pending' , done => {
560
+ const key = 'bolt://localhost:7687' ;
561
+ const acquisitionTimeout = 1000 ;
562
+ let counter = 0 ;
563
+
564
+ const pool = new Pool (
565
+ ( url , release ) => new Resource ( url , counter ++ , release ) ,
566
+ resource => {
567
+ } ,
568
+ resourceValidOnlyOnceValidationFunction ,
569
+ new PoolConfig ( 2 , acquisitionTimeout )
570
+ ) ;
571
+
572
+ pool . acquire ( key ) . then ( resource1 => {
573
+ expect ( resource1 . id ) . toEqual ( 0 ) ;
574
+ expect ( pool . activeResourceCount ( key ) ) . toEqual ( 1 ) ;
575
+
576
+ pool . acquire ( key ) . then ( resource2 => {
577
+ expect ( resource2 . id ) . toEqual ( 1 ) ;
578
+ expect ( pool . activeResourceCount ( key ) ) . toEqual ( 2 ) ;
579
+
580
+ // release both resources before the acquisition timeout, they should be treated as invalid
581
+ setTimeout ( ( ) => {
582
+ expectNumberOfAcquisitionRequests ( pool , key , 1 ) ;
583
+ resource1 . close ( ) ;
584
+ resource2 . close ( ) ;
585
+ } , acquisitionTimeout / 2 ) ;
586
+
587
+ pool . acquire ( key ) . then ( resource3 => {
588
+ expect ( resource3 . id ) . toEqual ( 2 ) ;
589
+ expectNoPendingAcquisitionRequests ( pool ) ;
590
+ expect ( pool . activeResourceCount ( key ) ) . toEqual ( 1 ) ;
591
+ done ( ) ;
592
+ } ) . catch ( error => {
593
+ done . fail ( error ) ;
594
+ } ) ;
595
+ } ) ;
596
+ } ) ;
597
+ } ) ;
598
+
525
599
} ) ;
526
600
527
601
function expectNoPendingAcquisitionRequests ( pool ) {
528
- expect ( pool . _acquireRequests ) . toEqual ( { } ) ;
602
+ const acquireRequests = pool . _acquireRequests ;
603
+ Object . values ( acquireRequests ) . forEach ( requests => {
604
+ if ( Array . isArray ( requests ) && requests . length === 0 ) {
605
+ requests = undefined ;
606
+ }
607
+ expect ( requests ) . not . toBeDefined ( ) ;
608
+ } ) ;
529
609
}
530
610
531
611
function expectNumberOfAcquisitionRequests ( pool , key , expectedNumber ) {
532
612
expect ( pool . _acquireRequests [ key ] . length ) . toEqual ( expectedNumber ) ;
533
613
}
534
614
615
+ function resourceValidOnlyOnceValidationFunction ( resource ) {
616
+ // all resources are valid only once
617
+ if ( resource . validatedOnce ) {
618
+ return false ;
619
+ } else {
620
+ resource . validatedOnce = true ;
621
+ return true ;
622
+ }
623
+ }
624
+
535
625
class Resource {
536
626
537
627
constructor ( key , id , release ) {
0 commit comments