Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 6 additions & 10 deletions src/main/java/org/prebid/server/auction/ImpAdjuster.java
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
package org.prebid.server.auction;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.IntNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.iab.openrtb.request.Imp;
import org.prebid.server.json.JacksonMapper;
import org.prebid.server.json.JsonMerger;
import org.prebid.server.util.StreamUtil;
import org.prebid.server.validation.ImpValidator;

import java.util.Iterator;
Expand Down Expand Up @@ -81,16 +79,14 @@ private void setAeParams(ObjectNode ext) {

final boolean extIgsAePresent = Optional.ofNullable(ext)
.map(extNode -> extNode.get(EXT_IGS))
.filter(JsonNode::isArray)
.stream()
.flatMap(extNode -> StreamUtil.asStream(extNode.spliterator()))
.filter(Objects::nonNull)
.anyMatch(igsElementNode -> igsElementNode.has(EXT_AE));
.map(igsNode -> igsNode.get(EXT_AE))
.isPresent();

if (!extIgsAePresent && (extAe == 0 || extAe == 1)) {
final ArrayNode extIgs = jacksonMapper.mapper().createArrayNode();
extIgs.add(jacksonMapper.mapper().createObjectNode().set(EXT_AE, IntNode.valueOf(extAe)));
ext.set(EXT_IGS, extIgs);
final ObjectNode igsNode = jacksonMapper.mapper().createObjectNode()
.set(EXT_AE, IntNode.valueOf(extAe));

ext.set(EXT_IGS, igsNode);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ class ImpExt {
String skadn
String general
@JsonProperty("igs")
List<InterestGroupAuctionSupport> interestGroupAuctionSupports
InterestGroupAuctionSupport interestGroupAuctionSupports
AnyUnsupportedBidder anyUnsupportedBidder

static ImpExt getDefaultImpExt() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -872,7 +872,7 @@ class BidderParamsSpec extends BaseSpec {
prebid.bidder.generic = null
prebid.adUnitCode = PBSUtils.randomString
generic = new Generic()
auctionEnvironment = PBSUtils.getRandomEnum(AuctionEnvironment)
auctionEnvironment = PBSUtils.getRandomEnum(AuctionEnvironment, [AuctionEnvironment.SERVER_ORCHESTRATED, AuctionEnvironment.UNKNOWN])
all = PBSUtils.randomNumber
context = new ImpExtContext(data: new ImpExtContextData())
data = new ImpExtContextData(pbAdSlot: PBSUtils.randomString)
Expand Down Expand Up @@ -1025,8 +1025,8 @@ class BidderParamsSpec extends BaseSpec {

def "PBS should send request to bidder when adapters.bidder.aliases.bidder.meta-info.currency-accepted not specified"() {
given: "PBS with adapter configuration"
def pbsConfig = ["adapters.generic.aliases.alias.enabled": "true",
"adapters.generic.aliases.alias.endpoint": "$networkServiceContainer.rootUri/auction".toString(),
def pbsConfig = ["adapters.generic.aliases.alias.enabled" : "true",
"adapters.generic.aliases.alias.endpoint" : "$networkServiceContainer.rootUri/auction".toString(),
"adapters.generic.aliases.alias.meta-info.currency-accepted": ""]
def pbsService = pbsServiceFactory.getService(pbsConfig)

Expand Down Expand Up @@ -1144,8 +1144,8 @@ class BidderParamsSpec extends BaseSpec {

def "PBS should send request to bidder when adapters.bidder.aliases.bidder.meta-info.currency-accepted intersect with requested currency"() {
given: "PBS with adapter configuration"
def pbsConfig = ["adapters.generic.aliases.alias.enabled": "true",
"adapters.generic.aliases.alias.endpoint": "$networkServiceContainer.rootUri/auction".toString(),
def pbsConfig = ["adapters.generic.aliases.alias.enabled" : "true",
"adapters.generic.aliases.alias.endpoint" : "$networkServiceContainer.rootUri/auction".toString(),
"adapters.generic.aliases.alias.meta-info.currency-accepted": "${USD},${EUR}".toString()]
def pbsService = pbsServiceFactory.getService(pbsConfig)

Expand Down Expand Up @@ -1188,8 +1188,8 @@ class BidderParamsSpec extends BaseSpec {

def "PBS shouldn't send request to bidder and emit warning when adapters.bidder.aliases.bidder.meta-info.currency-accepted not intersect with requested currency"() {
given: "PBS with adapter configuration"
def pbsConfig = ["adapters.generic.aliases.alias.enabled": "true",
"adapters.generic.aliases.alias.endpoint": "$networkServiceContainer.rootUri/auction".toString(),
def pbsConfig = ["adapters.generic.aliases.alias.enabled" : "true",
"adapters.generic.aliases.alias.endpoint" : "$networkServiceContainer.rootUri/auction".toString(),
"adapters.generic.aliases.alias.meta-info.currency-accepted": "${JPY},${CHF}".toString()]
def pbsService = pbsServiceFactory.getService(pbsConfig)

Expand Down Expand Up @@ -1242,7 +1242,7 @@ class BidderParamsSpec extends BaseSpec {
def bidRequest = BidRequest.defaultBidRequest.tap {
imp[0].ext.tap {
auctionEnvironment = requestedAuctionEnvironment
interestGroupAuctionSupports = [new InterestGroupAuctionSupport(auctionEnvironment: null)]
interestGroupAuctionSupports = new InterestGroupAuctionSupport(auctionEnvironment: null)
}
}

Expand All @@ -1252,7 +1252,7 @@ class BidderParamsSpec extends BaseSpec {
then: "Bidder request should imp[].{ae/ext.igs.ae} same value as requested"
def bidderRequest = bidder.getBidderRequest(bidRequest.id)
assert bidderRequest.imp[0].ext.auctionEnvironment == requestedAuctionEnvironment
assert bidderRequest.imp[0].ext.interestGroupAuctionSupports[0].auctionEnvironment == requestedAuctionEnvironment
assert bidderRequest.imp[0].ext.interestGroupAuctionSupports.auctionEnvironment == requestedAuctionEnvironment

where:
requestedAuctionEnvironment << [NOT_SUPPORTED, DEVICE_ORCHESTRATED]
Expand All @@ -1263,7 +1263,7 @@ class BidderParamsSpec extends BaseSpec {
def bidRequest = BidRequest.defaultBidRequest.tap {
imp[0].ext.tap {
auctionEnvironment = requestedAuctionEnvironment
interestGroupAuctionSupports = [new InterestGroupAuctionSupport(auctionEnvironment: null)]
interestGroupAuctionSupports = new InterestGroupAuctionSupport(auctionEnvironment: null)
}
}

Expand All @@ -1273,20 +1273,20 @@ class BidderParamsSpec extends BaseSpec {
then: "Bidder request should imp[].ae same value as requested"
def bidderRequest = bidder.getBidderRequest(bidRequest.id)
assert bidderRequest.imp[0].ext.auctionEnvironment == requestedAuctionEnvironment
assert !bidderRequest.imp[0].ext.interestGroupAuctionSupports[0].auctionEnvironment
assert !bidderRequest.imp[0].ext.interestGroupAuctionSupports.auctionEnvironment

where:
requestedAuctionEnvironment << [SERVER_ORCHESTRATED, UNKNOWN]
}

def "PBS shouldn't change auction environment in imp.ext.igs when it is present in both imp.ext and imp.ext.igs"() {
given: "Default bid request with populated imp.ext"
def extAuctionEnv = PBSUtils.getRandomEnum(AuctionEnvironment)
def extIgsAuctionEnv = PBSUtils.getRandomEnum(AuctionEnvironment)
def extAuctionEnv = PBSUtils.getRandomEnum(AuctionEnvironment, [SERVER_ORCHESTRATED, UNKNOWN])
def extIgsAuctionEnv = PBSUtils.getRandomEnum(AuctionEnvironment, [SERVER_ORCHESTRATED, UNKNOWN])
def bidRequest = BidRequest.defaultBidRequest.tap {
imp[0].ext.tap {
auctionEnvironment = extAuctionEnv
interestGroupAuctionSupports = [new InterestGroupAuctionSupport(auctionEnvironment: extIgsAuctionEnv)]
interestGroupAuctionSupports = new InterestGroupAuctionSupport(auctionEnvironment: extIgsAuctionEnv)
}
}

Expand All @@ -1296,6 +1296,6 @@ class BidderParamsSpec extends BaseSpec {
then: "Bidder request should imp[].{ae/ext.igs.ae} same value as requested"
def bidderRequest = bidder.getBidderRequest(bidRequest.id)
assert bidderRequest.imp[0].ext.auctionEnvironment == extAuctionEnv
assert bidderRequest.imp[0].ext.interestGroupAuctionSupports[0].auctionEnvironment == extIgsAuctionEnv
assert bidderRequest.imp[0].ext.interestGroupAuctionSupports.auctionEnvironment == extIgsAuctionEnv
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ import org.prebid.server.functional.model.bidder.Openx
import org.prebid.server.functional.model.config.AccountAuctionConfig
import org.prebid.server.functional.model.config.AccountConfig
import org.prebid.server.functional.model.db.Account
import org.prebid.server.functional.model.request.auction.AuctionEnvironment
import org.prebid.server.functional.model.request.auction.BidRequest
import org.prebid.server.functional.model.request.auction.InterestGroupAuctionSupport
import org.prebid.server.functional.model.request.auction.PaaFormat
import org.prebid.server.functional.model.response.auction.InterestGroupAuctionBuyer
import org.prebid.server.functional.model.response.auction.InterestGroupAuctionBuyerExt
Expand All @@ -24,6 +26,7 @@ import java.time.Instant
import static org.prebid.server.functional.model.bidder.BidderName.OPENX
import static org.prebid.server.functional.model.bidder.BidderName.OPENX_ALIAS
import static org.prebid.server.functional.model.bidder.BidderName.WILDCARD
import static org.prebid.server.functional.model.request.auction.AuctionEnvironment.*
import static org.prebid.server.functional.model.request.auction.AuctionEnvironment.DEVICE_ORCHESTRATED
import static org.prebid.server.functional.model.request.auction.AuctionEnvironment.NOT_SUPPORTED
import static org.prebid.server.functional.model.request.auction.PaaFormat.IAB
Expand All @@ -41,6 +44,12 @@ class OpenxSpec extends BaseSpec {
@Shared
PrebidServerService pbsService = pbsServiceFactory.getService(OPENX_CONFIG)

@Override
def cleanupSpec() {
pbsServiceFactory.removeContainer(OPENX_CONFIG)
pbsServiceFactory.removeContainer(OPENX_CONFIG + OPENX_ALIAS_CONFIG)
}

def "PBS should populate fledge config by default when bid response with fledge"() {
given: "Default basic BidRequest with ae and openx bidder"
def bidRequest = BidRequest.defaultBidRequest.tap {
Expand Down Expand Up @@ -534,4 +543,32 @@ class OpenxSpec extends BaseSpec {
IAB | [new InterestGroupAuctionSeller()] | [new InterestGroupAuctionBuyer()]
ORIGINAL | [] | []
}

def "PBS shouldn't change auction environment in imp.ext.igs and not emit a warning when it is present in both imp.ext and imp.ext.igs"() {
given: "Default bid request with populated imp.ext"
def extAuctionEnv = PBSUtils.getRandomEnum(AuctionEnvironment, [SERVER_ORCHESTRATED, UNKNOWN])
def extIgsAuctionEnv = PBSUtils.getRandomEnum(AuctionEnvironment, [SERVER_ORCHESTRATED, UNKNOWN])
def bidRequest = BidRequest.defaultBidRequest.tap {
imp[0].ext.prebid.bidder.openx = Openx.defaultOpenx
imp[0].ext.prebid.bidder.generic = null
imp[0].ext.tap {
auctionEnvironment = extAuctionEnv
interestGroupAuctionSupports = new InterestGroupAuctionSupport(auctionEnvironment: extIgsAuctionEnv)
}
}

when: "PBS processes auction request"
def bidResponse = pbsService.sendAuctionRequest(bidRequest)

then: "Bidder request should imp[].{ae/ext.igs.ae} same value as requested"
def bidderRequest = bidder.getBidderRequest(bidRequest.id)
assert bidderRequest.imp[0].ext.auctionEnvironment == extAuctionEnv
assert bidderRequest.imp[0].ext.interestGroupAuctionSupports.auctionEnvironment == extIgsAuctionEnv

and: "Response shouldn't contain errors"
assert !bidResponse.ext.errors

and: "Response shouldn't contain warnings"
assert !bidResponse.ext.warnings
}
}
8 changes: 4 additions & 4 deletions src/test/java/org/prebid/server/auction/ImpAdjusterTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ public void adjustShouldSetImpExtIgsAeWhenImpExtAeIsZero() {
final Imp result = target.adjust(givenImp, "someBidder", bidderAliases, debugMessages);

// then
assertThat(result.getExt().get("igs").get(0).get("ae")).isEqualTo(IntNode.valueOf(0));
assertThat(result.getExt().get("igs").get("ae")).isEqualTo(IntNode.valueOf(0));
assertThat(debugMessages).isEmpty();
}

Expand All @@ -110,7 +110,7 @@ public void adjustShouldSetImpExtIgsAeWhenImpExtAeIsOne() {
final Imp result = target.adjust(givenImp, "someBidder", bidderAliases, debugMessages);

// then
assertThat(result.getExt().get("igs").get(0).get("ae")).isEqualTo(IntNode.valueOf(1));
assertThat(result.getExt().get("igs").get("ae")).isEqualTo(IntNode.valueOf(1));
assertThat(debugMessages).isEmpty();
}

Expand All @@ -137,7 +137,7 @@ public void adjustShouldNotModifyImpExtIgsAeWhenImpExtIgsAePresent() {
// given
final ObjectNode ext = mapper.createObjectNode();
ext.set("ae", IntNode.valueOf(0));
ext.set("igs", mapper.createArrayNode().add(mapper.createObjectNode().set("ae", IntNode.valueOf(123))));
ext.set("igs", mapper.createObjectNode().set("ae", IntNode.valueOf(123)));

final Imp givenImp = Imp.builder().ext(ext).build();

Expand All @@ -147,7 +147,7 @@ public void adjustShouldNotModifyImpExtIgsAeWhenImpExtIgsAePresent() {
final Imp result = target.adjust(givenImp, "someBidder", bidderAliases, debugMessages);

// then
assertThat(result.getExt().get("igs").get(0).get("ae")).isEqualTo(IntNode.valueOf(123));
assertThat(result.getExt().get("igs").get("ae")).isEqualTo(IntNode.valueOf(123));
assertThat(debugMessages).isEmpty();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,9 @@
},
"ext": {
"ae": 1,
"igs": [
{
"ae": 1
}
],
"igs": {
"ae": 1
},
"tid": "${json-unit.any-string}",
"bidder": {
"siteId": "10002"
Expand Down
Loading