core,netty,okhttp: propagate the subchannel logger to the transport

This commit is contained in:
Carl Mastrangelo 2019-03-04 15:16:53 -08:00 committed by GitHub
parent 3bae61e83b
commit 801cc5c189
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
19 changed files with 373 additions and 105 deletions

View File

@ -19,6 +19,7 @@ package io.grpc.inprocess;
import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
import io.grpc.ChannelLogger;
import io.grpc.ExperimentalApi; import io.grpc.ExperimentalApi;
import io.grpc.Internal; import io.grpc.Internal;
import io.grpc.internal.AbstractManagedChannelImplBuilder; import io.grpc.internal.AbstractManagedChannelImplBuilder;
@ -197,10 +198,11 @@ public final class InProcessChannelBuilder extends
@Override @Override
public ConnectionClientTransport newClientTransport( public ConnectionClientTransport newClientTransport(
SocketAddress addr, ClientTransportOptions options) { SocketAddress addr, ClientTransportOptions options, ChannelLogger channelLogger) {
if (closed) { if (closed) {
throw new IllegalStateException("The transport factory is closed."); throw new IllegalStateException("The transport factory is closed.");
} }
// TODO(carl-mastrangelo): Pass channelLogger in.
return new InProcessTransport( return new InProcessTransport(
name, maxInboundMetadataSize, options.getAuthority(), options.getUserAgent(), name, maxInboundMetadataSize, options.getAuthority(), options.getUserAgent(),
options.getEagAttributes()); options.getEagAttributes());

View File

@ -23,6 +23,7 @@ import io.grpc.Attributes;
import io.grpc.CallCredentials; import io.grpc.CallCredentials;
import io.grpc.CallCredentials.RequestInfo; import io.grpc.CallCredentials.RequestInfo;
import io.grpc.CallOptions; import io.grpc.CallOptions;
import io.grpc.ChannelLogger;
import io.grpc.Metadata; import io.grpc.Metadata;
import io.grpc.MethodDescriptor; import io.grpc.MethodDescriptor;
import io.grpc.SecurityLevel; import io.grpc.SecurityLevel;
@ -43,9 +44,9 @@ final class CallCredentialsApplyingTransportFactory implements ClientTransportFa
@Override @Override
public ConnectionClientTransport newClientTransport( public ConnectionClientTransport newClientTransport(
SocketAddress serverAddress, ClientTransportOptions options) { SocketAddress serverAddress, ClientTransportOptions options, ChannelLogger channelLogger) {
return new CallCredentialsApplyingTransport( return new CallCredentialsApplyingTransport(
delegate.newClientTransport(serverAddress, options), options.getAuthority()); delegate.newClientTransport(serverAddress, options, channelLogger), options.getAuthority());
} }
@Override @Override

View File

@ -19,6 +19,7 @@ package io.grpc.internal;
import com.google.common.base.Objects; import com.google.common.base.Objects;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
import io.grpc.Attributes; import io.grpc.Attributes;
import io.grpc.ChannelLogger;
import io.grpc.HttpConnectProxiedSocketAddress; import io.grpc.HttpConnectProxiedSocketAddress;
import java.io.Closeable; import java.io.Closeable;
import java.net.SocketAddress; import java.net.SocketAddress;
@ -33,10 +34,12 @@ public interface ClientTransportFactory extends Closeable {
* *
* @param serverAddress the address that the transport is connected to * @param serverAddress the address that the transport is connected to
* @param options additional configuration * @param options additional configuration
* @param channelLogger logger for the transport.
*/ */
ConnectionClientTransport newClientTransport( ConnectionClientTransport newClientTransport(
SocketAddress serverAddress, SocketAddress serverAddress,
ClientTransportOptions options); ClientTransportOptions options,
ChannelLogger channelLogger);
/** /**
* Returns an executor for scheduling provided by the transport. The service should be configured * Returns an executor for scheduling provided by the transport. The service should be configured
@ -65,12 +68,22 @@ public interface ClientTransportFactory extends Closeable {
* copied and then the options object is discarded. This allows using {@code final} for those * copied and then the options object is discarded. This allows using {@code final} for those
* fields as well as avoids retaining unused objects contained in the options. * fields as well as avoids retaining unused objects contained in the options.
*/ */
public static final class ClientTransportOptions { final class ClientTransportOptions {
private ChannelLogger channelLogger;
private String authority = "unknown-authority"; private String authority = "unknown-authority";
private Attributes eagAttributes = Attributes.EMPTY; private Attributes eagAttributes = Attributes.EMPTY;
@Nullable private String userAgent; @Nullable private String userAgent;
@Nullable private HttpConnectProxiedSocketAddress connectProxiedSocketAddr; @Nullable private HttpConnectProxiedSocketAddress connectProxiedSocketAddr;
public ChannelLogger getChannelLogger() {
return channelLogger;
}
public ClientTransportOptions setChannelLogger(ChannelLogger channelLogger) {
this.channelLogger = channelLogger;
return this;
}
public String getAuthority() { public String getAuthority() {
return authority; return authority;
} }

View File

@ -260,7 +260,7 @@ final class InternalSubchannel implements InternalInstrumented<ChannelStats> {
.setHttpConnectProxiedSocketAddress(proxiedAddr); .setHttpConnectProxiedSocketAddress(proxiedAddr);
ConnectionClientTransport transport = ConnectionClientTransport transport =
new CallTracingTransport( new CallTracingTransport(
transportFactory.newClientTransport(address, options), callsTracer); transportFactory.newClientTransport(address, options, channelLogger), callsTracer);
channelz.addClientSocket(transport); channelz.addClientSocket(transport);
pendingTransport = transport; pendingTransport = transport;
transports.add(transport); transports.add(transport);

View File

@ -46,6 +46,7 @@ import com.google.common.util.concurrent.MoreExecutors;
import com.google.common.util.concurrent.SettableFuture; import com.google.common.util.concurrent.SettableFuture;
import io.grpc.Attributes; import io.grpc.Attributes;
import io.grpc.CallOptions; import io.grpc.CallOptions;
import io.grpc.ChannelLogger;
import io.grpc.ClientStreamTracer; import io.grpc.ClientStreamTracer;
import io.grpc.ClientStreamTracer.StreamInfo; import io.grpc.ClientStreamTracer.StreamInfo;
import io.grpc.Grpc; import io.grpc.Grpc;
@ -140,6 +141,16 @@ public abstract class AbstractTransportTest {
return EAG_ATTRS; return EAG_ATTRS;
} }
protected final ChannelLogger transportLogger() {
return new ChannelLogger() {
@Override
public void log(ChannelLogLevel level, String message) {}
@Override
public void log(ChannelLogLevel level, String messageFormat, Object... args) {}
};
}
/** /**
* When non-null, will be shut down during tearDown(). However, it _must_ have been started with * When non-null, will be shut down during tearDown(). However, it _must_ have been started with
* {@code serverListener}, otherwise tearDown() can't wait for shutdown which can put following * {@code serverListener}, otherwise tearDown() can't wait for shutdown which can put following

View File

@ -32,6 +32,7 @@ import io.grpc.Attributes;
import io.grpc.CallCredentials.MetadataApplier; import io.grpc.CallCredentials.MetadataApplier;
import io.grpc.CallCredentials.RequestInfo; import io.grpc.CallCredentials.RequestInfo;
import io.grpc.CallOptions; import io.grpc.CallOptions;
import io.grpc.ChannelLogger;
import io.grpc.IntegerMarshaller; import io.grpc.IntegerMarshaller;
import io.grpc.Metadata; import io.grpc.Metadata;
import io.grpc.MethodDescriptor; import io.grpc.MethodDescriptor;
@ -80,6 +81,10 @@ public class CallCredentials2ApplyingTest {
@Mock @Mock
private SocketAddress address; private SocketAddress address;
// Noop logger;
@Mock
private ChannelLogger channelLogger;
private static final String AUTHORITY = "testauthority"; private static final String AUTHORITY = "testauthority";
private static final String USER_AGENT = "testuseragent"; private static final String USER_AGENT = "testuseragent";
private static final Attributes.Key<String> ATTR_KEY = Attributes.Key.create("somekey"); private static final Attributes.Key<String> ATTR_KEY = Attributes.Key.create("somekey");
@ -110,16 +115,16 @@ public class CallCredentials2ApplyingTest {
.setUserAgent(USER_AGENT); .setUserAgent(USER_AGENT);
origHeaders.put(ORIG_HEADER_KEY, ORIG_HEADER_VALUE); origHeaders.put(ORIG_HEADER_KEY, ORIG_HEADER_VALUE);
when(mockTransportFactory.newClientTransport(address, clientTransportOptions)) when(mockTransportFactory.newClientTransport(address, clientTransportOptions, channelLogger))
.thenReturn(mockTransport); .thenReturn(mockTransport);
when(mockTransport.newStream(same(method), any(Metadata.class), any(CallOptions.class))) when(mockTransport.newStream(same(method), any(Metadata.class), any(CallOptions.class)))
.thenReturn(mockStream); .thenReturn(mockStream);
ClientTransportFactory transportFactory = new CallCredentialsApplyingTransportFactory( ClientTransportFactory transportFactory = new CallCredentialsApplyingTransportFactory(
mockTransportFactory, mockExecutor); mockTransportFactory, mockExecutor);
transport = (ForwardingConnectionClientTransport) transport = (ForwardingConnectionClientTransport)
transportFactory.newClientTransport(address, clientTransportOptions); transportFactory.newClientTransport(address, clientTransportOptions, channelLogger);
callOptions = CallOptions.DEFAULT.withCallCredentials(mockCreds); callOptions = CallOptions.DEFAULT.withCallCredentials(mockCreds);
verify(mockTransportFactory).newClientTransport(address, clientTransportOptions); verify(mockTransportFactory).newClientTransport(address, clientTransportOptions, channelLogger);
assertSame(mockTransport, transport.delegate()); assertSame(mockTransport, transport.delegate());
} }

View File

@ -32,6 +32,7 @@ import io.grpc.Attributes;
import io.grpc.CallCredentials; import io.grpc.CallCredentials;
import io.grpc.CallCredentials.RequestInfo; import io.grpc.CallCredentials.RequestInfo;
import io.grpc.CallOptions; import io.grpc.CallOptions;
import io.grpc.ChannelLogger;
import io.grpc.IntegerMarshaller; import io.grpc.IntegerMarshaller;
import io.grpc.Metadata; import io.grpc.Metadata;
import io.grpc.MethodDescriptor; import io.grpc.MethodDescriptor;
@ -79,6 +80,10 @@ public class CallCredentialsApplyingTest {
@Mock @Mock
private SocketAddress address; private SocketAddress address;
// Noop logger;
@Mock
private ChannelLogger channelLogger;
private static final String AUTHORITY = "testauthority"; private static final String AUTHORITY = "testauthority";
private static final String USER_AGENT = "testuseragent"; private static final String USER_AGENT = "testuseragent";
private static final Attributes.Key<String> ATTR_KEY = Attributes.Key.create("somekey"); private static final Attributes.Key<String> ATTR_KEY = Attributes.Key.create("somekey");
@ -109,16 +114,16 @@ public class CallCredentialsApplyingTest {
.setUserAgent(USER_AGENT); .setUserAgent(USER_AGENT);
origHeaders.put(ORIG_HEADER_KEY, ORIG_HEADER_VALUE); origHeaders.put(ORIG_HEADER_KEY, ORIG_HEADER_VALUE);
when(mockTransportFactory.newClientTransport(address, clientTransportOptions)) when(mockTransportFactory.newClientTransport(address, clientTransportOptions, channelLogger))
.thenReturn(mockTransport); .thenReturn(mockTransport);
when(mockTransport.newStream(same(method), any(Metadata.class), any(CallOptions.class))) when(mockTransport.newStream(same(method), any(Metadata.class), any(CallOptions.class)))
.thenReturn(mockStream); .thenReturn(mockStream);
ClientTransportFactory transportFactory = new CallCredentialsApplyingTransportFactory( ClientTransportFactory transportFactory = new CallCredentialsApplyingTransportFactory(
mockTransportFactory, mockExecutor); mockTransportFactory, mockExecutor);
transport = (ForwardingConnectionClientTransport) transport = (ForwardingConnectionClientTransport)
transportFactory.newClientTransport(address, clientTransportOptions); transportFactory.newClientTransport(address, clientTransportOptions, channelLogger);
callOptions = CallOptions.DEFAULT.withCallCredentials(mockCreds); callOptions = CallOptions.DEFAULT.withCallCredentials(mockCreds);
verify(mockTransportFactory).newClientTransport(address, clientTransportOptions); verify(mockTransportFactory).newClientTransport(address, clientTransportOptions, channelLogger);
assertSame(mockTransport, transport.delegate()); assertSame(mockTransport, transport.delegate());
} }

View File

@ -167,8 +167,10 @@ public class InternalSubchannelTest {
// First attempt // First attempt
assertNull(internalSubchannel.obtainActiveTransport()); assertNull(internalSubchannel.obtainActiveTransport());
assertEquals(CONNECTING, internalSubchannel.getState()); assertEquals(CONNECTING, internalSubchannel.getState());
verify(mockTransportFactory) verify(mockTransportFactory).newClientTransport(
.newClientTransport(addr, createClientTransportOptions().setEagAttributes(attr)); addr,
createClientTransportOptions().setEagAttributes(attr),
internalSubchannel.getChannelLogger());
} }
@Test public void singleAddressReconnect() { @Test public void singleAddressReconnect() {
@ -189,7 +191,10 @@ public class InternalSubchannelTest {
assertExactCallbackInvokes("onStateChange:CONNECTING"); assertExactCallbackInvokes("onStateChange:CONNECTING");
assertEquals(CONNECTING, internalSubchannel.getState()); assertEquals(CONNECTING, internalSubchannel.getState());
verify(mockTransportFactory, times(++transportsCreated)) verify(mockTransportFactory, times(++transportsCreated))
.newClientTransport(addr, createClientTransportOptions()); .newClientTransport(
addr,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
// Fail this one. Because there is only one address to try, enter TRANSIENT_FAILURE. // Fail this one. Because there is only one address to try, enter TRANSIENT_FAILURE.
assertNoCallbackInvoke(); assertNoCallbackInvoke();
@ -205,7 +210,10 @@ public class InternalSubchannelTest {
fakeClock.forwardNanos(9); fakeClock.forwardNanos(9);
assertNull(internalSubchannel.obtainActiveTransport()); assertNull(internalSubchannel.obtainActiveTransport());
verify(mockTransportFactory, times(transportsCreated)) verify(mockTransportFactory, times(transportsCreated))
.newClientTransport(addr, createClientTransportOptions()); .newClientTransport(
addr,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
assertEquals(TRANSIENT_FAILURE, internalSubchannel.getState()); assertEquals(TRANSIENT_FAILURE, internalSubchannel.getState());
assertNoCallbackInvoke(); assertNoCallbackInvoke();
@ -213,7 +221,10 @@ public class InternalSubchannelTest {
assertExactCallbackInvokes("onStateChange:CONNECTING"); assertExactCallbackInvokes("onStateChange:CONNECTING");
assertEquals(CONNECTING, internalSubchannel.getState()); assertEquals(CONNECTING, internalSubchannel.getState());
verify(mockTransportFactory, times(++transportsCreated)) verify(mockTransportFactory, times(++transportsCreated))
.newClientTransport(addr, createClientTransportOptions()); .newClientTransport(
addr,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
// Fail this one too // Fail this one too
assertNoCallbackInvoke(); assertNoCallbackInvoke();
// Here we use a different status from the first failure, and verify that it's passed to // Here we use a different status from the first failure, and verify that it's passed to
@ -230,7 +241,10 @@ public class InternalSubchannelTest {
fakeClock.forwardNanos(99); fakeClock.forwardNanos(99);
assertNull(internalSubchannel.obtainActiveTransport()); assertNull(internalSubchannel.obtainActiveTransport());
verify(mockTransportFactory, times(transportsCreated)) verify(mockTransportFactory, times(transportsCreated))
.newClientTransport(addr, createClientTransportOptions()); .newClientTransport(
addr,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
assertEquals(TRANSIENT_FAILURE, internalSubchannel.getState()); assertEquals(TRANSIENT_FAILURE, internalSubchannel.getState());
assertNoCallbackInvoke(); assertNoCallbackInvoke();
fakeClock.forwardNanos(1); fakeClock.forwardNanos(1);
@ -238,7 +252,10 @@ public class InternalSubchannelTest {
assertExactCallbackInvokes("onStateChange:CONNECTING"); assertExactCallbackInvokes("onStateChange:CONNECTING");
assertNull(internalSubchannel.obtainActiveTransport()); assertNull(internalSubchannel.obtainActiveTransport());
verify(mockTransportFactory, times(++transportsCreated)) verify(mockTransportFactory, times(++transportsCreated))
.newClientTransport(addr, createClientTransportOptions()); .newClientTransport(
addr,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
// Let this one succeed, will enter READY state. // Let this one succeed, will enter READY state.
assertNoCallbackInvoke(); assertNoCallbackInvoke();
transports.peek().listener.transportReady(); transports.peek().listener.transportReady();
@ -260,7 +277,10 @@ public class InternalSubchannelTest {
assertExactCallbackInvokes("onStateChange:CONNECTING"); assertExactCallbackInvokes("onStateChange:CONNECTING");
verify(mockBackoffPolicyProvider, times(backoffReset)).get(); verify(mockBackoffPolicyProvider, times(backoffReset)).get();
verify(mockTransportFactory, times(++transportsCreated)) verify(mockTransportFactory, times(++transportsCreated))
.newClientTransport(addr, createClientTransportOptions()); .newClientTransport(
addr,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
// Final checks for consultations on back-off policies // Final checks for consultations on back-off policies
verify(mockBackoffPolicy1, times(backoff1Consulted)).nextBackoffNanos(); verify(mockBackoffPolicy1, times(backoff1Consulted)).nextBackoffNanos();
@ -286,7 +306,10 @@ public class InternalSubchannelTest {
assertExactCallbackInvokes("onStateChange:CONNECTING"); assertExactCallbackInvokes("onStateChange:CONNECTING");
assertEquals(CONNECTING, internalSubchannel.getState()); assertEquals(CONNECTING, internalSubchannel.getState());
verify(mockTransportFactory, times(++transportsAddr1)) verify(mockTransportFactory, times(++transportsAddr1))
.newClientTransport(addr1, createClientTransportOptions()); .newClientTransport(
addr1,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
// Let this one fail without success // Let this one fail without success
transports.poll().listener.transportShutdown(Status.UNAVAILABLE); transports.poll().listener.transportShutdown(Status.UNAVAILABLE);
@ -298,7 +321,10 @@ public class InternalSubchannelTest {
// Second attempt will start immediately. Still no back-off policy. // Second attempt will start immediately. Still no back-off policy.
verify(mockBackoffPolicyProvider, times(backoffReset)).get(); verify(mockBackoffPolicyProvider, times(backoffReset)).get();
verify(mockTransportFactory, times(++transportsAddr2)) verify(mockTransportFactory, times(++transportsAddr2))
.newClientTransport(addr2, createClientTransportOptions()); .newClientTransport(
addr2,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
assertNull(internalSubchannel.obtainActiveTransport()); assertNull(internalSubchannel.obtainActiveTransport());
// Fail this one too // Fail this one too
assertNoCallbackInvoke(); assertNoCallbackInvoke();
@ -318,14 +344,20 @@ public class InternalSubchannelTest {
// Third attempt is the first address, thus controlled by the first back-off interval. // Third attempt is the first address, thus controlled by the first back-off interval.
fakeClock.forwardNanos(9); fakeClock.forwardNanos(9);
verify(mockTransportFactory, times(transportsAddr1)) verify(mockTransportFactory, times(transportsAddr1))
.newClientTransport(addr1, createClientTransportOptions()); .newClientTransport(
addr1,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
assertEquals(TRANSIENT_FAILURE, internalSubchannel.getState()); assertEquals(TRANSIENT_FAILURE, internalSubchannel.getState());
assertNoCallbackInvoke(); assertNoCallbackInvoke();
fakeClock.forwardNanos(1); fakeClock.forwardNanos(1);
assertExactCallbackInvokes("onStateChange:CONNECTING"); assertExactCallbackInvokes("onStateChange:CONNECTING");
assertEquals(CONNECTING, internalSubchannel.getState()); assertEquals(CONNECTING, internalSubchannel.getState());
verify(mockTransportFactory, times(++transportsAddr1)) verify(mockTransportFactory, times(++transportsAddr1))
.newClientTransport(addr1, createClientTransportOptions()); .newClientTransport(
addr1,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
// Fail this one too // Fail this one too
transports.poll().listener.transportShutdown(Status.UNAVAILABLE); transports.poll().listener.transportShutdown(Status.UNAVAILABLE);
assertEquals(CONNECTING, internalSubchannel.getState()); assertEquals(CONNECTING, internalSubchannel.getState());
@ -335,7 +367,10 @@ public class InternalSubchannelTest {
assertEquals(CONNECTING, internalSubchannel.getState()); assertEquals(CONNECTING, internalSubchannel.getState());
verify(mockBackoffPolicyProvider, times(backoffReset)).get(); verify(mockBackoffPolicyProvider, times(backoffReset)).get();
verify(mockTransportFactory, times(++transportsAddr2)) verify(mockTransportFactory, times(++transportsAddr2))
.newClientTransport(addr2, createClientTransportOptions()); .newClientTransport(
addr2,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
// Fail this one too // Fail this one too
assertNoCallbackInvoke(); assertNoCallbackInvoke();
transports.poll().listener.transportShutdown(Status.RESOURCE_EXHAUSTED); transports.poll().listener.transportShutdown(Status.RESOURCE_EXHAUSTED);
@ -350,14 +385,20 @@ public class InternalSubchannelTest {
assertEquals(TRANSIENT_FAILURE, internalSubchannel.getState()); assertEquals(TRANSIENT_FAILURE, internalSubchannel.getState());
fakeClock.forwardNanos(99); fakeClock.forwardNanos(99);
verify(mockTransportFactory, times(transportsAddr1)) verify(mockTransportFactory, times(transportsAddr1))
.newClientTransport(addr1, createClientTransportOptions()); .newClientTransport(
addr1,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
assertEquals(TRANSIENT_FAILURE, internalSubchannel.getState()); assertEquals(TRANSIENT_FAILURE, internalSubchannel.getState());
assertNoCallbackInvoke(); assertNoCallbackInvoke();
fakeClock.forwardNanos(1); fakeClock.forwardNanos(1);
assertExactCallbackInvokes("onStateChange:CONNECTING"); assertExactCallbackInvokes("onStateChange:CONNECTING");
assertEquals(CONNECTING, internalSubchannel.getState()); assertEquals(CONNECTING, internalSubchannel.getState());
verify(mockTransportFactory, times(++transportsAddr1)) verify(mockTransportFactory, times(++transportsAddr1))
.newClientTransport(addr1, createClientTransportOptions()); .newClientTransport(
addr1,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
// Let it through // Let it through
assertNoCallbackInvoke(); assertNoCallbackInvoke();
transports.peek().listener.transportReady(); transports.peek().listener.transportReady();
@ -380,7 +421,10 @@ public class InternalSubchannelTest {
assertExactCallbackInvokes("onStateChange:CONNECTING"); assertExactCallbackInvokes("onStateChange:CONNECTING");
verify(mockBackoffPolicyProvider, times(backoffReset)).get(); verify(mockBackoffPolicyProvider, times(backoffReset)).get();
verify(mockTransportFactory, times(++transportsAddr1)) verify(mockTransportFactory, times(++transportsAddr1))
.newClientTransport(addr1, createClientTransportOptions()); .newClientTransport(
addr1,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
// Fail the transport // Fail the transport
transports.poll().listener.transportShutdown(Status.UNAVAILABLE); transports.poll().listener.transportShutdown(Status.UNAVAILABLE);
assertEquals(CONNECTING, internalSubchannel.getState()); assertEquals(CONNECTING, internalSubchannel.getState());
@ -388,7 +432,10 @@ public class InternalSubchannelTest {
// Second attempt will start immediately. Still no new back-off policy. // Second attempt will start immediately. Still no new back-off policy.
verify(mockBackoffPolicyProvider, times(backoffReset)).get(); verify(mockBackoffPolicyProvider, times(backoffReset)).get();
verify(mockTransportFactory, times(++transportsAddr2)) verify(mockTransportFactory, times(++transportsAddr2))
.newClientTransport(addr2, createClientTransportOptions()); .newClientTransport(
addr2,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
// Fail this one too // Fail this one too
assertEquals(CONNECTING, internalSubchannel.getState()); assertEquals(CONNECTING, internalSubchannel.getState());
transports.poll().listener.transportShutdown(Status.UNAVAILABLE); transports.poll().listener.transportShutdown(Status.UNAVAILABLE);
@ -402,14 +449,20 @@ public class InternalSubchannelTest {
// Third attempt is the first address, thus controlled by the first back-off interval. // Third attempt is the first address, thus controlled by the first back-off interval.
fakeClock.forwardNanos(9); fakeClock.forwardNanos(9);
verify(mockTransportFactory, times(transportsAddr1)) verify(mockTransportFactory, times(transportsAddr1))
.newClientTransport(addr1, createClientTransportOptions()); .newClientTransport(
addr1,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
assertEquals(TRANSIENT_FAILURE, internalSubchannel.getState()); assertEquals(TRANSIENT_FAILURE, internalSubchannel.getState());
assertNoCallbackInvoke(); assertNoCallbackInvoke();
fakeClock.forwardNanos(1); fakeClock.forwardNanos(1);
assertExactCallbackInvokes("onStateChange:CONNECTING"); assertExactCallbackInvokes("onStateChange:CONNECTING");
assertEquals(CONNECTING, internalSubchannel.getState()); assertEquals(CONNECTING, internalSubchannel.getState());
verify(mockTransportFactory, times(++transportsAddr1)) verify(mockTransportFactory, times(++transportsAddr1))
.newClientTransport(addr1, createClientTransportOptions()); .newClientTransport(
addr1,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
// Final checks on invocations on back-off policies // Final checks on invocations on back-off policies
verify(mockBackoffPolicy1, times(backoff1Consulted)).nextBackoffNanos(); verify(mockBackoffPolicy1, times(backoff1Consulted)).nextBackoffNanos();
@ -444,12 +497,20 @@ public class InternalSubchannelTest {
// First address fails // First address fails
assertNull(internalSubchannel.obtainActiveTransport()); assertNull(internalSubchannel.obtainActiveTransport());
assertExactCallbackInvokes("onStateChange:CONNECTING"); assertExactCallbackInvokes("onStateChange:CONNECTING");
verify(mockTransportFactory).newClientTransport(addr1, createClientTransportOptions()); verify(mockTransportFactory)
.newClientTransport(
addr1,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
transports.poll().listener.transportShutdown(Status.UNAVAILABLE); transports.poll().listener.transportShutdown(Status.UNAVAILABLE);
assertEquals(CONNECTING, internalSubchannel.getState()); assertEquals(CONNECTING, internalSubchannel.getState());
// Second address connects // Second address connects
verify(mockTransportFactory).newClientTransport(addr2, createClientTransportOptions()); verify(mockTransportFactory)
.newClientTransport(
addr2,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
transports.peek().listener.transportReady(); transports.peek().listener.transportReady();
assertExactCallbackInvokes("onStateChange:READY"); assertExactCallbackInvokes("onStateChange:READY");
assertEquals(READY, internalSubchannel.getState()); assertEquals(READY, internalSubchannel.getState());
@ -469,9 +530,16 @@ public class InternalSubchannelTest {
assertNull(internalSubchannel.obtainActiveTransport()); assertNull(internalSubchannel.obtainActiveTransport());
assertEquals(0, fakeClock.numPendingTasks()); assertEquals(0, fakeClock.numPendingTasks());
verify(mockTransportFactory, times(2)) verify(mockTransportFactory, times(2))
.newClientTransport(addr2, createClientTransportOptions()); .newClientTransport(
addr2,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
transports.poll().listener.transportShutdown(Status.UNAVAILABLE); transports.poll().listener.transportShutdown(Status.UNAVAILABLE);
verify(mockTransportFactory).newClientTransport(addr3, createClientTransportOptions()); verify(mockTransportFactory)
.newClientTransport(
addr3,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
transports.poll().listener.transportShutdown(Status.UNAVAILABLE); transports.poll().listener.transportShutdown(Status.UNAVAILABLE);
verifyNoMoreInteractions(mockTransportFactory); verifyNoMoreInteractions(mockTransportFactory);
@ -488,12 +556,20 @@ public class InternalSubchannelTest {
// First address fails // First address fails
assertNull(internalSubchannel.obtainActiveTransport()); assertNull(internalSubchannel.obtainActiveTransport());
assertExactCallbackInvokes("onStateChange:CONNECTING"); assertExactCallbackInvokes("onStateChange:CONNECTING");
verify(mockTransportFactory).newClientTransport(addr1, createClientTransportOptions()); verify(mockTransportFactory)
.newClientTransport(
addr1,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
transports.poll().listener.transportShutdown(Status.UNAVAILABLE); transports.poll().listener.transportShutdown(Status.UNAVAILABLE);
assertEquals(CONNECTING, internalSubchannel.getState()); assertEquals(CONNECTING, internalSubchannel.getState());
// Second address connecting // Second address connecting
verify(mockTransportFactory).newClientTransport(addr2, createClientTransportOptions()); verify(mockTransportFactory)
.newClientTransport(
addr2,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
assertNoCallbackInvoke(); assertNoCallbackInvoke();
assertEquals(CONNECTING, internalSubchannel.getState()); assertEquals(CONNECTING, internalSubchannel.getState());
@ -514,9 +590,16 @@ public class InternalSubchannelTest {
assertNull(internalSubchannel.obtainActiveTransport()); assertNull(internalSubchannel.obtainActiveTransport());
assertEquals(0, fakeClock.numPendingTasks()); assertEquals(0, fakeClock.numPendingTasks());
verify(mockTransportFactory, times(2)) verify(mockTransportFactory, times(2))
.newClientTransport(addr2, createClientTransportOptions()); .newClientTransport(
addr2,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
transports.poll().listener.transportShutdown(Status.UNAVAILABLE); transports.poll().listener.transportShutdown(Status.UNAVAILABLE);
verify(mockTransportFactory).newClientTransport(addr3, createClientTransportOptions()); verify(mockTransportFactory)
.newClientTransport(
addr3,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
transports.poll().listener.transportShutdown(Status.UNAVAILABLE); transports.poll().listener.transportShutdown(Status.UNAVAILABLE);
verifyNoMoreInteractions(mockTransportFactory); verifyNoMoreInteractions(mockTransportFactory);
@ -532,9 +615,15 @@ public class InternalSubchannelTest {
// Nothing happened on address update // Nothing happened on address update
verify(mockTransportFactory, never()) verify(mockTransportFactory, never())
.newClientTransport(addr1, createClientTransportOptions()); .newClientTransport(
addr1,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
verify(mockTransportFactory, never()) verify(mockTransportFactory, never())
.newClientTransport(addr2, createClientTransportOptions()); .newClientTransport(
addr2,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
verifyNoMoreInteractions(mockTransportFactory); verifyNoMoreInteractions(mockTransportFactory);
assertNoCallbackInvoke(); assertNoCallbackInvoke();
assertEquals(IDLE, internalSubchannel.getState()); assertEquals(IDLE, internalSubchannel.getState());
@ -542,7 +631,11 @@ public class InternalSubchannelTest {
// But new address chosen when connecting // But new address chosen when connecting
assertNull(internalSubchannel.obtainActiveTransport()); assertNull(internalSubchannel.obtainActiveTransport());
assertExactCallbackInvokes("onStateChange:CONNECTING"); assertExactCallbackInvokes("onStateChange:CONNECTING");
verify(mockTransportFactory).newClientTransport(addr2, createClientTransportOptions()); verify(mockTransportFactory)
.newClientTransport(
addr2,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
// And no other addresses attempted // And no other addresses attempted
assertEquals(0, fakeClock.numPendingTasks()); assertEquals(0, fakeClock.numPendingTasks());
@ -565,12 +658,20 @@ public class InternalSubchannelTest {
// First address fails // First address fails
assertNull(internalSubchannel.obtainActiveTransport()); assertNull(internalSubchannel.obtainActiveTransport());
assertExactCallbackInvokes("onStateChange:CONNECTING"); assertExactCallbackInvokes("onStateChange:CONNECTING");
verify(mockTransportFactory).newClientTransport(addr1, createClientTransportOptions()); verify(mockTransportFactory)
.newClientTransport(
addr1,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
transports.poll().listener.transportShutdown(Status.UNAVAILABLE); transports.poll().listener.transportShutdown(Status.UNAVAILABLE);
assertEquals(CONNECTING, internalSubchannel.getState()); assertEquals(CONNECTING, internalSubchannel.getState());
// Second address connects // Second address connects
verify(mockTransportFactory).newClientTransport(addr2, createClientTransportOptions()); verify(mockTransportFactory)
.newClientTransport(
addr2,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
transports.peek().listener.transportReady(); transports.peek().listener.transportReady();
assertExactCallbackInvokes("onStateChange:READY"); assertExactCallbackInvokes("onStateChange:READY");
assertEquals(READY, internalSubchannel.getState()); assertEquals(READY, internalSubchannel.getState());
@ -589,9 +690,17 @@ public class InternalSubchannelTest {
assertNull(internalSubchannel.obtainActiveTransport()); assertNull(internalSubchannel.obtainActiveTransport());
assertEquals(0, fakeClock.numPendingTasks()); assertEquals(0, fakeClock.numPendingTasks());
verify(mockTransportFactory).newClientTransport(addr3, createClientTransportOptions()); verify(mockTransportFactory)
.newClientTransport(
addr3,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
transports.poll().listener.transportShutdown(Status.UNAVAILABLE); transports.poll().listener.transportShutdown(Status.UNAVAILABLE);
verify(mockTransportFactory).newClientTransport(addr4, createClientTransportOptions()); verify(mockTransportFactory)
.newClientTransport(
addr4,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
transports.poll().listener.transportShutdown(Status.UNAVAILABLE); transports.poll().listener.transportShutdown(Status.UNAVAILABLE);
verifyNoMoreInteractions(mockTransportFactory); verifyNoMoreInteractions(mockTransportFactory);
@ -609,12 +718,20 @@ public class InternalSubchannelTest {
// First address fails // First address fails
assertNull(internalSubchannel.obtainActiveTransport()); assertNull(internalSubchannel.obtainActiveTransport());
assertExactCallbackInvokes("onStateChange:CONNECTING"); assertExactCallbackInvokes("onStateChange:CONNECTING");
verify(mockTransportFactory).newClientTransport(addr1, createClientTransportOptions()); verify(mockTransportFactory)
.newClientTransport(
addr1,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
transports.poll().listener.transportShutdown(Status.UNAVAILABLE); transports.poll().listener.transportShutdown(Status.UNAVAILABLE);
assertEquals(CONNECTING, internalSubchannel.getState()); assertEquals(CONNECTING, internalSubchannel.getState());
// Second address connecting // Second address connecting
verify(mockTransportFactory).newClientTransport(addr2, createClientTransportOptions()); verify(mockTransportFactory)
.newClientTransport(
addr2,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
assertNoCallbackInvoke(); assertNoCallbackInvoke();
assertEquals(CONNECTING, internalSubchannel.getState()); assertEquals(CONNECTING, internalSubchannel.getState());
@ -631,9 +748,17 @@ public class InternalSubchannelTest {
assertNull(internalSubchannel.obtainActiveTransport()); assertNull(internalSubchannel.obtainActiveTransport());
assertEquals(0, fakeClock.numPendingTasks()); assertEquals(0, fakeClock.numPendingTasks());
verify(mockTransportFactory).newClientTransport(addr3, createClientTransportOptions()); verify(mockTransportFactory)
.newClientTransport(
addr3,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
transports.poll().listener.transportShutdown(Status.UNAVAILABLE); transports.poll().listener.transportShutdown(Status.UNAVAILABLE);
verify(mockTransportFactory).newClientTransport(addr4, createClientTransportOptions()); verify(mockTransportFactory)
.newClientTransport(
addr4,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
transports.poll().listener.transportShutdown(Status.UNAVAILABLE); transports.poll().listener.transportShutdown(Status.UNAVAILABLE);
verifyNoMoreInteractions(mockTransportFactory); verifyNoMoreInteractions(mockTransportFactory);
@ -650,13 +775,19 @@ public class InternalSubchannelTest {
// Won't connect until requested // Won't connect until requested
verify(mockTransportFactory, times(transportsCreated)) verify(mockTransportFactory, times(transportsCreated))
.newClientTransport(addr, createClientTransportOptions()); .newClientTransport(
addr,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
// First attempt // First attempt
internalSubchannel.obtainActiveTransport(); internalSubchannel.obtainActiveTransport();
assertExactCallbackInvokes("onStateChange:CONNECTING"); assertExactCallbackInvokes("onStateChange:CONNECTING");
verify(mockTransportFactory, times(++transportsCreated)) verify(mockTransportFactory, times(++transportsCreated))
.newClientTransport(addr, createClientTransportOptions()); .newClientTransport(
addr,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
// Fail this one // Fail this one
transports.poll().listener.transportShutdown(Status.UNAVAILABLE); transports.poll().listener.transportShutdown(Status.UNAVAILABLE);
@ -666,7 +797,10 @@ public class InternalSubchannelTest {
fakeClock.forwardNanos(10); fakeClock.forwardNanos(10);
assertExactCallbackInvokes("onStateChange:CONNECTING"); assertExactCallbackInvokes("onStateChange:CONNECTING");
verify(mockTransportFactory, times(++transportsCreated)) verify(mockTransportFactory, times(++transportsCreated))
.newClientTransport(addr, createClientTransportOptions()); .newClientTransport(
addr,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
// Make this one proceed // Make this one proceed
transports.peek().listener.transportReady(); transports.peek().listener.transportReady();
@ -683,7 +817,10 @@ public class InternalSubchannelTest {
internalSubchannel.obtainActiveTransport(); internalSubchannel.obtainActiveTransport();
assertExactCallbackInvokes("onStateChange:CONNECTING"); assertExactCallbackInvokes("onStateChange:CONNECTING");
verify(mockTransportFactory, times(++transportsCreated)) verify(mockTransportFactory, times(++transportsCreated))
.newClientTransport(addr, createClientTransportOptions()); .newClientTransport(
addr,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
} }
@Test @Test
@ -713,7 +850,11 @@ public class InternalSubchannelTest {
// First transport is created immediately // First transport is created immediately
internalSubchannel.obtainActiveTransport(); internalSubchannel.obtainActiveTransport();
assertExactCallbackInvokes("onStateChange:CONNECTING"); assertExactCallbackInvokes("onStateChange:CONNECTING");
verify(mockTransportFactory).newClientTransport(addr, createClientTransportOptions()); verify(mockTransportFactory)
.newClientTransport(
addr,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
// Fail this one // Fail this one
MockClientTransportInfo transportInfo = transports.poll(); MockClientTransportInfo transportInfo = transports.poll();
@ -814,7 +955,10 @@ public class InternalSubchannelTest {
assertEquals(SHUTDOWN, internalSubchannel.getState()); assertEquals(SHUTDOWN, internalSubchannel.getState());
assertNull(internalSubchannel.obtainActiveTransport()); assertNull(internalSubchannel.obtainActiveTransport());
verify(mockTransportFactory, times(0)) verify(mockTransportFactory, times(0))
.newClientTransport(addr, createClientTransportOptions()); .newClientTransport(
addr,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
assertNoCallbackInvoke(); assertNoCallbackInvoke();
assertEquals(SHUTDOWN, internalSubchannel.getState()); assertEquals(SHUTDOWN, internalSubchannel.getState());
} }
@ -930,7 +1074,11 @@ public class InternalSubchannelTest {
// Move into TRANSIENT_FAILURE to schedule reconnect // Move into TRANSIENT_FAILURE to schedule reconnect
internalSubchannel.obtainActiveTransport(); internalSubchannel.obtainActiveTransport();
assertExactCallbackInvokes("onStateChange:CONNECTING"); assertExactCallbackInvokes("onStateChange:CONNECTING");
verify(mockTransportFactory).newClientTransport(addr, createClientTransportOptions()); verify(mockTransportFactory)
.newClientTransport(
addr,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
transports.poll().listener.transportShutdown(Status.UNAVAILABLE); transports.poll().listener.transportShutdown(Status.UNAVAILABLE);
assertExactCallbackInvokes("onStateChange:" + UNAVAILABLE_STATE); assertExactCallbackInvokes("onStateChange:" + UNAVAILABLE_STATE);
@ -948,7 +1096,10 @@ public class InternalSubchannelTest {
internalSubchannel.resetConnectBackoff(); internalSubchannel.resetConnectBackoff();
verify(mockTransportFactory, times(2)) verify(mockTransportFactory, times(2))
.newClientTransport(addr, createClientTransportOptions()); .newClientTransport(
addr,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
assertExactCallbackInvokes("onStateChange:CONNECTING"); assertExactCallbackInvokes("onStateChange:CONNECTING");
assertTrue(reconnectTask.isCancelled()); assertTrue(reconnectTask.isCancelled());
@ -956,7 +1107,10 @@ public class InternalSubchannelTest {
reconnectTask.command.run(); reconnectTask.command.run();
assertNoCallbackInvoke(); assertNoCallbackInvoke();
verify(mockTransportFactory, times(2)) verify(mockTransportFactory, times(2))
.newClientTransport(addr, createClientTransportOptions()); .newClientTransport(
addr,
createClientTransportOptions(),
internalSubchannel.getChannelLogger());
verify(mockBackoffPolicyProvider, times(1)).get(); verify(mockBackoffPolicyProvider, times(1)).get();
// Fail the reconnect attempt to verify that a fresh reconnect policy is generated after // Fail the reconnect attempt to verify that a fresh reconnect policy is generated after

View File

@ -35,6 +35,7 @@ import static org.mockito.Mockito.when;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import io.grpc.Attributes; import io.grpc.Attributes;
import io.grpc.CallOptions; import io.grpc.CallOptions;
import io.grpc.ChannelLogger;
import io.grpc.ClientCall; import io.grpc.ClientCall;
import io.grpc.ClientInterceptor; import io.grpc.ClientInterceptor;
import io.grpc.EquivalentAddressGroup; import io.grpc.EquivalentAddressGroup;
@ -189,7 +190,8 @@ public class ManagedChannelImplIdlenessTest {
verify(mockLoadBalancerProvider, never()).newLoadBalancer(any(Helper.class)); verify(mockLoadBalancerProvider, never()).newLoadBalancer(any(Helper.class));
verify(mockTransportFactory, never()).newClientTransport( verify(mockTransportFactory, never()).newClientTransport(
any(SocketAddress.class), any(SocketAddress.class),
any(ClientTransportFactory.ClientTransportOptions.class)); any(ClientTransportFactory.ClientTransportOptions.class),
any(ChannelLogger.class));
verify(mockNameResolver, never()).start(any(NameResolver.Listener.class)); verify(mockNameResolver, never()).start(any(NameResolver.Listener.class));
} }
@ -398,7 +400,8 @@ public class ManagedChannelImplIdlenessTest {
any(SocketAddress.class), any(SocketAddress.class),
eq(new ClientTransportFactory.ClientTransportOptions() eq(new ClientTransportFactory.ClientTransportOptions()
.setAuthority("oobauthority") .setAuthority("oobauthority")
.setUserAgent(USER_AGENT))); .setUserAgent(USER_AGENT)),
any(ChannelLogger.class));
ClientCall<String, Integer> oobCall = oob.newCall(method, CallOptions.DEFAULT); ClientCall<String, Integer> oobCall = oob.newCall(method, CallOptions.DEFAULT);
oobCall.start(mockCallListener2, new Metadata()); oobCall.start(mockCallListener2, new Metadata());
verify(mockTransportFactory) verify(mockTransportFactory)
@ -406,7 +409,8 @@ public class ManagedChannelImplIdlenessTest {
any(SocketAddress.class), any(SocketAddress.class),
eq(new ClientTransportFactory.ClientTransportOptions() eq(new ClientTransportFactory.ClientTransportOptions()
.setAuthority("oobauthority") .setAuthority("oobauthority")
.setUserAgent(USER_AGENT))); .setUserAgent(USER_AGENT)),
any(ChannelLogger.class));
MockClientTransportInfo oobTransportInfo = newTransports.poll(); MockClientTransportInfo oobTransportInfo = newTransports.poll();
assertEquals(0, newTransports.size()); assertEquals(0, newTransports.size());
// The OOB transport reports in-use state // The OOB transport reports in-use state

View File

@ -36,6 +36,7 @@ import static org.mockito.AdditionalAnswers.delegatesTo;
import static org.mockito.Matchers.any; import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyObject; import static org.mockito.Matchers.anyObject;
import static org.mockito.Matchers.eq; import static org.mockito.Matchers.eq;
import static org.mockito.Matchers.isA;
import static org.mockito.Matchers.same; import static org.mockito.Matchers.same;
import static org.mockito.Mockito.atLeast; import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doAnswer;
@ -63,6 +64,7 @@ import io.grpc.CallCredentials;
import io.grpc.CallCredentials.RequestInfo; import io.grpc.CallCredentials.RequestInfo;
import io.grpc.CallOptions; import io.grpc.CallOptions;
import io.grpc.Channel; import io.grpc.Channel;
import io.grpc.ChannelLogger;
import io.grpc.ClientCall; import io.grpc.ClientCall;
import io.grpc.ClientInterceptor; import io.grpc.ClientInterceptor;
import io.grpc.ClientInterceptors; import io.grpc.ClientInterceptors;
@ -514,7 +516,8 @@ public class ManagedChannelImplTest {
Subchannel subchannel = createSubchannelSafely(helper, addressGroup, Attributes.EMPTY); Subchannel subchannel = createSubchannelSafely(helper, addressGroup, Attributes.EMPTY);
subchannel.requestConnection(); subchannel.requestConnection();
verify(mockTransportFactory) verify(mockTransportFactory)
.newClientTransport(any(SocketAddress.class), any(ClientTransportOptions.class)); .newClientTransport(
any(SocketAddress.class), any(ClientTransportOptions.class), any(ChannelLogger.class));
MockClientTransportInfo transportInfo = transports.poll(); MockClientTransportInfo transportInfo = transports.poll();
ConnectionClientTransport mockTransport = transportInfo.transport; ConnectionClientTransport mockTransport = transportInfo.transport;
verify(mockTransport).start(any(ManagedClientTransport.Listener.class)); verify(mockTransport).start(any(ManagedClientTransport.Listener.class));
@ -535,7 +538,8 @@ public class ManagedChannelImplTest {
// First RPC, will be pending // First RPC, will be pending
ClientCall<String, Integer> call = channel.newCall(method, CallOptions.DEFAULT); ClientCall<String, Integer> call = channel.newCall(method, CallOptions.DEFAULT);
verify(mockTransportFactory) verify(mockTransportFactory)
.newClientTransport(any(SocketAddress.class), any(ClientTransportOptions.class)); .newClientTransport(
any(SocketAddress.class), any(ClientTransportOptions.class), any(ChannelLogger.class));
call.start(mockCallListener, headers); call.start(mockCallListener, headers);
verify(mockTransport, never()) verify(mockTransport, never())
@ -623,7 +627,8 @@ public class ManagedChannelImplTest {
verifyNoMoreInteractions(balancerRpcExecutorPool); verifyNoMoreInteractions(balancerRpcExecutorPool);
verify(mockTransportFactory) verify(mockTransportFactory)
.newClientTransport(any(SocketAddress.class), any(ClientTransportOptions.class)); .newClientTransport(
any(SocketAddress.class), any(ClientTransportOptions.class), any(ChannelLogger.class));
verify(mockTransportFactory).close(); verify(mockTransportFactory).close();
verify(mockTransport, atLeast(0)).getLogId(); verify(mockTransport, atLeast(0)).getLogId();
verifyNoMoreInteractions(mockTransport); verifyNoMoreInteractions(mockTransport);
@ -649,7 +654,8 @@ public class ManagedChannelImplTest {
subchannel1.requestConnection(); subchannel1.requestConnection();
subchannel2.requestConnection(); subchannel2.requestConnection();
verify(mockTransportFactory, times(2)) verify(mockTransportFactory, times(2))
.newClientTransport(any(SocketAddress.class), any(ClientTransportOptions.class)); .newClientTransport(
any(SocketAddress.class), any(ClientTransportOptions.class), any(ChannelLogger.class));
MockClientTransportInfo transportInfo1 = transports.poll(); MockClientTransportInfo transportInfo1 = transports.poll();
MockClientTransportInfo transportInfo2 = transports.poll(); MockClientTransportInfo transportInfo2 = transports.poll();
@ -712,10 +718,12 @@ public class ManagedChannelImplTest {
// Make the transport available // Make the transport available
Subchannel subchannel = createSubchannelSafely(helper, addressGroup, Attributes.EMPTY); Subchannel subchannel = createSubchannelSafely(helper, addressGroup, Attributes.EMPTY);
verify(mockTransportFactory, never()) verify(mockTransportFactory, never())
.newClientTransport(any(SocketAddress.class), any(ClientTransportOptions.class)); .newClientTransport(
any(SocketAddress.class), any(ClientTransportOptions.class), any(ChannelLogger.class));
subchannel.requestConnection(); subchannel.requestConnection();
verify(mockTransportFactory) verify(mockTransportFactory)
.newClientTransport(any(SocketAddress.class), any(ClientTransportOptions.class)); .newClientTransport(
any(SocketAddress.class), any(ClientTransportOptions.class), any(ChannelLogger.class));
MockClientTransportInfo transportInfo = transports.poll(); MockClientTransportInfo transportInfo = transports.poll();
ConnectionClientTransport mockTransport = transportInfo.transport; ConnectionClientTransport mockTransport = transportInfo.transport;
ManagedClientTransport.Listener transportListener = transportInfo.listener; ManagedClientTransport.Listener transportListener = transportInfo.listener;
@ -1039,9 +1047,11 @@ public class ManagedChannelImplTest {
// The channel will starts with the first address (badAddress) // The channel will starts with the first address (badAddress)
verify(mockTransportFactory) verify(mockTransportFactory)
.newClientTransport(same(badAddress), any(ClientTransportOptions.class)); .newClientTransport(
same(badAddress), any(ClientTransportOptions.class), any(ChannelLogger.class));
verify(mockTransportFactory, times(0)) verify(mockTransportFactory, times(0))
.newClientTransport(same(goodAddress), any(ClientTransportOptions.class)); .newClientTransport(
same(goodAddress), any(ClientTransportOptions.class), any(ChannelLogger.class));
MockClientTransportInfo badTransportInfo = transports.poll(); MockClientTransportInfo badTransportInfo = transports.poll();
// Which failed to connect // Which failed to connect
@ -1050,7 +1060,8 @@ public class ManagedChannelImplTest {
// The channel then try the second address (goodAddress) // The channel then try the second address (goodAddress)
verify(mockTransportFactory) verify(mockTransportFactory)
.newClientTransport(same(goodAddress), any(ClientTransportOptions.class)); .newClientTransport(
same(goodAddress), any(ClientTransportOptions.class), any(ChannelLogger.class));
MockClientTransportInfo goodTransportInfo = transports.poll(); MockClientTransportInfo goodTransportInfo = transports.poll();
when(goodTransportInfo.transport.newStream( when(goodTransportInfo.transport.newStream(
any(MethodDescriptor.class), any(Metadata.class), any(CallOptions.class))) any(MethodDescriptor.class), any(Metadata.class), any(CallOptions.class)))
@ -1185,15 +1196,18 @@ public class ManagedChannelImplTest {
// Connecting to server1, which will fail // Connecting to server1, which will fail
verify(mockTransportFactory) verify(mockTransportFactory)
.newClientTransport(same(addr1), any(ClientTransportOptions.class)); .newClientTransport(
same(addr1), any(ClientTransportOptions.class), any(ChannelLogger.class));
verify(mockTransportFactory, times(0)) verify(mockTransportFactory, times(0))
.newClientTransport(same(addr2), any(ClientTransportOptions.class)); .newClientTransport(
same(addr2), any(ClientTransportOptions.class), any(ChannelLogger.class));
MockClientTransportInfo transportInfo1 = transports.poll(); MockClientTransportInfo transportInfo1 = transports.poll();
transportInfo1.listener.transportShutdown(Status.UNAVAILABLE); transportInfo1.listener.transportShutdown(Status.UNAVAILABLE);
// Connecting to server2, which will fail too // Connecting to server2, which will fail too
verify(mockTransportFactory) verify(mockTransportFactory)
.newClientTransport(same(addr2), any(ClientTransportOptions.class)); .newClientTransport(
same(addr2), any(ClientTransportOptions.class), any(ChannelLogger.class));
MockClientTransportInfo transportInfo2 = transports.poll(); MockClientTransportInfo transportInfo2 = transports.poll();
Status server2Error = Status.UNAVAILABLE.withDescription("Server2 failed to connect"); Status server2Error = Status.UNAVAILABLE.withDescription("Server2 failed to connect");
transportInfo2.listener.transportShutdown(server2Error); transportInfo2.listener.transportShutdown(server2Error);
@ -1241,22 +1255,26 @@ public class ManagedChannelImplTest {
// requestConnection() // requestConnection()
verify(mockTransportFactory, never()) verify(mockTransportFactory, never())
.newClientTransport(any(SocketAddress.class), any(ClientTransportOptions.class)); .newClientTransport(
any(SocketAddress.class), any(ClientTransportOptions.class), any(ChannelLogger.class));
sub1.requestConnection(); sub1.requestConnection();
verify(mockTransportFactory).newClientTransport(socketAddress, clientTransportOptions); verify(mockTransportFactory)
.newClientTransport(socketAddress, clientTransportOptions, sub1.getChannelLogger());
MockClientTransportInfo transportInfo1 = transports.poll(); MockClientTransportInfo transportInfo1 = transports.poll();
assertNotNull(transportInfo1); assertNotNull(transportInfo1);
sub2.requestConnection(); sub2.requestConnection();
verify(mockTransportFactory, times(2)) verify(mockTransportFactory, times(1))
.newClientTransport(socketAddress, clientTransportOptions); .newClientTransport(socketAddress, clientTransportOptions, sub2.getChannelLogger());
MockClientTransportInfo transportInfo2 = transports.poll(); MockClientTransportInfo transportInfo2 = transports.poll();
assertNotNull(transportInfo2); assertNotNull(transportInfo2);
sub1.requestConnection(); sub1.requestConnection();
sub2.requestConnection(); sub2.requestConnection();
// The subchannel doesn't matter since this isn't called
verify(mockTransportFactory, times(2)) verify(mockTransportFactory, times(2))
.newClientTransport(socketAddress, clientTransportOptions); .newClientTransport(
eq(socketAddress), eq(clientTransportOptions), isA(ChannelLogger.class));
// shutdown() has a delay // shutdown() has a delay
sub1.shutdown(); sub1.shutdown();
@ -1324,7 +1342,8 @@ public class ManagedChannelImplTest {
sub2.shutdown(); sub2.shutdown();
assertTrue(channel.isTerminated()); assertTrue(channel.isTerminated());
verify(mockTransportFactory, never()) verify(mockTransportFactory, never())
.newClientTransport(any(SocketAddress.class), any(ClientTransportOptions.class)); .newClientTransport(
any(SocketAddress.class), any(ClientTransportOptions.class), any(ChannelLogger.class));
} }
@Test @Test
@ -1339,7 +1358,8 @@ public class ManagedChannelImplTest {
// Therefore, channel is terminated without relying on LoadBalancer to shutdown subchannels. // Therefore, channel is terminated without relying on LoadBalancer to shutdown subchannels.
assertTrue(channel.isTerminated()); assertTrue(channel.isTerminated());
verify(mockTransportFactory, never()) verify(mockTransportFactory, never())
.newClientTransport(any(SocketAddress.class), any(ClientTransportOptions.class)); .newClientTransport(
any(SocketAddress.class), any(ClientTransportOptions.class), any(ChannelLogger.class));
} }
@Test @Test
@ -1359,8 +1379,9 @@ public class ManagedChannelImplTest {
call.start(mockCallListener, headers); call.start(mockCallListener, headers);
verify(mockTransportFactory) verify(mockTransportFactory)
.newClientTransport( .newClientTransport(
socketAddress, eq(socketAddress),
new ClientTransportOptions().setAuthority("oob1authority").setUserAgent(USER_AGENT)); eq(new ClientTransportOptions().setAuthority("oob1authority").setUserAgent(USER_AGENT)),
isA(ChannelLogger.class));
MockClientTransportInfo transportInfo = transports.poll(); MockClientTransportInfo transportInfo = transports.poll();
assertNotNull(transportInfo); assertNotNull(transportInfo);
@ -1381,8 +1402,9 @@ 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, eq(socketAddress),
new ClientTransportOptions().setAuthority("oob1authority").setUserAgent(USER_AGENT)); eq(new ClientTransportOptions().setAuthority("oob1authority").setUserAgent(USER_AGENT)),
isA(ChannelLogger.class));
transportInfo = transports.poll(); transportInfo = transports.poll();
assertNotNull(transportInfo); assertNotNull(transportInfo);
@ -1487,7 +1509,8 @@ public class ManagedChannelImplTest {
assertTrue(oob2.isTerminated()); assertTrue(oob2.isTerminated());
assertTrue(channel.isTerminated()); assertTrue(channel.isTerminated());
verify(mockTransportFactory, never()) verify(mockTransportFactory, never())
.newClientTransport(any(SocketAddress.class), any(ClientTransportOptions.class)); .newClientTransport(
any(SocketAddress.class), any(ClientTransportOptions.class), any(ChannelLogger.class));
} }
@Test @Test
@ -1502,7 +1525,8 @@ public class ManagedChannelImplTest {
// Channel's shutdownNow() will call shutdownNow() on all subchannels and oobchannels. // Channel's shutdownNow() will call shutdownNow() on all subchannels and oobchannels.
// Therefore, channel is terminated without relying on LoadBalancer to shutdown oobchannels. // Therefore, channel is terminated without relying on LoadBalancer to shutdown oobchannels.
verify(mockTransportFactory, never()) verify(mockTransportFactory, never())
.newClientTransport(any(SocketAddress.class), any(ClientTransportOptions.class)); .newClientTransport(
any(SocketAddress.class), any(ClientTransportOptions.class), any(ChannelLogger.class));
} }
@Test @Test
@ -1520,7 +1544,8 @@ public class ManagedChannelImplTest {
// Subchannel must be READY when creating the RPC. // Subchannel must be READY when creating the RPC.
subchannel.requestConnection(); subchannel.requestConnection();
verify(mockTransportFactory) verify(mockTransportFactory)
.newClientTransport(any(SocketAddress.class), any(ClientTransportOptions.class)); .newClientTransport(
any(SocketAddress.class), any(ClientTransportOptions.class), any(ChannelLogger.class));
MockClientTransportInfo transportInfo = transports.poll(); MockClientTransportInfo transportInfo = transports.poll();
ConnectionClientTransport mockTransport = transportInfo.transport; ConnectionClientTransport mockTransport = transportInfo.transport;
ManagedClientTransport.Listener transportListener = transportInfo.listener; ManagedClientTransport.Listener transportListener = transportInfo.listener;
@ -1544,7 +1569,8 @@ public class ManagedChannelImplTest {
subchannel.requestConnection(); subchannel.requestConnection();
verify(mockTransportFactory) verify(mockTransportFactory)
.newClientTransport(any(SocketAddress.class), any(ClientTransportOptions.class)); .newClientTransport(
any(SocketAddress.class), any(ClientTransportOptions.class), any(ChannelLogger.class));
MockClientTransportInfo transportInfo = transports.poll(); MockClientTransportInfo transportInfo = transports.poll();
ConnectionClientTransport mockTransport = transportInfo.transport; ConnectionClientTransport mockTransport = transportInfo.transport;
@ -1572,7 +1598,8 @@ public class ManagedChannelImplTest {
// Subchannel must be READY when creating the RPC. // Subchannel must be READY when creating the RPC.
subchannel.requestConnection(); subchannel.requestConnection();
verify(mockTransportFactory) verify(mockTransportFactory)
.newClientTransport(any(SocketAddress.class), any(ClientTransportOptions.class)); .newClientTransport(
any(SocketAddress.class), any(ClientTransportOptions.class), any(ChannelLogger.class));
MockClientTransportInfo transportInfo = transports.poll(); MockClientTransportInfo transportInfo = transports.poll();
ConnectionClientTransport mockTransport = transportInfo.transport; ConnectionClientTransport mockTransport = transportInfo.transport;
ManagedClientTransport.Listener transportListener = transportInfo.listener; ManagedClientTransport.Listener transportListener = transportInfo.listener;
@ -1741,7 +1768,8 @@ public class ManagedChannelImplTest {
Subchannel subchannel = createSubchannelSafely(helper, addressGroup, Attributes.EMPTY); Subchannel subchannel = createSubchannelSafely(helper, addressGroup, Attributes.EMPTY);
subchannel.requestConnection(); subchannel.requestConnection();
verify(mockTransportFactory) verify(mockTransportFactory)
.newClientTransport(same(socketAddress), eq(clientTransportOptions)); .newClientTransport(
same(socketAddress), eq(clientTransportOptions), any(ChannelLogger.class));
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);

View File

@ -22,6 +22,7 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import io.grpc.CallOptions; import io.grpc.CallOptions;
import io.grpc.ChannelLogger;
import io.grpc.InternalLogId; import io.grpc.InternalLogId;
import io.grpc.Metadata; import io.grpc.Metadata;
import io.grpc.MethodDescriptor; import io.grpc.MethodDescriptor;
@ -94,7 +95,8 @@ final class TestUtils {
}).when(mockTransportFactory) }).when(mockTransportFactory)
.newClientTransport( .newClientTransport(
any(SocketAddress.class), any(SocketAddress.class),
any(ClientTransportFactory.ClientTransportOptions.class)); any(ClientTransportFactory.ClientTransportOptions.class),
any(ChannelLogger.class));
return captor; return captor;
} }

View File

@ -23,6 +23,7 @@ import static io.grpc.internal.GrpcUtil.DEFAULT_MAX_MESSAGE_SIZE;
import com.google.common.annotations.VisibleForTesting; import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
import com.google.common.util.concurrent.MoreExecutors; import com.google.common.util.concurrent.MoreExecutors;
import io.grpc.ChannelLogger;
import io.grpc.ExperimentalApi; import io.grpc.ExperimentalApi;
import io.grpc.internal.AbstractManagedChannelImplBuilder; import io.grpc.internal.AbstractManagedChannelImplBuilder;
import io.grpc.internal.ClientTransportFactory; import io.grpc.internal.ClientTransportFactory;
@ -220,7 +221,7 @@ public final class CronetChannelBuilder extends
@Override @Override
public ConnectionClientTransport newClientTransport( public ConnectionClientTransport newClientTransport(
SocketAddress addr, ClientTransportOptions options) { SocketAddress addr, ClientTransportOptions options, ChannelLogger channelLogger) {
InetSocketAddress inetSocketAddr = (InetSocketAddress) addr; InetSocketAddress inetSocketAddr = (InetSocketAddress) addr;
return new CronetClientTransport(streamFactory, inetSocketAddr, options.getAuthority(), return new CronetClientTransport(streamFactory, inetSocketAddr, options.getAuthority(),
options.getUserAgent(), options.getEagAttributes(), executor, maxMessageSize, options.getUserAgent(), options.getEagAttributes(), executor, maxMessageSize,

View File

@ -23,6 +23,7 @@ import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import io.grpc.CallOptions; import io.grpc.CallOptions;
import io.grpc.ChannelLogger;
import io.grpc.Metadata; import io.grpc.Metadata;
import io.grpc.MethodDescriptor; import io.grpc.MethodDescriptor;
import io.grpc.cronet.CronetChannelBuilder.CronetTransportFactory; import io.grpc.cronet.CronetChannelBuilder.CronetTransportFactory;
@ -44,6 +45,7 @@ import org.robolectric.RobolectricTestRunner;
public final class CronetChannelBuilderTest { public final class CronetChannelBuilderTest {
@Mock private ExperimentalCronetEngine mockEngine; @Mock private ExperimentalCronetEngine mockEngine;
@Mock private ChannelLogger channelLogger;
private MethodDescriptor<?, ?> method = TestMethodDescriptors.voidMethod(); private MethodDescriptor<?, ?> method = TestMethodDescriptors.voidMethod();
@ -61,7 +63,9 @@ public final class CronetChannelBuilderTest {
CronetClientTransport transport = CronetClientTransport transport =
(CronetClientTransport) (CronetClientTransport)
transportFactory.newClientTransport( transportFactory.newClientTransport(
new InetSocketAddress("localhost", 443), new ClientTransportOptions()); new InetSocketAddress("localhost", 443),
new ClientTransportOptions(),
channelLogger);
CronetClientStream stream = transport.newStream(method, new Metadata(), CallOptions.DEFAULT); CronetClientStream stream = transport.newStream(method, new Metadata(), CallOptions.DEFAULT);
assertTrue(stream.idempotent); assertTrue(stream.idempotent);
@ -75,7 +79,9 @@ public final class CronetChannelBuilderTest {
CronetClientTransport transport = CronetClientTransport transport =
(CronetClientTransport) (CronetClientTransport)
transportFactory.newClientTransport( transportFactory.newClientTransport(
new InetSocketAddress("localhost", 443), new ClientTransportOptions()); new InetSocketAddress("localhost", 443),
new ClientTransportOptions(),
channelLogger);
CronetClientStream stream = transport.newStream(method, new Metadata(), CallOptions.DEFAULT); CronetClientStream stream = transport.newStream(method, new Metadata(), CallOptions.DEFAULT);
assertFalse(stream.idempotent); assertFalse(stream.idempotent);

View File

@ -26,6 +26,7 @@ import static io.grpc.internal.GrpcUtil.KEEPALIVE_TIME_NANOS_DISABLED;
import com.google.common.annotations.VisibleForTesting; import com.google.common.annotations.VisibleForTesting;
import com.google.errorprone.annotations.CanIgnoreReturnValue; import com.google.errorprone.annotations.CanIgnoreReturnValue;
import io.grpc.Attributes; import io.grpc.Attributes;
import io.grpc.ChannelLogger;
import io.grpc.EquivalentAddressGroup; import io.grpc.EquivalentAddressGroup;
import io.grpc.ExperimentalApi; import io.grpc.ExperimentalApi;
import io.grpc.HttpConnectProxiedSocketAddress; import io.grpc.HttpConnectProxiedSocketAddress;
@ -551,7 +552,7 @@ public final class NettyChannelBuilder
@Override @Override
public ConnectionClientTransport newClientTransport( public ConnectionClientTransport newClientTransport(
SocketAddress serverAddress, ClientTransportOptions options) { SocketAddress serverAddress, ClientTransportOptions options, ChannelLogger channelLogger) {
checkState(!closed, "The transport factory is closed."); checkState(!closed, "The transport factory is closed.");
ProtocolNegotiator localNegotiator = protocolNegotiator; ProtocolNegotiator localNegotiator = protocolNegotiator;
@ -573,6 +574,7 @@ public final class NettyChannelBuilder
} }
}; };
// TODO(carl-mastrangelo): Pass channelLogger in.
NettyClientTransport transport = new NettyClientTransport( NettyClientTransport transport = new NettyClientTransport(
serverAddress, channelFactory, channelOptions, group, serverAddress, channelFactory, channelOptions, group,
localNegotiator, flowControlWindow, localNegotiator, flowControlWindow,

View File

@ -91,11 +91,13 @@ public class NettyTransportTest extends AbstractTransportTest {
@Override @Override
protected ManagedClientTransport newClientTransport(InternalServer server) { protected ManagedClientTransport newClientTransport(InternalServer server) {
return clientFactory.newClientTransport( return clientFactory.newClientTransport(
server.getListenSocketAddress(), server.getListenSocketAddress(),
new ClientTransportFactory.ClientTransportOptions() new ClientTransportFactory.ClientTransportOptions()
.setAuthority(testAuthority(server)) .setAuthority(testAuthority(server))
.setEagAttributes(eagAttrs())); .setEagAttributes(eagAttrs()),
transportLogger());
} }
@org.junit.Ignore @org.junit.Ignore

View File

@ -23,6 +23,7 @@ import static io.grpc.internal.GrpcUtil.KEEPALIVE_TIME_NANOS_DISABLED;
import com.google.common.annotations.VisibleForTesting; import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
import io.grpc.ChannelLogger;
import io.grpc.ExperimentalApi; import io.grpc.ExperimentalApi;
import io.grpc.Internal; import io.grpc.Internal;
import io.grpc.internal.AbstractManagedChannelImplBuilder; import io.grpc.internal.AbstractManagedChannelImplBuilder;
@ -545,7 +546,7 @@ public class OkHttpChannelBuilder extends
@Override @Override
public ConnectionClientTransport newClientTransport( public ConnectionClientTransport newClientTransport(
SocketAddress addr, ClientTransportOptions options) { SocketAddress addr, ClientTransportOptions options, ChannelLogger channelLogger) {
if (closed) { if (closed) {
throw new IllegalStateException("The transport factory is closed."); throw new IllegalStateException("The transport factory is closed.");
} }
@ -557,6 +558,7 @@ public class OkHttpChannelBuilder extends
} }
}; };
InetSocketAddress inetSocketAddr = (InetSocketAddress) addr; InetSocketAddress inetSocketAddr = (InetSocketAddress) addr;
// TODO(carl-mastrangelo): Pass channelLogger in.
OkHttpClientTransport transport = new OkHttpClientTransport( OkHttpClientTransport transport = new OkHttpClientTransport(
inetSocketAddr, inetSocketAddr,
options.getAuthority(), options.getAuthority(),

View File

@ -23,6 +23,7 @@ import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame; import static org.junit.Assert.assertSame;
import com.squareup.okhttp.ConnectionSpec; import com.squareup.okhttp.ConnectionSpec;
import io.grpc.ChannelLogger;
import io.grpc.internal.ClientTransportFactory; import io.grpc.internal.ClientTransportFactory;
import io.grpc.internal.FakeClock; import io.grpc.internal.FakeClock;
import io.grpc.internal.GrpcUtil; import io.grpc.internal.GrpcUtil;
@ -115,8 +116,9 @@ public class OkHttpChannelBuilderTest {
@Test @Test
public void usePlaintext_newClientTransportAllowed() { public void usePlaintext_newClientTransportAllowed() {
OkHttpChannelBuilder builder = OkHttpChannelBuilder.forAddress("host", 1234).usePlaintext(); OkHttpChannelBuilder builder = OkHttpChannelBuilder.forAddress("host", 1234).usePlaintext();
builder.buildTransportFactory().newClientTransport(new InetSocketAddress(5678), builder.buildTransportFactory().newClientTransport(
new ClientTransportFactory.ClientTransportOptions()); new InetSocketAddress(5678),
new ClientTransportFactory.ClientTransportOptions(), new FakeChannelLogger());
} }
@Test @Test
@ -170,7 +172,9 @@ public class OkHttpChannelBuilderTest {
OkHttpClientTransport transport = OkHttpClientTransport transport =
(OkHttpClientTransport) (OkHttpClientTransport)
transportFactory.newClientTransport( transportFactory.newClientTransport(
new InetSocketAddress(5678), new ClientTransportFactory.ClientTransportOptions()); new InetSocketAddress(5678),
new ClientTransportFactory.ClientTransportOptions(),
new FakeChannelLogger());
assertSame(SocketFactory.getDefault(), transport.getSocketFactory()); assertSame(SocketFactory.getDefault(), transport.getSocketFactory());
@ -208,10 +212,25 @@ public class OkHttpChannelBuilderTest {
OkHttpClientTransport transport = OkHttpClientTransport transport =
(OkHttpClientTransport) (OkHttpClientTransport)
transportFactory.newClientTransport( transportFactory.newClientTransport(
new InetSocketAddress(5678), new ClientTransportFactory.ClientTransportOptions()); new InetSocketAddress(5678),
new ClientTransportFactory.ClientTransportOptions(),
new FakeChannelLogger());
assertSame(socketFactory, transport.getSocketFactory()); assertSame(socketFactory, transport.getSocketFactory());
transportFactory.close(); transportFactory.close();
} }
private static final class FakeChannelLogger extends ChannelLogger {
@Override
public void log(ChannelLogLevel level, String message) {
}
@Override
public void log(ChannelLogLevel level, String messageFormat, Object... args) {
}
}
} }

View File

@ -84,7 +84,8 @@ public class OkHttpTransportTest extends AbstractTransportTest {
new InetSocketAddress("localhost", port), new InetSocketAddress("localhost", port),
new ClientTransportFactory.ClientTransportOptions() new ClientTransportFactory.ClientTransportOptions()
.setAuthority(testAuthority(server)) .setAuthority(testAuthority(server))
.setEagAttributes(eagAttrs())); .setEagAttributes(eagAttrs()),
transportLogger());
} }
@Override @Override

View File

@ -16,6 +16,7 @@
package io.grpc.internal.testing; package io.grpc.internal.testing;
import io.grpc.ChannelLogger;
import io.grpc.internal.ClientTransportFactory; import io.grpc.internal.ClientTransportFactory;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import org.junit.Test; import org.junit.Test;
@ -41,6 +42,15 @@ public abstract class AbstractClientTransportFactoryTest {
transportFactory.close(); transportFactory.close();
transportFactory.newClientTransport( transportFactory.newClientTransport(
new InetSocketAddress("localhost", 12345), new InetSocketAddress("localhost", 12345),
new ClientTransportFactory.ClientTransportOptions()); new ClientTransportFactory.ClientTransportOptions(),
new ChannelLogger() {
@Override
public void log(ChannelLogLevel level, String message) {}
@Override
public void log(ChannelLogLevel level, String messageFormat, Object... args) {}
}
);
} }
} }