@@ -2493,24 +2493,24 @@ describe('#unit RoutingConnectionProvider', () => {
2493
2493
expect ( serverInfo ) . toEqual ( new ServerInfo ( server , protocolVersion ) )
2494
2494
} )
2495
2495
2496
- it ( 'should acquire, resetAndFlush and release connections for sever with the selected access mode ' , async ( ) => {
2496
+ it ( 'should acquire, resetAndFlush and release connections for sever first ' , async ( ) => {
2497
2497
const { connectionProvider, routingTable, seenConnectionsPerAddress, pool } = setup ( )
2498
2498
const acquireSpy = jest . spyOn ( pool , 'acquire' )
2499
2499
2500
2500
await connectionProvider . verifyConnectivityAndGetServerInfo ( { database, accessMode } )
2501
2501
2502
2502
const targetServers = accessMode === WRITE ? routingTable . writers : routingTable . readers
2503
- for ( const address of targetServers ) {
2504
- expect ( acquireSpy ) . toHaveBeenCalledWith ( address )
2503
+ const address = targetServers [ 0 ]
2504
+ expect ( acquireSpy ) . toHaveBeenCalledWith ( address )
2505
2505
2506
- const connections = seenConnectionsPerAddress . get ( address )
2506
+ const connections = seenConnectionsPerAddress . get ( address )
2507
2507
2508
- expect ( connections . length ) . toBe ( 1 )
2509
- expect ( connections [ 0 ] . resetAndFlush ) . toHaveBeenCalled ( )
2510
- expect ( connections [ 0 ] . _release ) . toHaveBeenCalled ( )
2511
- expect ( connections [ 0 ] . _release . mock . invocationCallOrder [ 0 ] )
2512
- . toBeGreaterThan ( connections [ 0 ] . resetAndFlush . mock . invocationCallOrder [ 0 ] )
2513
- }
2508
+ expect ( connections . length ) . toBe ( 1 )
2509
+ expect ( connections [ 0 ] . resetAndFlush ) . toHaveBeenCalled ( )
2510
+ expect ( connections [ 0 ] . _release ) . toHaveBeenCalled ( )
2511
+ expect ( connections [ 0 ] . _release . mock . invocationCallOrder [ 0 ] )
2512
+ . toBeGreaterThan ( connections [ 0 ] . resetAndFlush . mock . invocationCallOrder [ 0 ] )
2513
+
2514
2514
} )
2515
2515
2516
2516
it ( 'should not acquire, resetAndFlush and release connections for sever with the other access mode' , async ( ) => {
@@ -2527,20 +2527,96 @@ describe('#unit RoutingConnectionProvider', () => {
2527
2527
} )
2528
2528
2529
2529
describe ( 'when the reset and flush fails for at least one the address' , ( ) => {
2530
- it ( 'should fails with the reset and flush error ' , async ( ) => {
2530
+ it ( 'should succeed with the server info ' , async ( ) => {
2531
2531
const error = newError ( 'Error' )
2532
2532
let i = 0
2533
2533
const resetAndFlush = jest . fn ( ( ) => i ++ % 2 == 0 ? Promise . reject ( error ) : Promise . resolve ( ) )
2534
- const { connectionProvider } = setup ( { resetAndFlush } )
2534
+ const { connectionProvider, server, protocolVersion } = setup ( { resetAndFlush } )
2535
+
2536
+ const serverInfo = await connectionProvider . verifyConnectivityAndGetServerInfo ( { database, accessMode } )
2537
+
2538
+ expect ( serverInfo ) . toEqual ( new ServerInfo ( server , protocolVersion ) )
2539
+ } )
2540
+
2541
+ it ( 'should release the connection' , async ( ) => {
2542
+ const error = newError ( 'Error' )
2543
+ let i = 0
2544
+ const resetAndFlush = jest . fn ( ( ) => i ++ % 2 == 0 ? Promise . reject ( error ) : Promise . resolve ( ) )
2545
+ const { connectionProvider, seenConnectionsPerAddress, routingTable } = setup ( { resetAndFlush } )
2535
2546
2536
2547
try {
2537
2548
await connectionProvider . verifyConnectivityAndGetServerInfo ( { database, accessMode } )
2538
- expect ( ) . toBe ( 'Not reached' )
2539
2549
} catch ( e ) {
2550
+ } finally {
2551
+ const targetServers = accessMode === WRITE ? routingTable . writers : routingTable . readers
2552
+ for ( const address of targetServers ) {
2553
+ const connections = seenConnectionsPerAddress . get ( address )
2554
+
2555
+ expect ( connections . length ) . toBe ( 1 )
2556
+ expect ( connections [ 0 ] . resetAndFlush ) . toHaveBeenCalled ( )
2557
+ expect ( connections [ 0 ] . _release ) . toHaveBeenCalled ( )
2558
+ }
2559
+ }
2560
+ } )
2561
+
2562
+ describe ( 'and the release fails' , ( ) => {
2563
+ it ( 'should fails with the release error' , async ( ) => {
2564
+ const error = newError ( 'Error' )
2565
+ const releaseError = newError ( 'Release error' )
2566
+ let i = 0
2567
+ const resetAndFlush = jest . fn ( ( ) => i ++ % 2 == 0 ? Promise . reject ( error ) : Promise . resolve ( ) )
2568
+ const releaseMock = jest . fn ( ( ) => Promise . reject ( releaseError ) )
2569
+ const { connectionProvider } = setup ( { resetAndFlush, releaseMock } )
2570
+
2571
+ try {
2572
+ await connectionProvider . verifyConnectivityAndGetServerInfo ( { database, accessMode } )
2573
+ expect ( ) . toBe ( 'Not reached' )
2574
+ } catch ( e ) {
2575
+ expect ( e ) . toBe ( releaseError )
2576
+ }
2577
+ } )
2578
+ } )
2579
+ } )
2580
+
2581
+ describe ( 'when the reset and flush fails for all addresses' , ( ) => {
2582
+ it ( 'should succeed with the server info ' , async ( ) => {
2583
+ const error = newError ( 'Error' )
2584
+ const resetAndFlush = jest . fn ( ( ) => Promise . reject ( error ) )
2585
+ const { connectionProvider } = setup ( { resetAndFlush } )
2586
+
2587
+ try {
2588
+ await connectionProvider . verifyConnectivityAndGetServerInfo ( { database, accessMode } )
2589
+ expect ( ) . toBe ( 'Not reached' )
2590
+ } catch ( e ) {
2540
2591
expect ( e ) . toBe ( error )
2541
2592
}
2542
2593
} )
2543
2594
2595
+ it ( 'should acquire, resetAndFlush and release connections for all servers' , async ( ) => {
2596
+ const resetAndFlush = jest . fn ( ( ) => Promise . reject ( error ) )
2597
+ const { connectionProvider, routingTable, seenConnectionsPerAddress, pool } = setup ( { resetAndFlush } )
2598
+ const acquireSpy = jest . spyOn ( pool , 'acquire' )
2599
+
2600
+ try {
2601
+ await connectionProvider . verifyConnectivityAndGetServerInfo ( { database, accessMode } )
2602
+ } catch ( e ) {
2603
+ // nothing to do
2604
+ } finally {
2605
+ const targetServers = accessMode === WRITE ? routingTable . writers : routingTable . readers
2606
+ for ( const address of targetServers ) {
2607
+ expect ( acquireSpy ) . toHaveBeenCalledWith ( address )
2608
+
2609
+ const connections = seenConnectionsPerAddress . get ( address )
2610
+
2611
+ expect ( connections . length ) . toBe ( 1 )
2612
+ expect ( connections [ 0 ] . resetAndFlush ) . toHaveBeenCalled ( )
2613
+ expect ( connections [ 0 ] . _release ) . toHaveBeenCalled ( )
2614
+ expect ( connections [ 0 ] . _release . mock . invocationCallOrder [ 0 ] )
2615
+ . toBeGreaterThan ( connections [ 0 ] . resetAndFlush . mock . invocationCallOrder [ 0 ] )
2616
+ }
2617
+ }
2618
+ } )
2619
+
2544
2620
it ( 'should release the connection' , async ( ) => {
2545
2621
const error = newError ( 'Error' )
2546
2622
let i = 0
@@ -2583,16 +2659,28 @@ describe('#unit RoutingConnectionProvider', () => {
2583
2659
} )
2584
2660
2585
2661
describe ( 'when the release for at least one the address' , ( ) => {
2586
- it ( 'should fails with the reset and flush error ' , async ( ) => {
2662
+ it ( 'should succeed with the server info ' , async ( ) => {
2587
2663
const error = newError ( 'Error' )
2588
2664
let i = 0
2589
2665
const releaseMock = jest . fn ( ( ) => i ++ % 2 == 0 ? Promise . reject ( error ) : Promise . resolve ( ) )
2666
+ const { connectionProvider, server, protocolVersion } = setup ( { releaseMock } )
2667
+
2668
+ const serverInfo = await connectionProvider . verifyConnectivityAndGetServerInfo ( { database, accessMode } )
2669
+
2670
+ expect ( serverInfo ) . toEqual ( new ServerInfo ( server , protocolVersion ) )
2671
+ } )
2672
+ } )
2673
+
2674
+ describe ( 'when the release for all address' , ( ) => {
2675
+ it ( 'should fail with release error' , async ( ) => {
2676
+ const error = newError ( 'Error' )
2677
+ const releaseMock = jest . fn ( ( ) => Promise . reject ( error ) )
2590
2678
const { connectionProvider } = setup ( { releaseMock } )
2591
2679
2592
2680
try {
2593
2681
await connectionProvider . verifyConnectivityAndGetServerInfo ( { database, accessMode } )
2594
2682
expect ( ) . toBe ( 'Not reached' )
2595
- } catch ( e ) {
2683
+ } catch ( e ) {
2596
2684
expect ( e ) . toBe ( error )
2597
2685
}
2598
2686
} )
@@ -2668,7 +2756,7 @@ describe('#unit RoutingConnectionProvider', () => {
2668
2756
} )
2669
2757
2670
2758
describe ( 'when at least the one of the connections could not be created' , ( ) => {
2671
- it ( 'should reject with acquistion timeout error ' , async ( ) => {
2759
+ it ( 'should succeed with the server info ' , async ( ) => {
2672
2760
let i = 0
2673
2761
const error = new Error ( 'Connection creation error' )
2674
2762
const routingTable = newRoutingTable (
@@ -2694,11 +2782,46 @@ describe('#unit RoutingConnectionProvider', () => {
2694
2782
pool
2695
2783
)
2696
2784
2785
+ const serverInfo = connectionProvider = await connectionProvider . verifyConnectivityAndGetServerInfo ( { database, accessMode } )
2786
+ expect ( serverInfo ) . toEqual ( new ServerInfo ( { } , 4.4 ) )
2787
+ } )
2788
+ } )
2789
+
2790
+ describe ( 'when there is not server available in the routing table' , ( ) => {
2791
+ it ( 'should thown an discovery error' , async ( ) => {
2792
+ const expectedError = newError (
2793
+ `No servers available for database '${ database || null } ' with access mode '${ accessMode || READ } '` ,
2794
+ SERVICE_UNAVAILABLE
2795
+ )
2796
+ const routingTable = newRoutingTable (
2797
+ database || null ,
2798
+ [ server1 , server2 ] ,
2799
+ accessMode === READ ? [ ] : [ server3 , server4 ] ,
2800
+ accessMode === WRITE ? [ ] : [ server5 , server6 ] ,
2801
+ Integer . MAX_SAFE_VALUE
2802
+ )
2803
+
2804
+ const routingTableToRouters = { }
2805
+ const routingMap = { }
2806
+ routingMap [ server0 . asKey ( ) ] = routingTable
2807
+ routingMap [ server1 . asKey ( ) ] = routingTable
2808
+ routingMap [ server2 . asKey ( ) ] = routingTable
2809
+ routingTableToRouters [ database || null ] = routingMap
2810
+
2811
+ const connectionProvider = newRoutingConnectionProviderWithSeedRouter (
2812
+ server0 ,
2813
+ [ server0 ] , // seed router address resolves just to itself
2814
+ [
2815
+ routingTable
2816
+ ] ,
2817
+ routingTableToRouters
2818
+ )
2819
+
2697
2820
try {
2698
- connectionProvider = await connectionProvider . verifyConnectivityAndGetServerInfo ( { database, accessMode } )
2821
+ await connectionProvider . verifyConnectivityAndGetServerInfo ( { database, accessMode } )
2699
2822
expect ( ) . toBe ( 'not reached' )
2700
- } catch ( e ) {
2701
- expect ( e ) . toBe ( error )
2823
+ } catch ( error ) {
2824
+ expect ( error ) . toEqual ( expectedError )
2702
2825
}
2703
2826
} )
2704
2827
} )
0 commit comments