-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat!: Support version 2.0 of the OpenFeature SDK. (#38)
Update to support 2.0 of the OpenFeature SDK. This is a breaking change.
- Loading branch information
1 parent
f3447a2
commit 1ebe21c
Showing
6 changed files
with
180 additions
and
93 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
122 changes: 122 additions & 0 deletions
122
test/LaunchDarkly.OpenFeature.ServerProvider.Tests/ClientIntegrationTests.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,122 @@ | ||
using System.Threading; | ||
using System.Threading.Tasks; | ||
using LaunchDarkly.Logging; | ||
using Xunit; | ||
using Xunit.Abstractions; | ||
using LaunchDarkly.Sdk.Server; | ||
using LaunchDarkly.Sdk.Server.Interfaces; | ||
using Moq; | ||
using OpenFeature; | ||
using OpenFeature.Constant; | ||
using OpenFeature.Model; | ||
using Timer = System.Timers.Timer; | ||
|
||
namespace LaunchDarkly.OpenFeature.ServerProvider.Tests | ||
{ | ||
public class ClientIntegrationTests | ||
{ | ||
private ITestOutputHelper _outHelper; | ||
|
||
public ClientIntegrationTests(ITestOutputHelper outHelper) | ||
{ | ||
_outHelper = outHelper; | ||
} | ||
|
||
[Fact(Timeout = 5000)] | ||
public async Task ItHandlesValidInitializationWhenClientIsImmediatelyReady() | ||
{ | ||
var provider = new Provider(Configuration.Builder("").Offline(true).Build()); | ||
var readyCount = 0; | ||
Api.Instance.AddHandler(ProviderEventTypes.ProviderReady, | ||
details => { Interlocked.Increment(ref readyCount); }); | ||
await Api.Instance.SetProviderAsync(provider); | ||
// Sleep for a moment and ensure there is only 1 ready event received. | ||
Thread.Sleep(100); | ||
Assert.Equal(1, readyCount); | ||
} | ||
|
||
[Fact(Timeout = 5000)] | ||
public async Task ItHandlesValidInitializationWhenClientIsReadyAfterADelay() | ||
{ | ||
var mockClient = new Mock<ILdClient>(); | ||
mockClient.Setup(l => l.GetLogger()) | ||
.Returns(Components.NoLogging.Build(null).LogAdapter.Logger(null)); | ||
|
||
var mockDataSourceStatus = new Mock<IDataSourceStatusProvider>(); | ||
mockDataSourceStatus.Setup(l => l.Status).Returns(new DataSourceStatus | ||
{ | ||
State = DataSourceState.Initializing | ||
}); | ||
mockClient.Setup(l => l.DataSourceStatusProvider).Returns(mockDataSourceStatus.Object); | ||
|
||
var mockFlagTracker = new Mock<IFlagTracker>(); | ||
mockClient.Setup(l => l.FlagTracker).Returns(mockFlagTracker.Object); | ||
|
||
var provider = new Provider(mockClient.Object); | ||
|
||
// Setup a timer to indicate that the client has initialized after some amount of time. | ||
var completionTimer = new Timer(100); | ||
completionTimer.AutoReset = false; | ||
completionTimer.Elapsed += (sender, args) => | ||
{ | ||
mockDataSourceStatus.Raise(e => e.StatusChanged += null, | ||
mockDataSourceStatus.Object, | ||
new DataSourceStatus { State = DataSourceState.Valid }); | ||
mockDataSourceStatus.Setup(l => l.Status).Returns(new DataSourceStatus | ||
{ | ||
State = DataSourceState.Valid | ||
}); | ||
}; | ||
completionTimer.Start(); | ||
|
||
var readyCount = 0; | ||
Api.Instance.AddHandler(ProviderEventTypes.ProviderReady, | ||
details => { Interlocked.Increment(ref readyCount); }); | ||
await Api.Instance.SetProviderAsync(provider); | ||
// Sleep for a moment and ensure there is only 1 ready event received. | ||
Thread.Sleep(100); | ||
Assert.Equal(1, readyCount); | ||
} | ||
|
||
[Fact(Timeout = 5000)] | ||
public async Task ItHandlesFailedInitialization() | ||
{ | ||
var mockClient = new Mock<ILdClient>(); | ||
mockClient.Setup(l => l.GetLogger()) | ||
.Returns(Components.NoLogging.Build(null).LogAdapter.Logger(null)); | ||
|
||
var mockDataSourceStatus = new Mock<IDataSourceStatusProvider>(); | ||
mockDataSourceStatus.Setup(l => l.Status).Returns(new DataSourceStatus | ||
{ | ||
State = DataSourceState.Initializing | ||
}); | ||
mockClient.Setup(l => l.DataSourceStatusProvider).Returns(mockDataSourceStatus.Object); | ||
|
||
var mockFlagTracker = new Mock<IFlagTracker>(); | ||
mockClient.Setup(l => l.FlagTracker).Returns(mockFlagTracker.Object); | ||
|
||
var provider = new Provider(mockClient.Object); | ||
|
||
// Setup a timer to indicate that the client has failed initialization after some amount of time. | ||
var completionTimer = new Timer(100); | ||
completionTimer.AutoReset = false; | ||
completionTimer.Elapsed += (sender, args) => | ||
{ | ||
mockDataSourceStatus.Raise(e => e.StatusChanged += null, | ||
mockDataSourceStatus.Object, | ||
new DataSourceStatus { State = DataSourceState.Off }); | ||
}; | ||
completionTimer.Start(); | ||
|
||
var errorCount = 0; | ||
Api.Instance.AddHandler(ProviderEventTypes.ProviderError, | ||
details => { Interlocked.Increment(ref errorCount); }); | ||
await Api.Instance.SetProviderAsync(provider); | ||
|
||
// Sleep for a moment and ensure there is only 1 error event received. | ||
Thread.Sleep(100); | ||
Assert.Equal(1, errorCount); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.