From 333befd58d03696960c2147e703be51ed10934c4 Mon Sep 17 00:00:00 2001 From: pkaczmarek Date: Thu, 6 Mar 2025 14:58:38 +0100 Subject: [PATCH 01/12] NextMillennium: Adapter and server version --- .../nextmillennium/NextMillenniumBidder.java | 39 ++++++----- .../openrtb/ext/request/ExtRequestPrebid.java | 6 ++ .../ExtRequestNextMillennium.java | 15 +++++ .../bidder/NextMillenniumConfiguration.java | 5 +- .../NextMillenniumBidderTest.java | 67 ++++++++----------- .../prebid/server/it/NextMillenniumTest.java | 4 +- .../test-nextmillennium-bid-request.json | 25 ++++--- 7 files changed, 87 insertions(+), 74 deletions(-) create mode 100644 src/main/java/org/prebid/server/proto/openrtb/ext/request/nextmillennium/ExtRequestNextMillennium.java diff --git a/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java b/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java index 84c3f68e8bb..f5b31f761fe 100644 --- a/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java +++ b/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java @@ -30,9 +30,11 @@ import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebid; import org.prebid.server.proto.openrtb.ext.request.ExtStoredRequest; import org.prebid.server.proto.openrtb.ext.request.nextmillennium.ExtImpNextMillennium; +import org.prebid.server.proto.openrtb.ext.request.nextmillennium.ExtRequestNextMillennium; import org.prebid.server.proto.openrtb.ext.response.BidType; import org.prebid.server.util.HttpUtil; import org.prebid.server.util.ObjectUtil; +import org.prebid.server.version.PrebidVersionProvider; import java.util.ArrayList; import java.util.Collection; @@ -46,15 +48,21 @@ public class NextMillenniumBidder implements Bidder { new TypeReference<>() { }; + private static final String NM_ADAPTER_VERSION = "v1.0.0"; + private final String endpointUrl; private final JacksonMapper mapper; private final List nmmFlags; + private final PrebidVersionProvider versionProvider; - public NextMillenniumBidder(String endpointUrl, JacksonMapper mapper, List nmmFlags) { + public NextMillenniumBidder(String endpointUrl, + JacksonMapper mapper, + List nmmFlags, + PrebidVersionProvider versionProvider) { this.endpointUrl = HttpUtil.validateUrl(Objects.requireNonNull(endpointUrl)); this.mapper = Objects.requireNonNull(mapper); this.nmmFlags = nmmFlags; - + this.versionProvider = Objects.requireNonNull(versionProvider); } @Override @@ -97,16 +105,17 @@ private BidRequest updateBidRequest(BidRequest bidRequest, ExtImpNextMillennium .map(prebid -> prebid.toBuilder().storedrequest(storedRequest).build()) .orElse(createdExtRequestPrebid); - return bidRequest.toBuilder() - .imp(updateImps(bidRequest, createdExtRequestPrebid)) - .ext(ExtRequest.of(extRequestPrebid)) + final ExtRequestPrebid updatedExt = extRequestPrebid.toBuilder() + .nextMillennium(ExtRequestNextMillennium.of( + nmmFlags, + NM_ADAPTER_VERSION, + versionProvider.getNameVersionRecord())) .build(); - } - private List updateImps(BidRequest bidRequest, ExtRequestPrebid extRequestPrebid) { - return bidRequest.getImp().stream() - .map(imp -> imp.toBuilder().ext(createImpExt(extRequestPrebid)).build()) - .toList(); + return bidRequest.toBuilder() + .imp(bidRequest.getImp()) + .ext(ExtRequest.of(updatedExt)) + .build(); } private static String resolveStoredRequestId(BidRequest bidRequest, ExtImpNextMillennium extImpNextMillennium) { @@ -146,16 +155,6 @@ private static String formatSize(Integer w, Integer h) { : null; } - private ObjectNode createImpExt(ExtRequestPrebid prebid) { - final ObjectNode impExt = mapper.mapper().createObjectNode(); - impExt.set("prebid", mapper.mapper().valueToTree(prebid)); - if (CollectionUtils.isNotEmpty(nmmFlags)) { - impExt.putObject("nextMillennium") - .set("nmmFlags", mapper.mapper().valueToTree(nmmFlags)); - } - return impExt; - } - private HttpRequest makeHttpRequest(BidRequest bidRequest) { return HttpRequest.builder() .method(HttpMethod.POST) diff --git a/src/main/java/org/prebid/server/proto/openrtb/ext/request/ExtRequestPrebid.java b/src/main/java/org/prebid/server/proto/openrtb/ext/request/ExtRequestPrebid.java index 33b326b2638..f719dd2e57d 100644 --- a/src/main/java/org/prebid/server/proto/openrtb/ext/request/ExtRequestPrebid.java +++ b/src/main/java/org/prebid/server/proto/openrtb/ext/request/ExtRequestPrebid.java @@ -9,6 +9,7 @@ import org.prebid.server.auction.model.PaaFormat; import org.prebid.server.floors.model.PriceFloorRules; import org.prebid.server.json.deserializer.IntegerFlagDeserializer; +import org.prebid.server.proto.openrtb.ext.request.nextmillennium.ExtRequestNextMillennium; import java.util.List; import java.util.Map; @@ -190,4 +191,9 @@ public class ExtRequestPrebid { */ @JsonProperty("paaformat") PaaFormat paaFormat; + + /** + * Defines the contract for bidrequest.ext.prebid.nextMillennium + */ + ExtRequestNextMillennium nextMillennium; } diff --git a/src/main/java/org/prebid/server/proto/openrtb/ext/request/nextmillennium/ExtRequestNextMillennium.java b/src/main/java/org/prebid/server/proto/openrtb/ext/request/nextmillennium/ExtRequestNextMillennium.java new file mode 100644 index 00000000000..bf3edfc8e25 --- /dev/null +++ b/src/main/java/org/prebid/server/proto/openrtb/ext/request/nextmillennium/ExtRequestNextMillennium.java @@ -0,0 +1,15 @@ +package org.prebid.server.proto.openrtb.ext.request.nextmillennium; + +import lombok.Value; + +import java.util.List; + +@Value(staticConstructor = "of") +public class ExtRequestNextMillennium { + + List nmmFlags; + + String nmVersion; + + String serverVersion; +} diff --git a/src/main/java/org/prebid/server/spring/config/bidder/NextMillenniumConfiguration.java b/src/main/java/org/prebid/server/spring/config/bidder/NextMillenniumConfiguration.java index 16fbbb37aca..4d102b90f9c 100644 --- a/src/main/java/org/prebid/server/spring/config/bidder/NextMillenniumConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/bidder/NextMillenniumConfiguration.java @@ -10,6 +10,7 @@ import org.prebid.server.spring.config.bidder.util.BidderDepsAssembler; import org.prebid.server.spring.config.bidder.util.UsersyncerCreator; import org.prebid.server.spring.env.YamlPropertySourceFactory; +import org.prebid.server.version.PrebidVersionProvider; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; @@ -34,6 +35,7 @@ NextMillenniumConfigurationProperties configurationProperties() { @Bean BidderDeps nextMillenniumBidderDeps(NextMillenniumConfigurationProperties nextMillenniumConfigurationProperties, @NotBlank @Value("${external-url}") String externalUrl, + PrebidVersionProvider prebidVersionProvider, JacksonMapper mapper) { return BidderDepsAssembler.forBidder(BIDDER_NAME) @@ -42,7 +44,8 @@ BidderDeps nextMillenniumBidderDeps(NextMillenniumConfigurationProperties nextMi .bidderCreator(config -> new NextMillenniumBidder( config.getEndpoint(), mapper, - config.getExtraInfo().getNmmFlags()) + config.getExtraInfo().getNmmFlags(), + prebidVersionProvider) ).assemble(); } diff --git a/src/test/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidderTest.java b/src/test/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidderTest.java index 6f3524a5448..35c9c064595 100644 --- a/src/test/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidderTest.java @@ -1,7 +1,6 @@ package org.prebid.server.bidder.nextmillennium; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.node.ObjectNode; import com.iab.openrtb.request.App; import com.iab.openrtb.request.Banner; import com.iab.openrtb.request.BidRequest; @@ -12,7 +11,11 @@ import com.iab.openrtb.response.Bid; import com.iab.openrtb.response.BidResponse; import com.iab.openrtb.response.SeatBid; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; import org.prebid.server.VertxTest; import org.prebid.server.bidder.model.BidderBid; import org.prebid.server.bidder.model.BidderCall; @@ -27,6 +30,7 @@ import org.prebid.server.proto.openrtb.ext.request.ExtStoredRequest; import org.prebid.server.proto.openrtb.ext.request.nextmillennium.ExtImpNextMillennium; import org.prebid.server.proto.openrtb.ext.response.BidType; +import org.prebid.server.version.PrebidVersionProvider; import java.util.Arrays; import java.util.List; @@ -39,17 +43,33 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; +@ExtendWith(MockitoExtension.class) public class NextMillenniumBidderTest extends VertxTest { private static final String ENDPOINT_URL = "https://test-url.com/"; - private final NextMillenniumBidder target = - new NextMillenniumBidder(ENDPOINT_URL, jacksonMapper, List.of("valueOne", "valueTwo")); + @Mock + private PrebidVersionProvider prebidVersionProvider; + + private NextMillenniumBidder target; + + @BeforeEach + public void setUp() { + target = new NextMillenniumBidder( + ENDPOINT_URL, + jacksonMapper, + List.of("valueOne", "valueTwo"), + prebidVersionProvider); + } @Test public void creationShouldFailOnInvalidEndpointUrl() { assertThatIllegalArgumentException().isThrownBy(() -> - new NextMillenniumBidder("invalid_url", jacksonMapper, List.of("valueOne", "valueTwo"))); + new NextMillenniumBidder( + "invalid_url", + jacksonMapper, + List.of("valueOne", "valueTwo"), + prebidVersionProvider)); } @Test @@ -257,24 +277,6 @@ public void makeHttpRequestsWithInvalidImpsShouldReturnError() { assertThat(result.getValue()).isEmpty(); } - @Test - public void makeHttpRequestsShouldReturnImpExtNextMillenniumWhenNmmFlagsConfigured() { - // given - final BidRequest bidRequest = givenBidRequest(identity(), - givenImpWithExt(identity(), ExtImpNextMillennium.of("placement1", "group1"))); - - // when - final Result>> result = target.makeHttpRequests(bidRequest); - - // then - assertThat(result.getErrors()).isEmpty(); - assertThat(result.getValue()) - .extracting(HttpRequest::getPayload) - .flatExtracting(BidRequest::getImp) - .extracting(Imp::getExt) - .containsExactly(createImpExt(List.of("valueOne", "valueTwo"))); - } - @Test public void makeBidsShouldReturnBannerBidWhenMTypeIsOne() throws JsonProcessingException { // given @@ -438,19 +440,15 @@ public void makeHttpRequestsImpExtComparison() { // when final Result>> result = target.makeHttpRequests(bidRequest); + // then assertThat(result.getValue()) .extracting(HttpRequest::getPayload) - .extracting(BidRequest::getImp) - .extracting(imps -> imps.getFirst()) - .extracting(Imp::getExt) - .isNotEqualTo(givenImp.getExt()) - .extracting(jsonNodes -> mapper.treeToValue(jsonNodes, ExtRequest.class)) + .extracting(BidRequest::getExt) .extracting(ExtRequest::getPrebid) .extracting(ExtRequestPrebid::getStoredrequest) .extracting(ExtStoredRequest::getId) - .element(0) - .isEqualTo(placementId); + .containsExactly(placementId); } @Test @@ -487,7 +485,7 @@ public void makeHttpRequestsImpShouldBeIdenticalExceptExt() { assertThat(result.getValue()) .extracting(HttpRequest::getPayload) .extracting(BidRequest::getImp) - .extracting(imps -> imps.getFirst()) + .extracting(List::getFirst) .element(0) .usingRecursiveComparison() .ignoringFields("ext") @@ -570,13 +568,4 @@ private static Imp givenImpWithExt(UnaryOperator impCustomizer, return givenImp(impCustomizer.andThen(imp -> imp.ext(mapper.valueToTree( ExtPrebid.of(null, extImpNextMillennium))))::apply); } - - private static ObjectNode createImpExt(List values) { - final ObjectNode objectNode = mapper.createObjectNode(); - objectNode.set("prebid", mapper.valueToTree(ExtRequestPrebid.builder() - .storedrequest(ExtStoredRequest.of("ggroup1;;")).build())); - objectNode.putObject("nextMillennium") - .set("nmmFlags", mapper.valueToTree(values)); - return objectNode; - } } diff --git a/src/test/java/org/prebid/server/it/NextMillenniumTest.java b/src/test/java/org/prebid/server/it/NextMillenniumTest.java index 9c6ccac351a..8bab75b5621 100644 --- a/src/test/java/org/prebid/server/it/NextMillenniumTest.java +++ b/src/test/java/org/prebid/server/it/NextMillenniumTest.java @@ -20,7 +20,9 @@ public void openrtb2AuctionShouldRespondWithBidsFromNextMillennium() throws IOEx // given WIRE_MOCK_RULE.stubFor(post(urlPathEqualTo("/nextmillennium-exchange")) .withRequestBody(equalToJson( - jsonFrom("openrtb2/nextmillennium/test-nextmillennium-bid-request.json"))) + jsonFrom("openrtb2/nextmillennium/test-nextmillennium-bid-request.json"), + true, + true)) .willReturn(aResponse().withBody( jsonFrom("openrtb2/nextmillennium/test-nextmillennium-bid-response.json")))); diff --git a/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-nextmillennium-bid-request.json b/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-nextmillennium-bid-request.json index 24a61053439..05b0f3c6e1e 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-nextmillennium-bid-request.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-nextmillennium-bid-request.json @@ -3,28 +3,19 @@ "imp": [ { "id": "imp_id", - "secure": 1, "banner": { "w": 300, "h": 250 }, + "secure": 1, "ext": { - "prebid": { - "storedrequest": { - "id": "placement_id" - } - }, - "nextMillennium": { - "nmmFlags": [ - "1" - ] + "tid": "${json-unit.any-string}", + "bidder": { + "placement_id": "placement_id" } } } ], - "source": { - "tid": "${json-unit.any-string}" - }, "site": { "domain": "www.example.com", "page": "http://www.example.com", @@ -44,6 +35,9 @@ "cur": [ "USD" ], + "source": { + "tid": "${json-unit.any-string}" + }, "regs": { "ext": { "gdpr": 0 @@ -59,6 +53,11 @@ "gvlid": 1, "datacenter": "local", "endpoint": "/openrtb2/auction" + }, + "next_millennium": { + "nmm_flags": [ "1" ], + "nm_version": "v1.0.0", + "server_version": "pbs-java/3.19.0" } } } From 99a129ec8b0176a4ea6b1e442c3c4cfef87b72ee Mon Sep 17 00:00:00 2001 From: pkaczmarek Date: Thu, 6 Mar 2025 15:22:34 +0100 Subject: [PATCH 02/12] fix server_version --- .../nextmillennium/test-nextmillennium-bid-request.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-nextmillennium-bid-request.json b/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-nextmillennium-bid-request.json index 05b0f3c6e1e..3d8426aaa75 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-nextmillennium-bid-request.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-nextmillennium-bid-request.json @@ -57,7 +57,7 @@ "next_millennium": { "nmm_flags": [ "1" ], "nm_version": "v1.0.0", - "server_version": "pbs-java/3.19.0" + "server_version": "${json-unit.any-string}" } } } From 34fad7eac279e72f8fa79dac805f7b34a6e5bea0 Mon Sep 17 00:00:00 2001 From: pkaczmarek Date: Mon, 10 Mar 2025 14:04:41 +0100 Subject: [PATCH 03/12] fix comments --- .../nextmillennium/NextMillenniumBidder.java | 35 +++++++++++-------- .../openrtb/ext/request/ExtRequestPrebid.java | 6 ---- .../ExtRequestNextMillennium.java | 4 +++ .../test-nextmillennium-bid-request.json | 11 +++--- 4 files changed, 30 insertions(+), 26 deletions(-) diff --git a/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java b/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java index f5b31f761fe..5a9d559396d 100644 --- a/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java +++ b/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java @@ -28,6 +28,7 @@ import org.prebid.server.proto.openrtb.ext.ExtPrebid; import org.prebid.server.proto.openrtb.ext.request.ExtRequest; import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebid; +import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidServer; import org.prebid.server.proto.openrtb.ext.request.ExtStoredRequest; import org.prebid.server.proto.openrtb.ext.request.nextmillennium.ExtImpNextMillennium; import org.prebid.server.proto.openrtb.ext.request.nextmillennium.ExtRequestNextMillennium; @@ -40,7 +41,6 @@ import java.util.Collection; import java.util.List; import java.util.Objects; -import java.util.Optional; public class NextMillenniumBidder implements Bidder { @@ -95,26 +95,33 @@ private ExtImpNextMillennium convertExt(ObjectNode impExt) { private BidRequest updateBidRequest(BidRequest bidRequest, ExtImpNextMillennium ext) { final ExtStoredRequest storedRequest = ExtStoredRequest.of(resolveStoredRequestId(bidRequest, ext)); + final ExtRequest requestExt = bidRequest.getExt(); + final ExtRequestPrebid existingPrebid = requestExt != null ? requestExt.getPrebid() : null; + final ExtRequestPrebidServer existingServer = existingPrebid != null ? existingPrebid.getServer() : null; + final ExtRequestPrebid createdExtRequestPrebid = ExtRequestPrebid.builder() .storedrequest(storedRequest) + .server(existingServer) .build(); - final ExtRequestPrebid extRequestPrebid = Optional.ofNullable(bidRequest) - .map(BidRequest::getExt) - .map(ExtRequest::getPrebid) - .map(prebid -> prebid.toBuilder().storedrequest(storedRequest).build()) - .orElse(createdExtRequestPrebid); - - final ExtRequestPrebid updatedExt = extRequestPrebid.toBuilder() - .nextMillennium(ExtRequestNextMillennium.of( - nmmFlags, - NM_ADAPTER_VERSION, - versionProvider.getNameVersionRecord())) + final ExtRequest extRequest = ExtRequest.of(createdExtRequestPrebid); + + final ObjectNode nextMillenniumNode = mapper.mapper().valueToTree( + ExtRequestNextMillennium.of(nmmFlags, NM_ADAPTER_VERSION, versionProvider.getNameVersionRecord())); + + extRequest.addProperty("next_millennium", nextMillenniumNode); + + final Imp firstImp = bidRequest.getImp().getFirst(); + final ObjectNode updatedImpExt = mapper.mapper().createObjectNode(); + updatedImpExt.set("bidder", mapper.mapper().valueToTree(ext)); + + final Imp updatedImp = firstImp.toBuilder() + .ext(updatedImpExt) .build(); return bidRequest.toBuilder() - .imp(bidRequest.getImp()) - .ext(ExtRequest.of(updatedExt)) + .imp(List.of(updatedImp)) + .ext(extRequest) .build(); } diff --git a/src/main/java/org/prebid/server/proto/openrtb/ext/request/ExtRequestPrebid.java b/src/main/java/org/prebid/server/proto/openrtb/ext/request/ExtRequestPrebid.java index f719dd2e57d..33b326b2638 100644 --- a/src/main/java/org/prebid/server/proto/openrtb/ext/request/ExtRequestPrebid.java +++ b/src/main/java/org/prebid/server/proto/openrtb/ext/request/ExtRequestPrebid.java @@ -9,7 +9,6 @@ import org.prebid.server.auction.model.PaaFormat; import org.prebid.server.floors.model.PriceFloorRules; import org.prebid.server.json.deserializer.IntegerFlagDeserializer; -import org.prebid.server.proto.openrtb.ext.request.nextmillennium.ExtRequestNextMillennium; import java.util.List; import java.util.Map; @@ -191,9 +190,4 @@ public class ExtRequestPrebid { */ @JsonProperty("paaformat") PaaFormat paaFormat; - - /** - * Defines the contract for bidrequest.ext.prebid.nextMillennium - */ - ExtRequestNextMillennium nextMillennium; } diff --git a/src/main/java/org/prebid/server/proto/openrtb/ext/request/nextmillennium/ExtRequestNextMillennium.java b/src/main/java/org/prebid/server/proto/openrtb/ext/request/nextmillennium/ExtRequestNextMillennium.java index bf3edfc8e25..9dea1c65f21 100644 --- a/src/main/java/org/prebid/server/proto/openrtb/ext/request/nextmillennium/ExtRequestNextMillennium.java +++ b/src/main/java/org/prebid/server/proto/openrtb/ext/request/nextmillennium/ExtRequestNextMillennium.java @@ -1,5 +1,6 @@ package org.prebid.server.proto.openrtb.ext.request.nextmillennium; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Value; import java.util.List; @@ -7,9 +8,12 @@ @Value(staticConstructor = "of") public class ExtRequestNextMillennium { + @JsonProperty("nmm_flags") List nmmFlags; + @JsonProperty("nm_version") String nmVersion; + @JsonProperty("server_version") String serverVersion; } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-nextmillennium-bid-request.json b/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-nextmillennium-bid-request.json index 3d8426aaa75..96b7f06010c 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-nextmillennium-bid-request.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-nextmillennium-bid-request.json @@ -9,7 +9,6 @@ }, "secure": 1, "ext": { - "tid": "${json-unit.any-string}", "bidder": { "placement_id": "placement_id" } @@ -53,12 +52,12 @@ "gvlid": 1, "datacenter": "local", "endpoint": "/openrtb2/auction" - }, - "next_millennium": { - "nmm_flags": [ "1" ], - "nm_version": "v1.0.0", - "server_version": "${json-unit.any-string}" } + }, + "next_millennium": { + "nmm_flags": [ "1" ], + "nm_version": "v1.0.0", + "server_version": "${json-unit.any-string}" } } } From 961a9c89766bb52e563ae4701fbb3fff984e9d12 Mon Sep 17 00:00:00 2001 From: pkaczmarek Date: Tue, 11 Mar 2025 11:09:15 +0100 Subject: [PATCH 04/12] fix comments --- .../bidder/nextmillennium/NextMillenniumBidder.java | 8 +++++--- .../request/nextmillennium/ExtRequestNextMillennium.java | 6 +++--- .../nextmillennium/test-nextmillennium-bid-request.json | 8 ++++---- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java b/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java index 5a9d559396d..e9472ff5bd0 100644 --- a/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java +++ b/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java @@ -94,7 +94,6 @@ private ExtImpNextMillennium convertExt(ObjectNode impExt) { private BidRequest updateBidRequest(BidRequest bidRequest, ExtImpNextMillennium ext) { final ExtStoredRequest storedRequest = ExtStoredRequest.of(resolveStoredRequestId(bidRequest, ext)); - final ExtRequest requestExt = bidRequest.getExt(); final ExtRequestPrebid existingPrebid = requestExt != null ? requestExt.getPrebid() : null; final ExtRequestPrebidServer existingServer = existingPrebid != null ? existingPrebid.getServer() : null; @@ -109,7 +108,7 @@ private BidRequest updateBidRequest(BidRequest bidRequest, ExtImpNextMillennium final ObjectNode nextMillenniumNode = mapper.mapper().valueToTree( ExtRequestNextMillennium.of(nmmFlags, NM_ADAPTER_VERSION, versionProvider.getNameVersionRecord())); - extRequest.addProperty("next_millennium", nextMillenniumNode); + extRequest.addProperty("nextMillennium", nextMillenniumNode); final Imp firstImp = bidRequest.getImp().getFirst(); final ObjectNode updatedImpExt = mapper.mapper().createObjectNode(); @@ -119,8 +118,11 @@ private BidRequest updateBidRequest(BidRequest bidRequest, ExtImpNextMillennium .ext(updatedImpExt) .build(); + final List updatedImps = new ArrayList<>(bidRequest.getImp()); + updatedImps.set(0, updatedImp); + return bidRequest.toBuilder() - .imp(List.of(updatedImp)) + .imp(updatedImps) .ext(extRequest) .build(); } diff --git a/src/main/java/org/prebid/server/proto/openrtb/ext/request/nextmillennium/ExtRequestNextMillennium.java b/src/main/java/org/prebid/server/proto/openrtb/ext/request/nextmillennium/ExtRequestNextMillennium.java index 9dea1c65f21..68e39c6d1f4 100644 --- a/src/main/java/org/prebid/server/proto/openrtb/ext/request/nextmillennium/ExtRequestNextMillennium.java +++ b/src/main/java/org/prebid/server/proto/openrtb/ext/request/nextmillennium/ExtRequestNextMillennium.java @@ -8,12 +8,12 @@ @Value(staticConstructor = "of") public class ExtRequestNextMillennium { - @JsonProperty("nmm_flags") + @JsonProperty("nmmFlags") List nmmFlags; - @JsonProperty("nm_version") + @JsonProperty("nmVersion") String nmVersion; - @JsonProperty("server_version") + @JsonProperty("serverVersion") String serverVersion; } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-nextmillennium-bid-request.json b/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-nextmillennium-bid-request.json index 96b7f06010c..dba9e438f42 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-nextmillennium-bid-request.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-nextmillennium-bid-request.json @@ -54,10 +54,10 @@ "endpoint": "/openrtb2/auction" } }, - "next_millennium": { - "nmm_flags": [ "1" ], - "nm_version": "v1.0.0", - "server_version": "${json-unit.any-string}" + "nextMillennium": { + "nmmFlags": [ "1" ], + "nmVersion": "v1.0.0", + "serverVersion": "${json-unit.any-string}" } } } From 40fdf2f8fc6ae68cab4e7494f61fb92b508ccde7 Mon Sep 17 00:00:00 2001 From: pkaczmarek Date: Tue, 11 Mar 2025 16:19:16 +0100 Subject: [PATCH 05/12] fix comments --- .../bidder/nextmillennium/NextMillenniumBidder.java | 6 +++++- .../nextmillennium/ExtRequestNextMillennium.java | 2 -- .../test-nextmillennium-bid-request.json | 11 +++++++---- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java b/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java index e9472ff5bd0..1e62f116364 100644 --- a/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java +++ b/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java @@ -112,7 +112,11 @@ private BidRequest updateBidRequest(BidRequest bidRequest, ExtImpNextMillennium final Imp firstImp = bidRequest.getImp().getFirst(); final ObjectNode updatedImpExt = mapper.mapper().createObjectNode(); - updatedImpExt.set("bidder", mapper.mapper().valueToTree(ext)); + updatedImpExt.set("nextMillennium", nextMillenniumNode); + + final ObjectNode prebidNode = mapper.mapper().createObjectNode(); + prebidNode.set("storedrequest", mapper.mapper().valueToTree(storedRequest)); + updatedImpExt.set("prebid", prebidNode); final Imp updatedImp = firstImp.toBuilder() .ext(updatedImpExt) diff --git a/src/main/java/org/prebid/server/proto/openrtb/ext/request/nextmillennium/ExtRequestNextMillennium.java b/src/main/java/org/prebid/server/proto/openrtb/ext/request/nextmillennium/ExtRequestNextMillennium.java index 68e39c6d1f4..430db7997e3 100644 --- a/src/main/java/org/prebid/server/proto/openrtb/ext/request/nextmillennium/ExtRequestNextMillennium.java +++ b/src/main/java/org/prebid/server/proto/openrtb/ext/request/nextmillennium/ExtRequestNextMillennium.java @@ -11,9 +11,7 @@ public class ExtRequestNextMillennium { @JsonProperty("nmmFlags") List nmmFlags; - @JsonProperty("nmVersion") String nmVersion; - @JsonProperty("serverVersion") String serverVersion; } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-nextmillennium-bid-request.json b/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-nextmillennium-bid-request.json index dba9e438f42..16a0ba2c26e 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-nextmillennium-bid-request.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-nextmillennium-bid-request.json @@ -9,8 +9,11 @@ }, "secure": 1, "ext": { - "bidder": { - "placement_id": "placement_id" + "nextMillennium": {}, + "prebid": { + "storedrequest": { + "id": "placement_id" + } } } } @@ -56,8 +59,8 @@ }, "nextMillennium": { "nmmFlags": [ "1" ], - "nmVersion": "v1.0.0", - "serverVersion": "${json-unit.any-string}" + "nm_version": "v1.0.0", + "server_version": "${json-unit.any-string}" } } } From 9b6a05e419c18f50db184acd4f91c4117988c9e8 Mon Sep 17 00:00:00 2001 From: pkaczmarek Date: Fri, 14 Mar 2025 13:32:15 +0100 Subject: [PATCH 06/12] fix comments --- .../server/bidder/nextmillennium/NextMillenniumBidder.java | 2 +- .../nextmillennium/test-nextmillennium-bid-request.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java b/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java index 1e62f116364..9977e9b8d4e 100644 --- a/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java +++ b/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java @@ -112,7 +112,7 @@ private BidRequest updateBidRequest(BidRequest bidRequest, ExtImpNextMillennium final Imp firstImp = bidRequest.getImp().getFirst(); final ObjectNode updatedImpExt = mapper.mapper().createObjectNode(); - updatedImpExt.set("nextMillennium", nextMillenniumNode); + updatedImpExt.set("nextMillennium", nextMillenniumNode.get("nmmFlags")); final ObjectNode prebidNode = mapper.mapper().createObjectNode(); prebidNode.set("storedrequest", mapper.mapper().valueToTree(storedRequest)); diff --git a/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-nextmillennium-bid-request.json b/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-nextmillennium-bid-request.json index 16a0ba2c26e..1b1701a764e 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-nextmillennium-bid-request.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-nextmillennium-bid-request.json @@ -9,7 +9,7 @@ }, "secure": 1, "ext": { - "nextMillennium": {}, + "nextMillennium": [ "1" ], "prebid": { "storedrequest": { "id": "placement_id" From 249843ea220cc592b708142b94d03f842ccc5a27 Mon Sep 17 00:00:00 2001 From: pkaczmarek Date: Mon, 17 Mar 2025 10:36:40 +0100 Subject: [PATCH 07/12] fix comments --- .../server/bidder/nextmillennium/NextMillenniumBidder.java | 4 +++- .../nextmillennium/test-nextmillennium-bid-request.json | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java b/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java index 9977e9b8d4e..f0bbe8e4903 100644 --- a/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java +++ b/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java @@ -112,7 +112,9 @@ private BidRequest updateBidRequest(BidRequest bidRequest, ExtImpNextMillennium final Imp firstImp = bidRequest.getImp().getFirst(); final ObjectNode updatedImpExt = mapper.mapper().createObjectNode(); - updatedImpExt.set("nextMillennium", nextMillenniumNode.get("nmmFlags")); + final ObjectNode impNextMillNode = nextMillenniumNode.deepCopy(); + impNextMillNode.retain("nmmFlags"); + updatedImpExt.set("nextMillennium", impNextMillNode); final ObjectNode prebidNode = mapper.mapper().createObjectNode(); prebidNode.set("storedrequest", mapper.mapper().valueToTree(storedRequest)); diff --git a/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-nextmillennium-bid-request.json b/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-nextmillennium-bid-request.json index 1b1701a764e..6802911a251 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-nextmillennium-bid-request.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-nextmillennium-bid-request.json @@ -9,7 +9,9 @@ }, "secure": 1, "ext": { - "nextMillennium": [ "1" ], + "nextMillennium" : { + "nmmFlags" : [ "1" ] + }, "prebid": { "storedrequest": { "id": "placement_id" From 97ab21e059c8d66b99ef35cae2f9f82f874f06ea Mon Sep 17 00:00:00 2001 From: pkaczmarek Date: Wed, 19 Mar 2025 12:46:22 +0100 Subject: [PATCH 08/12] fix comments --- .../nextmillennium/NextMillenniumBidder.java | 69 ++++- .../proto/NextMillenniumExt.java | 11 + .../proto/NextMillenniumExtBidder.java} | 4 +- .../NextMillenniumBidderTest.java | 252 +++++++++--------- 4 files changed, 196 insertions(+), 140 deletions(-) create mode 100644 src/main/java/org/prebid/server/bidder/nextmillennium/proto/NextMillenniumExt.java rename src/main/java/org/prebid/server/{proto/openrtb/ext/request/nextmillennium/ExtRequestNextMillennium.java => bidder/nextmillennium/proto/NextMillenniumExtBidder.java} (69%) diff --git a/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java b/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java index f0bbe8e4903..60cacc38975 100644 --- a/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java +++ b/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java @@ -12,7 +12,6 @@ import com.iab.openrtb.response.BidResponse; import com.iab.openrtb.response.SeatBid; import io.vertx.core.MultiMap; -import io.vertx.core.http.HttpMethod; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; @@ -22,6 +21,8 @@ import org.prebid.server.bidder.model.BidderError; import org.prebid.server.bidder.model.HttpRequest; import org.prebid.server.bidder.model.Result; +import org.prebid.server.bidder.nextmillennium.proto.NextMillenniumExt; +import org.prebid.server.bidder.nextmillennium.proto.NextMillenniumExtBidder; import org.prebid.server.exception.PreBidException; import org.prebid.server.json.DecodeException; import org.prebid.server.json.JacksonMapper; @@ -31,8 +32,8 @@ import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidServer; import org.prebid.server.proto.openrtb.ext.request.ExtStoredRequest; import org.prebid.server.proto.openrtb.ext.request.nextmillennium.ExtImpNextMillennium; -import org.prebid.server.proto.openrtb.ext.request.nextmillennium.ExtRequestNextMillennium; import org.prebid.server.proto.openrtb.ext.response.BidType; +import org.prebid.server.util.BidderUtil; import org.prebid.server.util.HttpUtil; import org.prebid.server.util.ObjectUtil; import org.prebid.server.version.PrebidVersionProvider; @@ -41,6 +42,7 @@ import java.util.Collection; import java.util.List; import java.util.Objects; +import java.util.Optional; public class NextMillenniumBidder implements Bidder { @@ -59,6 +61,7 @@ public NextMillenniumBidder(String endpointUrl, JacksonMapper mapper, List nmmFlags, PrebidVersionProvider versionProvider) { + this.endpointUrl = HttpUtil.validateUrl(Objects.requireNonNull(endpointUrl)); this.mapper = Objects.requireNonNull(mapper); this.nmmFlags = nmmFlags; @@ -78,7 +81,12 @@ public final Result>> makeHttpRequests(BidRequest b errors.add(BidderError.badInput(e.getMessage())); continue; } - httpRequests.add(makeHttpRequest(updateBidRequest(bidRequest, extImpNextMillennium))); + final BidRequest updatedRequest = updateBidRequest(bidRequest, extImpNextMillennium); + httpRequests.add(BidderUtil.defaultRequest( + updatedRequest, + headers(), + endpointUrl, + mapper)); } return errors.isEmpty() ? Result.withValues(httpRequests) : Result.withErrors(errors); @@ -92,7 +100,7 @@ private ExtImpNextMillennium convertExt(ObjectNode impExt) { } } - private BidRequest updateBidRequest(BidRequest bidRequest, ExtImpNextMillennium ext) { + private BidRequest updateBidRequest1(BidRequest bidRequest, ExtImpNextMillennium ext) { final ExtStoredRequest storedRequest = ExtStoredRequest.of(resolveStoredRequestId(bidRequest, ext)); final ExtRequest requestExt = bidRequest.getExt(); final ExtRequestPrebid existingPrebid = requestExt != null ? requestExt.getPrebid() : null; @@ -106,7 +114,7 @@ private BidRequest updateBidRequest(BidRequest bidRequest, ExtImpNextMillennium final ExtRequest extRequest = ExtRequest.of(createdExtRequestPrebid); final ObjectNode nextMillenniumNode = mapper.mapper().valueToTree( - ExtRequestNextMillennium.of(nmmFlags, NM_ADAPTER_VERSION, versionProvider.getNameVersionRecord())); + NextMillenniumExtBidder.of(nmmFlags, NM_ADAPTER_VERSION, versionProvider.getNameVersionRecord())); extRequest.addProperty("nextMillennium", nextMillenniumNode); @@ -133,6 +141,19 @@ private BidRequest updateBidRequest(BidRequest bidRequest, ExtImpNextMillennium .build(); } + private BidRequest updateBidRequest(BidRequest bidRequest, ExtImpNextMillennium extImp) { + final String soredRequestId = resolveStoredRequestId(bidRequest, extImp); + final ExtRequestPrebidServer extRequestPrebidServer = Optional.ofNullable(bidRequest.getExt()) + .map(ExtRequest::getPrebid) + .map(ExtRequestPrebid::getServer) + .orElse(null); + + return bidRequest.toBuilder() + .imp(modifyFirstImp(bidRequest.getImp(), soredRequestId)) + .ext(createExtRequest(soredRequestId, extRequestPrebidServer)) + .build(); + } + private static String resolveStoredRequestId(BidRequest bidRequest, ExtImpNextMillennium extImpNextMillennium) { final String groupId = extImpNextMillennium.getGroupId(); if (StringUtils.isEmpty(groupId)) { @@ -170,14 +191,38 @@ private static String formatSize(Integer w, Integer h) { : null; } - private HttpRequest makeHttpRequest(BidRequest bidRequest) { - return HttpRequest.builder() - .method(HttpMethod.POST) - .uri(endpointUrl) - .headers(headers()) - .payload(bidRequest) - .body(mapper.encodeToBytes(bidRequest)) + private List modifyFirstImp(List imps, String storedRequestId) { + final ExtRequestPrebid extRequestPrebid = ExtRequestPrebid.builder() + .storedrequest(ExtStoredRequest.of(storedRequestId)) .build(); + + final NextMillenniumExt nextMillenniumExt = NextMillenniumExt.of( + NextMillenniumExtBidder.of(nmmFlags, null, null)); + + final ExtRequest extRequest = ExtRequest.of(extRequestPrebid); + mapper.fillExtension(extRequest, nextMillenniumExt); + + final ObjectNode impExt = mapper.mapper().valueToTree(extRequest); + + final List modifiedImps = new ArrayList<>(imps); + modifiedImps.set(0, imps.getFirst().toBuilder().ext(impExt).build()); + + return modifiedImps; + } + + private ExtRequest createExtRequest(String storedRequestId, ExtRequestPrebidServer extRequestPrebidServer) { + final ExtRequestPrebid extRequestPrebid = ExtRequestPrebid.builder() + .storedrequest(ExtStoredRequest.of(storedRequestId)) + .server(extRequestPrebidServer) + .build(); + + final NextMillenniumExt nextMillenniumExt = NextMillenniumExt.of( + NextMillenniumExtBidder.of(nmmFlags, NM_ADAPTER_VERSION, versionProvider.getNameVersionRecord())); + + final ExtRequest extRequest = ExtRequest.of(extRequestPrebid); + mapper.fillExtension(extRequest, nextMillenniumExt); + + return extRequest; } private static MultiMap headers() { diff --git a/src/main/java/org/prebid/server/bidder/nextmillennium/proto/NextMillenniumExt.java b/src/main/java/org/prebid/server/bidder/nextmillennium/proto/NextMillenniumExt.java new file mode 100644 index 00000000000..b5b8f58f6c2 --- /dev/null +++ b/src/main/java/org/prebid/server/bidder/nextmillennium/proto/NextMillenniumExt.java @@ -0,0 +1,11 @@ +package org.prebid.server.bidder.nextmillennium.proto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Value; + +@Value(staticConstructor = "of") +public class NextMillenniumExt { + + @JsonProperty("nextMillennium") + NextMillenniumExtBidder nextMillennium; +} diff --git a/src/main/java/org/prebid/server/proto/openrtb/ext/request/nextmillennium/ExtRequestNextMillennium.java b/src/main/java/org/prebid/server/bidder/nextmillennium/proto/NextMillenniumExtBidder.java similarity index 69% rename from src/main/java/org/prebid/server/proto/openrtb/ext/request/nextmillennium/ExtRequestNextMillennium.java rename to src/main/java/org/prebid/server/bidder/nextmillennium/proto/NextMillenniumExtBidder.java index 430db7997e3..1673fc5114d 100644 --- a/src/main/java/org/prebid/server/proto/openrtb/ext/request/nextmillennium/ExtRequestNextMillennium.java +++ b/src/main/java/org/prebid/server/bidder/nextmillennium/proto/NextMillenniumExtBidder.java @@ -1,4 +1,4 @@ -package org.prebid.server.proto.openrtb.ext.request.nextmillennium; +package org.prebid.server.bidder.nextmillennium.proto; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Value; @@ -6,7 +6,7 @@ import java.util.List; @Value(staticConstructor = "of") -public class ExtRequestNextMillennium { +public class NextMillenniumExtBidder { @JsonProperty("nmmFlags") List nmmFlags; diff --git a/src/test/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidderTest.java b/src/test/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidderTest.java index 35c9c064595..d67ea2f21dc 100644 --- a/src/test/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidderTest.java @@ -277,132 +277,6 @@ public void makeHttpRequestsWithInvalidImpsShouldReturnError() { assertThat(result.getValue()).isEmpty(); } - @Test - public void makeBidsShouldReturnBannerBidWhenMTypeIsOne() throws JsonProcessingException { - // given - final BidRequest bidRequest = givenBidRequest(identity()); - final BidderCall httpCall = givenHttpCall(bidRequest, - mapper.writeValueAsString(givenBidResponse(bidBuilder -> bidBuilder.mtype(1).impid("123")))); - - // when - final Result> result = target.makeBids(httpCall, bidRequest); - - // then - assertThat(result.getErrors()).isEmpty(); - assertThat(result.getValue()) - .containsExactly(BidderBid.of(Bid.builder().mtype(1).impid("123").build(), - BidType.banner, "USD")); - } - - @Test - public void makeBidsShouldReturnVideoBidWhenMTypeIsTwo() throws JsonProcessingException { - // given - final BidRequest bidRequest = givenBidRequest(identity()); - final BidderCall httpCall = givenHttpCall(bidRequest, - mapper.writeValueAsString(givenBidResponse(bidBuilder -> bidBuilder.mtype(2).impid("123")))); - - // when - final Result> result = target.makeBids(httpCall, bidRequest); - - // then - assertThat(result.getErrors()).isEmpty(); - assertThat(result.getValue()) - .containsExactly(BidderBid.of(Bid.builder().mtype(2).impid("123").build(), - BidType.video, "USD")); - } - - @Test - public void makeBidsShouldReturnErrorWhenMTypeIsUnknown() throws JsonProcessingException { - // given - final BidRequest bidRequest = givenBidRequest(identity()); - final BidderCall httpCall = givenHttpCall(bidRequest, - mapper.writeValueAsString(givenBidResponse(bidBuilder -> bidBuilder.mtype(999).impid("123")))); - - // when - final Result> result = target.makeBids(httpCall, bidRequest); - - // then - assertThat(result.getErrors()) - .contains(BidderError.badServerResponse("Unable to fetch mediaType 999 in multi-format: 123")); - assertThat(result.getValue()).isEmpty(); - } - - @Test - public void makeBidsShouldReturnErrorWhenMTypeIsMissing() throws JsonProcessingException { - // given - final BidRequest bidRequest = givenBidRequest(identity()); - final BidderCall httpCall = givenHttpCall(bidRequest, - mapper.writeValueAsString(givenBidResponse(bidBuilder -> bidBuilder.id("bidId").impid("123")))); - - // when - final Result> result = target.makeBids(httpCall, bidRequest); - - // then - assertThat(result.getErrors()).contains(BidderError.badServerResponse("Missing MType for bid: bidId")); - assertThat(result.getValue()).isEmpty(); - } - - @Test - public void makeBidsShouldReturnBothValidAndInvalidBidderBidAtTheSameTime() throws JsonProcessingException { - // given - final BidRequest bidRequest = givenBidRequest(identity()); - final BidderCall httpCall = givenHttpCall(givenBidRequest(identity()), - mapper.writeValueAsString(givenBidResponse( - bidBuilder -> bidBuilder.mtype(999).impid("123"), - bidBuilder -> bidBuilder.mtype(1).impid("312")))); - - // when - final Result> result = target.makeBids(httpCall, bidRequest); - - // then - assertThat(result.getErrors()) - .contains(BidderError.badServerResponse("Unable to fetch mediaType 999 in multi-format: 123")); - assertThat(result.getValue()) - .containsExactly(BidderBid.of(Bid.builder().mtype(1).impid("312").build(), - BidType.banner, "USD")); - } - - @Test - public void makeBidsWithZeroSeatBidsShouldReturnNoErrorsAndNoValues() throws JsonProcessingException { - // given - final BidRequest bidRequest = givenBidRequest(identity()); - final BidderCall httpCall = givenHttpCall(bidRequest, - mapper.writeValueAsString(BidResponse.builder() - .seatbid(emptyList()) - .build())); - - // when - final Result> result = target.makeBids(httpCall, bidRequest); - - // then - assertThat(result.getErrors()).isEmpty(); - assertThat(result.getValue()).isEmpty(); - } - - private static BidRequest givenBidRequest(UnaryOperator bidRequestCustomizer, - Imp... imps) { - - return bidRequestCustomizer.apply(BidRequest.builder().imp(asList(imps))).build(); - } - - @Test - public void makeBidsWithUnparsableBidResponseShouldReturnError() { - // given - final BidRequest bidRequest = givenBidRequest(identity()); - final BidderCall httpCall = givenHttpCall(bidRequest, - mapper.createArrayNode().toString()); - - // when - final Result> result = target.makeBids(httpCall, bidRequest); - - // then - assertThat(result.getErrors()).isNotEmpty() - .allSatisfy(bidderError -> { - assertThat(bidderError.getType()).isEqualTo(BidderError.Type.bad_server_response); - assertThat(bidderError.getMessage()).startsWith("Failed to decode:"); - }); - } - @Test public void makeHttpRequestsImpExtComparison() { // given @@ -540,6 +414,132 @@ public void makeHttpRequestsBidRequestShouldBeIdenticalExceptImpExt() { .isEqualTo(bidRequest); } + @Test + public void makeBidsShouldReturnBannerBidWhenMTypeIsOne() throws JsonProcessingException { + // given + final BidRequest bidRequest = givenBidRequest(identity()); + final BidderCall httpCall = givenHttpCall(bidRequest, + mapper.writeValueAsString(givenBidResponse(bidBuilder -> bidBuilder.mtype(1).impid("123")))); + + // when + final Result> result = target.makeBids(httpCall, bidRequest); + + // then + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getValue()) + .containsExactly(BidderBid.of(Bid.builder().mtype(1).impid("123").build(), + BidType.banner, "USD")); + } + + @Test + public void makeBidsShouldReturnVideoBidWhenMTypeIsTwo() throws JsonProcessingException { + // given + final BidRequest bidRequest = givenBidRequest(identity()); + final BidderCall httpCall = givenHttpCall(bidRequest, + mapper.writeValueAsString(givenBidResponse(bidBuilder -> bidBuilder.mtype(2).impid("123")))); + + // when + final Result> result = target.makeBids(httpCall, bidRequest); + + // then + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getValue()) + .containsExactly(BidderBid.of(Bid.builder().mtype(2).impid("123").build(), + BidType.video, "USD")); + } + + @Test + public void makeBidsShouldReturnErrorWhenMTypeIsUnknown() throws JsonProcessingException { + // given + final BidRequest bidRequest = givenBidRequest(identity()); + final BidderCall httpCall = givenHttpCall(bidRequest, + mapper.writeValueAsString(givenBidResponse(bidBuilder -> bidBuilder.mtype(999).impid("123")))); + + // when + final Result> result = target.makeBids(httpCall, bidRequest); + + // then + assertThat(result.getErrors()) + .contains(BidderError.badServerResponse("Unable to fetch mediaType 999 in multi-format: 123")); + assertThat(result.getValue()).isEmpty(); + } + + @Test + public void makeBidsShouldReturnErrorWhenMTypeIsMissing() throws JsonProcessingException { + // given + final BidRequest bidRequest = givenBidRequest(identity()); + final BidderCall httpCall = givenHttpCall(bidRequest, + mapper.writeValueAsString(givenBidResponse(bidBuilder -> bidBuilder.id("bidId").impid("123")))); + + // when + final Result> result = target.makeBids(httpCall, bidRequest); + + // then + assertThat(result.getErrors()).contains(BidderError.badServerResponse("Missing MType for bid: bidId")); + assertThat(result.getValue()).isEmpty(); + } + + @Test + public void makeBidsShouldReturnBothValidAndInvalidBidderBidAtTheSameTime() throws JsonProcessingException { + // given + final BidRequest bidRequest = givenBidRequest(identity()); + final BidderCall httpCall = givenHttpCall(givenBidRequest(identity()), + mapper.writeValueAsString(givenBidResponse( + bidBuilder -> bidBuilder.mtype(999).impid("123"), + bidBuilder -> bidBuilder.mtype(1).impid("312")))); + + // when + final Result> result = target.makeBids(httpCall, bidRequest); + + // then + assertThat(result.getErrors()) + .contains(BidderError.badServerResponse("Unable to fetch mediaType 999 in multi-format: 123")); + assertThat(result.getValue()) + .containsExactly(BidderBid.of(Bid.builder().mtype(1).impid("312").build(), + BidType.banner, "USD")); + } + + @Test + public void makeBidsWithZeroSeatBidsShouldReturnNoErrorsAndNoValues() throws JsonProcessingException { + // given + final BidRequest bidRequest = givenBidRequest(identity()); + final BidderCall httpCall = givenHttpCall(bidRequest, + mapper.writeValueAsString(BidResponse.builder() + .seatbid(emptyList()) + .build())); + + // when + final Result> result = target.makeBids(httpCall, bidRequest); + + // then + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getValue()).isEmpty(); + } + + @Test + public void makeBidsWithUnparsableBidResponseShouldReturnError() { + // given + final BidRequest bidRequest = givenBidRequest(identity()); + final BidderCall httpCall = givenHttpCall(bidRequest, + mapper.createArrayNode().toString()); + + // when + final Result> result = target.makeBids(httpCall, bidRequest); + + // then + assertThat(result.getErrors()).isNotEmpty() + .allSatisfy(bidderError -> { + assertThat(bidderError.getType()).isEqualTo(BidderError.Type.bad_server_response); + assertThat(bidderError.getMessage()).startsWith("Failed to decode:"); + }); + } + + private static BidRequest givenBidRequest(UnaryOperator bidRequestCustomizer, + Imp... imps) { + + return bidRequestCustomizer.apply(BidRequest.builder().imp(asList(imps))).build(); + } + private static Imp givenImp(UnaryOperator impCustomizer) { return impCustomizer.apply(Imp.builder()).build(); } From 8e6da2f3ba355054f171e7b45d870ff1bba3de0b Mon Sep 17 00:00:00 2001 From: pkaczmarek Date: Wed, 19 Mar 2025 13:22:08 +0100 Subject: [PATCH 09/12] fix comments --- .../nextmillennium/NextMillenniumBidder.java | 41 ------------------- 1 file changed, 41 deletions(-) diff --git a/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java b/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java index 60cacc38975..c026a6c271b 100644 --- a/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java +++ b/src/main/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidder.java @@ -100,47 +100,6 @@ private ExtImpNextMillennium convertExt(ObjectNode impExt) { } } - private BidRequest updateBidRequest1(BidRequest bidRequest, ExtImpNextMillennium ext) { - final ExtStoredRequest storedRequest = ExtStoredRequest.of(resolveStoredRequestId(bidRequest, ext)); - final ExtRequest requestExt = bidRequest.getExt(); - final ExtRequestPrebid existingPrebid = requestExt != null ? requestExt.getPrebid() : null; - final ExtRequestPrebidServer existingServer = existingPrebid != null ? existingPrebid.getServer() : null; - - final ExtRequestPrebid createdExtRequestPrebid = ExtRequestPrebid.builder() - .storedrequest(storedRequest) - .server(existingServer) - .build(); - - final ExtRequest extRequest = ExtRequest.of(createdExtRequestPrebid); - - final ObjectNode nextMillenniumNode = mapper.mapper().valueToTree( - NextMillenniumExtBidder.of(nmmFlags, NM_ADAPTER_VERSION, versionProvider.getNameVersionRecord())); - - extRequest.addProperty("nextMillennium", nextMillenniumNode); - - final Imp firstImp = bidRequest.getImp().getFirst(); - final ObjectNode updatedImpExt = mapper.mapper().createObjectNode(); - final ObjectNode impNextMillNode = nextMillenniumNode.deepCopy(); - impNextMillNode.retain("nmmFlags"); - updatedImpExt.set("nextMillennium", impNextMillNode); - - final ObjectNode prebidNode = mapper.mapper().createObjectNode(); - prebidNode.set("storedrequest", mapper.mapper().valueToTree(storedRequest)); - updatedImpExt.set("prebid", prebidNode); - - final Imp updatedImp = firstImp.toBuilder() - .ext(updatedImpExt) - .build(); - - final List updatedImps = new ArrayList<>(bidRequest.getImp()); - updatedImps.set(0, updatedImp); - - return bidRequest.toBuilder() - .imp(updatedImps) - .ext(extRequest) - .build(); - } - private BidRequest updateBidRequest(BidRequest bidRequest, ExtImpNextMillennium extImp) { final String soredRequestId = resolveStoredRequestId(bidRequest, extImp); final ExtRequestPrebidServer extRequestPrebidServer = Optional.ofNullable(bidRequest.getExt()) From fa02a9c85036d60d3ab54c08c40b410afda132a1 Mon Sep 17 00:00:00 2001 From: pkaczmarek Date: Tue, 1 Apr 2025 14:05:30 +0200 Subject: [PATCH 10/12] fix comments --- .../NextMillenniumBidderTest.java | 35 +++++++++++++++++++ .../prebid/server/it/NextMillenniumTest.java | 4 +-- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/src/test/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidderTest.java b/src/test/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidderTest.java index d67ea2f21dc..a0fe7c6ec49 100644 --- a/src/test/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidderTest.java @@ -26,6 +26,7 @@ import org.prebid.server.proto.openrtb.ext.ExtPrebid; import org.prebid.server.proto.openrtb.ext.request.ExtRequest; import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebid; +import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidServer; import org.prebid.server.proto.openrtb.ext.request.ExtRequestTargeting; import org.prebid.server.proto.openrtb.ext.request.ExtStoredRequest; import org.prebid.server.proto.openrtb.ext.request.nextmillennium.ExtImpNextMillennium; @@ -414,6 +415,40 @@ public void makeHttpRequestsBidRequestShouldBeIdenticalExceptImpExt() { .isEqualTo(bidRequest); } + @Test + public void makeHttpRequestsShouldPreserveExtPrebidServer() { + // given + final ExtRequestPrebidServer extRequestPrebidServer = ExtRequestPrebidServer.of( + "http://localhost:8080", + 1, + "dc-test", + "/openrtb2/auction" + ); + + final ExtRequest extRequest = ExtRequest.of(ExtRequestPrebid.builder() + .server(extRequestPrebidServer) + .build()); + + final BidRequest bidRequest = BidRequest.builder() + .id("test-request") + .imp(singletonList(givenImpWithExt( + imp -> imp.banner(Banner.builder().w(300).h(250).build()), + ExtImpNextMillennium.of("placement_id", null)))) + .ext(extRequest) + .build(); + + // when + final Result>> result = target.makeHttpRequests(bidRequest); + + // then + assertThat(result.getErrors()).isEmpty(); + final BidRequest resultingBidRequest = result.getValue().get(0).getPayload(); + + assertThat(resultingBidRequest.getExt()).isNotNull(); + assertThat(resultingBidRequest.getExt().getPrebid()).isNotNull(); + assertThat(resultingBidRequest.getExt().getPrebid().getServer()).isEqualTo(extRequestPrebidServer); + } + @Test public void makeBidsShouldReturnBannerBidWhenMTypeIsOne() throws JsonProcessingException { // given diff --git a/src/test/java/org/prebid/server/it/NextMillenniumTest.java b/src/test/java/org/prebid/server/it/NextMillenniumTest.java index 8bab75b5621..9c6ccac351a 100644 --- a/src/test/java/org/prebid/server/it/NextMillenniumTest.java +++ b/src/test/java/org/prebid/server/it/NextMillenniumTest.java @@ -20,9 +20,7 @@ public void openrtb2AuctionShouldRespondWithBidsFromNextMillennium() throws IOEx // given WIRE_MOCK_RULE.stubFor(post(urlPathEqualTo("/nextmillennium-exchange")) .withRequestBody(equalToJson( - jsonFrom("openrtb2/nextmillennium/test-nextmillennium-bid-request.json"), - true, - true)) + jsonFrom("openrtb2/nextmillennium/test-nextmillennium-bid-request.json"))) .willReturn(aResponse().withBody( jsonFrom("openrtb2/nextmillennium/test-nextmillennium-bid-response.json")))); From 95c2a5c7c360d5c979d313c3f48dfd263461194c Mon Sep 17 00:00:00 2001 From: pkaczmarek Date: Thu, 17 Apr 2025 13:08:38 +0200 Subject: [PATCH 11/12] fix comments --- .../nextmillennium/NextMillenniumBidderTest.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/test/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidderTest.java b/src/test/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidderTest.java index a0fe7c6ec49..19373369969 100644 --- a/src/test/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidderTest.java @@ -422,8 +422,7 @@ public void makeHttpRequestsShouldPreserveExtPrebidServer() { "http://localhost:8080", 1, "dc-test", - "/openrtb2/auction" - ); + "/openrtb2/auction"); final ExtRequest extRequest = ExtRequest.of(ExtRequestPrebid.builder() .server(extRequestPrebidServer) @@ -444,9 +443,12 @@ public void makeHttpRequestsShouldPreserveExtPrebidServer() { assertThat(result.getErrors()).isEmpty(); final BidRequest resultingBidRequest = result.getValue().get(0).getPayload(); - assertThat(resultingBidRequest.getExt()).isNotNull(); - assertThat(resultingBidRequest.getExt().getPrebid()).isNotNull(); - assertThat(resultingBidRequest.getExt().getPrebid().getServer()).isEqualTo(extRequestPrebidServer); + assertThat(result.getValue()) + .extracting(HttpRequest::getPayload) + .extracting(BidRequest::getExt) + .extracting(ExtRequest::getPrebid) + .extracting(ExtRequestPrebid::getServer) + .containsExactly(extRequestPrebidServer); } @Test From 4ac1dc436b8d912d9f225d805ac8ccc3a87c68a9 Mon Sep 17 00:00:00 2001 From: pkaczmarek Date: Thu, 17 Apr 2025 13:09:18 +0200 Subject: [PATCH 12/12] fix comments --- .../server/bidder/nextmillennium/NextMillenniumBidderTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/test/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidderTest.java b/src/test/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidderTest.java index 19373369969..71dfe2a8552 100644 --- a/src/test/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/nextmillennium/NextMillenniumBidderTest.java @@ -441,8 +441,6 @@ public void makeHttpRequestsShouldPreserveExtPrebidServer() { // then assertThat(result.getErrors()).isEmpty(); - final BidRequest resultingBidRequest = result.getValue().get(0).getPayload(); - assertThat(result.getValue()) .extracting(HttpRequest::getPayload) .extracting(BidRequest::getExt)