Skip to content

Commit db75507

Browse files
authored
Tests: Multiple Uids Cookies Support (#3691)
* Tests: Multiple Uids Cookies Support
1 parent 361605a commit db75507

File tree

7 files changed

+289
-61
lines changed

7 files changed

+289
-61
lines changed

src/test/groovy/org/prebid/server/functional/model/UidsCookie.groovy

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@ class UidsCookie {
1616
Map<BidderName, UidWithExpiry> tempUIDs
1717
Boolean optout
1818

19-
static UidsCookie getDefaultUidsCookie(BidderName bidder = GENERIC) {
19+
static UidsCookie getDefaultUidsCookie(BidderName bidder = GENERIC, Integer daysUntilExpiry = 2) {
2020
new UidsCookie().tap {
2121
uids = [(bidder): UUID.randomUUID().toString()]
2222
tempUIDs = [(bidder): new UidWithExpiry(uid: UUID.randomUUID().toString(),
23-
expires: ZonedDateTime.now(Clock.systemUTC()).plusDays(2))]
23+
expires: ZonedDateTime.now(Clock.systemUTC()).plusDays(daysUntilExpiry))]
2424
}
2525
}
2626
}

src/test/groovy/org/prebid/server/functional/model/request/setuid/SetuidRequest.groovy

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ class SetuidRequest {
2323
String account
2424

2525
static SetuidRequest getDefaultSetuidRequest() {
26-
def request = new SetuidRequest()
27-
request.bidder = GENERIC
28-
request.gdpr = "0"
29-
request
26+
new SetuidRequest().tap {
27+
bidder = GENERIC
28+
gdpr = "0"
29+
}
3030
}
3131
}

src/test/groovy/org/prebid/server/functional/model/request/setuid/UidWithExpiry.groovy

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@ class UidWithExpiry {
1111
String uid
1212
ZonedDateTime expires
1313

14-
static UidWithExpiry getDefaultUidWithExpiry() {
14+
static UidWithExpiry getDefaultUidWithExpiry(Integer daysUntilExpiry = 2) {
1515
new UidWithExpiry().tap {
1616
uid = UUID.randomUUID().toString()
17-
expires = ZonedDateTime.now(Clock.systemUTC()).plusDays(2)
17+
expires = ZonedDateTime.now(Clock.systemUTC()).plusDays(daysUntilExpiry)
1818
}
1919
}
2020
}

src/test/groovy/org/prebid/server/functional/model/response/setuid/SetuidResponse.groovy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import org.prebid.server.functional.model.UidsCookie
66
@ToString(includeNames = true, ignoreNulls = true)
77
class SetuidResponse {
88

9-
Map<String, String> headers
9+
Map<String, List<String>> headers
1010
UidsCookie uidsCookie
1111
Byte[] responseBody
1212
}

src/test/groovy/org/prebid/server/functional/service/PrebidServerService.groovy

Lines changed: 38 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -167,12 +167,21 @@ class PrebidServerService implements ObjectMapperWrapper {
167167
}
168168

169169
SetuidResponse sendSetUidRequest(SetuidRequest request, UidsCookie uidsCookie, Map header = [:]) {
170-
def uidsCookieAsJson = encode(uidsCookie)
171-
def uidsCookieAsEncodedJson = Base64.urlEncoder.encodeToString(uidsCookieAsJson.bytes)
172-
def response = given(requestSpecification).cookie(UIDS_COOKIE_NAME, uidsCookieAsEncodedJson)
173-
.queryParams(toMap(request))
174-
.headers(header)
175-
.get(SET_UID_ENDPOINT)
170+
sendSetUidRequest(request, [uidsCookie], header)
171+
}
172+
173+
SetuidResponse sendSetUidRequest(SetuidRequest request, List<UidsCookie> uidsCookies, Map header = [:]) {
174+
def cookies = uidsCookies.withIndex().collectEntries { group, index ->
175+
def uidsCookieAsJson = encode(group)
176+
def uidsCookieAsEncodedJson = Base64.urlEncoder.encodeToString(uidsCookieAsJson.bytes)
177+
["${UIDS_COOKIE_NAME}${index > 0 ? index + 1 : ''}": uidsCookieAsEncodedJson]
178+
}
179+
180+
def response = given(requestSpecification)
181+
.cookies(cookies)
182+
.queryParams(toMap(request))
183+
.headers(header)
184+
.get(SET_UID_ENDPOINT)
176185

177186
checkResponseStatusCode(response)
178187

@@ -344,16 +353,32 @@ class PrebidServerService implements ObjectMapperWrapper {
344353
}
345354
}
346355

347-
private static Map<String, String> getHeaders(Response response) {
348-
response.headers().collectEntries { [it.name, it.value] }
356+
private static Map<String, List<String>> getHeaders(Response response) {
357+
response.headers().groupBy { it.name }.collectEntries { [(it.key): it.value*.value] }
349358
}
350359

351360
private static UidsCookie getDecodedUidsCookie(Response response) {
352-
def uids = response.detailedCookie(UIDS_COOKIE_NAME)?.value
353-
if (uids) {
354-
return decode(new String(Base64.urlDecoder.decode(uids)), UidsCookie)
355-
} else {
356-
throw new IllegalStateException("uids cookie is missing in response")
361+
def sortedCookies = response.detailedCookies()
362+
.findAll { cookie -> !(cookie =~ /\buids\d*=\s*;/) }
363+
.sort { a, b ->
364+
def aMatch = (a.name =~ /uids(\d*)/)[0]
365+
def bMatch = (b.name =~ /uids(\d*)/)[0]
366+
367+
def aNumber = (aMatch?.getAt(1) ? aMatch[1].toInteger() : 0)
368+
def bNumber = (bMatch?.getAt(1) ? bMatch[1].toInteger() : 0)
369+
370+
aNumber <=> bNumber
371+
}
372+
373+
def decodedCookiesList = sortedCookies.collect { cookie ->
374+
def uid = (cookie =~ /uids\d*=(\S+?);/)[0][1]
375+
decodeWithBase64(uid as String, UidsCookie)
376+
}
377+
378+
decodedCookiesList.inject(new UidsCookie()) { uidsCookie, decodedCookie ->
379+
uidsCookie.uids = (uidsCookie.uids ?: new LinkedHashMap()) + (decodedCookie.uids ?: new LinkedHashMap())
380+
uidsCookie.tempUIDs = (uidsCookie.tempUIDs ?: new LinkedHashMap()) + (decodedCookie.tempUIDs ?: new LinkedHashMap())
381+
uidsCookie
357382
}
358383
}
359384

0 commit comments

Comments
 (0)