Skip to content

Commit e6c5a70

Browse files
authored
Merge pull request #104 from IABTechLab/aul-UID2-4666-batch-e2e-for-identity-map
Batch email test for identity map
2 parents f0206b2 + b4b6378 commit e6c5a70

File tree

2 files changed

+80
-4
lines changed

2 files changed

+80
-4
lines changed

src/test/java/suite/operator/TestData.java

Lines changed: 55 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,20 @@
33
import app.AppsMap;
44
import app.component.App;
55
import app.component.Operator;
6+
import com.fasterxml.jackson.core.JsonProcessingException;
7+
import com.fasterxml.jackson.databind.ObjectMapper;
68
import com.uid2.client.DecryptionStatus;
79
import org.junit.jupiter.params.provider.Arguments;
810

9-
import java.util.HashSet;
10-
import java.util.List;
11-
import java.util.Optional;
12-
import java.util.Set;
11+
import java.util.*;
1312
import java.util.stream.Collectors;
1413
import java.util.stream.Stream;
1514

1615
import static org.junit.jupiter.api.Named.named;
1716

1817
public final class TestData {
1918
public static final int RAW_UID2_LENGTH = 44;
19+
private static final Random RANDOM = new Random();
2020

2121
private TestData() {
2222
}
@@ -326,6 +326,57 @@ public static Set<Arguments> identityMapBatchEmailArgs() {
326326
return args;
327327
}
328328

329+
public static Set<Arguments> identityMapBigBatchArgs() throws JsonProcessingException {
330+
ObjectMapper mapper = new ObjectMapper();
331+
Set<Operator> operators = AppsMap.getApps(Operator.class);
332+
333+
List<String> emails = new ArrayList<>();
334+
List<String> phones = new ArrayList<>();
335+
List<String> emailHashes = new ArrayList<>();
336+
List<String> phoneHashes = new ArrayList<>();
337+
for (int i = 0; i < 10_000; i++) {
338+
emails.add(randomEmail());
339+
phones.add(randomPhoneNumber());
340+
emailHashes.add(randomHash());
341+
phoneHashes.add(randomHash());
342+
}
343+
344+
var emailsPayload = identityMapPayload(mapper, "email", emails);
345+
var phonesPayload = identityMapPayload(mapper, "phone", phones);
346+
var emailHashesPayload = identityMapPayload(mapper, "email_hash", emailHashes);
347+
var phoneHashesPayload = identityMapPayload(mapper, "phone_hash", phoneHashes);
348+
349+
Set<Arguments> args = new HashSet<>();
350+
for (Operator operator : operators) {
351+
args.add(Arguments.of("10k emails", operator, operator.getName(), emailsPayload, emails));
352+
args.add(Arguments.of("10k phones", operator, operator.getName(), phonesPayload, phones));
353+
args.add(Arguments.of("10k email hashes", operator, operator.getName(), emailHashesPayload, emailHashes));
354+
args.add(Arguments.of("10k phone hashes", operator, operator.getName(), phoneHashesPayload, phoneHashes));
355+
}
356+
return args;
357+
}
358+
359+
private static String identityMapPayload(ObjectMapper mapper, String field, List<String> diis) throws JsonProcessingException {
360+
var json = mapper.createObjectNode().putPOJO(field, diis).put("policy", 1);
361+
return mapper.writeValueAsString(json);
362+
}
363+
364+
private static String randomEmail() {
365+
return "email_" + Math.abs(RANDOM.nextLong()) + "@example.com";
366+
}
367+
368+
private static String randomPhoneNumber() {
369+
// Phone numbers with 15 digits are technically valid but are not used in any country
370+
return "+" + String.format("%015d", Math.abs(RANDOM.nextLong() % 1_000_000_000_000_000L));
371+
}
372+
373+
private static String randomHash() {
374+
// This isn't really a hashed DII but looks like one ot UID2
375+
byte[] randomBytes = new byte[32];
376+
RANDOM.nextBytes(randomBytes);
377+
return Base64.getEncoder().encodeToString(randomBytes);
378+
}
379+
329380
public static Set<Arguments> identityMapBatchEmailArgsBadPolicy() {
330381
Set<Operator> operators = getPublicOperators();
331382
Set<List<String>> inputs = Set.of(

src/test/java/suite/operator/V2ApiOperatorTest.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010
import org.junit.jupiter.params.ParameterizedTest;
1111
import org.junit.jupiter.params.provider.MethodSource;
1212

13+
import java.time.Duration;
14+
import java.util.List;
15+
1316
import static org.assertj.core.api.Assertions.assertThat;
1417
import static org.junit.jupiter.api.Assertions.*;
1518

@@ -105,6 +108,28 @@ public void testV2IdentityMap(String label, Operator operator, String operatorNa
105108
assertThat(response.at("/status").asText()).isEqualTo("success");
106109
}
107110

111+
@ParameterizedTest(name = "/v2/identity/map - {0} - {2}")
112+
@MethodSource({
113+
"suite.operator.TestData#identityMapBigBatchArgs"
114+
})
115+
public void testV2IdentityMapLargeBatch(String label, Operator operator, String operatorName, String payload, List<String> diis) {
116+
assertTimeoutPreemptively(Duration.ofSeconds(5), () -> { // Validate we didn't make mapping too slow.
117+
JsonNode response = operator.v2IdentityMap(payload);
118+
119+
assertThat(response.at("/status").asText()).isEqualTo("success");
120+
121+
var mapped = response.at("/body/mapped");
122+
assertThat(mapped.size()).isEqualTo(10_000);
123+
124+
for (int i = 0; i < 10_000; i++) {
125+
assertThat(mapped.get(i).get("identifier").asText()).isEqualTo(diis.get(i));
126+
assertThat(mapped.get(i).get("advertising_id").asText()).isNotNull().isNotEmpty();
127+
assertThat(mapped.get(i).get("bucket_id").asText()).isNotNull().isNotEmpty();
128+
}
129+
});
130+
}
131+
132+
108133
@ParameterizedTest(name = "/v2/identity/map - VALIDATE EMAIL - {0} - {2}")
109134
@MethodSource({
110135
"suite.operator.TestData#tokenValidateEmailArgs",

0 commit comments

Comments
 (0)