|
56 | 56 | public class IntegrationHelper { |
57 | 57 | public static final int NEVER_REFRESH_RATE = 999999; |
58 | 58 |
|
| 59 | + // Base64-encoded split definition payload for "mauro_java" split |
| 60 | + public static final String SPLIT_UPDATE_PAYLOAD_TYPE0 = "eyJ0cmFmZmljVHlwZU5hbWUiOiJ1c2VyIiwiaWQiOiJkNDMxY2RkMC1iMGJlLTExZWEtOGE4MC0xNjYwYWRhOWNlMzkiLCJuYW1lIjoibWF1cm9famF2YSIsInRyYWZmaWNBbGxvY2F0aW9uIjoxMDAsInRyYWZmaWNBbGxvY2F0aW9uU2VlZCI6LTkyMzkxNDkxLCJzZWVkIjotMTc2OTM3NzYwNCwic3RhdHVzIjoiQUNUSVZFIiwia2lsbGVkIjpmYWxzZSwiZGVmYXVsdFRyZWF0bWVudCI6Im9mZiIsImNoYW5nZU51bWJlciI6MTY4NDMyOTg1NDM4NSwiYWxnbyI6MiwiY29uZmlndXJhdGlvbnMiOnt9LCJjb25kaXRpb25zIjpbeyJjb25kaXRpb25UeXBlIjoiV0hJVEVMSVNUIiwibWF0Y2hlckdyb3VwIjp7ImNvbWJpbmVyIjoiQU5EIiwibWF0Y2hlcnMiOlt7Im1hdGNoZXJUeXBlIjoiV0hJVEVMSVNUIiwibmVnYXRlIjpmYWxzZSwid2hpdGVsaXN0TWF0Y2hlckRhdGEiOnsid2hpdGVsaXN0IjpbImFkbWluIiwibWF1cm8iLCJuaWNvIl19fV19LCJwYXJ0aXRpb25zIjpbeyJ0cmVhdG1lbnQiOiJvZmYiLCJzaXplIjoxMDB9XSwibGFiZWwiOiJ3aGl0ZWxpc3RlZCJ9LHsiY29uZGl0aW9uVHlwZSI6IlJPTExPVVQiLCJtYXRjaGVyR3JvdXAiOnsiY29tYmluZXIiOiJBTkQiLCJtYXRjaGVycyI6W3sia2V5U2VsZWN0b3IiOnsidHJhZmZpY1R5cGUiOiJ1c2VyIn0sIm1hdGNoZXJUeXBlIjoiSU5fU0VHTUVOVCIsIm5lZ2F0ZSI6ZmFsc2UsInVzZXJEZWZpbmVkU2VnbWVudE1hdGNoZXJEYXRhIjp7InNlZ21lbnROYW1lIjoibWF1ci0yIn19XX0sInBhcnRpdGlvbnMiOlt7InRyZWF0bWVudCI6Im9uIiwic2l6ZSI6MH0seyJ0cmVhdG1lbnQiOiJvZmYiLCJzaXplIjoxMDB9LHsidHJlYXRtZW50IjoiVjQiLCJzaXplIjowfSx7InRyZWF0bWVudCI6InY1Iiwic2l6ZSI6MH1dLCJsYWJlbCI6ImluIHNlZ21lbnQgbWF1ci0yIn0seyJjb25kaXRpb25UeXBlIjoiUk9MTE9VVCIsIm1hdGNoZXJHcm91cCI6eyJjb21iaW5lciI6IkFORCIsIm1hdGNoZXJzIjpbeyJrZXlTZWxlY3RvciI6eyJ0cmFmZmljVHlwZSI6InVzZXIifSwibWF0Y2hlclR5cGUiOiJBTExfS0VZUyIsIm5lZ2F0ZSI6ZmFsc2V9XX0sInBhcnRpdGlvbnMiOlt7InRyZWF0bWVudCI6Im9uIiwic2l6ZSI6MH0seyJ0cmVhdG1lbnQiOiJvZmYiLCJzaXplIjoxMDB9LHsidHJlYXRtZW50IjoiVjQiLCJzaXplIjowfSx7InRyZWF0bWVudCI6InY1Iiwic2l6ZSI6MH1dLCJsYWJlbCI6ImRlZmF1bHQgcnVsZSJ9XX0="; |
| 61 | + |
| 62 | + // Base64-encoded RBS definition payload for "rbs_test" segment |
| 63 | + public static final String RBS_UPDATE_PAYLOAD_TYPE0 = "eyJuYW1lIjoicmJzX3Rlc3QiLCJzdGF0dXMiOiJBQ1RJVkUiLCJ0cmFmZmljVHlwZU5hbWUiOiJ1c2VyIiwiZXhjbHVkZWQiOnsia2V5cyI6W10sInNlZ21lbnRzIjpbXX0sImNvbmRpdGlvbnMiOlt7Im1hdGNoZXJHcm91cCI6eyJjb21iaW5lciI6IkFORCIsIm1hdGNoZXJzIjpbeyJrZXlTZWxlY3RvciI6eyJ0cmFmZmljVHlwZSI6InVzZXIifSwibWF0Y2hlclR5cGUiOiJBTExfS0VZUyIsIm5lZ2F0ZSI6ZmFsc2V9XX19XX0="; |
| 64 | + |
59 | 65 | private final static Type EVENT_LIST_TYPE = new TypeToken<List<Event>>() { |
60 | 66 | }.getType(); |
61 | 67 | private final static Type IMPRESSIONS_LIST_TYPE = new TypeToken<List<TestImpressions>>() { |
@@ -188,6 +194,68 @@ public static String dummySingleSegment(String segment) { |
188 | 194 | return "{\"ms\":{\"k\":[{\"n\":\"" + segment + "\"}],\"cn\":null},\"ls\":{\"k\":[],\"cn\":1702507130121}}"; |
189 | 195 | } |
190 | 196 |
|
| 197 | + /** |
| 198 | + * Builds a memberships response with custom segments and change number. |
| 199 | + * @param segments Array of segment names for my segments |
| 200 | + * @param msCn Change number for my segments (null if not needed) |
| 201 | + * @param largeSegments Array of segment names for large segments |
| 202 | + * @param lsCn Change number for large segments |
| 203 | + */ |
| 204 | + public static String membershipsResponse(String[] segments, Long msCn, String[] largeSegments, Long lsCn) { |
| 205 | + StringBuilder msSegments = new StringBuilder(); |
| 206 | + for (int i = 0; i < segments.length; i++) { |
| 207 | + if (i > 0) msSegments.append(","); |
| 208 | + msSegments.append("{\"n\":\"").append(segments[i]).append("\"}"); |
| 209 | + } |
| 210 | + |
| 211 | + StringBuilder lsSegments = new StringBuilder(); |
| 212 | + for (int i = 0; i < largeSegments.length; i++) { |
| 213 | + if (i > 0) lsSegments.append(","); |
| 214 | + lsSegments.append("{\"n\":\"").append(largeSegments[i]).append("\"}"); |
| 215 | + } |
| 216 | + |
| 217 | + return String.format("{\"ms\":{\"k\":[%s],\"cn\":%s},\"ls\":{\"k\":[%s],\"cn\":%d}}", |
| 218 | + msSegments, msCn, lsSegments, lsCn); |
| 219 | + } |
| 220 | + |
| 221 | + /** |
| 222 | + * Simplified memberships response with only my segments. |
| 223 | + */ |
| 224 | + public static String membershipsResponse(String[] segments, long cn) { |
| 225 | + return membershipsResponse(segments, cn, new String[]{}, cn); |
| 226 | + } |
| 227 | + |
| 228 | + /** |
| 229 | + * Builds a targeting rules changes response with a simple flag. |
| 230 | + */ |
| 231 | + public static String targetingRulesChangesWithFlag(String flagName, long till) { |
| 232 | + return String.format("{\"ff\":{\"s\":%d,\"t\":%d,\"d\":[" + |
| 233 | + "{\"trafficTypeName\":\"user\",\"name\":\"%s\",\"status\":\"ACTIVE\"," + |
| 234 | + "\"killed\":false,\"defaultTreatment\":\"off\",\"changeNumber\":%d," + |
| 235 | + "\"conditions\":[{\"conditionType\":\"ROLLOUT\",\"matcherGroup\":{\"combiner\":\"AND\"," + |
| 236 | + "\"matchers\":[{\"keySelector\":{\"trafficType\":\"user\"},\"matcherType\":\"ALL_KEYS\",\"negate\":false}]}," + |
| 237 | + "\"partitions\":[{\"treatment\":\"on\",\"size\":100}]}]}" + |
| 238 | + "]},\"rbs\":{\"s\":%d,\"t\":%d,\"d\":[]}}", till, till, flagName, till, till, till); |
| 239 | + } |
| 240 | + |
| 241 | + /** |
| 242 | + * Builds a targeting rules changes response with both a flag and an RBS. |
| 243 | + */ |
| 244 | + public static String targetingRulesChangesWithFlagAndRbs(String flagName, String rbsName, long till) { |
| 245 | + return String.format("{\"ff\":{\"s\":%d,\"t\":%d,\"d\":[" + |
| 246 | + "{\"trafficTypeName\":\"user\",\"name\":\"%s\",\"status\":\"ACTIVE\"," + |
| 247 | + "\"killed\":false,\"defaultTreatment\":\"off\",\"changeNumber\":%d," + |
| 248 | + "\"conditions\":[{\"conditionType\":\"ROLLOUT\",\"matcherGroup\":{\"combiner\":\"AND\"," + |
| 249 | + "\"matchers\":[{\"keySelector\":{\"trafficType\":\"user\"},\"matcherType\":\"ALL_KEYS\",\"negate\":false}]}," + |
| 250 | + "\"partitions\":[{\"treatment\":\"on\",\"size\":100}]}]}" + |
| 251 | + "]},\"rbs\":{\"s\":%d,\"t\":%d,\"d\":[" + |
| 252 | + "{\"name\":\"%s\",\"status\":\"ACTIVE\",\"trafficTypeName\":\"user\"," + |
| 253 | + "\"excluded\":{\"keys\":[],\"segments\":[]}," + |
| 254 | + "\"conditions\":[{\"matcherGroup\":{\"combiner\":\"AND\"," + |
| 255 | + "\"matchers\":[{\"keySelector\":{\"trafficType\":\"user\"},\"matcherType\":\"ALL_KEYS\",\"negate\":false}]}}]}" + |
| 256 | + "]}}", till, till, flagName, till, till, till, rbsName); |
| 257 | + } |
| 258 | + |
191 | 259 | public static String dummyApiKey() { |
192 | 260 | return "99049fd8653247c5ea42bc3c1ae2c6a42bc3"; |
193 | 261 | } |
@@ -303,10 +371,7 @@ public static String splitChangeV2CompressionType1() { |
303 | 371 | } |
304 | 372 |
|
305 | 373 | public static String splitChangeV2CompressionType0() { |
306 | | - return splitChangeV2("9999999999999", |
307 | | - "1000", |
308 | | - "0", |
309 | | - "eyJ0cmFmZmljVHlwZU5hbWUiOiJ1c2VyIiwiaWQiOiJkNDMxY2RkMC1iMGJlLTExZWEtOGE4MC0xNjYwYWRhOWNlMzkiLCJuYW1lIjoibWF1cm9famF2YSIsInRyYWZmaWNBbGxvY2F0aW9uIjoxMDAsInRyYWZmaWNBbGxvY2F0aW9uU2VlZCI6LTkyMzkxNDkxLCJzZWVkIjotMTc2OTM3NzYwNCwic3RhdHVzIjoiQUNUSVZFIiwia2lsbGVkIjpmYWxzZSwiZGVmYXVsdFRyZWF0bWVudCI6Im9mZiIsImNoYW5nZU51bWJlciI6MTY4NDMyOTg1NDM4NSwiYWxnbyI6MiwiY29uZmlndXJhdGlvbnMiOnt9LCJjb25kaXRpb25zIjpbeyJjb25kaXRpb25UeXBlIjoiV0hJVEVMSVNUIiwibWF0Y2hlckdyb3VwIjp7ImNvbWJpbmVyIjoiQU5EIiwibWF0Y2hlcnMiOlt7Im1hdGNoZXJUeXBlIjoiV0hJVEVMSVNUIiwibmVnYXRlIjpmYWxzZSwid2hpdGVsaXN0TWF0Y2hlckRhdGEiOnsid2hpdGVsaXN0IjpbImFkbWluIiwibWF1cm8iLCJuaWNvIl19fV19LCJwYXJ0aXRpb25zIjpbeyJ0cmVhdG1lbnQiOiJvZmYiLCJzaXplIjoxMDB9XSwibGFiZWwiOiJ3aGl0ZWxpc3RlZCJ9LHsiY29uZGl0aW9uVHlwZSI6IlJPTExPVVQiLCJtYXRjaGVyR3JvdXAiOnsiY29tYmluZXIiOiJBTkQiLCJtYXRjaGVycyI6W3sia2V5U2VsZWN0b3IiOnsidHJhZmZpY1R5cGUiOiJ1c2VyIn0sIm1hdGNoZXJUeXBlIjoiSU5fU0VHTUVOVCIsIm5lZ2F0ZSI6ZmFsc2UsInVzZXJEZWZpbmVkU2VnbWVudE1hdGNoZXJEYXRhIjp7InNlZ21lbnROYW1lIjoibWF1ci0yIn19XX0sInBhcnRpdGlvbnMiOlt7InRyZWF0bWVudCI6Im9uIiwic2l6ZSI6MH0seyJ0cmVhdG1lbnQiOiJvZmYiLCJzaXplIjoxMDB9LHsidHJlYXRtZW50IjoiVjQiLCJzaXplIjowfSx7InRyZWF0bWVudCI6InY1Iiwic2l6ZSI6MH1dLCJsYWJlbCI6ImluIHNlZ21lbnQgbWF1ci0yIn0seyJjb25kaXRpb25UeXBlIjoiUk9MTE9VVCIsIm1hdGNoZXJHcm91cCI6eyJjb21iaW5lciI6IkFORCIsIm1hdGNoZXJzIjpbeyJrZXlTZWxlY3RvciI6eyJ0cmFmZmljVHlwZSI6InVzZXIifSwibWF0Y2hlclR5cGUiOiJBTExfS0VZUyIsIm5lZ2F0ZSI6ZmFsc2V9XX0sInBhcnRpdGlvbnMiOlt7InRyZWF0bWVudCI6Im9uIiwic2l6ZSI6MH0seyJ0cmVhdG1lbnQiOiJvZmYiLCJzaXplIjoxMDB9LHsidHJlYXRtZW50IjoiVjQiLCJzaXplIjowfSx7InRyZWF0bWVudCI6InY1Iiwic2l6ZSI6MH1dLCJsYWJlbCI6ImRlZmF1bHQgcnVsZSJ9XX0="); |
| 374 | + return splitChangeV2("9999999999999", "1000", "0", SPLIT_UPDATE_PAYLOAD_TYPE0); |
310 | 375 | } |
311 | 376 |
|
312 | 377 | public static String splitChangeV2(String changeNumber, String previousChangeNumber, String compressionType, String compressedPayload) { |
@@ -506,4 +571,46 @@ public static class ServicePath { |
506 | 571 | public static final String IMPRESSIONS = "testImpressions/bulk"; |
507 | 572 | public static final String AUTH = "v2/auth"; |
508 | 573 | } |
| 574 | + |
| 575 | + /** |
| 576 | + * Creates a simple split entity JSON body for database population. |
| 577 | + */ |
| 578 | + public static String splitEntityBody(String name, long changeNumber) { |
| 579 | + return String.format("{\"name\":\"%s\", \"changeNumber\": %d}", name, changeNumber); |
| 580 | + } |
| 581 | + |
| 582 | + /** |
| 583 | + * Creates a segment list JSON for database population (my segments format). |
| 584 | + * @param segments Array of segment names |
| 585 | + */ |
| 586 | + public static String segmentListJson(String... segments) { |
| 587 | + StringBuilder sb = new StringBuilder("{\"k\":["); |
| 588 | + for (int i = 0; i < segments.length; i++) { |
| 589 | + if (i > 0) sb.append(","); |
| 590 | + sb.append("{\"n\":\"").append(segments[i]).append("\"}"); |
| 591 | + } |
| 592 | + sb.append("],\"cn\":null}"); |
| 593 | + return sb.toString(); |
| 594 | + } |
| 595 | + |
| 596 | + public static String membershipKeyListUpdate(java.math.BigInteger hashedKey, String segmentName, long changeNumber) { |
| 597 | + String keyListJson = "{\"a\":[" + hashedKey.toString() + "],\"r\":[]}"; |
| 598 | + String encodedKeyList = Base64.encodeToString( |
| 599 | + keyListJson.getBytes(java.nio.charset.StandardCharsets.UTF_8), |
| 600 | + Base64.NO_WRAP); |
| 601 | + |
| 602 | + String notificationJson = "{" + |
| 603 | + "\\\"type\\\":\\\"MEMBERSHIPS_MS_UPDATE\\\"," + |
| 604 | + "\\\"cn\\\":" + changeNumber + "," + |
| 605 | + "\\\"n\\\":[\\\"" + segmentName + "\\\"]," + |
| 606 | + "\\\"c\\\":0," + |
| 607 | + "\\\"u\\\":2," + |
| 608 | + "\\\"d\\\":\\\"" + encodedKeyList + "\\\"" + |
| 609 | + "}"; |
| 610 | + |
| 611 | + return "id: 1\n" + |
| 612 | + "event: message\n" + |
| 613 | + "data: {\"id\":\"m1\",\"clientId\":\"pri:test\",\"timestamp\":" + System.currentTimeMillis() + |
| 614 | + ",\"encoding\":\"json\",\"channel\":\"test_channel\",\"data\":\"" + notificationJson + "\"}\n"; |
| 615 | + } |
509 | 616 | } |
0 commit comments