@@ -534,4 +534,82 @@ public void testCmabServiceConfigurationValidation() throws Exception {
534534 assertNotNull ("Manager should be created successfully" , manager );
535535 }
536536
537+ @ Test
538+ public void testCmabServiceDefaultConfigurationValidation () throws Exception {
539+ // Default configuration values
540+ int defaultCacheSize = 100 ;
541+ int defaultTimeoutSeconds = 30 * 60 ; // 30 minutes = 1800 seconds
542+
543+ // Create mocks for the CMAB service creation chain
544+ Object mockDefaultLRUCache = PowerMockito .mock (Class .forName ("com.optimizely.ab.cache.DefaultLRUCache" ));
545+ Object mockDefaultCmabClient = PowerMockito .mock (Class .forName ("com.optimizely.ab.cmab.DefaultCmabClient" ));
546+ Object mockCmabServiceOptions = PowerMockito .mock (Class .forName ("com.optimizely.ab.cmab.CmabServiceOptions" ));
547+ Object mockDefaultCmabService = PowerMockito .mock (Class .forName ("com.optimizely.ab.cmab.DefaultCmabService" ));
548+
549+ // Mock the construction chain with parameter validation
550+ whenNew (Class .forName ("com.optimizely.ab.cache.DefaultLRUCache" ))
551+ .thenReturn (mockDefaultLRUCache );
552+
553+ whenNew (Class .forName ("com.optimizely.ab.cmab.DefaultCmabClient" ))
554+ .thenReturn (mockDefaultCmabClient );
555+
556+ whenNew (Class .forName ("com.optimizely.ab.cmab.CmabServiceOptions" ))
557+ .thenReturn (mockCmabServiceOptions );
558+
559+ whenNew (Class .forName ("com.optimizely.ab.cmab.DefaultCmabService" ))
560+ .thenReturn (mockDefaultCmabService );
561+
562+ // Use PowerMock to verify OptimizelyManager constructor is called with CMAB service
563+ whenNew (OptimizelyManager .class ).withAnyArguments ().thenReturn (mock (OptimizelyManager .class ));
564+
565+ // Build OptimizelyManager with NO CMAB configuration to test defaults
566+ OptimizelyManager manager = OptimizelyManager .builder (testProjectId )
567+ .build (mockContext );
568+
569+ verifyNew (Class .forName ("com.optimizely.ab.cache.DefaultLRUCache" ))
570+ .withArguments (eq (defaultCacheSize ), eq (defaultTimeoutSeconds ));
571+
572+ // Verify DefaultCmabClient is created with default parameters
573+ verifyNew (Class .forName ("com.optimizely.ab.cmab.DefaultCmabClient" ))
574+ .withNoArguments ();
575+
576+ // Verify CmabServiceOptions is created with logger, cache, and default client
577+ verifyNew (Class .forName ("com.optimizely.ab.cmab.CmabServiceOptions" ))
578+ .withArguments (any (), eq (mockDefaultLRUCache ), eq (mockDefaultCmabClient ));
579+
580+ verifyNew (Class .forName ("com.optimizely.ab.cmab.DefaultCmabService" ))
581+ .withArguments (eq (mockCmabServiceOptions ));
582+
583+ // Verify OptimizelyManager constructor was called with the mocked CMAB service
584+ verifyNew (OptimizelyManager .class ).withArguments (
585+ any (), // projectId
586+ any (), // sdkKey
587+ any (), // datafileConfig
588+ any (), // logger
589+ anyLong (), // datafileDownloadInterval
590+ any (), // datafileHandler
591+ any (), // errorHandler
592+ anyLong (), // eventDispatchRetryInterval
593+ any (), // eventHandler
594+ any (), // eventProcessor
595+ any (), // userProfileService
596+ any (), // notificationCenter
597+ any (), // defaultDecideOptions
598+ any (), // odpManager
599+ eq (mockDefaultCmabService ), // cmabService - Should be our mocked service
600+ any (), // vuid
601+ any (), // customSdkName
602+ any () // customSdkVersion
603+ );
604+
605+ // This test validates:
606+ // 1. DefaultLRUCache created with default cache size (100) and timeout (1800 seconds)
607+ // 2. DefaultCmabClient created with no arguments (using defaults)
608+ // 3. CmabServiceOptions created with logger, mocked cache, and default client
609+ // 4. DefaultCmabService created with the mocked service options
610+ // 5. OptimizelyManager constructor receives the exact mocked CMAB service
611+ // 6. All default parameters flow correctly through the creation chain
612+ assertNotNull ("Manager should be created successfully" , manager );
613+ }
614+
537615}
0 commit comments