Skip to content

Commit ca1c156

Browse files
authored
Merge pull request #112 from rico-projects/integration_test_fix
Integration test fix
2 parents 4ca846c + 782088b commit ca1c156

12 files changed

Lines changed: 182 additions & 144 deletions

File tree

base/rico-client/src/main/java/dev/rico/internal/client/http/HttpCallResponseBuilderImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ public Promise<HttpResponse<DownloadInputStream>, HttpException> streamDownload(
9595

9696
@Override
9797
public Promise<HttpResponse<ByteArrayProvider>, HttpException> readBytes() {
98-
final ResponseContentConverter<ByteArrayProvider> converter = b -> new SimpleByteArrayProvider(b);
98+
final ResponseContentConverter<ByteArrayProvider> converter = SimpleByteArrayProvider::new;
9999
return createExecutor(converter);
100100
}
101101

@@ -145,7 +145,7 @@ private <R> Promise<HttpResponse<R>, HttpException> createExecutor(final Respons
145145
}
146146

147147
private Promise<HttpResponse<InputStream>, HttpException> createExecutor() {
148-
return new HttpCallExecutorImpl<>(configuration, () -> handleRequest());
148+
return new HttpCallExecutorImpl<>(configuration, this::handleRequest);
149149
}
150150

151151
private <R> HttpResponse<R> handleRequest(final ResponseContentConverter<R> converter) throws HttpException {

base/rico-client/src/main/java/dev/rico/internal/client/http/cookie/HttpClientCookieHandler.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ public void updateCookiesFromResponse(final HttpURLConnection connection) throws
7676

7777
public void setRequestCookies(final HttpURLConnection connection) throws URISyntaxException {
7878
Assert.requireNonNull(connection, "connection");
79-
LOG.debug("adding cookies from cookie store to request");
79+
LOG.debug("Adding cookies from cookie store to request");
8080
if (cookieStore.getCookies().size() > 0) {
8181
final String cookieValue = cookieStore.get(connection.getURL().toURI()).stream().
8282
map(cookie -> {
@@ -88,7 +88,9 @@ public void setRequestCookies(final HttpURLConnection connection) throws URISynt
8888
if (!cookieValue.isEmpty()) {
8989
LOG.debug("Adding '{}' header to request. Content: {}", SET_COOKIE_HEADER, cookieValue);
9090
connection.setRequestProperty(COOKIE_HEADER, cookieValue);
91+
return;
9192
}
9293
}
94+
LOG.debug("No cookies to add");
9395
}
9496
}

integration-tests/integration-tests/src/test/java/dev/rico/integrationtests/AbstractIntegrationTest.java

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,17 @@
1616
*/
1717
package dev.rico.integrationtests;
1818

19-
import dev.rico.client.Client;
20-
import dev.rico.client.concurrent.BackgroundExecutor;
2119
import dev.rico.docker.DockerCompose;
2220
import dev.rico.docker.Wait;
2321
import dev.rico.internal.core.Assert;
22+
import dev.rico.internal.core.SimpleThreadFactory;
2423
import org.slf4j.Logger;
2524
import org.slf4j.LoggerFactory;
25+
import org.testng.ITest;
26+
import org.testng.ITestContext;
2627
import org.testng.annotations.AfterGroups;
28+
import org.testng.annotations.AfterMethod;
29+
import org.testng.annotations.BeforeClass;
2730
import org.testng.annotations.BeforeGroups;
2831
import org.testng.annotations.BeforeMethod;
2932
import org.testng.annotations.DataProvider;
@@ -35,18 +38,22 @@
3538
import java.nio.file.Paths;
3639
import java.util.Arrays;
3740
import java.util.List;
41+
import java.util.concurrent.Executor;
42+
import java.util.concurrent.Executors;
3843
import java.util.concurrent.TimeUnit;
3944
import java.util.stream.Collectors;
4045

4146
import static dev.rico.integrationtests.AbstractIntegrationTest.INTEGRATION_TESTS_TEST_GROUP;
4247
import static dev.rico.internal.core.http.HttpStatus.HTTP_OK;
4348

4449
@Test(groups = INTEGRATION_TESTS_TEST_GROUP)
45-
public class AbstractIntegrationTest {
50+
public class AbstractIntegrationTest implements ITest {
4651

4752
private static final Logger LOG = LoggerFactory.getLogger(AbstractIntegrationTest.class);
4853

49-
private final int timeoutInMinutes = 3;
54+
private static final ThreadLocal<String> testName = new ThreadLocal<>();
55+
56+
private final int timeoutInMinutes = 1;
5057

5158
public static final String ENDPOINTS_DATAPROVIDER = "endpoints";
5259

@@ -61,7 +68,7 @@ public AbstractIntegrationTest() {
6168
try {
6269
final URL dockerComposeURL = AbstractIntegrationTest.class.getClassLoader().getResource("docker-compose.yml");
6370
final Path dockerComposeFile = Paths.get(dockerComposeURL.toURI());
64-
final BackgroundExecutor backgroundExecutor = Client.getService(BackgroundExecutor.class);
71+
final Executor backgroundExecutor = Executors.newCachedThreadPool(new SimpleThreadFactory());
6572
dockerCompose = new DockerCompose(backgroundExecutor, dockerComposeFile);
6673
} catch (Exception e) {
6774
throw new RuntimeException("Can not create Docker environment!", e);
@@ -83,10 +90,23 @@ protected void stopDockerContainers() {
8390
}
8491

8592
@BeforeMethod
86-
public void onTest(final Method method, final Object[] data) {
93+
public void beforeMethod(final Method method, final Object[] data) {
8794
Assert.requireNonNull(method, "method");
8895
Assert.requireNonNull(data, "data");
89-
LOG.info("Starting test " + method.getDeclaringClass().getSimpleName() +"." + method.getName() + " for " + data[0]);
96+
final String name = method.getDeclaringClass().getSimpleName() + "." + method.getName() + "_" + data[0];
97+
LOG.info("Starting test " + name);
98+
testName.set(name);
99+
}
100+
101+
@AfterMethod
102+
public void afterMethod(){
103+
final String name = testName.get();
104+
LOG.info("DONE test " + name);
105+
}
106+
107+
@Override
108+
public String getTestName() {
109+
return testName.get();
90110
}
91111

92112
@DataProvider(name = ENDPOINTS_DATAPROVIDER, parallel = false)
@@ -97,6 +117,11 @@ public Object[][] getEndpoints() {
97117
.toArray(new String[][]{});
98118
}
99119

120+
@BeforeClass
121+
public void setDataProviderThreadCount(ITestContext context) {
122+
context.getCurrentXmlTest().getSuite().setDataProviderThreadCount(1);
123+
}
124+
100125
public int getTimeoutInMinutes() {
101126
return timeoutInMinutes;
102127
}

integration-tests/integration-tests/src/test/java/dev/rico/integrationtests/remoting/AbstractRemotingIntegrationTest.java

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,68 @@
11
package dev.rico.integrationtests.remoting;
22

33
import dev.rico.client.Client;
4+
import dev.rico.integrationtests.AbstractIntegrationTest;
5+
import dev.rico.integrationtests.IntegrationTestToolkit;
46
import dev.rico.remoting.client.ClientContext;
57
import dev.rico.remoting.client.ClientContextFactory;
68
import dev.rico.remoting.client.ControllerProxy;
79
import dev.rico.remoting.client.Param;
8-
import dev.rico.integrationtests.AbstractIntegrationTest;
9-
import dev.rico.integrationtests.IntegrationTestToolkit;
10+
import org.slf4j.Logger;
11+
import org.slf4j.LoggerFactory;
12+
import org.testng.Assert;
13+
import org.testng.annotations.AfterMethod;
1014

1115
import java.io.Serializable;
16+
import java.net.HttpCookie;
1217
import java.net.URI;
1318
import java.time.Duration;
1419
import java.util.Collections;
20+
import java.util.List;
1521
import java.util.Map;
1622
import java.util.concurrent.TimeUnit;
1723

1824
public class AbstractRemotingIntegrationTest extends AbstractIntegrationTest {
1925

26+
private static final Logger LOG = LoggerFactory.getLogger(AbstractRemotingIntegrationTest.class);
27+
2028
protected <T> ControllerProxy<T> createController(final ClientContext clientContext, final String controllerName) {
2129
return createController(clientContext, controllerName, Collections.emptyMap());
2230
}
2331

2432
@SuppressWarnings("unchecked")
2533
protected <T> ControllerProxy<T> createController(final ClientContext clientContext, final String controllerName, final Map<String, Serializable> parameters) {
2634
try {
35+
LOG.trace("Cookies before create controller: " + Client.getClientConfiguration().getCookieStore().getCookies());
2736
return (ControllerProxy<T>) clientContext.createController(controllerName, parameters).get(getTimeoutInMinutes(), TimeUnit.MINUTES);
2837
} catch (Exception e) {
38+
LOG.trace("Cookies when failed to create controller: " + Client.getClientConfiguration().getCookieStore().getCookies());
2939
throw new RuntimeException("Can not create controller " + controllerName, e);
3040
}
3141
}
3242

43+
@AfterMethod
44+
public void tearDown() {
45+
final List<HttpCookie> cookies = Client.getClientConfiguration().getCookieStore().getCookies();
46+
if (cookies.size() != 1) {
47+
Assert.fail("Found unexpected number of cookies in store: " + cookies);
48+
}
49+
Client.getClientConfiguration().getCookieStore().removeAll();
50+
}
51+
3352
protected ClientContext connect(final String endpoint) {
3453
Client.init(new IntegrationTestToolkit());
35-
Client.getClientConfiguration().getCookieStore().removeAll();
54+
final List<HttpCookie> cookies = Client.getClientConfiguration().getCookieStore().getCookies();
55+
if (!cookies.isEmpty()) {
56+
Assert.fail("Cookie store should have been empty, but found: " + cookies);
57+
}
3658
try {
3759
final ClientContext clientContext = Client.getService(ClientContextFactory.class).create(Client.getClientConfiguration(), new URI(endpoint + "/remoting"));
3860
final long timeOutTime = System.currentTimeMillis() + Duration.ofMinutes(getTimeoutInMinutes()).toMillis();
3961
while (System.currentTimeMillis() < timeOutTime && clientContext.getClientId() == null) {
4062
try {
4163
clientContext.connect().get(getTimeoutInMinutes(), TimeUnit.MINUTES);
4264
} catch (Exception ex) {
65+
LOG.error("Failed to connect", ex);
4366
// do nothing since server is not up at the moment...
4467
}
4568
}
@@ -81,7 +104,7 @@ protected void disconnect(final ClientContext clientContext, final String endpoi
81104
try {
82105
clientContext.disconnect().get(getTimeoutInMinutes(), TimeUnit.MINUTES);
83106
} catch (Exception e) {
84-
//do nothing
107+
throw new RuntimeException("Can not disconnect from endpoint " + endpoint, e);
85108
}
86109
}
87110
}

integration-tests/integration-tests/src/test/java/dev/rico/integrationtests/remoting/ClientIdTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ public class ClientIdTest extends AbstractRemotingIntegrationTest {
2626
public void testThatClientIdIsNotNull(String containerType, String endpoint) {
2727
ClientContext context = connect(endpoint);
2828
Assert.assertNotNull(context.getClientId());
29+
disconnect(context, endpoint);
2930
}
3031

3132
}

integration-tests/integration-tests/src/test/java/dev/rico/integrationtests/remoting/value/AllValueTypesTestControllerTest.java

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
public class AllValueTypesTestControllerTest extends AbstractRemotingIntegrationTest {
3535

3636
@Test(dataProvider = ENDPOINTS_DATAPROVIDER)
37-
public void testCreationWithAllParameters(final String containerType, final String endpoint) throws ExecutionException, InterruptedException {
37+
public void testCreationWithAllParameters(final String containerType, final String endpoint) {
3838
//given:
3939
final Map<String, Serializable> parameters = new HashMap<>();
4040
parameters.put(ValueTestConstants.BIG_DECIMAL_VALUE, BigDecimal.valueOf(100L));
@@ -83,12 +83,12 @@ public void testCreationWithAllParameters(final String containerType, final Stri
8383
Assert.assertEquals(model.shortValue().get().shortValue(), (short) 1);
8484
Assert.assertEquals(model.stringValue().get(), "Hello");
8585

86-
controller.destroy().get();
87-
context.disconnect().get();
86+
destroy(controller, endpoint);
87+
disconnect(context, endpoint);
8888
}
8989

9090
@Test(dataProvider = ENDPOINTS_DATAPROVIDER)
91-
public void testCreationWithPrimitiveParameters(final String containerType, final String endpoint) throws ExecutionException, InterruptedException {
91+
public void testCreationWithPrimitiveParameters(final String containerType, final String endpoint) {
9292
//given:
9393
final Map<String, Serializable> parameters = new HashMap<>();
9494
parameters.put(ValueTestConstants.PRIMITIVE_BOOLEAN_VALUE, true);
@@ -126,12 +126,12 @@ public void testCreationWithPrimitiveParameters(final String containerType, fina
126126
Assert.assertEquals(model.primitiveLongValue().get().longValue(), 100L);
127127
Assert.assertEquals(model.primitiveShortValue().get().shortValue(), (short) 1);
128128

129-
controller.destroy().get();
130-
context.disconnect().get();
131-
}
129+
destroy(controller, endpoint);
130+
disconnect(context, endpoint);
131+
}
132132

133133
@Test(dataProvider = ENDPOINTS_DATAPROVIDER)
134-
public void testCreationWithEmptyParameters(final String containerType, final String endpoint) throws ExecutionException, InterruptedException {
134+
public void testCreationWithEmptyParameters(final String containerType, final String endpoint) {
135135
//given:
136136
final Map<String, Serializable> parameters = new HashMap<>();
137137

@@ -163,8 +163,8 @@ public void testCreationWithEmptyParameters(final String containerType, final St
163163
Assert.assertEquals(model.primitiveLongValue().get().longValue(), 0L);
164164
Assert.assertEquals(model.primitiveShortValue().get().shortValue(), (short) 0);
165165

166-
controller.destroy().get();
167-
context.disconnect().get();
166+
destroy(controller, endpoint);
167+
disconnect(context, endpoint);
168168
}
169169

170170
//Currently we do not handle controller creation errors on the client.
@@ -183,7 +183,7 @@ public void testCreationWithWrongTypedParameters(final String containerType, fin
183183
}
184184

185185
@Test(dataProvider = ENDPOINTS_DATAPROVIDER)
186-
public void testCreationWithoutParameters(final String containerType, final String endpoint) throws ExecutionException, InterruptedException {
186+
public void testCreationWithoutParameters(final String containerType, final String endpoint) {
187187
//when:
188188
final ClientContext context = connect(endpoint);
189189
final ControllerProxy<AllValueTypesTestControllerModel> controller = createController(context, ALL_VALUE_TYPES_CONTROLLER);
@@ -212,7 +212,7 @@ public void testCreationWithoutParameters(final String containerType, final Stri
212212
Assert.assertEquals(model.primitiveLongValue().get().longValue(), 0L);
213213
Assert.assertEquals(model.primitiveShortValue().get().shortValue(), (short) 0);
214214

215-
controller.destroy().get();
216-
context.disconnect().get();
215+
destroy(controller, endpoint);
216+
disconnect(context, endpoint);
217217
}
218218
}

remoting/rico-remoting-client/src/main/java/dev/rico/internal/remoting/client/ClientContextImpl.java

Lines changed: 14 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import java.net.URI;
4949
import java.util.Map;
5050
import java.util.concurrent.CompletableFuture;
51+
import java.util.concurrent.CompletionException;
5152
import java.util.function.Function;
5253
import java.util.function.Supplier;
5354

@@ -129,41 +130,25 @@ public synchronized BeanManager getBeanManager() {
129130

130131
@Override
131132
public synchronized CompletableFuture<Void> disconnect() {
132-
final CompletableFuture<Void> result = new CompletableFuture<>();
133-
final BackgroundExecutor backgroundExecutor = Client.getService(BackgroundExecutor.class);
134-
backgroundExecutor.execute(() -> {
135-
commandHandler.invokeCommand(new DestroyContextCommand()).handle((Void aVoid, Throwable throwable) -> {
136-
137-
clientConnector.disconnect();
138-
clientSessionStore.resetSession(endpoint);
139-
if (throwable != null) {
140-
result.completeExceptionally(new RemotingException("Can't disconnect", throwable));
141-
} else {
142-
result.complete(null);
143-
}
144-
return null;
145-
});
146-
});
147-
return result;
133+
return commandHandler.
134+
invokeCommand(new DestroyContextCommand()).
135+
thenAccept(aVoid -> {
136+
clientConnector.disconnect();
137+
clientSessionStore.resetSession(endpoint);
138+
}).
139+
exceptionally(throwable -> {
140+
throw new CompletionException(new RemotingException("Can't disconnect", throwable));
141+
});
148142
}
149143

150144
@Override
151145
public CompletableFuture<Void> connect() {
152-
153-
final CompletableFuture<Void> result = new CompletableFuture<>();
154146
clientConnector.connect();
155-
final BackgroundExecutor backgroundExecutor = Client.getService(BackgroundExecutor.class);
156-
backgroundExecutor.execute(() -> {
157-
commandHandler.invokeCommand(new CreateContextCommand()).handle((Void aVoid, Throwable throwable) -> {
158-
if (throwable != null) {
159-
result.completeExceptionally(new ClientInitializationException("Can't call init action!", throwable));
160-
} else {
161-
}
162-
result.complete(null);
163-
return null;
164-
});
147+
return commandHandler.
148+
invokeCommand(new CreateContextCommand()).
149+
exceptionally(throwable -> {
150+
throw new CompletionException(new ClientInitializationException("Can't call init action!", throwable));
165151
});
166-
return result;
167152
}
168153

169154
@Override

0 commit comments

Comments
 (0)