Skip to content

Commit 36c4b37

Browse files
committed
test(flagd): add envoy test
Signed-off-by: Simon Schrottner <[email protected]>
1 parent 641576d commit 36c4b37

File tree

9 files changed

+70
-144
lines changed

9 files changed

+70
-144
lines changed

providers/flagd/docker-compose.yml

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

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: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
@ConfigurationParameter(key = GLUE_PROPERTY_NAME, value = "dev.openfeature.contrib.providers.flagd.e2e.steps")
3030
@ConfigurationParameter(key = OBJECT_FACTORY_PROPERTY_NAME, value = "io.cucumber.picocontainer.PicoFactory")
3131
@IncludeTags("in-process")
32-
@ExcludeTags({"unixsocket", "targetURI"})
32+
@ExcludeTags({"unixsocket"})
3333
@Testcontainers
3434
@Isolated
3535
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: 34 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,13 @@ 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(new File("test-harness/docker-compose.yaml"))
49+
.withExposedService("flagd", 8013, Wait.forListeningPort())
50+
.withExposedService("flagd", 8015, Wait.forListeningPort())
51+
.withExposedService("flagd", 8080, Wait.forListeningPort())
52+
.withExposedService("envoy", 9211, Wait.forListeningPort())
53+
.withStartupTimeout(Duration.ofSeconds(45));
54+
container.start();
4855
}
4956

5057
@AfterAll
@@ -53,17 +60,10 @@ public static void afterAll() throws IOException {
5360
FileUtils.deleteDirectory(sharedTempDir.toFile());
5461
}
5562

56-
@Before
57-
public void before() {
58-
if (!container.isRunning()) {
59-
container.start();
60-
}
61-
}
62-
6363
@After
6464
public void tearDown() {
6565
if (state.client != null) {
66-
when().post("http://" + container.getLaunchpadUrl() + "/stop")
66+
when().post("http://" + ContainerUtil.getLaunchpadUrl(container) + "/stop")
6767
.then()
6868
.statusCode(200);
6969
}
@@ -100,7 +100,7 @@ public void setupProvider(String providerType) throws InterruptedException {
100100
String absolutePath = file.getAbsolutePath();
101101
this.state.providerType = ProviderType.SSL;
102102
state.builder
103-
.port(container.getPort(State.resolverType))
103+
.port(ContainerUtil.getPort(container, State.resolverType))
104104
.tls(true)
105105
.certPath(absolutePath);
106106
flagdConfig = "ssl";
@@ -117,7 +117,7 @@ public void setupProvider(String providerType) throws InterruptedException {
117117
.port(UNAVAILABLE_PORT)
118118
.offlineFlagSourcePath(new File("test-harness/flags/" + replace).getAbsolutePath());
119119
} else {
120-
state.builder.port(container.getPort(State.resolverType));
120+
state.builder.port(ContainerUtil.getPort(container, State.resolverType));
121121
}
122122
break;
123123
case "syncpayload":
@@ -135,13 +135,22 @@ public void setupProvider(String providerType) throws InterruptedException {
135135
.toAbsolutePath()
136136
.toString());
137137
} else {
138-
state.builder.port(container.getPort(State.resolverType));
138+
state.builder.port(ContainerUtil.getPort(container, State.resolverType));
139139
}
140140
break;
141141
default:
142142
throw new IllegalStateException();
143143
}
144-
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)
145154
.then()
146155
.statusCode(200);
147156

@@ -162,18 +171,22 @@ public void setupProvider(String providerType) throws InterruptedException {
162171

163172
@When("the connection is lost")
164173
public void the_connection_is_lost() {
165-
when().post("http://" + container.getLaunchpadUrl() + "/stop").then().statusCode(200);
174+
when().post("http://" + ContainerUtil.getLaunchpadUrl(container) + "/stop")
175+
.then()
176+
.statusCode(200);
166177
}
167178

168179
@When("the connection is lost for {int}s")
169180
public void the_connection_is_lost_for(int seconds) {
170-
when().post("http://" + container.getLaunchpadUrl() + "/restart?seconds={seconds}", seconds)
181+
when().post("http://" + ContainerUtil.getLaunchpadUrl(container) + "/restart?seconds={seconds}", seconds)
171182
.then()
172183
.statusCode(200);
173184
}
174185

175186
@When("the flag was modified")
176187
public void the_flag_was_modded() {
177-
when().post("http://" + container.getLaunchpadUrl() + "/change").then().statusCode(200);
188+
when().post("http://" + ContainerUtil.getLaunchpadUrl(container) + "/change")
189+
.then()
190+
.statusCode(200);
178191
}
179192
}

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)