@@ -198,7 +198,7 @@ describe('routing driver with stub server', () => {
198198 // When
199199 const session = driver . session ( neo4j . READ ) ;
200200 session . run ( "MATCH (n) RETURN n.name" ) . catch ( err => {
201- expect ( err . code ) . toEqual ( neo4j . error . PROTOCOL_ERROR ) ;
201+ expect ( err . code ) . toEqual ( neo4j . error . SERVICE_UNAVAILABLE ) ;
202202
203203 session . close ( ) ;
204204 driver . close ( ) ;
@@ -563,7 +563,7 @@ describe('routing driver with stub server', () => {
563563 const session1 = driver . session ( neo4j . session . READ ) ;
564564 session1 . run ( "MATCH (n) RETURN n.name" ) . catch ( ( ) => {
565565 const session2 = driver . session ( neo4j . session . READ ) ;
566- session2 . run ( " MATCH (n) RETURN n.name" ) . then ( ( ) => {
566+ session2 . run ( ' MATCH (n) RETURN n.name' ) . then ( ( ) => {
567567 driver . close ( ) ;
568568 seedServer . exit ( code1 => {
569569 readServer . exit ( code2 => {
@@ -592,8 +592,8 @@ describe('routing driver with stub server', () => {
592592 const session = driver . session ( ) ;
593593 session . run ( "MATCH (n) RETURN n.name" ) . catch ( err => {
594594 expect ( err . code ) . toEqual ( neo4j . error . SERVICE_UNAVAILABLE ) ;
595- expect ( err . message . indexOf ( 'Make sure you are connecting to a causal cluster' ) > 0 ) . toBeTruthy ( ) ;
596- assertHasRouters ( driver , [ '127.0.0.1:9001' ] ) ;
595+ expect ( err . message ) . toContain ( 'Could not perform discovery' ) ;
596+ assertHasRouters ( driver , [ ] ) ;
597597 session . close ( ) ;
598598 driver . close ( ) ;
599599 server . exit ( code => {
@@ -960,31 +960,31 @@ describe('routing driver with stub server', () => {
960960 } ) ;
961961 } ) ;
962962
963- it ( 'should throw protocol error when no records' , done => {
963+ it ( 'should throw error when no records' , done => {
964964 testForProtocolError ( './test/resources/boltstub/empty_get_servers_response.script' , done ) ;
965965 } ) ;
966966
967- it ( 'should throw protocol error when no TTL entry' , done => {
967+ it ( 'should throw error when no TTL entry' , done => {
968968 testForProtocolError ( './test/resources/boltstub/no_ttl_entry_get_servers.script' , done ) ;
969969 } ) ;
970970
971- it ( 'should throw protocol error when no servers entry' , done => {
971+ it ( 'should throw error when no servers entry' , done => {
972972 testForProtocolError ( './test/resources/boltstub/no_servers_entry_get_servers.script' , done ) ;
973973 } ) ;
974974
975- it ( 'should throw protocol error when multiple records' , done => {
975+ it ( 'should throw error when multiple records' , done => {
976976 testForProtocolError ( './test/resources/boltstub/unparsable_ttl_get_servers.script' , done ) ;
977977 } ) ;
978978
979- it ( 'should throw protocol error on unparsable record' , done => {
979+ it ( 'should throw error on unparsable record' , done => {
980980 testForProtocolError ( './test/resources/boltstub/unparsable_servers_get_servers.script' , done ) ;
981981 } ) ;
982982
983- it ( 'should throw protocol error when no routers' , done => {
983+ it ( 'should throw error when no routers' , done => {
984984 testForProtocolError ( './test/resources/boltstub/no_routers_get_servers.script' , done ) ;
985985 } ) ;
986986
987- it ( 'should throw protocol error when no readers' , done => {
987+ it ( 'should throw error when no readers' , done => {
988988 testForProtocolError ( './test/resources/boltstub/no_readers_get_servers.script' , done ) ;
989989 } ) ;
990990
@@ -2125,6 +2125,49 @@ describe('routing driver with stub server', () => {
21252125 } ) ;
21262126 } )
21272127
2128+ it ( 'should revert to initial router if the only known router returns invalid routing table' , done => {
2129+ if ( ! boltStub . supported ) {
2130+ done ( ) ;
2131+ return ;
2132+ }
2133+
2134+ // the first seed to get the routing table
2135+ // the returned routing table includes a non-reachable read-server and points to only one router
2136+ // which will return an invalid routing table
2137+ const router1 = boltStub . start ( './test/resources/boltstub/acquire_endpoints_v3_point_to_empty_router_and_exit.script' , 9001 ) ;
2138+ // returns an empty routing table
2139+ const router2 = boltStub . start ( './test/resources/boltstub/acquire_endpoints_v3_empty.script' , 9004 ) ;
2140+ // returns a normal routing table
2141+ const router3 = boltStub . start ( './test/resources/boltstub/acquire_endpoints_v3_three_servers_and_exit.script' , 9003 ) ;
2142+ // ordinary read server
2143+ const reader = boltStub . start ( './test/resources/boltstub/read_server_v3_read_tx.script' , 9002 ) ;
2144+
2145+ boltStub . run ( ( ) => {
2146+ const driver = boltStub . newDriver ( 'bolt+routing://my.virtual.host:8080' , {
2147+ resolver : address => [ '127.0.0.1:9001' , '127.0.0.1:9003' ]
2148+ } ) ;
2149+
2150+ const session = driver . session ( neo4j . session . READ ) ;
2151+ session . readTransaction ( tx => tx . run ( 'MATCH (n) RETURN n.name' ) ) . then ( res => {
2152+ session . close ( ) ;
2153+ driver . close ( ) ;
2154+ router1 . exit ( code1 => {
2155+ router2 . exit ( code2 => {
2156+ router3 . exit ( code3 => {
2157+ reader . exit ( code4 => {
2158+ expect ( code1 ) . toEqual ( 0 ) ;
2159+ expect ( code2 ) . toEqual ( 0 ) ;
2160+ expect ( code3 ) . toEqual ( 0 ) ;
2161+ expect ( code4 ) . toEqual ( 0 ) ;
2162+ done ( ) ;
2163+ } ) ;
2164+ } ) ;
2165+ } ) ;
2166+ } ) ;
2167+ } ) . catch ( error => done . fail ( error ) ) ;
2168+ } ) ;
2169+ } ) ;
2170+
21282171 function testAddressPurgeOnDatabaseError ( query , accessMode , done ) {
21292172 if ( ! boltStub . supported ) {
21302173 done ( ) ;
@@ -2254,7 +2297,7 @@ describe('routing driver with stub server', () => {
22542297
22552298 const session = driver . session ( ) ;
22562299 session . run ( 'MATCH (n) RETURN n.name' ) . catch ( error => {
2257- expect ( error . code ) . toEqual ( neo4j . error . PROTOCOL_ERROR ) ;
2300+ expect ( error . code ) . toEqual ( neo4j . error . SERVICE_UNAVAILABLE ) ;
22582301
22592302 session . close ( ) ;
22602303 driver . close ( ) ;
0 commit comments