Skip to content

Commit ae78fc5

Browse files
committed
Handle negative ttl case
1 parent c7416d9 commit ae78fc5

File tree

3 files changed

+190
-10
lines changed

3 files changed

+190
-10
lines changed

src/main/java/org/prebid/server/cache/CoreCacheService.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
import java.util.List;
5757
import java.util.Map;
5858
import java.util.Objects;
59+
import java.util.Optional;
5960
import java.util.Set;
6061
import java.util.concurrent.TimeoutException;
6162
import java.util.function.Function;
@@ -242,12 +243,18 @@ private List<CachedCreative> updatePutObjects(List<BidPutObject> bidPutObjects,
242243
putObject,
243244
accountId,
244245
integration))
245-
.ttlseconds(ObjectUtils.min(putObject.getTtlseconds(), accountTtl))
246+
.ttlseconds(resolveVtrackTtl(putObject.getTtlseconds(), accountTtl))
246247
.build())
247248
.map(payload -> CachedCreative.of(payload, creativeSizeFromTextNode(payload.getValue())))
248249
.toList();
249250
}
250251

252+
private static Integer resolveVtrackTtl(Integer initialObjectTtl, Integer initialAccountTtl) {
253+
final Integer accountTtl = Optional.ofNullable(initialAccountTtl).filter(ttl -> ttl > 0).orElse(null);
254+
final Integer objectTtl = Optional.ofNullable(initialObjectTtl).filter(ttl -> ttl > 0).orElse(null);
255+
return ObjectUtils.min(objectTtl, accountTtl);
256+
}
257+
251258
public Future<CacheServiceResult> cacheBidsOpenrtb(List<BidInfo> bidsToCache,
252259
AuctionContext auctionContext,
253260
CacheContext cacheContext,

src/test/java/org/prebid/server/cache/CoreCacheServiceTest.java

Lines changed: 180 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@
7676
import static org.mockito.Mock.Strictness.LENIENT;
7777
import static org.mockito.Mockito.eq;
7878
import static org.mockito.Mockito.never;
79+
import static org.mockito.Mockito.times;
7980
import static org.mockito.Mockito.verify;
8081
import static org.mockito.Mockito.verifyNoInteractions;
8182

@@ -916,6 +917,22 @@ public void cachePutObjectsShouldCacheObjectsWithTtlDefinedAsMinBetweenRequestAn
916917
.value(new TextNode("VAST"))
917918
.ttlseconds(101)
918919
.build();
920+
final BidPutObject fourthBidPutObject = BidPutObject.builder()
921+
.type("json")
922+
.bidid("bidId4")
923+
.bidder("bidder4")
924+
.timestamp(1L)
925+
.value(new TextNode("VAST"))
926+
.ttlseconds(-100)
927+
.build();
928+
final BidPutObject fifthBidPutObject = BidPutObject.builder()
929+
.type("xml")
930+
.bidid("bidId4")
931+
.bidder("bidder4")
932+
.timestamp(1L)
933+
.value(new TextNode("VAST"))
934+
.ttlseconds(0)
935+
.build();
919936

920937
given(vastModifier.modifyVastXml(any(), any(), any(), any(), anyString()))
921938
.willReturn(new TextNode("modifiedVast"))
@@ -924,11 +941,16 @@ public void cachePutObjectsShouldCacheObjectsWithTtlDefinedAsMinBetweenRequestAn
924941

925942
given(httpClient.post(anyString(), any(), any(), anyLong())).willReturn(Future.succeededFuture(
926943
HttpClientResponse.of(200, null, mapper.writeValueAsString(BidCacheResponse.of(
927-
List.of(CacheObject.of("uuid1"), CacheObject.of("uuid2"), CacheObject.of("uuid3")))))));
944+
List.of(
945+
CacheObject.of("uuid1"),
946+
CacheObject.of("uuid2"),
947+
CacheObject.of("uuid3"),
948+
CacheObject.of("uuid4"),
949+
CacheObject.of("uuid5")))))));
928950

929951
// when
930952
target.cachePutObjects(
931-
asList(firstBidPutObject, secondBidPutObject, thirdBidPutObject),
953+
asList(firstBidPutObject, secondBidPutObject, thirdBidPutObject, fourthBidPutObject, fifthBidPutObject),
932954
true,
933955
singleton("bidder1"),
934956
"account",
@@ -942,15 +964,21 @@ public void cachePutObjectsShouldCacheObjectsWithTtlDefinedAsMinBetweenRequestAn
942964
verify(metrics).updateCacheCreativeSize(eq("account"), eq(12), eq(MetricName.json));
943965
verify(metrics).updateCacheCreativeSize(eq("account"), eq(4), eq(MetricName.xml));
944966
verify(metrics).updateCacheCreativeSize(eq("account"), eq(11), eq(MetricName.unknown));
967+
verify(metrics).updateCacheCreativeSize(eq("account"), eq(12), eq(MetricName.json));
968+
verify(metrics).updateCacheCreativeSize(eq("account"), eq(4), eq(MetricName.xml));
945969

946970
verify(metrics).updateCacheCreativeTtl(eq("account"), eq(99), eq(MetricName.json));
947-
verify(metrics).updateCacheCreativeTtl(eq("account"), eq(100), eq(MetricName.xml));
971+
verify(metrics, times(2)).updateCacheCreativeTtl(eq("account"), eq(100), eq(MetricName.xml));
948972
verify(metrics).updateCacheCreativeTtl(eq("account"), eq(100), eq(MetricName.unknown));
973+
verify(metrics).updateCacheCreativeTtl(eq("account"), eq(100), eq(MetricName.json));
949974

950975
verify(metrics).updateVtrackCacheWriteRequestTime(eq("account"), anyLong(), eq(MetricName.ok));
951976

952977
verify(vastModifier).modifyVastXml(true, singleton("bidder1"), firstBidPutObject, "account", "pbjs");
953978
verify(vastModifier).modifyVastXml(true, singleton("bidder1"), secondBidPutObject, "account", "pbjs");
979+
verify(vastModifier).modifyVastXml(true, singleton("bidder1"), thirdBidPutObject, "account", "pbjs");
980+
verify(vastModifier).modifyVastXml(true, singleton("bidder1"), fourthBidPutObject, "account", "pbjs");
981+
verify(vastModifier).modifyVastXml(true, singleton("bidder1"), fifthBidPutObject, "account", "pbjs");
954982

955983
final BidPutObject modifiedFirstBidPutObject = firstBidPutObject.toBuilder()
956984
.bidid(null)
@@ -972,9 +1000,156 @@ public void cachePutObjectsShouldCacheObjectsWithTtlDefinedAsMinBetweenRequestAn
9721000
.value(new TextNode("updatedVast"))
9731001
.ttlseconds(100)
9741002
.build();
1003+
final BidPutObject modifiedFourthBidPutObject = fourthBidPutObject.toBuilder()
1004+
.bidid(null)
1005+
.bidder(null)
1006+
.timestamp(null)
1007+
.value(new TextNode("updatedVast"))
1008+
.ttlseconds(100)
1009+
.build();
1010+
final BidPutObject modifiedFifthBidPutObject = fifthBidPutObject.toBuilder()
1011+
.bidid(null)
1012+
.bidder(null)
1013+
.timestamp(null)
1014+
.value(new TextNode("updatedVast"))
1015+
.ttlseconds(100)
1016+
.build();
9751017

976-
assertThat(captureBidCacheRequest().getPuts())
977-
.containsExactly(modifiedFirstBidPutObject, modifiedSecondBidPutObject, modifiedThirdBidPutObject);
1018+
assertThat(captureBidCacheRequest().getPuts()).containsExactly(
1019+
modifiedFirstBidPutObject,
1020+
modifiedSecondBidPutObject,
1021+
modifiedThirdBidPutObject,
1022+
modifiedFourthBidPutObject,
1023+
modifiedFifthBidPutObject);
1024+
}
1025+
1026+
@Test
1027+
public void cachePutObjectsShouldCacheObjectsWithTtlDefinedAsPutObjectTtlWhenAccountTtlIsNegative()
1028+
throws IOException {
1029+
1030+
// given
1031+
final BidPutObject bidObject = BidPutObject.builder()
1032+
.type("json")
1033+
.bidid("bidId1")
1034+
.bidder("bidder1")
1035+
.timestamp(1L)
1036+
.value(new TextNode("vast"))
1037+
.ttlseconds(100)
1038+
.build();
1039+
1040+
given(vastModifier.modifyVastXml(any(), any(), any(), any(), anyString()))
1041+
.willReturn(new TextNode("modifiedVast"));
1042+
1043+
given(httpClient.post(anyString(), any(), any(), anyLong())).willReturn(Future.succeededFuture(
1044+
HttpClientResponse.of(200, null, mapper.writeValueAsString(BidCacheResponse.of(
1045+
List.of(CacheObject.of("uuid1")))))));
1046+
1047+
// when
1048+
target.cachePutObjects(
1049+
singletonList(bidObject),
1050+
true,
1051+
singleton("bidder1"),
1052+
"account",
1053+
-20,
1054+
"pbjs",
1055+
timeout);
1056+
1057+
// then
1058+
final BidPutObject expectedBidObject = bidObject.toBuilder()
1059+
.bidid(null)
1060+
.bidder(null)
1061+
.timestamp(null)
1062+
.value(new TextNode("modifiedVast"))
1063+
.ttlseconds(100)
1064+
.build();
1065+
1066+
assertThat(captureBidCacheRequest().getPuts()).containsExactly(expectedBidObject);
1067+
}
1068+
1069+
@Test
1070+
public void cachePutObjectsShouldCacheObjectsWithTtlDefinedAsPutObjectTtlWhenAccountTtlIsZero()
1071+
throws IOException {
1072+
1073+
// given
1074+
final BidPutObject bidObject = BidPutObject.builder()
1075+
.type("json")
1076+
.bidid("bidId1")
1077+
.bidder("bidder1")
1078+
.timestamp(1L)
1079+
.value(new TextNode("vast"))
1080+
.ttlseconds(100)
1081+
.build();
1082+
1083+
given(vastModifier.modifyVastXml(any(), any(), any(), any(), anyString()))
1084+
.willReturn(new TextNode("modifiedVast"));
1085+
1086+
given(httpClient.post(anyString(), any(), any(), anyLong())).willReturn(Future.succeededFuture(
1087+
HttpClientResponse.of(200, null, mapper.writeValueAsString(BidCacheResponse.of(
1088+
List.of(CacheObject.of("uuid1")))))));
1089+
1090+
// when
1091+
target.cachePutObjects(
1092+
singletonList(bidObject),
1093+
true,
1094+
singleton("bidder1"),
1095+
"account",
1096+
0,
1097+
"pbjs",
1098+
timeout);
1099+
1100+
// then
1101+
final BidPutObject expectedBidObject = bidObject.toBuilder()
1102+
.bidid(null)
1103+
.bidder(null)
1104+
.timestamp(null)
1105+
.value(new TextNode("modifiedVast"))
1106+
.ttlseconds(100)
1107+
.build();
1108+
1109+
assertThat(captureBidCacheRequest().getPuts()).containsExactly(expectedBidObject);
1110+
}
1111+
1112+
@Test
1113+
public void cachePutObjectsShouldNotProvideTtlWhenAccountTtlIsNegativeAndPutObjectTtlIsZero()
1114+
throws IOException {
1115+
1116+
// given
1117+
final BidPutObject bidObject = BidPutObject.builder()
1118+
.type("json")
1119+
.bidid("bidId1")
1120+
.bidder("bidder1")
1121+
.timestamp(1L)
1122+
.value(new TextNode("vast"))
1123+
.ttlseconds(0)
1124+
.build();
1125+
1126+
given(vastModifier.modifyVastXml(any(), any(), any(), any(), anyString()))
1127+
.willReturn(new TextNode("modifiedVast"));
1128+
1129+
given(httpClient.post(anyString(), any(), any(), anyLong())).willReturn(Future.succeededFuture(
1130+
HttpClientResponse.of(200, null, mapper.writeValueAsString(BidCacheResponse.of(
1131+
List.of(CacheObject.of("uuid1")))))));
1132+
1133+
// when
1134+
target.cachePutObjects(
1135+
singletonList(bidObject),
1136+
true,
1137+
singleton("bidder1"),
1138+
"account",
1139+
-10,
1140+
"pbjs",
1141+
timeout);
1142+
1143+
// then
1144+
final BidPutObject expectedBidObject = bidObject.toBuilder()
1145+
.bidid(null)
1146+
.bidder(null)
1147+
.timestamp(null)
1148+
.value(new TextNode("modifiedVast"))
1149+
.ttlseconds(null)
1150+
.build();
1151+
1152+
assertThat(captureBidCacheRequest().getPuts()).containsExactly(expectedBidObject);
9781153
}
9791154

9801155
@Test

src/test/java/org/prebid/server/handler/PostVtrackHandlerTest.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -312,17 +312,15 @@ public void shouldSendToCacheNullInAccountEnabledAndValidBiddersWhenAccountEvent
312312
}
313313

314314
@Test
315-
public void shouldSendToCacheAccountTtlWhenAccountTtlIsPresent()
316-
throws JsonProcessingException {
315+
public void shouldSendToCacheAccountTtlWhenAccountTtlIsPresent() throws JsonProcessingException {
317316
// given
318317
final List<BidPutObject> bidPutObjects = singletonList(
319318
BidPutObject.builder()
320319
.bidid("bidId")
321320
.bidder("bidder")
322321
.type("xml")
323322
.value(new TextNode("<vast")).build());
324-
given(requestBody.buffer())
325-
.willReturn(givenVtrackRequest(bidPutObjects));
323+
given(requestBody.buffer()).willReturn(givenVtrackRequest(bidPutObjects));
326324

327325
given(applicationSettings.getAccountById(any(), any())).willReturn(Future.succeededFuture(
328326
Account.builder().vtrack(AccountVtrackConfig.builder().ttl(100).build()).build()));

0 commit comments

Comments
 (0)