Skip to content

Commit 5a75f8f

Browse files
committed
TCP Client issue fix
1 parent 1951c23 commit 5a75f8f

File tree

5 files changed

+54
-2
lines changed

5 files changed

+54
-2
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,7 @@ We have 2 different types of tests:
325325
export AWS_ACCESS_KEY_ID=YOUR_ACCESS_KEY_ID
326326
export AWS_SECRET_ACCESS_KEY=YOUR_ACCESS_KEY
327327
export AWS_REGION=us-west-2
328+
export AWS_SESSION_TOKEN=Your_AWS_SESSION_TOKEN
328329
./gradlew integ
329330
```
330331

bin/start-agent.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
# usage:
77
# export AWS_ACCESS_KEY_ID=
88
# export AWS_SECRET_ACCESS_KEY=
9+
# export AWS_SESSION_TOKEN=
910
# export AWS_REGION=us-west-2
1011
# ./start-agent.sh
1112

@@ -22,6 +23,7 @@ pushd $rootdir/src/integration-test/resources/agent
2223
echo "[AmazonCloudWatchAgent]
2324
aws_access_key_id = $AWS_ACCESS_KEY_ID
2425
aws_secret_access_key = $AWS_SECRET_ACCESS_KEY
26+
aws_session_token = $AWS_SESSION_TOKEN
2527
" > ./.aws/credentials
2628

2729
echo "[profile AmazonCloudWatchAgent]
@@ -33,5 +35,6 @@ docker run -p 25888:25888/udp -p 25888:25888/tcp \
3335
-e AWS_REGION=$AWS_REGION \
3436
-e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID \
3537
-e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY \
38+
-e AWS_SESSION_TOKEN=$AWS_SESSION_TOKEN \
3639
agent:latest &> $tempfile &
3740
popd

build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ dependencies {
6464
implementation 'com.fasterxml.jackson.core:jackson-annotations:2.11.1'
6565
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.11.1'
6666
implementation 'org.slf4j:slf4j-api:1.7.30'
67+
implementation 'org.slf4j:slf4j-simple:1.7.30'
6768

6869
// Use JUnit test framework
6970
testImplementation 'software.amazon.awssdk:cloudwatch:2.13.54'

src/main/java/software/amazon/cloudwatchlogs/emf/sinks/TCPClient.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,13 @@ public class TCPClient implements SocketClient {
3131
private boolean shouldConnect = true;
3232

3333
public TCPClient(Endpoint endpoint) {
34-
socket = createSocket();
3534
this.endpoint = endpoint;
3635
}
3736

3837
private void connect() {
3938
try {
39+
// Avoid "socket already connected" error (https://issues.amazon.com/issues/P54323886)
40+
socket = createSocket();
4041
socket.connect(new InetSocketAddress(endpoint.getHost(), endpoint.getPort()));
4142
shouldConnect = false;
4243
} catch (Exception e) {
@@ -51,7 +52,7 @@ protected Socket createSocket() {
5152

5253
@Override
5354
public synchronized void sendMessage(String message) {
54-
if (socket.isClosed() || shouldConnect) {
55+
if (socket == null || socket.isClosed() || shouldConnect) {
5556
connect();
5657
}
5758

src/test/java/software/amazon/cloudwatchlogs/emf/sinks/TCPClientTest.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,50 @@ protected Socket createSocket() {
4848

4949
assertEquals(bos.toString(), message);
5050
}
51+
52+
@Test
53+
public void testSendMessageWithGetOSException_THEN_createSocketTwice() throws IOException {
54+
Socket socket = mock(Socket.class);
55+
doNothing().when(socket).connect(any());
56+
when(socket.getOutputStream()).thenThrow(IOException.class);
57+
58+
Endpoint endpoint = Endpoint.DEFAULT_TCP_ENDPOINT;
59+
TCPClient client =
60+
new TCPClient(endpoint) {
61+
@Override
62+
protected Socket createSocket() {
63+
return socket;
64+
}
65+
};
66+
67+
TCPClient spyClient = spy(client);
68+
69+
String message = "Test message";
70+
spyClient.sendMessage(message);
71+
verify(spyClient, atLeast(2)).createSocket();
72+
}
73+
74+
@Test
75+
public void testSendMessageWithWriteOSException_THEN_createSocketTwice() throws IOException {
76+
Socket socket = mock(Socket.class);
77+
doNothing().when(socket).connect(any());
78+
ByteArrayOutputStream bos = mock(ByteArrayOutputStream.class);
79+
when(socket.getOutputStream()).thenReturn(bos);
80+
doThrow(IOException.class).when(bos).write(any());
81+
82+
Endpoint endpoint = Endpoint.DEFAULT_TCP_ENDPOINT;
83+
TCPClient client =
84+
new TCPClient(endpoint) {
85+
@Override
86+
protected Socket createSocket() {
87+
return socket;
88+
}
89+
};
90+
91+
TCPClient spyClient = spy(client);
92+
93+
String message = "Test message";
94+
spyClient.sendMessage(message);
95+
verify(spyClient, atLeast(2)).createSocket();
96+
}
5197
}

0 commit comments

Comments
 (0)