From d42622e4a91bdfc6e4d83927c73df974177bcd4d Mon Sep 17 00:00:00 2001 From: esrakartalOpt Date: Thu, 24 Jul 2025 15:23:01 -0500 Subject: [PATCH 1/7] [FSSDK-11455] Java - Add SDK Multi-Region Support for Data Hosting --- .../ab/config/DatafileProjectConfig.java | 10 +++ .../optimizely/ab/config/ProjectConfig.java | 17 +++++ .../ab/config/parser/JsonConfigParser.java | 9 +++ .../config/parser/JsonSimpleConfigParser.java | 9 +++ .../ab/event/internal/EventEndpoints.java | 58 +++++++++++++++++ .../ab/event/internal/EventFactory.java | 6 +- .../ab/event/internal/EventEndpointsTest.java | 63 +++++++++++++++++++ .../ab/event/internal/EventFactoryTest.java | 12 ++-- 8 files changed, 176 insertions(+), 8 deletions(-) create mode 100644 core-api/src/main/java/com/optimizely/ab/event/internal/EventEndpoints.java create mode 100644 core-api/src/test/java/com/optimizely/ab/event/internal/EventEndpointsTest.java diff --git a/core-api/src/main/java/com/optimizely/ab/config/DatafileProjectConfig.java b/core-api/src/main/java/com/optimizely/ab/config/DatafileProjectConfig.java index 28ad519a5..df16bef6c 100644 --- a/core-api/src/main/java/com/optimizely/ab/config/DatafileProjectConfig.java +++ b/core-api/src/main/java/com/optimizely/ab/config/DatafileProjectConfig.java @@ -63,6 +63,7 @@ public class DatafileProjectConfig implements ProjectConfig { private final boolean anonymizeIP; private final boolean sendFlagDecisions; private final Boolean botFiltering; + private final Region region; private final String hostForODP; private final String publicKeyForODP; private final List attributes; @@ -113,6 +114,7 @@ public DatafileProjectConfig(String accountId, String projectId, String version, anonymizeIP, false, null, + Region.US, projectId, revision, null, @@ -135,6 +137,7 @@ public DatafileProjectConfig(String accountId, boolean anonymizeIP, boolean sendFlagDecisions, Boolean botFiltering, + Region region, String projectId, String revision, String sdkKey, @@ -158,6 +161,7 @@ public DatafileProjectConfig(String accountId, this.anonymizeIP = anonymizeIP; this.sendFlagDecisions = sendFlagDecisions; this.botFiltering = botFiltering; + this.region = region != null ? region : Region.US; this.attributes = Collections.unmodifiableList(attributes); this.audiences = Collections.unmodifiableList(audiences); @@ -424,6 +428,11 @@ public Boolean getBotFiltering() { return botFiltering; } + @Override + public Region getRegion() { + return region; + } + @Override public List getGroups() { return groups; @@ -587,6 +596,7 @@ public String toString() { ", version='" + version + '\'' + ", anonymizeIP=" + anonymizeIP + ", botFiltering=" + botFiltering + + ", region=" + region + ", attributes=" + attributes + ", audiences=" + audiences + ", typedAudiences=" + typedAudiences + diff --git a/core-api/src/main/java/com/optimizely/ab/config/ProjectConfig.java b/core-api/src/main/java/com/optimizely/ab/config/ProjectConfig.java index 2073be9ef..bcedcee2a 100644 --- a/core-api/src/main/java/com/optimizely/ab/config/ProjectConfig.java +++ b/core-api/src/main/java/com/optimizely/ab/config/ProjectConfig.java @@ -135,4 +135,21 @@ public String toString() { return version; } } + + public enum Region { + US("US"), EU("EU"); + + private final String region; + + Region(String region) { + this.region = region; + } + + @Override + public String toString() { + return region; + } + } + + Region getRegion(); } diff --git a/core-api/src/main/java/com/optimizely/ab/config/parser/JsonConfigParser.java b/core-api/src/main/java/com/optimizely/ab/config/parser/JsonConfigParser.java index ea5101054..7c5c35b8c 100644 --- a/core-api/src/main/java/com/optimizely/ab/config/parser/JsonConfigParser.java +++ b/core-api/src/main/java/com/optimizely/ab/config/parser/JsonConfigParser.java @@ -93,11 +93,20 @@ public ProjectConfig parseProjectConfig(@Nonnull String json) throws ConfigParse sendFlagDecisions = rootObject.getBoolean("sendFlagDecisions"); } + ProjectConfig.Region region = ProjectConfig.Region.US; // Default to US + if (rootObject.has("region")) { + String regionString = rootObject.getString("region"); + if ("EU".equalsIgnoreCase(regionString)) { + region = ProjectConfig.Region.EU; + } + } + return new DatafileProjectConfig( accountId, anonymizeIP, sendFlagDecisions, botFiltering, + region, projectId, revision, sdkKey, diff --git a/core-api/src/main/java/com/optimizely/ab/config/parser/JsonSimpleConfigParser.java b/core-api/src/main/java/com/optimizely/ab/config/parser/JsonSimpleConfigParser.java index c65eb6213..3c9617d45 100644 --- a/core-api/src/main/java/com/optimizely/ab/config/parser/JsonSimpleConfigParser.java +++ b/core-api/src/main/java/com/optimizely/ab/config/parser/JsonSimpleConfigParser.java @@ -96,11 +96,20 @@ public ProjectConfig parseProjectConfig(@Nonnull String json) throws ConfigParse sendFlagDecisions = (Boolean) rootObject.get("sendFlagDecisions"); } + ProjectConfig.Region region = ProjectConfig.Region.US; // Default to US + if (rootObject.containsKey("region")) { + String regionString = (String) rootObject.get("region"); + if ("EU".equalsIgnoreCase(regionString)) { + region = ProjectConfig.Region.EU; + } + } + return new DatafileProjectConfig( accountId, anonymizeIP, sendFlagDecisions, botFiltering, + region, projectId, revision, sdkKey, diff --git a/core-api/src/main/java/com/optimizely/ab/event/internal/EventEndpoints.java b/core-api/src/main/java/com/optimizely/ab/event/internal/EventEndpoints.java new file mode 100644 index 000000000..a7cc5185f --- /dev/null +++ b/core-api/src/main/java/com/optimizely/ab/event/internal/EventEndpoints.java @@ -0,0 +1,58 @@ +/** + * + * Copyright 2016-2020, 2022, Optimizely and contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.optimizely.ab.event.internal; + +import com.optimizely.ab.config.ProjectConfig.Region; +import java.util.HashMap; +import java.util.Map; + +/** + * EventEndpoints provides region-specific endpoint URLs for Optimizely events. + * Similar to the TypeScript logxEndpoint configuration. + */ +public class EventEndpoints { + + private static final Map LOGX_ENDPOINTS = new HashMap<>(); + + static { + LOGX_ENDPOINTS.put(Region.US, "https://logx.optimizely.com/v1/events"); + LOGX_ENDPOINTS.put(Region.EU, "https://eu.logx.optimizely.com/v1/events"); + } + + /** + * Get the event endpoint URL for the specified region. + * Defaults to US region endpoint if region is null. + * + * @param region the region for which to get the endpoint + * @return the endpoint URL for the specified region, or US endpoint if region is null + */ + public static String getEndpointForRegion(Region region) { + if (region == null) { + return LOGX_ENDPOINTS.get(Region.US); + } + return LOGX_ENDPOINTS.get(region); + } + + /** + * Get the default event endpoint URL (US region). + * + * @return the default endpoint URL + */ + public static String getDefaultEndpoint() { + return LOGX_ENDPOINTS.get(Region.US); + } +} diff --git a/core-api/src/main/java/com/optimizely/ab/event/internal/EventFactory.java b/core-api/src/main/java/com/optimizely/ab/event/internal/EventFactory.java index 47839810d..f200f963d 100644 --- a/core-api/src/main/java/com/optimizely/ab/event/internal/EventFactory.java +++ b/core-api/src/main/java/com/optimizely/ab/event/internal/EventFactory.java @@ -42,7 +42,6 @@ */ public class EventFactory { private static final Logger logger = LoggerFactory.getLogger(EventFactory.class); - public static final String EVENT_ENDPOINT = "https://logx.optimizely.com/v1/events"; // Should be part of the datafile private static final String ACTIVATE_EVENT_KEY = "campaign_activated"; public static LogEvent createLogEvent(UserEvent userEvent) { @@ -52,6 +51,7 @@ public static LogEvent createLogEvent(UserEvent userEvent) { public static LogEvent createLogEvent(List userEvents) { EventBatch.Builder builder = new EventBatch.Builder(); List visitors = new ArrayList<>(userEvents.size()); + String eventEndpoint = "https://logx.optimizely.com/v1/events"; for (UserEvent userEvent: userEvents) { @@ -71,6 +71,8 @@ public static LogEvent createLogEvent(List userEvents) { UserContext userContext = userEvent.getUserContext(); ProjectConfig projectConfig = userContext.getProjectConfig(); + eventEndpoint = EventEndpoints.getEndpointForRegion(projectConfig.getRegion()); + builder .setClientName(ClientEngineInfo.getClientEngineName()) .setClientVersion(BuildVersionInfo.getClientVersion()) @@ -85,7 +87,7 @@ public static LogEvent createLogEvent(List userEvents) { } builder.setVisitors(visitors); - return new LogEvent(LogEvent.RequestMethod.POST, EVENT_ENDPOINT, Collections.emptyMap(), builder.build()); + return new LogEvent(LogEvent.RequestMethod.POST, eventEndpoint, Collections.emptyMap(), builder.build()); } private static Visitor createVisitor(ImpressionEvent impressionEvent) { diff --git a/core-api/src/test/java/com/optimizely/ab/event/internal/EventEndpointsTest.java b/core-api/src/test/java/com/optimizely/ab/event/internal/EventEndpointsTest.java new file mode 100644 index 000000000..f030a139a --- /dev/null +++ b/core-api/src/test/java/com/optimizely/ab/event/internal/EventEndpointsTest.java @@ -0,0 +1,63 @@ +/** + * + * Copyright 2025, Optimizely and contributors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.optimizely.ab.event.internal; + +import com.optimizely.ab.config.ProjectConfig.Region; +import org.junit.Test; +import static org.junit.Assert.*; + +/** + * Tests for EventEndpoints class + */ +public class EventEndpointsTest { + + @Test + public void testGetEndpointForUSRegion() { + String endpoint = EventEndpoints.getEndpointForRegion(Region.US); + assertEquals("https://logx.optimizely.com/v1/events", endpoint); + } + + @Test + public void testGetEndpointForEURegion() { + String endpoint = EventEndpoints.getEndpointForRegion(Region.EU); + assertEquals("https://eu.logx.optimizely.com/v1/events", endpoint); + } + + @Test + public void testGetDefaultEndpoint() { + String defaultEndpoint = EventEndpoints.getDefaultEndpoint(); + assertEquals("https://logx.optimizely.com/v1/events", defaultEndpoint); + } + + @Test + public void testGetEndpointForNullRegion() { + String endpoint = EventEndpoints.getEndpointForRegion(null); + assertEquals("https://logx.optimizely.com/v1/events", endpoint); + } + + @Test + public void testDefaultBehaviorAlwaysReturnsUS() { + // Test that both null region and default endpoint return the same US endpoint + String nullRegionEndpoint = EventEndpoints.getEndpointForRegion(null); + String defaultEndpoint = EventEndpoints.getDefaultEndpoint(); + String usEndpoint = EventEndpoints.getEndpointForRegion(Region.US); + + assertEquals("All should return US endpoint", usEndpoint, nullRegionEndpoint); + assertEquals("All should return US endpoint", usEndpoint, defaultEndpoint); + assertEquals("Should be US endpoint", "https://logx.optimizely.com/v1/events", nullRegionEndpoint); + } +} diff --git a/core-api/src/test/java/com/optimizely/ab/event/internal/EventFactoryTest.java b/core-api/src/test/java/com/optimizely/ab/event/internal/EventFactoryTest.java index e347074a8..08a8b7da9 100644 --- a/core-api/src/test/java/com/optimizely/ab/event/internal/EventFactoryTest.java +++ b/core-api/src/test/java/com/optimizely/ab/event/internal/EventFactoryTest.java @@ -140,7 +140,7 @@ public void createImpressionEventPassingUserAgentAttribute() throws Exception { userId, attributeMap); // verify that request endpoint is correct - assertThat(impressionEvent.getEndpointUrl(), is(EventFactory.EVENT_ENDPOINT)); + assertThat(impressionEvent.getEndpointUrl(), is(EventEndpoints.getEndpointForRegion(validProjectConfig.getRegion()))); EventBatch eventBatch = gson.fromJson(impressionEvent.getBody(), EventBatch.class); @@ -207,7 +207,7 @@ public void createImpressionEvent() throws Exception { userId, attributeMap); // verify that request endpoint is correct - assertThat(impressionEvent.getEndpointUrl(), is(EventFactory.EVENT_ENDPOINT)); + assertThat(impressionEvent.getEndpointUrl(), is(EventEndpoints.getEndpointForRegion(validProjectConfig.getRegion()))); EventBatch eventBatch = gson.fromJson(impressionEvent.getBody(), EventBatch.class); @@ -616,7 +616,7 @@ public void createConversionEvent() throws Exception { eventTagMap); // verify that the request endpoint is correct - assertThat(conversionEvent.getEndpointUrl(), is(EventFactory.EVENT_ENDPOINT)); + assertThat(conversionEvent.getEndpointUrl(), is(EventEndpoints.getEndpointForRegion(validProjectConfig.getRegion()))); EventBatch conversion = gson.fromJson(conversionEvent.getBody(), EventBatch.class); @@ -678,7 +678,7 @@ public void createConversionEventPassingUserAgentAttribute() throws Exception { eventTagMap); // verify that the request endpoint is correct - assertThat(conversionEvent.getEndpointUrl(), is(EventFactory.EVENT_ENDPOINT)); + assertThat(conversionEvent.getEndpointUrl(), is(EventEndpoints.getEndpointForRegion(validProjectConfig.getRegion()))); EventBatch conversion = gson.fromJson(conversionEvent.getBody(), EventBatch.class); @@ -944,7 +944,7 @@ public void createImpressionEventWithBucketingId() throws Exception { userId, attributeMap); // verify that request endpoint is correct - assertThat(impressionEvent.getEndpointUrl(), is(EventFactory.EVENT_ENDPOINT)); + assertThat(impressionEvent.getEndpointUrl(), is(EventEndpoints.getEndpointForRegion(validProjectConfig.getRegion()))); EventBatch impression = gson.fromJson(impressionEvent.getBody(), EventBatch.class); @@ -993,7 +993,7 @@ public void createConversionEventWithBucketingId() throws Exception { eventTagMap); // verify that the request endpoint is correct - assertThat(conversionEvent.getEndpointUrl(), is(EventFactory.EVENT_ENDPOINT)); + assertThat(conversionEvent.getEndpointUrl(), is(EventEndpoints.getEndpointForRegion(validProjectConfig.getRegion()))); EventBatch conversion = gson.fromJson(conversionEvent.getBody(), EventBatch.class); From 2a7c54ed86deb10bfab0f8d6a5648b5657dddf15 Mon Sep 17 00:00:00 2001 From: esrakartalOpt Date: Mon, 28 Jul 2025 11:14:08 -0500 Subject: [PATCH 2/7] Update test comment --- .../com/optimizely/ab/event/internal/EventEndpointsTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-api/src/test/java/com/optimizely/ab/event/internal/EventEndpointsTest.java b/core-api/src/test/java/com/optimizely/ab/event/internal/EventEndpointsTest.java index f030a139a..7efc0631b 100644 --- a/core-api/src/test/java/com/optimizely/ab/event/internal/EventEndpointsTest.java +++ b/core-api/src/test/java/com/optimizely/ab/event/internal/EventEndpointsTest.java @@ -21,7 +21,7 @@ import static org.junit.Assert.*; /** - * Tests for EventEndpoints class + * Tests for EventEndpoints class to test event endpoints */ public class EventEndpointsTest { From 42357816e270e7bf82f75831be1092959d05f36e Mon Sep 17 00:00:00 2001 From: esrakartalOpt Date: Tue, 29 Jul 2025 13:26:07 -0500 Subject: [PATCH 3/7] Fix failures --- .../com/optimizely/ab/config/DatafileProjectConfig.java | 8 ++++---- .../ab/config/parser/DatafileGsonDeserializer.java | 7 +++++++ .../ab/config/parser/DatafileJacksonDeserializer.java | 7 +++++++ .../ab/config/DatafileProjectConfigTestUtils.java | 8 ++++---- .../com/optimizely/ab/config/ValidProjectConfigV4.java | 2 ++ .../optimizely/ab/event/ForwardingEventProcessorTest.java | 2 +- .../ab/optimizelyconfig/OptimizelyConfigServiceTest.java | 1 + 7 files changed, 26 insertions(+), 9 deletions(-) diff --git a/core-api/src/main/java/com/optimizely/ab/config/DatafileProjectConfig.java b/core-api/src/main/java/com/optimizely/ab/config/DatafileProjectConfig.java index df16bef6c..319ff5474 100644 --- a/core-api/src/main/java/com/optimizely/ab/config/DatafileProjectConfig.java +++ b/core-api/src/main/java/com/optimizely/ab/config/DatafileProjectConfig.java @@ -101,20 +101,20 @@ public class DatafileProjectConfig implements ProjectConfig { // v2 constructor public DatafileProjectConfig(String accountId, String projectId, String version, String revision, List groups, List experiments, List attributes, List eventType, - List audiences) { - this(accountId, projectId, version, revision, groups, experiments, attributes, eventType, audiences, false); + List audiences, Region region) { + this(accountId, projectId, version, revision, groups, experiments, attributes, eventType, audiences, false, region); } // v3 constructor public DatafileProjectConfig(String accountId, String projectId, String version, String revision, List groups, List experiments, List attributes, List eventType, - List audiences, boolean anonymizeIP) { + List audiences, boolean anonymizeIP, Region region) { this( accountId, anonymizeIP, false, null, - Region.US, + region, projectId, revision, null, diff --git a/core-api/src/main/java/com/optimizely/ab/config/parser/DatafileGsonDeserializer.java b/core-api/src/main/java/com/optimizely/ab/config/parser/DatafileGsonDeserializer.java index f349805fa..78702d318 100644 --- a/core-api/src/main/java/com/optimizely/ab/config/parser/DatafileGsonDeserializer.java +++ b/core-api/src/main/java/com/optimizely/ab/config/parser/DatafileGsonDeserializer.java @@ -112,11 +112,18 @@ public ProjectConfig deserialize(JsonElement json, Type typeOfT, JsonDeserializa sendFlagDecisions = jsonObject.get("sendFlagDecisions").getAsBoolean(); } + ProjectConfig.Region region = ProjectConfig.Region.US; + + if (jsonObject.has("region")) { + region = ProjectConfig.Region.valueOf(jsonObject.get("region").getAsString()); + } + return new DatafileProjectConfig( accountId, anonymizeIP, sendFlagDecisions, botFiltering, + region, projectId, revision, sdkKey, diff --git a/core-api/src/main/java/com/optimizely/ab/config/parser/DatafileJacksonDeserializer.java b/core-api/src/main/java/com/optimizely/ab/config/parser/DatafileJacksonDeserializer.java index 4ef104428..5e6eeec74 100644 --- a/core-api/src/main/java/com/optimizely/ab/config/parser/DatafileJacksonDeserializer.java +++ b/core-api/src/main/java/com/optimizely/ab/config/parser/DatafileJacksonDeserializer.java @@ -88,11 +88,18 @@ public DatafileProjectConfig deserialize(JsonParser parser, DeserializationConte } } + ProjectConfig.Region region = ProjectConfig.Region.US; + + if (node.hasNonNull("region")) { + region = ProjectConfig.Region.valueOf(node.get("region").asText()); + } + return new DatafileProjectConfig( accountId, anonymizeIP, sendFlagDecisions, botFiltering, + region, projectId, revision, sdkKey, diff --git a/core-api/src/test/java/com/optimizely/ab/config/DatafileProjectConfigTestUtils.java b/core-api/src/test/java/com/optimizely/ab/config/DatafileProjectConfigTestUtils.java index 9b65421bb..f2e258d48 100644 --- a/core-api/src/test/java/com/optimizely/ab/config/DatafileProjectConfigTestUtils.java +++ b/core-api/src/test/java/com/optimizely/ab/config/DatafileProjectConfigTestUtils.java @@ -155,7 +155,7 @@ private static ProjectConfig generateValidProjectConfigV2() { Collections.emptyList()); List groups = asList(randomPolicyGroup, overlappingPolicyGroup); - return new DatafileProjectConfig("789", "1234", "2", "42", groups, experiments, attributes, events, audiences); + return new DatafileProjectConfig("789", "1234", "2", "42", groups, experiments, attributes, events, audiences, ProjectConfig.Region.US); } private static final ProjectConfig NO_AUDIENCE_PROJECT_CONFIG_V2 = generateNoAudienceProjectConfigV2(); @@ -208,7 +208,7 @@ private static ProjectConfig generateNoAudienceProjectConfigV2() { ); return new DatafileProjectConfig("789", "1234", "2", "42", Collections.emptyList(), experiments, attributes, - events, Collections.emptyList()); + events, Collections.emptyList(), ProjectConfig.Region.US); } private static final ProjectConfig VALID_PROJECT_CONFIG_V3 = generateValidProjectConfigV3(); @@ -325,7 +325,7 @@ private static ProjectConfig generateValidProjectConfigV3() { List groups = asList(randomPolicyGroup, overlappingPolicyGroup); return new DatafileProjectConfig("789", "1234", "3", "42", groups, experiments, attributes, events, audiences, - true); + true, ProjectConfig.Region.US); } private static final ProjectConfig NO_AUDIENCE_PROJECT_CONFIG_V3 = generateNoAudienceProjectConfigV3(); @@ -378,7 +378,7 @@ private static ProjectConfig generateNoAudienceProjectConfigV3() { ); return new DatafileProjectConfig("789", "1234", "3", "42", Collections.emptyList(), experiments, attributes, - events, Collections.emptyList(), true); + events, Collections.emptyList(), true, ProjectConfig.Region.US); } private static final ProjectConfig VALID_PROJECT_CONFIG_V4 = generateValidProjectConfigV4(); diff --git a/core-api/src/test/java/com/optimizely/ab/config/ValidProjectConfigV4.java b/core-api/src/test/java/com/optimizely/ab/config/ValidProjectConfigV4.java index faacfda76..f4a756d5f 100644 --- a/core-api/src/test/java/com/optimizely/ab/config/ValidProjectConfigV4.java +++ b/core-api/src/test/java/com/optimizely/ab/config/ValidProjectConfigV4.java @@ -40,6 +40,7 @@ public class ValidProjectConfigV4 { private static final String ENVIRONMENT_KEY = "production"; private static final String VERSION = "4"; private static final Boolean SEND_FLAG_DECISIONS = true; + private static final ProjectConfig.Region REGION = ProjectConfig.Region.US; // attributes private static final String ATTRIBUTE_HOUSE_ID = "553339214"; @@ -1451,6 +1452,7 @@ public static ProjectConfig generateValidProjectConfigV4() { ANONYMIZE_IP, SEND_FLAG_DECISIONS, BOT_FILTERING, + REGION, PROJECT_ID, REVISION, SDK_KEY, diff --git a/core-api/src/test/java/com/optimizely/ab/event/ForwardingEventProcessorTest.java b/core-api/src/test/java/com/optimizely/ab/event/ForwardingEventProcessorTest.java index 591b73129..bf9591620 100644 --- a/core-api/src/test/java/com/optimizely/ab/event/ForwardingEventProcessorTest.java +++ b/core-api/src/test/java/com/optimizely/ab/event/ForwardingEventProcessorTest.java @@ -50,7 +50,7 @@ public void setUp() throws Exception { eventProcessor = new ForwardingEventProcessor(logEvent -> { assertNotNull(logEvent.getEventBatch()); assertEquals(logEvent.getRequestMethod(), LogEvent.RequestMethod.POST); - assertEquals(logEvent.getEndpointUrl(), EventFactory.EVENT_ENDPOINT); + assertEquals(logEvent.getEndpointUrl(), EventEndpoints.getDefaultEndpoint()); atomicBoolean.set(true); }, notificationCenter); } diff --git a/core-api/src/test/java/com/optimizely/ab/optimizelyconfig/OptimizelyConfigServiceTest.java b/core-api/src/test/java/com/optimizely/ab/optimizelyconfig/OptimizelyConfigServiceTest.java index 418cb2494..a605cc563 100644 --- a/core-api/src/test/java/com/optimizely/ab/optimizelyconfig/OptimizelyConfigServiceTest.java +++ b/core-api/src/test/java/com/optimizely/ab/optimizelyconfig/OptimizelyConfigServiceTest.java @@ -212,6 +212,7 @@ private ProjectConfig generateOptimizelyConfig() { true, true, true, + ProjectConfig.Region.US, "3918735994", "1480511547", "ValidProjectConfigV4", From a4d8a78fac6a47d2dd52cac9f1b4ddee55f773d5 Mon Sep 17 00:00:00 2001 From: esrakartalOpt Date: Wed, 30 Jul 2025 10:22:30 -0500 Subject: [PATCH 4/7] Update Nebula version --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 54426f6e7..21e71ab33 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ plugins { id 'com.github.kt3k.coveralls' version '2.12.2' id 'jacoco' id 'me.champeau.gradle.jmh' version '0.5.3' - id 'nebula.optional-base' version '3.2.0' + id 'nebula.optional-base' version '3.1.0' id 'com.github.hierynomus.license' version '0.16.1' id 'com.github.spotbugs' version "6.0.14" id 'maven-publish' From 635b17494aedfecf7736c972387fa7969db14bca Mon Sep 17 00:00:00 2001 From: esrakartalOpt Date: Thu, 31 Jul 2025 10:58:01 -0500 Subject: [PATCH 5/7] Fix tests --- .../test/java/com/optimizely/ab/config/ValidProjectConfigV4.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core-api/src/test/java/com/optimizely/ab/config/ValidProjectConfigV4.java b/core-api/src/test/java/com/optimizely/ab/config/ValidProjectConfigV4.java index 0b418b170..922e8e09a 100644 --- a/core-api/src/test/java/com/optimizely/ab/config/ValidProjectConfigV4.java +++ b/core-api/src/test/java/com/optimizely/ab/config/ValidProjectConfigV4.java @@ -1668,6 +1668,7 @@ public static ProjectConfig generateValidProjectConfigV4_holdout() { ANONYMIZE_IP, SEND_FLAG_DECISIONS, BOT_FILTERING, + REGION, PROJECT_ID, REVISION, SDK_KEY, From b383fb86ddf57e9dc3fa83d0561ad4f23d117ebd Mon Sep 17 00:00:00 2001 From: esrakartalOpt Date: Thu, 31 Jul 2025 15:35:47 -0500 Subject: [PATCH 6/7] Implement changes --- .../ab/config/DatafileProjectConfig.java | 12 ++++++------ .../com/optimizely/ab/config/ProjectConfig.java | 16 +--------------- .../config/parser/DatafileGsonDeserializer.java | 4 ++-- .../parser/DatafileJacksonDeserializer.java | 4 ++-- .../ab/config/parser/JsonConfigParser.java | 4 ++-- .../ab/config/parser/JsonSimpleConfigParser.java | 4 ++-- .../ab/event/internal/EventEndpoints.java | 13 ++++++------- .../config/DatafileProjectConfigTestUtils.java | 8 ++++---- .../ab/config/ValidProjectConfigV4.java | 2 +- .../ab/event/internal/EventEndpointsTest.java | 7 +++---- .../OptimizelyConfigServiceTest.java | 2 +- 11 files changed, 30 insertions(+), 46 deletions(-) diff --git a/core-api/src/main/java/com/optimizely/ab/config/DatafileProjectConfig.java b/core-api/src/main/java/com/optimizely/ab/config/DatafileProjectConfig.java index ab59143fc..e21330b3b 100644 --- a/core-api/src/main/java/com/optimizely/ab/config/DatafileProjectConfig.java +++ b/core-api/src/main/java/com/optimizely/ab/config/DatafileProjectConfig.java @@ -63,7 +63,7 @@ public class DatafileProjectConfig implements ProjectConfig { private final boolean anonymizeIP; private final boolean sendFlagDecisions; private final Boolean botFiltering; - private final Region region; + private final String region; private final String hostForODP; private final String publicKeyForODP; private final List attributes; @@ -103,14 +103,14 @@ public class DatafileProjectConfig implements ProjectConfig { // v2 constructor public DatafileProjectConfig(String accountId, String projectId, String version, String revision, List groups, List experiments, List attributes, List eventType, - List audiences, Region region) { + List audiences, String region) { this(accountId, projectId, version, revision, groups, experiments, attributes, eventType, audiences, false, region); } // v3 constructor public DatafileProjectConfig(String accountId, String projectId, String version, String revision, List groups, List experiments, List attributes, List eventType, - List audiences, boolean anonymizeIP, Region region) { + List audiences, boolean anonymizeIP, String region) { this( accountId, anonymizeIP, @@ -140,7 +140,7 @@ public DatafileProjectConfig(String accountId, boolean anonymizeIP, boolean sendFlagDecisions, Boolean botFiltering, - Region region, + String region, String projectId, String revision, String sdkKey, @@ -165,7 +165,7 @@ public DatafileProjectConfig(String accountId, this.anonymizeIP = anonymizeIP; this.sendFlagDecisions = sendFlagDecisions; this.botFiltering = botFiltering; - this.region = region != null ? region : Region.US; + this.region = region != null ? region : "US"; this.attributes = Collections.unmodifiableList(attributes); this.audiences = Collections.unmodifiableList(audiences); @@ -439,7 +439,7 @@ public Boolean getBotFiltering() { } @Override - public Region getRegion() { + public String getRegion() { return region; } diff --git a/core-api/src/main/java/com/optimizely/ab/config/ProjectConfig.java b/core-api/src/main/java/com/optimizely/ab/config/ProjectConfig.java index 02215f6f9..d7cbd610c 100644 --- a/core-api/src/main/java/com/optimizely/ab/config/ProjectConfig.java +++ b/core-api/src/main/java/com/optimizely/ab/config/ProjectConfig.java @@ -143,20 +143,6 @@ public String toString() { } } - public enum Region { - US("US"), EU("EU"); - private final String region; - - Region(String region) { - this.region = region; - } - - @Override - public String toString() { - return region; - } - } - - Region getRegion(); + String getRegion(); } diff --git a/core-api/src/main/java/com/optimizely/ab/config/parser/DatafileGsonDeserializer.java b/core-api/src/main/java/com/optimizely/ab/config/parser/DatafileGsonDeserializer.java index 42f3b8dac..99b06c447 100644 --- a/core-api/src/main/java/com/optimizely/ab/config/parser/DatafileGsonDeserializer.java +++ b/core-api/src/main/java/com/optimizely/ab/config/parser/DatafileGsonDeserializer.java @@ -121,10 +121,10 @@ public ProjectConfig deserialize(JsonElement json, Type typeOfT, JsonDeserializa sendFlagDecisions = jsonObject.get("sendFlagDecisions").getAsBoolean(); } - ProjectConfig.Region region = ProjectConfig.Region.US; + String region = "US"; if (jsonObject.has("region")) { - region = ProjectConfig.Region.valueOf(jsonObject.get("region").getAsString()); + region = jsonObject.get("region").getAsString(); } return new DatafileProjectConfig( diff --git a/core-api/src/main/java/com/optimizely/ab/config/parser/DatafileJacksonDeserializer.java b/core-api/src/main/java/com/optimizely/ab/config/parser/DatafileJacksonDeserializer.java index ca00a1979..2dfc60b24 100644 --- a/core-api/src/main/java/com/optimizely/ab/config/parser/DatafileJacksonDeserializer.java +++ b/core-api/src/main/java/com/optimizely/ab/config/parser/DatafileJacksonDeserializer.java @@ -95,10 +95,10 @@ public DatafileProjectConfig deserialize(JsonParser parser, DeserializationConte } } - ProjectConfig.Region region = ProjectConfig.Region.US; + String region = "US"; if (node.hasNonNull("region")) { - region = ProjectConfig.Region.valueOf(node.get("region").asText()); + region = node.get("region").textValue(); } return new DatafileProjectConfig( diff --git a/core-api/src/main/java/com/optimizely/ab/config/parser/JsonConfigParser.java b/core-api/src/main/java/com/optimizely/ab/config/parser/JsonConfigParser.java index 4e8f0bc62..94433d18a 100644 --- a/core-api/src/main/java/com/optimizely/ab/config/parser/JsonConfigParser.java +++ b/core-api/src/main/java/com/optimizely/ab/config/parser/JsonConfigParser.java @@ -100,11 +100,11 @@ public ProjectConfig parseProjectConfig(@Nonnull String json) throws ConfigParse sendFlagDecisions = rootObject.getBoolean("sendFlagDecisions"); } - ProjectConfig.Region region = ProjectConfig.Region.US; // Default to US + String region = "US"; // Default to US if (rootObject.has("region")) { String regionString = rootObject.getString("region"); if ("EU".equalsIgnoreCase(regionString)) { - region = ProjectConfig.Region.EU; + region = "EU"; } } diff --git a/core-api/src/main/java/com/optimizely/ab/config/parser/JsonSimpleConfigParser.java b/core-api/src/main/java/com/optimizely/ab/config/parser/JsonSimpleConfigParser.java index 08cc08331..0a4893625 100644 --- a/core-api/src/main/java/com/optimizely/ab/config/parser/JsonSimpleConfigParser.java +++ b/core-api/src/main/java/com/optimizely/ab/config/parser/JsonSimpleConfigParser.java @@ -103,11 +103,11 @@ public ProjectConfig parseProjectConfig(@Nonnull String json) throws ConfigParse sendFlagDecisions = (Boolean) rootObject.get("sendFlagDecisions"); } - ProjectConfig.Region region = ProjectConfig.Region.US; // Default to US + String region = "US"; // Default to US if (rootObject.containsKey("region")) { String regionString = (String) rootObject.get("region"); if ("EU".equalsIgnoreCase(regionString)) { - region = ProjectConfig.Region.EU; + region = "EU"; } } diff --git a/core-api/src/main/java/com/optimizely/ab/event/internal/EventEndpoints.java b/core-api/src/main/java/com/optimizely/ab/event/internal/EventEndpoints.java index a7cc5185f..1c60b221f 100644 --- a/core-api/src/main/java/com/optimizely/ab/event/internal/EventEndpoints.java +++ b/core-api/src/main/java/com/optimizely/ab/event/internal/EventEndpoints.java @@ -16,7 +16,6 @@ */ package com.optimizely.ab.event.internal; -import com.optimizely.ab.config.ProjectConfig.Region; import java.util.HashMap; import java.util.Map; @@ -26,11 +25,11 @@ */ public class EventEndpoints { - private static final Map LOGX_ENDPOINTS = new HashMap<>(); + private static final Map LOGX_ENDPOINTS = new HashMap<>(); static { - LOGX_ENDPOINTS.put(Region.US, "https://logx.optimizely.com/v1/events"); - LOGX_ENDPOINTS.put(Region.EU, "https://eu.logx.optimizely.com/v1/events"); + LOGX_ENDPOINTS.put("US", "https://logx.optimizely.com/v1/events"); + LOGX_ENDPOINTS.put("EU", "https://eu.logx.optimizely.com/v1/events"); } /** @@ -40,9 +39,9 @@ public class EventEndpoints { * @param region the region for which to get the endpoint * @return the endpoint URL for the specified region, or US endpoint if region is null */ - public static String getEndpointForRegion(Region region) { + public static String getEndpointForRegion(String region) { if (region == null) { - return LOGX_ENDPOINTS.get(Region.US); + return LOGX_ENDPOINTS.get("US"); } return LOGX_ENDPOINTS.get(region); } @@ -53,6 +52,6 @@ public static String getEndpointForRegion(Region region) { * @return the default endpoint URL */ public static String getDefaultEndpoint() { - return LOGX_ENDPOINTS.get(Region.US); + return LOGX_ENDPOINTS.get("US"); } } diff --git a/core-api/src/test/java/com/optimizely/ab/config/DatafileProjectConfigTestUtils.java b/core-api/src/test/java/com/optimizely/ab/config/DatafileProjectConfigTestUtils.java index a21208edd..fe743152c 100644 --- a/core-api/src/test/java/com/optimizely/ab/config/DatafileProjectConfigTestUtils.java +++ b/core-api/src/test/java/com/optimizely/ab/config/DatafileProjectConfigTestUtils.java @@ -156,7 +156,7 @@ private static ProjectConfig generateValidProjectConfigV2() { Collections.emptyList()); List groups = asList(randomPolicyGroup, overlappingPolicyGroup); - return new DatafileProjectConfig("789", "1234", "2", "42", groups, experiments, attributes, events, audiences, ProjectConfig.Region.US); + return new DatafileProjectConfig("789", "1234", "2", "42", groups, experiments, attributes, events, audiences, "US"); } private static final ProjectConfig NO_AUDIENCE_PROJECT_CONFIG_V2 = generateNoAudienceProjectConfigV2(); @@ -209,7 +209,7 @@ private static ProjectConfig generateNoAudienceProjectConfigV2() { ); return new DatafileProjectConfig("789", "1234", "2", "42", Collections.emptyList(), experiments, attributes, - events, Collections.emptyList(), ProjectConfig.Region.US); + events, Collections.emptyList(), "US"); } private static final ProjectConfig VALID_PROJECT_CONFIG_V3 = generateValidProjectConfigV3(); @@ -326,7 +326,7 @@ private static ProjectConfig generateValidProjectConfigV3() { List groups = asList(randomPolicyGroup, overlappingPolicyGroup); return new DatafileProjectConfig("789", "1234", "3", "42", groups, experiments, attributes, events, audiences, - true, ProjectConfig.Region.US); + true, "US"); } private static final ProjectConfig NO_AUDIENCE_PROJECT_CONFIG_V3 = generateNoAudienceProjectConfigV3(); @@ -379,7 +379,7 @@ private static ProjectConfig generateNoAudienceProjectConfigV3() { ); return new DatafileProjectConfig("789", "1234", "3", "42", Collections.emptyList(), experiments, attributes, - events, Collections.emptyList(), true, ProjectConfig.Region.US); + events, Collections.emptyList(), true, "US"); } private static final ProjectConfig VALID_PROJECT_CONFIG_V4 = generateValidProjectConfigV4(); diff --git a/core-api/src/test/java/com/optimizely/ab/config/ValidProjectConfigV4.java b/core-api/src/test/java/com/optimizely/ab/config/ValidProjectConfigV4.java index 922e8e09a..0d8f5d3c0 100644 --- a/core-api/src/test/java/com/optimizely/ab/config/ValidProjectConfigV4.java +++ b/core-api/src/test/java/com/optimizely/ab/config/ValidProjectConfigV4.java @@ -41,7 +41,7 @@ public class ValidProjectConfigV4 { private static final String ENVIRONMENT_KEY = "production"; private static final String VERSION = "4"; private static final Boolean SEND_FLAG_DECISIONS = true; - private static final ProjectConfig.Region REGION = ProjectConfig.Region.US; + private static final String REGION = "US"; // attributes private static final String ATTRIBUTE_HOUSE_ID = "553339214"; diff --git a/core-api/src/test/java/com/optimizely/ab/event/internal/EventEndpointsTest.java b/core-api/src/test/java/com/optimizely/ab/event/internal/EventEndpointsTest.java index 7efc0631b..6fe898058 100644 --- a/core-api/src/test/java/com/optimizely/ab/event/internal/EventEndpointsTest.java +++ b/core-api/src/test/java/com/optimizely/ab/event/internal/EventEndpointsTest.java @@ -16,7 +16,6 @@ */ package com.optimizely.ab.event.internal; -import com.optimizely.ab.config.ProjectConfig.Region; import org.junit.Test; import static org.junit.Assert.*; @@ -27,13 +26,13 @@ public class EventEndpointsTest { @Test public void testGetEndpointForUSRegion() { - String endpoint = EventEndpoints.getEndpointForRegion(Region.US); + String endpoint = EventEndpoints.getEndpointForRegion("US"); assertEquals("https://logx.optimizely.com/v1/events", endpoint); } @Test public void testGetEndpointForEURegion() { - String endpoint = EventEndpoints.getEndpointForRegion(Region.EU); + String endpoint = EventEndpoints.getEndpointForRegion("EU"); assertEquals("https://eu.logx.optimizely.com/v1/events", endpoint); } @@ -54,7 +53,7 @@ public void testDefaultBehaviorAlwaysReturnsUS() { // Test that both null region and default endpoint return the same US endpoint String nullRegionEndpoint = EventEndpoints.getEndpointForRegion(null); String defaultEndpoint = EventEndpoints.getDefaultEndpoint(); - String usEndpoint = EventEndpoints.getEndpointForRegion(Region.US); + String usEndpoint = EventEndpoints.getEndpointForRegion("US"); assertEquals("All should return US endpoint", usEndpoint, nullRegionEndpoint); assertEquals("All should return US endpoint", usEndpoint, defaultEndpoint); diff --git a/core-api/src/test/java/com/optimizely/ab/optimizelyconfig/OptimizelyConfigServiceTest.java b/core-api/src/test/java/com/optimizely/ab/optimizelyconfig/OptimizelyConfigServiceTest.java index 7a8dc1032..8cce38389 100644 --- a/core-api/src/test/java/com/optimizely/ab/optimizelyconfig/OptimizelyConfigServiceTest.java +++ b/core-api/src/test/java/com/optimizely/ab/optimizelyconfig/OptimizelyConfigServiceTest.java @@ -212,7 +212,7 @@ private ProjectConfig generateOptimizelyConfig() { true, true, true, - ProjectConfig.Region.US, + "US", "3918735994", "1480511547", "ValidProjectConfigV4", From d7d38ca3c10e092488890630fa8842f82dba19d7 Mon Sep 17 00:00:00 2001 From: esrakartalOpt Date: Thu, 31 Jul 2025 21:35:20 -0500 Subject: [PATCH 7/7] Implement comments --- .../ab/config/DatafileProjectConfig.java | 8 ++++---- .../com/optimizely/ab/config/ProjectConfig.java | 1 - .../ab/config/parser/JsonConfigParser.java | 3 --- .../ab/config/parser/JsonSimpleConfigParser.java | 3 --- .../ab/event/internal/EventEndpoints.java | 14 ++------------ .../ab/config/DatafileProjectConfigTestUtils.java | 8 ++++---- .../ab/event/ForwardingEventProcessorTest.java | 2 +- .../ab/event/internal/EventEndpointsTest.java | 10 ++++++++-- 8 files changed, 19 insertions(+), 30 deletions(-) diff --git a/core-api/src/main/java/com/optimizely/ab/config/DatafileProjectConfig.java b/core-api/src/main/java/com/optimizely/ab/config/DatafileProjectConfig.java index e21330b3b..f9267d257 100644 --- a/core-api/src/main/java/com/optimizely/ab/config/DatafileProjectConfig.java +++ b/core-api/src/main/java/com/optimizely/ab/config/DatafileProjectConfig.java @@ -103,20 +103,20 @@ public class DatafileProjectConfig implements ProjectConfig { // v2 constructor public DatafileProjectConfig(String accountId, String projectId, String version, String revision, List groups, List experiments, List attributes, List eventType, - List audiences, String region) { - this(accountId, projectId, version, revision, groups, experiments, attributes, eventType, audiences, false, region); + List audiences) { + this(accountId, projectId, version, revision, groups, experiments, attributes, eventType, audiences, false); } // v3 constructor public DatafileProjectConfig(String accountId, String projectId, String version, String revision, List groups, List experiments, List attributes, List eventType, - List audiences, boolean anonymizeIP, String region) { + List audiences, boolean anonymizeIP) { this( accountId, anonymizeIP, false, null, - region, + null, projectId, revision, null, diff --git a/core-api/src/main/java/com/optimizely/ab/config/ProjectConfig.java b/core-api/src/main/java/com/optimizely/ab/config/ProjectConfig.java index d7cbd610c..c992d068d 100644 --- a/core-api/src/main/java/com/optimizely/ab/config/ProjectConfig.java +++ b/core-api/src/main/java/com/optimizely/ab/config/ProjectConfig.java @@ -143,6 +143,5 @@ public String toString() { } } - String getRegion(); } diff --git a/core-api/src/main/java/com/optimizely/ab/config/parser/JsonConfigParser.java b/core-api/src/main/java/com/optimizely/ab/config/parser/JsonConfigParser.java index 94433d18a..e3552f490 100644 --- a/core-api/src/main/java/com/optimizely/ab/config/parser/JsonConfigParser.java +++ b/core-api/src/main/java/com/optimizely/ab/config/parser/JsonConfigParser.java @@ -103,9 +103,6 @@ public ProjectConfig parseProjectConfig(@Nonnull String json) throws ConfigParse String region = "US"; // Default to US if (rootObject.has("region")) { String regionString = rootObject.getString("region"); - if ("EU".equalsIgnoreCase(regionString)) { - region = "EU"; - } } return new DatafileProjectConfig( diff --git a/core-api/src/main/java/com/optimizely/ab/config/parser/JsonSimpleConfigParser.java b/core-api/src/main/java/com/optimizely/ab/config/parser/JsonSimpleConfigParser.java index 0a4893625..419d59995 100644 --- a/core-api/src/main/java/com/optimizely/ab/config/parser/JsonSimpleConfigParser.java +++ b/core-api/src/main/java/com/optimizely/ab/config/parser/JsonSimpleConfigParser.java @@ -106,9 +106,6 @@ public ProjectConfig parseProjectConfig(@Nonnull String json) throws ConfigParse String region = "US"; // Default to US if (rootObject.containsKey("region")) { String regionString = (String) rootObject.get("region"); - if ("EU".equalsIgnoreCase(regionString)) { - region = "EU"; - } } return new DatafileProjectConfig( diff --git a/core-api/src/main/java/com/optimizely/ab/event/internal/EventEndpoints.java b/core-api/src/main/java/com/optimizely/ab/event/internal/EventEndpoints.java index 1c60b221f..3035a0c88 100644 --- a/core-api/src/main/java/com/optimizely/ab/event/internal/EventEndpoints.java +++ b/core-api/src/main/java/com/optimizely/ab/event/internal/EventEndpoints.java @@ -15,7 +15,6 @@ * limitations under the License. */ package com.optimizely.ab.event.internal; - import java.util.HashMap; import java.util.Map; @@ -40,18 +39,9 @@ public class EventEndpoints { * @return the endpoint URL for the specified region, or US endpoint if region is null */ public static String getEndpointForRegion(String region) { - if (region == null) { - return LOGX_ENDPOINTS.get("US"); + if (region != null && region.equals("EU")) { + return LOGX_ENDPOINTS.get("EU"); } - return LOGX_ENDPOINTS.get(region); - } - - /** - * Get the default event endpoint URL (US region). - * - * @return the default endpoint URL - */ - public static String getDefaultEndpoint() { return LOGX_ENDPOINTS.get("US"); } } diff --git a/core-api/src/test/java/com/optimizely/ab/config/DatafileProjectConfigTestUtils.java b/core-api/src/test/java/com/optimizely/ab/config/DatafileProjectConfigTestUtils.java index fe743152c..ef9a8ccc2 100644 --- a/core-api/src/test/java/com/optimizely/ab/config/DatafileProjectConfigTestUtils.java +++ b/core-api/src/test/java/com/optimizely/ab/config/DatafileProjectConfigTestUtils.java @@ -156,7 +156,7 @@ private static ProjectConfig generateValidProjectConfigV2() { Collections.emptyList()); List groups = asList(randomPolicyGroup, overlappingPolicyGroup); - return new DatafileProjectConfig("789", "1234", "2", "42", groups, experiments, attributes, events, audiences, "US"); + return new DatafileProjectConfig("789", "1234", "2", "42", groups, experiments, attributes, events, audiences); } private static final ProjectConfig NO_AUDIENCE_PROJECT_CONFIG_V2 = generateNoAudienceProjectConfigV2(); @@ -209,7 +209,7 @@ private static ProjectConfig generateNoAudienceProjectConfigV2() { ); return new DatafileProjectConfig("789", "1234", "2", "42", Collections.emptyList(), experiments, attributes, - events, Collections.emptyList(), "US"); + events, Collections.emptyList()); } private static final ProjectConfig VALID_PROJECT_CONFIG_V3 = generateValidProjectConfigV3(); @@ -326,7 +326,7 @@ private static ProjectConfig generateValidProjectConfigV3() { List groups = asList(randomPolicyGroup, overlappingPolicyGroup); return new DatafileProjectConfig("789", "1234", "3", "42", groups, experiments, attributes, events, audiences, - true, "US"); + true); } private static final ProjectConfig NO_AUDIENCE_PROJECT_CONFIG_V3 = generateNoAudienceProjectConfigV3(); @@ -379,7 +379,7 @@ private static ProjectConfig generateNoAudienceProjectConfigV3() { ); return new DatafileProjectConfig("789", "1234", "3", "42", Collections.emptyList(), experiments, attributes, - events, Collections.emptyList(), true, "US"); + events, Collections.emptyList(), true); } private static final ProjectConfig VALID_PROJECT_CONFIG_V4 = generateValidProjectConfigV4(); diff --git a/core-api/src/test/java/com/optimizely/ab/event/ForwardingEventProcessorTest.java b/core-api/src/test/java/com/optimizely/ab/event/ForwardingEventProcessorTest.java index bf9591620..30f62d3c9 100644 --- a/core-api/src/test/java/com/optimizely/ab/event/ForwardingEventProcessorTest.java +++ b/core-api/src/test/java/com/optimizely/ab/event/ForwardingEventProcessorTest.java @@ -50,7 +50,7 @@ public void setUp() throws Exception { eventProcessor = new ForwardingEventProcessor(logEvent -> { assertNotNull(logEvent.getEventBatch()); assertEquals(logEvent.getRequestMethod(), LogEvent.RequestMethod.POST); - assertEquals(logEvent.getEndpointUrl(), EventEndpoints.getDefaultEndpoint()); + assertEquals(logEvent.getEndpointUrl(), EventEndpoints.getEndpointForRegion("US")); atomicBoolean.set(true); }, notificationCenter); } diff --git a/core-api/src/test/java/com/optimizely/ab/event/internal/EventEndpointsTest.java b/core-api/src/test/java/com/optimizely/ab/event/internal/EventEndpointsTest.java index 6fe898058..cf2016a3e 100644 --- a/core-api/src/test/java/com/optimizely/ab/event/internal/EventEndpointsTest.java +++ b/core-api/src/test/java/com/optimizely/ab/event/internal/EventEndpointsTest.java @@ -38,7 +38,7 @@ public void testGetEndpointForEURegion() { @Test public void testGetDefaultEndpoint() { - String defaultEndpoint = EventEndpoints.getDefaultEndpoint(); + String defaultEndpoint = EventEndpoints.getEndpointForRegion("US"); assertEquals("https://logx.optimizely.com/v1/events", defaultEndpoint); } @@ -48,11 +48,17 @@ public void testGetEndpointForNullRegion() { assertEquals("https://logx.optimizely.com/v1/events", endpoint); } + @Test + public void testGetEndpointForInvalidRegion() { + String endpoint = EventEndpoints.getEndpointForRegion("ZZ"); + assertEquals("https://logx.optimizely.com/v1/events", endpoint); + } + @Test public void testDefaultBehaviorAlwaysReturnsUS() { // Test that both null region and default endpoint return the same US endpoint String nullRegionEndpoint = EventEndpoints.getEndpointForRegion(null); - String defaultEndpoint = EventEndpoints.getDefaultEndpoint(); + String defaultEndpoint = EventEndpoints.getEndpointForRegion("US"); String usEndpoint = EventEndpoints.getEndpointForRegion("US"); assertEquals("All should return US endpoint", usEndpoint, nullRegionEndpoint);