Skip to content

Commit 05c37b0

Browse files
committed
feat: testcontainers instead of docker compose
Signed-off-by: Simon Schrottner <simon.schrottner@dynatrace.com>
1 parent ba4f7f7 commit 05c37b0

File tree

14 files changed

+164
-51
lines changed

14 files changed

+164
-51
lines changed

.github/workflows/ci.yml

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -11,27 +11,6 @@ on:
1111
jobs:
1212
main:
1313
runs-on: ubuntu-latest
14-
services:
15-
# flagd-testbed for flagd RPC provider e2e tests
16-
flagd:
17-
image: ghcr.io/open-feature/flagd-testbed:v0.5.5
18-
ports:
19-
- 8013:8013
20-
# flagd-testbed for flagd RPC provider reconnect e2e tests
21-
flagd-unstable:
22-
image: ghcr.io/open-feature/flagd-testbed-unstable:v0.5.5
23-
ports:
24-
- 8014:8013
25-
# sync-testbed for flagd in-process provider e2e tests
26-
sync:
27-
image: ghcr.io/open-feature/sync-testbed:v0.5.5
28-
ports:
29-
- 9090:9090
30-
# sync-testbed for flagd in-process provider reconnect e2e tests
31-
sync-unstable:
32-
image: ghcr.io/open-feature/sync-testbed-unstable:v0.5.5
33-
ports:
34-
- 9091:9090
3514

3615
steps:
3716
- name: Checkout Repository

providers/flagd/docker-compose.yaml

Lines changed: 0 additions & 17 deletions
This file was deleted.

providers/flagd/pom.xml

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,25 @@
132132
<version>1.17.0</version>
133133
</dependency>
134134

135+
<dependency>
136+
<groupId>org.junit.jupiter</groupId>
137+
<artifactId>junit-jupiter</artifactId>
138+
<version>5.8.1</version>
139+
<scope>test</scope>
140+
</dependency>
141+
<dependency>
142+
<groupId>org.testcontainers</groupId>
143+
<artifactId>testcontainers</artifactId>
144+
<version>1.19.8</version>
145+
<scope>test</scope>
146+
</dependency>
147+
<dependency>
148+
<groupId>org.testcontainers</groupId>
149+
<artifactId>junit-jupiter</artifactId>
150+
<version>1.19.8</version>
151+
<scope>test</scope>
152+
</dependency>
153+
135154
</dependencies>
136155

137156
<build>
@@ -402,4 +421,4 @@
402421
</profile>
403422
</profiles>
404423

405-
</project>
424+
</project>

providers/flagd/schemas

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
package dev.openfeature.contrib.providers.flagd.e2e;
2+
3+
import org.jetbrains.annotations.NotNull;
4+
import org.testcontainers.containers.GenericContainer;
5+
import org.testcontainers.utility.DockerImageName;
6+
7+
import java.io.IOException;
8+
import java.util.Properties;
9+
10+
public class ContainerConfig {
11+
private static final String version;
12+
13+
static {
14+
Properties properties = new Properties();
15+
try {
16+
properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("flagdTestbed.properties"));
17+
version = properties.getProperty("version");
18+
} catch (IOException e) {
19+
throw new RuntimeException(e);
20+
}
21+
}
22+
23+
/**
24+
*
25+
* @return a {@link org.testcontainers.containers.GenericContainer} instance of a stable sync flagd server with the port 9090 exposed
26+
*/
27+
public static GenericContainer sync() {
28+
return sync(false);
29+
}
30+
31+
/**
32+
*
33+
* @param unstable if an unstable version of the container, which terminates the connection regularly should be used.
34+
* @return a {@link org.testcontainers.containers.GenericContainer} instance of a sync flagd server with the port 9090 exposed
35+
*/
36+
public static GenericContainer sync(boolean unstable) {
37+
String container = generateContainerName("sync", unstable);
38+
return new GenericContainer(DockerImageName.parse(container))
39+
.withExposedPorts(9090);
40+
}
41+
42+
/**
43+
*
44+
* @return a {@link org.testcontainers.containers.GenericContainer} instance of a stable flagd server with the port 8013 exposed
45+
*/
46+
public static GenericContainer flagd() {
47+
return flagd(false);
48+
}
49+
50+
/**
51+
*
52+
* @param unstable if an unstable version of the container, which terminates the connection regularly should be used.
53+
* @return a {@link org.testcontainers.containers.GenericContainer} instance of a flagd server with the port 8013 exposed
54+
*/
55+
public static GenericContainer flagd(boolean unstable) {
56+
String container = generateContainerName("flagd", unstable);
57+
return new GenericContainer(DockerImageName.parse(container))
58+
.withExposedPorts(8013);
59+
}
60+
61+
private static @NotNull String generateContainerName(String type, boolean unstable) {
62+
String container = "ghcr.io/open-feature/";
63+
container += type;
64+
container += "-testbed";
65+
if (unstable) {
66+
container += "-unstable";
67+
}
68+
container += ":" + version;
69+
return container;
70+
}
71+
}

providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/e2e/RunFlagdInProcessCucumberTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import org.junit.platform.suite.api.IncludeEngines;
66
import org.junit.platform.suite.api.SelectClasspathResource;
77
import org.junit.platform.suite.api.Suite;
8+
import org.testcontainers.junit.jupiter.Testcontainers;
89

910
import static io.cucumber.junit.platform.engine.Constants.PLUGIN_PROPERTY_NAME;
1011
import static io.cucumber.junit.platform.engine.Constants.GLUE_PROPERTY_NAME;
@@ -20,6 +21,7 @@
2021
@SelectClasspathResource("features/flagd.feature")
2122
@ConfigurationParameter(key = PLUGIN_PROPERTY_NAME, value = "pretty")
2223
@ConfigurationParameter(key = GLUE_PROPERTY_NAME, value = "dev.openfeature.contrib.providers.flagd.e2e.process,dev.openfeature.contrib.providers.flagd.e2e.steps")
24+
@Testcontainers
2325
public class RunFlagdInProcessCucumberTest {
24-
26+
2527
}

providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/e2e/RunFlagdInProcessReconnectCucumberTest.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,21 @@
55
import org.junit.platform.suite.api.IncludeEngines;
66
import org.junit.platform.suite.api.SelectClasspathResource;
77
import org.junit.platform.suite.api.Suite;
8+
import org.testcontainers.junit.jupiter.Testcontainers;
89

910
import static io.cucumber.junit.platform.engine.Constants.PLUGIN_PROPERTY_NAME;
1011
import static io.cucumber.junit.platform.engine.Constants.GLUE_PROPERTY_NAME;
1112

1213
/**
13-
* Class for running the reconnection tests for the in-process provider
14+
* Class for running the reconnection tests for the in-process provider
1415
*/
1516
@Order(value = Integer.MAX_VALUE)
1617
@Suite
1718
@IncludeEngines("cucumber")
1819
@SelectClasspathResource("features/flagd-reconnect.feature")
1920
@ConfigurationParameter(key = PLUGIN_PROPERTY_NAME, value = "pretty")
2021
@ConfigurationParameter(key = GLUE_PROPERTY_NAME, value = "dev.openfeature.contrib.providers.flagd.e2e.reconnect.process,dev.openfeature.contrib.providers.flagd.e2e.reconnect.steps")
22+
@Testcontainers
2123
public class RunFlagdInProcessReconnectCucumberTest {
22-
24+
2325
}

providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/e2e/RunFlagdRpcCucumberTest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import org.junit.platform.suite.api.IncludeEngines;
66
import org.junit.platform.suite.api.SelectClasspathResource;
77
import org.junit.platform.suite.api.Suite;
8+
import org.testcontainers.junit.jupiter.Testcontainers;
89

910
import static io.cucumber.junit.platform.engine.Constants.PLUGIN_PROPERTY_NAME;
1011
import static io.cucumber.junit.platform.engine.Constants.GLUE_PROPERTY_NAME;
@@ -20,7 +21,8 @@
2021
@SelectClasspathResource("features/flagd.feature")
2122
@ConfigurationParameter(key = PLUGIN_PROPERTY_NAME, value = "pretty")
2223
@ConfigurationParameter(key = GLUE_PROPERTY_NAME, value = "dev.openfeature.contrib.providers.flagd.e2e.rpc,dev.openfeature.contrib.providers.flagd.e2e.steps")
24+
@Testcontainers
2325
public class RunFlagdRpcCucumberTest {
24-
26+
2527
}
2628

providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/e2e/RunFlagdRpcReconnectCucumberTest.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,22 @@
55
import org.junit.platform.suite.api.IncludeEngines;
66
import org.junit.platform.suite.api.SelectClasspathResource;
77
import org.junit.platform.suite.api.Suite;
8+
import org.testcontainers.junit.jupiter.Testcontainers;
89

910
import static io.cucumber.junit.platform.engine.Constants.PLUGIN_PROPERTY_NAME;
1011
import static io.cucumber.junit.platform.engine.Constants.GLUE_PROPERTY_NAME;
1112

1213
/**
13-
* Class for running the reconnection tests for the RPC provider
14+
* Class for running the reconnection tests for the RPC provider
1415
*/
1516
@Order(value = Integer.MAX_VALUE)
1617
@Suite
1718
@IncludeEngines("cucumber")
1819
@SelectClasspathResource("features/flagd-reconnect.feature")
1920
@ConfigurationParameter(key = PLUGIN_PROPERTY_NAME, value = "pretty")
2021
@ConfigurationParameter(key = GLUE_PROPERTY_NAME, value = "dev.openfeature.contrib.providers.flagd.e2e.reconnect.rpc,dev.openfeature.contrib.providers.flagd.e2e.reconnect.steps")
22+
@Testcontainers
2123
public class RunFlagdRpcReconnectCucumberTest {
22-
24+
2325
}
2426

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package dev.openfeature.contrib.providers.flagd.e2e.process;
22

3+
import dev.openfeature.contrib.providers.flagd.e2e.ContainerConfig;
4+
import io.cucumber.java.AfterAll;
35
import org.junit.jupiter.api.Order;
46
import org.junit.jupiter.api.parallel.Isolated;
57

@@ -9,20 +11,30 @@
911
import dev.openfeature.contrib.providers.flagd.e2e.steps.StepDefinitions;
1012
import dev.openfeature.sdk.FeatureProvider;
1113
import io.cucumber.java.BeforeAll;
14+
import org.testcontainers.containers.GenericContainer;
15+
import org.testcontainers.utility.DockerImageName;
1216

1317
@Isolated()
1418
@Order(value = Integer.MAX_VALUE)
1519
public class FlagdInProcessSetup {
1620

1721
private static FeatureProvider provider;
18-
22+
23+
private static final GenericContainer flagdContainer = ContainerConfig.sync();
24+
1925
@BeforeAll()
2026
public static void setup() throws InterruptedException {
27+
flagdContainer.start();
2128
FlagdInProcessSetup.provider = new FlagdProvider(FlagdOptions.builder()
2229
.resolverType(Config.Resolver.IN_PROCESS)
2330
.deadline(3000)
24-
.port(9090)
31+
.port(flagdContainer.getFirstMappedPort())
2532
.build());
2633
StepDefinitions.setProvider(provider);
2734
}
35+
36+
@AfterAll
37+
public static void tearDown() {
38+
flagdContainer.stop();
39+
}
2840
}

providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/e2e/reconnect/process/FlagdInProcessSetup.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package dev.openfeature.contrib.providers.flagd.e2e.reconnect.process;
22

3+
import dev.openfeature.contrib.providers.flagd.e2e.ContainerConfig;
4+
import io.cucumber.java.AfterAll;
35
import org.junit.jupiter.api.Order;
46
import org.junit.jupiter.api.parallel.Isolated;
57

@@ -9,17 +11,20 @@
911
import dev.openfeature.contrib.providers.flagd.e2e.reconnect.steps.StepDefinitions;
1012
import dev.openfeature.sdk.FeatureProvider;
1113
import io.cucumber.java.BeforeAll;
14+
import org.testcontainers.containers.GenericContainer;
1215

1316
@Isolated()
1417
@Order(value = Integer.MAX_VALUE)
1518
public class FlagdInProcessSetup {
16-
19+
20+
private static final GenericContainer flagdContainer = ContainerConfig.sync(true);
1721
@BeforeAll()
1822
public static void setup() throws InterruptedException {
23+
flagdContainer.start();
1924
FeatureProvider workingProvider = new FlagdProvider(FlagdOptions.builder()
2025
.resolverType(Config.Resolver.IN_PROCESS)
2126
.deadline(3000)
22-
.port(9091)
27+
.port(flagdContainer.getFirstMappedPort())
2328
.build());
2429
StepDefinitions.setUnstableProvider(workingProvider);
2530

@@ -30,4 +35,9 @@ public static void setup() throws InterruptedException {
3035
.build());
3136
StepDefinitions.setUnavailableProvider(unavailableProvider);
3237
}
38+
39+
@AfterAll
40+
public static void tearDown() {
41+
flagdContainer.stop();
42+
}
3343
}

providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/e2e/reconnect/rpc/FlagdRpcSetup.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package dev.openfeature.contrib.providers.flagd.e2e.reconnect.rpc;
22

3+
import dev.openfeature.contrib.providers.flagd.e2e.ContainerConfig;
4+
import io.cucumber.java.AfterAll;
35
import org.junit.jupiter.api.Order;
46
import org.junit.jupiter.api.parallel.Isolated;
57

@@ -10,16 +12,22 @@
1012
import dev.openfeature.contrib.providers.flagd.resolver.grpc.cache.CacheType;
1113
import dev.openfeature.sdk.FeatureProvider;
1214
import io.cucumber.java.BeforeAll;
15+
import org.testcontainers.containers.GenericContainer;
16+
import org.testcontainers.junit.jupiter.Container;
17+
import org.testcontainers.utility.DockerImageName;
1318

1419
@Isolated()
1520
@Order(value = Integer.MAX_VALUE)
1621
public class FlagdRpcSetup {
22+
private static final GenericContainer flagdContainer = ContainerConfig.flagd(true);
1723

1824
@BeforeAll()
1925
public static void setup() throws InterruptedException {
26+
flagdContainer.start();
27+
2028
FeatureProvider workingProvider = new FlagdProvider(FlagdOptions.builder()
2129
.resolverType(Config.Resolver.RPC)
22-
.port(8014)
30+
.port(flagdContainer.getFirstMappedPort())
2331
// set a generous deadline, to prevent timeouts in actions
2432
.deadline(3000)
2533
.cacheType(CacheType.DISABLED.getValue())
@@ -35,4 +43,9 @@ public static void setup() throws InterruptedException {
3543
.build());
3644
StepDefinitions.setUnavailableProvider(unavailableProvider);
3745
}
46+
47+
@AfterAll
48+
public static void tearDown() {
49+
flagdContainer.stop();
50+
}
3851
}

0 commit comments

Comments
 (0)