Skip to content

Commit

Permalink
Rubicon: Ability to disable sizeId processing logic (#3307)
Browse files Browse the repository at this point in the history
  • Loading branch information
SerhiiNahornyi authored Jul 17, 2024
1 parent 013c155 commit 368cc05
Show file tree
Hide file tree
Showing 8 changed files with 81 additions and 23 deletions.
26 changes: 19 additions & 7 deletions src/main/java/org/prebid/server/bidder/rubicon/RubiconBidder.java
Original file line number Diff line number Diff line change
Expand Up @@ -182,6 +182,7 @@ public class RubiconBidder implements Bidder<BidRequest> {
private final String endpointUrl;
private final Set<String> supportedVendors;
private final boolean generateBidId;
private final boolean useVideoSizeLogic;
private final CurrencyConversionService currencyConversionService;
private final PriceFloorResolver floorResolver;
private final JacksonMapper mapper;
Expand All @@ -194,6 +195,7 @@ public RubiconBidder(String bidderName,
String xapiPassword,
List<String> supportedVendors,
boolean generateBidId,
boolean useVideoSizeLogic,
CurrencyConversionService currencyConversionService,
PriceFloorResolver floorResolver,
JacksonMapper mapper) {
Expand All @@ -202,6 +204,7 @@ public RubiconBidder(String bidderName,
this.endpointUrl = HttpUtil.validateUrl(Objects.requireNonNull(endpoint));
this.supportedVendors = Set.copyOf(Objects.requireNonNull(supportedVendors));
this.generateBidId = generateBidId;
this.useVideoSizeLogic = useVideoSizeLogic;
this.currencyConversionService = Objects.requireNonNull(currencyConversionService);
this.floorResolver = Objects.requireNonNull(floorResolver);
this.mapper = Objects.requireNonNull(mapper);
Expand Down Expand Up @@ -987,12 +990,7 @@ private Video makeVideo(Imp imp, RubiconVideoParams rubiconVideoParams, String r

final Integer skip = rubiconVideoParams != null ? rubiconVideoParams.getSkip() : null;
final Integer skipDelay = rubiconVideoParams != null ? rubiconVideoParams.getSkipdelay() : null;
final Integer sizeId = rubiconVideoParams != null ? rubiconVideoParams.getSizeId() : null;

final Integer resolvedSizeId = BidderUtil.isNullOrZero(sizeId)
? resolveVideoSizeId(video.getPlacement(), imp.getInstl())
: sizeId;
validateVideoSizeId(resolvedSizeId, referer, imp.getId());
final Integer resolvedSizeId = useVideoSizeLogic ? resolveSizeId(rubiconVideoParams, imp, referer) : null;

final Integer rewarded = imp.getRwdd();
final String videoType = rewarded != null && rewarded == 1 ? "rewarded" : null;
Expand All @@ -1004,10 +1002,24 @@ private Video makeVideo(Imp imp, RubiconVideoParams rubiconVideoParams, String r

return video.toBuilder()
.ext(mapper.mapper().valueToTree(
RubiconVideoExt.of(skip, skipDelay, RubiconVideoExtRp.of(resolvedSizeId), videoType)))
RubiconVideoExt.of(skip,
skipDelay,
resolvedSizeId != null ? RubiconVideoExtRp.of(resolvedSizeId) : null,
videoType)))
.build();
}

private Integer resolveSizeId(RubiconVideoParams rubiconVideoParams, Imp imp, String referer) {
final Integer sizeId = rubiconVideoParams != null ? rubiconVideoParams.getSizeId() : null;
final Video video = imp.getVideo();
final Integer resolvedSizeId = BidderUtil.isNullOrZero(sizeId)
? resolveVideoSizeId(video.getPlacement(), imp.getInstl())
: sizeId;
validateVideoSizeId(resolvedSizeId, referer, imp.getId());

return resolvedSizeId;
}

private static void validateVideoSizeId(Integer resolvedSizeId, String referer, String impId) {
// log only 1% of cases to monitor how often video impressions does not have size id
if (resolvedSizeId == null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ BidderDeps rubiconBidderDeps(RubiconConfigurationProperties rubiconConfiguration
config.getXapi().getPassword(),
config.getMetaInfo().getSupportedVendors(),
config.getGenerateBidId(),
config.getUseVideoSizeIdLogic(),
currencyConversionService,
floorResolver,
mapper))
Expand All @@ -71,6 +72,9 @@ private static class RubiconConfigurationProperties extends BidderConfigurationP

@NotNull
private Boolean generateBidId;

@NotNull
private Boolean useVideoSizeIdLogic;
}

@Data
Expand Down
1 change: 1 addition & 0 deletions src/main/resources/bidder-config/rubicon.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ adapters:
url: [email protected]
support-cors: false
generate-bid-id: false
use-video-size-id-logic: true
XAPI:
Username: [email protected]
Password: [email protected]
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
import com.iab.openrtb.response.Bid;
import com.iab.openrtb.response.BidResponse;
import com.iab.openrtb.response.SeatBid;
import org.junit.Test;
import org.junit.jupiter.api.Test;
import org.prebid.server.VertxTest;
import org.prebid.server.bidder.model.BidderBid;
import org.prebid.server.bidder.model.BidderCall;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import com.iab.openrtb.response.Bid;
import com.iab.openrtb.response.BidResponse;
import com.iab.openrtb.response.SeatBid;
import org.junit.Test;
import org.junit.jupiter.api.Test;
import org.prebid.server.VertxTest;
import org.prebid.server.bidder.model.BidderBid;
import org.prebid.server.bidder.model.BidderCall;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -162,15 +162,31 @@ public class RubiconBidderTest extends VertxTest {

@BeforeEach
public void setUp() {
target = new RubiconBidder(BIDDER_NAME, ENDPOINT_URL, USERNAME, PASSWORD, SUPPORTED_VENDORS, false,
currencyConversionService, priceFloorResolver, jacksonMapper);
target = new RubiconBidder(BIDDER_NAME,
ENDPOINT_URL,
USERNAME,
PASSWORD,
SUPPORTED_VENDORS,
false,
true,
currencyConversionService,
priceFloorResolver,
jacksonMapper);
}

@Test
public void creationShouldFailOnInvalidEndpointUrl() {
assertThatIllegalArgumentException().isThrownBy(
() -> new RubiconBidder(BIDDER_NAME, "invalid_url", USERNAME, PASSWORD, SUPPORTED_VENDORS, false,
currencyConversionService, priceFloorResolver, jacksonMapper));
() -> new RubiconBidder(BIDDER_NAME,
"invalid_url",
USERNAME,
PASSWORD,
SUPPORTED_VENDORS,
false,
true,
currencyConversionService,
priceFloorResolver,
jacksonMapper));
}

@Test
Expand Down Expand Up @@ -810,6 +826,37 @@ public void makeHttpRequestsShouldIgnoreBidRequestIfCurrencyServiceThrowsAnExcep
+ " for imp `impId` with a reason: failed", BidderError.Type.bad_input));
}

@Test
public void shouldNotSetSizeIfVideoSizeProcessingLogicIsDisabled() {
// given
target = new RubiconBidder(
BIDDER_NAME,
ENDPOINT_URL,
USERNAME,
PASSWORD,
SUPPORTED_VENDORS,
true,
false,
currencyConversionService,
priceFloorResolver,
jacksonMapper);
final BidRequest bidRequest = givenBidRequest(
builder -> builder.instl(1).video(Video.builder().placement(1).build()),
builder -> builder.video(RubiconVideoParams.builder().sizeId(null).build()));

// when
final Result<List<HttpRequest<BidRequest>>> result = target.makeHttpRequests(bidRequest);

// then
assertThat(result.getErrors()).isEmpty();
assertThat(result.getValue()).hasSize(1).doesNotContainNull()
.extracting(httpRequest -> mapper.readValue(httpRequest.getBody(), BidRequest.class))
.flatExtracting(BidRequest::getImp)
.extracting(Imp::getVideo).doesNotContainNull()
.extracting(Video::getExt)
.containsOnlyNulls();
}

@Test
public void shouldSetSizeIdTo201IfPlacementIs1AndSizeIdIsNotPresent() {
// given
Expand Down Expand Up @@ -3638,7 +3685,7 @@ public void makeBidsShouldReturnNativeBidIfNativeIsPresent() throws JsonProcessi
public void makeBidsShouldReturnBidWithRandomlyGeneratedId() throws JsonProcessingException {
// given
target = new RubiconBidder(
BIDDER_NAME, ENDPOINT_URL, USERNAME, PASSWORD, SUPPORTED_VENDORS, true,
BIDDER_NAME, ENDPOINT_URL, USERNAME, PASSWORD, SUPPORTED_VENDORS, true, true,
currencyConversionService, priceFloorResolver, jacksonMapper);

final BidderCall<BidRequest> httpCall = givenHttpCall(givenBidRequest(identity()),
Expand All @@ -3664,7 +3711,7 @@ public void makeBidsShouldReturnBidWithRandomlyGeneratedId() throws JsonProcessi
public void makeBidsShouldReturnBidWithCurrencyFromBidResponse() throws JsonProcessingException {
// given
target = new RubiconBidder(
BIDDER_NAME, ENDPOINT_URL, USERNAME, PASSWORD, SUPPORTED_VENDORS, true,
BIDDER_NAME, ENDPOINT_URL, USERNAME, PASSWORD, SUPPORTED_VENDORS, true, true,
currencyConversionService, priceFloorResolver, jacksonMapper);

final BidderCall<BidRequest> httpCall = givenHttpCall(givenBidRequest(identity()),
Expand Down
5 changes: 1 addition & 4 deletions src/test/java/org/prebid/server/it/AdmaticTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,8 @@

import io.restassured.response.Response;
import org.json.JSONException;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.jupiter.api.Test;
import org.prebid.server.model.Endpoint;
import org.springframework.test.context.junit4.SpringRunner;

import java.io.IOException;
import java.util.List;
Expand All @@ -16,7 +14,6 @@
import static com.github.tomakehurst.wiremock.client.WireMock.post;
import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo;

@RunWith(SpringRunner.class)
public class AdmaticTest extends IntegrationTest {

@Test
Expand Down
5 changes: 1 addition & 4 deletions src/test/java/org/prebid/server/it/DriftpixelTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,8 @@

import io.restassured.response.Response;
import org.json.JSONException;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.jupiter.api.Test;
import org.prebid.server.model.Endpoint;
import org.springframework.test.context.junit4.SpringRunner;

import java.io.IOException;
import java.util.List;
Expand All @@ -16,7 +14,6 @@
import static com.github.tomakehurst.wiremock.client.WireMock.post;
import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo;

@RunWith(SpringRunner.class)
public class DriftpixelTest extends IntegrationTest {

@Test
Expand Down

0 comments on commit 368cc05

Please sign in to comment.