From 748a6d5376cde4a4b8ebfb5ea1a3a011387a2a57 Mon Sep 17 00:00:00 2001 From: Bill Al Date: Tue, 23 Dec 2025 22:14:09 -0800 Subject: [PATCH 1/3] Updated client and integration tests --- .../Classes/InMemoryReadinessGatesCache.cs | 1 + .../Cache/Classes/InMemorySplitCache.cs | 1 + .../Client/Classes/SelfRefreshingClient.cs | 2 +- .../Services/Client/Classes/SplitClient.cs | 56 ++++++- .../Services/Client/Classes/SplitFactory.cs | 2 +- .../Client/Interfaces/ISplitClient.cs | 1 + src/Splitio/Services/Common/EventDelivery.cs | 7 +- src/Splitio/Services/Common/EventsManager.cs | 65 +++----- src/Splitio/Services/Common/IEventDelivery.cs | 2 +- src/Splitio/Services/Common/IEventsManager.cs | 7 +- .../BaseLocalhostClientTests.cs | 2 +- .../Integration Tests/InMemoryClientTests.cs | 2 +- .../Integration Tests/JSONFileClientTests.cs | 2 +- .../Integration Tests/RedisClientTests.cs | 2 +- .../SelfRefreshingSegmentFetcherTests.cs | 2 +- .../TargetingRulesFetcherTests.cs | 6 +- .../InMemory/RuleBasedSegmentCacheTests.cs | 30 ++-- .../Cache/InMemory/SegmentCacheAsyncTests.cs | 29 ++-- .../Cache/InMemory/SegmentCacheTests.cs | 54 ++++--- .../Cache/InMemory/SplitCacheAsyncTests.cs | 34 +++-- .../Cache/InMemory/SplitCacheTests.cs | 69 +++++---- .../Client/LocalhostClientForTesting.cs | 2 +- .../Client/LocalhostClientUnitTests.cs | 2 +- .../Client/SdkReadinessGatesUnitTests.cs | 21 ++- .../Client/SplitClientForTesting.cs | 2 +- .../Unit Tests/Common/EventDeliveryTests.cs | 8 +- .../Unit Tests/Common/EventsManagerTests.cs | 144 ++++++++++-------- .../Impressions/ImpressionsCounterTests.cs | 8 +- .../Impressions/UniqueKeysTrackerTests.cs | 8 +- .../UserDefinedSegmentMatcherAsyncTests.cs | 33 ++-- .../UserDefinedSegmentMatcherTests.cs | 39 ++--- .../SelfRefreshingSegmentFetcherUnitTests.cs | 7 +- .../SelfRefreshingSegmentUnitTests.cs | 8 +- ...lfRefreshingBlockUntilReadyServiceTests.cs | 21 ++- .../EventSourceClientTests.cs | 2 +- .../PollingClientTests.cs | 15 +- .../StreamingClientTests.cs | 40 ++++- .../Splitio.TestSupport/SplitClientForTest.cs | 2 +- 38 files changed, 445 insertions(+), 293 deletions(-) diff --git a/src/Splitio/Services/Cache/Classes/InMemoryReadinessGatesCache.cs b/src/Splitio/Services/Cache/Classes/InMemoryReadinessGatesCache.cs index f784fbbe..9d4b2e2d 100644 --- a/src/Splitio/Services/Cache/Classes/InMemoryReadinessGatesCache.cs +++ b/src/Splitio/Services/Cache/Classes/InMemoryReadinessGatesCache.cs @@ -30,6 +30,7 @@ public bool WaitUntilReady(int milliseconds) public void SetReady() { _sdkReady.Signal(); + Thread.Sleep(1000); _eventsManager.NotifyInternalEvent(SdkInternalEvent.SdkReady, new EventMetadata(new Dictionary())); } diff --git a/src/Splitio/Services/Cache/Classes/InMemorySplitCache.cs b/src/Splitio/Services/Cache/Classes/InMemorySplitCache.cs index 73bddb5d..1a99fd8c 100644 --- a/src/Splitio/Services/Cache/Classes/InMemorySplitCache.cs +++ b/src/Splitio/Services/Cache/Classes/InMemorySplitCache.cs @@ -74,6 +74,7 @@ public void Update(List toAdd, List toRemove, long till) { DecreaseTrafficTypeCount(removedSplit); RemoveFromFlagSets(removedSplit.name, removedSplit.Sets); + eventsFlags.Add(featureFlagName); } } diff --git a/src/Splitio/Services/Client/Classes/SelfRefreshingClient.cs b/src/Splitio/Services/Client/Classes/SelfRefreshingClient.cs index 7d513bc5..a455f737 100644 --- a/src/Splitio/Services/Client/Classes/SelfRefreshingClient.cs +++ b/src/Splitio/Services/Client/Classes/SelfRefreshingClient.cs @@ -55,7 +55,7 @@ public class SelfRefreshingClient : SplitClient public SelfRefreshingClient(string apiKey, ConfigurationOptions config, FallbackTreatmentCalculator fallbackTreatmentCalculator, - IEventsManager eventsManager) : base(apiKey, fallbackTreatmentCalculator, eventsManager) + EventsManager eventsManager) : base(apiKey, fallbackTreatmentCalculator, eventsManager) { _config = (SelfRefreshingConfig)_configService.ReadConfig(config, ConfigTypes.InMemory); _fallbackTreatmentCalculator = fallbackTreatmentCalculator; diff --git a/src/Splitio/Services/Client/Classes/SplitClient.cs b/src/Splitio/Services/Client/Classes/SplitClient.cs index d37ed283..e1f21480 100644 --- a/src/Splitio/Services/Client/Classes/SplitClient.cs +++ b/src/Splitio/Services/Client/Classes/SplitClient.cs @@ -63,16 +63,33 @@ public abstract class SplitClient : ISplitClient protected IImpressionsObserver _impressionsObserver; protected IClientExtensionService _clientExtensionService; protected IFlagSetsFilter _flagSetsFilter; - protected IEventsManager _eventsManager; - public event EventHandler PublicSdkReadyHandler; - public event EventHandler PublicSdkUpdateHandler; - public event EventHandler PublicSdkTimedOutHandler; + public IEventsManager _eventsManager; + private EventHandler SdkReadyEvent; + public event EventHandler SdkReady + { + add + { + SdkReadyEvent = (EventHandler)Delegate.Combine(SdkReadyEvent, value); + if (_eventsManager.EventAlreadyTriggered(SdkEvent.SdkReady)) + { + SdkReadyEvent.Invoke(this, null); + } + } + + remove + { + SdkReadyEvent = (EventHandler)Delegate.Remove(SdkReadyEvent, value); + } + } + public event EventHandler SdkUpdate; + public event EventHandler SdkTimedOut; protected SplitClient(string apikey, FallbackTreatmentCalculator fallbackTreatmentCalculator, IEventsManager eventsManager) { ApiKey = apikey; _eventsManager = eventsManager; + RegisterEvents(); _fallbackTreatmentCalculator = fallbackTreatmentCalculator; _wrapperAdapter = WrapperAdapter.Instance(); @@ -83,7 +100,7 @@ protected SplitClient(string apikey, FallbackTreatmentCalculator fallbackTreatme _factoryInstantiationsService = FactoryInstantiationsService.Instance(); _flagSetsValidator = new FlagSetsValidator(); _configService = new ConfigService(_wrapperAdapter, _flagSetsValidator, new SdkMetadataValidator()); - _statusManager = new InMemoryReadinessGatesCache(eventsManager); + _statusManager = new InMemoryReadinessGatesCache(_eventsManager); _tasksManager = new TasksManager(_statusManager); } @@ -305,6 +322,7 @@ public virtual async Task DestroyAsync() _factoryInstantiationsService.Decrease(ApiKey); _statusManager.SetDestroy(); await _syncManager.ShutdownAsync(); + UnregisterEvents(); _log.Info(Messages.Destroyed); } @@ -318,6 +336,7 @@ public virtual void Destroy() _factoryInstantiationsService.Decrease(ApiKey); _statusManager.SetDestroy(); _syncManager.Shutdown(); + UnregisterEvents(); _log.Info(Messages.Destroyed); } @@ -488,6 +507,18 @@ private async Task TrackImpressionsAsync(List evaluatorResults, #endregion #region Private Methods + private void RegisterEvents() + { + _eventsManager.Register(SdkEvent.SdkReady, TriggerSdkReady); + _eventsManager.Register(SdkEvent.SdkUpdate, TriggerSdkUpdate); + _eventsManager.Register(SdkEvent.SdkReadyTimeout, TriggerSdkTimeout); + } + private void UnregisterEvents() + { + _eventsManager.Unregister(SdkEvent.SdkReady); + _eventsManager.Unregister(SdkEvent.SdkUpdate); + _eventsManager.Unregister(SdkEvent.SdkReadyTimeout); + } private List GetTreatmentsSync(Enums.API method, Key key, List features, Dictionary attributes = null, EvaluationOptions evaluationOptions = null) { try @@ -575,6 +606,21 @@ private static SplitResult TreatmentWithConfig(List results) return new SplitResult(result.Treatment, result.Config); } + + private void TriggerSdkReady(EventMetadata metaData) + { + SdkReadyEvent?.Invoke(this, metaData); + } + + private void TriggerSdkUpdate(EventMetadata metaData) + { + SdkUpdate?.Invoke(this, metaData); + } + + private void TriggerSdkTimeout(EventMetadata metaData) + { + SdkTimedOut?.Invoke(this, metaData); + } #endregion } } \ No newline at end of file diff --git a/src/Splitio/Services/Client/Classes/SplitFactory.cs b/src/Splitio/Services/Client/Classes/SplitFactory.cs index d22b6647..27742c36 100644 --- a/src/Splitio/Services/Client/Classes/SplitFactory.cs +++ b/src/Splitio/Services/Client/Classes/SplitFactory.cs @@ -60,7 +60,7 @@ public ISplitManager Manager() private void BuildSplitClient() { FallbackTreatmentCalculator fallbackTreatmentCalculator = new FallbackTreatmentCalculator(_options.FallbackTreatments); - EventsManager eventsManager = new EventsManager(new EventsManagerConfig()); + EventsManager eventsManager = new EventsManager(new EventsManagerConfig(), new EventDelivery()); switch (_options.Mode) { diff --git a/src/Splitio/Services/Client/Interfaces/ISplitClient.cs b/src/Splitio/Services/Client/Interfaces/ISplitClient.cs index 60e0b751..e78c290f 100644 --- a/src/Splitio/Services/Client/Interfaces/ISplitClient.cs +++ b/src/Splitio/Services/Client/Interfaces/ISplitClient.cs @@ -1,4 +1,5 @@ using Splitio.Domain; +using System; using System.Collections.Generic; namespace Splitio.Services.Client.Interfaces diff --git a/src/Splitio/Services/Common/EventDelivery.cs b/src/Splitio/Services/Common/EventDelivery.cs index b97e7a32..38b04ffe 100644 --- a/src/Splitio/Services/Common/EventDelivery.cs +++ b/src/Splitio/Services/Common/EventDelivery.cs @@ -1,4 +1,5 @@ -using Splitio.Services.Logger; +using Splitio.Domain; +using Splitio.Services.Logger; using Splitio.Services.Shared.Classes; using System; @@ -8,14 +9,14 @@ public class EventDelivery : IEventDelivery { private readonly ISplitLogger _logger = WrapperAdapter.Instance().GetLogger("EventDelivery"); - public virtual void Deliver(E sdkEvent, M eventMetadata, EventHandler handler) + public virtual void Deliver(E sdkEvent, M eventMetadata, Action handler) { if (handler != null) { _logger.Debug($"EventDelivery: Triggering handle for Sdk Event {sdkEvent}"); try { - handler.Invoke(this, eventMetadata); + handler.Invoke(eventMetadata); } catch (Exception e) { diff --git a/src/Splitio/Services/Common/EventsManager.cs b/src/Splitio/Services/Common/EventsManager.cs index 79ad8373..bda64bd6 100644 --- a/src/Splitio/Services/Common/EventsManager.cs +++ b/src/Splitio/Services/Common/EventsManager.cs @@ -19,25 +19,25 @@ public struct ValidSdkEvent private struct PublicEventProperties { public bool Triggered; - public EventHandler EventHandler; + public Action EventHandler; } private readonly ConcurrentDictionary _activeSubscriptions; private readonly ConcurrentDictionary _internalEventsStatus; private readonly ISplitLogger _logger = WrapperAdapter.Instance().GetLogger("EventsManager"); - private readonly EventDelivery _eventDelivery; + private readonly IEventDelivery _eventDelivery; private readonly object _lock = new object(); public EventManagerConfigData _managerConfig { get; private set; } - public EventsManager(EventManagerConfigData eventsManagerConfig) + public EventsManager(EventManagerConfigData eventsManagerConfig, IEventDelivery eventDelivery) { _activeSubscriptions = new ConcurrentDictionary(); _internalEventsStatus = new ConcurrentDictionary(); - _eventDelivery = new EventDelivery(); + _eventDelivery = eventDelivery; _managerConfig = eventsManagerConfig; } #region Public Methods - public void Register(E sdkEvent, EventHandler handler) + public void Register(E sdkEvent, Action handler) { if (_activeSubscriptions.TryGetValue(sdkEvent, out var _)) { @@ -116,7 +116,7 @@ private void SetSdkEventTriggered(E sdkEvent) _activeSubscriptions.TryUpdate(sdkEvent, newEventData, eventData); } - private EventHandler GetEventHandler(E sdkEvent) + private Action GetEventHandler(E sdkEvent) { if (!_activeSubscriptions.TryGetValue(sdkEvent, out var eventData)) { @@ -131,7 +131,6 @@ public List GetSdkEventIfApplicable(I sdkInternalEvent) ValidSdkEvent finalSdkEvent = new ValidSdkEvent { Valid = false -// SdkEvent = SdkEvent.SdkReady }; UpdateSdkInternalEventStatus(sdkInternalEvent, true); List eventsToFire = new List(); @@ -147,11 +146,11 @@ public List GetSdkEventIfApplicable(I sdkInternalEvent) finalSdkEvent.Valid = CheckPrerequisites(finalSdkEvent.SdkEvent) && CheckSuppressedBy(finalSdkEvent.SdkEvent); - } - if (finalSdkEvent.Valid) - { - eventsToFire.Add(finalSdkEvent.SdkEvent); + if (finalSdkEvent.Valid) + { + eventsToFire.Add(finalSdkEvent.SdkEvent); + } } foreach (E sdkEvent in CheckRequireAll()) @@ -187,17 +186,10 @@ private List CheckRequireAll() private bool CheckPrerequisites(E sdkEvent) { - foreach (KeyValuePair> kvp in _managerConfig.Prerequisites) + if (_managerConfig.Prerequisites.Any(kvp => kvp.Key.Equals(sdkEvent) && + kvp.Value.Any(x => !EventAlreadyTriggered(x)))) { - if (kvp.Key.Equals(sdkEvent)) - { - if (kvp.Value.Any(x => !EventAlreadyTriggered(x))) - { - return false; - } - - return true; - } + return false; } return true; @@ -205,17 +197,10 @@ private bool CheckPrerequisites(E sdkEvent) private bool CheckSuppressedBy(E sdkEvent) { - foreach (KeyValuePair> kvp in _managerConfig.SuppressedBy) + if (_managerConfig.SuppressedBy.Any(kvp => kvp.Key.Equals(sdkEvent) && + kvp.Value.Any(x => EventAlreadyTriggered(x)))) { - if (kvp.Key.Equals(sdkEvent)) - { - if (kvp.Value.Any(x => EventAlreadyTriggered(x))) - { - return false; - } - - return true; - } + return false; } return true; @@ -223,10 +208,11 @@ private bool CheckSuppressedBy(E sdkEvent) private int ExecutionLimit(E sdkEvent) { - if (!_managerConfig.ExecutionLimits.ContainsKey(sdkEvent)) + if (!_managerConfig.ExecutionLimits.TryGetValue(sdkEvent, out int limit)) + { return -1; + } - _managerConfig.ExecutionLimits.TryGetValue(sdkEvent, out int limit); return limit; } @@ -235,17 +221,14 @@ private ValidSdkEvent CheckRequireAny(I sdkInternalEvent) ValidSdkEvent validSdkEvent = new ValidSdkEvent { Valid = false -// SdkEvent = SdkEvent.SdkUpdate }; - foreach (KeyValuePair> kvp in _managerConfig.RequireAny) + var sdkEvent = _managerConfig.RequireAny.Where(kvp => kvp.Value.Contains(sdkInternalEvent)); + if (sdkEvent.Any()) { - if (kvp.Value.Contains(sdkInternalEvent)) - { - validSdkEvent.Valid = true; - validSdkEvent.SdkEvent = kvp.Key; - return validSdkEvent; - } + validSdkEvent.Valid = true; + validSdkEvent.SdkEvent = sdkEvent.First().Key; + return validSdkEvent; } return validSdkEvent; diff --git a/src/Splitio/Services/Common/IEventDelivery.cs b/src/Splitio/Services/Common/IEventDelivery.cs index 550cfbbf..69ae709f 100644 --- a/src/Splitio/Services/Common/IEventDelivery.cs +++ b/src/Splitio/Services/Common/IEventDelivery.cs @@ -5,6 +5,6 @@ namespace Splitio.Services.Common { public interface IEventDelivery { - void Deliver(E sdkEvent, M eventMetadata, EventHandler handler); + void Deliver(E sdkEvent, M eventMetadata, Action handler); } } diff --git a/src/Splitio/Services/Common/IEventsManager.cs b/src/Splitio/Services/Common/IEventsManager.cs index 23e719c7..ac5f3739 100644 --- a/src/Splitio/Services/Common/IEventsManager.cs +++ b/src/Splitio/Services/Common/IEventsManager.cs @@ -1,13 +1,12 @@ -using Splitio.Domain; -using System; -using System.Collections.Generic; +using System; namespace Splitio.Services.Common { public interface IEventsManager { void NotifyInternalEvent(I sdkInternalEvent, M eventMetadata); - void Register(E sdkEvent, EventHandler handler); + void Register(E sdkEvent, Action handler); void Unregister(E sdkEvent); + bool EventAlreadyTriggered(E sdkEvent); } } diff --git a/tests/Splitio-tests/Integration Tests/BaseLocalhostClientTests.cs b/tests/Splitio-tests/Integration Tests/BaseLocalhostClientTests.cs index fe9b3227..9bb56c7f 100644 --- a/tests/Splitio-tests/Integration Tests/BaseLocalhostClientTests.cs +++ b/tests/Splitio-tests/Integration Tests/BaseLocalhostClientTests.cs @@ -33,7 +33,7 @@ public BaseLocalhostClientTests(string mode) rootFilePath = string.Empty; _mode = mode; _fallbackTreatmentCalculator = new FallbackTreatmentCalculator(new FallbackTreatmentsConfiguration()); - _eventsManager = new EventsManager(new EventsManagerConfig()); + _eventsManager = new EventsManager(new EventsManagerConfig(), new EventDelivery()); #if NET_LATEST rootFilePath = @"Resources\"; diff --git a/tests/Splitio-tests/Integration Tests/InMemoryClientTests.cs b/tests/Splitio-tests/Integration Tests/InMemoryClientTests.cs index 2279838c..e16d7f0f 100644 --- a/tests/Splitio-tests/Integration Tests/InMemoryClientTests.cs +++ b/tests/Splitio-tests/Integration Tests/InMemoryClientTests.cs @@ -20,7 +20,7 @@ public InMemoryClientTests() // This line is to clean the warnings. rootFilePath = string.Empty; _fallbackTreatmentCalculator = new FallbackTreatmentCalculator(new FallbackTreatmentsConfiguration()); - _eventsManager = new EventsManager(new EventsManagerConfig()); + _eventsManager = new EventsManager(new EventsManagerConfig(), new EventDelivery()); #if NET_LATEST rootFilePath = @"Resources\"; diff --git a/tests/Splitio-tests/Integration Tests/JSONFileClientTests.cs b/tests/Splitio-tests/Integration Tests/JSONFileClientTests.cs index 6bdc8e55..c4868dea 100644 --- a/tests/Splitio-tests/Integration Tests/JSONFileClientTests.cs +++ b/tests/Splitio-tests/Integration Tests/JSONFileClientTests.cs @@ -27,7 +27,7 @@ public JSONFileClientTests() // This line is to clean the warnings. rootFilePath = string.Empty; _fallbackTreatmentCalculator = new FallbackTreatmentCalculator(new FallbackTreatmentsConfiguration()); - _eventsManager = new EventsManager(new EventsManagerConfig()); + _eventsManager = new EventsManager(new EventsManagerConfig(), new EventDelivery()); #if NET_LATEST rootFilePath = @"Resources\"; diff --git a/tests/Splitio-tests/Integration Tests/RedisClientTests.cs b/tests/Splitio-tests/Integration Tests/RedisClientTests.cs index 8ad5f8be..f600179a 100644 --- a/tests/Splitio-tests/Integration Tests/RedisClientTests.cs +++ b/tests/Splitio-tests/Integration Tests/RedisClientTests.cs @@ -40,7 +40,7 @@ public void Initialization() UserPrefix = _prefix }; _fallbackTreatmentCalculator = new FallbackTreatmentCalculator(new FallbackTreatmentsConfiguration()); - _eventsManager = new EventsManager(new EventsManagerConfig()); + _eventsManager = new EventsManager(new EventsManagerConfig(), new EventDelivery()); config = new ConfigurationOptions { CacheAdapterConfig = cacheAdapterConfig, diff --git a/tests/Splitio-tests/Integration Tests/SelfRefreshingSegmentFetcherTests.cs b/tests/Splitio-tests/Integration Tests/SelfRefreshingSegmentFetcherTests.cs index bde1a569..70839600 100644 --- a/tests/Splitio-tests/Integration Tests/SelfRefreshingSegmentFetcherTests.cs +++ b/tests/Splitio-tests/Integration Tests/SelfRefreshingSegmentFetcherTests.cs @@ -27,7 +27,7 @@ public SelfRefreshingSegmentFetcherTests() public void ExecuteGetSuccessfulWithResultsFromJSONFile() { //Arrange - var eventsManager = new EventsManager(new EventsManagerConfig()); + var eventsManager = new EventsManager(new EventsManagerConfig(), new EventDelivery()); var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager); var segmentFetcher = new JSONFileSegmentFetcher($"{rootFilePath}segment_payed.json", segmentCache); diff --git a/tests/Splitio-tests/Integration Tests/TargetingRulesFetcherTests.cs b/tests/Splitio-tests/Integration Tests/TargetingRulesFetcherTests.cs index e6049299..7d4e8f53 100644 --- a/tests/Splitio-tests/Integration Tests/TargetingRulesFetcherTests.cs +++ b/tests/Splitio-tests/Integration Tests/TargetingRulesFetcherTests.cs @@ -38,7 +38,7 @@ public TargetingRulesFetcherTests() public async Task ExecuteGetSuccessfulWithResultsFromJSONFile() { //Arrange - var eventsManager = new EventsManager(new EventsManagerConfig()); + var eventsManager = new EventsManager(new EventsManagerConfig(), new EventDelivery()); var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager); var rbsCache = new InMemoryRuleBasedSegmentCache(new ConcurrentDictionary(), eventsManager); var segmentFetcher = new JSONFileSegmentFetcher($"{rootFilePath}segment_payed.json", segmentCache); @@ -84,7 +84,7 @@ public async Task ExecuteGetSuccessfulWithResultsFromJSONFile() public async Task ExecuteGetSuccessfulWithResultsFromJSONFileIncludingTrafficAllocation() { //Arrange - var eventsManager = new EventsManager(new EventsManagerConfig()); + var eventsManager = new EventsManager(new EventsManagerConfig(), new EventDelivery()); var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager); var rbsCache = new InMemoryRuleBasedSegmentCache(new ConcurrentDictionary(), eventsManager); var segmentFetcher = new JSONFileSegmentFetcher($"{rootFilePath}segment_payed.json", segmentCache); @@ -141,7 +141,7 @@ public async Task ExecuteGetWithoutResults() var apiSplitChangeFetcher = new ApiSplitChangeFetcher(sdkApiClient); var sdkSegmentApiClient = new SegmentSdkApiClient(httpClient, telemetryStorage, baseUrl); var apiSegmentChangeFetcher = new ApiSegmentChangeFetcher(sdkSegmentApiClient); - var eventsManager = new EventsManager(new EventsManagerConfig()); + var eventsManager = new EventsManager(new EventsManagerConfig(), new EventDelivery()); var gates = new InMemoryReadinessGatesCache(eventsManager); var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager); var segmentsQueue = new SplitQueue(); diff --git a/tests/Splitio-tests/Unit Tests/Cache/InMemory/RuleBasedSegmentCacheTests.cs b/tests/Splitio-tests/Unit Tests/Cache/InMemory/RuleBasedSegmentCacheTests.cs index d4f207c5..023b5ce8 100644 --- a/tests/Splitio-tests/Unit Tests/Cache/InMemory/RuleBasedSegmentCacheTests.cs +++ b/tests/Splitio-tests/Unit Tests/Cache/InMemory/RuleBasedSegmentCacheTests.cs @@ -14,15 +14,16 @@ public class RuleBasedSegmentCacheTests { private InMemoryRuleBasedSegmentCache _segmentCache; private EventsManager _eventsManager; - private bool SdkUpdate = false; + private bool SdkUpdateFlag = false; private EventMetadata eMetadata = null; - public event EventHandler PublicSdkUpdateHandler; + public event EventHandler SdkUpdate; + public event EventHandler SdkReady; [TestInitialize] public void Setup() { var cache = new ConcurrentDictionary(); - _eventsManager = new EventsManager(new EventsManagerConfig()); + _eventsManager = new EventsManager(new EventsManagerConfig(), new EventDelivery()); _segmentCache = new InMemoryRuleBasedSegmentCache(cache, _eventsManager); } @@ -154,22 +155,21 @@ public void Contains_ShouldReturnTrue() public void Update_ShouldNotifyEvent() { // Arrange - var segmentToAdd = new RuleBasedSegment { Name = "segment-to-add" }; var segmentToRemove = new RuleBasedSegment { Name = "segment-to-remove" }; var till = 67890; var toNotify = new List { { "segment-to-add" }, { "segment-to-remove" } }; - PublicSdkUpdateHandler += sdkUpdate_callback; - _eventsManager.Register(SdkEvent.SdkUpdate, sdkUpdate_callback); - _eventsManager.Register(SdkEvent.SdkReady, sdkUpdate_callback); + SdkUpdate += sdkUpdate_callback; + _eventsManager.Register(SdkEvent.SdkUpdate, TriggerSdkUpdate); + _eventsManager.Register(SdkEvent.SdkReady, TriggerSdkReady); _eventsManager.NotifyInternalEvent(SdkInternalEvent.SdkReady, new EventMetadata(new Dictionary())); // Act - SdkUpdate = false; + SdkUpdateFlag = false; _segmentCache.Update(new List { segmentToAdd, segmentToRemove }, new List { segmentToRemove.Name }, till); // Assert - Assert.IsTrue(SdkUpdate); + Assert.IsTrue(SdkUpdateFlag); Assert.IsTrue(eMetadata.ContainKey(Splitio.Constants.EventMetadataKeys.RuleBasedSegments)); List rbsegments = (List)eMetadata.GetData()[Splitio.Constants.EventMetadataKeys.RuleBasedSegments]; Assert.IsTrue(rbsegments.Count == 3); @@ -179,8 +179,18 @@ public void Update_ShouldNotifyEvent() private void sdkUpdate_callback(object sender, EventMetadata metadata) { - SdkUpdate = true; + SdkUpdateFlag = true; eMetadata = metadata; } + + private void TriggerSdkReady(EventMetadata metaData) + { + SdkReady?.Invoke(this, metaData); + } + + private void TriggerSdkUpdate(EventMetadata metaData) + { + SdkUpdate?.Invoke(this, metaData); + } } } diff --git a/tests/Splitio-tests/Unit Tests/Cache/InMemory/SegmentCacheAsyncTests.cs b/tests/Splitio-tests/Unit Tests/Cache/InMemory/SegmentCacheAsyncTests.cs index d44a7343..dcaf47d0 100644 --- a/tests/Splitio-tests/Unit Tests/Cache/InMemory/SegmentCacheAsyncTests.cs +++ b/tests/Splitio-tests/Unit Tests/Cache/InMemory/SegmentCacheAsyncTests.cs @@ -15,14 +15,15 @@ public class SegmentCacheAsyncTests { private readonly ISegmentCache _cache; private EventsManager _eventsManager; - private bool SdkUpdate = false; + private bool SdkUpdateFlag = false; private EventMetadata eMetadata = null; - public event EventHandler PublicSdkUpdateHandler; + public event EventHandler SdkUpdate; + public event EventHandler SdkReady; public SegmentCacheAsyncTests() { var segments = new ConcurrentDictionary(); - _eventsManager = new EventsManager(new EventsManagerConfig()); + _eventsManager = new EventsManager(new EventsManagerConfig(), new EventDelivery()); _cache = new InMemorySegmentCache(segments, _eventsManager); } @@ -60,17 +61,17 @@ public async Task NotifyEventsTest() //Arrange var segmentName = "segment_test"; var toNotify = new List { { segmentName } }; - PublicSdkUpdateHandler += sdkUpdate_callback; - _eventsManager.Register(SdkEvent.SdkUpdate, sdkUpdate_callback); - _eventsManager.Register(SdkEvent.SdkReady, sdkUpdate_callback); + SdkUpdate += sdkUpdate_callback; + _eventsManager.Register(SdkEvent.SdkUpdate, TriggerSdkUpdate); + _eventsManager.Register(SdkEvent.SdkReady, TriggerSdkReady); _eventsManager.NotifyInternalEvent(SdkInternalEvent.SdkReady, new EventMetadata(new Dictionary())); //Act - SdkUpdate = false; + SdkUpdateFlag = false; _cache.AddToSegment(segmentName, new List { "abcd", "zzzzf" }); //Assert - Assert.IsTrue(SdkUpdate); + Assert.IsTrue(SdkUpdateFlag); Assert.IsTrue(eMetadata.ContainKey(Splitio.Constants.EventMetadataKeys.Segments)); string segment = (string)eMetadata.GetData()[Splitio.Constants.EventMetadataKeys.Segments]; Assert.AreEqual(segmentName, segment); @@ -78,8 +79,18 @@ public async Task NotifyEventsTest() private void sdkUpdate_callback(object sender, EventMetadata metadata) { - SdkUpdate = true; + SdkUpdateFlag = true; eMetadata = metadata; } + + private void TriggerSdkReady(EventMetadata metaData) + { + SdkReady?.Invoke(this, metaData); + } + + private void TriggerSdkUpdate(EventMetadata metaData) + { + SdkUpdate?.Invoke(this, metaData); + } } } diff --git a/tests/Splitio-tests/Unit Tests/Cache/InMemory/SegmentCacheTests.cs b/tests/Splitio-tests/Unit Tests/Cache/InMemory/SegmentCacheTests.cs index fd9bac22..689d109b 100644 --- a/tests/Splitio-tests/Unit Tests/Cache/InMemory/SegmentCacheTests.cs +++ b/tests/Splitio-tests/Unit Tests/Cache/InMemory/SegmentCacheTests.cs @@ -1,4 +1,5 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; using Splitio.Domain; using Splitio.Services.Cache.Classes; using Splitio.Services.Common; @@ -11,16 +12,17 @@ namespace Splitio_Tests.Unit_Tests.Cache [TestClass] public class SegmentCacheTests { - private bool SdkUpdate = false; + private bool SdkUpdateFlag = false; private EventMetadata eMetadata = null; - public event EventHandler PublicSdkUpdateHandler; + public event EventHandler SdkUpdate; + public event EventHandler SdkReady; [TestMethod] public void RegisterSegmentTest() { //Arrange - var eventsManager = new EventsManager(new EventsManagerConfig()); - var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager); + Mock> eventsManager = new Mock>(); + var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager.Object); var keys = new List { "abcd", "1234" }; var segmentName = "test"; @@ -36,8 +38,8 @@ public void RegisterSegmentTest() public void IsNotInSegmentTest() { //Arrange - var eventsManager = new EventsManager(new EventsManagerConfig()); - var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager); + Mock> eventsManager = new Mock>(); + var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager.Object); var keys = new List { "1234" }; var segmentName = "test"; @@ -53,8 +55,8 @@ public void IsNotInSegmentTest() public void IsInSegmentWithInexistentSegmentTest() { //Arrange - var eventsManager = new EventsManager(new EventsManagerConfig()); - var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager); + Mock> eventsManager = new Mock>(); + var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager.Object); //Act var result = segmentCache.IsInSegment("test", "abcd"); @@ -67,8 +69,8 @@ public void IsInSegmentWithInexistentSegmentTest() public void RemoveKeyFromSegmentTest() { //Arrange - var eventsManager = new EventsManager(new EventsManagerConfig()); - var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager); + Mock> eventsManager = new Mock>(); + var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager.Object); var keys = new List { "1234" }; var segmentName = "test"; @@ -87,8 +89,8 @@ public void RemoveKeyFromSegmentTest() public void SetAndGetChangeNumberTest() { //Arrange - var eventsManager = new EventsManager(new EventsManagerConfig()); - var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager); + Mock> eventsManager = new Mock>(); + var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager.Object); var segmentName = "test"; //Act @@ -104,33 +106,33 @@ public void SetAndGetChangeNumberTest() public void NotifyEventsTest() { //Arrange - var eventsManager = new EventsManager(new EventsManagerConfig()); + var eventsManager = new EventsManager(new EventsManagerConfig(), new EventDelivery()); var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager); var keys = new List { "1234" }; var segmentName = "test"; var toNotify = new List { { segmentName } }; - PublicSdkUpdateHandler += sdkUpdate_callback; - eventsManager.Register(SdkEvent.SdkUpdate, sdkUpdate_callback); - eventsManager.Register(SdkEvent.SdkReady, sdkUpdate_callback); + SdkUpdate += sdkUpdate_callback; + eventsManager.Register(SdkEvent.SdkUpdate, TriggerSdkUpdate); + eventsManager.Register(SdkEvent.SdkReady, TriggerSdkReady); eventsManager.NotifyInternalEvent(SdkInternalEvent.SdkReady, new EventMetadata(new Dictionary())); // Act - SdkUpdate = false; + SdkUpdateFlag = false; segmentCache.AddToSegment(segmentName, keys); //Assert - Assert.IsTrue(SdkUpdate); + Assert.IsTrue(SdkUpdateFlag); Assert.IsTrue(eMetadata.ContainKey(Splitio.Constants.EventMetadataKeys.Segments)); string segment = (string) eMetadata.GetData()[Splitio.Constants.EventMetadataKeys.Segments]; Assert.AreEqual(segmentName, segment); // Act - SdkUpdate = false; + SdkUpdateFlag = false; eMetadata = null; segmentCache.RemoveFromSegment(segmentName, keys); //Assert - Assert.IsTrue(SdkUpdate); + Assert.IsTrue(SdkUpdateFlag); Assert.IsTrue(eMetadata.ContainKey(Splitio.Constants.EventMetadataKeys.Segments)); segment = (string)eMetadata.GetData()[Splitio.Constants.EventMetadataKeys.Segments]; Assert.AreEqual(segmentName, segment); @@ -138,8 +140,18 @@ public void NotifyEventsTest() private void sdkUpdate_callback(object sender, EventMetadata metadata) { - SdkUpdate = true; + SdkUpdateFlag = true; eMetadata = metadata; } + + private void TriggerSdkReady(EventMetadata metaData) + { + SdkReady?.Invoke(this, metaData); + } + + private void TriggerSdkUpdate(EventMetadata metaData) + { + SdkUpdate?.Invoke(this, metaData); + } } } diff --git a/tests/Splitio-tests/Unit Tests/Cache/InMemory/SplitCacheAsyncTests.cs b/tests/Splitio-tests/Unit Tests/Cache/InMemory/SplitCacheAsyncTests.cs index 9fb65e65..985b6275 100644 --- a/tests/Splitio-tests/Unit Tests/Cache/InMemory/SplitCacheAsyncTests.cs +++ b/tests/Splitio-tests/Unit Tests/Cache/InMemory/SplitCacheAsyncTests.cs @@ -18,16 +18,16 @@ public class SplitCacheAsyncTests private readonly IFlagSetsFilter _flagSetsFilter; private readonly IFeatureFlagCache _cache; private readonly EventsManager _eventsManager; - private bool SdkUpdate = false; + private bool SdkUpdateFlag = false; private EventMetadata eMetadata = null; - public event EventHandler PublicSdkUpdateHandler; + public event EventHandler SdkUpdate; + public event EventHandler SdkReady; public SplitCacheAsyncTests() { _flagSetsFilter = new FlagSetsFilter(new HashSet()); var splits = new ConcurrentDictionary(); - _eventsManager = new EventsManager(new EventsManagerConfig()); - + _eventsManager = new EventsManager(new EventsManagerConfig(), new EventDelivery()); _cache = new InMemorySplitCache(splits, _flagSetsFilter, _eventsManager); } @@ -193,12 +193,12 @@ public async Task NotifyUpdateEventTest() }); toNotify.Add($"feature-flag-{i}"); } - PublicSdkUpdateHandler += sdkUpdate_callback; - _eventsManager.Register(SdkEvent.SdkUpdate, sdkUpdate_callback); - _eventsManager.Register(SdkEvent.SdkReady, sdkUpdate_callback); + SdkUpdate += sdkUpdate_callback; + _eventsManager.Register(SdkEvent.SdkUpdate, TriggerSdkUpdate); + _eventsManager.Register(SdkEvent.SdkReady, TriggerSdkReady); _eventsManager.NotifyInternalEvent(SdkInternalEvent.SdkReady, new EventMetadata(new Dictionary())); - SdkUpdate = false; + SdkUpdateFlag = false; _cache.Update(toAdd, new List(), -1); // Act. @@ -206,7 +206,7 @@ public async Task NotifyUpdateEventTest() // Assert. Assert.AreEqual(5, result.Count); - Assert.IsTrue(SdkUpdate); + Assert.IsTrue(SdkUpdateFlag); Assert.IsTrue(eMetadata.ContainKey(Splitio.Constants.EventMetadataKeys.Flags)); List flags = (List)eMetadata.GetData()[Splitio.Constants.EventMetadataKeys.Flags]; Assert.IsTrue(flags.Count == 5); @@ -215,11 +215,11 @@ public async Task NotifyUpdateEventTest() Assert.IsTrue(flags.Contains($"feature-flag-{i}")); } - SdkUpdate = false; + SdkUpdateFlag = false; eMetadata = null; _cache.Kill(123, "feature-flag-1", "off"); - Assert.IsTrue(SdkUpdate); + Assert.IsTrue(SdkUpdateFlag); Assert.IsTrue(eMetadata.ContainKey(Splitio.Constants.EventMetadataKeys.Flags)); flags = (List)eMetadata.GetData()[Splitio.Constants.EventMetadataKeys.Flags]; Assert.IsTrue(flags.Count == 1); @@ -228,8 +228,18 @@ public async Task NotifyUpdateEventTest() private void sdkUpdate_callback(object sender, EventMetadata metadata) { - SdkUpdate = true; + SdkUpdateFlag = true; eMetadata = metadata; } + + private void TriggerSdkReady(EventMetadata metaData) + { + SdkReady?.Invoke(this, metaData); + } + + private void TriggerSdkUpdate(EventMetadata metaData) + { + SdkUpdate?.Invoke(this, metaData); + } } } diff --git a/tests/Splitio-tests/Unit Tests/Cache/InMemory/SplitCacheTests.cs b/tests/Splitio-tests/Unit Tests/Cache/InMemory/SplitCacheTests.cs index 3d545067..651f66ee 100644 --- a/tests/Splitio-tests/Unit Tests/Cache/InMemory/SplitCacheTests.cs +++ b/tests/Splitio-tests/Unit Tests/Cache/InMemory/SplitCacheTests.cs @@ -15,9 +15,10 @@ namespace Splitio_Tests.Unit_Tests.Cache public class SplitCacheTests { private readonly Mock _flagSetsFilter; - private bool SdkUpdate = false; + private bool SdkUpdateFlag = false; private EventMetadata eMetadata = null; - public event EventHandler PublicSdkUpdateHandler; + public event EventHandler SdkUpdate; + public event EventHandler SdkReady; public SplitCacheTests() { @@ -28,8 +29,8 @@ public SplitCacheTests() public void AddAndGetSplitTest() { //Arrange - var eventsManager = new EventsManager(new EventsManagerConfig()); - var splitCache = new InMemorySplitCache(new ConcurrentDictionary(), _flagSetsFilter.Object, eventsManager); + Mock> eventsManager = new Mock>(); + var splitCache = new InMemorySplitCache(new ConcurrentDictionary(), _flagSetsFilter.Object, eventsManager.Object); var splitName = "test1"; //Act @@ -44,8 +45,8 @@ public void AddAndGetSplitTest() public void AddDuplicateSplitTest() { //Arrange - var eventsManager = new EventsManager(new EventsManagerConfig()); - var splitCache = new InMemorySplitCache(new ConcurrentDictionary(), _flagSetsFilter.Object, eventsManager); + Mock> eventsManager = new Mock>(); + var splitCache = new InMemorySplitCache(new ConcurrentDictionary(), _flagSetsFilter.Object, eventsManager.Object); var splitName = "test1"; //Act @@ -65,8 +66,8 @@ public void AddDuplicateSplitTest() public void GetInexistentSplitTest() { //Arrange - var eventsManager = new EventsManager(new EventsManagerConfig()); - var splitCache = new InMemorySplitCache(new ConcurrentDictionary(), _flagSetsFilter.Object, eventsManager); + Mock> eventsManager = new Mock>(); + var splitCache = new InMemorySplitCache(new ConcurrentDictionary(), _flagSetsFilter.Object, eventsManager.Object); var splitName = "test1"; //Act @@ -83,8 +84,8 @@ public void RemoveSplitTest() var splitName = "test1"; var splits = new ConcurrentDictionary(); splits.TryAdd(splitName, new ParsedSplit() { name = splitName }); - var eventsManager = new EventsManager(new EventsManagerConfig()); - var splitCache = new InMemorySplitCache(splits, _flagSetsFilter.Object, eventsManager); + Mock> eventsManager = new Mock>(); + var splitCache = new InMemorySplitCache(splits, _flagSetsFilter.Object, eventsManager.Object); //Act splitCache.Update(new List(), new List { splitName }, -1); @@ -98,8 +99,8 @@ public void RemoveSplitTest() public void SetAndGetChangeNumberTest() { //Arrange - var eventsManager = new EventsManager(new EventsManagerConfig()); - var splitCache = new InMemorySplitCache(new ConcurrentDictionary(), _flagSetsFilter.Object, eventsManager); + Mock> eventsManager = new Mock>(); + var splitCache = new InMemorySplitCache(new ConcurrentDictionary(), _flagSetsFilter.Object, eventsManager.Object); var changeNumber = 1234; //Act @@ -114,8 +115,8 @@ public void SetAndGetChangeNumberTest() public void GetAllSplitsTest() { //Arrange - var eventsManager = new EventsManager(new EventsManagerConfig()); - var splitCache = new InMemorySplitCache(new ConcurrentDictionary(), _flagSetsFilter.Object, eventsManager); + Mock> eventsManager = new Mock>(); + var splitCache = new InMemorySplitCache(new ConcurrentDictionary(), _flagSetsFilter.Object, eventsManager.Object); var splitName = "test1"; var splitName2 = "test2"; @@ -134,8 +135,8 @@ public void GetAllSplitsTest() public void AddOrUpdate_WhenUpdateTraffictType_ReturnsTrue() { // Arrange - var eventsManager = new EventsManager(new EventsManagerConfig()); - var splitCache = new InMemorySplitCache(new ConcurrentDictionary(), _flagSetsFilter.Object, eventsManager); + Mock> eventsManager = new Mock>(); + var splitCache = new InMemorySplitCache(new ConcurrentDictionary(), _flagSetsFilter.Object, eventsManager.Object); var splitName = "split_1"; var splitName2 = "split_2"; @@ -177,8 +178,8 @@ public void GetNamesByFlagSetsWithoutFilter() Sets = new HashSet { "set1", "set2" } }); - var eventsManager = new EventsManager(new EventsManagerConfig()); - var splitCache = new InMemorySplitCache(featureFlags, new FlagSetsFilter(new HashSet()), eventsManager); + Mock> eventsManager = new Mock>(); + var splitCache = new InMemorySplitCache(featureFlags, new FlagSetsFilter(new HashSet()), eventsManager.Object); var flagSetNames = new List { "set1", "set2", "set3", "set4" }; // Act. @@ -221,8 +222,8 @@ public void GetNamesByFlagSetsWithFilters() defaultTreatment = "on", Sets = new HashSet { "set1", "set2" } }); - var eventsManager = new EventsManager(new EventsManagerConfig()); - var splitCache = new InMemorySplitCache(featureFlags, new FlagSetsFilter(new HashSet() { "set1", "set2" }), eventsManager); + Mock> eventsManager = new Mock>(); + var splitCache = new InMemorySplitCache(featureFlags, new FlagSetsFilter(new HashSet() { "set1", "set2" }), eventsManager.Object); var flagSetNames = new List { "set1", "set2", "set3", "set4" }; // Act. @@ -244,34 +245,34 @@ public void GetNamesByFlagSetsWithFilters() public void NotifyUpdateEventTest() { // Arrange. - var eventsManager = new EventsManager(new EventsManagerConfig()); + var eventsManager = new EventsManager(new EventsManagerConfig(), new EventDelivery()); var splitCache = new InMemorySplitCache(new ConcurrentDictionary(), _flagSetsFilter.Object, eventsManager); var splitName = "test1"; var toNotify = new List { { splitName } }; - PublicSdkUpdateHandler += sdkUpdate_callback; - eventsManager.Register(SdkEvent.SdkUpdate, sdkUpdate_callback); - eventsManager.Register(SdkEvent.SdkReady, sdkUpdate_callback); + SdkUpdate += sdkUpdate_callback; + eventsManager.Register(SdkEvent.SdkUpdate, TriggerSdkUpdate); + eventsManager.Register(SdkEvent.SdkReady, TriggerSdkReady); eventsManager.NotifyInternalEvent(SdkInternalEvent.SdkReady, new EventMetadata(new Dictionary())); // Act. - SdkUpdate = false; + SdkUpdateFlag = false; splitCache.Update(new List { new ParsedSplit() { name = splitName } }, new List(), -1); // Assert. - Assert.IsTrue(SdkUpdate); + Assert.IsTrue(SdkUpdateFlag); Assert.IsTrue(eMetadata.ContainKey(Splitio.Constants.EventMetadataKeys.Flags)); List flags = (List)eMetadata.GetData()[Splitio.Constants.EventMetadataKeys.Flags]; Assert.IsTrue(flags.Count == 1); Assert.IsTrue(flags.Contains(splitName)); // Act. - SdkUpdate = false; + SdkUpdateFlag = false; eMetadata = null; splitCache.Kill(123, splitName, "off"); // Assert. - Assert.IsTrue(SdkUpdate); + Assert.IsTrue(SdkUpdateFlag); Assert.IsTrue(eMetadata.ContainKey(Splitio.Constants.EventMetadataKeys.Flags)); flags = (List)eMetadata.GetData()[Splitio.Constants.EventMetadataKeys.Flags]; Assert.IsTrue(flags.Count == 1); @@ -280,8 +281,18 @@ public void NotifyUpdateEventTest() private void sdkUpdate_callback(object sender, EventMetadata metadata) { - SdkUpdate = true; + SdkUpdateFlag = true; eMetadata = metadata; } + + private void TriggerSdkReady(EventMetadata metaData) + { + SdkReady?.Invoke(this, metaData); + } + + private void TriggerSdkUpdate(EventMetadata metaData) + { + SdkUpdate?.Invoke(this, metaData); + } } } diff --git a/tests/Splitio-tests/Unit Tests/Client/LocalhostClientForTesting.cs b/tests/Splitio-tests/Unit Tests/Client/LocalhostClientForTesting.cs index b97cff0e..deb27c04 100644 --- a/tests/Splitio-tests/Unit Tests/Client/LocalhostClientForTesting.cs +++ b/tests/Splitio-tests/Unit Tests/Client/LocalhostClientForTesting.cs @@ -7,7 +7,7 @@ namespace Splitio_Tests.Unit_Tests.Client { public class LocalhostClientForTesting : LocalhostClient { - public LocalhostClientForTesting(string filePath, FallbackTreatmentCalculator fallbackTreatmentCalculator) : base(new ConfigurationOptions { LocalhostFilePath = filePath }, fallbackTreatmentCalculator, new EventsManager(new EventsManagerConfig())) + public LocalhostClientForTesting(string filePath, FallbackTreatmentCalculator fallbackTreatmentCalculator) : base(new ConfigurationOptions { LocalhostFilePath = filePath }, fallbackTreatmentCalculator, new EventsManager(new EventsManagerConfig(), new EventDelivery())) { } } } diff --git a/tests/Splitio-tests/Unit Tests/Client/LocalhostClientUnitTests.cs b/tests/Splitio-tests/Unit Tests/Client/LocalhostClientUnitTests.cs index 05f826be..7bdfe24a 100644 --- a/tests/Splitio-tests/Unit Tests/Client/LocalhostClientUnitTests.cs +++ b/tests/Splitio-tests/Unit Tests/Client/LocalhostClientUnitTests.cs @@ -21,7 +21,7 @@ public LocalhostClientUnitTests() // This line is to clean the warnings. rootFilePath = string.Empty; _fallbackTreatmentCalculator = new FallbackTreatmentCalculator(new FallbackTreatmentsConfiguration()); - _eventsManager = new EventsManager(new EventsManagerConfig()); + _eventsManager = new EventsManager(new EventsManagerConfig(), new EventDelivery()); #if NET_LATEST rootFilePath = @"Resources\"; diff --git a/tests/Splitio-tests/Unit Tests/Client/SdkReadinessGatesUnitTests.cs b/tests/Splitio-tests/Unit Tests/Client/SdkReadinessGatesUnitTests.cs index 8bd2f7b9..d17713b5 100644 --- a/tests/Splitio-tests/Unit Tests/Client/SdkReadinessGatesUnitTests.cs +++ b/tests/Splitio-tests/Unit Tests/Client/SdkReadinessGatesUnitTests.cs @@ -9,15 +9,15 @@ namespace Splitio_Tests.Unit_Tests.Client [TestClass] public class InMemoryReadinessGatesCacheUnitTests { - private bool SdkReady = false; + private bool SdkReadyFlag = false; private EventMetadata eMetadata = null; - public event EventHandler PublicSdkUpdateHandler; + public event EventHandler SdkReady; [TestMethod] public void IsSDKReadyShouldReturnFalseIfSplitsAreNotReady() { //Arrange - var gates = new InMemoryReadinessGatesCache(new EventsManager(new EventsManagerConfig())); + var gates = new InMemoryReadinessGatesCache(new EventsManager(new EventsManagerConfig(), new EventDelivery())); //Act var result = gates.IsReady(); @@ -30,23 +30,28 @@ public void IsSDKReadyShouldReturnFalseIfSplitsAreNotReady() public void TestFireReadyEvent() { //Arrange - EventsManager eventsManager = new EventsManager(new EventsManagerConfig()); + EventsManager eventsManager = new EventsManager(new EventsManagerConfig(), new EventDelivery()); var gates = new InMemoryReadinessGatesCache(eventsManager); - PublicSdkUpdateHandler += sdkReady_callback; - eventsManager.Register(SdkEvent.SdkReady, PublicSdkUpdateHandler); + SdkReady += sdkReady_callback; + eventsManager.Register(SdkEvent.SdkReady, TriggerSdkReady); //Act gates.SetReady(); // Assert. - Assert.IsTrue(SdkReady); + Assert.IsTrue(SdkReadyFlag); Assert.AreEqual(0, eMetadata.GetData().Count); } private void sdkReady_callback(object sender, EventMetadata metadata) { - SdkReady = true; + SdkReadyFlag = true; eMetadata = metadata; } + + private void TriggerSdkReady(EventMetadata metaData) + { + SdkReady?.Invoke(this, metaData); + } } } diff --git a/tests/Splitio-tests/Unit Tests/Client/SplitClientForTesting.cs b/tests/Splitio-tests/Unit Tests/Client/SplitClientForTesting.cs index 12277bcb..a44f94eb 100644 --- a/tests/Splitio-tests/Unit Tests/Client/SplitClientForTesting.cs +++ b/tests/Splitio-tests/Unit Tests/Client/SplitClientForTesting.cs @@ -23,7 +23,7 @@ public SplitClientForTesting(IFeatureFlagCacheConsumer featureFlagCacheConsumer, ISyncManager syncManager, FallbackTreatmentCalculator fallbackTreatmentCalculator, ITelemetryEvaluationProducer telemetryEvaluationProducer) - : base("SplitClientForTesting", fallbackTreatmentCalculator, new EventsManager(new EventsManagerConfig())) + : base("SplitClientForTesting", fallbackTreatmentCalculator, new EventsManager(new EventsManagerConfig(), new EventDelivery())) { _eventsLog = eventsLog; _impressionsLog = impressionsLog; diff --git a/tests/Splitio-tests/Unit Tests/Common/EventDeliveryTests.cs b/tests/Splitio-tests/Unit Tests/Common/EventDeliveryTests.cs index 80711087..1619f9d1 100644 --- a/tests/Splitio-tests/Unit Tests/Common/EventDeliveryTests.cs +++ b/tests/Splitio-tests/Unit Tests/Common/EventDeliveryTests.cs @@ -1,7 +1,6 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using Splitio.Domain; using Splitio.Services.Common; -using System; using System.Collections.Generic; namespace Splitio_Tests.Unit_Tests.Common @@ -11,7 +10,6 @@ public class EventDeliveryTests { private bool SdkReady = false; private EventMetadata eMetadata = null; - public event EventHandler PublicSdkReadyHandler; [TestMethod] public void TestFiringEvents() @@ -19,14 +17,12 @@ public void TestFiringEvents() //Act EventDelivery eventDelivery = new EventDelivery(); - PublicSdkReadyHandler += sdkReady_callback; - Dictionary metaData = new Dictionary { { "flags", new List {{ "flag1" }} } }; - eventDelivery.Deliver(SdkEvent.SdkReady, new EventMetadata(metaData), PublicSdkReadyHandler); + eventDelivery.Deliver(SdkEvent.SdkReady, new EventMetadata(metaData), sdkReady_callback); Assert.IsTrue(SdkReady); VerifyMetadata(eMetadata); @@ -40,7 +36,7 @@ void VerifyMetadata(EventMetadata eMetdata) Assert.IsTrue(flags.Contains("flag1")); } - private void sdkReady_callback(object sender, EventMetadata metadata) + private void sdkReady_callback(EventMetadata metadata) { SdkReady = true; eMetadata = metadata; diff --git a/tests/Splitio-tests/Unit Tests/Common/EventsManagerTests.cs b/tests/Splitio-tests/Unit Tests/Common/EventsManagerTests.cs index 3c1a25d9..5d662d98 100644 --- a/tests/Splitio-tests/Unit Tests/Common/EventsManagerTests.cs +++ b/tests/Splitio-tests/Unit Tests/Common/EventsManagerTests.cs @@ -9,123 +9,123 @@ namespace Splitio_Tests.Unit_Tests.Common [TestClass] public class EventsManagerTests { - private bool SdkReady = false; - private bool SdkReady2 = false; - private bool SdkTimedOut = false; - private bool SdkUpdate = false; + private bool SdkReadyFlag = false; + private bool SdkReadyFlag2 = false; + private bool SdkTimedOutFlag = false; + private bool SdkUpdateFlag = false; private EventMetadata eMetadata = null; - public event EventHandler PublicSdkReadyHandler; - public event EventHandler PublicSdkUpdateHandler; - public event EventHandler PublicSdkTimedOutHandler; + public event EventHandler SdkReady; + public event EventHandler SdkUpdate; + public event EventHandler SdkTimedOut; [TestMethod] public void TestFiringEvents() { //Act EventsManagerConfig config = new EventsManagerConfig(); - EventsManager eventsManager = new EventsManager(config); + EventsManager eventsManager = new EventsManager(config, new EventDelivery()); - PublicSdkReadyHandler += sdkReady_callback; - PublicSdkReadyHandler += sdkReady_callback2; - PublicSdkUpdateHandler += sdkUpdate_callback; - PublicSdkTimedOutHandler += sdkTimedOut_callback; + SdkReady += sdkReady_callback; + SdkReady += sdkReady_callback2; + SdkUpdate += sdkUpdate_callback; + SdkTimedOut += sdkTimedOut_callback; Dictionary metaData = new Dictionary { { "flags", new List {{ "flag1" }} } }; - eventsManager.Register(SdkEvent.SdkReady, PublicSdkReadyHandler); - eventsManager.Register(SdkEvent.SdkUpdate, PublicSdkUpdateHandler); + eventsManager.Register(SdkEvent.SdkReady, TriggerSdkReady); + eventsManager.Register(SdkEvent.SdkUpdate, TriggerSdkUpdate); eventsManager.NotifyInternalEvent(SdkInternalEvent.RuleBasedSegmentsUpdated, new EventMetadata(metaData)); eventsManager.NotifyInternalEvent(SdkInternalEvent.FlagKilledNotification, new EventMetadata(metaData)); eventsManager.NotifyInternalEvent(SdkInternalEvent.SegmentsUpdated, new EventMetadata(metaData)); eventsManager.NotifyInternalEvent(SdkInternalEvent.FlagsUpdated, new EventMetadata(metaData)); - Assert.IsFalse(SdkReady); - Assert.IsFalse(SdkUpdate); - Assert.IsFalse(SdkTimedOut); + Assert.IsFalse(SdkReadyFlag); + Assert.IsFalse(SdkUpdateFlag); + Assert.IsFalse(SdkTimedOutFlag); ResetAllVariables(); eventsManager.NotifyInternalEvent(SdkInternalEvent.SdkTimedOut, new EventMetadata(metaData)); - System.Threading.SpinWait.SpinUntil(() => SdkTimedOut, TimeSpan.FromMilliseconds(500)); - Assert.IsFalse(SdkReady); - Assert.IsFalse(SdkUpdate); - Assert.IsFalse(SdkTimedOut); // not fired as it is not registered yet + System.Threading.SpinWait.SpinUntil(() => SdkTimedOutFlag, TimeSpan.FromMilliseconds(500)); + Assert.IsFalse(SdkReadyFlag); + Assert.IsFalse(SdkUpdateFlag); + Assert.IsFalse(SdkTimedOutFlag); // not fired as it is not registered yet - eventsManager.Register(SdkEvent.SdkReadyTimeout, PublicSdkTimedOutHandler); + eventsManager.Register(SdkEvent.SdkReadyTimeout, TriggerSdkTimeout); eventsManager.NotifyInternalEvent(SdkInternalEvent.SdkTimedOut, new EventMetadata(metaData)); - System.Threading.SpinWait.SpinUntil(() => SdkTimedOut, TimeSpan.FromMilliseconds(500)); - Assert.IsFalse(SdkReady); - Assert.IsFalse(SdkUpdate); - Assert.IsTrue(SdkTimedOut); + System.Threading.SpinWait.SpinUntil(() => SdkTimedOutFlag, TimeSpan.FromMilliseconds(500)); + Assert.IsFalse(SdkReadyFlag); + Assert.IsFalse(SdkUpdateFlag); + Assert.IsTrue(SdkTimedOutFlag); VerifyMetadata(eMetadata); ResetAllVariables(); eventsManager.NotifyInternalEvent(SdkInternalEvent.SdkReady, new EventMetadata(metaData)); - System.Threading.SpinWait.SpinUntil(() => SdkReady, TimeSpan.FromMilliseconds(500)); - Assert.IsTrue(SdkReady); - Assert.IsTrue(SdkReady2); - Assert.IsFalse(SdkUpdate); - Assert.IsFalse(SdkTimedOut); + System.Threading.SpinWait.SpinUntil(() => SdkReadyFlag, TimeSpan.FromMilliseconds(500)); + Assert.IsTrue(SdkReadyFlag); + Assert.IsTrue(SdkReadyFlag2); + Assert.IsFalse(SdkUpdateFlag); + Assert.IsFalse(SdkTimedOutFlag); VerifyMetadata(eMetadata); ResetAllVariables(); - eventsManager.Register(SdkEvent.SdkReadyTimeout, PublicSdkTimedOutHandler); + eventsManager.Register(SdkEvent.SdkReadyTimeout, TriggerSdkTimeout); eventsManager.NotifyInternalEvent(SdkInternalEvent.SdkTimedOut, new EventMetadata(metaData)); - System.Threading.SpinWait.SpinUntil(() => SdkTimedOut, TimeSpan.FromMilliseconds(500)); - Assert.IsFalse(SdkReady); - Assert.IsFalse(SdkUpdate); - Assert.IsFalse(SdkTimedOut); // not fired as suppressed by sdkReady + System.Threading.SpinWait.SpinUntil(() => SdkTimedOutFlag, TimeSpan.FromMilliseconds(500)); + Assert.IsFalse(SdkReadyFlag); + Assert.IsFalse(SdkUpdateFlag); + Assert.IsFalse(SdkTimedOutFlag); // not fired as suppressed by sdkReady ResetAllVariables(); eventsManager.NotifyInternalEvent(SdkInternalEvent.FlagKilledNotification, new EventMetadata(metaData)); - System.Threading.SpinWait.SpinUntil(() => SdkUpdate, TimeSpan.FromMilliseconds(500)); - Assert.IsFalse(SdkTimedOut); - Assert.IsFalse(SdkReady); - Assert.IsTrue(SdkUpdate); + System.Threading.SpinWait.SpinUntil(() => SdkUpdateFlag, TimeSpan.FromMilliseconds(500)); + Assert.IsFalse(SdkTimedOutFlag); + Assert.IsFalse(SdkReadyFlag); + Assert.IsTrue(SdkUpdateFlag); VerifyMetadata(eMetadata); ResetAllVariables(); eventsManager.NotifyInternalEvent(SdkInternalEvent.SegmentsUpdated, new EventMetadata(metaData)); - System.Threading.SpinWait.SpinUntil(() => SdkUpdate, TimeSpan.FromMilliseconds(500)); - Assert.IsFalse(SdkTimedOut); - Assert.IsFalse(SdkReady); - Assert.IsTrue(SdkUpdate); + System.Threading.SpinWait.SpinUntil(() => SdkUpdateFlag, TimeSpan.FromMilliseconds(500)); + Assert.IsFalse(SdkTimedOutFlag); + Assert.IsFalse(SdkReadyFlag); + Assert.IsTrue(SdkUpdateFlag); VerifyMetadata(eMetadata); ResetAllVariables(); eventsManager.NotifyInternalEvent(SdkInternalEvent.RuleBasedSegmentsUpdated, new EventMetadata(metaData)); - System.Threading.SpinWait.SpinUntil(() => SdkUpdate, TimeSpan.FromMilliseconds(500)); - Assert.IsFalse(SdkTimedOut); - Assert.IsFalse(SdkReady); - Assert.IsTrue(SdkUpdate); + System.Threading.SpinWait.SpinUntil(() => SdkUpdateFlag, TimeSpan.FromMilliseconds(500)); + Assert.IsFalse(SdkTimedOutFlag); + Assert.IsFalse(SdkReadyFlag); + Assert.IsTrue(SdkUpdateFlag); VerifyMetadata(eMetadata); ResetAllVariables(); eventsManager.NotifyInternalEvent(SdkInternalEvent.FlagsUpdated, new EventMetadata(metaData)); - System.Threading.SpinWait.SpinUntil(() => SdkUpdate, TimeSpan.FromMilliseconds(500)); - Assert.IsFalse(SdkTimedOut); - Assert.IsFalse(SdkReady); - Assert.IsTrue(SdkUpdate); + System.Threading.SpinWait.SpinUntil(() => SdkUpdateFlag, TimeSpan.FromMilliseconds(500)); + Assert.IsFalse(SdkTimedOutFlag); + Assert.IsFalse(SdkReadyFlag); + Assert.IsTrue(SdkUpdateFlag); VerifyMetadata(eMetadata); eventsManager.Unregister(SdkEvent.SdkUpdate); eventsManager.Unregister(SdkEvent.SdkUpdate); // should not cause exception ResetAllVariables(); eventsManager.NotifyInternalEvent(SdkInternalEvent.FlagsUpdated, new EventMetadata(metaData)); - System.Threading.SpinWait.SpinUntil(() => SdkUpdate, TimeSpan.FromMilliseconds(500)); - Assert.IsFalse(SdkTimedOut); - Assert.IsFalse(SdkReady); - Assert.IsFalse(SdkUpdate); + System.Threading.SpinWait.SpinUntil(() => SdkUpdateFlag, TimeSpan.FromMilliseconds(500)); + Assert.IsFalse(SdkTimedOutFlag); + Assert.IsFalse(SdkReadyFlag); + Assert.IsFalse(SdkUpdateFlag); } void ResetAllVariables() { - SdkReady = false; - SdkReady2 = false; - SdkTimedOut = false; + SdkReadyFlag = false; + SdkReadyFlag2 = false; + SdkTimedOutFlag = false; eMetadata = null; - SdkUpdate = false; + SdkUpdateFlag = false; } void VerifyMetadata(EventMetadata eMetdata) @@ -138,26 +138,42 @@ void VerifyMetadata(EventMetadata eMetdata) private void sdkUpdate_callback(object sender, EventMetadata metadata) { - SdkUpdate = true; + SdkUpdateFlag = true; eMetadata = metadata; } private void sdkReady_callback(object sender, EventMetadata metadata) { - SdkReady = true; + SdkReadyFlag = true; eMetadata = metadata; } private void sdkReady_callback2(object sender, EventMetadata metadata) { - SdkReady2 = true; + SdkReadyFlag2 = true; eMetadata = metadata; } private void sdkTimedOut_callback(object sender, EventMetadata metadata) { - SdkTimedOut = true; + SdkTimedOutFlag = true; eMetadata = metadata; } + + private void TriggerSdkReady(EventMetadata metaData) + { + SdkReady?.Invoke(this, metaData); + } + + private void TriggerSdkUpdate(EventMetadata metaData) + { + SdkUpdate?.Invoke(this, metaData); + } + + private void TriggerSdkTimeout(EventMetadata metaData) + { + SdkTimedOut?.Invoke(this, metaData); + } + } } diff --git a/tests/Splitio-tests/Unit Tests/Impressions/ImpressionsCounterTests.cs b/tests/Splitio-tests/Unit Tests/Impressions/ImpressionsCounterTests.cs index 42df730c..aad37a8d 100644 --- a/tests/Splitio-tests/Unit Tests/Impressions/ImpressionsCounterTests.cs +++ b/tests/Splitio-tests/Unit Tests/Impressions/ImpressionsCounterTests.cs @@ -29,7 +29,7 @@ public void Start_ShouldSendImpressionsCount() { // Arrange. var config = new ComponentConfig(5, 5); - var statusManager = new InMemoryReadinessGatesCache(new EventsManager(new EventsManagerConfig())); + var statusManager = new InMemoryReadinessGatesCache(new EventsManager(new EventsManagerConfig(), new EventDelivery())); var taskManager = new TasksManager(statusManager); var task = taskManager.NewPeriodicTask(Splitio.Enums.Task.ImpressionsCountSender, 1); var sendBulkDataTask = taskManager.NewOnTimeTask(Splitio.Enums.Task.ImpressionCounterSendBulkData); @@ -53,7 +53,7 @@ public void Start_ShouldNotSendImpressionsCount() { // Arrange. var config = new ComponentConfig(5, 5); - var statusManager = new InMemoryReadinessGatesCache(new EventsManager(new EventsManagerConfig())); + var statusManager = new InMemoryReadinessGatesCache(new EventsManager(new EventsManagerConfig(), new EventDelivery())); var taskManager = new TasksManager(statusManager); var task = taskManager.NewPeriodicTask(Splitio.Enums.Task.ImpressionsCountSender, 1); var sendBulkDataTask = taskManager.NewOnTimeTask(Splitio.Enums.Task.ImpressionCounterSendBulkData); @@ -72,7 +72,7 @@ public async Task Stop_ShouldSendImpressionsCount() { // Arrange. var config = new ComponentConfig(5, 5); - var statusManager = new InMemoryReadinessGatesCache(new EventsManager(new EventsManagerConfig())); + var statusManager = new InMemoryReadinessGatesCache(new EventsManager(new EventsManagerConfig(), new EventDelivery())); var taskManager = new TasksManager(statusManager); var task = taskManager.NewPeriodicTask(Splitio.Enums.Task.ImpressionsCountSender, 100); var sendBulkDataTask = taskManager.NewOnTimeTask(Splitio.Enums.Task.ImpressionCounterSendBulkData); @@ -96,7 +96,7 @@ public async Task Stop_ShouldSendImpressionsCount() public async Task ShouldSend2BulksOfImpressions() { var config = new ComponentConfig(6, 3); - var statusManager = new InMemoryReadinessGatesCache(new EventsManager(new EventsManagerConfig())); + var statusManager = new InMemoryReadinessGatesCache(new EventsManager(new EventsManagerConfig(), new EventDelivery())); var taskManager = new TasksManager(statusManager); var task = taskManager.NewPeriodicTask(Splitio.Enums.Task.ImpressionsCountSender, 100); var sendBulkDataTask = taskManager.NewOnTimeTask(Splitio.Enums.Task.ImpressionCounterSendBulkData); diff --git a/tests/Splitio-tests/Unit Tests/Impressions/UniqueKeysTrackerTests.cs b/tests/Splitio-tests/Unit Tests/Impressions/UniqueKeysTrackerTests.cs index 78a1efc7..6292b5d5 100644 --- a/tests/Splitio-tests/Unit Tests/Impressions/UniqueKeysTrackerTests.cs +++ b/tests/Splitio-tests/Unit Tests/Impressions/UniqueKeysTrackerTests.cs @@ -6,6 +6,7 @@ using Splitio.Services.Impressions.Interfaces; using Splitio.Services.Tasks; using Splitio.Telemetry.Domain; +using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Threading; @@ -51,8 +52,7 @@ public async Task PeriodicTask_ShouldSendBulk() // Assert. Assert.IsTrue(_uniqueKeysTracker.Track("key-test", "feature-name-test")); - Thread.Sleep(2000); - + System.Threading.SpinWait.SpinUntil(() => _cache.Count == 0, TimeSpan.FromMilliseconds(2000)); _senderAdapter.Verify(mock => mock.RecordUniqueKeysAsync(It.IsAny>()), Times.Once); Assert.IsTrue(_uniqueKeysTracker.Track("key-test", "feature-name-test")); @@ -104,7 +104,7 @@ public void Track_WithFullSize_ShouldSendTwoBulk() Thread.Sleep(1000); Assert.IsTrue(_uniqueKeysTracker.Track("key-test-2", "feature-name-test-6")); - Thread.Sleep(3000); + System.Threading.SpinWait.SpinUntil(() => _cache.Count==0, TimeSpan.FromMilliseconds(3000)); _senderAdapter.Verify(mock => mock.RecordUniqueKeysAsync(It.IsAny>()), Times.Exactly(2)); _cache.Clear(); @@ -143,8 +143,8 @@ public void Track_WithFullSize_ShouldSplitBulks() Assert.IsTrue(_uniqueKeysTracker2.Track("key-test-4", "feature-name-test-2")); Assert.IsTrue(_uniqueKeysTracker2.Track("key-test-5", "feature-name-test-2")); Assert.IsTrue(_uniqueKeysTracker2.Track("key-test-6", "feature-name-test-2")); - Thread.Sleep(1000); + System.Threading.SpinWait.SpinUntil(() => _cache2.Count == 0, TimeSpan.FromMilliseconds(3000)); _senderAdapter2.Verify(mock => mock.RecordUniqueKeysAsync(It.IsAny>()), Times.Exactly(4)); _cache2.Clear(); diff --git a/tests/Splitio-tests/Unit Tests/Matchers/UserDefinedSegmentMatcherAsyncTests.cs b/tests/Splitio-tests/Unit Tests/Matchers/UserDefinedSegmentMatcherAsyncTests.cs index e870361b..f3a0ff0e 100644 --- a/tests/Splitio-tests/Unit Tests/Matchers/UserDefinedSegmentMatcherAsyncTests.cs +++ b/tests/Splitio-tests/Unit Tests/Matchers/UserDefinedSegmentMatcherAsyncTests.cs @@ -1,4 +1,5 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; using Splitio.Domain; using Splitio.Services.Cache.Classes; using Splitio.Services.Common; @@ -23,8 +24,8 @@ public async Task MatchAsyncShouldReturnTrueOnMatchingSegmentWithKey() }; var segmentName = "test-segment"; - var eventsManager = new EventsManager(new EventsManagerConfig()); - var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager); + Mock> eventsManager = new Mock>(); + var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager.Object); segmentCache.AddToSegment(segmentName, keys); var matcher = new UserDefinedSegmentMatcher(segmentName, segmentCache); @@ -47,8 +48,8 @@ public async Task MatchAsyncShouldReturnFalseOnNonMatchingSegmentWithKey() }; var segmentName = "test-segment"; - var eventsManager = new EventsManager(new EventsManagerConfig()); - var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager); + Mock> eventsManager = new Mock>(); + var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager.Object); segmentCache.AddToSegment(segmentName, keys); var matcher = new UserDefinedSegmentMatcher(segmentName, segmentCache); @@ -65,8 +66,8 @@ public async Task MatchAsyncShouldReturnFalseIfSegmentEmptyWithKey() { //Arrange var segmentName = "test-segment"; - var eventsManager = new EventsManager(new EventsManagerConfig()); - var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager); + Mock> eventsManager = new Mock>(); + var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager.Object); segmentCache.AddToSegment(segmentName, null); var matcher = new UserDefinedSegmentMatcher(segmentName, segmentCache); @@ -83,8 +84,8 @@ public async Task MatchAsyncShouldReturnFalseIfCacheEmptyWithKey() { //Arrange var segmentName = "test-segment"; - var eventsManager = new EventsManager(new EventsManagerConfig()); - var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager); + Mock> eventsManager = new Mock>(); + var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager.Object); var matcher = new UserDefinedSegmentMatcher(segmentName, segmentCache); @@ -106,8 +107,8 @@ public async Task MatchAsyncShouldReturnTrueOnMatchingSegment() }; var segmentName = "test-segment"; - var eventsManager = new EventsManager(new EventsManagerConfig()); - var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager); + Mock> eventsManager = new Mock>(); + var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager.Object); segmentCache.AddToSegment(segmentName, keys); var matcher = new UserDefinedSegmentMatcher(segmentName, segmentCache); @@ -130,8 +131,8 @@ public async Task MatchAsyncShouldReturnFalseOnNonMatchingSegment() }; var segmentName = "test-segment"; - var eventsManager = new EventsManager(new EventsManagerConfig()); - var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager); + Mock> eventsManager = new Mock>(); + var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager.Object); segmentCache.AddToSegment(segmentName, keys); var matcher = new UserDefinedSegmentMatcher(segmentName, segmentCache); @@ -148,8 +149,8 @@ public async Task MatchAsyncShouldReturnFalseIfSegmentEmpty() { //Arrange var segmentName = "test-segment"; - var eventsManager = new EventsManager(new EventsManagerConfig()); - var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager); + Mock> eventsManager = new Mock>(); + var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager.Object); segmentCache.AddToSegment(segmentName, null); var matcher = new UserDefinedSegmentMatcher(segmentName, segmentCache); @@ -166,8 +167,8 @@ public async Task MatchAsyncShouldReturnFalseIfCacheEmpty() { //Arrange var segmentName = "test-segment"; - var eventsManager = new EventsManager(new EventsManagerConfig()); - var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager); + Mock> eventsManager = new Mock>(); + var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager.Object); var matcher = new UserDefinedSegmentMatcher(segmentName, segmentCache); diff --git a/tests/Splitio-tests/Unit Tests/Matchers/UserDefinedSegmentMatcherTests.cs b/tests/Splitio-tests/Unit Tests/Matchers/UserDefinedSegmentMatcherTests.cs index 11239973..f7c1245c 100644 --- a/tests/Splitio-tests/Unit Tests/Matchers/UserDefinedSegmentMatcherTests.cs +++ b/tests/Splitio-tests/Unit Tests/Matchers/UserDefinedSegmentMatcherTests.cs @@ -1,10 +1,11 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; -using Splitio.Services.Parsing; +using Moq; using Splitio.Domain; -using System.Collections.Generic; -using System.Collections.Concurrent; using Splitio.Services.Cache.Classes; using Splitio.Services.Common; +using Splitio.Services.Parsing; +using System.Collections.Concurrent; +using System.Collections.Generic; namespace Splitio_Tests.Unit_Tests { @@ -22,8 +23,8 @@ public void MatchShouldReturnTrueOnMatchingSegmentWithKey() }; var segmentName = "test-segment"; - var eventsManager = new EventsManager(new EventsManagerConfig()); - var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager); + Mock> eventsManager = new Mock>(); + var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager.Object); segmentCache.AddToSegment(segmentName, keys); var matcher = new UserDefinedSegmentMatcher(segmentName, segmentCache); @@ -46,8 +47,8 @@ public void MatchShouldReturnFalseOnNonMatchingSegmentWithKey() }; var segmentName = "test-segment"; - var eventsManager = new EventsManager(new EventsManagerConfig()); - var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager); + Mock> eventsManager = new Mock>(); + var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager.Object); segmentCache.AddToSegment(segmentName, keys); var matcher = new UserDefinedSegmentMatcher(segmentName, segmentCache); @@ -64,8 +65,8 @@ public void MatchShouldReturnFalseIfSegmentEmptyWithKey() { //Arrange var segmentName = "test-segment"; - var eventsManager = new EventsManager(new EventsManagerConfig()); - var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager); + Mock> eventsManager = new Mock>(); + var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager.Object); segmentCache.AddToSegment(segmentName, null); var matcher = new UserDefinedSegmentMatcher(segmentName, segmentCache); @@ -82,8 +83,8 @@ public void MatchShouldReturnFalseIfCacheEmptyWithKey() { //Arrange var segmentName = "test-segment"; - var eventsManager = new EventsManager(new EventsManagerConfig()); - var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager); + Mock> eventsManager = new Mock>(); + var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager.Object); var matcher = new UserDefinedSegmentMatcher(segmentName, segmentCache); @@ -105,8 +106,8 @@ public void MatchShouldReturnTrueOnMatchingSegment() }; var segmentName = "test-segment"; - var eventsManager = new EventsManager(new EventsManagerConfig()); - var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager); + Mock> eventsManager = new Mock>(); + var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager.Object); segmentCache.AddToSegment(segmentName, keys); var matcher = new UserDefinedSegmentMatcher(segmentName, segmentCache); @@ -129,8 +130,8 @@ public void MatchShouldReturnFalseOnNonMatchingSegment() }; var segmentName = "test-segment"; - var eventsManager = new EventsManager(new EventsManagerConfig()); - var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager); + Mock> eventsManager = new Mock>(); + var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager.Object); segmentCache.AddToSegment(segmentName, keys); var matcher = new UserDefinedSegmentMatcher(segmentName, segmentCache); @@ -147,8 +148,8 @@ public void MatchShouldReturnFalseIfSegmentEmpty() { //Arrange var segmentName = "test-segment"; - var eventsManager = new EventsManager(new EventsManagerConfig()); - var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager); + Mock> eventsManager = new Mock>(); + var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager.Object); segmentCache.AddToSegment(segmentName, null); var matcher = new UserDefinedSegmentMatcher(segmentName, segmentCache); @@ -165,8 +166,8 @@ public void MatchShouldReturnFalseIfCacheEmpty() { //Arrange var segmentName = "test-segment"; - var eventsManager = new EventsManager(new EventsManagerConfig()); - var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager); + Mock> eventsManager = new Mock>(); + var segmentCache = new InMemorySegmentCache(new ConcurrentDictionary(), eventsManager.Object); var matcher = new UserDefinedSegmentMatcher(segmentName, segmentCache); diff --git a/tests/Splitio-tests/Unit Tests/SegmentFetcher/SelfRefreshingSegmentFetcherUnitTests.cs b/tests/Splitio-tests/Unit Tests/SegmentFetcher/SelfRefreshingSegmentFetcherUnitTests.cs index 97a68959..766ddd16 100644 --- a/tests/Splitio-tests/Unit Tests/SegmentFetcher/SelfRefreshingSegmentFetcherUnitTests.cs +++ b/tests/Splitio-tests/Unit Tests/SegmentFetcher/SelfRefreshingSegmentFetcherUnitTests.cs @@ -11,6 +11,7 @@ using Splitio.Services.Shared.Interfaces; using Splitio.Services.SplitFetcher.Interfaces; using Splitio.Services.Tasks; +using Splitio.Telemetry.Domain; using System.Collections.Concurrent; using System.Collections.Generic; using System.Threading; @@ -27,13 +28,13 @@ public class SelfRefreshingSegmentFetcherUnitTests public void InitializeSegmentNotExistent() { // Arrange - var gates = new InMemoryReadinessGatesCache(new EventsManager(new EventsManagerConfig())); + Mock> eventsManager = new Mock>(); + var gates = new InMemoryReadinessGatesCache(eventsManager.Object); gates.SetReady(); var apiClient = new Mock(); var apiFetcher = new ApiSegmentChangeFetcher(apiClient.Object); var segments = new ConcurrentDictionary(); - var eventsManager = new EventsManager(new EventsManagerConfig()); - var cache = new InMemorySegmentCache(segments, eventsManager); + var cache = new InMemorySegmentCache(segments, eventsManager.Object); var segmentsQueue = new SplitQueue(); var taskManager = new TasksManager(gates); var worker = new SegmentTaskWorker(5, segmentsQueue); diff --git a/tests/Splitio-tests/Unit Tests/SegmentFetcher/SelfRefreshingSegmentUnitTests.cs b/tests/Splitio-tests/Unit Tests/SegmentFetcher/SelfRefreshingSegmentUnitTests.cs index 06f32feb..83074558 100644 --- a/tests/Splitio-tests/Unit Tests/SegmentFetcher/SelfRefreshingSegmentUnitTests.cs +++ b/tests/Splitio-tests/Unit Tests/SegmentFetcher/SelfRefreshingSegmentUnitTests.cs @@ -23,8 +23,8 @@ public async Task FetchSegmentNullChangesFetcherResponseShouldNotUpdateCache() var statusManager = new Mock(); var apiFetcher = new ApiSegmentChangeFetcher(apiClient.Object); var segments = new ConcurrentDictionary(); - var eventsManager = new EventsManager(new EventsManagerConfig()); - var cache = new InMemorySegmentCache(segments, eventsManager); + Mock> eventsManager = new Mock>(); + var cache = new InMemorySegmentCache(segments, eventsManager.Object); var segmentFetcher = new SelfRefreshingSegment("payed", apiFetcher, cache, statusManager.Object); apiClient @@ -46,8 +46,8 @@ public async Task FetchSegmentShouldUpdateSegmentsCache() var statusManager = new Mock(); var apiFetcher = new ApiSegmentChangeFetcher(apiClient.Object); var segments = new ConcurrentDictionary(); - var eventsManager = new EventsManager(new EventsManagerConfig()); - var cache = new InMemorySegmentCache(segments, eventsManager); + Mock> eventsManager = new Mock>(); + var cache = new InMemorySegmentCache(segments, eventsManager.Object); var segmentFetcher = new SelfRefreshingSegment("payed", apiFetcher, cache, statusManager.Object); apiClient diff --git a/tests/Splitio-tests/Unit Tests/Shared/SelfRefreshingBlockUntilReadyServiceTests.cs b/tests/Splitio-tests/Unit Tests/Shared/SelfRefreshingBlockUntilReadyServiceTests.cs index 120072f3..6f63501d 100644 --- a/tests/Splitio-tests/Unit Tests/Shared/SelfRefreshingBlockUntilReadyServiceTests.cs +++ b/tests/Splitio-tests/Unit Tests/Shared/SelfRefreshingBlockUntilReadyServiceTests.cs @@ -12,9 +12,9 @@ namespace Splitio_Tests.Unit_Tests.Shared [TestClass] public class SelfRefreshingBlockUntilReadyServiceTests { - private bool SdkTimedOut = false; + private bool SdkTimedOutFlag = false; private EventMetadata eMetadata = null; - public event EventHandler PublicSdkUpdateHandler; + public event EventHandler SdkTimedOut; [TestMethod] public void TestFireTimedOutEvent() @@ -22,10 +22,10 @@ public void TestFireTimedOutEvent() //Arrange Mock statusManager = new Mock(); Mock telemetryProducer = new Mock(); - EventsManager eventsManager = new EventsManager(new EventsManagerConfig()); + EventsManager eventsManager = new EventsManager(new EventsManagerConfig(), new EventDelivery()); var bur = new SelfRefreshingBlockUntilReadyService(statusManager.Object, telemetryProducer.Object, eventsManager); - PublicSdkUpdateHandler += SdkTimedOut_callback; - eventsManager.Register(SdkEvent.SdkReadyTimeout, PublicSdkUpdateHandler); + SdkTimedOut += sdkTimeout_callback; + eventsManager.Register(SdkEvent.SdkReadyTimeout, TriggerSdkTimedOut); statusManager .Setup(mock => mock.WaitUntilReady(1)) .Returns(false); @@ -38,14 +38,19 @@ public void TestFireTimedOutEvent() catch { } // Assert. - Assert.IsTrue(SdkTimedOut); + Assert.IsTrue(SdkTimedOutFlag); Assert.AreEqual(0, eMetadata.GetData().Count); } - private void SdkTimedOut_callback(object sender, EventMetadata metadata) + private void sdkTimeout_callback(object sender, EventMetadata metadata) { - SdkTimedOut = true; + SdkTimedOutFlag = true; eMetadata = metadata; } + + private void TriggerSdkTimedOut(EventMetadata metaData) + { + SdkTimedOut?.Invoke(this, metaData); + } } } diff --git a/tests/Splitio.Integration-tests/EventSourceClientTests.cs b/tests/Splitio.Integration-tests/EventSourceClientTests.cs index 0eb26bdd..b7850c78 100644 --- a/tests/Splitio.Integration-tests/EventSourceClientTests.cs +++ b/tests/Splitio.Integration-tests/EventSourceClientTests.cs @@ -370,7 +370,7 @@ private static (IEventSourceClient, BlockingCollection, var sseHttpClient = new SplitioHttpClient("api-key", config, new Dictionary()); var telemetryRuntimeProducer = new InMemoryTelemetryStorage(); var notificationManagerKeeper = new NotificationManagerKeeper(telemetryRuntimeProducer, streamingStatusQueue); - var statusManager = new InMemoryReadinessGatesCache(new EventsManager(new EventsManagerConfig())); + var statusManager = new InMemoryReadinessGatesCache(new EventsManager(new EventsManagerConfig(), new EventDelivery())); var tasksManager = new TasksManager(statusManager); var task = tasksManager.NewOnTimeTask(Enums.Task.SSEConnect); diff --git a/tests/Splitio.Integration-tests/PollingClientTests.cs b/tests/Splitio.Integration-tests/PollingClientTests.cs index 37c97ee7..8b01959c 100644 --- a/tests/Splitio.Integration-tests/PollingClientTests.cs +++ b/tests/Splitio.Integration-tests/PollingClientTests.cs @@ -18,6 +18,7 @@ namespace Splitio.Integration_tests public class PollingClientTests : BaseIntegrationTests { private static readonly HttpClientMock httpClientMock = new HttpClientMock("PollingClientTests"); + private bool SdkTimeout = false; public PollingClientTests() : base("Polling") { } @@ -161,7 +162,8 @@ public void GetTreatment_WithtBUR_ReturnsTimeOutException() var apikey = "apikey5"; var splitFactory = new SplitFactory(apikey, configurations); - var client = splitFactory.Client(); + var client = (SplitClient)splitFactory.Client(); + client.SdkTimedOut += sdkTimeout_callback; // Act. var exceptionMessage = ""; @@ -178,6 +180,7 @@ public void GetTreatment_WithtBUR_ReturnsTimeOutException() } // Assert. + Assert.IsTrue(SdkTimeout); Assert.IsFalse(isSdkReady); Assert.AreEqual("SDK was not ready in 0 milliseconds", exceptionMessage); @@ -400,7 +403,7 @@ public void Telemetry_ValidatesConfigInitAndStats() try { - client.BlockUntilReady(0); + client.BlockUntilReady(1); } catch { @@ -412,7 +415,8 @@ public void Telemetry_ValidatesConfigInitAndStats() // Assert. Assert.AreEqual("on", result); - + + System.Threading.SpinWait.SpinUntil(() => (GetMetricsConfigSentBackend(httpClientMock) != null) , TimeSpan.FromMilliseconds(1000)); var sentConfig = GetMetricsConfigSentBackend(httpClientMock); Assert.IsNotNull(sentConfig); Assert.AreEqual(configurations.StreamingEnabled, sentConfig.StreamingEnabled); @@ -724,6 +728,11 @@ private static List GetImpressionsCountsSentBackend(HttpClientM return impressions; } + + private void sdkTimeout_callback(object sender, EventMetadata metadata) + { + SdkTimeout = true; + } #endregion } } diff --git a/tests/Splitio.Integration-tests/StreamingClientTests.cs b/tests/Splitio.Integration-tests/StreamingClientTests.cs index 7623dadd..6a22ec53 100644 --- a/tests/Splitio.Integration-tests/StreamingClientTests.cs +++ b/tests/Splitio.Integration-tests/StreamingClientTests.cs @@ -22,6 +22,10 @@ namespace Splitio.Integration_tests public class StreamingClientTests { public static string EventSourcePath => "/eventsource"; + private bool SdkReady = false; + private bool SdkReady2 = false; + private bool SdkReady3 = false; + private bool SdkUpdate = false; [TestMethod] public void GetTreatment_SplitUpdate_ShouldFetch() @@ -56,18 +60,28 @@ public void GetTreatment_SplitUpdate_ShouldFetch() SegmentsRefreshRate = 3000, AuthServiceURL = $"{url}/api/auth", StreamingServiceURL = $"{url}{EventSourcePath}", - StreamingEnabled = true + StreamingEnabled = true, + Logger = SplitLogger.Console(Level.Debug) }; var apikey = "apikey1"; var splitFactory = new SplitFactory(apikey, config); - var client = splitFactory.Client(); + var client = (SplitClient)splitFactory.Client(); + client.SdkReady += sdkReady_callback; + client.SdkReady += sdkReady_callback2; + client.SdkUpdate += sdkUpdate_callback; client.BlockUntilReady(10000); var result = EvaluateWithDelay("admin", "push_test", "after_fetch", client); + client.SdkReady += sdkReady_callback3; + Assert.AreEqual("after_fetch", result); + Assert.IsTrue(SdkReady); + Assert.IsTrue(SdkReady2); + Assert.IsTrue(SdkReady3); + Assert.IsTrue(SdkUpdate); client.Destroy(); } @@ -112,13 +126,11 @@ public void GetTreatment_SplitUpdate_ShouldNotFetch() var splitFactory = new SplitFactory(apikey, config); var client = splitFactory.Client(); - client.BlockUntilReady(10000); var result = EvaluateWithDelay("admin", "push_test", "on", client); Assert.AreEqual("on", result); - client.Destroy(); } } @@ -765,5 +777,25 @@ public static string EvaluateWithDelay(string key, string splitName, string expe return result; } + + private void sdkReady_callback(object sender, EventMetadata metadata) + { + SdkReady = true; + } + + private void sdkReady_callback2(object sender, EventMetadata metadata) + { + SdkReady2 = true; + } + + private void sdkReady_callback3(object sender, EventMetadata metadata) + { + SdkReady3 = true; + } + + private void sdkUpdate_callback(object sender, EventMetadata metadata) + { + SdkUpdate = true; + } } } diff --git a/tests/Splitio.TestSupport/SplitClientForTest.cs b/tests/Splitio.TestSupport/SplitClientForTest.cs index f79f6674..363380c2 100644 --- a/tests/Splitio.TestSupport/SplitClientForTest.cs +++ b/tests/Splitio.TestSupport/SplitClientForTest.cs @@ -11,7 +11,7 @@ public class SplitClientForTest : SplitClient private readonly Dictionary _tests; public SplitClientForTest() : base("SplitClientForTest", new FallbackTreatmentCalculator(new FallbackTreatmentsConfiguration()), - new EventsManager(new EventsManagerConfig())) + new EventsManager(new EventsManagerConfig(), new EventDelivery())) { _tests = new Dictionary(); } From 5d3ac981002f7e594e5c50a13222b87e543360da Mon Sep 17 00:00:00 2001 From: Bilal Al-Shahwany <41021307+chillaq@users.noreply.github.com> Date: Fri, 26 Dec 2025 14:00:00 -0800 Subject: [PATCH 2/3] Update src/Splitio/Services/Cache/Classes/InMemoryReadinessGatesCache.cs Co-authored-by: Mauro Sanz <51236193+sanzmauro@users.noreply.github.com> --- .../Services/Cache/Classes/InMemoryReadinessGatesCache.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Splitio/Services/Cache/Classes/InMemoryReadinessGatesCache.cs b/src/Splitio/Services/Cache/Classes/InMemoryReadinessGatesCache.cs index 9d4b2e2d..f784fbbe 100644 --- a/src/Splitio/Services/Cache/Classes/InMemoryReadinessGatesCache.cs +++ b/src/Splitio/Services/Cache/Classes/InMemoryReadinessGatesCache.cs @@ -30,7 +30,6 @@ public bool WaitUntilReady(int milliseconds) public void SetReady() { _sdkReady.Signal(); - Thread.Sleep(1000); _eventsManager.NotifyInternalEvent(SdkInternalEvent.SdkReady, new EventMetadata(new Dictionary())); } From 855bb4fa0d66e1c7d5247d3a54c8e88b26f492d6 Mon Sep 17 00:00:00 2001 From: Bill Al Date: Fri, 26 Dec 2025 14:12:05 -0800 Subject: [PATCH 3/3] fixed splitclient --- src/Splitio/Services/Client/Classes/SplitClient.cs | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/Splitio/Services/Client/Classes/SplitClient.cs b/src/Splitio/Services/Client/Classes/SplitClient.cs index ece0f641..1d00ef41 100644 --- a/src/Splitio/Services/Client/Classes/SplitClient.cs +++ b/src/Splitio/Services/Client/Classes/SplitClient.cs @@ -84,20 +84,13 @@ public event EventHandler SdkReady public event EventHandler SdkUpdate; public event EventHandler SdkTimedOut; - public event EventHandler SdkReady; - public event EventHandler SdkUpdate; - public event EventHandler SdkTimedOut; - protected SplitClient(string apikey, ConfigurationOptions options) { ApiKey = apikey; _fallbackTreatmentCalculator = new FallbackTreatmentCalculator(options.FallbackTreatments); _eventsManager = new EventsManager(new EventsManagerConfig(), new EventDelivery()); - - _eventsManager.Register(SdkEvent.SdkReady, TriggerSdkReadyEvent); - _eventsManager.Register(SdkEvent.SdkUpdate, TriggerSdkUpdateEvent); - _eventsManager.Register(SdkEvent.SdkReadyTimeout, TriggerSdkTimeoutEvent); - + RegisterEvents(); + _wrapperAdapter = WrapperAdapter.Instance(); _keyValidator = new KeyValidator(); _splitNameValidator = new SplitNameValidator();