From fa3846f69a29aa718996932616fa370b30760b73 Mon Sep 17 00:00:00 2001 From: weiqiangliu Date: Tue, 27 Sep 2022 16:32:28 +0800 Subject: [PATCH] Release 0.0.5 --- pom.xml | 2 +- .../analytics/javasdk/SensorsABTestConst.java | 5 +- .../javasdk/SensorsABTestWorker.java | 25 +- .../javasdk/cache/EventCacheManager.java | 25 +- .../javasdk/AsyncFetchCustomIdsTest.java | 36 +++ .../javasdk/AsyncFetchRegressionTest.java | 223 +++++++++++++ .../javasdk/FastFetchCustomIdsTest.java | 306 ++++++++++-------- .../javasdk/FastFetchRegressionTest.java | 1 + .../analytics/javasdk/TestServlet.java | 42 +++ 9 files changed, 514 insertions(+), 151 deletions(-) diff --git a/pom.xml b/pom.xml index d043283..c7aac88 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ com.sensorsdata.analytics.javasdk SensorsABTesting - 0.0.4 + 0.0.5 SensorsABTesting http://sensorsdata.cn diff --git a/src/main/java/com/sensorsdata/analytics/javasdk/SensorsABTestConst.java b/src/main/java/com/sensorsdata/analytics/javasdk/SensorsABTestConst.java index 2c9012f..c5858a4 100644 --- a/src/main/java/com/sensorsdata/analytics/javasdk/SensorsABTestConst.java +++ b/src/main/java/com/sensorsdata/analytics/javasdk/SensorsABTestConst.java @@ -16,7 +16,7 @@ private SensorsABTestConst() { static final String JAVA = "Java"; - static final String VERSION = "0.0.4"; + static final String VERSION = "0.0.5"; static final String VERSION_KEY = "abtest_lib_version"; @@ -39,6 +39,9 @@ private SensorsABTestConst() { public static final String RESULTS_KEY = "results"; public static final String STATUS_KEY = "status"; public static final String SUCCESS = "SUCCESS"; + + // 自定义主体 id + public static final String CUSTOM_ID = "custom_id"; } diff --git a/src/main/java/com/sensorsdata/analytics/javasdk/SensorsABTestWorker.java b/src/main/java/com/sensorsdata/analytics/javasdk/SensorsABTestWorker.java index 4967d35..a42ab7a 100644 --- a/src/main/java/com/sensorsdata/analytics/javasdk/SensorsABTestWorker.java +++ b/src/main/java/com/sensorsdata/analytics/javasdk/SensorsABTestWorker.java @@ -16,6 +16,7 @@ import com.google.common.collect.Maps; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateFormatUtils; import java.io.IOException; @@ -195,9 +196,9 @@ void trackABTestTrigger(Experiment result, Map properties } //缓存中存在 A/B 事件 if (eventCacheManager.judgeEventCacheExist(result.getDistinctId(), result.getIsLoginId(), - result.getAbTestExperimentId(), customIds)) { - log.info("The event has been triggered.[distinctId:{},experimentId:{}]", - result.getDistinctId(), result.getAbTestExperimentId()); + result.getAbTestExperimentId(), customIds, result.getAbTestExperimentGroupId())) { + log.info("The event has been triggered.[distinctId:{},experimentId:{},abTestExperimentGroupId:{}]", + result.getDistinctId(), result.getAbTestExperimentId(), result.getAbTestExperimentGroupId()); return; } if (properties == null) { @@ -205,6 +206,8 @@ void trackABTestTrigger(Experiment result, Map properties } properties.put(SensorsABTestConst.EXPERIMENT_ID, result.getAbTestExperimentId()); properties.put(SensorsABTestConst.EXPERIMENT_GROUP_ID, result.getAbTestExperimentGroupId()); + if (null != customIds) + properties.putAll(customIds); //判断是否为当天首次上传,重启服务,升级 SDK 版本都会触发 String day = DateFormatUtils.ISO_8601_EXTENDED_DATE_FORMAT.format(Calendar.getInstance()); if (trigger == null || trigger.isEmpty() || !day.equals(trigger)) { @@ -213,22 +216,22 @@ void trackABTestTrigger(Experiment result, Map properties versions.add(String.format("%s:%s", SensorsABTestConst.AB_TEST_EVENT_LIB_VERSION, SensorsABTestConst.VERSION)); properties.put(SensorsABTestConst.LIB_PLUGIN_VERSION, versions); log.debug( - "Meet the conditions:the first event of current day,the first events of server.[distinctId:{},isLoginId:{},experimentId:{}]", - result.getDistinctId(), result.getIsLoginId(), result.getAbTestExperimentId()); + "Meet the conditions:the first event of current day,the first events of server.[distinctId:{},isLoginId:{},experimentId:{},abTestExperimentGroupId:{}]", + result.getDistinctId(), result.getIsLoginId(), result.getAbTestExperimentId(), result.getAbTestExperimentGroupId()); } this.config.getSensorsAnalytics().track(result.getDistinctId(), result.getIsLoginId(), SensorsABTestConst.EVENT_TYPE, properties); - log.debug("Successfully trigger AB event.[distinctId:{},isLoginId:{},experimentId:{}]", - result.getDistinctId(), result.getIsLoginId(), result.getAbTestExperimentId()); + log.debug("Successfully trigger AB event.[distinctId:{},isLoginId:{},experimentId:{},abTestExperimentGroupId:{}]", + result.getDistinctId(), result.getIsLoginId(), result.getAbTestExperimentId(), result.getAbTestExperimentGroupId()); //判断是否需要缓存上报事件 if (config.getEnableEventCache() == null || config.getEnableEventCache()) { - log.debug("Enable event cache,will cache event.[distinctId:{},isLoginId:{},experimentId:{}]", - result.getDistinctId(), result.getIsLoginId(), result.getAbTestExperimentId()); + log.debug("Enable event cache,will cache event.[distinctId:{},isLoginId:{},experimentId:{},abTestExperimentGroupId:{}]", + result.getDistinctId(), result.getIsLoginId(), result.getAbTestExperimentId(), result.getAbTestExperimentGroupId()); eventCacheManager.setEventCache( result.getDistinctId(), result.getIsLoginId(), result.getAbTestExperimentId(), - customIds); + customIds, result.getAbTestExperimentGroupId()); } } @@ -258,8 +261,8 @@ private JsonNode getABTestByHttp(String distinctId, boolean isLoginId, String ex params.put("param_name", experimentName); } String strJson = objectMapper.writeValueAsString(params); - log.debug("The parameter for making a network request is {}.", strJson); String result = httpConsumer.consume(strJson, timeoutMilliseconds); + log.debug("Successfully get the httpConsumer result.[strJson:{},result:{}]", strJson, result); JsonNode res = objectMapper.readTree(result); if (res != null && SensorsABTestConst.SUCCESS.equals(res.findValue(SensorsABTestConst.STATUS_KEY).asText()) && res.findValue(SensorsABTestConst.RESULTS_KEY).size() > 0) { diff --git a/src/main/java/com/sensorsdata/analytics/javasdk/cache/EventCacheManager.java b/src/main/java/com/sensorsdata/analytics/javasdk/cache/EventCacheManager.java index 43246f6..06a4612 100644 --- a/src/main/java/com/sensorsdata/analytics/javasdk/cache/EventCacheManager.java +++ b/src/main/java/com/sensorsdata/analytics/javasdk/cache/EventCacheManager.java @@ -2,11 +2,11 @@ import static com.sensorsdata.analytics.javasdk.util.ABTestUtil.map2Str; -import com.fasterxml.jackson.databind.JsonNode; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; @@ -26,17 +26,15 @@ public class EventCacheManager { /** * 上报事件缓存 */ - private final LoadingCache eventCache; - - private static final Object OBJ = new Object(); + private final LoadingCache eventCache; public EventCacheManager(int cacheTime, int cacheSize) { this.eventCache = CacheBuilder.newBuilder() .expireAfterWrite(cacheTime, TimeUnit.MINUTES) .maximumSize(cacheSize) - .build(new CacheLoader() { + .build(new CacheLoader() { @Override - public JsonNode load(String s) { + public String load(String s) { return null; } }); @@ -45,13 +43,18 @@ public JsonNode load(String s) { public boolean judgeEventCacheExist(String distinctId, Boolean isLoginId, String experimentId, - Map customIds) { - return this.eventCache.getIfPresent(generateKey(distinctId, isLoginId, experimentId, customIds)) - != null; + Map customIds, String abTestExperimentGroupId) { + if (this.eventCache.getIfPresent(generateKey(distinctId, isLoginId, experimentId, customIds)) == null) + return false; + else + return StringUtils.equals( + this.eventCache.getIfPresent(generateKey(distinctId, isLoginId, experimentId, customIds)), + abTestExperimentGroupId); } - public void setEventCache(String distinctId, Boolean isLoginId, String experimentId, Map customIds) { - this.eventCache.put(generateKey(distinctId, isLoginId, experimentId, customIds), OBJ); + public void setEventCache(String distinctId, Boolean isLoginId, String experimentId, Map customIds, + String abTestExperimentGroupId) { + this.eventCache.put(generateKey(distinctId, isLoginId, experimentId, customIds), abTestExperimentGroupId); } public long getCacheSize() { diff --git a/src/test/java/com/sensorsdata/analytics/javasdk/AsyncFetchCustomIdsTest.java b/src/test/java/com/sensorsdata/analytics/javasdk/AsyncFetchCustomIdsTest.java index d5bb9ef..9227f62 100644 --- a/src/test/java/com/sensorsdata/analytics/javasdk/AsyncFetchCustomIdsTest.java +++ b/src/test/java/com/sensorsdata/analytics/javasdk/AsyncFetchCustomIdsTest.java @@ -11,6 +11,7 @@ import org.junit.Test; import java.io.IOException; +import java.util.HashMap; import java.util.Map; import static org.junit.Assert.*; @@ -339,4 +340,39 @@ public void checkAsyncFetchOldEnv() throws InvalidArgumentException { assertEquals(1, (int) experiment.getResult()); } + /** + * asyncFetchTest 请求,携带一个正确的 customIds + * 期望:properties 字段中存在 custom_id + */ + @Test + @Ignore + public void checkAsyncFetchWithCustomIds() + throws InvalidArgumentException, NoSuchFieldException, IllegalAccessException, IOException { + //初始化 AB Testing SDK + initSASDK(); + initInstance(ABGlobalConfig.builder().setApiUrl(url).setSensorsAnalytics(sa).build()); + initInnerClassInfo(sensorsABTest); + HashMap customIdMap = new HashMap<>(); + customIdMap.put("custom_id", "test11"); + Experiment result = + sensorsABTest.asyncFetchABTest(SensorsABParams.starter("a123", false, "test_group_id2", "{\"color\":\"grey\"}").customIds(customIdMap).build()); + initInnerClassInfo(sensorsABTest); + + // 检查试验结果 + assertEquals("a123", result.getDistinctId()); + assertEquals(false, result.getIsLoginId()); + assertEquals("2", result.getAbTestExperimentGroupId()); + + // 检查事件缓存 + assertEquals(1, eventCacheByReflect.size()); + + if(messageBuffer != null) { + assertNotEquals(0, messageBuffer.length()); + JsonNode jsonNode = SensorsAnalyticsUtil.getJsonObjectMapper().readValue(messageBuffer.toString(), JsonNode.class); + assertEquals("\"$ABTestTrigger\"", jsonNode.get("event").toString()); + // 验证属性中是否包含 custom_id + assertEquals("\"test11\"", jsonNode.get("properties").get("custom_id").toString()); + } + assertNotNull(result.getResult()); + } } diff --git a/src/test/java/com/sensorsdata/analytics/javasdk/AsyncFetchRegressionTest.java b/src/test/java/com/sensorsdata/analytics/javasdk/AsyncFetchRegressionTest.java index 1324e06..02fe735 100644 --- a/src/test/java/com/sensorsdata/analytics/javasdk/AsyncFetchRegressionTest.java +++ b/src/test/java/com/sensorsdata/analytics/javasdk/AsyncFetchRegressionTest.java @@ -10,6 +10,7 @@ import org.junit.Test; import java.io.IOException; +import java.util.HashMap; import static org.junit.Assert.*; @@ -306,4 +307,226 @@ public void checkAsyncFetchTestWithMultiCustomIds() throws InvalidArgumentExcept assertEquals("2", experiment.getAbTestExperimentId()); assertEquals("1", experiment.getAbTestExperimentGroupId()); } + + /** + * 调用 asyncFetchABTest 接口触发 $ABTestTrigger 事件,再次调用 asyncFetchABTest 接口,传入相同的试验参数 + * 期望:再次调用后 $ABTestTrigger 事件正常触发 + * $ABTestTrigger 事件中 $abtest_experiment_group_id 为新的试验组 ID + */ + @Test + public void checkAsyncFetchTestExperimentGroupIdChange () + throws InvalidArgumentException, NoSuchFieldException, IllegalAccessException { + //初始化 AB Testing SDK + initSASDK(); + initInstance(ABGlobalConfig.builder().setApiUrl(url).setSensorsAnalytics(sa).build()); + initInnerClassInfo(sensorsABTest); + HashMap customIdMap = new HashMap<>(); + customIdMap.put("custom_id", "test11"); + // 第一次请求 + Experiment result = + sensorsABTest.asyncFetchABTest(SensorsABParams.starter(distinctId, false, "test_group_id2", "{\"color\":\"grey\"}").customIds(customIdMap).build()); + initInnerClassInfo(sensorsABTest); + + // 检查试验结果 + assertEquals(distinctId, result.getDistinctId()); + assertEquals(false, result.getIsLoginId()); + assertEquals("2", result.getAbTestExperimentGroupId()); + assertEquals("{\"name\":\"helloWord2\"}", result.getResult()); + + + // asyncFetchABTest 接口固定不存储实验缓存, fastFetchABTest 接口才存储实验缓存 + assertEquals(0, experimentCacheManagerByReflect.getCacheSize()); + + // 检查事件缓存 + assertEquals(1, eventCacheByReflect.size()); + assertEquals("2", eventCacheByReflect.getIfPresent(generateKey(result.getDistinctId(), result.getIsLoginId(), result.getAbTestExperimentId(), customIdMap))); + + + // 第二次请求 + Experiment result2 = + sensorsABTest.asyncFetchABTest(SensorsABParams.starter(distinctId, false, "test_group_id3", "{\"color\":\"grey\"}").customIds(customIdMap).build()); + initInnerClassInfo(sensorsABTest); + + assertEquals("a123", result2.getDistinctId()); + assertEquals(false, result2.getIsLoginId()); + assertEquals("3", result2.getAbTestExperimentGroupId()); + assertEquals("{\"name\":\"helloWord3\"}", result2.getResult()); + + + assertEquals(0, experimentCacheManagerByReflect.getCacheSize()); + + // 检查事件缓存 + assertEquals(1, eventCacheByReflect.size()); + assertEquals("3", eventCacheByReflect.getIfPresent(generateKey(result2.getDistinctId(), result2.getIsLoginId(), result2.getAbTestExperimentId(), customIdMap))); + } + + /** + * 步骤:调用 asyncFetchABTest 接口,传入正确的试验参数 + * 触发 $ABTestTrigger 事件,再次调用 asyncFetchABTest 接口,传入相同的试验参数 + * 期望:再次调用后 $ABTestTrigger 事件不再触发 + */ + @Test + public void checkAsyncFetchTestExperimentGroupIdNotChange () + throws InvalidArgumentException, NoSuchFieldException, IllegalAccessException { + //初始化 AB Testing SDK + initSASDK(); + initInstance(ABGlobalConfig.builder().setApiUrl(url).setSensorsAnalytics(sa).build()); + initInnerClassInfo(sensorsABTest); + HashMap customIdMap = new HashMap<>(); + customIdMap.put("custom_id", "test11"); + // 第一次请求 + Experiment result = + sensorsABTest.asyncFetchABTest(SensorsABParams.starter(distinctId, false, "test_group_id2", "{\"color\":\"grey\"}").customIds(customIdMap).build()); + initInnerClassInfo(sensorsABTest); + + // 检查试验结果 + assertEquals(distinctId, result.getDistinctId()); + assertEquals(false, result.getIsLoginId()); + assertEquals("2", result.getAbTestExperimentGroupId()); + assertEquals("{\"name\":\"helloWord2\"}", result.getResult()); + + + // asyncFetchABTest 接口固定不存储实验缓存, fastFetchABTest 接口才存储实验缓存 + assertEquals(0, experimentCacheManagerByReflect.getCacheSize()); + + // 检查事件缓存 + assertEquals(1, eventCacheByReflect.size()); + assertEquals("2", eventCacheByReflect.getIfPresent(generateKey(result.getDistinctId(), result.getIsLoginId(), result.getAbTestExperimentId(), customIdMap))); + + + // 第二次请求 + Experiment result2 = + sensorsABTest.asyncFetchABTest(SensorsABParams.starter(distinctId, false, "test_group_id2", "{\"color\":\"grey\"}").customIds(customIdMap).build()); + initInnerClassInfo(sensorsABTest); + + assertEquals("a123", result2.getDistinctId()); + assertEquals(false, result2.getIsLoginId()); + assertEquals("2", result2.getAbTestExperimentGroupId()); + assertEquals("{\"name\":\"helloWord2\"}", result2.getResult()); + + + assertEquals(0, experimentCacheManagerByReflect.getCacheSize()); + + // 检查事件缓存 + assertEquals(1, eventCacheByReflect.size()); + assertEquals("2", eventCacheByReflect.getIfPresent(generateKey(result2.getDistinctId(), result2.getIsLoginId(), result2.getAbTestExperimentId(), customIdMap))); + } + + /** + * 步骤:启动 App,调用 asyncFetchABTest 接口,传入正确的试验参数 + * 触发 $ABTestTrigger 事件,再次冷启动,调用 asyncFetchABTest 接口,传入相同的试验参数 + * 检查 $ABTestTrigger 事件触发情况 + * 期望:再次冷启动调用后 $ABTestTrigger 事件不再触发 + */ + @Test + public void checkAsyncFetchTestExperimentGroupIdNotChangeRestart () + throws InvalidArgumentException, NoSuchFieldException, IllegalAccessException { + //初始化 AB Testing SDK + initSASDK(); + initInstance(ABGlobalConfig.builder().setApiUrl(url).setSensorsAnalytics(sa).build()); + initInnerClassInfo(sensorsABTest); + HashMap customIdMap = new HashMap<>(); + customIdMap.put("custom_id", "test11"); + // 第一次请求 + Experiment result = + sensorsABTest.asyncFetchABTest(SensorsABParams.starter(distinctId, false, "test_group_id2", "{\"color\":\"grey\"}").customIds(customIdMap).build()); + initInnerClassInfo(sensorsABTest); + + // 检查试验结果 + assertEquals(distinctId, result.getDistinctId()); + assertEquals(false, result.getIsLoginId()); + assertEquals("2", result.getAbTestExperimentGroupId()); + assertEquals("{\"name\":\"helloWord2\"}", result.getResult()); + + + // asyncFetchABTest 接口固定不存储实验缓存, fastFetchABTest 接口才存储实验缓存 + assertEquals(0, experimentCacheManagerByReflect.getCacheSize()); + + // 检查事件缓存 + assertEquals(1, eventCacheByReflect.size()); + assertEquals("2", eventCacheByReflect.getIfPresent(generateKey(result.getDistinctId(), result.getIsLoginId(), result.getAbTestExperimentId(), customIdMap))); + + + // 第二次请求 + //初始化 AB Testing SDK + initSASDK(); + initInstance(ABGlobalConfig.builder().setApiUrl(url).setSensorsAnalytics(sa).build()); + initInnerClassInfo(sensorsABTest); + + Experiment result2 = + sensorsABTest.asyncFetchABTest(SensorsABParams.starter(distinctId, false, "test_group_id2", "{\"color\":\"grey\"}").customIds(customIdMap).build()); + initInnerClassInfo(sensorsABTest); + + assertEquals("a123", result2.getDistinctId()); + assertEquals(false, result2.getIsLoginId()); + assertEquals("2", result2.getAbTestExperimentGroupId()); + assertEquals("{\"name\":\"helloWord2\"}", result2.getResult()); + + + assertEquals(0, experimentCacheManagerByReflect.getCacheSize()); + + // 检查事件缓存 + assertEquals(1, eventCacheByReflect.size()); + assertEquals("2", eventCacheByReflect.getIfPresent(generateKey(result2.getDistinctId(), result2.getIsLoginId(), result2.getAbTestExperimentId(), customIdMap))); + } + + /** + * 步骤:启动 App,调用 asyncFetchABTest 接口,传入正确的试验参数 + * 触发 $ABTestTrigger 事件,再次调用 asyncFetchABTest 接口,传入相同的试验参数 + * 检查 $ABTestTrigger 事件触发情况 + * 期望:再次调用后 $ABTestTrigger 事件正常触发 + * $ABTestTrigger 事件中 $abtest_experiment_group_id 为新的试验组 ID + * 更新事件缓存信息 + */ + @Test + public void checkAsyncFetchTestExperimentGroupIdChangeRestart () + throws InvalidArgumentException, NoSuchFieldException, IllegalAccessException { + //初始化 AB Testing SDK + initSASDK(); + initInstance(ABGlobalConfig.builder().setApiUrl(url).setSensorsAnalytics(sa).build()); + initInnerClassInfo(sensorsABTest); + HashMap customIdMap = new HashMap<>(); + customIdMap.put("custom_id", "test11"); + // 第一次请求 + Experiment result = + sensorsABTest.asyncFetchABTest(SensorsABParams.starter(distinctId, false, "test_group_id2", "{\"color\":\"grey\"}").customIds(customIdMap).build()); + initInnerClassInfo(sensorsABTest); + + // 检查试验结果 + assertEquals(distinctId, result.getDistinctId()); + assertEquals(false, result.getIsLoginId()); + assertEquals("2", result.getAbTestExperimentGroupId()); + assertEquals("{\"name\":\"helloWord2\"}", result.getResult()); + + + // asyncFetchABTest 接口固定不存储实验缓存, fastFetchABTest 接口才存储实验缓存 + assertEquals(0, experimentCacheManagerByReflect.getCacheSize()); + + // 检查事件缓存 + assertEquals(1, eventCacheByReflect.size()); + assertEquals("2", eventCacheByReflect.getIfPresent(generateKey(result.getDistinctId(), result.getIsLoginId(), result.getAbTestExperimentId(), customIdMap))); + + + // 第二次请求 + initSASDK(); + initInstance(ABGlobalConfig.builder().setApiUrl(url).setSensorsAnalytics(sa).build()); + initInnerClassInfo(sensorsABTest); + + Experiment result2 = + sensorsABTest.asyncFetchABTest(SensorsABParams.starter(distinctId, false, "test_group_id3", "{\"color\":\"grey\"}").customIds(customIdMap).build()); + initInnerClassInfo(sensorsABTest); + + assertEquals("a123", result2.getDistinctId()); + assertEquals(false, result2.getIsLoginId()); + assertEquals("3", result2.getAbTestExperimentGroupId()); + assertEquals("{\"name\":\"helloWord3\"}", result2.getResult()); + + + assertEquals(0, experimentCacheManagerByReflect.getCacheSize()); + + // 检查事件缓存 + assertEquals(1, eventCacheByReflect.size()); + assertEquals("3", eventCacheByReflect.getIfPresent(generateKey(result2.getDistinctId(), result2.getIsLoginId(), result2.getAbTestExperimentId(), customIdMap))); + } + } diff --git a/src/test/java/com/sensorsdata/analytics/javasdk/FastFetchCustomIdsTest.java b/src/test/java/com/sensorsdata/analytics/javasdk/FastFetchCustomIdsTest.java index 5580b47..1c307ae 100644 --- a/src/test/java/com/sensorsdata/analytics/javasdk/FastFetchCustomIdsTest.java +++ b/src/test/java/com/sensorsdata/analytics/javasdk/FastFetchCustomIdsTest.java @@ -2,10 +2,12 @@ import com.fasterxml.jackson.databind.JsonNode; import com.google.common.collect.Maps; + import com.sensorsdata.analytics.javasdk.bean.ABGlobalConfig; import com.sensorsdata.analytics.javasdk.bean.Experiment; import com.sensorsdata.analytics.javasdk.exceptions.InvalidArgumentException; import com.sensorsdata.analytics.javasdk.util.SensorsAnalyticsUtil; + import org.junit.Before; import org.junit.Ignore; import org.junit.Test; @@ -27,7 +29,7 @@ public class FastFetchCustomIdsTest extends SensorsBaseTest { @Before - public void init(){ + public void init() { initSASDK(); } @@ -40,10 +42,10 @@ public void checkFastFetchWithCustomIds() throws InvalidArgumentException { //初始化 AB Testing SDK initInstance(ABGlobalConfig.builder().setApiUrl(url).setSensorsAnalytics(sa).build()); Experiment experiment = - sensorsABTest.fastFetchABTest( - SensorsABParams.starter("a123", true, "str_experiment", "qwe") - .addCustomId("custom_id", "test11") - .build()); + sensorsABTest.fastFetchABTest( + SensorsABParams.starter("a123", true, "str_experiment", "qwe") + .addCustomId("custom_id", "test11") + .build()); assertNotNull(experiment); assertEquals("a123", experiment.getDistinctId()); assertTrue(experiment.getIsLoginId()); @@ -61,11 +63,11 @@ public void checkFastFetchWithMultiCustomIds() throws InvalidArgumentException { //初始化 AB Testing SDK initInstance(ABGlobalConfig.builder().setApiUrl(url).setSensorsAnalytics(sa).build()); Experiment experiment = - sensorsABTest.fastFetchABTest( - SensorsABParams.starter("a123", true, "str_experiment", "qwe") - .addCustomId("custom_id1", "test11") - .addCustomId("custom_id2", "test22") - .build()); + sensorsABTest.fastFetchABTest( + SensorsABParams.starter("a123", true, "str_experiment", "qwe") + .addCustomId("custom_id1", "test11") + .addCustomId("custom_id2", "test22") + .build()); assertNotNull(experiment); assertEquals("a123", experiment.getDistinctId()); assertTrue(experiment.getIsLoginId()); @@ -80,14 +82,16 @@ public void checkFastFetchWithMultiCustomIds() throws InvalidArgumentException { */ @Test public void checkFastFetchWithInvalidCustomIds01() throws InvalidArgumentException { - String[] customInvaild = {"date", "datetime", "distinct_id", "event", "events", "first_id", "id", "original_id", "properties", "second_id", "time", "user_id", "users"}; + String[] customInvaild = + {"date", "datetime", "distinct_id", "event", "events", "first_id", "id", "original_id", "properties", + "second_id", "time", "user_id", "users"}; //初始化 AB Testing SDK initInstance(ABGlobalConfig.builder().setApiUrl(url).setSensorsAnalytics(sa).build()); for (String s : customInvaild) { Experiment experiment = - sensorsABTest.fastFetchABTest(SensorsABParams.starter("a123", true, "str_experiment", "qwe") - .addCustomId(s, "eee") - .build()); + sensorsABTest.fastFetchABTest(SensorsABParams.starter("a123", true, "str_experiment", "qwe") + .addCustomId(s, "eee") + .build()); assertNotNull(experiment); assertEquals("a123", experiment.getDistinctId()); assertTrue(experiment.getIsLoginId()); @@ -104,19 +108,20 @@ public void checkFastFetchWithInvalidCustomIds01() throws InvalidArgumentExcepti @Test public void checkFastFetchWithInvalidCustomIds02() throws InvalidArgumentException { String[] customInvaild = {null, // key 为 null - "", // key 为空字符串 - "1122aaaa", // key 开头是数字 - "$1122aa", // key 包含字符 $ - "……%%", // key 包含特殊字符 - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", // key 为100个字符 - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1"}; // key 超过 100个字符 + "", // key 为空字符串 + "1122aaaa", // key 开头是数字 + "$1122aa", // key 包含字符 $ + "……%%", // key 包含特殊字符 + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + // key 为100个字符 + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1"}; // key 超过 100个字符 //初始化 AB Testing SDK initInstance(ABGlobalConfig.builder().setApiUrl(url).setSensorsAnalytics(sa).build()); for (String s : customInvaild) { Experiment experiment = - sensorsABTest.fastFetchABTest(SensorsABParams.starter("a123", true, "str_experiment", "qwe") - .addCustomId(s, "eee") - .build()); + sensorsABTest.fastFetchABTest(SensorsABParams.starter("a123", true, "str_experiment", "qwe") + .addCustomId(s, "eee") + .build()); assertNotNull(experiment); assertEquals("a123", experiment.getDistinctId()); assertTrue(experiment.getIsLoginId()); @@ -138,27 +143,27 @@ public void checkFastFetchWithInvalidCustomIds03() throws InvalidArgumentExcepti strInvalid.append(i); } String[] valueInvalid = {null, // value 为 null - "", // value 为空字符串 - strInvalid.toString(), // value 长度为 1024 - // value 长度大于 1024 - "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" - + "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" - + "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" - + "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" - + "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" - + "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" - + "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" - + "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" - + "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" - + "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" - + "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"}; + "", // value 为空字符串 + strInvalid.toString(), // value 长度为 1024 + // value 长度大于 1024 + "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" + + "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" + + "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" + + "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" + + "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" + + "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" + + "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" + + "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" + + "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" + + "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" + + "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"}; //初始化 AB Testing SDK initInstance(ABGlobalConfig.builder().setApiUrl(url).setSensorsAnalytics(sa).build()); for (String s : valueInvalid) { Experiment experiment = - sensorsABTest.fastFetchABTest(SensorsABParams.starter("a123", true, "str_experiment", "qwe") - .addCustomId("wee", s) - .build()); + sensorsABTest.fastFetchABTest(SensorsABParams.starter("a123", true, "str_experiment", "qwe") + .addCustomId("wee", s) + .build()); assertNotNull(experiment); assertEquals("a123", experiment.getDistinctId()); assertTrue(experiment.getIsLoginId()); @@ -177,9 +182,9 @@ public void checkFastFetchWithInvalidCustomIds04() throws InvalidArgumentExcepti //初始化 AB Testing SDK initInstance(ABGlobalConfig.builder().setApiUrl(url).setSensorsAnalytics(sa).build()); Experiment experiment = - sensorsABTest.fastFetchABTest(SensorsABParams.starter("a123", true, "str_experiment", "qwe") - .customIds(null) - .build()); + sensorsABTest.fastFetchABTest(SensorsABParams.starter("a123", true, "str_experiment", "qwe") + .customIds(null) + .build()); assertNotNull(experiment); assertEquals("a123", experiment.getDistinctId()); assertTrue(experiment.getIsLoginId()); @@ -196,16 +201,18 @@ public void checkFastFetchWithInvalidCustomIds04() throws InvalidArgumentExcepti @Test public void checkFastFetchWithInvalidCustomIds05() throws InvalidArgumentException { Map customIds = Maps.newHashMap(); - String[] customInvalid = {"date", "datetime", "distinct_id", "event", "events", "first_id", "id", "original_id", "properties", "second_id", "time", "user_id", "users"}; + String[] customInvalid = + {"date", "datetime", "distinct_id", "event", "events", "first_id", "id", "original_id", "properties", + "second_id", "time", "user_id", "users"}; //初始化 AB Testing SDK initInstance(ABGlobalConfig.builder().setApiUrl(url).setSensorsAnalytics(sa).build()); for (String s : customInvalid) { customIds.clear(); customIds.put(s, "eee"); Experiment experiment = - sensorsABTest.fastFetchABTest(SensorsABParams.starter("a123", true, "str_experiment", "qwe") - .customIds(customIds) - .build()); + sensorsABTest.fastFetchABTest(SensorsABParams.starter("a123", true, "str_experiment", "qwe") + .customIds(customIds) + .build()); assertNotNull(experiment); assertEquals("a123", experiment.getDistinctId()); assertTrue(experiment.getIsLoginId()); @@ -223,21 +230,22 @@ public void checkFastFetchWithInvalidCustomIds05() throws InvalidArgumentExcepti public void checkAsyncFetchWithInvalidCustomIds06() throws InvalidArgumentException { Map customIds = Maps.newHashMap(); String[] customInvalid = {null, // key 为 null - "", // key 为空字符串 - "1122aaaa", // key 开头是数字 - "$1122aa", // key 包含字符 $ - "……%%", // key 包含特殊字符 - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", // key 为100个字符 - "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1"}; // key 超过 100个字符 + "", // key 为空字符串 + "1122aaaa", // key 开头是数字 + "$1122aa", // key 包含字符 $ + "……%%", // key 包含特殊字符 + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + // key 为100个字符 + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1"}; // key 超过 100个字符 //初始化 AB Testing SDK initInstance(ABGlobalConfig.builder().setApiUrl(url).setSensorsAnalytics(sa).build()); for (String s : customInvalid) { customIds.clear(); customIds.put(s, "eee"); Experiment experiment = - sensorsABTest.fastFetchABTest(SensorsABParams.starter("a123", true, "str_experiment", "qwe") - .customIds(customIds) - .build()); + sensorsABTest.fastFetchABTest(SensorsABParams.starter("a123", true, "str_experiment", "qwe") + .customIds(customIds) + .build()); assertNotNull(experiment); assertEquals("a123", experiment.getDistinctId()); assertTrue(experiment.getIsLoginId()); @@ -259,29 +267,29 @@ public void checkAsyncFetchWithInvalidCustomIds07() throws InvalidArgumentExcept strInvalid.append(i); } String[] valueInvalid = {null, // value 为 null - "", // value 为空字符串 - strInvalid.toString(), // value 长度为 1024 - // value 长度大于 1024 - "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" - + "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" - + "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" - + "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" - + "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" - + "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" - + "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" - + "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" - + "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" - + "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" - + "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"}; + "", // value 为空字符串 + strInvalid.toString(), // value 长度为 1024 + // value 长度大于 1024 + "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" + + "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" + + "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" + + "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" + + "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" + + "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" + + "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" + + "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" + + "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" + + "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890" + + "a12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"}; //初始化 AB Testing SDK initInstance(ABGlobalConfig.builder().setApiUrl(url).setSensorsAnalytics(sa).build()); for (String s : valueInvalid) { customIds.clear(); customIds.put("customIds", s); Experiment experiment = - sensorsABTest.fastFetchABTest(SensorsABParams.starter("a123", true, "str_experiment", "qwe") - .customIds(customIds) - .build()); + sensorsABTest.fastFetchABTest(SensorsABParams.starter("a123", true, "str_experiment", "qwe") + .customIds(customIds) + .build()); assertNotNull(experiment); assertEquals("a123", experiment.getDistinctId()); assertTrue(experiment.getIsLoginId()); @@ -297,7 +305,8 @@ public void checkAsyncFetchWithInvalidCustomIds07() throws InvalidArgumentExcept * 期望:实验缓存的 key 为 "distinct_id + login_id + anonymous_id + customs_ids"+实验内容 */ @Test - public void checkFastFetchExperimentCatch() throws InvalidArgumentException, NoSuchFieldException, IllegalAccessException { + public void checkFastFetchExperimentCatch() + throws InvalidArgumentException, NoSuchFieldException, IllegalAccessException { Map customIds = Maps.newHashMap(); customIds.put("qwe", "qwe"); @@ -305,15 +314,15 @@ public void checkFastFetchExperimentCatch() throws InvalidArgumentException, NoS initInstance(ABGlobalConfig.builder().setApiUrl(url).setSensorsAnalytics(sa).build()); initInnerClassInfo(sensorsABTest); Experiment experiment = - sensorsABTest.fastFetchABTest(SensorsABParams.starter("a123", true, "int_experiment", -1) - .addCustomId("qwe", "qwe") - .build()); + sensorsABTest.fastFetchABTest(SensorsABParams.starter("a123", true, "int_experiment", -1) + .addCustomId("qwe", "qwe") + .build()); assertEquals("123", experiment.getResult().toString()); JsonNode str = experimentResultCacheByReflect.getIfPresent(generateCacheKey("a123", true, customIds)); - String expRes = "{\"status\":\"SUCCESS\",\"results\":[{\"abtest_experiment_id\":\"2\",\"abtest_experiment_group_id\":\"1\"," + - "\"is_control_group\":false,\"is_white_list\":false,\"experiment_type\":\"CODE\",\"variables\":[{\"name\":\"str_experiment\",\"type\":\"STRING\",\"value\":\"test\"},{\"name\":\"bool_experiment\",\"type\":\"BOOLEAN\",\"value\":\"false\"},{\"name\":\"int_experiment\",\"type\":\"INTEGER\",\"value\":\"123\"},{\"name\":\"json_experiment\",\"type\":\"JSON\",\"value\":\"{\\\"name\\\":\\\"hello\\\"}\"}]},{\"abtest_experiment_id\":\"14\",\"abtest_experiment_group_id\":\"1\",\"is_control_group\":false,\"is_white_list\":false,\"experiment_type\":\"CODE\",\"variables\":[{\"name\":\"int_abtest1\",\"type\":\"INTEGER\",\"value\":\"222\"}]}]}"; + String expRes = + "{\"status\":\"SUCCESS\",\"results\":[{\"abtest_experiment_id\":\"2\",\"abtest_experiment_group_id\":\"1\",\"is_control_group\":false,\"is_white_list\":false,\"experiment_type\":\"CODE\",\"variables\":[{\"name\":\"str_experiment\",\"type\":\"STRING\",\"value\":\"test\"},{\"name\":\"bool_experiment\",\"type\":\"BOOLEAN\",\"value\":\"false\"},{\"name\":\"int_experiment\",\"type\":\"INTEGER\",\"value\":\"123\"},{\"name\":\"json_experiment\",\"type\":\"JSON\",\"value\":\"{\\\"name\\\":\\\"hello\\\"}\"}]},{\"abtest_experiment_id\":\"14\",\"abtest_experiment_group_id\":\"1\",\"is_control_group\":false,\"is_white_list\":false,\"experiment_type\":\"CODE\",\"variables\":[{\"name\":\"int_abtest1\",\"type\":\"INTEGER\",\"value\":\"222\"}]},{\"abtest_experiment_id\":\"14\",\"abtest_experiment_group_id\":\"-1\",\"is_control_group\":false,\"is_white_list\":false,\"experiment_type\":\"CODE\",\"variables\":[{\"name\":\"test_group_id\",\"type\":\"JSON\",\"value\":\"{\\\"name\\\":\\\"helloWord\\\"}\"}]},{\"abtest_experiment_id\":\"14\",\"abtest_experiment_group_id\":\"2\",\"is_control_group\":false,\"is_white_list\":false,\"experiment_type\":\"CODE\",\"variables\":[{\"name\":\"test_group_id2\",\"type\":\"JSON\",\"value\":\"{\\\"name\\\":\\\"helloWord2\\\"}\"}]},{\"abtest_experiment_id\":\"14\",\"abtest_experiment_group_id\":\"3\",\"is_control_group\":false,\"is_white_list\":false,\"experiment_type\":\"CODE\",\"variables\":[{\"name\":\"test_group_id3\",\"type\":\"JSON\",\"value\":\"{\\\"name\\\":\\\"helloWord3\\\"}\"}]}]}"; assertNotNull(str); assertEquals(expRes, str.toString()); } @@ -324,7 +333,8 @@ public void checkFastFetchExperimentCatch() throws InvalidArgumentException, NoS * 会返回缓存的实验结果值 */ @Test - public void checkFastFetchExperimentCatch01() throws InvalidArgumentException, NoSuchFieldException, IllegalAccessException { + public void checkFastFetchExperimentCatch01() + throws InvalidArgumentException, NoSuchFieldException, IllegalAccessException { Map customIds = Maps.newHashMap(); customIds.put("qwe", "qwe"); @@ -333,9 +343,9 @@ public void checkFastFetchExperimentCatch01() throws InvalidArgumentException, N initInnerClassInfo(sensorsABTest); Experiment experiment = - sensorsABTest.fastFetchABTest(SensorsABParams.starter("a123", true, "int_experiment", -1) - .addCustomId("qwe", "qwe") - .build()); + sensorsABTest.fastFetchABTest(SensorsABParams.starter("a123", true, "int_experiment", -1) + .addCustomId("qwe", "qwe") + .build()); assertEquals("123", experiment.getResult().toString()); JsonNode str = experimentResultCacheByReflect.getIfPresent(generateCacheKey("a123", true, customIds)); @@ -343,8 +353,8 @@ public void checkFastFetchExperimentCatch01() throws InvalidArgumentException, N //TODO 现在是否请求网络需要人工检查日志,需要自动化 experiment = sensorsABTest.fastFetchABTest(SensorsABParams.starter("a123", true, "int_experiment", -1) - .addCustomId("qwe", "qwe") - .build()); + .addCustomId("qwe", "qwe") + .build()); assertEquals(123, experiment.getResult().intValue()); } @@ -354,7 +364,8 @@ public void checkFastFetchExperimentCatch01() throws InvalidArgumentException, N * 期望:本地事件缓存内容应该新增 customs_ids */ @Test - public void checkFastFetchEventCatch01() throws InvalidArgumentException, NoSuchFieldException, IllegalAccessException { + public void checkFastFetchEventCatch01() + throws InvalidArgumentException, NoSuchFieldException, IllegalAccessException { Map customIds = Maps.newHashMap(); customIds.put("qwe", "qwe"); @@ -363,17 +374,18 @@ public void checkFastFetchEventCatch01() throws InvalidArgumentException, NoSuch initInnerClassInfo(sensorsABTest); Experiment experiment = - sensorsABTest.fastFetchABTest(SensorsABParams.starter("a123", true, "int_experiment", -1) - .addCustomId("qwe", "qwe") - .build()); + sensorsABTest.fastFetchABTest(SensorsABParams.starter("a123", true, "int_experiment", -1) + .addCustomId("qwe", "qwe") + .build()); // 通过增加 customs_ids 生成的 key,去 get 事件缓存结果,如果不为空,则说明本地事件缓存内容新增了 customs_ids - Object res = eventCacheByReflect.getIfPresent(generateKey("a123", true, experiment.getAbTestExperimentId(), customIds)); + Object res = + eventCacheByReflect.getIfPresent(generateKey("a123", true, experiment.getAbTestExperimentId(), customIds)); assertNotNull(res); experiment = sensorsABTest.fastFetchABTest(SensorsABParams.starter("a123", true, "int_experiment", -1) - .addCustomId("qwe", "qwe") - .build()); + .addCustomId("qwe", "qwe") + .build()); assertEquals(123, experiment.getResult().intValue()); } @@ -386,7 +398,8 @@ public void checkFastFetchEventCatch01() throws InvalidArgumentException, NoSuch * 会返回实验结果值 */ @Test - public void checkFastFetchEventCatch02() throws InvalidArgumentException, NoSuchFieldException, IllegalAccessException { + public void checkFastFetchEventCatch02() + throws InvalidArgumentException, NoSuchFieldException, IllegalAccessException { Map customIds = Maps.newHashMap(); customIds.put("qwe", "qwe"); @@ -396,15 +409,15 @@ public void checkFastFetchEventCatch02() throws InvalidArgumentException, NoSuch initInnerClassInfo(sensorsABTest); Experiment experiment = - sensorsABTest.fastFetchABTest(SensorsABParams.starter("a123", true, "int_experiment", -1) - .addCustomId("qwe", "qwe") - .build()); + sensorsABTest.fastFetchABTest(SensorsABParams.starter("a123", true, "int_experiment", -1) + .addCustomId("qwe", "qwe") + .build()); assertEquals(123, experiment.getResult().intValue()); sa.flush(); experiment = sensorsABTest.fastFetchABTest(SensorsABParams.starter("a123", true, "int_experiment", -1) - .addCustomId("qwe", "qwe") - .build()); + .addCustomId("qwe", "qwe") + .build()); assertEquals(123, experiment.getResult().intValue()); assertEquals(0, messageBuffer.length()); @@ -427,16 +440,16 @@ public void checkFastFetchEvent() throws InvalidArgumentException, NoSuchFieldEx initInnerClassInfo(sensorsABTest); Experiment experiment = - sensorsABTest.fastFetchABTest(SensorsABParams.starter("a123", true, "int_experiment", -1) - .addCustomId("qwe", "qwe") - .build()); + sensorsABTest.fastFetchABTest(SensorsABParams.starter("a123", true, "int_experiment", -1) + .addCustomId("qwe", "qwe") + .build()); assertEquals(123, experiment.getResult().intValue()); sa.flush(); experiment = sensorsABTest.fastFetchABTest(SensorsABParams.starter("a123", true, "int_experiment", -1) - .addCustomId("customid2", "qwe") - .build()); + .addCustomId("customid2", "qwe") + .build()); //TODO 需要自动验证是否发送网络请求 assertEquals(123, experiment.getResult().intValue()); @@ -456,11 +469,11 @@ public void checkFastFetchWithProp() throws InvalidArgumentException { initSASDK(); initInstance(ABGlobalConfig.builder().setApiUrl(url).setSensorsAnalytics(sa).build()); Experiment experiment = - sensorsABTest.fastFetchABTest( - SensorsABParams.starter("a123", true, "str_experiment", "qwe") - .addCustomId("custom_id", "test11") - .addProperty("prop1", "value1") - .build()); + sensorsABTest.fastFetchABTest( + SensorsABParams.starter("a123", true, "str_experiment", "qwe") + .addCustomId("custom_id", "test11") + .addProperty("prop1", "value1") + .build()); assertNotNull(experiment); assertEquals("a123", experiment.getDistinctId()); assertTrue(experiment.getIsLoginId()); @@ -481,17 +494,17 @@ public void checkFastFetchEvent01() throws InvalidArgumentException, IOException initSASDK(); // 注册公共属性 Map superProp = new HashMap<>(); - superProp.put("custom_id1","id1"); - superProp.put("custom_id2","id2"); + superProp.put("custom_id1", "id1"); + superProp.put("custom_id2", "id2"); sa.registerSuperProperties(superProp); initInstance(ABGlobalConfig.builder().setApiUrl(url).setSensorsAnalytics(sa).build()); sensorsABTest.fastFetchABTest( - SensorsABParams.starter("a123", true, "str_experiment", "qwe") - .addCustomId("custom_id1", "id1") - .addCustomId("custom_id2", "id2") - .addProperty("prop1", "value1") - .build()); + SensorsABParams.starter("a123", true, "str_experiment", "qwe") + .addCustomId("custom_id1", "id1") + .addCustomId("custom_id2", "id2") + .addProperty("prop1", "value1") + .build()); assertNotEquals(0, messageBuffer.length()); JsonNode jsonNode = SensorsAnalyticsUtil.getJsonObjectMapper().readValue(messageBuffer.toString(), JsonNode.class); @@ -513,10 +526,9 @@ public void checkFastFetchEvent02() throws InvalidArgumentException, IOException initInstance(ABGlobalConfig.builder().setApiUrl(url).setSensorsAnalytics(sa).build()); sensorsABTest.fastFetchABTest( - SensorsABParams.starter("a123", true, "str_experiment", "qwe") - .addCustomId("custom_id1", "id1") - .addProperty("prop1", "value1") - .build()); + SensorsABParams.starter("a123", true, "str_experiment", "qwe") + .addProperty("prop1", "value1") + .build()); assertNotEquals(0, messageBuffer.length()); JsonNode jsonNode = SensorsAnalyticsUtil.getJsonObjectMapper().readValue(messageBuffer.toString(), JsonNode.class); @@ -530,13 +542,14 @@ public void checkFastFetchEvent02() throws InvalidArgumentException, IOException @Test @Ignore public void checkFastFetchOldEnv() throws InvalidArgumentException { - String apiUrl = "http://10.130.6.5:8202/api/v2/abtest/online/results?project-key=438B9364C98D54371751BA82F6484A1A03A5155E"; + String apiUrl = + "http://10.130.6.5:8202/api/v2/abtest/online/results?project-key=438B9364C98D54371751BA82F6484A1A03A5155E"; //初始化 AB Testing SDK initInstance(ABGlobalConfig.builder().setApiUrl(apiUrl).setSensorsAnalytics(sa).build()); Experiment experiment = - sensorsABTest.fastFetchABTest(SensorsABParams.starter("a123", true, "agc", -1) - .addCustomId("custom_id", "123") - .build()); + sensorsABTest.fastFetchABTest(SensorsABParams.starter("a123", true, "agc", -1) + .addCustomId("custom_id", "123") + .build()); assertNotNull(experiment); assertEquals("a123", experiment.getDistinctId()); assertTrue(experiment.getIsLoginId()); @@ -552,7 +565,7 @@ public void checkFastFetchUpdate() throws InvalidArgumentException { //初始化 AB Testing SDK initInstance(ABGlobalConfig.builder().setApiUrl(url).setSensorsAnalytics(sa).build()); Experiment experiment = - sensorsABTest.fastFetchABTest("a123", true, "str_experiment", "grey"); + sensorsABTest.fastFetchABTest("a123", true, "str_experiment", "grey"); assertNotNull(experiment); assertEquals("a123", experiment.getDistinctId()); @@ -562,10 +575,49 @@ public void checkFastFetchUpdate() throws InvalidArgumentException { assertEquals("1", experiment.getAbTestExperimentGroupId()); sensorsABTest.fastFetchABTest( - SensorsABParams.starter("a123", true, "str_experiment", "qwe") - .addCustomId("custom_id", "test11") - .build()); + SensorsABParams.starter("a123", true, "str_experiment", "qwe") + .addCustomId("custom_id", "test11") + .build()); //TODO 自动化校验请求 } + /** + * fastFetchABTest 请求,携带一个正确的 customIds + * 期望:properties 字段中存在 custom_id + */ + @Test + @Ignore + public void checkFastFetchWithCustomIds2() + throws InvalidArgumentException, NoSuchFieldException, IllegalAccessException, IOException { + //初始化 AB Testing SDK + initSASDK(); + initInstance(ABGlobalConfig.builder().setApiUrl(url).setSensorsAnalytics(sa).build()); + initInnerClassInfo(sensorsABTest); + HashMap customIdMap = new HashMap<>(); + customIdMap.put("custom_id", "test11"); + Experiment result = + sensorsABTest.fastFetchABTest( + SensorsABParams.starter("a123", false, "test_group_id2", "{\"color\":\"grey\"}").customIds( + customIdMap).build()); + initInnerClassInfo(sensorsABTest); + + // 检查试验结果 + assertEquals("a123", result.getDistinctId()); + assertEquals(false, result.getIsLoginId()); + assertEquals("2", result.getAbTestExperimentGroupId()); + + // 检查事件缓存 + assertEquals(1, eventCacheByReflect.size()); + + if (messageBuffer != null) { + assertNotEquals(0, messageBuffer.length()); + JsonNode jsonNode = + SensorsAnalyticsUtil.getJsonObjectMapper().readValue(messageBuffer.toString(), JsonNode.class); + assertEquals("\"$ABTestTrigger\"", jsonNode.get("event").toString()); + // 验证属性中是否包含 custom_id + assertEquals("\"test11\"", jsonNode.get("properties").get("custom_id").toString()); + } + assertNotNull(result.getResult()); + } + } diff --git a/src/test/java/com/sensorsdata/analytics/javasdk/FastFetchRegressionTest.java b/src/test/java/com/sensorsdata/analytics/javasdk/FastFetchRegressionTest.java index 006efa2..0ed9dec 100644 --- a/src/test/java/com/sensorsdata/analytics/javasdk/FastFetchRegressionTest.java +++ b/src/test/java/com/sensorsdata/analytics/javasdk/FastFetchRegressionTest.java @@ -301,4 +301,5 @@ public void checkFastFetchWithCustomIds() throws InvalidArgumentException { assertEquals("2", experiment.getAbTestExperimentId()); assertEquals("1", experiment.getAbTestExperimentGroupId()); } + } diff --git a/src/test/java/com/sensorsdata/analytics/javasdk/TestServlet.java b/src/test/java/com/sensorsdata/analytics/javasdk/TestServlet.java index efa3183..c9a4f80 100644 --- a/src/test/java/com/sensorsdata/analytics/javasdk/TestServlet.java +++ b/src/test/java/com/sensorsdata/analytics/javasdk/TestServlet.java @@ -65,6 +65,48 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response) + " \"value\": \"222\"" + " }" + " ]" + + " }," + + " {" + + " \"abtest_experiment_id\": \"14\"," + + " \"abtest_experiment_group_id\": \"-1\"," + + " \"is_control_group\": false," + + " \"is_white_list\": false," + + " \"experiment_type\": \"CODE\"," + + " \"variables\": [" + + " {" + + " \"name\": \"test_group_id\"," + + " \"type\": \"JSON\"," + + " \"value\": \"{\\\"name\\\":\\\"helloWord\\\"}\"" + + " }" + + " ]" + + " }," + + " {" + + " \"abtest_experiment_id\": \"14\"," + + " \"abtest_experiment_group_id\": \"2\"," + + " \"is_control_group\": false," + + " \"is_white_list\": false," + + " \"experiment_type\": \"CODE\"," + + " \"variables\": [" + + " {" + + " \"name\": \"test_group_id2\"," + + " \"type\": \"JSON\"," + + " \"value\": \"{\\\"name\\\":\\\"helloWord2\\\"}\"" + + " }" + + " ]" + + " }," + + " {" + + " \"abtest_experiment_id\": \"14\"," + + " \"abtest_experiment_group_id\": \"3\"," + + " \"is_control_group\": false," + + " \"is_white_list\": false," + + " \"experiment_type\": \"CODE\"," + + " \"variables\": [" + + " {" + + " \"name\": \"test_group_id3\"," + + " \"type\": \"JSON\"," + + " \"value\": \"{\\\"name\\\":\\\"helloWord3\\\"}\"" + + " }" + + " ]" + " }" + " ]" + "}";