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(); }