Skip to content

Commit ab8eefc

Browse files
[FSSDK-11177] cmab service constructor adjustment
1 parent 2c9fad8 commit ab8eefc

File tree

3 files changed

+74
-87
lines changed

3 files changed

+74
-87
lines changed

OptimizelySDK.Tests/CmabTests/DefaultCmabServiceTest.cs

Lines changed: 55 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -380,57 +380,70 @@ public void UsesExpectedCacheKeyFormat()
380380
[Test]
381381
public void ConstructorWithoutConfigUsesDefaultCacheSettings()
382382
{
383-
var service = new DefaultCmabService();
384-
var cache = GetInternalCache(service) as LruCache<CmabCacheEntry>;
385-
386-
Assert.IsNotNull(cache);
387-
Assert.AreEqual(CmabConstants.DEFAULT_CACHE_SIZE, cache.MaxSizeForTesting);
388-
Assert.AreEqual(CmabConstants.DEFAULT_CACHE_TTL, cache.TimeoutForTesting);
383+
var cache = new LruCache<CmabCacheEntry>(CmabConstants.DEFAULT_CACHE_SIZE,
384+
CmabConstants.DEFAULT_CACHE_TTL, _logger);
385+
var client = new DefaultCmabClient(null,
386+
new CmabRetryConfig(1, TimeSpan.FromMilliseconds(100)), _logger);
387+
var service = new DefaultCmabService(cache, client, _logger);
388+
var internalCache = GetInternalCache(service) as LruCache<CmabCacheEntry>;
389+
390+
Assert.IsNotNull(internalCache);
391+
Assert.AreEqual(CmabConstants.DEFAULT_CACHE_SIZE, internalCache.MaxSizeForTesting);
392+
Assert.AreEqual(CmabConstants.DEFAULT_CACHE_TTL, internalCache.TimeoutForTesting);
389393
}
390394

391395
[Test]
392396
public void ConstructorAppliesCustomCacheSize()
393397
{
394-
var config = new CmabConfig(42);
395-
var service = new DefaultCmabService(config, logger: _logger);
396-
var cache = GetInternalCache(service) as LruCache<CmabCacheEntry>;
397-
398-
Assert.IsNotNull(cache);
399-
Assert.AreEqual(42, cache.MaxSizeForTesting);
400-
Assert.AreEqual(CmabConstants.DEFAULT_CACHE_TTL, cache.TimeoutForTesting);
398+
var cache = new LruCache<CmabCacheEntry>(42, CmabConstants.DEFAULT_CACHE_TTL, _logger);
399+
var client = new DefaultCmabClient(null,
400+
new CmabRetryConfig(1, TimeSpan.FromMilliseconds(100)), _logger);
401+
var service = new DefaultCmabService(cache, client, _logger);
402+
var internalCache = GetInternalCache(service) as LruCache<CmabCacheEntry>;
403+
404+
Assert.IsNotNull(internalCache);
405+
Assert.AreEqual(42, internalCache.MaxSizeForTesting);
406+
Assert.AreEqual(CmabConstants.DEFAULT_CACHE_TTL, internalCache.TimeoutForTesting);
401407
}
402408

403409
[Test]
404410
public void ConstructorAppliesCustomCacheTtl()
405411
{
406412
var expectedTtl = TimeSpan.FromMinutes(3);
407-
var config = new CmabConfig(cacheTtl: expectedTtl);
408-
var service = new DefaultCmabService(config, logger: _logger);
409-
var cache = GetInternalCache(service) as LruCache<CmabCacheEntry>;
410-
411-
Assert.IsNotNull(cache);
412-
Assert.AreEqual(CmabConstants.DEFAULT_CACHE_SIZE, cache.MaxSizeForTesting);
413-
Assert.AreEqual(expectedTtl, cache.TimeoutForTesting);
413+
var cache = new LruCache<CmabCacheEntry>(CmabConstants.DEFAULT_CACHE_SIZE, expectedTtl,
414+
_logger);
415+
var client = new DefaultCmabClient(null,
416+
new CmabRetryConfig(1, TimeSpan.FromMilliseconds(100)), _logger);
417+
var service = new DefaultCmabService(cache, client, _logger);
418+
var internalCache = GetInternalCache(service) as LruCache<CmabCacheEntry>;
419+
420+
Assert.IsNotNull(internalCache);
421+
Assert.AreEqual(CmabConstants.DEFAULT_CACHE_SIZE, internalCache.MaxSizeForTesting);
422+
Assert.AreEqual(expectedTtl, internalCache.TimeoutForTesting);
414423
}
415424

416425
[Test]
417426
public void ConstructorAppliesCustomCacheSizeAndTtl()
418427
{
419428
var expectedTtl = TimeSpan.FromSeconds(90);
420-
var config = new CmabConfig(5, expectedTtl);
421-
var service = new DefaultCmabService(config, logger: _logger);
422-
var cache = GetInternalCache(service) as LruCache<CmabCacheEntry>;
423-
424-
Assert.IsNotNull(cache);
425-
Assert.AreEqual(5, cache.MaxSizeForTesting);
426-
Assert.AreEqual(expectedTtl, cache.TimeoutForTesting);
429+
var cache = new LruCache<CmabCacheEntry>(5, expectedTtl, _logger);
430+
var client = new DefaultCmabClient(null,
431+
new CmabRetryConfig(1, TimeSpan.FromMilliseconds(100)), _logger);
432+
var service = new DefaultCmabService(cache, client, _logger);
433+
var internalCache = GetInternalCache(service) as LruCache<CmabCacheEntry>;
434+
435+
Assert.IsNotNull(internalCache);
436+
Assert.AreEqual(5, internalCache.MaxSizeForTesting);
437+
Assert.AreEqual(expectedTtl, internalCache.TimeoutForTesting);
427438
}
428439

429440
[Test]
430441
public void ConstructorUsesProvidedCustomCacheInstance()
431442
{
432443
var customCache = new LruCache<CmabCacheEntry>(3, TimeSpan.FromSeconds(5), _logger);
433-
var service = new DefaultCmabService(new CmabConfig(customCache), logger: _logger);
444+
var client = new DefaultCmabClient(null,
445+
new CmabRetryConfig(1, TimeSpan.FromMilliseconds(100)), _logger);
446+
var service = new DefaultCmabService(customCache, client, _logger);
434447
var cache = GetInternalCache(service);
435448

436449
Assert.IsNotNull(cache);
@@ -441,7 +454,9 @@ public void ConstructorUsesProvidedCustomCacheInstance()
441454
public void ConstructorAcceptsAnyICacheImplementation()
442455
{
443456
var fakeCache = new FakeCache();
444-
var service = new DefaultCmabService(new CmabConfig(fakeCache), logger: _logger);
457+
var client = new DefaultCmabClient(null,
458+
new CmabRetryConfig(1, TimeSpan.FromMilliseconds(100)), _logger);
459+
var service = new DefaultCmabService(fakeCache, client, _logger);
445460
var cache = GetInternalCache(service);
446461

447462
Assert.IsNotNull(cache);
@@ -452,17 +467,23 @@ public void ConstructorAcceptsAnyICacheImplementation()
452467
[Test]
453468
public void ConstructorCreatesDefaultClientWhenNoneProvided()
454469
{
455-
var service = new DefaultCmabService();
456-
var client = GetInternalClient(service);
457-
458-
Assert.IsInstanceOf<DefaultCmabClient>(client);
470+
var cache = new LruCache<CmabCacheEntry>(CmabConstants.DEFAULT_CACHE_SIZE,
471+
CmabConstants.DEFAULT_CACHE_TTL, _logger);
472+
var client = new DefaultCmabClient(null,
473+
new CmabRetryConfig(1, TimeSpan.FromMilliseconds(100)), _logger);
474+
var service = new DefaultCmabService(cache, client, _logger);
475+
var internalClient = GetInternalClient(service);
476+
477+
Assert.IsInstanceOf<DefaultCmabClient>(internalClient);
459478
}
460479

461480
[Test]
462481
public void ConstructorUsesProvidedClientInstance()
463482
{
464483
var mockClient = new Mock<ICmabClient>().Object;
465-
var service = new DefaultCmabService(cmabClient: mockClient, logger: _logger);
484+
var cache = new LruCache<CmabCacheEntry>(CmabConstants.DEFAULT_CACHE_SIZE,
485+
CmabConstants.DEFAULT_CACHE_TTL, _logger);
486+
var service = new DefaultCmabService(cache, mockClient, _logger);
466487
var client = GetInternalClient(service);
467488

468489
Assert.AreSame(mockClient, client);

OptimizelySDK/Cmab/DefaultCmabService.cs

Lines changed: 3 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -92,53 +92,14 @@ public class DefaultCmabService : ICmabService
9292
/// </summary>
9393
/// <param name="cmabCache">Cache for storing CMAB decisions.</param>
9494
/// <param name="cmabClient">Client for fetching decisions from the CMAB prediction service.</param>
95-
/// <param name="logger">Optional logger for recording service operations.</param>
95+
/// <param name="logger">Logger for recording service operations.</param>
9696
public DefaultCmabService(ICache<CmabCacheEntry> cmabCache,
9797
ICmabClient cmabClient,
98-
ILogger logger = null)
98+
ILogger logger)
9999
{
100100
_cmabCache = cmabCache;
101101
_cmabClient = cmabClient;
102-
_logger = logger ?? new NoOpLogger();
103-
}
104-
105-
/// <summary>
106-
/// Initializes a new instance of the DefaultCmabService class with configuration.
107-
/// </summary>
108-
/// <param name="cmabConfig">Configuration for CMAB cache. If null, default values are used.</param>
109-
/// <param name="cmabClient">Client for fetching decisions from the CMAB prediction service. If null, a default client is created.</param>
110-
/// <param name="logger">Optional logger for recording service operations.</param>
111-
public DefaultCmabService(CmabConfig cmabConfig = null,
112-
ICmabClient cmabClient = null,
113-
ILogger logger = null
114-
)
115-
{
116-
_logger = logger ?? new NoOpLogger();
117-
118-
var config = cmabConfig ?? new CmabConfig();
119-
120-
if (config.CustomCache != null)
121-
{
122-
_cmabCache = config.CustomCache;
123-
}
124-
else
125-
{
126-
var cacheSize = config.CacheSize ?? CmabConstants.DEFAULT_CACHE_SIZE;
127-
var cacheTtl = config.CacheTtl ?? CmabConstants.DEFAULT_CACHE_TTL;
128-
_cmabCache = new LruCache<CmabCacheEntry>(cacheSize, cacheTtl, _logger);
129-
}
130-
131-
// Create client if not provided
132-
if (cmabClient == null)
133-
{
134-
var cmabRetryConfig = new CmabRetryConfig(1,
135-
TimeSpan.FromMilliseconds(100));
136-
_cmabClient = new DefaultCmabClient(null, cmabRetryConfig, _logger);
137-
}
138-
else
139-
{
140-
_cmabClient = cmabClient;
141-
}
102+
_logger = logger;
142103
}
143104

144105
public CmabDecision GetDecision(ProjectConfig projectConfig,

OptimizelySDK/Optimizely.cs

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -286,26 +286,31 @@ private void InitializeComponents(IEventDispatcher eventDispatcher = null,
286286
NotificationCenter = notificationCenter ?? new NotificationCenter(Logger);
287287

288288
#if USE_CMAB
289-
// Initialize CMAB Service with default implementation if not provided
290-
var effectiveCmabService = cmabService;
291-
if (effectiveCmabService == null)
289+
if (cmabService == null)
292290
{
293-
try
291+
var config = cmabConfig ?? new CmabConfig();
292+
ICache<CmabCacheEntry> cache;
293+
294+
if (config.CustomCache != null)
294295
{
295-
// Create CMAB service with configuration
296-
effectiveCmabService = new DefaultCmabService(cmabConfig, null, Logger);
296+
cache = config.CustomCache;
297297
}
298-
catch (Exception ex)
298+
else
299299
{
300-
Logger.Log(LogLevel.WARN,
301-
$"Failed to initialize CMAB service: {ex.Message}. CMAB experiments will not be available.");
302-
effectiveCmabService = null;
300+
var cacheSize = config.CacheSize ?? CmabConstants.DEFAULT_CACHE_SIZE;
301+
var cacheTtl = config.CacheTtl ?? CmabConstants.DEFAULT_CACHE_TTL;
302+
cache = new LruCache<CmabCacheEntry>(cacheSize, cacheTtl, Logger);
303303
}
304+
305+
var cmabRetryConfig = new CmabRetryConfig(1, TimeSpan.FromMilliseconds(100));
306+
var cmabClient = new DefaultCmabClient(null, cmabRetryConfig, Logger);
307+
308+
cmabService = new DefaultCmabService(cache, cmabClient, Logger);
304309
}
305310

306311
DecisionService =
307312
new DecisionService(Bucketer, ErrorHandler, userProfileService, Logger,
308-
effectiveCmabService);
313+
cmabService);
309314
#else
310315
DecisionService =
311316
new DecisionService(Bucketer, ErrorHandler, userProfileService, Logger);

0 commit comments

Comments
 (0)