24
24
import java .io .IOException ;
25
25
import java .net .ServerSocket ;
26
26
import java .net .URI ;
27
+ import java .util .Arrays ;
28
+ import java .util .Iterator ;
27
29
import java .util .List ;
28
30
29
31
import org .neo4j .driver .exceptions .ServiceUnavailableException ;
@@ -73,7 +75,7 @@ void shouldLogWhenUnableToCreateRoutingDriver()
73
75
when ( logging .getLog ( any ( Class .class ) ) ).thenReturn ( logger );
74
76
InternalDriver driver = mock ( InternalDriver .class );
75
77
doThrow ( ServiceUnavailableException .class ).when ( driver ).verifyConnectivity ();
76
- DriverFactory driverFactory = new MockSupplyingDriverFactory ( driver );
78
+ DriverFactory driverFactory = new MockSupplyingDriverFactory ( Arrays . asList ( driver , driver ) );
77
79
Config config = Config .builder ()
78
80
.withLogging ( logging )
79
81
.build ();
@@ -85,10 +87,35 @@ void shouldLogWhenUnableToCreateRoutingDriver()
85
87
assertThrows ( ServiceUnavailableException .class , () -> GraphDatabase .routingDriver ( routingUris , AuthTokens .none (), config , driverFactory ) );
86
88
87
89
verify ( logger ).warn ( eq ( "Unable to create routing driver for URI: neo4j://localhost:9001" ),
88
- any ( Throwable .class ) );
90
+ any ( Throwable .class ) );
89
91
90
92
verify ( logger ).warn ( eq ( "Unable to create routing driver for URI: neo4j://localhost:9002" ),
91
- any ( Throwable .class ) );
93
+ any ( Throwable .class ) );
94
+ }
95
+
96
+ @ Test
97
+ void shouldNotFailRoutingDriverWhenThereIsWorkingUri ()
98
+ {
99
+ Logging logging = mock ( Logging .class );
100
+ Logger logger = mock ( Logger .class );
101
+ when ( logging .getLog ( any ( Class .class ) ) ).thenReturn ( logger );
102
+ InternalDriver failingDriver = mock ( InternalDriver .class );
103
+ doThrow ( ServiceUnavailableException .class ).when ( failingDriver ).verifyConnectivity ();
104
+ InternalDriver workingDriver = mock ( InternalDriver .class );
105
+ DriverFactory driverFactory = new MockSupplyingDriverFactory ( Arrays .asList ( failingDriver , workingDriver ) );
106
+ Config config = Config .builder ()
107
+ .withLogging ( logging )
108
+ .build ();
109
+
110
+ List <URI > routingUris = asList (
111
+ URI .create ( "neo4j://localhost:9001" ),
112
+ URI .create ( "neo4j://localhost:9002" ) );
113
+
114
+ Driver driver = GraphDatabase .routingDriver ( routingUris , AuthTokens .none (), config , driverFactory );
115
+
116
+ verify ( logger ).warn ( eq ( "Unable to create routing driver for URI: neo4j://localhost:9001" ),
117
+ any ( Throwable .class ) );
118
+ assertEquals ( driver , workingDriver );
92
119
}
93
120
94
121
@ Test
@@ -184,19 +211,19 @@ private static Config createConfig( boolean encrypted, int timeoutMillis )
184
211
185
212
private static class MockSupplyingDriverFactory extends DriverFactory
186
213
{
187
- private final InternalDriver driver ;
214
+ private final Iterator < InternalDriver > driverIterator ;
188
215
189
- private MockSupplyingDriverFactory ( InternalDriver driver )
216
+ private MockSupplyingDriverFactory ( List < InternalDriver > drivers )
190
217
{
191
- this . driver = driver ;
218
+ driverIterator = drivers . iterator () ;
192
219
}
193
220
194
221
@ Override
195
222
protected InternalDriver createRoutingDriver ( SecurityPlan securityPlan , BoltServerAddress address , ConnectionPool connectionPool ,
196
223
EventExecutorGroup eventExecutorGroup , RoutingSettings routingSettings , RetryLogic retryLogic ,
197
224
MetricsProvider metricsProvider , Config config )
198
225
{
199
- return driver ;
226
+ return driverIterator . next () ;
200
227
}
201
228
}
202
229
}
0 commit comments