Skip to content

Commit cc64f8b

Browse files
committed
feat: testcontainers instead of docker compose
Signed-off-by: Simon Schrottner <[email protected]>
1 parent ba4f7f7 commit cc64f8b

14 files changed

+142
-51
lines changed

Diff for: .github/workflows/ci.yml

-21
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

Diff for: providers/flagd/docker-compose.yaml

-17
This file was deleted.

Diff for: providers/flagd/pom.xml

+20-1
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>

Diff for: providers/flagd/schemas

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
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+
static {
13+
Properties properties = new Properties();
14+
try {
15+
properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("flagdTestbed.properties"));
16+
version = properties.getProperty("version");
17+
} catch (IOException e) {
18+
throw new RuntimeException(e);
19+
}
20+
}
21+
22+
public static GenericContainer sync() {
23+
return sync(false);
24+
}
25+
public static GenericContainer sync(boolean unstable) {
26+
String container = generateContainerName("sync", unstable);
27+
return new GenericContainer(DockerImageName.parse(container))
28+
.withExposedPorts(9090);
29+
}
30+
public static GenericContainer flagd() {
31+
return flagd(false);
32+
}
33+
public static GenericContainer flagd(boolean unstable) {
34+
String container = generateContainerName("flagd", unstable);
35+
return new GenericContainer(DockerImageName.parse(container))
36+
.withExposedPorts(8013);
37+
}
38+
39+
private static @NotNull String generateContainerName(String type, boolean unstable) {
40+
String container = "ghcr.io/open-feature/";
41+
container += type;
42+
container += "-testbed";
43+
if (unstable) {
44+
container += "-unstable";
45+
}
46+
container += ":" + version;
47+
return container;
48+
}
49+
}

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

+3-1
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
}

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

+4-2
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
}

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

+3-1
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

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

+4-2
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

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
}

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

+12-2
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
}

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

+14-1
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
}

Diff for: providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/e2e/rpc/FlagdRpcSetup.java

+15
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package dev.openfeature.contrib.providers.flagd.e2e.rpc;
22

3+
import dev.openfeature.contrib.providers.flagd.e2e.ContainerConfig;
34
import dev.openfeature.contrib.providers.flagd.resolver.grpc.cache.CacheType;
5+
import io.cucumber.java.AfterAll;
46
import org.junit.jupiter.api.Order;
57
import org.junit.jupiter.api.parallel.Isolated;
68

@@ -10,21 +12,34 @@
1012
import dev.openfeature.contrib.providers.flagd.e2e.steps.StepDefinitions;
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.junit.jupiter.Testcontainers;
18+
import org.testcontainers.utility.DockerImageName;
1319

1420
@Isolated()
1521
@Order(value = Integer.MAX_VALUE)
1622
public class FlagdRpcSetup {
1723

1824
private static FeatureProvider provider;
25+
private static final GenericContainer flagdContainer = ContainerConfig.flagd();
1926

2027
@BeforeAll()
2128
public static void setup() {
29+
flagdContainer.start();
2230
FlagdRpcSetup.provider = new FlagdProvider(FlagdOptions.builder()
2331
.resolverType(Config.Resolver.RPC)
32+
.port(flagdContainer.getFirstMappedPort())
2433
// set a generous deadline, to prevent timeouts in actions
2534
.deadline(3000)
2635
.cacheType(CacheType.DISABLED.getValue())
2736
.build());
2837
StepDefinitions.setProvider(provider);
2938
}
39+
40+
@AfterAll
41+
public static void tearDown() {
42+
flagdContainer.stop();
43+
}
44+
3045
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# todo: properly configure renovate with a regex matcher to update this version
2+
# renovate: datasource=docker packageName=docker versioning=docker
3+
version=v0.5.5

0 commit comments

Comments
 (0)