core: refactor ManagedChannelImplTest with a configurable builder

In previous code of `ManagedChannelImplTest`, new tests will have to add more and more custom args in `createChannel(...)`, and each time when a custom arg is needed all other default args need be repeatedly provided in `createChannel(...)`. In most cases those args are just builder attributes. So this PR makes ManagedChannelImplTest easier to stub by providing a builder field, then new tests will just set necessary builder attributes before calling `createChannel()`.
This commit is contained in:
ZHANG Dapeng 2018-04-19 10:06:39 -07:00 committed by GitHub
parent f6a032d6b2
commit e67a61fa08
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 167 additions and 182 deletions

View File

@ -139,6 +139,7 @@ public abstract class AbstractManagedChannelImplBuilder
private int maxInboundMessageSize = GrpcUtil.DEFAULT_MAX_MESSAGE_SIZE; private int maxInboundMessageSize = GrpcUtil.DEFAULT_MAX_MESSAGE_SIZE;
@Nullable
BinaryLogProvider binlogProvider = BinaryLogProvider.provider(); BinaryLogProvider binlogProvider = BinaryLogProvider.provider();
/** /**

View File

@ -117,8 +117,6 @@ import org.mockito.stubbing.Answer;
/** Unit tests for {@link ManagedChannelImpl}. */ /** Unit tests for {@link ManagedChannelImpl}. */
@RunWith(JUnit4.class) @RunWith(JUnit4.class)
public class ManagedChannelImplTest { public class ManagedChannelImplTest {
private static final List<ClientInterceptor> NO_INTERCEPTOR =
Collections.<ClientInterceptor>emptyList();
private static final Attributes NAME_RESOLVER_PARAMS = private static final Attributes NAME_RESOLVER_PARAMS =
Attributes.newBuilder().set(NameResolver.Factory.PARAMS_DEFAULT_PORT, 447).build(); Attributes.newBuilder().set(NameResolver.Factory.PARAMS_DEFAULT_PORT, 447).build();
private static final MethodDescriptor<String, Integer> method = private static final MethodDescriptor<String, Integer> method =
@ -131,11 +129,11 @@ public class ManagedChannelImplTest {
private static final Attributes.Key<String> SUBCHANNEL_ATTR_KEY = private static final Attributes.Key<String> SUBCHANNEL_ATTR_KEY =
Attributes.Key.of("subchannel-attr-key"); Attributes.Key.of("subchannel-attr-key");
private static final long RECONNECT_BACKOFF_INTERVAL_NANOS = 10; private static final long RECONNECT_BACKOFF_INTERVAL_NANOS = 10;
private final String serviceName = "fake.example.com"; private static final String SERVICE_NAME = "fake.example.com";
private final String authority = serviceName; private static final String AUTHORITY = SERVICE_NAME;
private final String userAgent = "userAgent"; private static final String USER_AGENT = "userAgent";
private final ProxyParameters noProxy = null; private static final ProxyParameters NO_PROXY = null;
private final String target = "fake://" + serviceName; private static final String TARGET = "fake://" + SERVICE_NAME;
private URI expectedUri; private URI expectedUri;
private final SocketAddress socketAddress = new SocketAddress() {}; private final SocketAddress socketAddress = new SocketAddress() {};
private final EquivalentAddressGroup addressGroup = new EquivalentAddressGroup(socketAddress); private final EquivalentAddressGroup addressGroup = new EquivalentAddressGroup(socketAddress);
@ -197,52 +195,18 @@ public class ManagedChannelImplTest {
private ObjectPool<Executor> oobExecutorPool; private ObjectPool<Executor> oobExecutorPool;
@Mock @Mock
private CallCredentials creds; private CallCredentials creds;
private BinaryLogProvider binlogProvider = null; private ChannelBuilder channelBuilder;
private boolean requestConnection = true;
private BlockingQueue<MockClientTransportInfo> transports; private BlockingQueue<MockClientTransportInfo> transports;
private ArgumentCaptor<ClientStreamListener> streamListenerCaptor = private ArgumentCaptor<ClientStreamListener> streamListenerCaptor =
ArgumentCaptor.forClass(ClientStreamListener.class); ArgumentCaptor.forClass(ClientStreamListener.class);
private void createChannel( private void createChannel(ClientInterceptor... interceptors) {
NameResolver.Factory nameResolverFactory, List<ClientInterceptor> interceptors) {
createChannel(
nameResolverFactory, interceptors, true /* requestConnection */,
ManagedChannelImpl.IDLE_TIMEOUT_MILLIS_DISABLE);
}
private void createChannel(
NameResolver.Factory nameResolverFactory, List<ClientInterceptor> interceptors,
boolean requestConnection, long idleTimeoutMillis) {
class Builder extends AbstractManagedChannelImplBuilder<Builder> {
Builder(String target) {
super(target);
}
@Override protected ClientTransportFactory buildTransportFactory() {
throw new UnsupportedOperationException();
}
@Override protected Attributes getNameResolverParams() {
return NAME_RESOLVER_PARAMS;
}
@Override public Builder usePlaintext() {
throw new UnsupportedOperationException();
}
}
Builder builder = new Builder(target)
.nameResolverFactory(nameResolverFactory)
.loadBalancerFactory(mockLoadBalancerFactory)
.userAgent(userAgent);
builder.executorPool = executorPool;
builder.idleTimeoutMillis = idleTimeoutMillis;
builder.binlogProvider = binlogProvider;
builder.channelz = channelz;
checkState(channel == null); checkState(channel == null);
channel = new ManagedChannelImpl( channel = new ManagedChannelImpl(
builder, mockTransportFactory, new FakeBackoffPolicyProvider(), channelBuilder, mockTransportFactory, new FakeBackoffPolicyProvider(),
oobExecutorPool, timer.getStopwatchSupplier(), interceptors, oobExecutorPool, timer.getStopwatchSupplier(), Arrays.asList(interceptors),
channelStatsFactory); channelStatsFactory);
if (requestConnection) { if (requestConnection) {
@ -250,7 +214,7 @@ public class ManagedChannelImplTest {
// Force-exit the initial idle-mode // Force-exit the initial idle-mode
channel.exitIdleMode(); channel.exitIdleMode();
if (idleTimeoutMillis != ManagedChannelImpl.IDLE_TIMEOUT_MILLIS_DISABLE) { if (channelBuilder.idleTimeoutMillis != ManagedChannelImpl.IDLE_TIMEOUT_MILLIS_DISABLE) {
numExpectedTasks += 1; numExpectedTasks += 1;
} }
@ -269,13 +233,22 @@ public class ManagedChannelImplTest {
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
expectedUri = new URI(target); expectedUri = new URI(TARGET);
when(mockLoadBalancerFactory.newLoadBalancer(any(Helper.class))).thenReturn(mockLoadBalancer); when(mockLoadBalancerFactory.newLoadBalancer(any(Helper.class))).thenReturn(mockLoadBalancer);
transports = TestUtils.captureTransports(mockTransportFactory); transports = TestUtils.captureTransports(mockTransportFactory);
when(mockTransportFactory.getScheduledExecutorService()) when(mockTransportFactory.getScheduledExecutorService())
.thenReturn(timer.getScheduledExecutorService()); .thenReturn(timer.getScheduledExecutorService());
when(executorPool.getObject()).thenReturn(executor.getScheduledExecutorService()); when(executorPool.getObject()).thenReturn(executor.getScheduledExecutorService());
when(oobExecutorPool.getObject()).thenReturn(oobExecutor.getScheduledExecutorService()); when(oobExecutorPool.getObject()).thenReturn(oobExecutor.getScheduledExecutorService());
channelBuilder = new ChannelBuilder()
.nameResolverFactory(new FakeNameResolverFactory.Builder(expectedUri).build())
.loadBalancerFactory(mockLoadBalancerFactory)
.userAgent(USER_AGENT)
.idleTimeout(AbstractManagedChannelImplBuilder.IDLE_MODE_MAX_TIMEOUT_DAYS, TimeUnit.DAYS);
channelBuilder.executorPool = executorPool;
channelBuilder.binlogProvider = null;
channelBuilder.channelz = channelz;
} }
@After @After
@ -295,11 +268,11 @@ public class ManagedChannelImplTest {
@Test @Test
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public void idleModeDisabled() { public void idleModeDisabled() {
createChannel( channelBuilder.nameResolverFactory(
new FakeNameResolverFactory.Builder(expectedUri) new FakeNameResolverFactory.Builder(expectedUri)
.setServers(Collections.singletonList(new EquivalentAddressGroup(socketAddress))) .setServers(Collections.singletonList(new EquivalentAddressGroup(socketAddress)))
.build(), .build());
NO_INTERCEPTOR); createChannel();
// In this test suite, the channel is always created with idle mode disabled. // In this test suite, the channel is always created with idle mode disabled.
// No task is scheduled to enter idle mode // No task is scheduled to enter idle mode
@ -309,7 +282,7 @@ public class ManagedChannelImplTest {
@Test @Test
public void immediateDeadlineExceeded() { public void immediateDeadlineExceeded() {
createChannel(new FakeNameResolverFactory.Builder(expectedUri).build(), NO_INTERCEPTOR); createChannel();
ClientCall<String, Integer> call = ClientCall<String, Integer> call =
channel.newCall(method, CallOptions.DEFAULT.withDeadlineAfter(0, TimeUnit.NANOSECONDS)); channel.newCall(method, CallOptions.DEFAULT.withDeadlineAfter(0, TimeUnit.NANOSECONDS));
call.start(mockCallListener, new Metadata()); call.start(mockCallListener, new Metadata());
@ -322,11 +295,11 @@ public class ManagedChannelImplTest {
@Test @Test
public void shutdownWithNoTransportsEverCreated() { public void shutdownWithNoTransportsEverCreated() {
createChannel( channelBuilder.nameResolverFactory(
new FakeNameResolverFactory.Builder(expectedUri) new FakeNameResolverFactory.Builder(expectedUri)
.setServers(Collections.singletonList(new EquivalentAddressGroup(socketAddress))) .setServers(Collections.singletonList(new EquivalentAddressGroup(socketAddress)))
.build(), .build());
NO_INTERCEPTOR); createChannel();
verify(executorPool).getObject(); verify(executorPool).getObject();
verify(executorPool, never()).returnObject(anyObject()); verify(executorPool, never()).returnObject(anyObject());
verify(mockTransportFactory).getScheduledExecutorService(); verify(mockTransportFactory).getScheduledExecutorService();
@ -339,7 +312,7 @@ public class ManagedChannelImplTest {
@Test @Test
public void channelzMembership() throws Exception { public void channelzMembership() throws Exception {
createChannel(new FakeNameResolverFactory.Builder(expectedUri).build(), NO_INTERCEPTOR); createChannel();
assertNotNull(channelz.getRootChannel(channel.getLogId().getId())); assertNotNull(channelz.getRootChannel(channel.getLogId().getId()));
assertFalse(channelz.containsSubchannel(channel.getLogId())); assertFalse(channelz.containsSubchannel(channel.getLogId()));
channel.shutdownNow(); channel.shutdownNow();
@ -350,7 +323,7 @@ public class ManagedChannelImplTest {
@Test @Test
public void channelzMembership_subchannel() throws Exception { public void channelzMembership_subchannel() throws Exception {
createChannel(new FakeNameResolverFactory.Builder(expectedUri).build(), NO_INTERCEPTOR); createChannel();
assertNotNull(channelz.getRootChannel(channel.getLogId().getId())); assertNotNull(channelz.getRootChannel(channel.getLogId().getId()));
AbstractSubchannel subchannel = AbstractSubchannel subchannel =
@ -384,8 +357,8 @@ public class ManagedChannelImplTest {
@Test @Test
public void channelzMembership_oob() throws Exception { public void channelzMembership_oob() throws Exception {
createChannel(new FakeNameResolverFactory.Builder(expectedUri).build(), NO_INTERCEPTOR); createChannel();
OobChannel oob = (OobChannel) helper.createOobChannel(addressGroup, authority); OobChannel oob = (OobChannel) helper.createOobChannel(addressGroup, AUTHORITY);
// oob channels are not root channels // oob channels are not root channels
assertNull(channelz.getRootChannel(oob.getLogId().getId())); assertNull(channelz.getRootChannel(oob.getLogId().getId()));
assertTrue(channelz.containsSubchannel(oob.getLogId())); assertTrue(channelz.containsSubchannel(oob.getLogId()));
@ -436,7 +409,8 @@ public class ManagedChannelImplTest {
private void subtestCallsAndShutdown(boolean shutdownNow, boolean shutdownNowAfterShutdown) { private void subtestCallsAndShutdown(boolean shutdownNow, boolean shutdownNowAfterShutdown) {
FakeNameResolverFactory nameResolverFactory = FakeNameResolverFactory nameResolverFactory =
new FakeNameResolverFactory.Builder(expectedUri).build(); new FakeNameResolverFactory.Builder(expectedUri).build();
createChannel(nameResolverFactory, NO_INTERCEPTOR); channelBuilder.nameResolverFactory(nameResolverFactory);
createChannel();
verify(executorPool).getObject(); verify(executorPool).getObject();
ClientStream mockStream = mock(ClientStream.class); ClientStream mockStream = mock(ClientStream.class);
ClientStream mockStream2 = mock(ClientStream.class); ClientStream mockStream2 = mock(ClientStream.class);
@ -569,8 +543,9 @@ public class ManagedChannelImplTest {
new FakeNameResolverFactory.Builder(expectedUri) new FakeNameResolverFactory.Builder(expectedUri)
.setServers(Collections.singletonList(new EquivalentAddressGroup(socketAddress))) .setServers(Collections.singletonList(new EquivalentAddressGroup(socketAddress)))
.build(); .build();
channelBuilder.nameResolverFactory(nameResolverFactory);
Status resolutionError = Status.UNAVAILABLE.withDescription("Resolution failed"); Status resolutionError = Status.UNAVAILABLE.withDescription("Resolution failed");
createChannel(nameResolverFactory, NO_INTERCEPTOR); createChannel();
FakeNameResolverFactory.FakeNameResolver resolver = nameResolverFactory.resolvers.get(0); FakeNameResolverFactory.FakeNameResolver resolver = nameResolverFactory.resolvers.get(0);
verify(mockLoadBalancerFactory).newLoadBalancer(any(Helper.class)); verify(mockLoadBalancerFactory).newLoadBalancer(any(Helper.class));
@ -624,8 +599,7 @@ public class ManagedChannelImplTest {
return next.newCall(method, callOptions); return next.newCall(method, callOptions);
} }
}; };
createChannel( createChannel(interceptor);
new FakeNameResolverFactory.Builder(expectedUri).build(), Arrays.asList(interceptor));
assertNotNull(channel.newCall(method, CallOptions.DEFAULT)); assertNotNull(channel.newCall(method, CallOptions.DEFAULT));
assertEquals(1, atomic.get()); assertEquals(1, atomic.get());
} }
@ -635,7 +609,7 @@ public class ManagedChannelImplTest {
Metadata headers = new Metadata(); Metadata headers = new Metadata();
ClientStream mockStream = mock(ClientStream.class); ClientStream mockStream = mock(ClientStream.class);
FakeClock callExecutor = new FakeClock(); FakeClock callExecutor = new FakeClock();
createChannel(new FakeNameResolverFactory.Builder(expectedUri).build(), NO_INTERCEPTOR); createChannel();
// Start a call with a call executor // Start a call with a call executor
CallOptions options = CallOptions options =
@ -693,8 +667,9 @@ public class ManagedChannelImplTest {
.setServers(Collections.singletonList(new EquivalentAddressGroup(socketAddress))) .setServers(Collections.singletonList(new EquivalentAddressGroup(socketAddress)))
.setError(error) .setError(error)
.build(); .build();
channelBuilder.nameResolverFactory(nameResolverFactory);
// Name resolution is started as soon as channel is created. // Name resolution is started as soon as channel is created.
createChannel(nameResolverFactory, NO_INTERCEPTOR); createChannel();
FakeNameResolverFactory.FakeNameResolver resolver = nameResolverFactory.resolvers.get(0); FakeNameResolverFactory.FakeNameResolver resolver = nameResolverFactory.resolvers.get(0);
verify(mockLoadBalancer).handleNameResolutionError(same(error)); verify(mockLoadBalancer).handleNameResolutionError(same(error));
assertEquals(1, timer.numPendingTasks(NAME_RESOLVER_REFRESH_TASK_FILTER)); assertEquals(1, timer.numPendingTasks(NAME_RESOLVER_REFRESH_TASK_FILTER));
@ -736,8 +711,9 @@ public class ManagedChannelImplTest {
FakeNameResolverFactory nameResolverFactory = FakeNameResolverFactory nameResolverFactory =
new FakeNameResolverFactory.Builder(expectedUri).setError(error).build(); new FakeNameResolverFactory.Builder(expectedUri).setError(error).build();
channelBuilder.nameResolverFactory(nameResolverFactory);
// Name resolution is started as soon as channel is created. // Name resolution is started as soon as channel is created.
createChannel(nameResolverFactory, NO_INTERCEPTOR); createChannel();
verify(mockLoadBalancer).handleNameResolutionError(same(error)); verify(mockLoadBalancer).handleNameResolutionError(same(error));
FakeClock.ScheduledTask nameResolverBackoff = getNameResolverRefresh(); FakeClock.ScheduledTask nameResolverBackoff = getNameResolverRefresh();
@ -770,7 +746,7 @@ public class ManagedChannelImplTest {
String errorDescription = "NameResolver returned an empty list"; String errorDescription = "NameResolver returned an empty list";
// Pass a FakeNameResolverFactory with an empty list // Pass a FakeNameResolverFactory with an empty list
createChannel(new FakeNameResolverFactory.Builder(expectedUri).build(), NO_INTERCEPTOR); createChannel();
// LoadBalancer received the error // LoadBalancer received the error
verify(mockLoadBalancerFactory).newLoadBalancer(any(Helper.class)); verify(mockLoadBalancerFactory).newLoadBalancer(any(Helper.class));
@ -789,7 +765,8 @@ public class ManagedChannelImplTest {
.setResolvedAtStart(false) .setResolvedAtStart(false)
.setServers(Collections.singletonList(new EquivalentAddressGroup(socketAddress))) .setServers(Collections.singletonList(new EquivalentAddressGroup(socketAddress)))
.build(); .build();
createChannel(nameResolverFactory, NO_INTERCEPTOR); channelBuilder.nameResolverFactory(nameResolverFactory);
createChannel();
verify(mockLoadBalancerFactory).newLoadBalancer(any(Helper.class)); verify(mockLoadBalancerFactory).newLoadBalancer(any(Helper.class));
doThrow(ex).when(mockLoadBalancer).handleResolvedAddressGroups( doThrow(ex).when(mockLoadBalancer).handleResolvedAddressGroups(
@ -807,7 +784,8 @@ public class ManagedChannelImplTest {
// Delay the success of name resolution until allResolved() is called. // Delay the success of name resolution until allResolved() is called.
FakeNameResolverFactory nameResolverFactory = FakeNameResolverFactory nameResolverFactory =
new FakeNameResolverFactory.Builder(expectedUri).setResolvedAtStart(false).build(); new FakeNameResolverFactory.Builder(expectedUri).setResolvedAtStart(false).build();
createChannel(nameResolverFactory, NO_INTERCEPTOR); channelBuilder.nameResolverFactory(nameResolverFactory);
createChannel();
channel.shutdown(); channel.shutdown();
@ -843,7 +821,8 @@ public class ManagedChannelImplTest {
new FakeNameResolverFactory.Builder(expectedUri) new FakeNameResolverFactory.Builder(expectedUri)
.setServers(Collections.singletonList(new EquivalentAddressGroup(resolvedAddrs))) .setServers(Collections.singletonList(new EquivalentAddressGroup(resolvedAddrs)))
.build(); .build();
createChannel(nameResolverFactory, NO_INTERCEPTOR); channelBuilder.nameResolverFactory(nameResolverFactory);
createChannel();
// Start the call // Start the call
ClientCall<String, Integer> call = channel.newCall(method, CallOptions.DEFAULT); ClientCall<String, Integer> call = channel.newCall(method, CallOptions.DEFAULT);
@ -923,7 +902,7 @@ public class ManagedChannelImplTest {
} }
private void subtestFailRpcFromBalancer(boolean waitForReady, boolean drop, boolean shouldFail) { private void subtestFailRpcFromBalancer(boolean waitForReady, boolean drop, boolean shouldFail) {
createChannel(new FakeNameResolverFactory.Builder(expectedUri).build(), NO_INTERCEPTOR); createChannel();
// This call will be buffered by the channel, thus involve delayed transport // This call will be buffered by the channel, thus involve delayed transport
CallOptions callOptions = CallOptions.DEFAULT; CallOptions callOptions = CallOptions.DEFAULT;
@ -985,7 +964,8 @@ public class ManagedChannelImplTest {
new FakeNameResolverFactory.Builder(expectedUri) new FakeNameResolverFactory.Builder(expectedUri)
.setServers(Collections.singletonList(new EquivalentAddressGroup(resolvedAddrs))) .setServers(Collections.singletonList(new EquivalentAddressGroup(resolvedAddrs)))
.build(); .build();
createChannel(nameResolverFactory, NO_INTERCEPTOR); channelBuilder.nameResolverFactory(nameResolverFactory);
createChannel();
// Start a wait-for-ready call // Start a wait-for-ready call
ClientCall<String, Integer> call = ClientCall<String, Integer> call =
@ -1056,7 +1036,7 @@ public class ManagedChannelImplTest {
@Test @Test
public void subchannels() { public void subchannels() {
createChannel(new FakeNameResolverFactory.Builder(expectedUri).build(), NO_INTERCEPTOR); createChannel();
// createSubchannel() always return a new Subchannel // createSubchannel() always return a new Subchannel
Attributes attrs1 = Attributes.newBuilder().set(SUBCHANNEL_ATTR_KEY, "attr1").build(); Attributes attrs1 = Attributes.newBuilder().set(SUBCHANNEL_ATTR_KEY, "attr1").build();
@ -1074,20 +1054,20 @@ public class ManagedChannelImplTest {
verify(mockTransportFactory, never()).newClientTransport( verify(mockTransportFactory, never()).newClientTransport(
any(SocketAddress.class), any(String.class), any(String.class), any(ProxyParameters.class)); any(SocketAddress.class), any(String.class), any(String.class), any(ProxyParameters.class));
sub1.requestConnection(); sub1.requestConnection();
verify(mockTransportFactory).newClientTransport(socketAddress, authority, userAgent, noProxy); verify(mockTransportFactory).newClientTransport(socketAddress, AUTHORITY, USER_AGENT, NO_PROXY);
MockClientTransportInfo transportInfo1 = transports.poll(); MockClientTransportInfo transportInfo1 = transports.poll();
assertNotNull(transportInfo1); assertNotNull(transportInfo1);
sub2.requestConnection(); sub2.requestConnection();
verify(mockTransportFactory, times(2)).newClientTransport(socketAddress, authority, userAgent, verify(mockTransportFactory, times(2)).newClientTransport(socketAddress, AUTHORITY, USER_AGENT,
noProxy); NO_PROXY);
MockClientTransportInfo transportInfo2 = transports.poll(); MockClientTransportInfo transportInfo2 = transports.poll();
assertNotNull(transportInfo2); assertNotNull(transportInfo2);
sub1.requestConnection(); sub1.requestConnection();
sub2.requestConnection(); sub2.requestConnection();
verify(mockTransportFactory, times(2)).newClientTransport(socketAddress, authority, userAgent, verify(mockTransportFactory, times(2)).newClientTransport(socketAddress, AUTHORITY, USER_AGENT,
noProxy); NO_PROXY);
// shutdown() has a delay // shutdown() has a delay
sub1.shutdown(); sub1.shutdown();
@ -1116,7 +1096,7 @@ public class ManagedChannelImplTest {
@Test @Test
public void subchannelsWhenChannelShutdownNow() { public void subchannelsWhenChannelShutdownNow() {
createChannel(new FakeNameResolverFactory.Builder(expectedUri).build(), NO_INTERCEPTOR); createChannel();
Subchannel sub1 = helper.createSubchannel(addressGroup, Attributes.EMPTY); Subchannel sub1 = helper.createSubchannel(addressGroup, Attributes.EMPTY);
Subchannel sub2 = helper.createSubchannel(addressGroup, Attributes.EMPTY); Subchannel sub2 = helper.createSubchannel(addressGroup, Attributes.EMPTY);
sub1.requestConnection(); sub1.requestConnection();
@ -1144,7 +1124,7 @@ public class ManagedChannelImplTest {
@Test @Test
public void subchannelsNoConnectionShutdown() { public void subchannelsNoConnectionShutdown() {
createChannel(new FakeNameResolverFactory.Builder(expectedUri).build(), NO_INTERCEPTOR); createChannel();
Subchannel sub1 = helper.createSubchannel(addressGroup, Attributes.EMPTY); Subchannel sub1 = helper.createSubchannel(addressGroup, Attributes.EMPTY);
Subchannel sub2 = helper.createSubchannel(addressGroup, Attributes.EMPTY); Subchannel sub2 = helper.createSubchannel(addressGroup, Attributes.EMPTY);
@ -1160,7 +1140,7 @@ public class ManagedChannelImplTest {
@Test @Test
public void subchannelsNoConnectionShutdownNow() { public void subchannelsNoConnectionShutdownNow() {
createChannel(new FakeNameResolverFactory.Builder(expectedUri).build(), NO_INTERCEPTOR); createChannel();
helper.createSubchannel(addressGroup, Attributes.EMPTY); helper.createSubchannel(addressGroup, Attributes.EMPTY);
helper.createSubchannel(addressGroup, Attributes.EMPTY); helper.createSubchannel(addressGroup, Attributes.EMPTY);
channel.shutdownNow(); channel.shutdownNow();
@ -1175,7 +1155,7 @@ public class ManagedChannelImplTest {
@Test @Test
public void oobchannels() { public void oobchannels() {
createChannel(new FakeNameResolverFactory.Builder(expectedUri).build(), NO_INTERCEPTOR); createChannel();
ManagedChannel oob1 = helper.createOobChannel(addressGroup, "oob1authority"); ManagedChannel oob1 = helper.createOobChannel(addressGroup, "oob1authority");
ManagedChannel oob2 = helper.createOobChannel(addressGroup, "oob2authority"); ManagedChannel oob2 = helper.createOobChannel(addressGroup, "oob2authority");
@ -1188,8 +1168,8 @@ public class ManagedChannelImplTest {
Metadata headers = new Metadata(); Metadata headers = new Metadata();
ClientCall<String, Integer> call = oob1.newCall(method, CallOptions.DEFAULT); ClientCall<String, Integer> call = oob1.newCall(method, CallOptions.DEFAULT);
call.start(mockCallListener, headers); call.start(mockCallListener, headers);
verify(mockTransportFactory).newClientTransport(socketAddress, "oob1authority", userAgent, verify(mockTransportFactory).newClientTransport(socketAddress, "oob1authority", USER_AGENT,
noProxy); NO_PROXY);
MockClientTransportInfo transportInfo = transports.poll(); MockClientTransportInfo transportInfo = transports.poll();
assertNotNull(transportInfo); assertNotNull(transportInfo);
@ -1210,7 +1190,7 @@ public class ManagedChannelImplTest {
oob1.newCall(method, CallOptions.DEFAULT.withWaitForReady()); oob1.newCall(method, CallOptions.DEFAULT.withWaitForReady());
call3.start(mockCallListener3, headers); call3.start(mockCallListener3, headers);
verify(mockTransportFactory, times(2)).newClientTransport( verify(mockTransportFactory, times(2)).newClientTransport(
socketAddress, "oob1authority", userAgent, noProxy); socketAddress, "oob1authority", USER_AGENT, NO_PROXY);
transportInfo = transports.poll(); transportInfo = transports.poll();
assertNotNull(transportInfo); assertNotNull(transportInfo);
@ -1273,7 +1253,7 @@ public class ManagedChannelImplTest {
@Test @Test
public void oobChannelsWhenChannelShutdownNow() { public void oobChannelsWhenChannelShutdownNow() {
createChannel(new FakeNameResolverFactory.Builder(expectedUri).build(), NO_INTERCEPTOR); createChannel();
ManagedChannel oob1 = helper.createOobChannel(addressGroup, "oob1Authority"); ManagedChannel oob1 = helper.createOobChannel(addressGroup, "oob1Authority");
ManagedChannel oob2 = helper.createOobChannel(addressGroup, "oob2Authority"); ManagedChannel oob2 = helper.createOobChannel(addressGroup, "oob2Authority");
@ -1302,7 +1282,7 @@ public class ManagedChannelImplTest {
@Test @Test
public void oobChannelsNoConnectionShutdown() { public void oobChannelsNoConnectionShutdown() {
createChannel(new FakeNameResolverFactory.Builder(expectedUri).build(), NO_INTERCEPTOR); createChannel();
ManagedChannel oob1 = helper.createOobChannel(addressGroup, "oob1Authority"); ManagedChannel oob1 = helper.createOobChannel(addressGroup, "oob1Authority");
ManagedChannel oob2 = helper.createOobChannel(addressGroup, "oob2Authority"); ManagedChannel oob2 = helper.createOobChannel(addressGroup, "oob2Authority");
channel.shutdown(); channel.shutdown();
@ -1320,7 +1300,7 @@ public class ManagedChannelImplTest {
@Test @Test
public void oobChannelsNoConnectionShutdownNow() { public void oobChannelsNoConnectionShutdownNow() {
createChannel(new FakeNameResolverFactory.Builder(expectedUri).build(), NO_INTERCEPTOR); createChannel();
helper.createOobChannel(addressGroup, "oob1Authority"); helper.createOobChannel(addressGroup, "oob1Authority");
helper.createOobChannel(addressGroup, "oob2Authority"); helper.createOobChannel(addressGroup, "oob2Authority");
channel.shutdownNow(); channel.shutdownNow();
@ -1348,7 +1328,8 @@ public class ManagedChannelImplTest {
new FakeNameResolverFactory.Builder(expectedUri) new FakeNameResolverFactory.Builder(expectedUri)
.setServers(Collections.singletonList(new EquivalentAddressGroup(socketAddress))) .setServers(Collections.singletonList(new EquivalentAddressGroup(socketAddress)))
.build(); .build();
createChannel(nameResolverFactory, NO_INTERCEPTOR); channelBuilder.nameResolverFactory(nameResolverFactory);
createChannel();
FakeNameResolverFactory.FakeNameResolver resolver = nameResolverFactory.resolvers.get(0); FakeNameResolverFactory.FakeNameResolver resolver = nameResolverFactory.resolvers.get(0);
if (isOobChannel) { if (isOobChannel) {
@ -1395,7 +1376,7 @@ public class ManagedChannelImplTest {
*/ */
@Test @Test
public void informationPropagatedToNewStreamAndCallCredentials() { public void informationPropagatedToNewStreamAndCallCredentials() {
createChannel(new FakeNameResolverFactory.Builder(expectedUri).build(), NO_INTERCEPTOR); createChannel();
CallOptions callOptions = CallOptions.DEFAULT.withCallCredentials(creds); CallOptions callOptions = CallOptions.DEFAULT.withCallCredentials(creds);
final Context.Key<String> testKey = Context.key("testing"); final Context.Key<String> testKey = Context.key("testing");
Context ctx = Context.current().withValue(testKey, "testValue"); Context ctx = Context.current().withValue(testKey, "testValue");
@ -1426,7 +1407,7 @@ public class ManagedChannelImplTest {
Subchannel subchannel = helper.createSubchannel(addressGroup, Attributes.EMPTY); Subchannel subchannel = helper.createSubchannel(addressGroup, Attributes.EMPTY);
subchannel.requestConnection(); subchannel.requestConnection();
verify(mockTransportFactory).newClientTransport( verify(mockTransportFactory).newClientTransport(
same(socketAddress), eq(authority), eq(userAgent), eq(noProxy)); same(socketAddress), eq(AUTHORITY), eq(USER_AGENT), eq(NO_PROXY));
MockClientTransportInfo transportInfo = transports.poll(); MockClientTransportInfo transportInfo = transports.poll();
final ConnectionClientTransport transport = transportInfo.transport; final ConnectionClientTransport transport = transportInfo.transport;
when(transport.getAttributes()).thenReturn(Attributes.EMPTY); when(transport.getAttributes()).thenReturn(Attributes.EMPTY);
@ -1454,7 +1435,7 @@ public class ManagedChannelImplTest {
verify(creds).applyRequestMetadata(same(method), attrsCaptor.capture(), verify(creds).applyRequestMetadata(same(method), attrsCaptor.capture(),
same(executor.getScheduledExecutorService()), applierCaptor.capture()); same(executor.getScheduledExecutorService()), applierCaptor.capture());
assertEquals("testValue", testKey.get(credsApplyContexts.poll())); assertEquals("testValue", testKey.get(credsApplyContexts.poll()));
assertEquals(authority, attrsCaptor.getValue().get(CallCredentials.ATTR_AUTHORITY)); assertEquals(AUTHORITY, attrsCaptor.getValue().get(CallCredentials.ATTR_AUTHORITY));
assertEquals(SecurityLevel.NONE, assertEquals(SecurityLevel.NONE,
attrsCaptor.getValue().get(CallCredentials.ATTR_SECURITY_LEVEL)); attrsCaptor.getValue().get(CallCredentials.ATTR_SECURITY_LEVEL));
verify(transport, never()).newStream( verify(transport, never()).newStream(
@ -1477,7 +1458,7 @@ public class ManagedChannelImplTest {
verify(creds, times(2)).applyRequestMetadata(same(method), attrsCaptor.capture(), verify(creds, times(2)).applyRequestMetadata(same(method), attrsCaptor.capture(),
same(executor.getScheduledExecutorService()), applierCaptor.capture()); same(executor.getScheduledExecutorService()), applierCaptor.capture());
assertEquals("testValue", testKey.get(credsApplyContexts.poll())); assertEquals("testValue", testKey.get(credsApplyContexts.poll()));
assertEquals(authority, attrsCaptor.getValue().get(CallCredentials.ATTR_AUTHORITY)); assertEquals(AUTHORITY, attrsCaptor.getValue().get(CallCredentials.ATTR_AUTHORITY));
assertEquals(SecurityLevel.NONE, assertEquals(SecurityLevel.NONE,
attrsCaptor.getValue().get(CallCredentials.ATTR_SECURITY_LEVEL)); attrsCaptor.getValue().get(CallCredentials.ATTR_SECURITY_LEVEL));
// This is from the first call // This is from the first call
@ -1497,7 +1478,7 @@ public class ManagedChannelImplTest {
ClientStream mockStream = mock(ClientStream.class); ClientStream mockStream = mock(ClientStream.class);
ClientStreamTracer.Factory factory1 = mock(ClientStreamTracer.Factory.class); ClientStreamTracer.Factory factory1 = mock(ClientStreamTracer.Factory.class);
ClientStreamTracer.Factory factory2 = mock(ClientStreamTracer.Factory.class); ClientStreamTracer.Factory factory2 = mock(ClientStreamTracer.Factory.class);
createChannel(new FakeNameResolverFactory.Builder(expectedUri).build(), NO_INTERCEPTOR); createChannel();
Subchannel subchannel = helper.createSubchannel(addressGroup, Attributes.EMPTY); Subchannel subchannel = helper.createSubchannel(addressGroup, Attributes.EMPTY);
subchannel.requestConnection(); subchannel.requestConnection();
MockClientTransportInfo transportInfo = transports.poll(); MockClientTransportInfo transportInfo = transports.poll();
@ -1530,7 +1511,7 @@ public class ManagedChannelImplTest {
ClientStream mockStream = mock(ClientStream.class); ClientStream mockStream = mock(ClientStream.class);
ClientStreamTracer.Factory factory1 = mock(ClientStreamTracer.Factory.class); ClientStreamTracer.Factory factory1 = mock(ClientStreamTracer.Factory.class);
ClientStreamTracer.Factory factory2 = mock(ClientStreamTracer.Factory.class); ClientStreamTracer.Factory factory2 = mock(ClientStreamTracer.Factory.class);
createChannel(new FakeNameResolverFactory.Builder(expectedUri).build(), NO_INTERCEPTOR); createChannel();
CallOptions callOptions = CallOptions.DEFAULT.withStreamTracerFactory(factory1); CallOptions callOptions = CallOptions.DEFAULT.withStreamTracerFactory(factory1);
ClientCall<String, Integer> call = channel.newCall(method, callOptions); ClientCall<String, Integer> call = channel.newCall(method, callOptions);
@ -1562,9 +1543,9 @@ public class ManagedChannelImplTest {
@Test @Test
public void getState_loadBalancerSupportsChannelState() { public void getState_loadBalancerSupportsChannelState() {
createChannel( channelBuilder.nameResolverFactory(
new FakeNameResolverFactory.Builder(expectedUri).setResolvedAtStart(false).build(), new FakeNameResolverFactory.Builder(expectedUri).setResolvedAtStart(false).build());
NO_INTERCEPTOR); createChannel();
assertEquals(IDLE, channel.getState(false)); assertEquals(IDLE, channel.getState(false));
helper.updateBalancingState(TRANSIENT_FAILURE, mockPicker); helper.updateBalancingState(TRANSIENT_FAILURE, mockPicker);
@ -1573,11 +1554,10 @@ public class ManagedChannelImplTest {
@Test @Test
public void getState_withRequestConnect() { public void getState_withRequestConnect() {
createChannel( channelBuilder.nameResolverFactory(
new FakeNameResolverFactory.Builder(expectedUri).setResolvedAtStart(false).build(), new FakeNameResolverFactory.Builder(expectedUri).setResolvedAtStart(false).build());
NO_INTERCEPTOR, requestConnection = false;
false /* requestConnection */, createChannel();
ManagedChannelImpl.IDLE_TIMEOUT_MILLIS_DISABLE);
assertEquals(IDLE, channel.getState(false)); assertEquals(IDLE, channel.getState(false));
verify(mockLoadBalancerFactory, never()).newLoadBalancer(any(Helper.class)); verify(mockLoadBalancerFactory, never()).newLoadBalancer(any(Helper.class));
@ -1596,11 +1576,9 @@ public class ManagedChannelImplTest {
@Test @Test
public void getState_withRequestConnect_IdleWithLbRunning() { public void getState_withRequestConnect_IdleWithLbRunning() {
createChannel( channelBuilder.nameResolverFactory(
new FakeNameResolverFactory.Builder(expectedUri).setResolvedAtStart(false).build(), new FakeNameResolverFactory.Builder(expectedUri).setResolvedAtStart(false).build());
NO_INTERCEPTOR, createChannel();
true /* requestConnection */,
ManagedChannelImpl.IDLE_TIMEOUT_MILLIS_DISABLE);
verify(mockLoadBalancerFactory).newLoadBalancer(any(Helper.class)); verify(mockLoadBalancerFactory).newLoadBalancer(any(Helper.class));
helper.updateBalancingState(IDLE, mockPicker); helper.updateBalancingState(IDLE, mockPicker);
@ -1620,9 +1598,9 @@ public class ManagedChannelImplTest {
} }
}; };
createChannel( channelBuilder.nameResolverFactory(
new FakeNameResolverFactory.Builder(expectedUri).setResolvedAtStart(false).build(), new FakeNameResolverFactory.Builder(expectedUri).setResolvedAtStart(false).build());
NO_INTERCEPTOR); createChannel();
assertEquals(IDLE, channel.getState(false)); assertEquals(IDLE, channel.getState(false));
channel.notifyWhenStateChanged(IDLE, onStateChanged); channel.notifyWhenStateChanged(IDLE, onStateChanged);
@ -1653,9 +1631,9 @@ public class ManagedChannelImplTest {
} }
}; };
createChannel( channelBuilder.nameResolverFactory(
new FakeNameResolverFactory.Builder(expectedUri).setResolvedAtStart(false).build(), new FakeNameResolverFactory.Builder(expectedUri).setResolvedAtStart(false).build());
NO_INTERCEPTOR); createChannel();
assertEquals(IDLE, channel.getState(false)); assertEquals(IDLE, channel.getState(false));
channel.notifyWhenStateChanged(IDLE, onStateChanged); channel.notifyWhenStateChanged(IDLE, onStateChanged);
executor.runDueTasks(); executor.runDueTasks();
@ -1678,11 +1656,8 @@ public class ManagedChannelImplTest {
@Test @Test
public void stateIsIdleOnIdleTimeout() { public void stateIsIdleOnIdleTimeout() {
long idleTimeoutMillis = 2000L; long idleTimeoutMillis = 2000L;
createChannel( channelBuilder.idleTimeout(idleTimeoutMillis, TimeUnit.MILLISECONDS);
new FakeNameResolverFactory.Builder(expectedUri).build(), createChannel();
NO_INTERCEPTOR,
true /* request connection*/,
idleTimeoutMillis);
assertEquals(IDLE, channel.getState(false)); assertEquals(IDLE, channel.getState(false));
helper.updateBalancingState(CONNECTING, mockPicker); helper.updateBalancingState(CONNECTING, mockPicker);
@ -1717,7 +1692,9 @@ public class ManagedChannelImplTest {
long idleTimeoutMillis = 2000L; long idleTimeoutMillis = 2000L;
FakeNameResolverFactory nameResolverFactory = FakeNameResolverFactory nameResolverFactory =
new FakeNameResolverFactory.Builder(expectedUri).build(); new FakeNameResolverFactory.Builder(expectedUri).build();
createChannel(nameResolverFactory, NO_INTERCEPTOR, true, idleTimeoutMillis); channelBuilder.nameResolverFactory(nameResolverFactory);
channelBuilder.idleTimeout(idleTimeoutMillis, TimeUnit.MILLISECONDS);
createChannel();
verify(mockLoadBalancerFactory).newLoadBalancer(any(Helper.class)); verify(mockLoadBalancerFactory).newLoadBalancer(any(Helper.class));
assertEquals(1, nameResolverFactory.resolvers.size()); assertEquals(1, nameResolverFactory.resolvers.size());
@ -1783,9 +1760,7 @@ public class ManagedChannelImplTest {
@Test @Test
public void panic_bufferedCallsWillFail() { public void panic_bufferedCallsWillFail() {
FakeNameResolverFactory nameResolverFactory = createChannel();
new FakeNameResolverFactory.Builder(expectedUri).build();
createChannel(nameResolverFactory, NO_INTERCEPTOR);
when(mockPicker.pickSubchannel(any(PickSubchannelArgs.class))) when(mockPicker.pickSubchannel(any(PickSubchannelArgs.class)))
.thenReturn(PickResult.withNoResult()); .thenReturn(PickResult.withNoResult());
@ -1844,11 +1819,8 @@ public class ManagedChannelImplTest {
@Test @Test
public void idleTimeoutAndReconnect() { public void idleTimeoutAndReconnect() {
long idleTimeoutMillis = 2000L; long idleTimeoutMillis = 2000L;
createChannel( channelBuilder.idleTimeout(idleTimeoutMillis, TimeUnit.MILLISECONDS);
new FakeNameResolverFactory.Builder(expectedUri).build(), createChannel();
NO_INTERCEPTOR,
true /* request connection*/,
idleTimeoutMillis);
timer.forwardNanos(TimeUnit.MILLISECONDS.toNanos(idleTimeoutMillis)); timer.forwardNanos(TimeUnit.MILLISECONDS.toNanos(idleTimeoutMillis));
assertEquals(IDLE, channel.getState(true /* request connection */)); assertEquals(IDLE, channel.getState(true /* request connection */));
@ -1872,13 +1844,12 @@ public class ManagedChannelImplTest {
ClientStream mockStream = mock(ClientStream.class); ClientStream mockStream = mock(ClientStream.class);
Status pickError = Status.UNAVAILABLE.withDescription("pick result error"); Status pickError = Status.UNAVAILABLE.withDescription("pick result error");
long idleTimeoutMillis = 1000L; long idleTimeoutMillis = 1000L;
createChannel( channelBuilder.idleTimeout(idleTimeoutMillis, TimeUnit.MILLISECONDS);
channelBuilder.nameResolverFactory(
new FakeNameResolverFactory.Builder(expectedUri) new FakeNameResolverFactory.Builder(expectedUri)
.setServers(Collections.singletonList(new EquivalentAddressGroup(socketAddress))) .setServers(Collections.singletonList(new EquivalentAddressGroup(socketAddress)))
.build(), .build());
NO_INTERCEPTOR, createChannel();
true,
idleTimeoutMillis);
assertEquals(IDLE, channel.getState(false)); assertEquals(IDLE, channel.getState(false));
// This call will be buffered in delayedTransport // This call will be buffered in delayedTransport
@ -1931,7 +1902,7 @@ public class ManagedChannelImplTest {
@Test @Test
public void enterIdleEntersIdle() { public void enterIdleEntersIdle() {
createChannel(new FakeNameResolverFactory.Builder(expectedUri).build(), NO_INTERCEPTOR); createChannel();
helper.updateBalancingState(READY, mockPicker); helper.updateBalancingState(READY, mockPicker);
assertEquals(READY, channel.getState(false)); assertEquals(READY, channel.getState(false));
@ -1943,11 +1914,8 @@ public class ManagedChannelImplTest {
@Test @Test
public void enterIdleAfterIdleTimerIsNoOp() { public void enterIdleAfterIdleTimerIsNoOp() {
long idleTimeoutMillis = 2000L; long idleTimeoutMillis = 2000L;
createChannel( channelBuilder.idleTimeout(idleTimeoutMillis, TimeUnit.MILLISECONDS);
new FakeNameResolverFactory.Builder(expectedUri).build(), createChannel();
NO_INTERCEPTOR,
true /* request connection*/,
idleTimeoutMillis);
timer.forwardNanos(TimeUnit.MILLISECONDS.toNanos(idleTimeoutMillis)); timer.forwardNanos(TimeUnit.MILLISECONDS.toNanos(idleTimeoutMillis));
assertEquals(IDLE, channel.getState(false)); assertEquals(IDLE, channel.getState(false));
@ -1959,7 +1927,7 @@ public class ManagedChannelImplTest {
@Test @Test
public void updateBalancingStateDoesUpdatePicker() { public void updateBalancingStateDoesUpdatePicker() {
ClientStream mockStream = mock(ClientStream.class); ClientStream mockStream = mock(ClientStream.class);
createChannel(new FakeNameResolverFactory.Builder(expectedUri).build(), NO_INTERCEPTOR); createChannel();
ClientCall<String, Integer> call = channel.newCall(method, CallOptions.DEFAULT); ClientCall<String, Integer> call = channel.newCall(method, CallOptions.DEFAULT);
call.start(mockCallListener, new Metadata()); call.start(mockCallListener, new Metadata());
@ -1997,9 +1965,9 @@ public class ManagedChannelImplTest {
@Test @Test
public void updateBalancingStateWithShutdownShouldBeIgnored() { public void updateBalancingStateWithShutdownShouldBeIgnored() {
createChannel( channelBuilder.nameResolverFactory(
new FakeNameResolverFactory.Builder(expectedUri).setResolvedAtStart(false).build(), new FakeNameResolverFactory.Builder(expectedUri).setResolvedAtStart(false).build());
NO_INTERCEPTOR); createChannel();
assertEquals(IDLE, channel.getState(false)); assertEquals(IDLE, channel.getState(false));
Runnable onStateChanged = mock(Runnable.class); Runnable onStateChanged = mock(Runnable.class);
@ -2018,8 +1986,9 @@ public class ManagedChannelImplTest {
Status error = Status.UNAVAILABLE.withCause(new Throwable("fake name resolution error")); Status error = Status.UNAVAILABLE.withCause(new Throwable("fake name resolution error"));
FakeNameResolverFactory nameResolverFactory = FakeNameResolverFactory nameResolverFactory =
new FakeNameResolverFactory.Builder(expectedUri).setError(error).build(); new FakeNameResolverFactory.Builder(expectedUri).setError(error).build();
channelBuilder.nameResolverFactory(nameResolverFactory);
// Name resolution is started as soon as channel is created. // Name resolution is started as soon as channel is created.
createChannel(nameResolverFactory, NO_INTERCEPTOR); createChannel();
FakeNameResolverFactory.FakeNameResolver resolver = nameResolverFactory.resolvers.get(0); FakeNameResolverFactory.FakeNameResolver resolver = nameResolverFactory.resolvers.get(0);
verify(mockLoadBalancer).handleNameResolutionError(same(error)); verify(mockLoadBalancer).handleNameResolutionError(same(error));
@ -2047,7 +2016,8 @@ public class ManagedChannelImplTest {
new FakeNameResolverFactory.Builder(expectedUri) new FakeNameResolverFactory.Builder(expectedUri)
.setServers(Collections.singletonList(new EquivalentAddressGroup(socketAddress))) .setServers(Collections.singletonList(new EquivalentAddressGroup(socketAddress)))
.build(); .build();
createChannel(nameResolverFactory, NO_INTERCEPTOR); channelBuilder.nameResolverFactory(nameResolverFactory);
createChannel();
FakeNameResolverFactory.FakeNameResolver nameResolver = nameResolverFactory.resolvers.get(0); FakeNameResolverFactory.FakeNameResolver nameResolver = nameResolverFactory.resolvers.get(0);
assertEquals(0, nameResolver.refreshCalled); assertEquals(0, nameResolver.refreshCalled);
@ -2060,7 +2030,8 @@ public class ManagedChannelImplTest {
public void resetConnectBackoff_noOpWhenChannelShutdown() { public void resetConnectBackoff_noOpWhenChannelShutdown() {
FakeNameResolverFactory nameResolverFactory = FakeNameResolverFactory nameResolverFactory =
new FakeNameResolverFactory.Builder(expectedUri).build(); new FakeNameResolverFactory.Builder(expectedUri).build();
createChannel(nameResolverFactory, NO_INTERCEPTOR); channelBuilder.nameResolverFactory(nameResolverFactory);
createChannel();
channel.shutdown(); channel.shutdown();
assertTrue(channel.isShutdown()); assertTrue(channel.isShutdown());
@ -2074,8 +2045,9 @@ public class ManagedChannelImplTest {
public void resetConnectBackoff_noOpWhenNameResolverNotStarted() { public void resetConnectBackoff_noOpWhenNameResolverNotStarted() {
FakeNameResolverFactory nameResolverFactory = FakeNameResolverFactory nameResolverFactory =
new FakeNameResolverFactory.Builder(expectedUri).build(); new FakeNameResolverFactory.Builder(expectedUri).build();
createChannel(nameResolverFactory, NO_INTERCEPTOR, false /* requestConnection */, channelBuilder.nameResolverFactory(nameResolverFactory);
ManagedChannelImpl.IDLE_TIMEOUT_MILLIS_DISABLE); requestConnection = false;
createChannel();
channel.resetConnectBackoff(); channel.resetConnectBackoff();
@ -2085,8 +2057,8 @@ public class ManagedChannelImplTest {
@Test @Test
public void channelsAndSubchannels_instrumented_name() throws Exception { public void channelsAndSubchannels_instrumented_name() throws Exception {
createChannel(new FakeNameResolverFactory.Builder(expectedUri).build(), NO_INTERCEPTOR); createChannel();
assertEquals(target, getStats(channel).target); assertEquals(TARGET, getStats(channel).target);
Subchannel subchannel = helper.createSubchannel(addressGroup, Attributes.EMPTY); Subchannel subchannel = helper.createSubchannel(addressGroup, Attributes.EMPTY);
assertEquals(addressGroup.toString(), getStats((AbstractSubchannel) subchannel).target); assertEquals(addressGroup.toString(), getStats((AbstractSubchannel) subchannel).target);
@ -2094,7 +2066,7 @@ public class ManagedChannelImplTest {
@Test @Test
public void channelsAndSubchannels_instrumented_state() throws Exception { public void channelsAndSubchannels_instrumented_state() throws Exception {
createChannel(new FakeNameResolverFactory.Builder(expectedUri).build(), NO_INTERCEPTOR); createChannel();
ArgumentCaptor<Helper> helperCaptor = ArgumentCaptor.forClass(null); ArgumentCaptor<Helper> helperCaptor = ArgumentCaptor.forClass(null);
verify(mockLoadBalancerFactory).newLoadBalancer(helperCaptor.capture()); verify(mockLoadBalancerFactory).newLoadBalancer(helperCaptor.capture());
@ -2128,7 +2100,7 @@ public class ManagedChannelImplTest {
@Test @Test
public void channelStat_callStarted() throws Exception { public void channelStat_callStarted() throws Exception {
createChannel(new FakeNameResolverFactory.Builder(expectedUri).build(), NO_INTERCEPTOR); createChannel();
ClientCall<String, Integer> call = channel.newCall(method, CallOptions.DEFAULT); ClientCall<String, Integer> call = channel.newCall(method, CallOptions.DEFAULT);
assertEquals(0, getStats(channel).callsStarted); assertEquals(0, getStats(channel).callsStarted);
call.start(mockCallListener, new Metadata()); call.start(mockCallListener, new Metadata());
@ -2147,7 +2119,7 @@ public class ManagedChannelImplTest {
} }
private void channelsAndSubchannels_instrumented0(boolean success) throws Exception { private void channelsAndSubchannels_instrumented0(boolean success) throws Exception {
createChannel(new FakeNameResolverFactory.Builder(expectedUri).build(), NO_INTERCEPTOR); createChannel();
ClientCall<String, Integer> call = channel.newCall(method, CallOptions.DEFAULT); ClientCall<String, Integer> call = channel.newCall(method, CallOptions.DEFAULT);
@ -2218,7 +2190,7 @@ public class ManagedChannelImplTest {
private void channelsAndSubchannels_oob_instrumented0(boolean success) throws Exception { private void channelsAndSubchannels_oob_instrumented0(boolean success) throws Exception {
// set up // set up
ClientStream mockStream = mock(ClientStream.class); ClientStream mockStream = mock(ClientStream.class);
createChannel(new FakeNameResolverFactory.Builder(expectedUri).build(), NO_INTERCEPTOR); createChannel();
OobChannel oobChannel = (OobChannel) helper.createOobChannel(addressGroup, "oobauthority"); OobChannel oobChannel = (OobChannel) helper.createOobChannel(addressGroup, "oobauthority");
AbstractSubchannel oobSubchannel = (AbstractSubchannel) oobChannel.getSubchannel(); AbstractSubchannel oobSubchannel = (AbstractSubchannel) oobChannel.getSubchannel();
@ -2279,7 +2251,7 @@ public class ManagedChannelImplTest {
@Test @Test
public void channelsAndSubchannels_oob_instrumented_name() throws Exception { public void channelsAndSubchannels_oob_instrumented_name() throws Exception {
createChannel(new FakeNameResolverFactory.Builder(expectedUri).build(), NO_INTERCEPTOR); createChannel();
String authority = "oobauthority"; String authority = "oobauthority";
OobChannel oobChannel = (OobChannel) helper.createOobChannel(addressGroup, authority); OobChannel oobChannel = (OobChannel) helper.createOobChannel(addressGroup, authority);
@ -2288,7 +2260,7 @@ public class ManagedChannelImplTest {
@Test @Test
public void channelsAndSubchannels_oob_instrumented_state() throws Exception { public void channelsAndSubchannels_oob_instrumented_state() throws Exception {
createChannel(new FakeNameResolverFactory.Builder(expectedUri).build(), NO_INTERCEPTOR); createChannel();
OobChannel oobChannel = (OobChannel) helper.createOobChannel(addressGroup, "oobauthority"); OobChannel oobChannel = (OobChannel) helper.createOobChannel(addressGroup, "oobauthority");
assertEquals(IDLE, getStats(oobChannel).state); assertEquals(IDLE, getStats(oobChannel).state);
@ -2361,7 +2333,7 @@ public class ManagedChannelImplTest {
TracingClientInterceptor userInterceptor = new TracingClientInterceptor(); TracingClientInterceptor userInterceptor = new TracingClientInterceptor();
final TracingClientInterceptor binlogInterceptor = new TracingClientInterceptor(); final TracingClientInterceptor binlogInterceptor = new TracingClientInterceptor();
binlogProvider = new BinaryLogProvider() { channelBuilder.binlogProvider = new BinaryLogProvider() {
@Nullable @Nullable
@Override @Override
public ServerInterceptor getServerInterceptor(String fullMethodName) { public ServerInterceptor getServerInterceptor(String fullMethodName) {
@ -2387,9 +2359,7 @@ public class ManagedChannelImplTest {
// perform an RPC // perform an RPC
Metadata headers = new Metadata(); Metadata headers = new Metadata();
ClientStream mockStream = mock(ClientStream.class); ClientStream mockStream = mock(ClientStream.class);
createChannel( createChannel(userInterceptor);
new FakeNameResolverFactory.Builder(expectedUri).build(),
ImmutableList.<ClientInterceptor>of(userInterceptor));
CallOptions options = CallOptions options =
CallOptions.DEFAULT.withExecutor(executor.getScheduledExecutorService()); CallOptions.DEFAULT.withExecutor(executor.getScheduledExecutorService());
ClientCall<String, Integer> call = channel.newCall(method, options); ClientCall<String, Integer> call = channel.newCall(method, options);
@ -2436,7 +2406,7 @@ public class ManagedChannelImplTest {
@Test @Test
public void binaryLogInterceptor_intercept_reqResp() throws Exception { public void binaryLogInterceptor_intercept_reqResp() throws Exception {
final class TracingClientInterceptor implements ClientInterceptor { final class TracingClientInterceptor implements ClientInterceptor {
private final List<MethodDescriptor<?, ?>> interceptedMethods = final List<MethodDescriptor<?, ?>> interceptedMethods =
new ArrayList<MethodDescriptor<?, ?>>(); new ArrayList<MethodDescriptor<?, ?>>();
@Override @Override
@ -2448,7 +2418,7 @@ public class ManagedChannelImplTest {
} }
TracingClientInterceptor userInterceptor = new TracingClientInterceptor(); TracingClientInterceptor userInterceptor = new TracingClientInterceptor();
binlogProvider = new BinaryLogProvider() { channelBuilder.binlogProvider = new BinaryLogProvider() {
@Nullable @Nullable
@Override @Override
public ServerInterceptor getServerInterceptor(String fullMethodName) { public ServerInterceptor getServerInterceptor(String fullMethodName) {
@ -2470,9 +2440,7 @@ public class ManagedChannelImplTest {
return true; return true;
} }
}; };
createChannel( createChannel(userInterceptor);
new FakeNameResolverFactory.Builder(expectedUri).build(),
Collections.<ClientInterceptor>singletonList(userInterceptor));
ClientCall<String, Integer> call = ClientCall<String, Integer> call =
channel.newCall(method, CallOptions.DEFAULT.withDeadlineAfter(0, TimeUnit.NANOSECONDS)); channel.newCall(method, CallOptions.DEFAULT.withDeadlineAfter(0, TimeUnit.NANOSECONDS));
ClientCall.Listener<Integer> listener = new NoopClientCallListener<Integer>(); ClientCall.Listener<Integer> listener = new NoopClientCallListener<Integer>();
@ -2492,11 +2460,27 @@ public class ManagedChannelImplTest {
userInterceptor.interceptedMethods.get(0).getResponseMarshaller()); userInterceptor.interceptedMethods.get(0).getResponseMarshaller());
} }
private static class FakeBackoffPolicyProvider implements BackoffPolicy.Provider { private static final class ChannelBuilder
extends AbstractManagedChannelImplBuilder<ChannelBuilder> {
ChannelBuilder() {
super(TARGET);
}
@Override protected ClientTransportFactory buildTransportFactory() {
throw new UnsupportedOperationException();
}
@Override protected Attributes getNameResolverParams() {
return NAME_RESOLVER_PARAMS;
}
}
private static final class FakeBackoffPolicyProvider implements BackoffPolicy.Provider {
@Override @Override
public BackoffPolicy get() { public BackoffPolicy get() {
return new BackoffPolicy() { return new BackoffPolicy() {
private int multiplier = 1; int multiplier = 1;
@Override @Override
public long nextBackoffNanos() { public long nextBackoffNanos() {
@ -2506,14 +2490,14 @@ public class ManagedChannelImplTest {
} }
} }
private static class FakeNameResolverFactory extends NameResolver.Factory { private static final class FakeNameResolverFactory extends NameResolver.Factory {
private final URI expectedUri; final URI expectedUri;
private final List<EquivalentAddressGroup> servers; final List<EquivalentAddressGroup> servers;
private final boolean resolvedAtStart; final boolean resolvedAtStart;
private final Status error; final Status error;
private final ArrayList<FakeNameResolver> resolvers = new ArrayList<FakeNameResolver>(); final ArrayList<FakeNameResolver> resolvers = new ArrayList<FakeNameResolver>();
private FakeNameResolverFactory( FakeNameResolverFactory(
URI expectedUri, URI expectedUri,
List<EquivalentAddressGroup> servers, List<EquivalentAddressGroup> servers,
boolean resolvedAtStart, boolean resolvedAtStart,
@ -2546,7 +2530,7 @@ public class ManagedChannelImplTest {
} }
} }
private class FakeNameResolver extends NameResolver { final class FakeNameResolver extends NameResolver {
Listener listener; Listener listener;
boolean shutdown; boolean shutdown;
int refreshCalled; int refreshCalled;
@ -2586,32 +2570,32 @@ public class ManagedChannelImplTest {
} }
} }
private static class Builder { static final class Builder {
private final URI expectedUri; final URI expectedUri;
List<EquivalentAddressGroup> servers = ImmutableList.<EquivalentAddressGroup>of(); List<EquivalentAddressGroup> servers = ImmutableList.<EquivalentAddressGroup>of();
boolean resolvedAtStart = true; boolean resolvedAtStart = true;
Status error = null; Status error = null;
private Builder(URI expectedUri) { Builder(URI expectedUri) {
this.expectedUri = expectedUri; this.expectedUri = expectedUri;
} }
private Builder setServers(List<EquivalentAddressGroup> servers) { Builder setServers(List<EquivalentAddressGroup> servers) {
this.servers = servers; this.servers = servers;
return this; return this;
} }
private Builder setResolvedAtStart(boolean resolvedAtStart) { Builder setResolvedAtStart(boolean resolvedAtStart) {
this.resolvedAtStart = resolvedAtStart; this.resolvedAtStart = resolvedAtStart;
return this; return this;
} }
private Builder setError(Status error) { Builder setError(Status error) {
this.error = error; this.error = error;
return this; return this;
} }
private FakeNameResolverFactory build() { FakeNameResolverFactory build() {
return new FakeNameResolverFactory(expectedUri, servers, resolvedAtStart, error); return new FakeNameResolverFactory(expectedUri, servers, resolvedAtStart, error);
} }
} }