Skip to content

Commit f78e064

Browse files
Test trace ID and instance ID, refactor headers in tests
1 parent 693175f commit f78e064

File tree

1 file changed

+61
-46
lines changed

1 file changed

+61
-46
lines changed

src/test/java/com/uid2/operator/UIDOperatorVerticleTest.java

Lines changed: 61 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import com.uid2.operator.vertx.OperatorShutdownHandler;
1717
import com.uid2.operator.vertx.UIDOperatorVerticle;
1818
import com.uid2.shared.Utils;
19+
import com.uid2.shared.audit.Audit;
1920
import com.uid2.shared.audit.UidInstanceIdProvider;
2021
import com.uid2.shared.auth.ClientKey;
2122
import com.uid2.shared.auth.Keyset;
@@ -45,6 +46,7 @@
4546
import io.vertx.ext.web.client.WebClient;
4647
import io.vertx.junit5.VertxExtension;
4748
import io.vertx.junit5.VertxTestContext;
49+
import org.checkerframework.checker.units.qual.C;
4850
import org.junit.jupiter.api.*;
4951
import org.junit.jupiter.api.extension.ExtendWith;
5052
import org.junit.jupiter.params.ParameterizedTest;
@@ -243,6 +245,10 @@ private String getUrlForEndpoint(String endpoint) {
243245
}
244246

245247
private void send(String apiVersion, Vertx vertx, String endpoint, boolean isV1Get, String v1GetParam, JsonObject postPayload, int expectedHttpCode, Handler<JsonObject> handler) {
248+
send(apiVersion, vertx, endpoint, isV1Get, v1GetParam, postPayload, expectedHttpCode, handler, Collections.emptyMap());
249+
}
250+
251+
private void send(String apiVersion, Vertx vertx, String endpoint, boolean isV1Get, String v1GetParam, JsonObject postPayload, int expectedHttpCode, Handler<JsonObject> handler, Map<String, String> additionalHeaders) {
246252
if (apiVersion.equals("v2")) {
247253
ClientKey ck = (ClientKey) clientKeyProvider.get("");
248254

@@ -262,19 +268,19 @@ private void send(String apiVersion, Vertx vertx, String endpoint, boolean isV1G
262268
} else {
263269
handler.handle(tryParseResponse(ar.result()));
264270
}
265-
});
271+
}, additionalHeaders);
266272
} else if (isV1Get) {
267273
get(vertx, endpoint + (v1GetParam != null ? "?" + v1GetParam : ""), ar -> {
268274
assertTrue(ar.succeeded());
269275
assertEquals(expectedHttpCode, ar.result().statusCode());
270276
handler.handle(tryParseResponse(ar.result()));
271-
});
277+
}, additionalHeaders);
272278
} else {
273279
post(vertx, endpoint, postPayload, ar -> {
274280
assertTrue(ar.succeeded());
275281
assertEquals(expectedHttpCode, ar.result().statusCode());
276282
handler.handle(tryParseResponse(ar.result()));
277-
});
283+
}, additionalHeaders);
278284
}
279285
}
280286

@@ -289,10 +295,10 @@ protected void sendTokenGenerate(String apiVersion, Vertx vertx, String v1GetPar
289295
}
290296

291297
private void sendTokenGenerate(String apiVersion, Vertx vertx, String v1GetParam, JsonObject v2PostPayload, int expectedHttpCode, String referer, Handler<JsonObject> handler, boolean additionalParams) {
292-
sendTokenGenerate(apiVersion, vertx, v1GetParam, v2PostPayload, expectedHttpCode, referer, handler, additionalParams, null, null);
298+
sendTokenGenerate(apiVersion, vertx, v1GetParam, v2PostPayload, expectedHttpCode, referer, handler, additionalParams, Collections.emptyMap());
293299
}
294300

295-
private void sendTokenGenerate(String apiVersion, Vertx vertx, String v1GetParam, JsonObject v2PostPayload, int expectedHttpCode, String referer, Handler<JsonObject> handler, boolean additionalParams, String headerName, String headerValue) {
301+
private void sendTokenGenerate(String apiVersion, Vertx vertx, String v1GetParam, JsonObject v2PostPayload, int expectedHttpCode, String referer, Handler<JsonObject> handler, boolean additionalParams, Map<String, String> additionalHeaders) {
296302
if (apiVersion.equals("v2")) {
297303
ClientKey ck = (ClientKey) clientKeyProvider.get("");
298304

@@ -319,29 +325,31 @@ private void sendTokenGenerate(String apiVersion, Vertx vertx, String v1GetParam
319325
} else {
320326
handler.handle(tryParseResponse(ar.result()));
321327
}
322-
}, headerName, headerValue);
328+
}, additionalHeaders);
323329
} else {
324330
get(vertx, apiVersion + "/token/generate" + (v1GetParam != null ? "?" + v1GetParam : ""), ar -> {
325331
assertTrue(ar.succeeded());
326332
assertEquals(expectedHttpCode, ar.result().statusCode());
327333
handler.handle(tryParseResponse(ar.result()));
328-
}, headerName, headerValue);
334+
}, additionalHeaders);
329335
}
330336
}
331337

332338
private void sendTokenRefresh(String apiVersion, Vertx vertx, VertxTestContext testContext, String refreshToken, String v2RefreshDecryptSecret, int expectedHttpCode,
333339
Handler<JsonObject> handler) {
334-
sendTokenRefresh(apiVersion, vertx, null, null, testContext, refreshToken, v2RefreshDecryptSecret, expectedHttpCode, handler);
340+
sendTokenRefresh(apiVersion, vertx, testContext, refreshToken, v2RefreshDecryptSecret, expectedHttpCode, handler, Collections.emptyMap());
335341
}
336342

337-
private void sendTokenRefresh(String apiVersion, Vertx vertx, String headerName, String headerValue, VertxTestContext testContext, String refreshToken, String v2RefreshDecryptSecret, int expectedHttpCode,
338-
Handler<JsonObject> handler) {
343+
private void sendTokenRefresh(String apiVersion, Vertx vertx, VertxTestContext testContext, String refreshToken, String v2RefreshDecryptSecret, int expectedHttpCode,
344+
Handler<JsonObject> handler, Map<String, String> additionalHeaders) {
339345
if (apiVersion.equals("v2")) {
340346
WebClient client = WebClient.create(vertx);
341347
HttpRequest<Buffer> refreshHttpRequest = client.postAbs(getUrlForEndpoint("v2/token/refresh"));
342-
if (headerName != null) {
343-
refreshHttpRequest.putHeader(headerName, headerValue);
348+
349+
for (Map.Entry<String, String> entry : additionalHeaders.entrySet()) {
350+
refreshHttpRequest.putHeader(entry.getKey(), entry.getValue());
344351
}
352+
345353
refreshHttpRequest
346354
.putHeader("content-type", "text/plain")
347355
.sendBuffer(Buffer.buffer(refreshToken.getBytes(StandardCharsets.UTF_8)), testContext.succeeding(response -> testContext.verify(() -> {
@@ -364,7 +372,7 @@ private void sendTokenRefresh(String apiVersion, Vertx vertx, String headerName,
364372
assertEquals(expectedHttpCode, response.statusCode());
365373
JsonObject json = response.bodyAsJsonObject();
366374
handler.handle(json);
367-
})), headerName, headerValue);
375+
})), additionalHeaders);
368376
}
369377
}
370378

@@ -396,40 +404,42 @@ private JsonObject tryParseResponse(HttpResponse<Buffer> resp) {
396404
}
397405

398406
private void get(Vertx vertx, String endpoint, Handler<AsyncResult<HttpResponse<Buffer>>> handler) {
399-
WebClient client = WebClient.create(vertx);
400-
ClientKey ck = clientKeyProvider.getClientKey("");
401-
HttpRequest<Buffer> req = client.getAbs(getUrlForEndpoint(endpoint));
402-
if (ck != null)
403-
req.putHeader("Authorization", "Bearer " + clientKey);
404-
req.send(handler);
407+
get(vertx, endpoint, handler, Collections.emptyMap());
405408
}
406409

407-
private void get(Vertx vertx, String endpoint, Handler<AsyncResult<HttpResponse<Buffer>>> handler, String headerName, String headerValue) {
410+
private void get(Vertx vertx, String endpoint, Handler<AsyncResult<HttpResponse<Buffer>>> handler, Map<String, String> additionalHeaders) {
408411
WebClient client = WebClient.create(vertx);
409412
ClientKey ck = clientKeyProvider.getClientKey("");
410413
HttpRequest<Buffer> req = client.getAbs(getUrlForEndpoint(endpoint));
411414
if (ck != null) {
412415
req.putHeader("Authorization", "Bearer " + clientKey);
413416
}
414-
if (headerName != null) {
415-
req.putHeader(headerName, headerValue);
417+
418+
for (Map.Entry<String, String> entry : additionalHeaders.entrySet()) {
419+
req.putHeader(entry.getKey(), entry.getValue());
416420
}
421+
417422
req.send(handler);
418423
}
419424

420-
private void post(Vertx vertx, String endpoint, JsonObject body, Handler<AsyncResult<HttpResponse<Buffer>>> handler) {
425+
private void post(Vertx vertx, String endpoint, JsonObject body, Handler<AsyncResult<HttpResponse<Buffer>>> handler, Map<String, String> additionalHeaders) {
421426
WebClient client = WebClient.create(vertx);
422427
ClientKey ck = clientKeyProvider.getClientKey("");
423428
HttpRequest<Buffer> req = client.postAbs(getUrlForEndpoint(endpoint));
424429
if (ck != null)
425430
req.putHeader("Authorization", "Bearer " + clientKey);
431+
432+
for (Map.Entry<String, String> entry : additionalHeaders.entrySet()) {
433+
req.putHeader(entry.getKey(), entry.getValue());
434+
}
435+
426436
req.sendJsonObject(body, handler);
427437
}
428438

429439
private void postV2(ClientKey ck, Vertx vertx, String endpoint, JsonObject body, long nonce, String referer, Handler<AsyncResult<HttpResponse<Buffer>>> handler) {
430-
postV2(ck, vertx, endpoint, body, nonce, referer, handler, null, null);
440+
postV2(ck, vertx, endpoint, body, nonce, referer, handler, Collections.emptyMap());
431441
}
432-
private void postV2(ClientKey ck, Vertx vertx, String endpoint, JsonObject body, long nonce, String referer, Handler<AsyncResult<HttpResponse<Buffer>>> handler, String headerName, String headerValue) {
442+
private void postV2(ClientKey ck, Vertx vertx, String endpoint, JsonObject body, long nonce, String referer, Handler<AsyncResult<HttpResponse<Buffer>>> handler, Map<String, String> additionalHeaders) {
433443
WebClient client = WebClient.create(vertx);
434444

435445
Buffer b = Buffer.buffer();
@@ -449,8 +459,9 @@ private void postV2(ClientKey ck, Vertx vertx, String endpoint, JsonObject body,
449459
HttpRequest<Buffer> request = client.postAbs(getUrlForEndpoint(endpoint))
450460
.putHeader("Authorization", "Bearer " + apiKey)
451461
.putHeader("content-type", "text/plain");
452-
if (headerName != null) {
453-
request.putHeader(headerName, headerValue);
462+
463+
for (Map.Entry<String, String> entry : additionalHeaders.entrySet()) {
464+
request.putHeader(entry.getKey(), entry.getValue());
454465
}
455466

456467
if (referer != null) {
@@ -626,14 +637,14 @@ protected void setupSiteKey(int siteId, int keyId, int keysetId) {
626637
}
627638

628639
private void generateTokens(String apiVersion, Vertx vertx, String inputType, String input, Handler<JsonObject> handler) {
629-
generateTokens(apiVersion, vertx, inputType, input, handler, null, null);
640+
generateTokens(apiVersion, vertx, inputType, input, handler, Collections.emptyMap());
630641
}
631642

632-
private void generateTokens(String apiVersion, Vertx vertx, String inputType, String input, Handler<JsonObject> handler, String headerName, String headerValue) {
643+
private void generateTokens(String apiVersion, Vertx vertx, String inputType, String input, Handler<JsonObject> handler, Map<String, String> additionalHeaders) {
633644
String v1Param = inputType + "=" + urlEncode(input);
634645
JsonObject v2Payload = new JsonObject();
635646
v2Payload.put(inputType, input);
636-
sendTokenGenerate(apiVersion, vertx, v1Param, v2Payload, 200, null, handler, true, headerName, headerValue);
647+
sendTokenGenerate(apiVersion, vertx, v1Param, v2Payload, 200, null, handler, true, additionalHeaders);
637648
}
638649

639650
private static void assertEqualsClose(Instant expected, Instant actual, int withinSeconds) {
@@ -1453,7 +1464,7 @@ void tokenGenerateOptOutToken(String policyParameterKey, String identity, Identi
14531464
TokenResponseStatsCollector.ResponseStatus.Success,
14541465
TokenResponseStatsCollector.PlatformType.Other);
14551466

1456-
sendTokenRefresh("v2", vertx, ClientVersionHeader, tvosClientVersionHeaderValue, testContext, body.getString("refresh_token"), body.getString("refresh_response_key"), 200, refreshRespJson ->
1467+
sendTokenRefresh("v2", vertx, testContext, body.getString("refresh_token"), body.getString("refresh_response_key"), 200, refreshRespJson ->
14571468
{
14581469
assertEquals("optout", refreshRespJson.getString("status"));
14591470
JsonObject refreshBody = refreshRespJson.getJsonObject("body");
@@ -1464,7 +1475,7 @@ void tokenGenerateOptOutToken(String policyParameterKey, String identity, Identi
14641475
TokenResponseStatsCollector.ResponseStatus.OptOut,
14651476
TokenResponseStatsCollector.PlatformType.InApp);
14661477
testContext.completeNow();
1467-
});
1478+
}, Map.of(ClientVersionHeader, tvosClientVersionHeaderValue));
14681479
});
14691480
}
14701481

@@ -1604,6 +1615,8 @@ void tokenGenerateThenRefresh(String apiVersion, Vertx vertx, VertxTestContext t
16041615
setupSalts();
16051616
setupKeys();
16061617

1618+
Map<String, String> additionalHeaders = Map.of(ClientVersionHeader, iosClientVersionHeaderValue);
1619+
16071620
generateTokens(apiVersion, vertx, "email", emailAddress, genRespJson -> {
16081621
assertEquals("success", genRespJson.getString("status"));
16091622
JsonObject bodyJson = genRespJson.getJsonObject("body");
@@ -1613,7 +1626,7 @@ void tokenGenerateThenRefresh(String apiVersion, Vertx vertx, VertxTestContext t
16131626

16141627
when(this.optOutStore.getLatestEntry(any())).thenReturn(null);
16151628

1616-
sendTokenRefresh(apiVersion, vertx, ClientVersionHeader, iosClientVersionHeaderValue, testContext, genRefreshToken, bodyJson.getString("refresh_response_key"), 200, refreshRespJson ->
1629+
sendTokenRefresh(apiVersion, vertx, testContext, genRefreshToken, bodyJson.getString("refresh_response_key"), 200, refreshRespJson ->
16171630
{
16181631
assertEquals("success", refreshRespJson.getString("status"));
16191632
JsonObject refreshBody = refreshRespJson.getJsonObject("body");
@@ -1649,8 +1662,8 @@ void tokenGenerateThenRefresh(String apiVersion, Vertx vertx, VertxTestContext t
16491662
TokenResponseStatsCollector.PlatformType.InApp);
16501663

16511664
testContext.completeNow();
1652-
});
1653-
}, ClientVersionHeader, iosClientVersionHeaderValue);
1665+
}, additionalHeaders);
1666+
}, additionalHeaders);
16541667
}
16551668

16561669
@ParameterizedTest
@@ -1663,6 +1676,8 @@ void tokenGenerateThenRefreshSaltsExpired(String apiVersion, Vertx vertx, VertxT
16631676
setupSalts();
16641677
setupKeys();
16651678

1679+
Map<String, String> additionalHeaders = Map.of(ClientVersionHeader, androidClientVersionHeaderValue);
1680+
16661681
generateTokens(apiVersion, vertx, "email", emailAddress, genRespJson -> {
16671682
assertEquals("success", genRespJson.getString("status"));
16681683
JsonObject bodyJson = genRespJson.getJsonObject("body");
@@ -1672,7 +1687,7 @@ void tokenGenerateThenRefreshSaltsExpired(String apiVersion, Vertx vertx, VertxT
16721687

16731688
when(this.optOutStore.getLatestEntry(any())).thenReturn(null);
16741689

1675-
sendTokenRefresh(apiVersion, vertx, ClientVersionHeader, androidClientVersionHeaderValue, testContext, genRefreshToken, bodyJson.getString("refresh_response_key"), 200, refreshRespJson ->
1690+
sendTokenRefresh(apiVersion, vertx, testContext, genRefreshToken, bodyJson.getString("refresh_response_key"), 200, refreshRespJson ->
16761691
{
16771692
assertEquals("success", refreshRespJson.getString("status"));
16781693
JsonObject refreshBody = refreshRespJson.getJsonObject("body");
@@ -1710,8 +1725,8 @@ void tokenGenerateThenRefreshSaltsExpired(String apiVersion, Vertx vertx, VertxT
17101725
verify(shutdownHandler, atLeastOnce()).handleSaltRetrievalResponse(true);
17111726

17121727
testContext.completeNow();
1713-
});
1714-
}, ClientVersionHeader, androidClientVersionHeaderValue);
1728+
}, additionalHeaders);
1729+
}, additionalHeaders);
17151730
}
17161731

17171732
@Test
@@ -1735,12 +1750,12 @@ void tokenGenerateThenRefreshNoActiveKey(Vertx vertx, VertxTestContext testConte
17351750
String genRefreshToken = bodyJson.getString("refresh_token");
17361751

17371752
setupKeys(true);
1738-
sendTokenRefresh("v2", vertx, ClientVersionHeader, androidClientVersionHeaderValue, testContext, genRefreshToken, bodyJson.getString("refresh_response_key"), 500, refreshRespJson ->
1753+
sendTokenRefresh("v2", vertx, testContext, genRefreshToken, bodyJson.getString("refresh_response_key"), 500, refreshRespJson ->
17391754
{
17401755
assertFalse(refreshRespJson.containsKey("body"));
17411756
assertEquals("No active encryption key available", refreshRespJson.getString("message"));
17421757
testContext.completeNow();
1743-
});
1758+
}, Map.of(ClientVersionHeader, androidClientVersionHeaderValue));
17441759
});
17451760
}
17461761

@@ -1939,7 +1954,7 @@ void tokenGenerateNoActiveKey(Vertx vertx, VertxTestContext testContext) {
19391954
void tokenRefreshNoToken(String apiVersion, Vertx vertx, VertxTestContext testContext) {
19401955
final int clientSiteId = 201;
19411956
fakeAuth(clientSiteId, Role.GENERATOR);
1942-
sendTokenRefresh(apiVersion, vertx, null, null, testContext, "", "", 400, json -> {
1957+
sendTokenRefresh(apiVersion, vertx, testContext, "", "", 400, json -> {
19431958
assertEquals("invalid_token", json.getString("status"));
19441959
assertTokenStatusMetrics(
19451960
clientSiteId,
@@ -1956,21 +1971,21 @@ void tokenRefreshInvalidTokenAuthenticated(String apiVersion, String token, Vert
19561971
final int clientSiteId = 201;
19571972
fakeAuth(clientSiteId, Role.GENERATOR);
19581973

1959-
sendTokenRefresh(apiVersion, vertx, ORIGIN_HEADER, "example.com", testContext, token, "", 400, json -> {
1974+
sendTokenRefresh(apiVersion, vertx, testContext, token, "", 400, json -> {
19601975
assertEquals("invalid_token", json.getString("status"));
19611976
assertTokenStatusMetrics(
19621977
clientSiteId,
19631978
apiVersion.equals("v1") ? TokenResponseStatsCollector.Endpoint.RefreshV1 : TokenResponseStatsCollector.Endpoint.RefreshV2,
19641979
TokenResponseStatsCollector.ResponseStatus.InvalidToken,
19651980
TokenResponseStatsCollector.PlatformType.HasOriginHeader);
19661981
testContext.completeNow();
1967-
});
1982+
}, Map.of(ORIGIN_HEADER, "https://example.com"));
19681983
}
19691984

19701985
@ParameterizedTest
19711986
@ValueSource(strings = {"v1", "v2"})
19721987
void tokenRefreshInvalidTokenUnauthenticated(String apiVersion, Vertx vertx, VertxTestContext testContext) {
1973-
sendTokenRefresh(apiVersion, vertx, null, null, testContext, "abcd", "", 400, json -> {
1988+
sendTokenRefresh(apiVersion, vertx, testContext, "abcd", "", 400, json -> {
19741989
assertEquals("error", json.getString("status"));
19751990
testContext.completeNow();
19761991
});
@@ -2677,13 +2692,13 @@ void LogoutV2(Vertx vertx, VertxTestContext testContext) {
26772692
Handler<AsyncResult<Instant>> handler = invocation.getArgument(4);
26782693
handler.handle(Future.succeededFuture(Instant.now()));
26792694
return null;
2680-
}).when(this.optOutStore).addEntry(any(), any(), any(), any(), any());
2695+
}).when(this.optOutStore).addEntry(any(), any(), eq("uid-trace-id"), eq("test-instance-id"), any());
26812696

26822697
send("v2", vertx, "v2/token/logout", false, null, req, 200, respJson -> {
26832698
assertEquals("success", respJson.getString("status"));
26842699
assertEquals("OK", respJson.getJsonObject("body").getString("optout"));
26852700
testContext.completeNow();
2686-
});
2701+
}, Map.of(Audit.UID_TRACE_ID_HEADER, "uid-trace-id"));
26872702
}
26882703

26892704
@Test

0 commit comments

Comments
 (0)