From 25be50c6368a9240d3d3b367094febcc7898a563 Mon Sep 17 00:00:00 2001 From: antonbabak Date: Fri, 13 Jun 2025 15:31:32 +0200 Subject: [PATCH] FreewheelSSP: new alias fwssp --- .../freewheelssp/ExtImpFreewheelSSP.java | 6 ++ .../resources/bidder-config/freewheelssp.yaml | 5 ++ .../resources/static/bidder-params/fwssp.json | 25 +++++++++ .../freewheelssp/FreewheelSSPBidderTest.java | 12 ++-- .../java/org/prebid/server/it/FwsspTest.java | 35 ++++++++++++ .../fwssp/test-auction-fwssp-request.json | 29 ++++++++++ .../fwssp/test-auction-fwssp-response.json | 40 +++++++++++++ .../fwssp/test-fwssp-bid-request.json | 56 +++++++++++++++++++ .../fwssp/test-fwssp-bid-response.json | 19 +++++++ .../server/it/test-application.properties | 2 + 10 files changed, 225 insertions(+), 4 deletions(-) create mode 100644 src/main/resources/static/bidder-params/fwssp.json create mode 100644 src/test/java/org/prebid/server/it/FwsspTest.java create mode 100644 src/test/resources/org/prebid/server/it/openrtb2/fwssp/test-auction-fwssp-request.json create mode 100644 src/test/resources/org/prebid/server/it/openrtb2/fwssp/test-auction-fwssp-response.json create mode 100644 src/test/resources/org/prebid/server/it/openrtb2/fwssp/test-fwssp-bid-request.json create mode 100644 src/test/resources/org/prebid/server/it/openrtb2/fwssp/test-fwssp-bid-response.json diff --git a/src/main/java/org/prebid/server/proto/openrtb/ext/request/freewheelssp/ExtImpFreewheelSSP.java b/src/main/java/org/prebid/server/proto/openrtb/ext/request/freewheelssp/ExtImpFreewheelSSP.java index eb297969465..f5d0276f429 100644 --- a/src/main/java/org/prebid/server/proto/openrtb/ext/request/freewheelssp/ExtImpFreewheelSSP.java +++ b/src/main/java/org/prebid/server/proto/openrtb/ext/request/freewheelssp/ExtImpFreewheelSSP.java @@ -8,4 +8,10 @@ public class ExtImpFreewheelSSP { @JsonProperty("zoneId") String zoneId; + + String customSiteSectionId; + + String networkId; + + String profileId; } diff --git a/src/main/resources/bidder-config/freewheelssp.yaml b/src/main/resources/bidder-config/freewheelssp.yaml index b198a837a9c..d657e641adc 100644 --- a/src/main/resources/bidder-config/freewheelssp.yaml +++ b/src/main/resources/bidder-config/freewheelssp.yaml @@ -3,6 +3,11 @@ adapters: endpoint: https://ads.stickyadstv.com/openrtb/dsp ortb-version: "2.6" modifying-vast-xml-allowed: true + aliases: + fwssp: + enabled: false + endpoint: "https://prebid.v.fwmrm.net/ortb/ssp" + endpoint-compression: gzip meta-info: maintainer-email: prebid-maintainer@freewheel.com app-media-types: diff --git a/src/main/resources/static/bidder-params/fwssp.json b/src/main/resources/static/bidder-params/fwssp.json new file mode 100644 index 00000000000..8c791621e76 --- /dev/null +++ b/src/main/resources/static/bidder-params/fwssp.json @@ -0,0 +1,25 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "FWSSP Adapter Params", + "description": "A schema which validates params accepted by the FWSSP adapter", + "type": "object", + "properties": { + "custom_site_section_id": { + "type": "string", + "description": "custom Site Section tag (e.g. ss_12345) or numeric Site Section ID (e.g. 12345)" + }, + "network_id": { + "type": "string", + "description": "Network ID (e.g. 12345)" + }, + "profile_id": { + "type": "string", + "description": "The value should contain a profile name. and NOT a numeric profile ID. This can either include the network ID prefix (e.g. 123456:profile_name_xyz123) or with the profile name alone (e.g. profile_name_xyz123)" + } + }, + "required": [ + "custom_site_section_id", + "network_id", + "profile_id" + ] +} diff --git a/src/test/java/org/prebid/server/bidder/freewheelssp/FreewheelSSPBidderTest.java b/src/test/java/org/prebid/server/bidder/freewheelssp/FreewheelSSPBidderTest.java index ee16abe138f..ca50d10078b 100644 --- a/src/test/java/org/prebid/server/bidder/freewheelssp/FreewheelSSPBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/freewheelssp/FreewheelSSPBidderTest.java @@ -73,13 +73,16 @@ public void makeHttpRequestsShouldModifyImps() { final Result>> result = target.makeHttpRequests(bidRequest); // then + final Map expectedImpExt = Map.of( + "zoneId", "zoneId", + "custom_site_section_id", "customSiteSectionId", + "network_id", "networkId", + "profile_id", "profileId"); assertThat(result.getValue()) .extracting(HttpRequest::getPayload) .flatExtracting(BidRequest::getImp) .extracting(Imp::getExt) - .containsExactly( - mapper.valueToTree(Map.of("zoneId", "1")), - mapper.valueToTree(Map.of("zoneId", "1"))); + .containsExactly(mapper.valueToTree(expectedImpExt), mapper.valueToTree(expectedImpExt)); assertThat(result.getErrors()).isEmpty(); } @@ -197,7 +200,8 @@ private static BidRequest givenBidRequest(Imp... imps) { private static Imp givenImp(UnaryOperator impCustomizer) { return impCustomizer.apply(Imp.builder() .id("123") - .ext(mapper.valueToTree(ExtPrebid.of(null, ExtImpFreewheelSSP.of("1"))))) + .ext(mapper.valueToTree(ExtPrebid.of(null, ExtImpFreewheelSSP.of( + "zoneId", "customSiteSectionId", "networkId", "profileId"))))) .build(); } diff --git a/src/test/java/org/prebid/server/it/FwsspTest.java b/src/test/java/org/prebid/server/it/FwsspTest.java new file mode 100644 index 00000000000..45bba896a06 --- /dev/null +++ b/src/test/java/org/prebid/server/it/FwsspTest.java @@ -0,0 +1,35 @@ +package org.prebid.server.it; + +import io.restassured.response.Response; +import org.json.JSONException; +import org.junit.jupiter.api.Test; +import org.prebid.server.model.Endpoint; + +import java.io.IOException; + +import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; +import static com.github.tomakehurst.wiremock.client.WireMock.equalToJson; +import static com.github.tomakehurst.wiremock.client.WireMock.post; +import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo; +import static java.util.Collections.singletonList; + +public class FwsspTest extends IntegrationTest { + + @Test + public void openrtb2AuctionShouldRespondWithBidsFromFwssp() throws IOException, JSONException { + // given + WIRE_MOCK_RULE.stubFor(post(urlPathEqualTo("/fwssp-exchange")) + .withRequestBody(equalToJson( + jsonFrom("openrtb2/fwssp/test-fwssp-bid-request.json"))) + .willReturn(aResponse().withBody( + jsonFrom("openrtb2/fwssp/test-fwssp-bid-response.json")))); + + // when + final Response response = responseFor("openrtb2/fwssp/test-auction-fwssp-request.json", + Endpoint.openrtb2_auction); + + // then + assertJsonEquals("openrtb2/fwssp/test-auction-fwssp-response.json", response, + singletonList("fwssp")); + } +} diff --git a/src/test/resources/org/prebid/server/it/openrtb2/fwssp/test-auction-fwssp-request.json b/src/test/resources/org/prebid/server/it/openrtb2/fwssp/test-auction-fwssp-request.json new file mode 100644 index 00000000000..e0feff74147 --- /dev/null +++ b/src/test/resources/org/prebid/server/it/openrtb2/fwssp/test-auction-fwssp-request.json @@ -0,0 +1,29 @@ +{ + "id": "request_id", + "imp": [ + { + "id": "imp-1", + "video": { + "mimes": ["video/mp4"], + "w": 300, + "h": 250 + }, + "ext": { + "fwssp": { + "profile_id": "123", + "network_id": "456", + "custom_site_section_id": "789" + } + } + } + ], + "tmax": 5000, + "cur": [ + "USD" + ], + "regs": { + "ext": { + "gdpr": 0 + } + } +} diff --git a/src/test/resources/org/prebid/server/it/openrtb2/fwssp/test-auction-fwssp-response.json b/src/test/resources/org/prebid/server/it/openrtb2/fwssp/test-auction-fwssp-response.json new file mode 100644 index 00000000000..02ac48d5c2c --- /dev/null +++ b/src/test/resources/org/prebid/server/it/openrtb2/fwssp/test-auction-fwssp-response.json @@ -0,0 +1,40 @@ +{ + "id": "request_id", + "seatbid": [ + { + "bid": [ + { + "id": "12345_fwssp-test_1", + "impid": "imp-1", + "exp": 1500, + "price": 1.0, + "adid": "7857", + "adm": "", + "cid": "4001", + "crid": "7857", + "ext": { + "prebid": { + "type": "video", + "meta": { + "adaptercode": "fwssp" + } + }, + "origbidcpm": 1 + } + } + ], + "seat": "fwssp", + "group": 0 + } + ], + "cur": "USD", + "ext": { + "responsetimemillis": { + "fwssp": "{{ fwssp.response_time_ms }}" + }, + "prebid": { + "auctiontimestamp": 0 + }, + "tmaxrequest": 5000 + } +} diff --git a/src/test/resources/org/prebid/server/it/openrtb2/fwssp/test-fwssp-bid-request.json b/src/test/resources/org/prebid/server/it/openrtb2/fwssp/test-fwssp-bid-request.json new file mode 100644 index 00000000000..b78419009fc --- /dev/null +++ b/src/test/resources/org/prebid/server/it/openrtb2/fwssp/test-fwssp-bid-request.json @@ -0,0 +1,56 @@ +{ + "id": "request_id", + "imp": [ + { + "id": "imp-1", + "video": { + "mimes": [ + "video/mp4" + ], + "w": 300, + "h": 250 + }, + "secure": 1, + "ext": { + "profile_id": "123", + "network_id": "456", + "custom_site_section_id": "789" + } + } + ], + "source": { + "tid": "${json-unit.any-string}" + }, + "site": { + "domain": "www.example.com", + "page": "http://www.example.com", + "publisher": { + "domain": "example.com" + }, + "ext": { + "amp": 0 + } + }, + "device": { + "ua": "userAgent", + "ip": "193.168.244.1" + }, + "at": 1, + "tmax": "${json-unit.any-number}", + "cur": [ + "USD" + ], + "regs" : { + "gdpr" : 0 + }, + "ext": { + "prebid": { + "server": { + "externalurl": "http://localhost:8080", + "gvlid": 1, + "datacenter": "local", + "endpoint": "/openrtb2/auction" + } + } + } +} diff --git a/src/test/resources/org/prebid/server/it/openrtb2/fwssp/test-fwssp-bid-response.json b/src/test/resources/org/prebid/server/it/openrtb2/fwssp/test-fwssp-bid-response.json new file mode 100644 index 00000000000..4ad4c804c45 --- /dev/null +++ b/src/test/resources/org/prebid/server/it/openrtb2/fwssp/test-fwssp-bid-response.json @@ -0,0 +1,19 @@ +{ + "id": "request_id", + "seatbid": [ + { + "bid": [ + { + "id": "12345_fwssp-test_1", + "impid": "imp-1", + "price": 1.0, + "adid": "7857", + "adm": "", + "cid": "4001", + "crid": "7857" + } + ], + "type": "video" + } + ] +} diff --git a/src/test/resources/org/prebid/server/it/test-application.properties b/src/test/resources/org/prebid/server/it/test-application.properties index 717b0c09445..a077d47ca19 100644 --- a/src/test/resources/org/prebid/server/it/test-application.properties +++ b/src/test/resources/org/prebid/server/it/test-application.properties @@ -234,6 +234,8 @@ adapters.audiencenetwork.platform-id=101 adapters.audiencenetwork.app-secret=67234 adapters.freewheelssp.enabled=true adapters.freewheelssp.endpoint=http://localhost:8090/freewheelssp-exchange +adapters.freewheelssp.aliases.fwssp.enabled=true +adapters.freewheelssp.aliases.fwssp.endpoint=http://localhost:8090/fwssp-exchange adapters.frvradn.enabled=true adapters.frvradn.endpoint=http://localhost:8090/frvradn-exchange adapters.gamma.enabled=true