Skip to content

Commit 791ae41

Browse files
[FSSDK-9056] fix: add config check in odp methods (#512)
* [FSSDK-9056] fix: add config check in odp methods * Fixed tests by passing valid config * spotbug fix --------- Co-authored-by: NomanShoaib <m.nomanshoaib09@gmail.com>
1 parent 8dc9a74 commit 791ae41

File tree

3 files changed

+134
-1
lines changed

3 files changed

+134
-1
lines changed

core-api/src/main/java/com/optimizely/ab/Optimizely.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1445,6 +1445,11 @@ public <T> int addNotificationHandler(Class<T> clazz, NotificationHandler<T> han
14451445
}
14461446

14471447
public List<String> fetchQualifiedSegments(String userId, @Nonnull List<ODPSegmentOption> segmentOptions) {
1448+
ProjectConfig projectConfig = getProjectConfig();
1449+
if (projectConfig == null) {
1450+
logger.error("Optimizely instance is not valid, failing fetchQualifiedSegments call.");
1451+
return null;
1452+
}
14481453
if (odpManager != null) {
14491454
synchronized (odpManager) {
14501455
return odpManager.getSegmentManager().getQualifiedSegments(userId, segmentOptions);
@@ -1455,6 +1460,12 @@ public List<String> fetchQualifiedSegments(String userId, @Nonnull List<ODPSegme
14551460
}
14561461

14571462
public void fetchQualifiedSegments(String userId, ODPSegmentManager.ODPSegmentFetchCallback callback, List<ODPSegmentOption> segmentOptions) {
1463+
ProjectConfig projectConfig = getProjectConfig();
1464+
if (projectConfig == null) {
1465+
logger.error("Optimizely instance is not valid, failing fetchQualifiedSegments call.");
1466+
callback.onCompleted(null);
1467+
return;
1468+
}
14581469
if (odpManager == null) {
14591470
logger.error("Audience segments fetch failed (ODP is not enabled).");
14601471
callback.onCompleted(null);
@@ -1478,6 +1489,11 @@ public ODPManager getODPManager() {
14781489
* @param data a dictionary for associated data. The default event data will be added to this data before sending to the ODP server.
14791490
*/
14801491
public void sendODPEvent(@Nullable String type, @Nonnull String action, @Nullable Map<String, String> identifiers, @Nullable Map<String, Object> data) {
1492+
ProjectConfig projectConfig = getProjectConfig();
1493+
if (projectConfig == null) {
1494+
logger.error("Optimizely instance is not valid, failing sendODPEvent call.");
1495+
return;
1496+
}
14811497
if (odpManager != null) {
14821498
if (action == null || action.trim().isEmpty()) {
14831499
logger.error("ODP action is not valid (cannot be empty).");
@@ -1492,6 +1508,11 @@ public void sendODPEvent(@Nullable String type, @Nonnull String action, @Nullabl
14921508
}
14931509

14941510
public void identifyUser(@Nonnull String userId) {
1511+
ProjectConfig projectConfig = getProjectConfig();
1512+
if (projectConfig == null) {
1513+
logger.error("Optimizely instance is not valid, failing identifyUser call.");
1514+
return;
1515+
}
14951516
ODPManager odpManager = getODPManager();
14961517
if (odpManager != null) {
14971518
odpManager.getEventManager().identifyUser(userId);

core-api/src/test/java/com/optimizely/ab/OptimizelyTest.java

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4733,6 +4733,7 @@ public void initODPManagerWithProjectConfig() throws IOException {
47334733
@Test
47344734
public void sendODPEvent() {
47354735
ProjectConfigManager mockProjectConfigManager = mock(ProjectConfigManager.class);
4736+
Mockito.when(mockProjectConfigManager.getConfig()).thenReturn(validProjectConfig);
47364737
ODPEventManager mockODPEventManager = mock(ODPEventManager.class);
47374738
ODPManager mockODPManager = mock(ODPManager.class);
47384739

@@ -4762,6 +4763,33 @@ public void sendODPEvent() {
47624763
assertEquals(data, eventArgument.getValue().getData());
47634764
}
47644765

4766+
@Test
4767+
public void sendODPEventInvalidConfig() {
4768+
ProjectConfigManager mockProjectConfigManager = mock(ProjectConfigManager.class);
4769+
Mockito.when(mockProjectConfigManager.getConfig()).thenReturn(null);
4770+
ODPEventManager mockODPEventManager = mock(ODPEventManager.class);
4771+
ODPManager mockODPManager = mock(ODPManager.class);
4772+
4773+
Mockito.when(mockODPManager.getEventManager()).thenReturn(mockODPEventManager);
4774+
Optimizely optimizely = Optimizely.builder()
4775+
.withConfigManager(mockProjectConfigManager)
4776+
.withODPManager(mockODPManager)
4777+
.build();
4778+
4779+
verify(mockODPEventManager).start();
4780+
4781+
Map<String, String> identifiers = new HashMap<>();
4782+
identifiers.put("id1", "value1");
4783+
identifiers.put("id2", "value2");
4784+
4785+
Map<String, Object> data = new HashMap<>();
4786+
data.put("sdk", "java");
4787+
data.put("revision", 52);
4788+
4789+
optimizely.sendODPEvent("fullstack", "identify", identifiers, data);
4790+
logbackVerifier.expectMessage(Level.ERROR, "Optimizely instance is not valid, failing sendODPEvent call.");
4791+
}
4792+
47654793
@Test
47664794
@SuppressFBWarnings(value = "NP_NONNULL_PARAM_VIOLATION", justification = "Testing nullness contract violation")
47674795
public void sendODPEventErrorNullAction() {
@@ -4887,7 +4915,7 @@ public void sendODPEventEmptyType() {
48874915
@Test
48884916
public void sendODPEventError() {
48894917
ProjectConfigManager mockProjectConfigManager = mock(ProjectConfigManager.class);
4890-
4918+
Mockito.when(mockProjectConfigManager.getConfig()).thenReturn(validProjectConfig);
48914919
Optimizely optimizely = Optimizely.builder()
48924920
.withConfigManager(mockProjectConfigManager)
48934921
.build();
@@ -4907,6 +4935,7 @@ public void sendODPEventError() {
49074935
@Test
49084936
public void identifyUser() {
49094937
ProjectConfigManager mockProjectConfigManager = mock(ProjectConfigManager.class);
4938+
Mockito.when(mockProjectConfigManager.getConfig()).thenReturn(validProjectConfig);
49104939
ODPEventManager mockODPEventManager = mock(ODPEventManager.class);
49114940
ODPManager mockODPManager = mock(ODPManager.class);
49124941

core-api/src/test/java/com/optimizely/ab/OptimizelyUserContextTest.java

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1628,6 +1628,8 @@ public void fetchQualifiedSegments() {
16281628
Mockito.when(mockODPManager.getSegmentManager()).thenReturn(mockODPSegmentManager);
16291629

16301630
Optimizely optimizely = Optimizely.builder()
1631+
.withDatafile(datafile)
1632+
.withEventProcessor(new ForwardingEventProcessor(eventHandler, null))
16311633
.withODPManager(mockODPManager)
16321634
.build();
16331635

@@ -1640,9 +1642,33 @@ public void fetchQualifiedSegments() {
16401642
verify(mockODPSegmentManager).getQualifiedSegments("test-user", Collections.singletonList(ODPSegmentOption.RESET_CACHE));
16411643
}
16421644

1645+
@Test
1646+
public void fetchQualifiedSegmentsErrorWhenConfigIsInvalid() {
1647+
ProjectConfigManager mockProjectConfigManager = mock(ProjectConfigManager.class);
1648+
Mockito.when(mockProjectConfigManager.getConfig()).thenReturn(null);
1649+
ODPEventManager mockODPEventManager = mock(ODPEventManager.class);
1650+
ODPSegmentManager mockODPSegmentManager = mock(ODPSegmentManager.class);
1651+
ODPManager mockODPManager = mock(ODPManager.class);
1652+
1653+
Mockito.when(mockODPManager.getEventManager()).thenReturn(mockODPEventManager);
1654+
Mockito.when(mockODPManager.getSegmentManager()).thenReturn(mockODPSegmentManager);
1655+
1656+
Optimizely optimizely = Optimizely.builder()
1657+
.withConfigManager(mockProjectConfigManager)
1658+
.withODPManager(mockODPManager)
1659+
.build();
1660+
1661+
OptimizelyUserContext userContext = optimizely.createUserContext("test-user");
1662+
1663+
assertFalse(userContext.fetchQualifiedSegments());
1664+
logbackVerifier.expectMessage(Level.ERROR, "Optimizely instance is not valid, failing fetchQualifiedSegments call.");
1665+
}
1666+
16431667
@Test
16441668
public void fetchQualifiedSegmentsError() {
16451669
Optimizely optimizely = Optimizely.builder()
1670+
.withDatafile(datafile)
1671+
.withEventProcessor(new ForwardingEventProcessor(eventHandler, null))
16461672
.build();
16471673
OptimizelyUserContext userContext = optimizely.createUserContext("test-user");
16481674

@@ -1667,6 +1693,8 @@ public void fetchQualifiedSegmentsAsync() throws InterruptedException {
16671693
Mockito.when(mockODPManager.getSegmentManager()).thenReturn(mockODPSegmentManager);
16681694

16691695
Optimizely optimizely = Optimizely.builder()
1696+
.withDatafile(datafile)
1697+
.withEventProcessor(new ForwardingEventProcessor(eventHandler, null))
16701698
.withODPManager(mockODPManager)
16711699
.build();
16721700

@@ -1698,6 +1726,8 @@ public void fetchQualifiedSegmentsAsync() throws InterruptedException {
16981726
@Test
16991727
public void fetchQualifiedSegmentsAsyncError() throws InterruptedException {
17001728
Optimizely optimizely = Optimizely.builder()
1729+
.withDatafile(datafile)
1730+
.withEventProcessor(new ForwardingEventProcessor(eventHandler, null))
17011731
.build();
17021732

17031733
OptimizelyUserContext userContext = optimizely.createUserContext("test-user");
@@ -1713,6 +1743,57 @@ public void fetchQualifiedSegmentsAsyncError() throws InterruptedException {
17131743
logbackVerifier.expectMessage(Level.ERROR, "Audience segments fetch failed (ODP is not enabled).");
17141744
}
17151745

1746+
@Test
1747+
public void fetchQualifiedSegmentsAsyncErrorWhenConfigIsInvalid() throws InterruptedException {
1748+
ProjectConfigManager mockProjectConfigManager = mock(ProjectConfigManager.class);
1749+
Mockito.when(mockProjectConfigManager.getConfig()).thenReturn(null);
1750+
ODPEventManager mockODPEventManager = mock(ODPEventManager.class);
1751+
ODPSegmentManager mockODPSegmentManager = mock(ODPSegmentManager.class);
1752+
ODPManager mockODPManager = mock(ODPManager.class);
1753+
1754+
Mockito.when(mockODPManager.getEventManager()).thenReturn(mockODPEventManager);
1755+
Mockito.when(mockODPManager.getSegmentManager()).thenReturn(mockODPSegmentManager);
1756+
1757+
Optimizely optimizely = Optimizely.builder()
1758+
.withConfigManager(mockProjectConfigManager)
1759+
.withODPManager(mockODPManager)
1760+
.build();
1761+
1762+
OptimizelyUserContext userContext = optimizely.createUserContext("test-user");
1763+
1764+
CountDownLatch countDownLatch = new CountDownLatch(1);
1765+
userContext.fetchQualifiedSegments((Boolean isFetchSuccessful) -> {
1766+
assertFalse(isFetchSuccessful);
1767+
countDownLatch.countDown();
1768+
});
1769+
1770+
countDownLatch.await();
1771+
assertEquals(null, userContext.getQualifiedSegments());
1772+
logbackVerifier.expectMessage(Level.ERROR, "Optimizely instance is not valid, failing fetchQualifiedSegments call.");
1773+
}
1774+
1775+
@Test
1776+
public void identifyUserErrorWhenConfigIsInvalid() {
1777+
ODPEventManager mockODPEventManager = mock(ODPEventManager.class);
1778+
ODPSegmentManager mockODPSegmentManager = mock(ODPSegmentManager.class);
1779+
ODPManager mockODPManager = mock(ODPManager.class);
1780+
ProjectConfigManager mockProjectConfigManager = mock(ProjectConfigManager.class);
1781+
Mockito.when(mockProjectConfigManager.getConfig()).thenReturn(null);
1782+
Mockito.when(mockODPManager.getEventManager()).thenReturn(mockODPEventManager);
1783+
Mockito.when(mockODPManager.getSegmentManager()).thenReturn(mockODPSegmentManager);
1784+
1785+
Optimizely optimizely = Optimizely.builder()
1786+
.withConfigManager(mockProjectConfigManager)
1787+
.withODPManager(mockODPManager)
1788+
.build();
1789+
1790+
optimizely.createUserContext("test-user");
1791+
verify(mockODPEventManager, never()).identifyUser("test-user");
1792+
Mockito.reset(mockODPEventManager);
1793+
1794+
logbackVerifier.expectMessage(Level.ERROR, "Optimizely instance is not valid, failing identifyUser call.");
1795+
}
1796+
17161797
@Test
17171798
public void identifyUser() {
17181799
ODPEventManager mockODPEventManager = mock(ODPEventManager.class);
@@ -1723,6 +1804,8 @@ public void identifyUser() {
17231804
Mockito.when(mockODPManager.getSegmentManager()).thenReturn(mockODPSegmentManager);
17241805

17251806
Optimizely optimizely = Optimizely.builder()
1807+
.withDatafile(datafile)
1808+
.withEventProcessor(new ForwardingEventProcessor(eventHandler, null))
17261809
.withODPManager(mockODPManager)
17271810
.build();
17281811

0 commit comments

Comments
 (0)