From 37be781519c5e0e4c513544ab3aa4a6724ad6c47 Mon Sep 17 00:00:00 2001
From: Kyle Julian <38759683+kylejuliandev@users.noreply.github.com>
Date: Fri, 11 Apr 2025 19:09:28 +0100
Subject: [PATCH 1/6] Initial add test containers for Flagd E2E tests
Signed-off-by: Kyle Julian <38759683+kylejuliandev@users.noreply.github.com>
---
.../FlagdSyncTestBedContainer.cs | 19 +++++++++
...rib.Providers.Flagd.E2e.ProcessTest.csproj | 1 +
.../Steps/EvaluationStepDefinitionsProcess.cs | 6 ---
.../Steps/FlagdStepDefinitionsProcess.cs | 6 ---
.../Steps/TestHooks.cs | 40 +++++++++++++++++++
.../FlagdTestBedContainer.cs | 19 +++++++++
...Contrib.Providers.Flagd.E2e.RpcTest.csproj | 1 +
.../Steps/EvaluationStepDefinitionsRpc.cs | 7 ----
.../Steps/FlagdStepDefinitionsRpc.cs | 8 ----
.../Steps/TestHooks.cs | 40 +++++++++++++++++++
.../Steps/EvaluationStepDefinitionBase.cs | 2 +-
.../Steps/FlagdStepDefinitionBase.cs | 2 +-
12 files changed, 122 insertions(+), 29 deletions(-)
create mode 100644 test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/FlagdSyncTestBedContainer.cs
create mode 100644 test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/Steps/TestHooks.cs
create mode 100644 test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/FlagdTestBedContainer.cs
create mode 100644 test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/Steps/TestHooks.cs
diff --git a/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/FlagdSyncTestBedContainer.cs b/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/FlagdSyncTestBedContainer.cs
new file mode 100644
index 00000000..8f63872f
--- /dev/null
+++ b/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/FlagdSyncTestBedContainer.cs
@@ -0,0 +1,19 @@
+using DotNet.Testcontainers.Builders;
+using DotNet.Testcontainers.Containers;
+
+namespace OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest
+{
+ public class FlagdSyncTestBedContainer
+ {
+ public IContainer Container { get; }
+
+ public FlagdSyncTestBedContainer()
+ {
+ Container = new ContainerBuilder()
+ .WithImage("ghcr.io/open-feature/sync-testbed:v0.5.6")
+ .WithExposedPort(9090)
+ .WithPortBinding(9090, true)
+ .Build();
+ }
+ }
+}
\ No newline at end of file
diff --git a/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest.csproj b/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest.csproj
index a7d4c7f6..cc278ba0 100644
--- a/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest.csproj
+++ b/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest.csproj
@@ -27,6 +27,7 @@
+
diff --git a/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/Steps/EvaluationStepDefinitionsProcess.cs b/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/Steps/EvaluationStepDefinitionsProcess.cs
index a9ea5f53..ddb79559 100644
--- a/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/Steps/EvaluationStepDefinitionsProcess.cs
+++ b/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/Steps/EvaluationStepDefinitionsProcess.cs
@@ -1,4 +1,3 @@
-using System;
using TechTalk.SpecFlow;
namespace OpenFeature.Contrib.Providers.Flagd.E2e.Test.Process
@@ -6,11 +5,6 @@ namespace OpenFeature.Contrib.Providers.Flagd.E2e.Test.Process
[Binding, Scope(Feature = "Flag evaluation")]
public class EvaluationStepDefinitionsProcess : EvaluationStepDefinitionsBase
{
- static EvaluationStepDefinitionsProcess()
- {
- var flagdProvider = new FlagdProvider(FlagdConfig.Builder().WithPort(9090).WithResolverType(ResolverType.IN_PROCESS).Build());
- Api.Instance.SetProviderAsync("process-test-evaluation", flagdProvider).Wait(5000);
- }
public EvaluationStepDefinitionsProcess(ScenarioContext scenarioContext) : base(scenarioContext)
{
client = Api.Instance.GetClient("process-test-evaluation");
diff --git a/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/Steps/FlagdStepDefinitionsProcess.cs b/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/Steps/FlagdStepDefinitionsProcess.cs
index 0392c43c..bd2d808d 100644
--- a/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/Steps/FlagdStepDefinitionsProcess.cs
+++ b/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/Steps/FlagdStepDefinitionsProcess.cs
@@ -1,4 +1,3 @@
-using System;
using TechTalk.SpecFlow;
namespace OpenFeature.Contrib.Providers.Flagd.E2e.Test.Process
@@ -8,11 +7,6 @@ namespace OpenFeature.Contrib.Providers.Flagd.E2e.Test.Process
[Scope(Feature = "flagd json evaluation")]
public class FlagdStepDefinitionsProcess : FlagdStepDefinitionsBase
{
- static FlagdStepDefinitionsProcess()
- {
- var flagdProvider = new FlagdProvider(FlagdConfig.Builder().WithPort(9090).WithResolverType(ResolverType.IN_PROCESS).Build());
- Api.Instance.SetProviderAsync("process-test-flagd", flagdProvider).Wait(5000);
- }
public FlagdStepDefinitionsProcess(ScenarioContext scenarioContext) : base(scenarioContext)
{
client = Api.Instance.GetClient("process-test-flagd");
diff --git a/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/Steps/TestHooks.cs b/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/Steps/TestHooks.cs
new file mode 100644
index 00000000..37593ab7
--- /dev/null
+++ b/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/Steps/TestHooks.cs
@@ -0,0 +1,40 @@
+using System.Threading.Tasks;
+using TechTalk.SpecFlow;
+
+namespace OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest.Steps
+{
+ [Binding]
+ public class TestHooks
+ {
+ private static FlagdSyncTestBedContainer _container;
+
+ [BeforeTestRun]
+ public static async Task StartContainerAsync()
+ {
+ _container = new FlagdSyncTestBedContainer();
+
+ await _container.Container.StartAsync();
+
+ var port = _container.Container.GetMappedPublicPort(9090);
+
+ var flagdProvider = new FlagdProvider(
+ FlagdConfig.Builder()
+ .WithPort(port)
+ .WithResolverType(ResolverType.IN_PROCESS)
+ .Build()
+ );
+
+ Api.Instance.SetProviderAsync("process-test-flagd", flagdProvider).Wait(500);
+ }
+
+ [AfterTestRun]
+ public static async Task StopContainerAsync()
+ {
+ if (_container != null)
+ {
+ await _container.Container.StopAsync();
+ await _container.Container.DisposeAsync();
+ }
+ }
+ }
+}
diff --git a/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/FlagdTestBedContainer.cs b/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/FlagdTestBedContainer.cs
new file mode 100644
index 00000000..fad4ce7d
--- /dev/null
+++ b/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/FlagdTestBedContainer.cs
@@ -0,0 +1,19 @@
+using DotNet.Testcontainers.Builders;
+using DotNet.Testcontainers.Containers;
+
+namespace OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest
+{
+ public class FlagdTestBedContainer
+ {
+ public IContainer Container { get; }
+
+ public FlagdTestBedContainer()
+ {
+ Container = new ContainerBuilder()
+ .WithImage("ghcr.io/open-feature/flagd-testbed:v0.5.21")
+ .WithExposedPort(8013)
+ .WithPortBinding(8013, true)
+ .Build();
+ }
+ }
+}
\ No newline at end of file
diff --git a/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest.csproj b/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest.csproj
index a7d4c7f6..cc278ba0 100644
--- a/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest.csproj
+++ b/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest.csproj
@@ -27,6 +27,7 @@
+
diff --git a/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/Steps/EvaluationStepDefinitionsRpc.cs b/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/Steps/EvaluationStepDefinitionsRpc.cs
index e36e96b0..4555ae27 100644
--- a/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/Steps/EvaluationStepDefinitionsRpc.cs
+++ b/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/Steps/EvaluationStepDefinitionsRpc.cs
@@ -1,17 +1,10 @@
-
using TechTalk.SpecFlow;
-
namespace OpenFeature.Contrib.Providers.Flagd.E2e.Test.Process
{
[Binding, Scope(Feature = "Flag evaluation")]
public class EvaluationStepDefinitionsRpc : EvaluationStepDefinitionsBase
{
- static EvaluationStepDefinitionsRpc()
- {
- var flagdProvider = new FlagdProvider();
- Api.Instance.SetProviderAsync("rpc-test-evaluation", flagdProvider).Wait(5000);
- }
public EvaluationStepDefinitionsRpc(ScenarioContext scenarioContext) : base(scenarioContext)
{
client = Api.Instance.GetClient("rpc-test-evaluation");
diff --git a/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/Steps/FlagdStepDefinitionsRpc.cs b/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/Steps/FlagdStepDefinitionsRpc.cs
index a1cf9b68..7547804c 100644
--- a/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/Steps/FlagdStepDefinitionsRpc.cs
+++ b/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/Steps/FlagdStepDefinitionsRpc.cs
@@ -1,7 +1,5 @@
-
using TechTalk.SpecFlow;
-
namespace OpenFeature.Contrib.Providers.Flagd.E2e.Test.Process
{
[Binding]
@@ -9,12 +7,6 @@ namespace OpenFeature.Contrib.Providers.Flagd.E2e.Test.Process
[Scope(Feature = "flagd json evaluation")]
public class FlagdStepDefinitionsRpc : FlagdStepDefinitionsBase
{
-
- static FlagdStepDefinitionsRpc()
- {
- var flagdProvider = new FlagdProvider();
- Api.Instance.SetProviderAsync("rpc-test-flagd", flagdProvider).Wait(5000);
- }
public FlagdStepDefinitionsRpc(ScenarioContext scenarioContext) : base(scenarioContext)
{
client = Api.Instance.GetClient("rpc-test-flagd");
diff --git a/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/Steps/TestHooks.cs b/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/Steps/TestHooks.cs
new file mode 100644
index 00000000..cc672974
--- /dev/null
+++ b/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/Steps/TestHooks.cs
@@ -0,0 +1,40 @@
+using System.Threading.Tasks;
+using TechTalk.SpecFlow;
+
+namespace OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest.Steps
+{
+ [Binding]
+ public class TestHooks
+ {
+ private static FlagdTestBedContainer _container;
+
+ [BeforeTestRun]
+ public static async Task StartContainerAsync()
+ {
+ _container = new FlagdTestBedContainer();
+
+ await _container.Container.StartAsync();
+
+ var port = _container.Container.GetMappedPublicPort(8013);
+
+ var flagdProvider = new FlagdProvider(
+ FlagdConfig.Builder()
+ .WithPort(port)
+ .WithResolverType(ResolverType.RPC)
+ .Build()
+ );
+
+ await Api.Instance.SetProviderAsync("rpc-test-evaluation", flagdProvider);
+ }
+
+ [AfterTestRun]
+ public static async Task StopContainerAsync()
+ {
+ if (_container != null)
+ {
+ await _container.Container.StopAsync();
+ await _container.Container.DisposeAsync();
+ }
+ }
+ }
+}
diff --git a/test/OpenFeature.Contrib.Providers.Flagd.E2e.Test/Steps/EvaluationStepDefinitionBase.cs b/test/OpenFeature.Contrib.Providers.Flagd.E2e.Test/Steps/EvaluationStepDefinitionBase.cs
index f14f67dc..d79fba34 100644
--- a/test/OpenFeature.Contrib.Providers.Flagd.E2e.Test/Steps/EvaluationStepDefinitionBase.cs
+++ b/test/OpenFeature.Contrib.Providers.Flagd.E2e.Test/Steps/EvaluationStepDefinitionBase.cs
@@ -38,7 +38,7 @@ public abstract class EvaluationStepDefinitionsBase
public EvaluationStepDefinitionsBase(ScenarioContext scenarioContext)
{
- Skip.If(Environment.GetEnvironmentVariable("E2E") != "true");
+ //Skip.If(Environment.GetEnvironmentVariable("E2E") != "true");
_scenarioContext = scenarioContext;
}
diff --git a/test/OpenFeature.Contrib.Providers.Flagd.E2e.Test/Steps/FlagdStepDefinitionBase.cs b/test/OpenFeature.Contrib.Providers.Flagd.E2e.Test/Steps/FlagdStepDefinitionBase.cs
index 5d9c3ddd..8c5d451b 100644
--- a/test/OpenFeature.Contrib.Providers.Flagd.E2e.Test/Steps/FlagdStepDefinitionBase.cs
+++ b/test/OpenFeature.Contrib.Providers.Flagd.E2e.Test/Steps/FlagdStepDefinitionBase.cs
@@ -26,7 +26,7 @@ public abstract class FlagdStepDefinitionsBase
public FlagdStepDefinitionsBase(ScenarioContext scenarioContext)
{
- Skip.If(Environment.GetEnvironmentVariable("E2E") != "true");
+ //Skip.If(Environment.GetEnvironmentVariable("E2E") != "true");
_scenarioContext = scenarioContext;
}
From da614ac9134579e47052e2d404c1dc7db6abe126 Mon Sep 17 00:00:00 2001
From: Kyle Julian <38759683+kylejuliandev@users.noreply.github.com>
Date: Wed, 16 Apr 2025 20:01:44 +0100
Subject: [PATCH 2/6] Tidy up test hooks and ensure hostname is pulled from
docker
Signed-off-by: Kyle Julian <38759683+kylejuliandev@users.noreply.github.com>
---
.../FlagdSyncTestBedContainer.cs | 1 -
.../Steps/TestHooks.cs | 2 ++
.../FlagdTestBedContainer.cs | 1 -
.../Steps/TestHooks.cs | 2 ++
4 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/FlagdSyncTestBedContainer.cs b/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/FlagdSyncTestBedContainer.cs
index 8f63872f..5aeee5d8 100644
--- a/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/FlagdSyncTestBedContainer.cs
+++ b/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/FlagdSyncTestBedContainer.cs
@@ -11,7 +11,6 @@ public FlagdSyncTestBedContainer()
{
Container = new ContainerBuilder()
.WithImage("ghcr.io/open-feature/sync-testbed:v0.5.6")
- .WithExposedPort(9090)
.WithPortBinding(9090, true)
.Build();
}
diff --git a/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/Steps/TestHooks.cs b/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/Steps/TestHooks.cs
index 37593ab7..55029d46 100644
--- a/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/Steps/TestHooks.cs
+++ b/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/Steps/TestHooks.cs
@@ -15,10 +15,12 @@ public static async Task StartContainerAsync()
await _container.Container.StartAsync();
+ var host = _container.Container.Hostname;
var port = _container.Container.GetMappedPublicPort(9090);
var flagdProvider = new FlagdProvider(
FlagdConfig.Builder()
+ .WithHost(host)
.WithPort(port)
.WithResolverType(ResolverType.IN_PROCESS)
.Build()
diff --git a/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/FlagdTestBedContainer.cs b/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/FlagdTestBedContainer.cs
index fad4ce7d..be4d4799 100644
--- a/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/FlagdTestBedContainer.cs
+++ b/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/FlagdTestBedContainer.cs
@@ -11,7 +11,6 @@ public FlagdTestBedContainer()
{
Container = new ContainerBuilder()
.WithImage("ghcr.io/open-feature/flagd-testbed:v0.5.21")
- .WithExposedPort(8013)
.WithPortBinding(8013, true)
.Build();
}
diff --git a/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/Steps/TestHooks.cs b/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/Steps/TestHooks.cs
index cc672974..6fa8b6f4 100644
--- a/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/Steps/TestHooks.cs
+++ b/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/Steps/TestHooks.cs
@@ -15,10 +15,12 @@ public static async Task StartContainerAsync()
await _container.Container.StartAsync();
+ var host = _container.Container.Hostname;
var port = _container.Container.GetMappedPublicPort(8013);
var flagdProvider = new FlagdProvider(
FlagdConfig.Builder()
+ .WithHost(host)
.WithPort(port)
.WithResolverType(ResolverType.RPC)
.Build()
From 38307eb7d6eb1b5b7bcad54c1645293dd869644c Mon Sep 17 00:00:00 2001
From: Kyle Julian <38759683+kylejuliandev@users.noreply.github.com>
Date: Wed, 16 Apr 2025 20:16:06 +0100
Subject: [PATCH 3/6] Refactor to ensure Provider is set in the same context as
client
Signed-off-by: Kyle Julian <38759683+kylejuliandev@users.noreply.github.com>
---
.../Steps/EvaluationStepDefinitionsProcess.cs | 19 +++++++++++++-
.../Steps/FlagdStepDefinitionsProcess.cs | 19 +++++++++++++-
.../Steps/TestHooks.cs | 25 +++++--------------
.../Steps/EvaluationStepDefinitionsRpc.cs | 18 ++++++++++++-
.../Steps/FlagdStepDefinitionsRpc.cs | 18 ++++++++++++-
.../Steps/TestHooks.cs | 25 +++++--------------
6 files changed, 82 insertions(+), 42 deletions(-)
diff --git a/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/Steps/EvaluationStepDefinitionsProcess.cs b/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/Steps/EvaluationStepDefinitionsProcess.cs
index ddb79559..4aab1f1d 100644
--- a/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/Steps/EvaluationStepDefinitionsProcess.cs
+++ b/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/Steps/EvaluationStepDefinitionsProcess.cs
@@ -1,10 +1,27 @@
+using OpenFeature.Contrib.Providers.Flagd.E2e.Test;
using TechTalk.SpecFlow;
-namespace OpenFeature.Contrib.Providers.Flagd.E2e.Test.Process
+namespace OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest.Steps
{
[Binding, Scope(Feature = "Flag evaluation")]
public class EvaluationStepDefinitionsProcess : EvaluationStepDefinitionsBase
{
+ static EvaluationStepDefinitionsProcess()
+ {
+ var host = TestHooks.FlagdSyncTestBed.Container.Hostname;
+ var port = TestHooks.FlagdSyncTestBed.Container.GetMappedPublicPort(9090);
+
+ var flagdProvider = new FlagdProvider(
+ FlagdConfig.Builder()
+ .WithHost(host)
+ .WithPort(port)
+ .WithResolverType(ResolverType.IN_PROCESS)
+ .Build()
+ );
+
+ Api.Instance.SetProviderAsync("process-test-evaluation", flagdProvider).Wait(5000);
+ }
+
public EvaluationStepDefinitionsProcess(ScenarioContext scenarioContext) : base(scenarioContext)
{
client = Api.Instance.GetClient("process-test-evaluation");
diff --git a/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/Steps/FlagdStepDefinitionsProcess.cs b/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/Steps/FlagdStepDefinitionsProcess.cs
index bd2d808d..f8dbf3ac 100644
--- a/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/Steps/FlagdStepDefinitionsProcess.cs
+++ b/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/Steps/FlagdStepDefinitionsProcess.cs
@@ -1,12 +1,29 @@
+using OpenFeature.Contrib.Providers.Flagd.E2e.Test;
using TechTalk.SpecFlow;
-namespace OpenFeature.Contrib.Providers.Flagd.E2e.Test.Process
+namespace OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest.Steps
{
[Binding]
[Scope(Feature = "flagd providers")]
[Scope(Feature = "flagd json evaluation")]
public class FlagdStepDefinitionsProcess : FlagdStepDefinitionsBase
{
+ static FlagdStepDefinitionsProcess()
+ {
+ var host = TestHooks.FlagdSyncTestBed.Container.Hostname;
+ var port = TestHooks.FlagdSyncTestBed.Container.GetMappedPublicPort(9090);
+
+ var flagdProvider = new FlagdProvider(
+ FlagdConfig.Builder()
+ .WithHost(host)
+ .WithPort(port)
+ .WithResolverType(ResolverType.IN_PROCESS)
+ .Build()
+ );
+
+ Api.Instance.SetProviderAsync("process-test-flagd", flagdProvider).Wait(5000);
+ }
+
public FlagdStepDefinitionsProcess(ScenarioContext scenarioContext) : base(scenarioContext)
{
client = Api.Instance.GetClient("process-test-flagd");
diff --git a/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/Steps/TestHooks.cs b/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/Steps/TestHooks.cs
index 55029d46..ac7b7503 100644
--- a/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/Steps/TestHooks.cs
+++ b/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/Steps/TestHooks.cs
@@ -6,36 +6,23 @@ namespace OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest.Steps
[Binding]
public class TestHooks
{
- private static FlagdSyncTestBedContainer _container;
+ public static FlagdSyncTestBedContainer FlagdSyncTestBed { get; private set; }
[BeforeTestRun]
public static async Task StartContainerAsync()
{
- _container = new FlagdSyncTestBedContainer();
+ FlagdSyncTestBed = new FlagdSyncTestBedContainer();
- await _container.Container.StartAsync();
-
- var host = _container.Container.Hostname;
- var port = _container.Container.GetMappedPublicPort(9090);
-
- var flagdProvider = new FlagdProvider(
- FlagdConfig.Builder()
- .WithHost(host)
- .WithPort(port)
- .WithResolverType(ResolverType.IN_PROCESS)
- .Build()
- );
-
- Api.Instance.SetProviderAsync("process-test-flagd", flagdProvider).Wait(500);
+ await FlagdSyncTestBed.Container.StartAsync();
}
[AfterTestRun]
public static async Task StopContainerAsync()
{
- if (_container != null)
+ if (FlagdSyncTestBed != null)
{
- await _container.Container.StopAsync();
- await _container.Container.DisposeAsync();
+ await FlagdSyncTestBed.Container.StopAsync();
+ await FlagdSyncTestBed.Container.DisposeAsync();
}
}
}
diff --git a/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/Steps/EvaluationStepDefinitionsRpc.cs b/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/Steps/EvaluationStepDefinitionsRpc.cs
index 4555ae27..0e7e5e62 100644
--- a/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/Steps/EvaluationStepDefinitionsRpc.cs
+++ b/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/Steps/EvaluationStepDefinitionsRpc.cs
@@ -1,10 +1,26 @@
+using OpenFeature.Contrib.Providers.Flagd.E2e.Test;
using TechTalk.SpecFlow;
-namespace OpenFeature.Contrib.Providers.Flagd.E2e.Test.Process
+namespace OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest.Steps
{
[Binding, Scope(Feature = "Flag evaluation")]
public class EvaluationStepDefinitionsRpc : EvaluationStepDefinitionsBase
{
+ static EvaluationStepDefinitionsRpc()
+ {
+ var host = TestHooks.FlagdTestBed.Container.Hostname;
+ var port = TestHooks.FlagdTestBed.Container.GetMappedPublicPort(8013);
+
+ var flagdProvider = new FlagdProvider(
+ FlagdConfig.Builder()
+ .WithHost(host)
+ .WithPort(port)
+ .Build()
+ );
+
+ Api.Instance.SetProviderAsync("rpc-test-evaluation", flagdProvider).Wait(5000);
+ }
+
public EvaluationStepDefinitionsRpc(ScenarioContext scenarioContext) : base(scenarioContext)
{
client = Api.Instance.GetClient("rpc-test-evaluation");
diff --git a/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/Steps/FlagdStepDefinitionsRpc.cs b/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/Steps/FlagdStepDefinitionsRpc.cs
index 7547804c..831221ce 100644
--- a/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/Steps/FlagdStepDefinitionsRpc.cs
+++ b/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/Steps/FlagdStepDefinitionsRpc.cs
@@ -1,12 +1,28 @@
+using OpenFeature.Contrib.Providers.Flagd.E2e.Test;
using TechTalk.SpecFlow;
-namespace OpenFeature.Contrib.Providers.Flagd.E2e.Test.Process
+namespace OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest.Steps
{
[Binding]
[Scope(Feature = "flagd providers")]
[Scope(Feature = "flagd json evaluation")]
public class FlagdStepDefinitionsRpc : FlagdStepDefinitionsBase
{
+ static FlagdStepDefinitionsRpc()
+ {
+ var host = TestHooks.FlagdTestBed.Container.Hostname;
+ var port = TestHooks.FlagdTestBed.Container.GetMappedPublicPort(8013);
+
+ var flagdProvider = new FlagdProvider(
+ FlagdConfig.Builder()
+ .WithHost(host)
+ .WithPort(port)
+ .Build()
+ );
+
+ Api.Instance.SetProviderAsync("rpc-test-flagd", flagdProvider).Wait(5000);
+ }
+
public FlagdStepDefinitionsRpc(ScenarioContext scenarioContext) : base(scenarioContext)
{
client = Api.Instance.GetClient("rpc-test-flagd");
diff --git a/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/Steps/TestHooks.cs b/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/Steps/TestHooks.cs
index 6fa8b6f4..11261ba6 100644
--- a/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/Steps/TestHooks.cs
+++ b/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/Steps/TestHooks.cs
@@ -6,36 +6,23 @@ namespace OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest.Steps
[Binding]
public class TestHooks
{
- private static FlagdTestBedContainer _container;
+ public static FlagdTestBedContainer FlagdTestBed { get; private set; }
[BeforeTestRun]
public static async Task StartContainerAsync()
{
- _container = new FlagdTestBedContainer();
+ FlagdTestBed = new FlagdTestBedContainer();
- await _container.Container.StartAsync();
-
- var host = _container.Container.Hostname;
- var port = _container.Container.GetMappedPublicPort(8013);
-
- var flagdProvider = new FlagdProvider(
- FlagdConfig.Builder()
- .WithHost(host)
- .WithPort(port)
- .WithResolverType(ResolverType.RPC)
- .Build()
- );
-
- await Api.Instance.SetProviderAsync("rpc-test-evaluation", flagdProvider);
+ await FlagdTestBed.Container.StartAsync();
}
[AfterTestRun]
public static async Task StopContainerAsync()
{
- if (_container != null)
+ if (FlagdTestBed != null)
{
- await _container.Container.StopAsync();
- await _container.Container.DisposeAsync();
+ await FlagdTestBed.Container.StopAsync();
+ await FlagdTestBed.Container.DisposeAsync();
}
}
}
From 21edab47feb03276b65bea89ba60ecb9b11f3b40 Mon Sep 17 00:00:00 2001
From: Kyle Julian <38759683+kylejuliandev@users.noreply.github.com>
Date: Wed, 16 Apr 2025 20:17:02 +0100
Subject: [PATCH 4/6] Ensure E2E skip is enabled for Flagd tests
Signed-off-by: Kyle Julian <38759683+kylejuliandev@users.noreply.github.com>
---
.../Steps/EvaluationStepDefinitionBase.cs | 2 +-
.../Steps/FlagdStepDefinitionBase.cs | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/test/OpenFeature.Contrib.Providers.Flagd.E2e.Test/Steps/EvaluationStepDefinitionBase.cs b/test/OpenFeature.Contrib.Providers.Flagd.E2e.Test/Steps/EvaluationStepDefinitionBase.cs
index d79fba34..f14f67dc 100644
--- a/test/OpenFeature.Contrib.Providers.Flagd.E2e.Test/Steps/EvaluationStepDefinitionBase.cs
+++ b/test/OpenFeature.Contrib.Providers.Flagd.E2e.Test/Steps/EvaluationStepDefinitionBase.cs
@@ -38,7 +38,7 @@ public abstract class EvaluationStepDefinitionsBase
public EvaluationStepDefinitionsBase(ScenarioContext scenarioContext)
{
- //Skip.If(Environment.GetEnvironmentVariable("E2E") != "true");
+ Skip.If(Environment.GetEnvironmentVariable("E2E") != "true");
_scenarioContext = scenarioContext;
}
diff --git a/test/OpenFeature.Contrib.Providers.Flagd.E2e.Test/Steps/FlagdStepDefinitionBase.cs b/test/OpenFeature.Contrib.Providers.Flagd.E2e.Test/Steps/FlagdStepDefinitionBase.cs
index 8c5d451b..5d9c3ddd 100644
--- a/test/OpenFeature.Contrib.Providers.Flagd.E2e.Test/Steps/FlagdStepDefinitionBase.cs
+++ b/test/OpenFeature.Contrib.Providers.Flagd.E2e.Test/Steps/FlagdStepDefinitionBase.cs
@@ -26,7 +26,7 @@ public abstract class FlagdStepDefinitionsBase
public FlagdStepDefinitionsBase(ScenarioContext scenarioContext)
{
- //Skip.If(Environment.GetEnvironmentVariable("E2E") != "true");
+ Skip.If(Environment.GetEnvironmentVariable("E2E") != "true");
_scenarioContext = scenarioContext;
}
From ee25cfadec2b82d712cf3550eaf1dbccfbebd6fa Mon Sep 17 00:00:00 2001
From: Kyle Julian <38759683+kylejuliandev@users.noreply.github.com>
Date: Wed, 16 Apr 2025 20:23:38 +0100
Subject: [PATCH 5/6] Remove services in e2e ci pipeline
Signed-off-by: Kyle Julian <38759683+kylejuliandev@users.noreply.github.com>
---
.github/workflows/ci.yml | 11 -----------
1 file changed, 11 deletions(-)
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 4274b3eb..55ee00b1 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -44,17 +44,6 @@ jobs:
e2e:
runs-on: ubuntu-latest
- services:
- # flagd-testbed for flagd RPC provider e2e tests
- flagd:
- image: ghcr.io/open-feature/flagd-testbed:v0.5.21
- ports:
- - 8013:8013
- # sync-testbed for flagd in-process provider e2e tests
- sync:
- image: ghcr.io/open-feature/sync-testbed:v0.5.6
- ports:
- - 9090:9090
steps:
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4
From f5145b2fe43bb6791a1a8a9cbcf23a42f8ac7fcb Mon Sep 17 00:00:00 2001
From: Todd Baert
Date: Mon, 21 Apr 2025 10:02:55 -0400
Subject: [PATCH 6/6] fixup: dont use sync-testbed
Signed-off-by: Todd Baert
---
.../docker-compose.yaml | 17 -----------------
.../FlagdSyncTestBedContainer.cs | 4 ++--
.../Steps/EvaluationStepDefinitionsProcess.cs | 2 +-
.../Steps/FlagdStepDefinitionsProcess.cs | 2 +-
...Container.cs => FlagdRpcTestBedContainer.cs} | 4 ++--
.../Steps/TestHooks.cs | 4 ++--
6 files changed, 8 insertions(+), 25 deletions(-)
delete mode 100644 src/OpenFeature.Contrib.Providers.Flagd/docker-compose.yaml
rename test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/{FlagdTestBedContainer.cs => FlagdRpcTestBedContainer.cs} (83%)
diff --git a/src/OpenFeature.Contrib.Providers.Flagd/docker-compose.yaml b/src/OpenFeature.Contrib.Providers.Flagd/docker-compose.yaml
deleted file mode 100644
index 061d89fa..00000000
--- a/src/OpenFeature.Contrib.Providers.Flagd/docker-compose.yaml
+++ /dev/null
@@ -1,17 +0,0 @@
-services:
- flagd:
- image: ghcr.io/open-feature/flagd-testbed:v0.5.21
- ports:
- - 8013:8013
- flagd-unstable:
- image: ghcr.io/open-feature/flagd-testbed-unstable:v1.1.1
- ports:
- - 8014:8013
- flagd-sync:
- image: ghcr.io/open-feature/sync-testbed:v0.5.6
- ports:
- - 9090:9090
- flagd-sync-unstable:
- image: ghcr.io/open-feature/sync-testbed-unstable:v0.5.13
- ports:
- - 9091:9090
\ No newline at end of file
diff --git a/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/FlagdSyncTestBedContainer.cs b/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/FlagdSyncTestBedContainer.cs
index 5aeee5d8..d5a7be03 100644
--- a/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/FlagdSyncTestBedContainer.cs
+++ b/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/FlagdSyncTestBedContainer.cs
@@ -10,8 +10,8 @@ public class FlagdSyncTestBedContainer
public FlagdSyncTestBedContainer()
{
Container = new ContainerBuilder()
- .WithImage("ghcr.io/open-feature/sync-testbed:v0.5.6")
- .WithPortBinding(9090, true)
+ .WithImage("ghcr.io/open-feature/flagd-testbed:v0.5.21")
+ .WithPortBinding(8015, true)
.Build();
}
}
diff --git a/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/Steps/EvaluationStepDefinitionsProcess.cs b/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/Steps/EvaluationStepDefinitionsProcess.cs
index 4aab1f1d..6863aef4 100644
--- a/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/Steps/EvaluationStepDefinitionsProcess.cs
+++ b/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/Steps/EvaluationStepDefinitionsProcess.cs
@@ -9,7 +9,7 @@ public class EvaluationStepDefinitionsProcess : EvaluationStepDefinitionsBase
static EvaluationStepDefinitionsProcess()
{
var host = TestHooks.FlagdSyncTestBed.Container.Hostname;
- var port = TestHooks.FlagdSyncTestBed.Container.GetMappedPublicPort(9090);
+ var port = TestHooks.FlagdSyncTestBed.Container.GetMappedPublicPort(8015);
var flagdProvider = new FlagdProvider(
FlagdConfig.Builder()
diff --git a/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/Steps/FlagdStepDefinitionsProcess.cs b/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/Steps/FlagdStepDefinitionsProcess.cs
index f8dbf3ac..7dc81276 100644
--- a/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/Steps/FlagdStepDefinitionsProcess.cs
+++ b/test/OpenFeature.Contrib.Providers.Flagd.E2e.ProcessTest/Steps/FlagdStepDefinitionsProcess.cs
@@ -11,7 +11,7 @@ public class FlagdStepDefinitionsProcess : FlagdStepDefinitionsBase
static FlagdStepDefinitionsProcess()
{
var host = TestHooks.FlagdSyncTestBed.Container.Hostname;
- var port = TestHooks.FlagdSyncTestBed.Container.GetMappedPublicPort(9090);
+ var port = TestHooks.FlagdSyncTestBed.Container.GetMappedPublicPort(8015);
var flagdProvider = new FlagdProvider(
FlagdConfig.Builder()
diff --git a/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/FlagdTestBedContainer.cs b/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/FlagdRpcTestBedContainer.cs
similarity index 83%
rename from test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/FlagdTestBedContainer.cs
rename to test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/FlagdRpcTestBedContainer.cs
index be4d4799..7f3e3565 100644
--- a/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/FlagdTestBedContainer.cs
+++ b/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/FlagdRpcTestBedContainer.cs
@@ -3,11 +3,11 @@
namespace OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest
{
- public class FlagdTestBedContainer
+ public class FlagdRpcTestBedContainer
{
public IContainer Container { get; }
- public FlagdTestBedContainer()
+ public FlagdRpcTestBedContainer()
{
Container = new ContainerBuilder()
.WithImage("ghcr.io/open-feature/flagd-testbed:v0.5.21")
diff --git a/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/Steps/TestHooks.cs b/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/Steps/TestHooks.cs
index 11261ba6..ed1a3a99 100644
--- a/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/Steps/TestHooks.cs
+++ b/test/OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest/Steps/TestHooks.cs
@@ -6,12 +6,12 @@ namespace OpenFeature.Contrib.Providers.Flagd.E2e.RpcTest.Steps
[Binding]
public class TestHooks
{
- public static FlagdTestBedContainer FlagdTestBed { get; private set; }
+ public static FlagdRpcTestBedContainer FlagdTestBed { get; private set; }
[BeforeTestRun]
public static async Task StartContainerAsync()
{
- FlagdTestBed = new FlagdTestBedContainer();
+ FlagdTestBed = new FlagdRpcTestBedContainer();
await FlagdTestBed.Container.StartAsync();
}