private void createTransportSet(SocketAddress... addrs) { addressGroup = new EquivalentAddressGroup(Arrays.asList(addrs)); transportSet = new TransportSet( addressGroup, AUTHORITY, USER_AGENT, mockLoadBalancer, mockBackoffPolicyProvider, mockTransportFactory, fakeClock.getScheduledExecutorService(), fakeClock.getStopwatchSupplier(), fakeExecutor.getScheduledExecutorService(), mockTransportSetCallback); }
@Test public void scheduleBackoff_DoNotScheduleEndOfBackoffIfAlreadyShutdown() { // Setup final boolean[] startBackoffAndShutdownAreCalled = {false}; Executor executor = new Executor() { @Override public void execute(Runnable command) { if (command.getClass().getName().contains("FailTheFailFastPendingStreams")) { // shutdown during startBackoff transportSet.shutdown(); startBackoffAndShutdownAreCalled[0] = true; } fakeExecutor.getScheduledExecutorService().execute(command); } }; SocketAddress addr = mock(SocketAddress.class); addressGroup = new EquivalentAddressGroup(Arrays.asList(addr)); transportSet = new TransportSet( addressGroup, AUTHORITY, USER_AGENT, mockLoadBalancer, mockBackoffPolicyProvider, mockTransportFactory, fakeClock.getScheduledExecutorService(), fakeClock.getStopwatchSupplier(), executor, mockTransportSetCallback); // Attempt and fail, scheduleBackoff should be triggered, // and transportSet.shutdown should be triggered by setup transportSet .obtainActiveTransport() .newStream(method, new Metadata(), waitForReadyCallOptions, statsTraceCtx); transports.poll().listener.transportShutdown(Status.UNAVAILABLE); verify(mockTransportSetCallback, times(1)).onAllAddressesFailed(); assertTrue(startBackoffAndShutdownAreCalled[0]); fakeExecutor.runDueTasks(); // verify endOfBackoff not scheduled verify(mockBackoffPolicy1, never()).nextBackoffMillis(); }