use of software.amazon.awssdk.crt.io.SocketOptions in project aws-greengrass-nucleus by aws-greengrass.
the class IPCEventStreamServiceTest method testClientConnection.
@Test
@SuppressWarnings("PMD.CloseResource")
void testClientConnection() throws Exception {
CountDownLatch connectionLatch = new CountDownLatch(1);
EventStreamRPCConnection connection = null;
try (EventLoopGroup elg = new EventLoopGroup(1);
ClientBootstrap clientBootstrap = new ClientBootstrap(elg, new HostResolver(elg));
SocketOptions socketOptions = TestUtils.getSocketOptionsForIPC()) {
String ipcServerSocketPath = Platform.getInstance().prepareIpcFilepathForComponent(mockRootPath);
final EventStreamRPCConnectionConfig config = new EventStreamRPCConnectionConfig(clientBootstrap, elg, socketOptions, null, ipcServerSocketPath, DEFAULT_PORT_NUMBER, GreengrassConnectMessageSupplier.connectMessageSupplier("authToken"));
connection = new EventStreamRPCConnection(config);
final boolean[] disconnected = { false };
final int[] disconnectedCode = { -1 };
// this is a bit cumbersome but does not prevent a convenience wrapper from exposing a sync
// connect() or a connect() that returns a CompletableFuture that errors
// this could be wrapped by utility methods to provide a more
connection.connect(new EventStreamRPCConnection.LifecycleHandler() {
@Override
public void onConnect() {
connectionLatch.countDown();
}
@Override
public void onDisconnect(int errorCode) {
disconnected[0] = true;
disconnectedCode[0] = errorCode;
}
// This on error is for any errors that is connection level, including problems during connect()
@Override
public boolean onError(Throwable t) {
// hints at handler to disconnect due to this error
return true;
}
});
assertTrue(connectionLatch.await(2, TimeUnit.SECONDS));
} finally {
if (connection != null) {
connection.close();
}
}
}
use of software.amazon.awssdk.crt.io.SocketOptions in project aws-crt-java by awslabs.
the class ServerListenerTest method testBindErrorPropagates.
@Test
public void testBindErrorPropagates() throws ExecutionException, InterruptedException, TimeoutException {
SocketOptions socketOptions = new SocketOptions();
socketOptions.connectTimeoutMs = 3000;
socketOptions.domain = SocketOptions.SocketDomain.IPv4;
socketOptions.type = SocketOptions.SocketType.STREAM;
EventLoopGroup elGroup = new EventLoopGroup(1);
ServerBootstrap bootstrap = new ServerBootstrap(elGroup);
ServerListener listener1 = new ServerListener("127.0.0.1", (short) 8039, socketOptions, null, bootstrap, new ServerListenerHandler() {
public ServerConnectionHandler onNewConnection(ServerConnection serverConnection, int errorCode) {
return null;
}
public void onConnectionShutdown(ServerConnection serverConnection, int errorCode) {
}
});
assertNotNull(listener1);
boolean exceptionThrown = false;
try {
ServerListener listener2 = new ServerListener("127.0.0.1", (short) 8039, socketOptions, null, bootstrap, new ServerListenerHandler() {
public ServerConnectionHandler onNewConnection(ServerConnection serverConnection, int errorCode) {
return null;
}
public void onConnectionShutdown(ServerConnection serverConnection, int errorCode) {
}
});
} catch (CrtRuntimeException ex) {
assertTrue(ex.getMessage().contains("AWS_IO_SOCKET_ADDRESS_IN_USE(1054), Socket address already in use."));
exceptionThrown = true;
}
assertTrue(exceptionThrown);
listener1.close();
listener1.getShutdownCompleteFuture().get(1, TimeUnit.SECONDS);
bootstrap.close();
elGroup.close();
elGroup.getShutdownCompleteFuture().get(1, TimeUnit.SECONDS);
socketOptions.close();
}
use of software.amazon.awssdk.crt.io.SocketOptions in project aws-crt-java by awslabs.
the class EventStreamClientConnectionTest method testContinuationMessageWithExtraHeadersHandling.
@Test
public void testContinuationMessageWithExtraHeadersHandling() throws ExecutionException, InterruptedException, IOException, TimeoutException {
SocketOptions socketOptions = new SocketOptions();
socketOptions.connectTimeoutMs = 3000;
socketOptions.domain = SocketOptions.SocketDomain.IPv4;
socketOptions.type = SocketOptions.SocketType.STREAM;
EventLoopGroup elGroup = new EventLoopGroup(1);
ServerBootstrap bootstrap = new ServerBootstrap(elGroup);
ClientBootstrap clientBootstrap = new ClientBootstrap(elGroup, null);
final boolean[] connectionShutdown = { false };
final String[] receivedOperationName = new String[] { null };
final String[] receivedContinuationPayload = new String[] { null };
final List<Header>[] receivedHeadersServer = new List[] { null };
Header serverStrHeader = Header.createHeader("serverStrHeaderName", "serverStrHeaderValue");
Header serverIntHeader = Header.createHeader("serverIntHeaderName", 25);
final byte[] responsePayload = "{ \"message\": \"this is a response message\" }".getBytes(StandardCharsets.UTF_8);
final ServerConnection[] serverConnections = { null };
Lock semaphoreLock = new ReentrantLock();
Condition semaphore = semaphoreLock.newCondition();
ServerListener listener = new ServerListener("127.0.0.1", (short) 8037, socketOptions, null, bootstrap, new ServerListenerHandler() {
private ServerConnectionHandler connectionHandler = null;
public ServerConnectionHandler onNewConnection(ServerConnection serverConnection, int errorCode) {
serverConnections[0] = serverConnection;
connectionHandler = new ServerConnectionHandler(serverConnection) {
@Override
protected void onProtocolMessage(List<Header> headers, byte[] payload, MessageType messageType, int messageFlags) {
int responseMessageFlag = MessageFlags.ConnectionAccepted.getByteValue();
MessageType acceptResponseType = MessageType.ConnectAck;
connection.sendProtocolMessage(null, null, acceptResponseType, responseMessageFlag);
}
@Override
protected ServerConnectionContinuationHandler onIncomingStream(ServerConnectionContinuation continuation, String operationName) {
receivedOperationName[0] = operationName;
return new ServerConnectionContinuationHandler(continuation) {
@Override
protected void onContinuationMessage(List<Header> headers, byte[] payload, MessageType messageType, int messageFlags) {
receivedContinuationPayload[0] = new String(payload, StandardCharsets.UTF_8);
receivedHeadersServer[0] = headers;
List<Header> responseHeaders = new ArrayList<>();
responseHeaders.add(serverStrHeader);
responseHeaders.add(serverIntHeader);
continuation.sendMessage(responseHeaders, responsePayload, MessageType.ApplicationError, MessageFlags.TerminateStream.getByteValue()).whenComplete((res, ex) -> {
connection.closeConnection(0);
this.close();
});
}
};
}
};
semaphoreLock.lock();
semaphore.signal();
semaphoreLock.unlock();
return connectionHandler;
}
public void onConnectionShutdown(ServerConnection serverConnection, int errorCode) {
connectionShutdown[0] = true;
}
});
final ClientConnection[] clientConnectionArray = { null };
final List<Header>[] clientReceivedMessageHeaders = new List[] { null };
final byte[][] clientReceivedPayload = { null };
final MessageType[] clientReceivedMessageType = { null };
final int[] clientReceivedMessageFlags = { -1 };
final boolean[] clientContinuationClosed = { false };
CompletableFuture<Void> connectFuture = ClientConnection.connect("127.0.0.1", (short) 8037, socketOptions, null, clientBootstrap, new ClientConnectionHandler() {
@Override
protected void onConnectionSetup(ClientConnection connection, int errorCode) {
clientConnectionArray[0] = connection;
}
@Override
protected void onProtocolMessage(List<Header> headers, byte[] payload, MessageType messageType, int messageFlags) {
semaphoreLock.lock();
semaphore.signal();
semaphoreLock.unlock();
}
});
final byte[] connectPayload = "test connect payload".getBytes(StandardCharsets.UTF_8);
connectFuture.get(1, TimeUnit.SECONDS);
assertNotNull(clientConnectionArray[0]);
semaphoreLock.lock();
semaphore.await(1, TimeUnit.SECONDS);
assertNotNull(serverConnections[0]);
clientConnectionArray[0].sendProtocolMessage(null, connectPayload, MessageType.Connect, 0);
semaphore.await(1, TimeUnit.SECONDS);
String operationName = "testOperation";
ClientConnectionContinuation continuation = clientConnectionArray[0].newStream(new ClientConnectionContinuationHandler() {
@Override
protected void onContinuationMessage(List<Header> headers, byte[] payload, MessageType messageType, int messageFlags) {
semaphoreLock.lock();
clientReceivedMessageHeaders[0] = headers;
clientReceivedMessageType[0] = messageType;
clientReceivedMessageFlags[0] = messageFlags;
clientReceivedPayload[0] = payload;
semaphoreLock.unlock();
}
@Override
protected void onContinuationClosed() {
semaphoreLock.lock();
clientContinuationClosed[0] = true;
semaphore.signal();
semaphoreLock.unlock();
super.onContinuationClosed();
}
});
assertNotNull(continuation);
final byte[] operationPayload = "{\"message\": \"message payload\"}".getBytes(StandardCharsets.UTF_8);
Header clientStrHeader = Header.createHeader("clientStrHeaderName", "clientStrHeaderValue");
Header clientIntHeader = Header.createHeader("clientIntHeaderName", 35);
List<Header> clientHeaders = new ArrayList<>();
clientHeaders.add(clientStrHeader);
clientHeaders.add(clientIntHeader);
continuation.activate(operationName, clientHeaders, operationPayload, MessageType.ApplicationMessage, 0).get(1, TimeUnit.SECONDS);
semaphore.await(1, TimeUnit.SECONDS);
assertArrayEquals(responsePayload, clientReceivedPayload[0]);
assertEquals(MessageType.ApplicationError, clientReceivedMessageType[0]);
assertEquals(MessageFlags.TerminateStream.getByteValue(), clientReceivedMessageFlags[0]);
assertNotNull(receivedHeadersServer[0]);
assertEquals(clientStrHeader.getName(), receivedHeadersServer[0].get(0).getName());
assertEquals(clientStrHeader.getValueAsString(), receivedHeadersServer[0].get(0).getValueAsString());
assertEquals(clientIntHeader.getName(), receivedHeadersServer[0].get(1).getName());
assertEquals(clientIntHeader.getValueAsInt(), receivedHeadersServer[0].get(1).getValueAsInt());
assertEquals(serverStrHeader.getName(), clientReceivedMessageHeaders[0].get(0).getName());
assertEquals(serverStrHeader.getValueAsString(), clientReceivedMessageHeaders[0].get(0).getValueAsString());
assertEquals(serverIntHeader.getName(), clientReceivedMessageHeaders[0].get(1).getName());
assertEquals(serverIntHeader.getValueAsInt(), clientReceivedMessageHeaders[0].get(1).getValueAsInt());
assertTrue(clientContinuationClosed[0]);
clientConnectionArray[0].getClosedFuture().get(1, TimeUnit.SECONDS);
serverConnections[0].getClosedFuture().get(1, TimeUnit.SECONDS);
semaphoreLock.unlock();
assertTrue(connectionShutdown[0]);
assertNotNull(receivedOperationName[0]);
assertEquals(operationName, receivedOperationName[0]);
assertEquals(new String(operationPayload, StandardCharsets.UTF_8), receivedContinuationPayload[0]);
listener.close();
listener.getShutdownCompleteFuture().get(1, TimeUnit.SECONDS);
bootstrap.close();
clientBootstrap.close();
clientBootstrap.getShutdownCompleteFuture().get(1, TimeUnit.SECONDS);
elGroup.close();
elGroup.getShutdownCompleteFuture().get(1, TimeUnit.SECONDS);
socketOptions.close();
}
use of software.amazon.awssdk.crt.io.SocketOptions in project aws-crt-java by awslabs.
the class HttpClientConnectionManagerTest method createConnectionManager.
private HttpClientConnectionManager createConnectionManager(URI uri, int numThreads, int numConnections) {
try (EventLoopGroup eventLoopGroup = new EventLoopGroup(1);
HostResolver resolver = new HostResolver(eventLoopGroup);
ClientBootstrap bootstrap = new ClientBootstrap(eventLoopGroup, resolver);
SocketOptions sockOpts = new SocketOptions();
TlsContext tlsContext = createHttpClientTlsContext()) {
HttpClientConnectionManagerOptions options = new HttpClientConnectionManagerOptions();
options.withClientBootstrap(bootstrap).withSocketOptions(sockOpts).withTlsContext(tlsContext).withUri(uri).withMaxConnections(numConnections);
return HttpClientConnectionManager.create(options);
}
}
use of software.amazon.awssdk.crt.io.SocketOptions in project aws-crt-java by awslabs.
the class MqttClientConnection method connect.
/**
* Connect to the service endpoint and start a session
*
* @return Future result is true if resuming a session, false if clean session
* @throws MqttException If the port is out of range
*/
public CompletableFuture<Boolean> connect() throws MqttException {
TlsContext tls = config.getMqttClient().getTlsContext();
// Just clamp the pingTimeout, no point in throwing
short pingTimeout = (short) Math.max(0, Math.min(config.getPingTimeoutMs(), Short.MAX_VALUE));
short port = (short) config.getPort();
if (port > Short.MAX_VALUE || port <= 0) {
throw new MqttException("Port must be betweeen 0 and " + Short.MAX_VALUE);
}
CompletableFuture<Boolean> future = new CompletableFuture<>();
connectAck = AsyncCallback.wrapFuture(future, null);
SocketOptions socketOptions = config.getSocketOptions();
try {
mqttClientConnectionConnect(getNativeHandle(), config.getEndpoint(), port, socketOptions != null ? socketOptions.getNativeHandle() : 0, tls != null ? tls.getNativeHandle() : 0, config.getClientId(), config.getCleanSession(), config.getKeepAliveSecs(), pingTimeout, config.getProtocolOperationTimeoutMs());
} catch (CrtRuntimeException ex) {
future.completeExceptionally(ex);
}
return future;
}
Aggregations