55import dev .openfeature .contrib .providers .flagd .Config ;
66import dev .openfeature .contrib .providers .flagd .FlagdOptions ;
77import dev .openfeature .contrib .providers .flagd .FlagdProvider ;
8- import dev .openfeature .contrib .providers .flagd .e2e .FlagdContainer ;
8+ import dev .openfeature .contrib .providers .flagd .e2e .ContainerUtil ;
99import dev .openfeature .contrib .providers .flagd .e2e .State ;
1010import dev .openfeature .sdk .FeatureProvider ;
1111import dev .openfeature .sdk .OpenFeatureAPI ;
1212import io .cucumber .java .After ;
1313import io .cucumber .java .AfterAll ;
14- import io .cucumber .java .Before ;
1514import io .cucumber .java .BeforeAll ;
1615import io .cucumber .java .en .Given ;
1716import io .cucumber .java .en .When ;
2019import java .nio .file .Files ;
2120import java .nio .file .Path ;
2221import java .nio .file .Paths ;
22+ import java .time .Duration ;
2323import lombok .extern .slf4j .Slf4j ;
2424import org .apache .commons .lang3 .RandomStringUtils ;
25+ import org .apache .commons .lang3 .StringUtils ;
2526import 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 ;
2729import org .testcontainers .shaded .org .apache .commons .io .FileUtils ;
2830
2931@ Isolated ()
3032@ Slf4j
3133public 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}
0 commit comments