Skip to content

Commit b3606f9

Browse files
committed
test(flagd): add envoy test
Signed-off-by: Simon Schrottner <[email protected]>
1 parent 484b070 commit b3606f9

File tree

9 files changed

+83
-144
lines changed

9 files changed

+83
-144
lines changed

providers/flagd/docker-compose.yml

Lines changed: 0 additions & 5 deletions
This file was deleted.
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package dev.openfeature.contrib.providers.flagd.e2e;
2+
3+
import dev.openfeature.contrib.providers.flagd.Config;
4+
import java.io.File;
5+
import java.nio.file.Files;
6+
import java.util.List;
7+
import java.util.Optional;
8+
import org.jetbrains.annotations.NotNull;
9+
import org.testcontainers.containers.ComposeContainer;
10+
import org.testcontainers.containers.ContainerState;
11+
import org.testcontainers.containers.GenericContainer;
12+
import org.testcontainers.containers.Network;
13+
import org.testcontainers.utility.DockerImageName;
14+
import org.testcontainers.utility.MountableFile;
15+
16+
public class ContainerUtil {
17+
public static int getPort(ComposeContainer container, Config.Resolver resolver) {
18+
Optional<ContainerState> flagd = container.getContainerByServiceName("flagd");
19+
20+
return flagd.map(containerState -> {
21+
22+
switch (resolver) {
23+
case RPC:
24+
return containerState.getMappedPort(8013);
25+
case IN_PROCESS:
26+
return containerState.getMappedPort(8015);
27+
default:
28+
return 0;
29+
}
30+
}).orElseThrow(() -> new RuntimeException("Could not map port"));
31+
32+
}
33+
34+
public static String getLaunchpadUrl(ComposeContainer container) {
35+
Optional<ContainerState> flagd = container.getContainerByServiceName("flagd");
36+
return flagd.map(containerState -> {
37+
return containerState.getHost() + ":" + containerState.getMappedPort(8080);
38+
}).orElseThrow(() -> new RuntimeException("Could not find launchpad url"));
39+
}
40+
41+
42+
}

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

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

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import org.junit.platform.suite.api.IncludeEngines;
1414
import org.junit.platform.suite.api.IncludeTags;
1515
import org.junit.platform.suite.api.SelectDirectories;
16+
import org.junit.platform.suite.api.SelectFile;
1617
import org.junit.platform.suite.api.Suite;
1718
import org.testcontainers.junit.jupiter.Testcontainers;
1819

@@ -29,7 +30,7 @@
2930
@ConfigurationParameter(key = GLUE_PROPERTY_NAME, value = "dev.openfeature.contrib.providers.flagd.e2e.steps")
3031
@ConfigurationParameter(key = OBJECT_FACTORY_PROPERTY_NAME, value = "io.cucumber.picocontainer.PicoFactory")
3132
@IncludeTags("in-process")
32-
@ExcludeTags({"unixsocket", "targetURI"})
33+
@ExcludeTags({"unixsocket"})
3334
@Testcontainers
3435
@Isolated
3536
public class RunInProcessTest {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
@ConfigurationParameter(key = GLUE_PROPERTY_NAME, value = "dev.openfeature.contrib.providers.flagd.e2e.steps")
2929
@ConfigurationParameter(key = OBJECT_FACTORY_PROPERTY_NAME, value = "io.cucumber.picocontainer.PicoFactory")
3030
@IncludeTags({"rpc"})
31-
@ExcludeTags({"targetURI", "unixsocket"})
31+
@ExcludeTags({"unixsocket"})
3232
@Testcontainers
3333
public class RunRpcTest {
3434

providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/e2e/steps/ProviderSteps.java

Lines changed: 36 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,12 @@
55
import dev.openfeature.contrib.providers.flagd.Config;
66
import dev.openfeature.contrib.providers.flagd.FlagdOptions;
77
import dev.openfeature.contrib.providers.flagd.FlagdProvider;
8-
import dev.openfeature.contrib.providers.flagd.e2e.FlagdContainer;
8+
import dev.openfeature.contrib.providers.flagd.e2e.ContainerUtil;
99
import dev.openfeature.contrib.providers.flagd.e2e.State;
1010
import dev.openfeature.sdk.FeatureProvider;
1111
import dev.openfeature.sdk.OpenFeatureAPI;
1212
import io.cucumber.java.After;
1313
import io.cucumber.java.AfterAll;
14-
import io.cucumber.java.Before;
1514
import io.cucumber.java.BeforeAll;
1615
import io.cucumber.java.en.Given;
1716
import io.cucumber.java.en.When;
@@ -20,18 +19,21 @@
2019
import java.nio.file.Files;
2120
import java.nio.file.Path;
2221
import java.nio.file.Paths;
22+
import java.time.Duration;
2323
import lombok.extern.slf4j.Slf4j;
2424
import org.apache.commons.lang3.RandomStringUtils;
25+
import org.apache.commons.lang3.StringUtils;
2526
import org.junit.jupiter.api.parallel.Isolated;
26-
import org.testcontainers.containers.BindMode;
27+
import org.testcontainers.containers.ComposeContainer;
28+
import org.testcontainers.containers.wait.strategy.Wait;
2729
import org.testcontainers.shaded.org.apache.commons.io.FileUtils;
2830

2931
@Isolated()
3032
@Slf4j
3133
public class ProviderSteps extends AbstractSteps {
3234

3335
public static final int UNAVAILABLE_PORT = 9999;
34-
static FlagdContainer container;
36+
static ComposeContainer container;
3537

3638
static Path sharedTempDir;
3739

@@ -43,8 +45,19 @@ public ProviderSteps(State state) {
4345
public static void beforeAll() throws IOException {
4446
sharedTempDir = Files.createDirectories(
4547
Paths.get("tmp/" + RandomStringUtils.randomAlphanumeric(8).toLowerCase() + "/"));
46-
container = new FlagdContainer()
47-
.withFileSystemBind(sharedTempDir.toAbsolutePath().toString(), "/flags", BindMode.READ_WRITE);
48+
container = new ComposeContainer(
49+
new File("test-harness/docker-compose.yaml"))
50+
.withExposedService("flagd", 8013,
51+
Wait.forListeningPort())
52+
.withExposedService("flagd", 8015,
53+
Wait.forListeningPort())
54+
.withExposedService("flagd", 8080,
55+
Wait.forListeningPort())
56+
.withExposedService("envoy", 9211,
57+
Wait.forListeningPort())
58+
.withStartupTimeout(Duration.ofSeconds(45));
59+
container.start();
60+
4861
}
4962

5063
@AfterAll
@@ -53,17 +66,10 @@ public static void afterAll() throws IOException {
5366
FileUtils.deleteDirectory(sharedTempDir.toFile());
5467
}
5568

56-
@Before
57-
public void before() {
58-
if (!container.isRunning()) {
59-
container.start();
60-
}
61-
}
62-
6369
@After
6470
public void tearDown() {
6571
if (state.client != null) {
66-
when().post("http://" + container.getLaunchpadUrl() + "/stop")
72+
when().post("http://" + ContainerUtil.getLaunchpadUrl(container) + "/stop")
6773
.then()
6874
.statusCode(200);
6975
}
@@ -100,7 +106,7 @@ public void setupProvider(String providerType) throws InterruptedException {
100106
String absolutePath = file.getAbsolutePath();
101107
this.state.providerType = ProviderType.SSL;
102108
state.builder
103-
.port(container.getPort(State.resolverType))
109+
.port(ContainerUtil.getPort(container, State.resolverType))
104110
.tls(true)
105111
.certPath(absolutePath);
106112
flagdConfig = "ssl";
@@ -117,7 +123,7 @@ public void setupProvider(String providerType) throws InterruptedException {
117123
.port(UNAVAILABLE_PORT)
118124
.offlineFlagSourcePath(new File("test-harness/flags/" + replace).getAbsolutePath());
119125
} else {
120-
state.builder.port(container.getPort(State.resolverType));
126+
state.builder.port(ContainerUtil.getPort(container, State.resolverType));
121127
}
122128
break;
123129
default:
@@ -131,11 +137,20 @@ public void setupProvider(String providerType) throws InterruptedException {
131137
.toAbsolutePath()
132138
.toString());
133139
} else {
134-
state.builder.port(container.getPort(State.resolverType));
140+
state.builder.port(ContainerUtil.getPort(container, State.resolverType));
135141
}
136142
break;
137143
}
138-
when().post("http://" + container.getLaunchpadUrl() + "/start?config={config}", flagdConfig)
144+
145+
// Setting TargetUri if this setting is set
146+
FlagdOptions tempBuild = state.builder.build();
147+
if (!StringUtils.isEmpty(tempBuild.getTargetUri())) {
148+
String replace = tempBuild.getTargetUri().replace("<port>", ""+container.getServicePort("envoy", 9211));
149+
state.builder.targetUri(replace);
150+
state.builder.port(UNAVAILABLE_PORT);
151+
}
152+
153+
when().post("http://" + ContainerUtil.getLaunchpadUrl(container) + "/start?config={config}", flagdConfig)
139154
.then()
140155
.statusCode(200);
141156

@@ -156,18 +171,18 @@ public void setupProvider(String providerType) throws InterruptedException {
156171

157172
@When("the connection is lost")
158173
public void the_connection_is_lost() {
159-
when().post("http://" + container.getLaunchpadUrl() + "/stop").then().statusCode(200);
174+
when().post("http://" + ContainerUtil.getLaunchpadUrl(container) + "/stop").then().statusCode(200);
160175
}
161176

162177
@When("the connection is lost for {int}s")
163178
public void the_connection_is_lost_for(int seconds) {
164-
when().post("http://" + container.getLaunchpadUrl() + "/restart?seconds={seconds}", seconds)
179+
when().post("http://" + ContainerUtil.getLaunchpadUrl(container) + "/restart?seconds={seconds}", seconds)
165180
.then()
166181
.statusCode(200);
167182
}
168183

169184
@When("the flag was modified")
170185
public void the_flag_was_modded() {
171-
when().post("http://" + container.getLaunchpadUrl() + "/change").then().statusCode(200);
186+
when().post("http://" + ContainerUtil.getLaunchpadUrl(container) + "/change").then().statusCode(200);
172187
}
173188
}

providers/flagd/src/test/java/dev/openfeature/contrib/providers/flagd/e2e/steps/config/ConfigSteps.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ public void we_have_an_option_of_type_with_value(String option, String type, Str
7171
.filter(method1 -> method1.getName().equals(mapOptionNames(option)))
7272
.findFirst()
7373
.orElseThrow(RuntimeException::new);
74+
7475
method.invoke(state.builder, converted);
7576
}
7677

providers/flagd/src/test/resources/envoy-config/envoy-custom.yaml

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

providers/flagd/test-harness

0 commit comments

Comments
 (0)