From 38a8bd4ad39749760c509ff4e0a177e398d3ad7b Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Wed, 17 Jan 2024 16:01:52 -0500 Subject: [PATCH 01/21] chore: revert breaking setProvider Signed-off-by: Todd Baert --- src/OpenFeature/Api.cs | 30 +++++++++- .../Steps/EvaluationStepDefinitions.cs | 2 +- .../ClearOpenFeatureInstanceFixture.cs | 2 +- .../OpenFeatureClientTests.cs | 22 +++---- .../OpenFeatureEventTests.cs | 59 +++++++++++++------ .../OpenFeature.Tests/OpenFeatureHookTests.cs | 18 +++--- test/OpenFeature.Tests/OpenFeatureTests.cs | 36 +++++------ 7 files changed, 109 insertions(+), 60 deletions(-) diff --git a/src/OpenFeature/Api.cs b/src/OpenFeature/Api.cs index 440242da..fffc14cc 100644 --- a/src/OpenFeature/Api.cs +++ b/src/OpenFeature/Api.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; @@ -38,17 +39,40 @@ static Api() { } private Api() { } /// - /// Sets the feature provider. In order to wait for the provider to be set, and initialization to complete, + /// Sets the default feature provider to given clientName without awaiting its initialization. + /// + /// The provider cannot be set to null. Attempting to set the provider to null has no effect. + /// Implementation of + [Obsolete("Will be removed in later versions; use SetProviderAsync, which can be awaited")] + public void SetProvider(FeatureProvider featureProvider) + { + this.EventExecutor.RegisterDefaultFeatureProvider(featureProvider); + this._repository.SetProvider(featureProvider, this.GetContext()).ConfigureAwait(false); + } + + /// + /// Sets the default feature provider. In order to wait for the provider to be set, and initialization to complete, /// await the returned task. /// /// The provider cannot be set to null. Attempting to set the provider to null has no effect. /// Implementation of - public async Task SetProvider(FeatureProvider featureProvider) + public async Task SetProviderAsync(FeatureProvider featureProvider) { this.EventExecutor.RegisterDefaultFeatureProvider(featureProvider); await this._repository.SetProvider(featureProvider, this.GetContext()).ConfigureAwait(false); } + /// + /// Sets the feature provider to given clientName without awaiting its initialization. + /// + /// Name of client + /// Implementation of + [Obsolete("Will be removed in later versions; use SetProviderAsync, which can be awaited")] + public void SetProvider(string clientName, FeatureProvider featureProvider) + { + this.EventExecutor.RegisterClientFeatureProvider(clientName, featureProvider); + this._repository.SetProvider(clientName, featureProvider, this.GetContext()).ConfigureAwait(false); + } /// /// Sets the feature provider to given clientName. In order to wait for the provider to be set, and @@ -56,7 +80,7 @@ public async Task SetProvider(FeatureProvider featureProvider) /// /// Name of client /// Implementation of - public async Task SetProvider(string clientName, FeatureProvider featureProvider) + public async Task SetProviderAsync(string clientName, FeatureProvider featureProvider) { this.EventExecutor.RegisterClientFeatureProvider(clientName, featureProvider); await this._repository.SetProvider(clientName, featureProvider, this.GetContext()).ConfigureAwait(false); diff --git a/test/OpenFeature.E2ETests/Steps/EvaluationStepDefinitions.cs b/test/OpenFeature.E2ETests/Steps/EvaluationStepDefinitions.cs index 4847bfb2..d2cd483d 100644 --- a/test/OpenFeature.E2ETests/Steps/EvaluationStepDefinitions.cs +++ b/test/OpenFeature.E2ETests/Steps/EvaluationStepDefinitions.cs @@ -42,7 +42,7 @@ public EvaluationStepDefinitions(ScenarioContext scenarioContext) { _scenarioContext = scenarioContext; var flagdProvider = new FlagdProvider(); - Api.Instance.SetProvider(flagdProvider).Wait(); + Api.Instance.SetProviderAsync(flagdProvider).Wait(); client = Api.Instance.GetClient(); } diff --git a/test/OpenFeature.Tests/ClearOpenFeatureInstanceFixture.cs b/test/OpenFeature.Tests/ClearOpenFeatureInstanceFixture.cs index a70921f7..5f31c71a 100644 --- a/test/OpenFeature.Tests/ClearOpenFeatureInstanceFixture.cs +++ b/test/OpenFeature.Tests/ClearOpenFeatureInstanceFixture.cs @@ -7,7 +7,7 @@ public ClearOpenFeatureInstanceFixture() { Api.Instance.SetContext(null); Api.Instance.ClearHooks(); - Api.Instance.SetProvider(new NoOpFeatureProvider()).Wait(); + Api.Instance.SetProviderAsync(new NoOpFeatureProvider()).Wait(); } } } diff --git a/test/OpenFeature.Tests/OpenFeatureClientTests.cs b/test/OpenFeature.Tests/OpenFeatureClientTests.cs index 30bee168..86c61f83 100644 --- a/test/OpenFeature.Tests/OpenFeatureClientTests.cs +++ b/test/OpenFeature.Tests/OpenFeatureClientTests.cs @@ -75,7 +75,7 @@ public async Task OpenFeatureClient_Should_Allow_Flag_Evaluation() var defaultStructureValue = fixture.Create(); var emptyFlagOptions = new FlagEvaluationOptions(ImmutableList.Empty, ImmutableDictionary.Empty); - await Api.Instance.SetProvider(new NoOpFeatureProvider()); + await Api.Instance.SetProviderAsync(new NoOpFeatureProvider()); var client = Api.Instance.GetClient(clientName, clientVersion); (await client.GetBooleanValue(flagName, defaultBoolValue)).Should().Be(defaultBoolValue); @@ -121,7 +121,7 @@ public async Task OpenFeatureClient_Should_Allow_Details_Flag_Evaluation() var defaultStructureValue = fixture.Create(); var emptyFlagOptions = new FlagEvaluationOptions(ImmutableList.Empty, ImmutableDictionary.Empty); - await Api.Instance.SetProvider(new NoOpFeatureProvider()); + await Api.Instance.SetProviderAsync(new NoOpFeatureProvider()); var client = Api.Instance.GetClient(clientName, clientVersion); var boolFlagEvaluationDetails = new FlagEvaluationDetails(flagName, defaultBoolValue, ErrorType.None, NoOpProvider.ReasonNoOp, NoOpProvider.Variant); @@ -172,7 +172,7 @@ public async Task OpenFeatureClient_Should_Return_DefaultValue_When_Type_Mismatc mockedFeatureProvider.GetMetadata().Returns(new Metadata(fixture.Create())); mockedFeatureProvider.GetProviderHooks().Returns(ImmutableList.Empty); - await Api.Instance.SetProvider(mockedFeatureProvider); + await Api.Instance.SetProviderAsync(mockedFeatureProvider); var client = Api.Instance.GetClient(clientName, clientVersion, mockedLogger); var evaluationDetails = await client.GetObjectDetails(flagName, defaultValue); @@ -202,7 +202,7 @@ public async Task Should_Resolve_BooleanValue() featureProviderMock.GetMetadata().Returns(new Metadata(fixture.Create())); featureProviderMock.GetProviderHooks().Returns(ImmutableList.Empty); - await Api.Instance.SetProvider(featureProviderMock); + await Api.Instance.SetProviderAsync(featureProviderMock); var client = Api.Instance.GetClient(clientName, clientVersion); (await client.GetBooleanValue(flagName, defaultValue)).Should().Be(defaultValue); @@ -224,7 +224,7 @@ public async Task Should_Resolve_StringValue() featureProviderMock.GetMetadata().Returns(new Metadata(fixture.Create())); featureProviderMock.GetProviderHooks().Returns(ImmutableList.Empty); - await Api.Instance.SetProvider(featureProviderMock); + await Api.Instance.SetProviderAsync(featureProviderMock); var client = Api.Instance.GetClient(clientName, clientVersion); (await client.GetStringValue(flagName, defaultValue)).Should().Be(defaultValue); @@ -246,7 +246,7 @@ public async Task Should_Resolve_IntegerValue() featureProviderMock.GetMetadata().Returns(new Metadata(fixture.Create())); featureProviderMock.GetProviderHooks().Returns(ImmutableList.Empty); - await Api.Instance.SetProvider(featureProviderMock); + await Api.Instance.SetProviderAsync(featureProviderMock); var client = Api.Instance.GetClient(clientName, clientVersion); (await client.GetIntegerValue(flagName, defaultValue)).Should().Be(defaultValue); @@ -268,7 +268,7 @@ public async Task Should_Resolve_DoubleValue() featureProviderMock.GetMetadata().Returns(new Metadata(fixture.Create())); featureProviderMock.GetProviderHooks().Returns(ImmutableList.Empty); - await Api.Instance.SetProvider(featureProviderMock); + await Api.Instance.SetProviderAsync(featureProviderMock); var client = Api.Instance.GetClient(clientName, clientVersion); (await client.GetDoubleValue(flagName, defaultValue)).Should().Be(defaultValue); @@ -290,7 +290,7 @@ public async Task Should_Resolve_StructureValue() featureProviderMock.GetMetadata().Returns(new Metadata(fixture.Create())); featureProviderMock.GetProviderHooks().Returns(ImmutableList.Empty); - await Api.Instance.SetProvider(featureProviderMock); + await Api.Instance.SetProviderAsync(featureProviderMock); var client = Api.Instance.GetClient(clientName, clientVersion); (await client.GetObjectValue(flagName, defaultValue)).Should().Be(defaultValue); @@ -313,7 +313,7 @@ public async Task When_Error_Is_Returned_From_Provider_Should_Return_Error() featureProviderMock.GetMetadata().Returns(new Metadata(fixture.Create())); featureProviderMock.GetProviderHooks().Returns(ImmutableList.Empty); - await Api.Instance.SetProvider(featureProviderMock); + await Api.Instance.SetProviderAsync(featureProviderMock); var client = Api.Instance.GetClient(clientName, clientVersion); var response = await client.GetObjectDetails(flagName, defaultValue); @@ -338,7 +338,7 @@ public async Task When_Exception_Occurs_During_Evaluation_Should_Return_Error() featureProviderMock.GetMetadata().Returns(new Metadata(fixture.Create())); featureProviderMock.GetProviderHooks().Returns(ImmutableList.Empty); - await Api.Instance.SetProvider(featureProviderMock); + await Api.Instance.SetProviderAsync(featureProviderMock); var client = Api.Instance.GetClient(clientName, clientVersion); var response = await client.GetObjectDetails(flagName, defaultValue); @@ -351,7 +351,7 @@ public async Task When_Exception_Occurs_During_Evaluation_Should_Return_Error() [Fact] public async Task Should_Use_No_Op_When_Provider_Is_Null() { - await Api.Instance.SetProvider(null); + await Api.Instance.SetProviderAsync(null); var client = new FeatureClient("test", "test"); (await client.GetIntegerValue("some-key", 12)).Should().Be(12); } diff --git a/test/OpenFeature.Tests/OpenFeatureEventTests.cs b/test/OpenFeature.Tests/OpenFeatureEventTests.cs index 8c183e63..ed5fb85d 100644 --- a/test/OpenFeature.Tests/OpenFeatureEventTests.cs +++ b/test/OpenFeature.Tests/OpenFeatureEventTests.cs @@ -70,7 +70,7 @@ public async Task API_Level_Event_Handlers_Should_Be_Registered() Api.Instance.AddHandler(ProviderEventTypes.ProviderStale, eventHandler); var testProvider = new TestProvider(); - await Api.Instance.SetProvider(testProvider); + await Api.Instance.SetProviderAsync(testProvider); testProvider.SendEvent(ProviderEventTypes.ProviderConfigurationChanged); testProvider.SendEvent(ProviderEventTypes.ProviderError); @@ -118,7 +118,32 @@ public async Task API_Level_Event_Handlers_Should_Be_Informed_About_Ready_State_ var eventHandler = Substitute.For(); var testProvider = new TestProvider(); - await Api.Instance.SetProvider(testProvider); + await Api.Instance.SetProviderAsync(testProvider); + + Api.Instance.AddHandler(ProviderEventTypes.ProviderReady, eventHandler); + + Thread.Sleep(1000); + eventHandler + .Received() + .Invoke( + Arg.Is( + payload => payload.ProviderName == testProvider.GetMetadata().Name && payload.Type == ProviderEventTypes.ProviderReady + )); + } + + [Fact] + [Specification("5.1.2", "When a `provider` signals the occurrence of a particular `event`, the associated `client` and `API` event handlers MUST run.")] + [Specification("5.2.2", "The `API` MUST provide a function for associating `handler functions` with a particular `provider event type`.")] + [Specification("5.2.3", "The `event details` MUST contain the `provider name` associated with the event.")] + [Specification("5.2.4", "The `handler function` MUST accept a `event details` parameter.")] + [Specification("5.3.1", "If the provider's `initialize` function terminates normally, `PROVIDER_READY` handlers MUST run.")] + [Specification("5.3.3", "Handlers attached after the provider is already in the associated state, MUST run immediately.")] + public void API_Level_Event_Handlers_Should_Be_Informed_About_Ready_State_After_Registering_Provider_Ready_Sync() + { + var eventHandler = Substitute.For(); + + var testProvider = new TestProvider(); + Api.Instance.SetProvider(testProvider); Api.Instance.AddHandler(ProviderEventTypes.ProviderReady, eventHandler); @@ -143,7 +168,7 @@ public async Task API_Level_Event_Handlers_Should_Be_Informed_About_Error_State_ var eventHandler = Substitute.For(); var testProvider = new TestProvider(); - await Api.Instance.SetProvider(testProvider); + await Api.Instance.SetProviderAsync(testProvider); testProvider.SetStatus(ProviderStatus.Error); @@ -169,7 +194,7 @@ public async Task API_Level_Event_Handlers_Should_Be_Informed_About_Stale_State_ var eventHandler = Substitute.For(); var testProvider = new TestProvider(); - await Api.Instance.SetProvider(testProvider); + await Api.Instance.SetProviderAsync(testProvider); testProvider.SetStatus(ProviderStatus.Stale); @@ -198,12 +223,12 @@ public async Task API_Level_Event_Handlers_Should_Be_Exchangeable() Api.Instance.AddHandler(ProviderEventTypes.ProviderConfigurationChanged, eventHandler); var testProvider = new TestProvider(); - await Api.Instance.SetProvider(testProvider); + await Api.Instance.SetProviderAsync(testProvider); testProvider.SendEvent(ProviderEventTypes.ProviderConfigurationChanged); var newTestProvider = new TestProvider(); - await Api.Instance.SetProvider(newTestProvider); + await Api.Instance.SetProviderAsync(newTestProvider); newTestProvider.SendEvent(ProviderEventTypes.ProviderConfigurationChanged); @@ -224,13 +249,13 @@ public async Task API_Level_Event_Handlers_Should_Be_Removable() Api.Instance.AddHandler(ProviderEventTypes.ProviderReady, eventHandler); var testProvider = new TestProvider(); - await Api.Instance.SetProvider(testProvider); + await Api.Instance.SetProviderAsync(testProvider); Thread.Sleep(1000); Api.Instance.RemoveHandler(ProviderEventTypes.ProviderReady, eventHandler); var newTestProvider = new TestProvider(); - await Api.Instance.SetProvider(newTestProvider); + await Api.Instance.SetProviderAsync(newTestProvider); eventHandler.Received(1).Invoke(Arg.Is(payload => payload.ProviderName == testProvider.GetMetadata().Name)); } @@ -255,7 +280,7 @@ public async Task API_Level_Event_Handlers_Should_Be_Executed_When_Other_Handler Api.Instance.AddHandler(ProviderEventTypes.ProviderReady, eventHandler); var testProvider = new TestProvider(fixture.Create()); - await Api.Instance.SetProvider(testProvider); + await Api.Instance.SetProviderAsync(testProvider); failingEventHandler.Received().Invoke(Arg.Is(payload => payload.ProviderName == testProvider.GetMetadata().Name)); eventHandler.Received().Invoke(Arg.Is(payload => payload.ProviderName == testProvider.GetMetadata().Name)); @@ -274,7 +299,7 @@ public async Task Client_Level_Event_Handlers_Should_Be_Registered() var myClient = Api.Instance.GetClient(fixture.Create()); var testProvider = new TestProvider(); - await Api.Instance.SetProvider(myClient.GetMetadata().Name, testProvider); + await Api.Instance.SetProviderAsync(myClient.GetMetadata().Name, testProvider); myClient.AddHandler(ProviderEventTypes.ProviderReady, eventHandler); @@ -303,7 +328,7 @@ public async Task Client_Level_Event_Handlers_Should_Be_Executed_When_Other_Hand myClient.AddHandler(ProviderEventTypes.ProviderReady, eventHandler); var testProvider = new TestProvider(); - await Api.Instance.SetProvider(myClient.GetMetadata().Name, testProvider); + await Api.Instance.SetProviderAsync(myClient.GetMetadata().Name, testProvider); Thread.Sleep(1000); @@ -330,9 +355,9 @@ public async Task Client_Level_Event_Handlers_Should_Be_Registered_To_Default_Pr var clientProvider = new TestProvider(fixture.Create()); // set the default provider on API level, but not specifically to the client - await Api.Instance.SetProvider(apiProvider); + await Api.Instance.SetProviderAsync(apiProvider); // set the other provider specifically for the client - await Api.Instance.SetProvider(myClientWithBoundProvider.GetMetadata().Name, clientProvider); + await Api.Instance.SetProviderAsync(myClientWithBoundProvider.GetMetadata().Name, clientProvider); myClientWithNoBoundProvider.AddHandler(ProviderEventTypes.ProviderReady, eventHandler); myClientWithBoundProvider.AddHandler(ProviderEventTypes.ProviderReady, clientEventHandler); @@ -362,7 +387,7 @@ public async Task Client_Level_Event_Handlers_Should_Be_Receive_Events_From_Name var clientProvider = new TestProvider(fixture.Create()); // set the default provider - await Api.Instance.SetProvider(defaultProvider); + await Api.Instance.SetProviderAsync(defaultProvider); client.AddHandler(ProviderEventTypes.ProviderConfigurationChanged, clientEventHandler); @@ -374,7 +399,7 @@ public async Task Client_Level_Event_Handlers_Should_Be_Receive_Events_From_Name clientEventHandler.Received(1).Invoke(Arg.Is(payload => payload.ProviderName == defaultProvider.GetMetadata().Name && payload.Type == ProviderEventTypes.ProviderConfigurationChanged)); // set the other provider specifically for the client - await Api.Instance.SetProvider(client.GetMetadata().Name, clientProvider); + await Api.Instance.SetProviderAsync(client.GetMetadata().Name, clientProvider); // now, send another event for the default handler defaultProvider.SendEvent(ProviderEventTypes.ProviderConfigurationChanged); @@ -403,7 +428,7 @@ public async Task Client_Level_Event_Handlers_Should_Be_Informed_About_Ready_Sta var myClient = Api.Instance.GetClient(fixture.Create()); var testProvider = new TestProvider(); - await Api.Instance.SetProvider(myClient.GetMetadata().Name, testProvider); + await Api.Instance.SetProviderAsync(myClient.GetMetadata().Name, testProvider); // add the event handler after the provider has already transitioned into the ready state myClient.AddHandler(ProviderEventTypes.ProviderReady, eventHandler); @@ -428,7 +453,7 @@ public async Task Client_Level_Event_Handlers_Should_Be_Removable() myClient.AddHandler(ProviderEventTypes.ProviderReady, eventHandler); var testProvider = new TestProvider(); - await Api.Instance.SetProvider(myClient.GetMetadata().Name, testProvider); + await Api.Instance.SetProviderAsync(myClient.GetMetadata().Name, testProvider); // wait for the first event to be received Thread.Sleep(1000); diff --git a/test/OpenFeature.Tests/OpenFeatureHookTests.cs b/test/OpenFeature.Tests/OpenFeatureHookTests.cs index b3aee4d8..b4cb958c 100644 --- a/test/OpenFeature.Tests/OpenFeatureHookTests.cs +++ b/test/OpenFeature.Tests/OpenFeatureHookTests.cs @@ -51,7 +51,7 @@ public async Task Hooks_Should_Be_Called_In_Order() var testProvider = new TestProvider(); testProvider.AddHook(providerHook); Api.Instance.AddHooks(apiHook); - await Api.Instance.SetProvider(testProvider); + await Api.Instance.SetProviderAsync(testProvider); var client = Api.Instance.GetClient(clientName, clientVersion); client.AddHooks(clientHook); @@ -197,7 +197,7 @@ public async Task Evaluation_Context_Must_Be_Merged_In_Correct_Order() provider.ResolveBooleanValue(Arg.Any(), Arg.Any(), Arg.Any()).Returns(new ResolutionDetails("test", true)); - await Api.Instance.SetProvider(provider); + await Api.Instance.SetProviderAsync(provider); var hook = Substitute.For(); hook.Before(Arg.Any>(), Arg.Any>()).Returns(hookContext); @@ -269,7 +269,7 @@ public async Task Hook_Should_Execute_In_Correct_Order() _ = hook.After(Arg.Any>(), Arg.Any>(), Arg.Any>()); _ = hook.Finally(Arg.Any>(), Arg.Any>()); - await Api.Instance.SetProvider(featureProvider); + await Api.Instance.SetProviderAsync(featureProvider); var client = Api.Instance.GetClient(); client.AddHooks(hook); @@ -301,7 +301,7 @@ public async Task Register_Hooks_Should_Be_Available_At_All_Levels() var testProvider = new TestProvider(); testProvider.AddHook(hook4); Api.Instance.AddHooks(hook1); - await Api.Instance.SetProvider(testProvider); + await Api.Instance.SetProviderAsync(testProvider); var client = Api.Instance.GetClient(); client.AddHooks(hook2); await client.GetBooleanValue("test", false, null, @@ -332,7 +332,7 @@ public async Task Finally_Hook_Should_Be_Executed_Even_If_Abnormal_Termination() hook2.Finally(Arg.Any>(), null).Returns(Task.CompletedTask); hook1.Finally(Arg.Any>(), null).Throws(new Exception()); - await Api.Instance.SetProvider(featureProvider); + await Api.Instance.SetProviderAsync(featureProvider); var client = Api.Instance.GetClient(); client.AddHooks(new[] { hook1, hook2 }); client.GetHooks().Count().Should().Be(2); @@ -377,7 +377,7 @@ public async Task Error_Hook_Should_Be_Executed_Even_If_Abnormal_Termination() hook2.Error(Arg.Any>(), Arg.Any(), null).Returns(Task.CompletedTask); hook1.Error(Arg.Any>(), Arg.Any(), null).Returns(Task.CompletedTask); - await Api.Instance.SetProvider(featureProvider1); + await Api.Instance.SetProviderAsync(featureProvider1); var client = Api.Instance.GetClient(); client.AddHooks(new[] { hook1, hook2 }); @@ -414,7 +414,7 @@ public async Task Error_Occurs_During_Before_After_Evaluation_Should_Not_Invoke_ _ = hook1.Error(Arg.Any>(), Arg.Any(), null); _ = hook2.Error(Arg.Any>(), Arg.Any(), null); - await Api.Instance.SetProvider(featureProvider); + await Api.Instance.SetProviderAsync(featureProvider); var client = Api.Instance.GetClient(); client.AddHooks(new[] { hook1, hook2 }); @@ -459,7 +459,7 @@ public async Task Hook_Hints_May_Be_Optional() hook.Finally(Arg.Any>(), Arg.Any>()) .Returns(Task.CompletedTask); - await Api.Instance.SetProvider(featureProvider); + await Api.Instance.SetProviderAsync(featureProvider); var client = Api.Instance.GetClient(); await client.GetBooleanValue("test", false, EvaluationContext.Empty, flagOptions); @@ -537,7 +537,7 @@ public async Task When_Error_Occurs_In_After_Hook_Should_Invoke_Error_Hook() hook.Finally(Arg.Any>(), Arg.Any>()) .Returns(Task.CompletedTask); - await Api.Instance.SetProvider(featureProvider); + await Api.Instance.SetProviderAsync(featureProvider); var client = Api.Instance.GetClient(); var resolvedFlag = await client.GetBooleanValue("test", true, config: flagOptions); diff --git a/test/OpenFeature.Tests/OpenFeatureTests.cs b/test/OpenFeature.Tests/OpenFeatureTests.cs index 3e8b4d3d..6445ca11 100644 --- a/test/OpenFeature.Tests/OpenFeatureTests.cs +++ b/test/OpenFeature.Tests/OpenFeatureTests.cs @@ -33,13 +33,13 @@ public async Task OpenFeature_Should_Initialize_Provider() var providerMockDefault = Substitute.For(); providerMockDefault.GetStatus().Returns(ProviderStatus.NotReady); - await Api.Instance.SetProvider(providerMockDefault).ConfigureAwait(false); + await Api.Instance.SetProviderAsync(providerMockDefault).ConfigureAwait(false); await providerMockDefault.Received(1).Initialize(Api.Instance.GetContext()).ConfigureAwait(false); var providerMockNamed = Substitute.For(); providerMockNamed.GetStatus().Returns(ProviderStatus.NotReady); - await Api.Instance.SetProvider("the-name", providerMockNamed).ConfigureAwait(false); + await Api.Instance.SetProviderAsync("the-name", providerMockNamed).ConfigureAwait(false); await providerMockNamed.Received(1).Initialize(Api.Instance.GetContext()).ConfigureAwait(false); } @@ -51,26 +51,26 @@ public async Task OpenFeature_Should_Shutdown_Unused_Provider() var providerA = Substitute.For(); providerA.GetStatus().Returns(ProviderStatus.NotReady); - await Api.Instance.SetProvider(providerA).ConfigureAwait(false); + await Api.Instance.SetProviderAsync(providerA).ConfigureAwait(false); await providerA.Received(1).Initialize(Api.Instance.GetContext()).ConfigureAwait(false); var providerB = Substitute.For(); providerB.GetStatus().Returns(ProviderStatus.NotReady); - await Api.Instance.SetProvider(providerB).ConfigureAwait(false); + await Api.Instance.SetProviderAsync(providerB).ConfigureAwait(false); await providerB.Received(1).Initialize(Api.Instance.GetContext()).ConfigureAwait(false); await providerA.Received(1).Shutdown().ConfigureAwait(false); var providerC = Substitute.For(); providerC.GetStatus().Returns(ProviderStatus.NotReady); - await Api.Instance.SetProvider("named", providerC).ConfigureAwait(false); + await Api.Instance.SetProviderAsync("named", providerC).ConfigureAwait(false); await providerC.Received(1).Initialize(Api.Instance.GetContext()).ConfigureAwait(false); var providerD = Substitute.For(); providerD.GetStatus().Returns(ProviderStatus.NotReady); - await Api.Instance.SetProvider("named", providerD).ConfigureAwait(false); + await Api.Instance.SetProviderAsync("named", providerD).ConfigureAwait(false); await providerD.Received(1).Initialize(Api.Instance.GetContext()).ConfigureAwait(false); await providerC.Received(1).Shutdown().ConfigureAwait(false); } @@ -88,8 +88,8 @@ public async Task OpenFeature_Should_Support_Shutdown() var providerB = Substitute.For(); providerB.GetStatus().Returns(ProviderStatus.NotReady); - await Api.Instance.SetProvider(providerA).ConfigureAwait(false); - await Api.Instance.SetProvider("named", providerB).ConfigureAwait(false); + await Api.Instance.SetProviderAsync(providerA).ConfigureAwait(false); + await Api.Instance.SetProviderAsync("named", providerB).ConfigureAwait(false); await Api.Instance.Shutdown().ConfigureAwait(false); @@ -103,8 +103,8 @@ public void OpenFeature_Should_Not_Change_Named_Providers_When_Setting_Default_P { var openFeature = Api.Instance; - openFeature.SetProvider(new NoOpFeatureProvider()); - openFeature.SetProvider(TestProvider.DefaultName, new TestProvider()); + openFeature.SetProviderAsync(new NoOpFeatureProvider()); + openFeature.SetProviderAsync(TestProvider.DefaultName, new TestProvider()); var defaultClient = openFeature.GetProviderMetadata(); var namedClient = openFeature.GetProviderMetadata(TestProvider.DefaultName); @@ -119,7 +119,7 @@ public void OpenFeature_Should_Set_Default_Provide_When_No_Name_Provided() { var openFeature = Api.Instance; - openFeature.SetProvider(new TestProvider()); + openFeature.SetProviderAsync(new TestProvider()); var defaultClient = openFeature.GetProviderMetadata(); @@ -133,8 +133,8 @@ public void OpenFeature_Should_Assign_Provider_To_Existing_Client() const string name = "new-client"; var openFeature = Api.Instance; - openFeature.SetProvider(name, new TestProvider()); - openFeature.SetProvider(name, new NoOpFeatureProvider()); + openFeature.SetProviderAsync(name, new TestProvider()); + openFeature.SetProviderAsync(name, new NoOpFeatureProvider()); openFeature.GetProviderMetadata(name).Name.Should().Be(NoOpProvider.NoOpProviderName); } @@ -146,8 +146,8 @@ public void OpenFeature_Should_Allow_Multiple_Client_Names_Of_Same_Instance() var openFeature = Api.Instance; var provider = new TestProvider(); - openFeature.SetProvider("a", provider); - openFeature.SetProvider("b", provider); + openFeature.SetProviderAsync("a", provider); + openFeature.SetProviderAsync("b", provider); var clientA = openFeature.GetProvider("a"); var clientB = openFeature.GetProvider("b"); @@ -188,7 +188,7 @@ public void OpenFeature_Should_Add_Hooks() [Specification("1.1.5", "The API MUST provide a function for retrieving the metadata field of the configured `provider`.")] public void OpenFeature_Should_Get_Metadata() { - Api.Instance.SetProvider(new NoOpFeatureProvider()).Wait(); + Api.Instance.SetProviderAsync(new NoOpFeatureProvider()).Wait(); var openFeature = Api.Instance; var metadata = openFeature.GetProviderMetadata(); @@ -238,8 +238,8 @@ public void OpenFeature_Should_Allow_Multiple_Client_Mapping() { var openFeature = Api.Instance; - openFeature.SetProvider("client1", new TestProvider()); - openFeature.SetProvider("client2", new NoOpFeatureProvider()); + openFeature.SetProviderAsync("client1", new TestProvider()); + openFeature.SetProviderAsync("client2", new NoOpFeatureProvider()); var client1 = openFeature.GetClient("client1"); var client2 = openFeature.GetClient("client2"); From d663052857839cef8e7b80e9db59c0c113d7e279 Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Wed, 17 Jan 2024 16:10:32 -0500 Subject: [PATCH 02/21] fixup: disable warning Signed-off-by: Todd Baert --- test/OpenFeature.Tests/OpenFeatureEventTests.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/OpenFeature.Tests/OpenFeatureEventTests.cs b/test/OpenFeature.Tests/OpenFeatureEventTests.cs index ed5fb85d..6b4b7717 100644 --- a/test/OpenFeature.Tests/OpenFeatureEventTests.cs +++ b/test/OpenFeature.Tests/OpenFeatureEventTests.cs @@ -143,7 +143,9 @@ public void API_Level_Event_Handlers_Should_Be_Informed_About_Ready_State_After_ var eventHandler = Substitute.For(); var testProvider = new TestProvider(); + #pragma warning disable CS0618 // Type or member is obsolete Api.Instance.SetProvider(testProvider); + #pragma warning restore CS0618 // Type or member is obsolete Api.Instance.AddHandler(ProviderEventTypes.ProviderReady, eventHandler); From a4d9e6bb8a525003a9679fd7e6895abb3d277fc3 Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Wed, 17 Jan 2024 16:13:08 -0500 Subject: [PATCH 03/21] fixup: formatting Signed-off-by: Todd Baert --- test/OpenFeature.Tests/OpenFeatureEventTests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/OpenFeature.Tests/OpenFeatureEventTests.cs b/test/OpenFeature.Tests/OpenFeatureEventTests.cs index 6b4b7717..07d3b25a 100644 --- a/test/OpenFeature.Tests/OpenFeatureEventTests.cs +++ b/test/OpenFeature.Tests/OpenFeatureEventTests.cs @@ -143,9 +143,9 @@ public void API_Level_Event_Handlers_Should_Be_Informed_About_Ready_State_After_ var eventHandler = Substitute.For(); var testProvider = new TestProvider(); - #pragma warning disable CS0618 // Type or member is obsolete +#pragma warning disable CS0618 // Type or member is obsolete Api.Instance.SetProvider(testProvider); - #pragma warning restore CS0618 // Type or member is obsolete +#pragma warning restore CS0618 // Type or member is obsolete Api.Instance.AddHandler(ProviderEventTypes.ProviderReady, eventHandler); From e9bece477da09dd557f34a3103415d064645db88 Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Thu, 18 Jan 2024 13:52:26 -0500 Subject: [PATCH 04/21] fixup: review Signed-off-by: Todd Baert --- src/OpenFeature/Api.cs | 4 ++-- test/OpenFeature.Tests/OpenFeatureTests.cs | 28 +++++++++++----------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/OpenFeature/Api.cs b/src/OpenFeature/Api.cs index fffc14cc..bd9497dd 100644 --- a/src/OpenFeature/Api.cs +++ b/src/OpenFeature/Api.cs @@ -47,7 +47,7 @@ private Api() { } public void SetProvider(FeatureProvider featureProvider) { this.EventExecutor.RegisterDefaultFeatureProvider(featureProvider); - this._repository.SetProvider(featureProvider, this.GetContext()).ConfigureAwait(false); + _ = this._repository.SetProvider(featureProvider, this.GetContext()); } /// @@ -71,7 +71,7 @@ public async Task SetProviderAsync(FeatureProvider featureProvider) public void SetProvider(string clientName, FeatureProvider featureProvider) { this.EventExecutor.RegisterClientFeatureProvider(clientName, featureProvider); - this._repository.SetProvider(clientName, featureProvider, this.GetContext()).ConfigureAwait(false); + _ = this._repository.SetProvider(clientName, featureProvider, this.GetContext()); } /// diff --git a/test/OpenFeature.Tests/OpenFeatureTests.cs b/test/OpenFeature.Tests/OpenFeatureTests.cs index 6445ca11..bbeac877 100644 --- a/test/OpenFeature.Tests/OpenFeatureTests.cs +++ b/test/OpenFeature.Tests/OpenFeatureTests.cs @@ -99,12 +99,12 @@ public async Task OpenFeature_Should_Support_Shutdown() [Fact] [Specification("1.1.3", "The `API` MUST provide a function to bind a given `provider` to one or more client `name`s. If the client-name already has a bound provider, it is overwritten with the new mapping.")] - public void OpenFeature_Should_Not_Change_Named_Providers_When_Setting_Default_Provider() + public async void OpenFeature_Should_Not_Change_Named_Providers_When_Setting_Default_Provider() { var openFeature = Api.Instance; - openFeature.SetProviderAsync(new NoOpFeatureProvider()); - openFeature.SetProviderAsync(TestProvider.DefaultName, new TestProvider()); + await openFeature.SetProviderAsync(new NoOpFeatureProvider()).ConfigureAwait(false); + await openFeature.SetProviderAsync(TestProvider.DefaultName, new TestProvider()).ConfigureAwait(false); var defaultClient = openFeature.GetProviderMetadata(); var namedClient = openFeature.GetProviderMetadata(TestProvider.DefaultName); @@ -115,11 +115,11 @@ public void OpenFeature_Should_Not_Change_Named_Providers_When_Setting_Default_P [Fact] [Specification("1.1.3", "The `API` MUST provide a function to bind a given `provider` to one or more client `name`s. If the client-name already has a bound provider, it is overwritten with the new mapping.")] - public void OpenFeature_Should_Set_Default_Provide_When_No_Name_Provided() + public async void OpenFeature_Should_Set_Default_Provide_When_No_Name_Provided() { var openFeature = Api.Instance; - openFeature.SetProviderAsync(new TestProvider()); + await openFeature.SetProviderAsync(new TestProvider()).ConfigureAwait(false); var defaultClient = openFeature.GetProviderMetadata(); @@ -128,26 +128,26 @@ public void OpenFeature_Should_Set_Default_Provide_When_No_Name_Provided() [Fact] [Specification("1.1.3", "The `API` MUST provide a function to bind a given `provider` to one or more client `name`s. If the client-name already has a bound provider, it is overwritten with the new mapping.")] - public void OpenFeature_Should_Assign_Provider_To_Existing_Client() + public async void OpenFeature_Should_Assign_Provider_To_Existing_Client() { const string name = "new-client"; var openFeature = Api.Instance; - openFeature.SetProviderAsync(name, new TestProvider()); - openFeature.SetProviderAsync(name, new NoOpFeatureProvider()); + await openFeature.SetProviderAsync(name, new TestProvider()).ConfigureAwait(true); + await openFeature.SetProviderAsync(name, new NoOpFeatureProvider()).ConfigureAwait(true); openFeature.GetProviderMetadata(name).Name.Should().Be(NoOpProvider.NoOpProviderName); } [Fact] [Specification("1.1.3", "The `API` MUST provide a function to bind a given `provider` to one or more client `name`s. If the client-name already has a bound provider, it is overwritten with the new mapping.")] - public void OpenFeature_Should_Allow_Multiple_Client_Names_Of_Same_Instance() + public async void OpenFeature_Should_Allow_Multiple_Client_Names_Of_Same_Instance() { var openFeature = Api.Instance; var provider = new TestProvider(); - openFeature.SetProviderAsync("a", provider); - openFeature.SetProviderAsync("b", provider); + await openFeature.SetProviderAsync("a", provider).ConfigureAwait(true); + await openFeature.SetProviderAsync("b", provider).ConfigureAwait(true); var clientA = openFeature.GetProvider("a"); var clientB = openFeature.GetProvider("b"); @@ -234,12 +234,12 @@ public void Should_Always_Have_Provider() } [Fact] - public void OpenFeature_Should_Allow_Multiple_Client_Mapping() + public async void OpenFeature_Should_Allow_Multiple_Client_Mapping() { var openFeature = Api.Instance; - openFeature.SetProviderAsync("client1", new TestProvider()); - openFeature.SetProviderAsync("client2", new NoOpFeatureProvider()); + await openFeature.SetProviderAsync("client1", new TestProvider()).ConfigureAwait(true); + await openFeature.SetProviderAsync("client2", new NoOpFeatureProvider()).ConfigureAwait(true); var client1 = openFeature.GetClient("client1"); var client2 = openFeature.GetClient("client2"); From d34331a1d9f97fde5510b3296ca56aa63ffd80bb Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Thu, 18 Jan 2024 14:14:42 -0500 Subject: [PATCH 05/21] fixup: more awaits in tests Signed-off-by: Todd Baert --- .../OpenFeature.Tests/ProviderRepositoryTests.cs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/test/OpenFeature.Tests/ProviderRepositoryTests.cs b/test/OpenFeature.Tests/ProviderRepositoryTests.cs index 6d2ff310..59dcd6cb 100644 --- a/test/OpenFeature.Tests/ProviderRepositoryTests.cs +++ b/test/OpenFeature.Tests/ProviderRepositoryTests.cs @@ -16,24 +16,24 @@ namespace OpenFeature.Tests public class ProviderRepositoryTests { [Fact] - public void Default_Provider_Is_Set_Without_Await() + public async void Default_Provider_Is_Set_Without_Await() { var repository = new ProviderRepository(); var provider = new NoOpFeatureProvider(); var context = new EvaluationContextBuilder().Build(); - repository.SetProvider(provider, context); + await repository.SetProvider(provider, context); Assert.Equal(provider, repository.GetProvider()); } [Fact] - public void AfterSet_Is_Invoked_For_Setting_Default_Provider() + public async void AfterSet_Is_Invoked_For_Setting_Default_Provider() { var repository = new ProviderRepository(); var provider = new NoOpFeatureProvider(); var context = new EvaluationContextBuilder().Build(); var callCount = 0; // The setting of the provider is synchronous, so the afterSet should be as well. - repository.SetProvider(provider, context, afterSet: (theProvider) => + await repository.SetProvider(provider, context, afterSet: (theProvider) => { callCount++; Assert.Equal(provider, theProvider); @@ -182,24 +182,24 @@ await repository.SetProvider(provider2, context, afterError: (provider, ex) => } [Fact] - public void Named_Provider_Provider_Is_Set_Without_Await() + public async void Named_Provider_Provider_Is_Set_Without_Await() { var repository = new ProviderRepository(); var provider = new NoOpFeatureProvider(); var context = new EvaluationContextBuilder().Build(); - repository.SetProvider("the-name", provider, context); + await repository.SetProvider("the-name", provider, context); Assert.Equal(provider, repository.GetProvider("the-name")); } [Fact] - public void AfterSet_Is_Invoked_For_Setting_Named_Provider() + public async void AfterSet_Is_Invoked_For_Setting_Named_Provider() { var repository = new ProviderRepository(); var provider = new NoOpFeatureProvider(); var context = new EvaluationContextBuilder().Build(); var callCount = 0; // The setting of the provider is synchronous, so the afterSet should be as well. - repository.SetProvider("the-name", provider, context, afterSet: (theProvider) => + await repository.SetProvider("the-name", provider, context, afterSet: (theProvider) => { callCount++; Assert.Equal(provider, theProvider); From 5dddf658e8bcf376f19b8825b829d2bfece681f8 Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Mon, 22 Jan 2024 09:41:58 -0500 Subject: [PATCH 06/21] fixup: merge conflicts Signed-off-by: Todd Baert --- src/OpenFeature/Api.cs | 4 ++-- test/OpenFeature.Tests/OpenFeatureEventTests.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/OpenFeature/Api.cs b/src/OpenFeature/Api.cs index 1aaeef5c..af302e7e 100644 --- a/src/OpenFeature/Api.cs +++ b/src/OpenFeature/Api.cs @@ -44,7 +44,7 @@ private Api() { } [Obsolete("Will be removed in later versions; use SetProviderAsync, which can be awaited")] public void SetProvider(FeatureProvider featureProvider) { - this.EventExecutor.RegisterDefaultFeatureProvider(featureProvider); + this._eventExecutor.RegisterDefaultFeatureProvider(featureProvider); _ = this._repository.SetProvider(featureProvider, this.GetContext()); } @@ -68,7 +68,7 @@ public async Task SetProviderAsync(FeatureProvider featureProvider) [Obsolete("Will be removed in later versions; use SetProviderAsync, which can be awaited")] public void SetProvider(string clientName, FeatureProvider featureProvider) { - this.EventExecutor.RegisterClientFeatureProvider(clientName, featureProvider); + this._eventExecutor.RegisterClientFeatureProvider(clientName, featureProvider); _ = this._repository.SetProvider(clientName, featureProvider, this.GetContext()); } diff --git a/test/OpenFeature.Tests/OpenFeatureEventTests.cs b/test/OpenFeature.Tests/OpenFeatureEventTests.cs index fd3993fb..06fb3bd9 100644 --- a/test/OpenFeature.Tests/OpenFeatureEventTests.cs +++ b/test/OpenFeature.Tests/OpenFeatureEventTests.cs @@ -137,7 +137,7 @@ public async Task API_Level_Event_Handlers_Should_Be_Informed_About_Ready_State_ [Specification("5.2.4", "The `handler function` MUST accept a `event details` parameter.")] [Specification("5.3.1", "If the provider's `initialize` function terminates normally, `PROVIDER_READY` handlers MUST run.")] [Specification("5.3.3", "Handlers attached after the provider is already in the associated state, MUST run immediately.")] - public void API_Level_Event_Handlers_Should_Be_Informed_About_Ready_State_After_Registering_Provider_Ready_Sync() + public async void API_Level_Event_Handlers_Should_Be_Informed_About_Ready_State_After_Registering_Provider_Ready_Sync() { var eventHandler = Substitute.For(); From 952b00235305cd9e610467770e76ff4ec2edeaa2 Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Mon, 22 Jan 2024 09:44:41 -0500 Subject: [PATCH 07/21] fixup: use new util Signed-off-by: Todd Baert --- test/OpenFeature.Tests/OpenFeatureEventTests.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/test/OpenFeature.Tests/OpenFeatureEventTests.cs b/test/OpenFeature.Tests/OpenFeatureEventTests.cs index 06fb3bd9..d7a8328c 100644 --- a/test/OpenFeature.Tests/OpenFeatureEventTests.cs +++ b/test/OpenFeature.Tests/OpenFeatureEventTests.cs @@ -121,13 +121,12 @@ public async Task API_Level_Event_Handlers_Should_Be_Informed_About_Ready_State_ Api.Instance.AddHandler(ProviderEventTypes.ProviderReady, eventHandler); - Thread.Sleep(1000); - eventHandler + await Utils.AssertUntilAsync(_ => eventHandler .Received() .Invoke( Arg.Is( payload => payload.ProviderName == testProvider.GetMetadata().Name && payload.Type == ProviderEventTypes.ProviderReady - )); + ))); } [Fact] From 4343571660b43e3caaa89039a6b0327081c66cfe Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Mon, 22 Jan 2024 10:13:02 -0500 Subject: [PATCH 08/21] Update test/OpenFeature.Tests/ProviderRepositoryTests.cs Co-authored-by: Austin Drenski Signed-off-by: Todd Baert --- test/OpenFeature.Tests/ProviderRepositoryTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/OpenFeature.Tests/ProviderRepositoryTests.cs b/test/OpenFeature.Tests/ProviderRepositoryTests.cs index 59dcd6cb..9cdd3d83 100644 --- a/test/OpenFeature.Tests/ProviderRepositoryTests.cs +++ b/test/OpenFeature.Tests/ProviderRepositoryTests.cs @@ -192,7 +192,7 @@ public async void Named_Provider_Provider_Is_Set_Without_Await() } [Fact] - public async void AfterSet_Is_Invoked_For_Setting_Named_Provider() + public async Task AfterSet_Is_Invoked_For_Setting_Named_Provider() { var repository = new ProviderRepository(); var provider = new NoOpFeatureProvider(); From b96117e122ed98b4bf5462bc0304de03059c2e27 Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Mon, 22 Jan 2024 10:13:09 -0500 Subject: [PATCH 09/21] Update test/OpenFeature.Tests/ProviderRepositoryTests.cs Co-authored-by: Austin Drenski Signed-off-by: Todd Baert --- test/OpenFeature.Tests/ProviderRepositoryTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/OpenFeature.Tests/ProviderRepositoryTests.cs b/test/OpenFeature.Tests/ProviderRepositoryTests.cs index 9cdd3d83..bbce3ea8 100644 --- a/test/OpenFeature.Tests/ProviderRepositoryTests.cs +++ b/test/OpenFeature.Tests/ProviderRepositoryTests.cs @@ -182,7 +182,7 @@ await repository.SetProvider(provider2, context, afterError: (provider, ex) => } [Fact] - public async void Named_Provider_Provider_Is_Set_Without_Await() + public async Task Named_Provider_Provider_Is_Set_Without_Await() { var repository = new ProviderRepository(); var provider = new NoOpFeatureProvider(); From de971f7517e0e15c0117b03297d6c3004c49e1af Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Mon, 22 Jan 2024 10:13:16 -0500 Subject: [PATCH 10/21] Update test/OpenFeature.Tests/ProviderRepositoryTests.cs Co-authored-by: Austin Drenski Signed-off-by: Todd Baert --- test/OpenFeature.Tests/ProviderRepositoryTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/OpenFeature.Tests/ProviderRepositoryTests.cs b/test/OpenFeature.Tests/ProviderRepositoryTests.cs index bbce3ea8..62cbe9d6 100644 --- a/test/OpenFeature.Tests/ProviderRepositoryTests.cs +++ b/test/OpenFeature.Tests/ProviderRepositoryTests.cs @@ -16,7 +16,7 @@ namespace OpenFeature.Tests public class ProviderRepositoryTests { [Fact] - public async void Default_Provider_Is_Set_Without_Await() + public async Task Default_Provider_Is_Set_Without_Await() { var repository = new ProviderRepository(); var provider = new NoOpFeatureProvider(); From 08b4f48eb0c1cb791e3e2afb4f16edfd8e210d79 Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Mon, 22 Jan 2024 10:13:22 -0500 Subject: [PATCH 11/21] Update test/OpenFeature.Tests/OpenFeatureTests.cs Co-authored-by: Austin Drenski Signed-off-by: Todd Baert --- test/OpenFeature.Tests/OpenFeatureTests.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/OpenFeature.Tests/OpenFeatureTests.cs b/test/OpenFeature.Tests/OpenFeatureTests.cs index 315cac24..b557d99b 100644 --- a/test/OpenFeature.Tests/OpenFeatureTests.cs +++ b/test/OpenFeature.Tests/OpenFeatureTests.cs @@ -226,7 +226,8 @@ public void Should_Always_Have_Provider() } [Fact] - public async void OpenFeature_Should_Allow_Multiple_Client_Mapping() + public async Task OpenFeature_Should_Allow_Multiple_Client_Mapping() + { var openFeature = Api.Instance; From aa9878472f6b8a92c96bb426139be3d57fde5d3a Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Mon, 22 Jan 2024 10:13:29 -0500 Subject: [PATCH 12/21] Update test/OpenFeature.Tests/OpenFeatureTests.cs Co-authored-by: Austin Drenski Signed-off-by: Todd Baert --- test/OpenFeature.Tests/OpenFeatureTests.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/OpenFeature.Tests/OpenFeatureTests.cs b/test/OpenFeature.Tests/OpenFeatureTests.cs index b557d99b..77f53b16 100644 --- a/test/OpenFeature.Tests/OpenFeatureTests.cs +++ b/test/OpenFeature.Tests/OpenFeatureTests.cs @@ -133,7 +133,8 @@ public async void OpenFeature_Should_Assign_Provider_To_Existing_Client() [Fact] [Specification("1.1.3", "The `API` MUST provide a function to bind a given `provider` to one or more client `name`s. If the client-name already has a bound provider, it is overwritten with the new mapping.")] - public async void OpenFeature_Should_Allow_Multiple_Client_Names_Of_Same_Instance() + public async Task OpenFeature_Should_Allow_Multiple_Client_Names_Of_Same_Instance() + { var openFeature = Api.Instance; var provider = new TestProvider(); From ca9c815851a01cdd46fe02625ee04b3d7a823bd3 Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Mon, 22 Jan 2024 10:13:35 -0500 Subject: [PATCH 13/21] Update test/OpenFeature.Tests/OpenFeatureTests.cs Co-authored-by: Austin Drenski Signed-off-by: Todd Baert --- test/OpenFeature.Tests/OpenFeatureTests.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/OpenFeature.Tests/OpenFeatureTests.cs b/test/OpenFeature.Tests/OpenFeatureTests.cs index 77f53b16..f371eb04 100644 --- a/test/OpenFeature.Tests/OpenFeatureTests.cs +++ b/test/OpenFeature.Tests/OpenFeatureTests.cs @@ -120,7 +120,8 @@ public async void OpenFeature_Should_Set_Default_Provide_When_No_Name_Provided() [Fact] [Specification("1.1.3", "The `API` MUST provide a function to bind a given `provider` to one or more client `name`s. If the client-name already has a bound provider, it is overwritten with the new mapping.")] - public async void OpenFeature_Should_Assign_Provider_To_Existing_Client() + public async Task OpenFeature_Should_Assign_Provider_To_Existing_Client() + { const string name = "new-client"; var openFeature = Api.Instance; From 5df17d84c4983406c4f781e479aed597a6e771db Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Mon, 22 Jan 2024 10:13:42 -0500 Subject: [PATCH 14/21] Update test/OpenFeature.Tests/OpenFeatureTests.cs Co-authored-by: Austin Drenski Signed-off-by: Todd Baert --- test/OpenFeature.Tests/OpenFeatureTests.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/OpenFeature.Tests/OpenFeatureTests.cs b/test/OpenFeature.Tests/OpenFeatureTests.cs index f371eb04..6299b662 100644 --- a/test/OpenFeature.Tests/OpenFeatureTests.cs +++ b/test/OpenFeature.Tests/OpenFeatureTests.cs @@ -107,7 +107,8 @@ public async void OpenFeature_Should_Not_Change_Named_Providers_When_Setting_Def [Fact] [Specification("1.1.3", "The `API` MUST provide a function to bind a given `provider` to one or more client `name`s. If the client-name already has a bound provider, it is overwritten with the new mapping.")] - public async void OpenFeature_Should_Set_Default_Provide_When_No_Name_Provided() + public async Task OpenFeature_Should_Set_Default_Provide_When_No_Name_Provided() + { var openFeature = Api.Instance; From 4d815efb2e0ae9b519ca7e9c9fe4def02c712459 Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Mon, 22 Jan 2024 10:13:47 -0500 Subject: [PATCH 15/21] Update test/OpenFeature.Tests/OpenFeatureTests.cs Co-authored-by: Austin Drenski Signed-off-by: Todd Baert --- test/OpenFeature.Tests/OpenFeatureTests.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/OpenFeature.Tests/OpenFeatureTests.cs b/test/OpenFeature.Tests/OpenFeatureTests.cs index 6299b662..5b8f7c9d 100644 --- a/test/OpenFeature.Tests/OpenFeatureTests.cs +++ b/test/OpenFeature.Tests/OpenFeatureTests.cs @@ -91,7 +91,8 @@ public async Task OpenFeature_Should_Support_Shutdown() [Fact] [Specification("1.1.3", "The `API` MUST provide a function to bind a given `provider` to one or more client `name`s. If the client-name already has a bound provider, it is overwritten with the new mapping.")] - public async void OpenFeature_Should_Not_Change_Named_Providers_When_Setting_Default_Provider() + public async Task OpenFeature_Should_Not_Change_Named_Providers_When_Setting_Default_Provider() + { var openFeature = Api.Instance; From 36c00893203bfe8e67ff839610e091d20f05dea1 Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Mon, 22 Jan 2024 10:13:52 -0500 Subject: [PATCH 16/21] Update test/OpenFeature.Tests/OpenFeatureEventTests.cs Co-authored-by: Austin Drenski Signed-off-by: Todd Baert --- test/OpenFeature.Tests/OpenFeatureEventTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/OpenFeature.Tests/OpenFeatureEventTests.cs b/test/OpenFeature.Tests/OpenFeatureEventTests.cs index d7a8328c..525241fc 100644 --- a/test/OpenFeature.Tests/OpenFeatureEventTests.cs +++ b/test/OpenFeature.Tests/OpenFeatureEventTests.cs @@ -136,7 +136,7 @@ await Utils.AssertUntilAsync(_ => eventHandler [Specification("5.2.4", "The `handler function` MUST accept a `event details` parameter.")] [Specification("5.3.1", "If the provider's `initialize` function terminates normally, `PROVIDER_READY` handlers MUST run.")] [Specification("5.3.3", "Handlers attached after the provider is already in the associated state, MUST run immediately.")] - public async void API_Level_Event_Handlers_Should_Be_Informed_About_Ready_State_After_Registering_Provider_Ready_Sync() + public async Task API_Level_Event_Handlers_Should_Be_Informed_About_Ready_State_After_Registering_Provider_Ready_Sync() { var eventHandler = Substitute.For(); From 8d227c6b026fa553c3480e1fd3ead18e341b67c8 Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Mon, 22 Jan 2024 10:22:33 -0500 Subject: [PATCH 17/21] Update test/OpenFeature.Tests/OpenFeatureTests.cs Co-authored-by: Austin Drenski Signed-off-by: Todd Baert --- test/OpenFeature.Tests/OpenFeatureTests.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/test/OpenFeature.Tests/OpenFeatureTests.cs b/test/OpenFeature.Tests/OpenFeatureTests.cs index 5b8f7c9d..92c5360d 100644 --- a/test/OpenFeature.Tests/OpenFeatureTests.cs +++ b/test/OpenFeature.Tests/OpenFeatureTests.cs @@ -92,7 +92,6 @@ public async Task OpenFeature_Should_Support_Shutdown() [Fact] [Specification("1.1.3", "The `API` MUST provide a function to bind a given `provider` to one or more client `name`s. If the client-name already has a bound provider, it is overwritten with the new mapping.")] public async Task OpenFeature_Should_Not_Change_Named_Providers_When_Setting_Default_Provider() - { var openFeature = Api.Instance; From 5e008dd34d594afeb8f4ec0ce63e46e6f6d65666 Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Mon, 22 Jan 2024 10:22:42 -0500 Subject: [PATCH 18/21] Update test/OpenFeature.Tests/OpenFeatureTests.cs Co-authored-by: Austin Drenski Signed-off-by: Todd Baert --- test/OpenFeature.Tests/OpenFeatureTests.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/test/OpenFeature.Tests/OpenFeatureTests.cs b/test/OpenFeature.Tests/OpenFeatureTests.cs index 92c5360d..7e13c2ac 100644 --- a/test/OpenFeature.Tests/OpenFeatureTests.cs +++ b/test/OpenFeature.Tests/OpenFeatureTests.cs @@ -230,7 +230,6 @@ public void Should_Always_Have_Provider() [Fact] public async Task OpenFeature_Should_Allow_Multiple_Client_Mapping() - { var openFeature = Api.Instance; From ea26bc4a4dc8200b0934f7145d7bd4658325c646 Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Mon, 22 Jan 2024 10:22:49 -0500 Subject: [PATCH 19/21] Update test/OpenFeature.Tests/OpenFeatureTests.cs Co-authored-by: Austin Drenski Signed-off-by: Todd Baert --- test/OpenFeature.Tests/OpenFeatureTests.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/test/OpenFeature.Tests/OpenFeatureTests.cs b/test/OpenFeature.Tests/OpenFeatureTests.cs index 7e13c2ac..98167e7f 100644 --- a/test/OpenFeature.Tests/OpenFeatureTests.cs +++ b/test/OpenFeature.Tests/OpenFeatureTests.cs @@ -122,7 +122,6 @@ public async Task OpenFeature_Should_Set_Default_Provide_When_No_Name_Provided() [Fact] [Specification("1.1.3", "The `API` MUST provide a function to bind a given `provider` to one or more client `name`s. If the client-name already has a bound provider, it is overwritten with the new mapping.")] public async Task OpenFeature_Should_Assign_Provider_To_Existing_Client() - { const string name = "new-client"; var openFeature = Api.Instance; From 528b72314b3ec9de6a2ec673a3bf29b03908acd9 Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Mon, 22 Jan 2024 10:22:54 -0500 Subject: [PATCH 20/21] Update test/OpenFeature.Tests/OpenFeatureTests.cs Co-authored-by: Austin Drenski Signed-off-by: Todd Baert --- test/OpenFeature.Tests/OpenFeatureTests.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/test/OpenFeature.Tests/OpenFeatureTests.cs b/test/OpenFeature.Tests/OpenFeatureTests.cs index 98167e7f..62a06935 100644 --- a/test/OpenFeature.Tests/OpenFeatureTests.cs +++ b/test/OpenFeature.Tests/OpenFeatureTests.cs @@ -108,7 +108,6 @@ public async Task OpenFeature_Should_Not_Change_Named_Providers_When_Setting_Def [Fact] [Specification("1.1.3", "The `API` MUST provide a function to bind a given `provider` to one or more client `name`s. If the client-name already has a bound provider, it is overwritten with the new mapping.")] public async Task OpenFeature_Should_Set_Default_Provide_When_No_Name_Provided() - { var openFeature = Api.Instance; From a9d9fbcef4950e4fdc8345903024656073682b13 Mon Sep 17 00:00:00 2001 From: Todd Baert Date: Mon, 22 Jan 2024 10:35:27 -0500 Subject: [PATCH 21/21] Update test/OpenFeature.Tests/OpenFeatureTests.cs Co-authored-by: Austin Drenski Signed-off-by: Todd Baert --- test/OpenFeature.Tests/OpenFeatureTests.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/test/OpenFeature.Tests/OpenFeatureTests.cs b/test/OpenFeature.Tests/OpenFeatureTests.cs index 62a06935..d43bf045 100644 --- a/test/OpenFeature.Tests/OpenFeatureTests.cs +++ b/test/OpenFeature.Tests/OpenFeatureTests.cs @@ -134,7 +134,6 @@ public async Task OpenFeature_Should_Assign_Provider_To_Existing_Client() [Fact] [Specification("1.1.3", "The `API` MUST provide a function to bind a given `provider` to one or more client `name`s. If the client-name already has a bound provider, it is overwritten with the new mapping.")] public async Task OpenFeature_Should_Allow_Multiple_Client_Names_Of_Same_Instance() - { var openFeature = Api.Instance; var provider = new TestProvider();