use of com.datastax.oss.protocol.internal.Frame in project java-driver by datastax.
the class ChannelFactoryProtocolNegotiationTest method should_negotiate_if_version_not_specified_and_server_supports_legacy.
@Test
@UseDataProvider("unsupportedProtocolCodes")
public void should_negotiate_if_version_not_specified_and_server_supports_legacy(int errorCode) {
// Given
when(defaultProfile.isDefined(DefaultDriverOption.PROTOCOL_VERSION)).thenReturn(false);
when(protocolVersionRegistry.highestNonBeta()).thenReturn(DefaultProtocolVersion.V4);
when(protocolVersionRegistry.downgrade(DefaultProtocolVersion.V4)).thenReturn(Optional.of(DefaultProtocolVersion.V3));
ChannelFactory factory = newChannelFactory();
// When
CompletionStage<DriverChannel> channelFuture = factory.connect(SERVER_ADDRESS, DriverChannelOptions.DEFAULT, NoopNodeMetricUpdater.INSTANCE);
Frame requestFrame = readOutboundFrame();
assertThat(requestFrame.message).isInstanceOf(Options.class);
writeInboundFrame(requestFrame, TestResponses.supportedResponse("mock_key", "mock_value"));
requestFrame = readOutboundFrame();
assertThat(requestFrame.protocolVersion).isEqualTo(DefaultProtocolVersion.V4.getCode());
// Server does not support v4
writeInboundFrame(requestFrame, new Error(errorCode, "Invalid or unsupported protocol version"));
// Then
// Factory should initialize a new connection, that retries with the lower version
requestFrame = readOutboundFrame();
assertThat(requestFrame.message).isInstanceOf(Options.class);
writeInboundFrame(requestFrame, TestResponses.supportedResponse("mock_key", "mock_value"));
requestFrame = readOutboundFrame();
assertThat(requestFrame.protocolVersion).isEqualTo(DefaultProtocolVersion.V3.getCode());
writeInboundFrame(requestFrame, new Ready());
requestFrame = readOutboundFrame();
writeInboundFrame(requestFrame, TestResponses.clusterNameResponse("mockClusterName"));
assertThatStage(channelFuture).isSuccess(channel -> assertThat(channel.getClusterName()).isEqualTo("mockClusterName"));
assertThat(factory.protocolVersion).isEqualTo(DefaultProtocolVersion.V3);
}
use of com.datastax.oss.protocol.internal.Frame in project java-driver by datastax.
the class ProtocolInitHandlerTest method should_check_cluster_name_if_provided.
@Test
public void should_check_cluster_name_if_provided() {
channel.pipeline().addLast(ChannelFactory.INIT_HANDLER_NAME, new ProtocolInitHandler(internalDriverContext, DefaultProtocolVersion.V4, "expectedClusterName", END_POINT, DriverChannelOptions.DEFAULT, heartbeatHandler, false));
ChannelFuture connectFuture = channel.connect(new InetSocketAddress("localhost", 9042));
Frame requestFrame = readOutboundFrame();
writeInboundFrame(requestFrame, new Ready());
requestFrame = readOutboundFrame();
assertThat(requestFrame.message).isInstanceOf(Query.class);
Query query = (Query) requestFrame.message;
assertThat(query.query).isEqualTo("SELECT cluster_name FROM system.local");
assertThat(connectFuture).isNotDone();
writeInboundFrame(requestFrame, TestResponses.clusterNameResponse("expectedClusterName"));
assertThat(connectFuture).isSuccess();
}
use of com.datastax.oss.protocol.internal.Frame in project java-driver by datastax.
the class ProtocolInitHandlerTest method should_initialize.
@Test
public void should_initialize() {
channel.pipeline().addLast(ChannelFactory.INIT_HANDLER_NAME, new ProtocolInitHandler(internalDriverContext, DefaultProtocolVersion.V4, null, END_POINT, DriverChannelOptions.DEFAULT, heartbeatHandler, false));
ChannelFuture connectFuture = channel.connect(new InetSocketAddress("localhost", 9042));
// It should send a STARTUP message
Frame requestFrame = readOutboundFrame();
assertThat(requestFrame.message).isInstanceOf(Startup.class);
assertThat(connectFuture).isNotDone();
// Simulate a READY response
writeInboundFrame(buildInboundFrame(requestFrame, new Ready()));
// Simulate the cluster name check
requestFrame = readOutboundFrame();
assertThat(requestFrame.message).isInstanceOf(Query.class);
writeInboundFrame(requestFrame, TestResponses.clusterNameResponse("someClusterName"));
// Init should complete
assertThat(connectFuture).isSuccess();
}
use of com.datastax.oss.protocol.internal.Frame in project java-driver by datastax.
the class ProtocolInitHandlerTest method should_initialize_with_authentication.
@Test
public void should_initialize_with_authentication() {
channel.pipeline().addLast(ChannelFactory.INIT_HANDLER_NAME, new ProtocolInitHandler(internalDriverContext, DefaultProtocolVersion.V4, null, END_POINT, DriverChannelOptions.DEFAULT, heartbeatHandler, false));
String serverAuthenticator = "mockServerAuthenticator";
AuthProvider authProvider = mock(AuthProvider.class);
MockAuthenticator authenticator = new MockAuthenticator();
when(authProvider.newAuthenticator(END_POINT, serverAuthenticator)).thenReturn(authenticator);
when(internalDriverContext.getAuthProvider()).thenReturn(Optional.of(authProvider));
ChannelFuture connectFuture = channel.connect(new InetSocketAddress("localhost", 9042));
Frame requestFrame = readOutboundFrame();
assertThat(requestFrame.message).isInstanceOf(Startup.class);
assertThat(connectFuture).isNotDone();
// Simulate a response that says that the server requires authentication
writeInboundFrame(requestFrame, new Authenticate(serverAuthenticator));
// The connection should have created an authenticator from the auth provider
verify(authProvider).newAuthenticator(END_POINT, serverAuthenticator);
// And sent an auth response
requestFrame = readOutboundFrame();
assertThat(requestFrame.message).isInstanceOf(AuthResponse.class);
AuthResponse authResponse = (AuthResponse) requestFrame.message;
assertThat(Bytes.toHexString(authResponse.token)).isEqualTo(MockAuthenticator.INITIAL_RESPONSE);
assertThat(connectFuture).isNotDone();
// As long as the server sends an auth challenge, the client should reply with another
// auth_response
String mockToken = "0xabcd";
for (int i = 0; i < 5; i++) {
writeInboundFrame(requestFrame, new AuthChallenge(Bytes.fromHexString(mockToken)));
requestFrame = readOutboundFrame();
assertThat(requestFrame.message).isInstanceOf(AuthResponse.class);
authResponse = (AuthResponse) requestFrame.message;
// Our mock impl happens to send back the same token
assertThat(Bytes.toHexString(authResponse.token)).isEqualTo(mockToken);
assertThat(connectFuture).isNotDone();
}
// When the server finally sends back a success message, should proceed to the cluster name
// check and succeed
writeInboundFrame(requestFrame, new AuthSuccess(Bytes.fromHexString(mockToken)));
assertThat(authenticator.successToken).isEqualTo(mockToken);
requestFrame = readOutboundFrame();
writeInboundFrame(requestFrame, TestResponses.clusterNameResponse("someClusterName"));
assertThat(connectFuture).isSuccess();
}
use of com.datastax.oss.protocol.internal.Frame in project java-driver by datastax.
the class ProtocolInitHandlerTest method should_invoke_auth_provider_when_server_does_not_send_challenge.
@Test
public void should_invoke_auth_provider_when_server_does_not_send_challenge() {
channel.pipeline().addLast(ChannelFactory.INIT_HANDLER_NAME, new ProtocolInitHandler(internalDriverContext, DefaultProtocolVersion.V4, null, END_POINT, DriverChannelOptions.DEFAULT, heartbeatHandler, false));
AuthProvider authProvider = mock(AuthProvider.class);
when(internalDriverContext.getAuthProvider()).thenReturn(Optional.of(authProvider));
ChannelFuture connectFuture = channel.connect(new InetSocketAddress("localhost", 9042));
Frame requestFrame = readOutboundFrame();
assertThat(requestFrame.message).isInstanceOf(Startup.class);
// Simulate a READY response, the provider should be notified
writeInboundFrame(buildInboundFrame(requestFrame, new Ready()));
verify(authProvider).onMissingChallenge(END_POINT);
// Since our mock does nothing, init should proceed normally
requestFrame = readOutboundFrame();
assertThat(requestFrame.message).isInstanceOf(Query.class);
writeInboundFrame(requestFrame, TestResponses.clusterNameResponse("someClusterName"));
assertThat(connectFuture).isSuccess();
}
Aggregations