diff --git a/extra/modules/ortb2-blocking/src/main/java/org/prebid/server/hooks/modules/ortb2/blocking/v1/Ortb2BlockingBidderRequestHook.java b/extra/modules/ortb2-blocking/src/main/java/org/prebid/server/hooks/modules/ortb2/blocking/v1/Ortb2BlockingBidderRequestHook.java index 6ef69c93140..e13deb60d3d 100644 --- a/extra/modules/ortb2-blocking/src/main/java/org/prebid/server/hooks/modules/ortb2/blocking/v1/Ortb2BlockingBidderRequestHook.java +++ b/extra/modules/ortb2-blocking/src/main/java/org/prebid/server/hooks/modules/ortb2/blocking/v1/Ortb2BlockingBidderRequestHook.java @@ -2,7 +2,7 @@ import com.iab.openrtb.request.BidRequest; import io.vertx.core.Future; -import org.prebid.server.auction.BidderAliases; +import org.prebid.server.auction.aliases.BidderAliases; import org.prebid.server.auction.versionconverter.OrtbVersion; import org.prebid.server.bidder.BidderCatalog; import org.prebid.server.hooks.execution.v1.InvocationResultImpl; diff --git a/src/main/java/org/prebid/server/analytics/reporter/greenbids/GreenbidsAnalyticsReporter.java b/src/main/java/org/prebid/server/analytics/reporter/greenbids/GreenbidsAnalyticsReporter.java index f8326efb81f..3b1f3693e55 100644 --- a/src/main/java/org/prebid/server/analytics/reporter/greenbids/GreenbidsAnalyticsReporter.java +++ b/src/main/java/org/prebid/server/analytics/reporter/greenbids/GreenbidsAnalyticsReporter.java @@ -383,7 +383,7 @@ private static Map getSeatsWithNonBids(AuctionContext auctionCon private static SeatNonBid toSeatNonBid(String bidder, BidRejectionTracker bidRejectionTracker) { final List nonBids = bidRejectionTracker.getRejectedImps().entrySet().stream() - .map(entry -> NonBid.of(entry.getKey(), entry.getValue())) + .map(entry -> NonBid.of(entry.getKey(), entry.getValue().getRight())) .toList(); return SeatNonBid.of(bidder, nonBids); diff --git a/src/main/java/org/prebid/server/auction/BidResponseCreator.java b/src/main/java/org/prebid/server/auction/BidResponseCreator.java index 3522997c400..17dd8f8e79c 100644 --- a/src/main/java/org/prebid/server/auction/BidResponseCreator.java +++ b/src/main/java/org/prebid/server/auction/BidResponseCreator.java @@ -27,7 +27,6 @@ import org.prebid.server.auction.model.AuctionContext; import org.prebid.server.auction.model.AuctionParticipation; import org.prebid.server.auction.model.BidInfo; -import org.prebid.server.auction.model.BidRejectionTracker; import org.prebid.server.auction.model.BidRequestCacheInfo; import org.prebid.server.auction.model.BidderResponse; import org.prebid.server.auction.model.BidderResponseInfo; @@ -80,6 +79,7 @@ import org.prebid.server.proto.openrtb.ext.response.CacheAsset; import org.prebid.server.proto.openrtb.ext.response.Events; import org.prebid.server.proto.openrtb.ext.response.ExtBidPrebid; +import org.prebid.server.proto.openrtb.ext.response.ExtBidPrebidMeta; import org.prebid.server.proto.openrtb.ext.response.ExtBidPrebidVideo; import org.prebid.server.proto.openrtb.ext.response.ExtBidResponse; import org.prebid.server.proto.openrtb.ext.response.ExtBidResponseFledge; @@ -105,6 +105,7 @@ import org.prebid.server.settings.model.AccountTargetingConfig; import org.prebid.server.settings.model.VideoStoredDataResult; import org.prebid.server.spring.config.model.CacheDefaultTtlProperties; +import org.prebid.server.util.ListUtil; import org.prebid.server.util.StreamUtil; import org.prebid.server.vast.VastModifier; @@ -199,7 +200,6 @@ public BidResponseCreator(double logSamplingRate, this.mediaTypeCacheTtl = Objects.requireNonNull(mediaTypeCacheTtl); this.cacheDefaultProperties = Objects.requireNonNull(cacheDefaultProperties); this.metrics = Objects.requireNonNull(metrics); - this.logSamplingRate = logSamplingRate; cacheAssetUrlTemplate = Objects.requireNonNull(coreCacheService.getCachedAssetURLTemplate()); @@ -214,44 +214,22 @@ private static int validateTruncateAttrChars(int truncateAttrChars) { return truncateAttrChars; } - Future createOnSkippedAuction(AuctionContext auctionContext, List seatBids) { - final BidRequest bidRequest = auctionContext.getBidRequest(); - - final ExtBidResponse extBidResponse = ExtBidResponse.builder() - .warnings(extractContextWarnings(auctionContext)) - .tmaxrequest(bidRequest.getTmax()) - .build(); - - final List cur = bidRequest.getCur(); - final BidResponse bidResponse = BidResponse.builder() - .id(bidRequest.getId()) - .cur(CollectionUtils.isNotEmpty(cur) ? cur.getFirst() : null) - .seatbid(ListUtils.emptyIfNull(seatBids)) - .ext(extBidResponse) - .build(); - - return Future.succeededFuture(bidResponse); - } - Future create(AuctionContext auctionContext, BidRequestCacheInfo cacheInfo, - BidderAliases aliases, Map bidderToMultiBids) { return videoStoredDataResult(auctionContext) .compose(videoStoredData -> - create(videoStoredData, auctionContext, cacheInfo, aliases, bidderToMultiBids)) + create(videoStoredData, auctionContext, cacheInfo, bidderToMultiBids)) .map(bidResponse -> populateSeatNonBid(auctionContext, bidResponse)); } private Future create(VideoStoredDataResult videoStoredDataResult, AuctionContext auctionContext, BidRequestCacheInfo cacheInfo, - BidderAliases aliases, Map bidderToMultiBids) { final EventsContext eventsContext = createEventsContext(auctionContext); - final List bidderResponses = auctionContext.getAuctionParticipations().stream() .filter(auctionParticipation -> !auctionParticipation.isRequestBlocked()) .map(AuctionParticipation::getBidderResponse) @@ -265,7 +243,6 @@ private Future create(VideoStoredDataResult videoStoredDataResult, toBidderResponseInfos(categoryMappingResult, cacheInfo, auctionContext), auctionContext, cacheInfo, - aliases, bidderToMultiBids, videoStoredDataResult, eventsContext)); @@ -280,7 +257,6 @@ private Future> updateBids(List bidderRespo for (final BidderResponse bidderResponse : bidderResponses) { final String bidder = bidderResponse.getBidder(); - final List modifiedBidderBids = new ArrayList<>(); final BidderSeatBid seatBid = bidderResponse.getSeatBid(); for (final BidderBid bidderBid : seatBid.getBids()) { @@ -381,7 +357,6 @@ private ObjectNode updateBidExt(Bid bid, generatedBidId, effectiveBidId); final ObjectNode existingBidExt = bid.getExt(); - final ObjectNode updatedBidExt = mapper.mapper().createObjectNode(); if (existingBidExt != null && !existingBidExt.isEmpty()) { @@ -389,7 +364,6 @@ private ObjectNode updateBidExt(Bid bid, } updatedBidExt.set(PREBID_EXT, mapper.mapper().valueToTree(updatedExtBidPrebid)); - return updatedBidExt; } @@ -405,7 +379,6 @@ private ExtBidPrebid updateBidExtPrebid(Bid bid, final Video storedVideo = videoStoredDataResult.getImpIdToStoredVideo().get(bid.getImpid()); final Events events = createEvents(bidder, account, effectiveBidId, eventsContext); final ExtBidPrebidVideo extBidPrebidVideo = getExtBidPrebidVideo(bid.getExt()).orElse(null); - final ExtBidPrebid.ExtBidPrebidBuilder extBidPrebidBuilder = getExtPrebid(bid.getExt(), ExtBidPrebid.class) .map(ExtBidPrebid::toBuilder) .orElseGet(ExtBidPrebid::builder); @@ -435,37 +408,83 @@ private List toBidderResponseInfos(CategoryMappingResult cat final List imps = auctionContext.getBidRequest().getImp(); final Account account = auctionContext.getAccount(); final List result = new ArrayList<>(); - final List bidderResponses = categoryMappingResult.getBidderResponses(); + for (final BidderResponse bidderResponse : bidderResponses) { final String bidder = bidderResponse.getBidder(); - - final List bidInfos = new ArrayList<>(); final BidderSeatBid seatBid = bidderResponse.getSeatBid(); - for (final BidderBid bidderBid : seatBid.getBids()) { - final Bid bid = bidderBid.getBid(); - final BidType type = bidderBid.getType(); - final BidInfo bidInfo = toBidInfo(bid, type, imps, bidder, categoryMappingResult, cacheInfo, account); - bidInfos.add(bidInfo); + final Map> seatToBids = seatBid.getBids().stream() + .filter(bidderBid -> Objects.nonNull(bidderBid.getSeat())) + .collect(Collectors.groupingBy(BidderBid::getSeat)); + + if (seatToBids.isEmpty()) { + final BidderSeatBidInfo bidderSeatBidInfo = BidderSeatBidInfo.of( + Collections.emptyList(), + seatBid.getHttpCalls(), + seatBid.getErrors(), + seatBid.getWarnings(), + seatBid.getFledgeAuctionConfigs(), + seatBid.getIgi()); + + result.add(BidderResponseInfo.of( + bidder, + bidder, + bidder, + bidderSeatBidInfo, + bidderResponse.getResponseTime())); + + continue; } - final BidderSeatBidInfo bidderSeatBidInfo = BidderSeatBidInfo.of( - bidInfos, - seatBid.getHttpCalls(), - seatBid.getErrors(), - seatBid.getWarnings(), - seatBid.getFledgeAuctionConfigs(), - seatBid.getIgi()); + for (Map.Entry> bidsEntry : seatToBids.entrySet()) { + final List bidInfos = new ArrayList<>(); + final String seat = bidsEntry.getKey(); + final List bids = bidsEntry.getValue(); + final BidderBid firstBid = CollectionUtils.isEmpty(bids) ? null : bids.getFirst(); + final String adapterCode = Optional.ofNullable(firstBid) + .map(BidderBid::getBid) + .map(Bid::getExt) + .flatMap(ext -> getExtPrebid(ext, ExtBidPrebid.class)) + .map(ExtBidPrebid::getMeta) + .map(ExtBidPrebidMeta::getAdapterCode) + .orElse(bidder); + + for (final BidderBid bidderBid : bids) { + final BidInfo bidInfo = toBidInfo( + bidderBid.getBid(), + bidderBid.getType(), + seat, + imps, + bidder, + categoryMappingResult, + cacheInfo, + account); + bidInfos.add(bidInfo); + } - result.add(BidderResponseInfo.of(bidder, bidderSeatBidInfo, bidderResponse.getResponseTime())); - } + final BidderSeatBidInfo bidderSeatBidInfo = BidderSeatBidInfo.of( + bidInfos, + seatBid.getHttpCalls(), + seatBid.getErrors(), + seatBid.getWarnings(), + seatBid.getFledgeAuctionConfigs(), + seatBid.getIgi()); + result.add(BidderResponseInfo.of( + bidder, + seat, + adapterCode, + bidderSeatBidInfo, + bidderResponse.getResponseTime())); + } + } return result; } private BidInfo toBidInfo(Bid bid, BidType type, + String seat, List imps, String bidder, CategoryMappingResult categoryMappingResult, @@ -477,6 +496,7 @@ private BidInfo toBidInfo(Bid bid, .bid(bid) .bidType(type) .bidder(bidder) + .seat(seat) .correspondingImp(correspondingImp) .ttl(resolveTtl(bid, type, correspondingImp, cacheInfo, account)) .vastTtl(type == BidType.video ? resolveVastTtl(bid, correspondingImp, cacheInfo, account) : null) @@ -591,7 +611,6 @@ private static CategoryMappingResult addCategoryMappingErrors(CategoryMappingRes private Future cacheBidsAndCreateResponse(List bidderResponses, AuctionContext auctionContext, BidRequestCacheInfo cacheInfo, - BidderAliases aliases, Map bidderToMultiBids, VideoStoredDataResult videoStoredDataResult, EventsContext eventsContext) { @@ -602,7 +621,6 @@ private Future cacheBidsAndCreateResponse(List final ExtBidResponse extBidResponse = toExtBidResponse( bidderResponses, auctionContext, - aliases, CacheServiceResult.empty(), VideoStoredDataResult.empty(), eventsContext.getAuctionTimestamp(), @@ -646,7 +664,6 @@ private Future cacheBidsAndCreateResponse(List .map(cacheResult -> toBidResponse( bidderResponseInfos, auctionContext, - aliases, targeting, cacheInfo, cacheResult, @@ -774,18 +791,16 @@ private static List injectTargeting(List bidderImpIdBidInfos, final int multiBidSize = bidderImpIdBidInfos.size(); for (int i = 0; i < multiBidSize; i++) { // first bid have the highest value and can't be extra bid - final boolean isFirstBid = i == 0; - final String targetingBidderCode = isFirstBid - ? bidder - : bidderCodePrefix == null ? null : bidderCodePrefix + (i + 1); - + final String targetingBidderCode = targetingCode(bidder, bidderCodePrefix, i); final BidInfo bidInfo = bidderImpIdBidInfos.get(i); + final TargetingInfo targetingInfo = TargetingInfo.builder() .isTargetingEnabled(targetingBidderCode != null) .isBidderWinningBid(winningBidsByBidder.contains(bidInfo)) .isWinningBid(winningBids.contains(bidInfo)) .isAddTargetBidderCode(targetingBidderCode != null && multiBidSize > 1) .bidderCode(targetingBidderCode) + .seat(targetingCode(bidInfo.getSeat(), bidderCodePrefix, i)) .build(); final BidInfo modifiedBidInfo = bidInfo.toBuilder().targetingInfo(targetingInfo).build(); @@ -795,13 +810,20 @@ private static List injectTargeting(List bidderImpIdBidInfos, return result; } + private static String targetingCode(String base, String prefix, int i) { + if (i == 0) { + return base; + } + + return prefix != null ? prefix + (i + 1) : null; + } + /** * Returns {@link ExtBidResponse} object, populated with response time, errors and debug info (if requested) * from all bidders. */ private ExtBidResponse toExtBidResponse(List bidderResponseInfos, AuctionContext auctionContext, - BidderAliases aliases, CacheServiceResult cacheResult, VideoStoredDataResult videoStoredDataResult, long auctionTimestamp, @@ -811,7 +833,7 @@ private ExtBidResponse toExtBidResponse(List bidderResponseI final DebugContext debugContext = auctionContext.getDebugContext(); final boolean debugEnabled = debugContext.isDebugEnabled(); - final PaaResult paaResult = toPaaOutput(bidderResponseInfos, auctionContext, aliases); + final PaaResult paaResult = toPaaOutput(bidderResponseInfos, auctionContext); final List igi = paaResult.igis(); final ExtBidResponseFledge fledge = paaResult.fledge(); @@ -855,12 +877,10 @@ private ExtBidResponsePrebid toExtBidResponsePrebid(long auctionTimestamp, .build(); } - private PaaResult toPaaOutput(List bidderResponseInfos, - AuctionContext auctionContext, - BidderAliases aliases) { + private PaaResult toPaaOutput(List bidderResponseInfos, AuctionContext auctionContext) { final PaaFormat paaFormat = resolvePaaFormat(auctionContext); - final List igis = extractIgis(bidderResponseInfos, auctionContext, aliases); + final List igis = extractIgis(bidderResponseInfos, auctionContext); final List extIgi = paaFormat == PaaFormat.IAB && !igis.isEmpty() ? igis : null; final List fledgeConfigs = paaFormat == PaaFormat.ORIGINAL @@ -870,7 +890,7 @@ private PaaResult toPaaOutput(List bidderResponseInfos, // TODO: Remove after transition period final List imps = auctionContext.getBidRequest().getImp(); final List deprecatedFledgeConfigs = bidderResponseInfos.stream() - .flatMap(bidderResponseInfo -> toDeprecatedFledgeConfigs(bidderResponseInfo, aliases, imps)) + .flatMap(bidderResponseInfo -> toDeprecatedFledgeConfigs(bidderResponseInfo, imps)) .toList(); final List combinedFledgeConfigs = ListUtils.union(deprecatedFledgeConfigs, fledgeConfigs); @@ -881,25 +901,29 @@ private PaaResult toPaaOutput(List bidderResponseInfos, return new PaaResult(extIgi, extBidResponseFledge); } - private List extractIgis(List bidderResponseInfos, - AuctionContext auctionContext, - BidderAliases aliases) { - + private List extractIgis(List bidderResponseInfos, AuctionContext auctionContext) { return bidderResponseInfos.stream() .flatMap(responseInfo -> responseInfo.getSeatBid().getIgi().stream() - .map(igi -> prepareExtIgi(igi, responseInfo.getBidder(), auctionContext, aliases))) + .map(igi -> prepareExtIgi( + igi, + responseInfo.getSeat(), + responseInfo.getAdapterCode(), + auctionContext))) .filter(Objects::nonNull) .toList(); } - private ExtIgi prepareExtIgi(ExtIgi igi, String bidder, AuctionContext auctionContext, BidderAliases aliases) { + private ExtIgi prepareExtIgi(ExtIgi igi, + String seat, + String adapterCode, + AuctionContext auctionContext) { if (igi == null) { return null; } final boolean shouldDropIgb = StringUtils.isEmpty(igi.getImpid()) && CollectionUtils.isNotEmpty(igi.getIgb()); if (shouldDropIgb) { - final String warning = "ExtIgi with absent impId from bidder: " + bidder; + final String warning = "ExtIgi with absent impId from bidder: " + seat; if (auctionContext.getDebugContext().isDebugEnabled()) { auctionContext.getDebugWarnings().add(warning); } @@ -907,7 +931,7 @@ private ExtIgi prepareExtIgi(ExtIgi igi, String bidder, AuctionContext auctionCo metrics.updateAlertsMetrics(MetricName.general); } - final List updatedIgs = prepareExtIgiIgs(igi.getIgs(), bidder, auctionContext, aliases); + final List updatedIgs = prepareExtIgiIgs(igi.getIgs(), seat, adapterCode, auctionContext); final List preparedIgs = updatedIgs.isEmpty() ? null : updatedIgs; final List preparedIgb = shouldDropIgb ? null : igi.getIgb(); @@ -917,9 +941,9 @@ private ExtIgi prepareExtIgi(ExtIgi igi, String bidder, AuctionContext auctionCo } private List prepareExtIgiIgs(List igiIgs, - String bidder, - AuctionContext auctionContext, - BidderAliases aliases) { + String seat, + String adapterCode, + AuctionContext auctionContext) { if (igiIgs == null) { return Collections.emptyList(); @@ -933,7 +957,7 @@ private List prepareExtIgiIgs(List igiIgs, } if (StringUtils.isEmpty(extIgiIgs.getImpId())) { - final String warning = "ExtIgiIgs with absent impId from bidder: " + bidder; + final String warning = "ExtIgiIgs with absent impId from bidder: " + seat; if (debugEnabled) { auctionContext.getDebugWarnings().add(warning); } @@ -943,7 +967,7 @@ private List prepareExtIgiIgs(List igiIgs, } if (extIgiIgs.getConfig() == null) { - final String warning = "ExtIgiIgs with absent config from bidder: " + bidder; + final String warning = "ExtIgiIgs with absent config from bidder: " + seat; if (debugEnabled) { auctionContext.getDebugWarnings().add(warning); } @@ -953,7 +977,7 @@ private List prepareExtIgiIgs(List igiIgs, } final ExtIgiIgs preparedExtIgiIgs = extIgiIgs.toBuilder() - .ext(ExtIgiIgsExt.of(bidder, bidderCatalog.resolveBaseBidder(aliases.resolveBidder(bidder)))) + .ext(ExtIgiIgsExt.of(seat, adapterCode)) .build(); preparedIgiIgs.add(preparedExtIgiIgs); @@ -980,14 +1004,16 @@ private static FledgeAuctionConfig extIgiIgsToFledgeConfig(ExtIgiIgs extIgiIgs) } private Stream toDeprecatedFledgeConfigs(BidderResponseInfo bidderResponseInfo, - BidderAliases aliases, List imps) { return Optional.ofNullable(bidderResponseInfo.getSeatBid().getFledgeAuctionConfigs()) .stream() .flatMap(Collection::stream) .filter(fledgeConfig -> validateFledgeConfig(fledgeConfig, imps)) - .map(fledgeConfig -> fledgeConfigWithBidder(fledgeConfig, bidderResponseInfo.getBidder(), aliases)); + .map(fledgeConfig -> fledgeConfigWithBidder( + fledgeConfig, + bidderResponseInfo.getSeat(), + bidderResponseInfo.getAdapterCode())); } private boolean validateFledgeConfig(FledgeAuctionConfig fledgeAuctionConfig, List imps) { @@ -1000,12 +1026,12 @@ private boolean validateFledgeConfig(FledgeAuctionConfig fledgeAuctionConfig, Li } private FledgeAuctionConfig fledgeConfigWithBidder(FledgeAuctionConfig fledgeConfig, - String bidder, - BidderAliases aliases) { + String seat, + String adapterCode) { return fledgeConfig.toBuilder() - .bidder(bidder) - .adapter(bidderCatalog.resolveBaseBidder(aliases.resolveBidder(bidder))) + .bidder(seat) + .adapter(adapterCode) .build(); } @@ -1093,8 +1119,9 @@ private static Map> toExtHttpCalls(List> bidderHttpCalls = bidderResponses.stream() .filter(bidderResponse -> CollectionUtils.isNotEmpty(bidderResponse.getSeatBid().getHttpCalls())) .collect(Collectors.toMap( - BidderResponseInfo::getBidder, - bidderResponse -> bidderResponse.getSeatBid().getHttpCalls())); + BidderResponseInfo::getSeat, + bidderResponse -> bidderResponse.getSeatBid().getHttpCalls(), + ListUtil::union)); final DebugHttpCall httpCall = cacheResult.getHttpCall(); final ExtHttpCall cacheExtHttpCall = httpCall != null ? toExtHttpCall(httpCall) : null; @@ -1144,7 +1171,6 @@ private Map> toExtBidderErrors(List> bidErrors) { final Map> errors = new HashMap<>(); - errors.putAll(extractBidderErrors(bidderResponses)); errors.putAll(extractDeprecatedBiddersErrors(auctionContext.getBidRequest())); errors.putAll(extractPrebidErrors(videoStoredDataResult, auctionContext)); @@ -1152,7 +1178,6 @@ private Map> toExtBidderErrors(List> extractBidderErrors( return bidderResponses.stream() .filter(bidderResponse -> CollectionUtils.isNotEmpty(bidderResponse.getSeatBid().getErrors())) - .collect(Collectors.toMap(BidderResponseInfo::getBidder, - bidderResponse -> errorsDetails(bidderResponse.getSeatBid().getErrors()))); + .collect(Collectors.toMap( + BidderResponseInfo::getSeat, + bidderResponse -> errorsDetails(bidderResponse.getSeatBid().getErrors()), + ListUtil::union)); } /** @@ -1176,8 +1203,10 @@ private static Map> extractBidderWarnings( return bidderResponses.stream() .filter(bidderResponse -> CollectionUtils.isNotEmpty(bidderResponse.getSeatBid().getWarnings())) - .collect(Collectors.toMap(BidderResponseInfo::getBidder, - bidderResponse -> errorsDetails(bidderResponse.getSeatBid().getWarnings()))); + .collect(Collectors.toMap( + BidderResponseInfo::getSeat, + bidderResponse -> errorsDetails(bidderResponse.getSeatBid().getWarnings()), + ListUtil::union)); } /** @@ -1310,7 +1339,7 @@ private static Map toResponseTimes(Collection responseTimeMillis = bidderResponses.stream() - .collect(Collectors.toMap(BidderResponseInfo::getBidder, BidderResponseInfo::getResponseTime)); + .collect(Collectors.toMap(BidderResponseInfo::getSeat, BidderResponseInfo::getResponseTime, Math::max)); final DebugHttpCall debugHttpCall = cacheResult.getHttpCall(); final Integer cacheResponseTime = debugHttpCall != null ? debugHttpCall.getResponseTimeMillis() : null; @@ -1336,7 +1365,6 @@ private static PaaFormat resolvePaaFormat(AuctionContext auctionContext) { */ private BidResponse toBidResponse(List bidderResponseInfos, AuctionContext auctionContext, - BidderAliases aliases, ExtRequestTargeting targeting, BidRequestCacheInfo requestCacheInfo, CacheServiceResult cacheResult, @@ -1367,7 +1395,6 @@ private BidResponse toBidResponse(List bidderResponseInfos, final ExtBidResponse extBidResponse = toExtBidResponse( bidderResponseInfos, auctionContext, - aliases, cacheResult, videoStoredDataResult, auctionTimestamp, @@ -1442,12 +1469,6 @@ private SeatBid toSeatBid(List bidInfos, Map> bidErrors, Map> bidWarnings) { - final String bidder = bidInfos.stream() - .map(BidInfo::getBidder) - .findFirst() - // Should never occur - .orElseThrow(() -> new IllegalArgumentException("Bidder was not defined for bidInfo")); - final List bids = bidInfos.stream() .map(bidInfo -> injectAdmWithCacheInfo( bidInfo, @@ -1464,8 +1485,14 @@ private SeatBid toSeatBid(List bidInfos, .filter(Objects::nonNull) .toList(); + final String seat = bidInfos.stream() + .map(BidInfo::getSeat) + .findFirst() + // Should never occur + .orElseThrow(() -> new IllegalArgumentException("BidderCode was not defined for bidInfo")); + return SeatBid.builder() - .seat(bidder) + .seat(seat) .bid(bids) .group(0) // prebid cannot support roadblocking .build(); @@ -1478,7 +1505,7 @@ private BidInfo injectAdmWithCacheInfo(BidInfo bidInfo, final Bid bid = bidInfo.getBid(); final BidType bidType = bidInfo.getBidType(); - final String bidder = bidInfo.getBidder(); + final String seat = bidInfo.getSeat(); final Imp correspondingImp = bidInfo.getCorrespondingImp(); final CacheInfo cacheInfo = bidsWithCacheIds.get(bid); @@ -1495,7 +1522,7 @@ private BidInfo injectAdmWithCacheInfo(BidInfo bidInfo, try { modifiedBidAdm = createNativeMarkup(modifiedBidAdm, correspondingImp); } catch (PreBidException e) { - bidErrors.computeIfAbsent(bidder, ignored -> new ArrayList<>()) + bidErrors.computeIfAbsent(seat, ignored -> new ArrayList<>()) .add(ExtBidderError.of(BidderError.Type.bad_server_response.getCode(), e.getMessage())); return null; } @@ -1525,16 +1552,16 @@ private Bid toBid(BidInfo bidInfo, final String videoCacheId = cacheInfo != null ? cacheInfo.getVideoCacheId() : null; final Map targetingKeywords; - final String bidderCode = targetingInfo.getBidderCode(); if (shouldIncludeTargetingInResponse(targeting, bidInfo.getTargetingInfo())) { final TargetingKeywordsCreator keywordsCreator = resolveKeywordsCreator( bidType, targeting, bidRequest, account, bidWarnings); final boolean isWinningBid = targetingInfo.isWinningBid(); + final String seat = targetingInfo.getSeat(); final String categoryDuration = bidInfo.getCategory(); targetingKeywords = keywordsCreator != null ? keywordsCreator.makeFor( - bid, bidderCode, isWinningBid, cacheId, bidType.getName(), videoCacheId, categoryDuration) + bid, seat, isWinningBid, cacheId, bidType.getName(), videoCacheId, categoryDuration) : null; } else { targetingKeywords = null; @@ -1552,7 +1579,7 @@ private Bid toBid(BidInfo bidInfo, .map(ExtBidPrebid::toBuilder) .orElseGet(ExtBidPrebid::builder) .targeting(MapUtils.isNotEmpty(targetingKeywords) ? targetingKeywords : null) - .targetBidderCode(targetingInfo.isAddTargetBidderCode() ? bidderCode : null) + .targetBidderCode(targetingInfo.isAddTargetBidderCode() ? targetingInfo.getBidderCode() : null) .dealTierSatisfied(dealsTierSatisfied) .cache(cache) .passThrough(extractPassThrough(bidInfo.getCorrespondingImp())) @@ -1561,11 +1588,9 @@ private Bid toBid(BidInfo bidInfo, final ObjectNode updatedBidExt = originalBidExt != null ? originalBidExt.deepCopy() : mapper.mapper().createObjectNode(); updatedBidExt.set(PREBID_EXT, mapper.mapper().valueToTree(updatedExtBidPrebid)); - final Integer ttl = Optional.ofNullable(cacheInfo) .map(info -> ObjectUtils.max(cacheInfo.getTtl(), cacheInfo.getVideoTtl())) .orElseGet(() -> ObjectUtils.max(bidInfo.getTtl(), bidInfo.getVastTtl())); - return bid.toBuilder() .ext(updatedBidExt) .exp(ttl) @@ -1922,9 +1947,16 @@ private static BidResponse populateSeatNonBid(AuctionContext auctionContext, Bid return bidResponse; } - final List seatNonBids = auctionContext.getBidRejectionTrackers().entrySet().stream() - .map(entry -> toSeatNonBid(entry.getKey(), entry.getValue())) - .filter(seatNonBid -> !seatNonBid.getNonBid().isEmpty()) + final List seatNonBids = auctionContext.getBidRejectionTrackers().values().stream() + .flatMap(bidRejectionTracker -> bidRejectionTracker.getRejectedImps().entrySet().stream()) + .collect(Collectors.groupingBy( + entry -> entry.getValue().getLeft(), + Collectors.mapping( + entry -> NonBid.of(entry.getKey(), entry.getValue().getRight()), + Collectors.toList()))) + .entrySet().stream() + .filter(entry -> !entry.getValue().isEmpty()) + .map(entry -> SeatNonBid.of(entry.getKey(), entry.getValue())) .toList(); final ExtBidResponse updatedExtBidResponse = Optional.ofNullable(bidResponse.getExt()) @@ -1936,14 +1968,6 @@ private static BidResponse populateSeatNonBid(AuctionContext auctionContext, Bid return bidResponse.toBuilder().ext(updatedExtBidResponse).build(); } - private static SeatNonBid toSeatNonBid(String bidder, BidRejectionTracker bidRejectionTracker) { - final List nonBid = bidRejectionTracker.getRejectedImps().entrySet().stream() - .map(entry -> NonBid.of(entry.getKey(), entry.getValue())) - .toList(); - - return SeatNonBid.of(bidder, nonBid); - } - /** * Creates {@link CacheAsset} for the given cache ID. */ diff --git a/src/main/java/org/prebid/server/auction/BidderAliases.java b/src/main/java/org/prebid/server/auction/BidderAliases.java deleted file mode 100644 index 87ad01efe3b..00000000000 --- a/src/main/java/org/prebid/server/auction/BidderAliases.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.prebid.server.auction; - -import org.apache.commons.collections4.MapUtils; -import org.apache.commons.lang3.StringUtils; -import org.prebid.server.bidder.BidderCatalog; - -import java.util.Map; -import java.util.Objects; - -/** - * Represents aliases configured for bidders - configuration might come in OpenRTB request but not limited to it. - */ -public class BidderAliases { - - private final Map aliasToBidder; - - private final Map aliasToVendorId; - - private final BidderCatalog bidderCatalog; - - private BidderAliases(Map aliasToBidder, - Map aliasToVendorId, - BidderCatalog bidderCatalog) { - - this.aliasToBidder = MapUtils.emptyIfNull(aliasToBidder); - this.aliasToVendorId = MapUtils.emptyIfNull(aliasToVendorId); - this.bidderCatalog = Objects.requireNonNull(bidderCatalog); - } - - public static BidderAliases of(Map aliasToBidder, - Map aliasToVendorId, - BidderCatalog bidderCatalog) { - - return new BidderAliases(aliasToBidder, aliasToVendorId, bidderCatalog); - } - - public boolean isAliasDefined(String alias) { - return aliasToBidder.containsKey(alias); - } - - public String resolveBidder(String aliasOrBidder) { - return bidderCatalog.isValidName(aliasOrBidder) - ? aliasOrBidder - : aliasToBidder.getOrDefault(aliasOrBidder, aliasOrBidder); - } - - public boolean isSame(String bidder1, String bidder2) { - return StringUtils.equalsIgnoreCase(resolveBidder(bidder1), resolveBidder(bidder2)); - } - - public Integer resolveAliasVendorId(String alias) { - final Integer vendorId = resolveAliasVendorIdViaCatalog(alias); - return vendorId == null ? aliasToVendorId.get(alias) : vendorId; - } - - private Integer resolveAliasVendorIdViaCatalog(String alias) { - final String bidderName = resolveBidder(alias); - return bidderCatalog.isActive(bidderName) ? bidderCatalog.vendorIdByName(bidderName) : null; - } -} diff --git a/src/main/java/org/prebid/server/auction/BidsAdjuster.java b/src/main/java/org/prebid/server/auction/BidsAdjuster.java index 4ae7a6e3e3e..f79b6dd7e6c 100644 --- a/src/main/java/org/prebid/server/auction/BidsAdjuster.java +++ b/src/main/java/org/prebid/server/auction/BidsAdjuster.java @@ -2,6 +2,7 @@ import com.iab.openrtb.request.BidRequest; import com.iab.openrtb.response.Bid; +import org.prebid.server.auction.aliases.BidderAliases; import org.prebid.server.auction.model.AuctionContext; import org.prebid.server.auction.model.AuctionParticipation; import org.prebid.server.auction.model.BidderResponse; @@ -44,7 +45,6 @@ public List validateAndAdjustBids(List validBidderResponse(auctionParticipation, auctionContext, aliases)) - .map(auctionParticipation -> bidAdjustmentsProcessor.enrichWithAdjustedBids( auctionParticipation, auctionContext.getBidRequest(), diff --git a/src/main/java/org/prebid/server/auction/ExchangeService.java b/src/main/java/org/prebid/server/auction/ExchangeService.java index 56cd8192501..8d6a73a8b68 100644 --- a/src/main/java/org/prebid/server/auction/ExchangeService.java +++ b/src/main/java/org/prebid/server/auction/ExchangeService.java @@ -28,6 +28,8 @@ import org.prebid.server.activity.infrastructure.payload.ActivityInvocationPayload; import org.prebid.server.activity.infrastructure.payload.impl.ActivityInvocationPayloadImpl; import org.prebid.server.activity.infrastructure.payload.impl.BidRequestActivityInvocationPayload; +import org.prebid.server.auction.aliases.AlternateBidderCodesConfig; +import org.prebid.server.auction.aliases.BidderAliases; import org.prebid.server.auction.mediatypeprocessor.MediaTypeProcessingResult; import org.prebid.server.auction.mediatypeprocessor.MediaTypeProcessor; import org.prebid.server.auction.model.AuctionContext; @@ -79,6 +81,7 @@ import org.prebid.server.proto.openrtb.ext.request.ExtDooh; 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.ExtRequestPrebidAlternateBidderCodes; import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidBidderConfig; import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidCache; import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidData; @@ -88,6 +91,7 @@ import org.prebid.server.proto.openrtb.ext.request.ExtRequestTargeting; import org.prebid.server.proto.openrtb.ext.request.ExtSite; import org.prebid.server.proto.openrtb.ext.request.ExtUser; +import org.prebid.server.proto.openrtb.ext.response.ExtBidPrebidMeta; import org.prebid.server.settings.model.Account; import org.prebid.server.util.HttpUtil; import org.prebid.server.util.ListUtil; @@ -115,6 +119,7 @@ public class ExchangeService { private static final ConditionalLogger conditionalLogger = new ConditionalLogger(logger); private static final String PREBID_EXT = "prebid"; + private static final String PREBID_META_EXT = "meta"; private static final String BIDDER_EXT = "bidder"; private static final String TID_EXT = "tid"; private static final String ALL_BIDDERS_CONFIG = "*"; @@ -233,7 +238,7 @@ private Future runAuction(AuctionContext receivedContext) { final MetricName requestTypeMetric = receivedContext.getRequestTypeMetric(); final List storedAuctionResponses = new ArrayList<>(); - final BidderAliases aliases = aliases(bidRequest); + final BidderAliases aliases = aliases(bidRequest, account); final BidRequestCacheInfo cacheInfo = bidRequestCacheInfo(bidRequest); final Map bidderToMultiBid = bidderToMultiBids(bidRequest, debugWarnings); receivedContext.getBidRejectionTrackers().putAll(makeBidRejectionTrackers(bidRequest, aliases)); @@ -273,7 +278,7 @@ private Future runAuction(AuctionContext receivedContext) { .map(auctionParticipations -> updateResponsesMetrics(auctionParticipations, account, aliases)) .map(context::with)) // produce response from bidder results - .compose(context -> bidResponseCreator.create(context, cacheInfo, aliases, bidderToMultiBid) + .compose(context -> bidResponseCreator.create(context, cacheInfo, bidderToMultiBid) .map(bidResponse -> criteriaLogManager.traceResponse( logger, bidResponse, @@ -284,11 +289,19 @@ private Future runAuction(AuctionContext receivedContext) { .map(context::with)); } - private BidderAliases aliases(BidRequest bidRequest) { + private BidderAliases aliases(BidRequest bidRequest, Account account) { final ExtRequestPrebid prebid = PbsUtil.extRequestPrebid(bidRequest); final Map aliases = prebid != null ? prebid.getAliases() : null; final Map aliasgvlids = prebid != null ? prebid.getAliasgvlids() : null; - return BidderAliases.of(aliases, aliasgvlids, bidderCatalog); + final ExtRequestPrebidAlternateBidderCodes alternateBidderCodes = prebid != null + ? prebid.getAlternateBidderCodes() + : null; + + final AlternateBidderCodesConfig alternateBidderCodesConfig = ObjectUtils.defaultIfNull( + alternateBidderCodes, + account.getAlternateBidderCodes()); + + return BidderAliases.of(aliases, aliasgvlids, bidderCatalog, alternateBidderCodesConfig); } private static ExtRequestTargeting targeting(BidRequest bidRequest) { @@ -1225,9 +1238,43 @@ private Future requestBids(BidderRequest bidderRequest, requestHeaders, aliases, debugResolver.resolveDebugForBidder(auctionContext, resolvedBidderName))) + .map(seatBid -> populateBidderCode(seatBid, bidderName, resolvedBidderName)) .map(seatBid -> BidderResponse.of(bidderName, seatBid, responseTime(bidderRequestStartTime))); } + private BidderSeatBid populateBidderCode(BidderSeatBid seatBid, String bidderName, String resolvedBidderName) { + return seatBid.with(seatBid.getBids().stream() + .map(bidderBid -> bidderBid.toBuilder() + .seat(ObjectUtils.defaultIfNull(bidderBid.getSeat(), bidderName)) + .bid(bidderBid.getBid().toBuilder() + .ext(prepareBidExt( + bidderBid.getBid().getExt(), + bidderCatalog.configuredName(resolvedBidderName))) + .build()) + .build()) + .toList()); + } + + private ObjectNode prepareBidExt(ObjectNode bidExt, String bidderName) { + final ObjectNode updatedBidExt = bidExt != null ? bidExt : mapper.mapper().createObjectNode(); + + final ObjectNode extPrebid = objectNodeFromOrNew(updatedBidExt, PREBID_EXT); + final ObjectNode extPrebidMeta = objectNodeFromOrNew(extPrebid, PREBID_META_EXT); + + final ObjectNode newData = mapper.mapper().valueToTree( + ExtBidPrebidMeta.builder().adapterCode(bidderName).build()); + extPrebidMeta.setAll(newData); + + return updatedBidExt; + } + + private ObjectNode objectNodeFromOrNew(ObjectNode parent, String key) { + final JsonNode childNode = parent.get(key); + return childNode == null || !childNode.isObject() + ? parent.putObject(key) + : (ObjectNode) childNode; + } + private BidRequest adjustTmax(BidRequest bidRequest, long startTime, int adjustmentFactor, diff --git a/src/main/java/org/prebid/server/auction/ImpAdjuster.java b/src/main/java/org/prebid/server/auction/ImpAdjuster.java index 52c4ebd447d..2d8be424fea 100644 --- a/src/main/java/org/prebid/server/auction/ImpAdjuster.java +++ b/src/main/java/org/prebid/server/auction/ImpAdjuster.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.databind.node.IntNode; import com.fasterxml.jackson.databind.node.ObjectNode; import com.iab.openrtb.request.Imp; +import org.prebid.server.auction.aliases.BidderAliases; import org.prebid.server.json.JacksonMapper; import org.prebid.server.json.JsonMerger; import org.prebid.server.validation.ImpValidator; diff --git a/src/main/java/org/prebid/server/auction/SkippedAuctionService.java b/src/main/java/org/prebid/server/auction/SkippedAuctionService.java index e833b317cc2..1eb1ee1318b 100644 --- a/src/main/java/org/prebid/server/auction/SkippedAuctionService.java +++ b/src/main/java/org/prebid/server/auction/SkippedAuctionService.java @@ -1,33 +1,35 @@ package org.prebid.server.auction; import com.iab.openrtb.request.BidRequest; +import com.iab.openrtb.response.BidResponse; import com.iab.openrtb.response.SeatBid; import io.vertx.core.Future; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.ListUtils; import org.apache.commons.lang3.StringUtils; import org.prebid.server.auction.model.AuctionContext; import org.prebid.server.auction.model.StoredResponseResult; +import org.prebid.server.bidder.model.BidderError; import org.prebid.server.exception.InvalidRequestException; import org.prebid.server.execution.timeout.Timeout; 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.ExtStoredAuctionResponse; +import org.prebid.server.proto.openrtb.ext.response.ExtBidResponse; +import org.prebid.server.proto.openrtb.ext.response.ExtBidderError; import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.Optional; public class SkippedAuctionService { private final StoredResponseProcessor storedResponseProcessor; - private final BidResponseCreator bidResponseCreator; - - public SkippedAuctionService(StoredResponseProcessor storedResponseProcessor, - BidResponseCreator bidResponseCreator) { + public SkippedAuctionService(StoredResponseProcessor storedResponseProcessor) { this.storedResponseProcessor = Objects.requireNonNull(storedResponseProcessor); - this.bidResponseCreator = Objects.requireNonNull(bidResponseCreator); } public Future skipAuction(AuctionContext auctionContext) { @@ -53,7 +55,7 @@ public Future skipAuction(AuctionContext auctionContext) { auctionContext.getDebugWarnings().add(throwable.getMessage()); return Future.succeededFuture(Collections.emptyList()); }) - .compose(storedSeatBids -> enrichAuctionContextWithBidResponse(auctionContext, storedSeatBids)) + .map(storedSeatBids -> enrichAuctionContextWithBidResponse(auctionContext, storedSeatBids)) .map(AuctionContext::skipAuction); } @@ -65,7 +67,7 @@ public Future skipAuction(AuctionContext auctionContext) { auctionContext.getDebugWarnings().add(throwable.getMessage()); return Future.succeededFuture(Collections.emptyList()); }) - .compose(storedSeatBids -> enrichAuctionContextWithBidResponse(auctionContext, storedSeatBids)) + .map(storedSeatBids -> enrichAuctionContextWithBidResponse(auctionContext, storedSeatBids)) .map(AuctionContext::skipAuction); } @@ -94,10 +96,37 @@ private Future> validateStoredSeatBid(List seatBids) { return Future.succeededFuture(seatBids); } - private Future enrichAuctionContextWithBidResponse(AuctionContext auctionContext, - List seatBids) { + private static AuctionContext enrichAuctionContextWithBidResponse(AuctionContext auctionContext, + List seatBids) { auctionContext.getDebugWarnings().add("no auction. response defined by storedauctionresponse"); - return bidResponseCreator.createOnSkippedAuction(auctionContext, seatBids).map(auctionContext::with); + return auctionContext.with(bidResponse(auctionContext, seatBids)); + } + + private static BidResponse bidResponse(AuctionContext auctionContext, List seatBids) { + final BidRequest bidRequest = auctionContext.getBidRequest(); + final ExtBidResponse extBidResponse = ExtBidResponse.builder() + .warnings(extractContextWarnings(auctionContext)) + .tmaxrequest(bidRequest.getTmax()) + .build(); + + final List cur = bidRequest.getCur(); + + return BidResponse.builder() + .id(bidRequest.getId()) + .cur(CollectionUtils.isNotEmpty(cur) ? cur.getFirst() : null) + .seatbid(ListUtils.emptyIfNull(seatBids)) + .ext(extBidResponse) + .build(); + } + + private static Map> extractContextWarnings(AuctionContext auctionContext) { + final List contextWarnings = auctionContext.getDebugWarnings().stream() + .map(message -> ExtBidderError.of(BidderError.Type.generic.getCode(), message)) + .toList(); + + return contextWarnings.isEmpty() + ? Collections.emptyMap() + : Collections.singletonMap("prebid", contextWarnings); } } diff --git a/src/main/java/org/prebid/server/auction/StoredResponseProcessor.java b/src/main/java/org/prebid/server/auction/StoredResponseProcessor.java index 1f5b0d83258..2257320ef69 100644 --- a/src/main/java/org/prebid/server/auction/StoredResponseProcessor.java +++ b/src/main/java/org/prebid/server/auction/StoredResponseProcessor.java @@ -428,7 +428,7 @@ private BidderSeatBid makeBidderSeatBid(BidderSeatBid bidderSeatBid, : DEFAULT_BID_CURRENCY; final List bidderBids = seatBid != null ? seatBid.getBid().stream() - .map(bid -> makeBidderBid(bid, bidCurrency, impIdToBidType)) + .map(bid -> makeBidderBid(bid, bidCurrency, seatBid.getSeat(), impIdToBidType)) .collect(Collectors.toCollection(ArrayList::new)) : new ArrayList<>(); if (nonNullBidderSeatBid) { @@ -439,8 +439,8 @@ private BidderSeatBid makeBidderSeatBid(BidderSeatBid bidderSeatBid, : BidderSeatBid.of(bidderBids); } - private BidderBid makeBidderBid(Bid bid, String bidCurrency, Map impIdToBidType) { - return BidderBid.of(bid, getBidType(bid.getExt(), impIdToBidType.get(bid.getImpid())), bidCurrency); + private BidderBid makeBidderBid(Bid bid, String bidCurrency, String seat, Map impIdToBidType) { + return BidderBid.of(bid, getBidType(bid.getExt(), impIdToBidType.get(bid.getImpid())), seat, bidCurrency); } private BidType getBidType(ObjectNode bidExt, BidType bidType) { diff --git a/src/main/java/org/prebid/server/auction/UidUpdater.java b/src/main/java/org/prebid/server/auction/UidUpdater.java index 5c2390a6db3..014c0d93898 100644 --- a/src/main/java/org/prebid/server/auction/UidUpdater.java +++ b/src/main/java/org/prebid/server/auction/UidUpdater.java @@ -3,6 +3,7 @@ import com.iab.openrtb.request.User; import org.apache.commons.collections4.map.CaseInsensitiveMap; import org.apache.commons.lang3.StringUtils; +import org.prebid.server.auction.aliases.BidderAliases; import org.prebid.server.auction.model.AuctionContext; import org.prebid.server.bidder.BidderCatalog; import org.prebid.server.cookie.UidsCookie; diff --git a/src/main/java/org/prebid/server/auction/adjustment/BidAdjustmentFactorResolver.java b/src/main/java/org/prebid/server/auction/adjustment/BidAdjustmentFactorResolver.java index fa0013d683f..3f41b29110f 100644 --- a/src/main/java/org/prebid/server/auction/adjustment/BidAdjustmentFactorResolver.java +++ b/src/main/java/org/prebid/server/auction/adjustment/BidAdjustmentFactorResolver.java @@ -14,25 +14,41 @@ public class BidAdjustmentFactorResolver { public BigDecimal resolve(ImpMediaType impMediaType, ExtRequestBidAdjustmentFactors adjustmentFactors, - String bidder) { + String bidder, + String seat) { final EnumMap> adjustmentFactorsByMediaTypes = adjustmentFactors.getMediatypes(); + final Map adjustmentsFactors = adjustmentFactors.getAdjustments(); - final BigDecimal effectiveBidderAdjustmentFactor = Optional.ofNullable(adjustmentFactors.getAdjustments()) - .map(factors -> factors.get(bidder)) + return resolveFromMediaTypes(impMediaType, seat, adjustmentFactorsByMediaTypes) + .or(() -> resolveFromAdjustments(seat, adjustmentsFactors)) + .or(() -> resolveFromMediaTypes(impMediaType, bidder, adjustmentFactorsByMediaTypes)) + .or(() -> resolveFromAdjustments(bidder, adjustmentsFactors)) .orElse(BigDecimal.ONE); + } + + private static Optional resolveFromMediaTypes( + ImpMediaType mediaType, + String bidderCode, + EnumMap> adjustmentFactors) { - if (MapUtils.isEmpty(adjustmentFactorsByMediaTypes)) { - return effectiveBidderAdjustmentFactor; + if (MapUtils.isEmpty(adjustmentFactors)) { + return Optional.empty(); } - return Optional.ofNullable(impMediaType) - .map(adjustmentFactorsByMediaTypes::get) + return Optional.ofNullable(mediaType) + .map(adjustmentFactors::get) .flatMap(factors -> factors.entrySet().stream() - .filter(entry -> StringUtils.equalsIgnoreCase(entry.getKey(), bidder)) + .filter(entry -> StringUtils.equalsIgnoreCase(entry.getKey(), bidderCode)) .map(Map.Entry::getValue) - .findFirst()) - .orElse(effectiveBidderAdjustmentFactor); + .findFirst()); + } + + private static Optional resolveFromAdjustments(String bidderCode, + Map adjustmentFactors) { + + return Optional.ofNullable(adjustmentFactors) + .map(factors -> factors.get(bidderCode)); } } diff --git a/src/main/java/org/prebid/server/auction/aliases/AlternateBidder.java b/src/main/java/org/prebid/server/auction/aliases/AlternateBidder.java new file mode 100644 index 00000000000..aab0494cd4f --- /dev/null +++ b/src/main/java/org/prebid/server/auction/aliases/AlternateBidder.java @@ -0,0 +1,10 @@ +package org.prebid.server.auction.aliases; + +import java.util.Set; + +public interface AlternateBidder { + + Boolean getEnabled(); + + Set getAllowedBidderCodes(); +} diff --git a/src/main/java/org/prebid/server/auction/aliases/AlternateBidderCodesConfig.java b/src/main/java/org/prebid/server/auction/aliases/AlternateBidderCodesConfig.java new file mode 100644 index 00000000000..0e91f87fe54 --- /dev/null +++ b/src/main/java/org/prebid/server/auction/aliases/AlternateBidderCodesConfig.java @@ -0,0 +1,10 @@ +package org.prebid.server.auction.aliases; + +import java.util.Map; + +public interface AlternateBidderCodesConfig { + + Boolean getEnabled(); + + Map getBidders(); +} diff --git a/src/main/java/org/prebid/server/auction/aliases/BidderAliases.java b/src/main/java/org/prebid/server/auction/aliases/BidderAliases.java new file mode 100644 index 00000000000..aade755a9ec --- /dev/null +++ b/src/main/java/org/prebid/server/auction/aliases/BidderAliases.java @@ -0,0 +1,131 @@ +package org.prebid.server.auction.aliases; + +import org.apache.commons.collections4.MapUtils; +import org.apache.commons.collections4.map.CaseInsensitiveMap; +import org.apache.commons.lang3.BooleanUtils; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; +import org.prebid.server.bidder.BidderCatalog; + +import java.util.Collection; +import java.util.Collections; +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.TreeSet; +import java.util.stream.Collectors; + +/** + * Represents aliases configured for bidders - configuration might come in OpenRTB request but not limited to it. + */ +public class BidderAliases { + + private static final String WILDCARD = "*"; + + private final Map aliasToBidder; + + private final Map aliasToVendorId; + + private final Map> bidderToAllowedBidderCodes; + + private final BidderCatalog bidderCatalog; + + private BidderAliases(Map aliasToBidder, + Map aliasToVendorId, + Map> bidderToAllowedBidderCodes, + BidderCatalog bidderCatalog) { + + this.aliasToBidder = new CaseInsensitiveMap<>(MapUtils.emptyIfNull(aliasToBidder)); + this.aliasToVendorId = new CaseInsensitiveMap<>(MapUtils.emptyIfNull(aliasToVendorId)); + this.bidderToAllowedBidderCodes = MapUtils.emptyIfNull(bidderToAllowedBidderCodes); + this.bidderCatalog = Objects.requireNonNull(bidderCatalog); + } + + public static BidderAliases of(Map aliasToBidder, + Map aliasToVendorId, + BidderCatalog bidderCatalog) { + + return new BidderAliases(aliasToBidder, aliasToVendorId, null, bidderCatalog); + } + + public static BidderAliases of(Map aliasToBidder, + Map aliasToVendorId, + BidderCatalog bidderCatalog, + AlternateBidderCodesConfig alternateBidderCodes) { + + return new BidderAliases( + aliasToBidder, + aliasToVendorId, + resolveAlternateBidderCodes(alternateBidderCodes), + bidderCatalog); + } + + public boolean isAliasDefined(String alias) { + return aliasToBidder.containsKey(alias); + } + + public String resolveBidder(String aliasOrBidder) { + return bidderCatalog.isValidName(aliasOrBidder) + ? aliasOrBidder + : aliasToBidder.getOrDefault(aliasOrBidder, aliasOrBidder); + } + + public boolean isSame(String bidder1, String bidder2) { + return StringUtils.equalsIgnoreCase(resolveBidder(bidder1), resolveBidder(bidder2)); + } + + public Integer resolveAliasVendorId(String alias) { + final Integer vendorId = resolveAliasVendorIdViaCatalog(alias); + return vendorId == null ? aliasToVendorId.get(alias) : vendorId; + } + + private Integer resolveAliasVendorIdViaCatalog(String alias) { + final String bidderName = resolveBidder(alias); + return bidderCatalog.isActive(bidderName) ? bidderCatalog.vendorIdByName(bidderName) : null; + } + + public boolean isAllowedAlternateBidderCode(String bidder, String alternateBidderCode) { + final Set allowedBidderCodes = ObjectUtils.firstNonNull( + bidderToAllowedBidderCodes.get(bidder), + bidderToAllowedBidderCodes.get(resolveBidder(bidder)), + Collections.emptySet()); + return allowedBidderCodes.contains(WILDCARD) || allowedBidderCodes.contains(alternateBidderCode); + } + + public boolean isKnownAlternateBidderCode(String alternateBidderCode) { + return bidderToAllowedBidderCodes.values().stream() + .anyMatch(knownBidderCodes -> + knownBidderCodes.contains(WILDCARD) || knownBidderCodes.contains(alternateBidderCode)); + } + + private static Map> resolveAlternateBidderCodes( + AlternateBidderCodesConfig alternateBidderCodes) { + + return Optional.ofNullable(alternateBidderCodes) + .filter(config -> BooleanUtils.isTrue(config.getEnabled())) + .map(AlternateBidderCodesConfig::getBidders) + .map(Map::entrySet) + .stream() + .flatMap(Collection::stream) + .filter(entry -> BooleanUtils.isTrue(entry.getValue().getEnabled())) + .map(entry -> Map.entry(entry.getKey(), allowedBidderCodes(entry.getValue()))) + .collect(Collectors.toMap( + Map.Entry::getKey, + Map.Entry::getValue, + (first, second) -> second, + CaseInsensitiveMap::new)); + } + + private static Set allowedBidderCodes(AlternateBidder alternateBidder) { + final Set allowedBidderCodes = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); + final Set alternateCodes = alternateBidder.getAllowedBidderCodes(); + + if (alternateCodes == null) { + allowedBidderCodes.add(WILDCARD); + } else { + allowedBidderCodes.addAll(alternateCodes); + } + return allowedBidderCodes; + } +} diff --git a/src/main/java/org/prebid/server/auction/mediatypeprocessor/BidderMediaTypeProcessor.java b/src/main/java/org/prebid/server/auction/mediatypeprocessor/BidderMediaTypeProcessor.java index 0171ff90b68..17828059175 100644 --- a/src/main/java/org/prebid/server/auction/mediatypeprocessor/BidderMediaTypeProcessor.java +++ b/src/main/java/org/prebid/server/auction/mediatypeprocessor/BidderMediaTypeProcessor.java @@ -3,7 +3,7 @@ import com.iab.openrtb.request.BidRequest; import com.iab.openrtb.request.Imp; import org.apache.commons.collections4.SetUtils; -import org.prebid.server.auction.BidderAliases; +import org.prebid.server.auction.aliases.BidderAliases; import org.prebid.server.bidder.BidderCatalog; import org.prebid.server.bidder.BidderInfo; import org.prebid.server.bidder.model.BidderError; diff --git a/src/main/java/org/prebid/server/auction/mediatypeprocessor/CompositeMediaTypeProcessor.java b/src/main/java/org/prebid/server/auction/mediatypeprocessor/CompositeMediaTypeProcessor.java index c51d35eb33f..5dbd2bb3ae6 100644 --- a/src/main/java/org/prebid/server/auction/mediatypeprocessor/CompositeMediaTypeProcessor.java +++ b/src/main/java/org/prebid/server/auction/mediatypeprocessor/CompositeMediaTypeProcessor.java @@ -1,7 +1,7 @@ package org.prebid.server.auction.mediatypeprocessor; import com.iab.openrtb.request.BidRequest; -import org.prebid.server.auction.BidderAliases; +import org.prebid.server.auction.aliases.BidderAliases; import org.prebid.server.bidder.model.BidderError; import org.prebid.server.settings.model.Account; diff --git a/src/main/java/org/prebid/server/auction/mediatypeprocessor/MediaTypeProcessor.java b/src/main/java/org/prebid/server/auction/mediatypeprocessor/MediaTypeProcessor.java index 89e7f07589b..0cf5f19bd6a 100644 --- a/src/main/java/org/prebid/server/auction/mediatypeprocessor/MediaTypeProcessor.java +++ b/src/main/java/org/prebid/server/auction/mediatypeprocessor/MediaTypeProcessor.java @@ -1,7 +1,7 @@ package org.prebid.server.auction.mediatypeprocessor; import com.iab.openrtb.request.BidRequest; -import org.prebid.server.auction.BidderAliases; +import org.prebid.server.auction.aliases.BidderAliases; import org.prebid.server.settings.model.Account; public interface MediaTypeProcessor { diff --git a/src/main/java/org/prebid/server/auction/mediatypeprocessor/MultiFormatMediaTypeProcessor.java b/src/main/java/org/prebid/server/auction/mediatypeprocessor/MultiFormatMediaTypeProcessor.java index af0a9e2428c..0fda09f919e 100644 --- a/src/main/java/org/prebid/server/auction/mediatypeprocessor/MultiFormatMediaTypeProcessor.java +++ b/src/main/java/org/prebid/server/auction/mediatypeprocessor/MultiFormatMediaTypeProcessor.java @@ -4,7 +4,7 @@ import com.iab.openrtb.request.BidRequest; import com.iab.openrtb.request.Imp; import org.apache.commons.lang3.StringUtils; -import org.prebid.server.auction.BidderAliases; +import org.prebid.server.auction.aliases.BidderAliases; import org.prebid.server.bidder.BidderCatalog; import org.prebid.server.bidder.model.BidderError; import org.prebid.server.proto.openrtb.ext.request.ExtRequest; diff --git a/src/main/java/org/prebid/server/auction/model/BidInfo.java b/src/main/java/org/prebid/server/auction/model/BidInfo.java index aa3be49fd48..f2e3fc7b438 100644 --- a/src/main/java/org/prebid/server/auction/model/BidInfo.java +++ b/src/main/java/org/prebid/server/auction/model/BidInfo.java @@ -21,6 +21,8 @@ public class BidInfo { String bidder; + String seat; + BidType bidType; CacheInfo cacheInfo; diff --git a/src/main/java/org/prebid/server/auction/model/BidRejectionTracker.java b/src/main/java/org/prebid/server/auction/model/BidRejectionTracker.java index 476e61fac09..c482c04738f 100644 --- a/src/main/java/org/prebid/server/auction/model/BidRejectionTracker.java +++ b/src/main/java/org/prebid/server/auction/model/BidRejectionTracker.java @@ -120,15 +120,18 @@ public void rejectAllImps(BidRejectionReason reason) { involvedImpIds.forEach(impId -> rejectImp(impId, reason)); } - public Map getRejectedImps() { - final Map rejectedImpIds = new HashMap<>(); + public Map> getRejectedImps() { + final Map> rejectedImpIds = new HashMap<>(); for (String impId : involvedImpIds) { final Set succeededBids = succeededBidsIds.getOrDefault(impId, Collections.emptySet()); if (succeededBids.isEmpty()) { if (rejectedBids.containsKey(impId)) { - rejectedImpIds.put(impId, rejectedBids.get(impId).getFirst().getRight()); + final Pair rejected = rejectedBids.get(impId).getFirst(); + final String seat = Optional.ofNullable(rejected.getLeft()).map(BidderBid::getSeat).orElse(bidder); + final BidRejectionReason bidRejectionReason = rejected.getRight(); + rejectedImpIds.put(impId, Pair.of(seat, bidRejectionReason)); } else { - rejectedImpIds.put(impId, BidRejectionReason.NO_BID); + rejectedImpIds.put(impId, Pair.of(bidder, BidRejectionReason.NO_BID)); } } } diff --git a/src/main/java/org/prebid/server/auction/model/BidderResponseInfo.java b/src/main/java/org/prebid/server/auction/model/BidderResponseInfo.java index f02a9af5b72..0de6072134d 100644 --- a/src/main/java/org/prebid/server/auction/model/BidderResponseInfo.java +++ b/src/main/java/org/prebid/server/auction/model/BidderResponseInfo.java @@ -10,11 +10,15 @@ public class BidderResponseInfo { String bidder; + String seat; + + String adapterCode; + BidderSeatBidInfo seatBid; int responseTime; public BidderResponseInfo with(BidderSeatBidInfo seatBid) { - return of(this.bidder, seatBid, this.responseTime); + return of(this.bidder, this.seat, this.adapterCode, seatBid, this.responseTime); } } diff --git a/src/main/java/org/prebid/server/auction/model/TargetingInfo.java b/src/main/java/org/prebid/server/auction/model/TargetingInfo.java index a85b1041971..dbd3d7fd2b3 100644 --- a/src/main/java/org/prebid/server/auction/model/TargetingInfo.java +++ b/src/main/java/org/prebid/server/auction/model/TargetingInfo.java @@ -9,6 +9,8 @@ public class TargetingInfo { String bidderCode; + String seat; + boolean isTargetingEnabled; boolean isWinningBid; diff --git a/src/main/java/org/prebid/server/auction/privacy/enforcement/ActivityEnforcement.java b/src/main/java/org/prebid/server/auction/privacy/enforcement/ActivityEnforcement.java index 395dff73802..009b14ade2a 100644 --- a/src/main/java/org/prebid/server/auction/privacy/enforcement/ActivityEnforcement.java +++ b/src/main/java/org/prebid/server/auction/privacy/enforcement/ActivityEnforcement.java @@ -12,7 +12,7 @@ import org.prebid.server.activity.infrastructure.payload.ActivityInvocationPayload; import org.prebid.server.activity.infrastructure.payload.impl.ActivityInvocationPayloadImpl; import org.prebid.server.activity.infrastructure.payload.impl.PrivacyEnforcementServiceActivityInvocationPayload; -import org.prebid.server.auction.BidderAliases; +import org.prebid.server.auction.aliases.BidderAliases; import org.prebid.server.auction.model.AuctionContext; import org.prebid.server.auction.model.BidderPrivacyResult; import org.prebid.server.auction.privacy.enforcement.mask.UserFpdActivityMask; diff --git a/src/main/java/org/prebid/server/auction/privacy/enforcement/CcpaEnforcement.java b/src/main/java/org/prebid/server/auction/privacy/enforcement/CcpaEnforcement.java index 51a8d8f4622..dd9c9b0e580 100644 --- a/src/main/java/org/prebid/server/auction/privacy/enforcement/CcpaEnforcement.java +++ b/src/main/java/org/prebid/server/auction/privacy/enforcement/CcpaEnforcement.java @@ -2,7 +2,7 @@ import com.iab.openrtb.request.BidRequest; import io.vertx.core.Future; -import org.prebid.server.auction.BidderAliases; +import org.prebid.server.auction.aliases.BidderAliases; import org.prebid.server.auction.model.AuctionContext; import org.prebid.server.auction.model.BidderPrivacyResult; import org.prebid.server.auction.privacy.enforcement.mask.UserFpdCcpaMask; diff --git a/src/main/java/org/prebid/server/auction/privacy/enforcement/CoppaEnforcement.java b/src/main/java/org/prebid/server/auction/privacy/enforcement/CoppaEnforcement.java index 9ebe0c8d044..8b273b665df 100644 --- a/src/main/java/org/prebid/server/auction/privacy/enforcement/CoppaEnforcement.java +++ b/src/main/java/org/prebid/server/auction/privacy/enforcement/CoppaEnforcement.java @@ -1,7 +1,7 @@ package org.prebid.server.auction.privacy.enforcement; import io.vertx.core.Future; -import org.prebid.server.auction.BidderAliases; +import org.prebid.server.auction.aliases.BidderAliases; import org.prebid.server.auction.model.AuctionContext; import org.prebid.server.auction.model.BidderPrivacyResult; import org.prebid.server.auction.privacy.enforcement.mask.UserFpdCoppaMask; diff --git a/src/main/java/org/prebid/server/auction/privacy/enforcement/PrivacyEnforcement.java b/src/main/java/org/prebid/server/auction/privacy/enforcement/PrivacyEnforcement.java index d12e290fb2e..6ff56836e79 100644 --- a/src/main/java/org/prebid/server/auction/privacy/enforcement/PrivacyEnforcement.java +++ b/src/main/java/org/prebid/server/auction/privacy/enforcement/PrivacyEnforcement.java @@ -1,7 +1,7 @@ package org.prebid.server.auction.privacy.enforcement; import io.vertx.core.Future; -import org.prebid.server.auction.BidderAliases; +import org.prebid.server.auction.aliases.BidderAliases; import org.prebid.server.auction.model.AuctionContext; import org.prebid.server.auction.model.BidderPrivacyResult; diff --git a/src/main/java/org/prebid/server/auction/privacy/enforcement/PrivacyEnforcementService.java b/src/main/java/org/prebid/server/auction/privacy/enforcement/PrivacyEnforcementService.java index f50a7c637f6..9d18300197b 100644 --- a/src/main/java/org/prebid/server/auction/privacy/enforcement/PrivacyEnforcementService.java +++ b/src/main/java/org/prebid/server/auction/privacy/enforcement/PrivacyEnforcementService.java @@ -2,7 +2,7 @@ import com.iab.openrtb.request.User; import io.vertx.core.Future; -import org.prebid.server.auction.BidderAliases; +import org.prebid.server.auction.aliases.BidderAliases; import org.prebid.server.auction.model.AuctionContext; import org.prebid.server.auction.model.BidderPrivacyResult; diff --git a/src/main/java/org/prebid/server/auction/privacy/enforcement/TcfEnforcement.java b/src/main/java/org/prebid/server/auction/privacy/enforcement/TcfEnforcement.java index e8409ecb359..4bac7952375 100644 --- a/src/main/java/org/prebid/server/auction/privacy/enforcement/TcfEnforcement.java +++ b/src/main/java/org/prebid/server/auction/privacy/enforcement/TcfEnforcement.java @@ -6,7 +6,7 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.prebid.server.activity.infrastructure.ActivityInfrastructure; -import org.prebid.server.auction.BidderAliases; +import org.prebid.server.auction.aliases.BidderAliases; import org.prebid.server.auction.model.AuctionContext; import org.prebid.server.auction.model.BidderPrivacyResult; import org.prebid.server.auction.privacy.enforcement.mask.UserFpdTcfMask; diff --git a/src/main/java/org/prebid/server/auction/requestfactory/Ortb2ImplicitParametersResolver.java b/src/main/java/org/prebid/server/auction/requestfactory/Ortb2ImplicitParametersResolver.java index 5bcabe413db..5446da183ad 100644 --- a/src/main/java/org/prebid/server/auction/requestfactory/Ortb2ImplicitParametersResolver.java +++ b/src/main/java/org/prebid/server/auction/requestfactory/Ortb2ImplicitParametersResolver.java @@ -24,7 +24,7 @@ import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; -import org.prebid.server.auction.BidderAliases; +import org.prebid.server.auction.aliases.BidderAliases; import org.prebid.server.auction.ImplicitParametersExtractor; import org.prebid.server.auction.IpAddressHelper; import org.prebid.server.auction.PriceGranularity; diff --git a/src/main/java/org/prebid/server/bidadjustments/BidAdjustmentsProcessor.java b/src/main/java/org/prebid/server/bidadjustments/BidAdjustmentsProcessor.java index 1136876c7f6..f419a0ad4d4 100644 --- a/src/main/java/org/prebid/server/bidadjustments/BidAdjustmentsProcessor.java +++ b/src/main/java/org/prebid/server/bidadjustments/BidAdjustmentsProcessor.java @@ -1,5 +1,6 @@ package org.prebid.server.bidadjustments; +import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.DecimalNode; import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.TextNode; @@ -21,18 +22,22 @@ import org.prebid.server.proto.openrtb.ext.request.ExtRequestBidAdjustmentFactors; import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebid; import org.prebid.server.proto.openrtb.ext.request.ImpMediaType; +import org.prebid.server.proto.openrtb.ext.response.ExtBidPrebid; +import org.prebid.server.proto.openrtb.ext.response.ExtBidPrebidMeta; import org.prebid.server.util.PbsUtil; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import java.util.Objects; +import java.util.Optional; import java.util.stream.Collectors; public class BidAdjustmentsProcessor { private static final String ORIGINAL_BID_CPM = "origbidcpm"; private static final String ORIGINAL_BID_CURRENCY = "origbidcur"; + private static final String PREBID_EXT = "prebid"; private final CurrencyConversionService currencyService; private final BidAdjustmentFactorResolver bidAdjustmentFactorResolver; @@ -97,7 +102,8 @@ private BidderBid applyBidAdjustments(BidderBid bidderBid, final Price priceWithFactorsApplied = applyBidAdjustmentFactors( originalPrice, - bidder, + getAdapterCode(bidderBid.getBid()), + bidderBid.getSeat(), bidRequest, mediaType); @@ -116,6 +122,23 @@ private BidderBid applyBidAdjustments(BidderBid bidderBid, } } + private String getAdapterCode(Bid bid) { + return Optional.ofNullable(bid.getExt()) + .filter(ext -> ext.hasNonNull(PREBID_EXT)) + .map(this::convertValue) + .map(ExtBidPrebid::getMeta) + .map(ExtBidPrebidMeta::getAdapterCode) + .orElse(null); + } + + private ExtBidPrebid convertValue(JsonNode jsonNode) { + try { + return mapper.mapper().convertValue(jsonNode.get(PREBID_EXT), ExtBidPrebid.class); + } catch (IllegalArgumentException ignored) { + return null; + } + } + private BidderBid updateBid(Price originalPrice, Price adjustedPrice, BidderBid bidderBid, BidRequest bidRequest) { final Bid bid = bidderBid.getBid(); final ObjectNode bidExt = bid.getExt(); @@ -154,26 +177,31 @@ private Price getOriginalPrice(BidderBid bidderBid) { private Price applyBidAdjustmentFactors(Price bidPrice, String bidder, + String seat, BidRequest bidRequest, ImpMediaType mediaType) { final String bidCurrency = bidPrice.getCurrency(); final BigDecimal price = bidPrice.getValue(); - final BigDecimal priceAdjustmentFactor = bidAdjustmentForBidder(bidder, bidRequest, mediaType); + final BigDecimal priceAdjustmentFactor = bidAdjustmentForBidder(bidder, seat, bidRequest, mediaType); final BigDecimal adjustedPrice = adjustPrice(priceAdjustmentFactor, price); return Price.of(bidCurrency, adjustedPrice.compareTo(price) != 0 ? adjustedPrice : price); } - private BigDecimal bidAdjustmentForBidder(String bidder, BidRequest bidRequest, ImpMediaType mediaType) { + private BigDecimal bidAdjustmentForBidder(String bidder, + String seat, + BidRequest bidRequest, + ImpMediaType mediaType) { + final ExtRequestBidAdjustmentFactors adjustmentFactors = extBidAdjustmentFactors(bidRequest); if (adjustmentFactors == null) { return null; } final ImpMediaType targetMediaType = mediaType == ImpMediaType.video_instream ? ImpMediaType.video : mediaType; - return bidAdjustmentFactorResolver.resolve(targetMediaType, adjustmentFactors, bidder); + return bidAdjustmentFactorResolver.resolve(targetMediaType, adjustmentFactors, bidder, seat); } private static ExtRequestBidAdjustmentFactors extBidAdjustmentFactors(BidRequest bidRequest) { diff --git a/src/main/java/org/prebid/server/bidder/BidderCatalog.java b/src/main/java/org/prebid/server/bidder/BidderCatalog.java index 3d8db57e941..fd2cb0dd930 100644 --- a/src/main/java/org/prebid/server/bidder/BidderCatalog.java +++ b/src/main/java/org/prebid/server/bidder/BidderCatalog.java @@ -226,4 +226,11 @@ public Bidder bidderByName(String name) { .map(BidderInstanceDeps::getBidder) .orElse(null); } + + public String configuredName(String name) { + return Optional.ofNullable(name) + .map(bidderDepsMap::get) + .map(BidderInstanceDeps::getName) + .orElse(null); + } } diff --git a/src/main/java/org/prebid/server/bidder/HttpBidderRequestEnricher.java b/src/main/java/org/prebid/server/bidder/HttpBidderRequestEnricher.java index 4aabd5960a5..4872c6fd991 100644 --- a/src/main/java/org/prebid/server/bidder/HttpBidderRequestEnricher.java +++ b/src/main/java/org/prebid/server/bidder/HttpBidderRequestEnricher.java @@ -5,7 +5,7 @@ import io.netty.handler.codec.http.HttpHeaderValues; import io.vertx.core.MultiMap; import org.apache.commons.lang3.StringUtils; -import org.prebid.server.auction.BidderAliases; +import org.prebid.server.auction.aliases.BidderAliases; import org.prebid.server.model.CaseInsensitiveMultiMap; import org.prebid.server.proto.openrtb.ext.request.ExtApp; import org.prebid.server.proto.openrtb.ext.request.ExtAppPrebid; diff --git a/src/main/java/org/prebid/server/bidder/HttpBidderRequester.java b/src/main/java/org/prebid/server/bidder/HttpBidderRequester.java index 3a24683c774..d3b9d452eac 100644 --- a/src/main/java/org/prebid/server/bidder/HttpBidderRequester.java +++ b/src/main/java/org/prebid/server/bidder/HttpBidderRequester.java @@ -9,7 +9,7 @@ import io.vertx.core.MultiMap; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; -import org.prebid.server.auction.BidderAliases; +import org.prebid.server.auction.aliases.BidderAliases; import org.prebid.server.auction.ExchangeService; import org.prebid.server.auction.model.BidRejectionReason; import org.prebid.server.auction.model.BidRejectionTracker; diff --git a/src/main/java/org/prebid/server/bidder/amx/AmxBidder.java b/src/main/java/org/prebid/server/bidder/amx/AmxBidder.java index bed5622ec06..2d587b37ab6 100644 --- a/src/main/java/org/prebid/server/bidder/amx/AmxBidder.java +++ b/src/main/java/org/prebid/server/bidder/amx/AmxBidder.java @@ -173,8 +173,11 @@ private BidderBid createBidderBid(Bid bid, String cur, List errors) errors.add(BidderError.badInput(e.getMessage())); return null; } - // TODO: After adding support to change seat data, add bid.ext bidderCode processing - return BidderBid.of(resolveBid(bid, amxBidExt.getDemandSource()), getBidType(amxBidExt), cur); + return BidderBid.of( + resolveBid(bid, amxBidExt.getDemandSource()), + getBidType(amxBidExt), + amxBidExt.getBidderCode(), + cur); } private AmxBidExt parseBidderExt(ObjectNode ext) { diff --git a/src/main/java/org/prebid/server/bidder/model/BidderBid.java b/src/main/java/org/prebid/server/bidder/model/BidderBid.java index ef4b18eaa2d..559d072cdd4 100644 --- a/src/main/java/org/prebid/server/bidder/model/BidderBid.java +++ b/src/main/java/org/prebid/server/bidder/model/BidderBid.java @@ -19,6 +19,8 @@ public class BidderBid { */ Bid bid; + String seat; + /** * Will become response.seatbid[i].bid.ext.prebid.type in the final OpenRTB response. */ @@ -52,4 +54,13 @@ public static BidderBid of(Bid bid, BidType bidType, String bidCurrency) { .bidCurrency(bidCurrency) .build(); } + + public static BidderBid of(Bid bid, BidType bidType, String seat, String bidCurrency) { + return BidderBid.builder() + .bid(bid) + .type(bidType) + .bidCurrency(bidCurrency) + .seat(seat) + .build(); + } } diff --git a/src/main/java/org/prebid/server/bidder/pubmatic/PubmaticBidder.java b/src/main/java/org/prebid/server/bidder/pubmatic/PubmaticBidder.java index 4a9e9818688..3072091d198 100644 --- a/src/main/java/org/prebid/server/bidder/pubmatic/PubmaticBidder.java +++ b/src/main/java/org/prebid/server/bidder/pubmatic/PubmaticBidder.java @@ -554,6 +554,7 @@ private BidderBid resolveBidderBid(Bid bid, String currency, List b .type(bidType) .bidCurrency(currency) .dealPriority(getDealPriority(pubmaticBidExt)) + .seat(pubmaticBidExt == null ? null : pubmaticBidExt.getMarketplace()) .build(); } diff --git a/src/main/java/org/prebid/server/bidder/pubmatic/model/response/PubmaticBidExt.java b/src/main/java/org/prebid/server/bidder/pubmatic/model/response/PubmaticBidExt.java index b469bbd59b6..f41bac7da89 100644 --- a/src/main/java/org/prebid/server/bidder/pubmatic/model/response/PubmaticBidExt.java +++ b/src/main/java/org/prebid/server/bidder/pubmatic/model/response/PubmaticBidExt.java @@ -17,4 +17,6 @@ public class PubmaticBidExt { @JsonProperty("prebiddealpriority") Integer prebidDealPriority; + + String marketplace; } diff --git a/src/main/java/org/prebid/server/bidder/vungle/VungleBidder.java b/src/main/java/org/prebid/server/bidder/vungle/VungleBidder.java index f2c87bc2583..aa16a4367f1 100644 --- a/src/main/java/org/prebid/server/bidder/vungle/VungleBidder.java +++ b/src/main/java/org/prebid/server/bidder/vungle/VungleBidder.java @@ -7,7 +7,6 @@ import com.iab.openrtb.request.Site; import com.iab.openrtb.request.User; 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; @@ -32,7 +31,6 @@ import java.math.BigDecimal; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Objects; @@ -165,10 +163,9 @@ private static List extractBids(BidResponse bidResponse) { private static List bidsFromResponse(BidResponse bidResponse) { return bidResponse.getSeatbid().stream() .filter(Objects::nonNull) - .map(SeatBid::getBid) - .filter(Objects::nonNull) - .flatMap(Collection::stream) - .map(bid -> BidderBid.of(bid, BidType.video, bidResponse.getCur())) + .flatMap(seatBid -> seatBid.getBid().stream() + .filter(Objects::nonNull) + .map(bid -> BidderBid.of(bid, BidType.video, seatBid.getSeat(), bidResponse.getCur()))) .toList(); } } diff --git a/src/main/java/org/prebid/server/metric/MetricName.java b/src/main/java/org/prebid/server/metric/MetricName.java index 7c41dd65e72..84bb68f1c67 100644 --- a/src/main/java/org/prebid/server/metric/MetricName.java +++ b/src/main/java/org/prebid/server/metric/MetricName.java @@ -75,6 +75,7 @@ public enum MetricName { err, networkerr, buyeruid_scrubbed, + seat, // bids validation warn, diff --git a/src/main/java/org/prebid/server/metric/Metrics.java b/src/main/java/org/prebid/server/metric/Metrics.java index 2d0cc1aeaf2..0fb0145f313 100644 --- a/src/main/java/org/prebid/server/metric/Metrics.java +++ b/src/main/java/org/prebid/server/metric/Metrics.java @@ -382,6 +382,10 @@ public void updateSecureValidationMetrics(String bidder, String accountId, Metri forAccount(accountId).response().validation().secure().incCounter(type); } + public void updateSeatValidationMetrics(String bidder) { + forAdapter(bidder).response().validation().incCounter(MetricName.seat); + } + public void updateUserSyncOptoutMetric() { userSync().incCounter(MetricName.opt_outs); } diff --git a/src/main/java/org/prebid/server/privacy/gdpr/VendorIdResolver.java b/src/main/java/org/prebid/server/privacy/gdpr/VendorIdResolver.java index 5c646d3b925..d8d360fa823 100644 --- a/src/main/java/org/prebid/server/privacy/gdpr/VendorIdResolver.java +++ b/src/main/java/org/prebid/server/privacy/gdpr/VendorIdResolver.java @@ -1,6 +1,6 @@ package org.prebid.server.privacy.gdpr; -import org.prebid.server.auction.BidderAliases; +import org.prebid.server.auction.aliases.BidderAliases; import org.prebid.server.bidder.BidderCatalog; public class VendorIdResolver { 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..98754a459a5 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 @@ -190,4 +190,7 @@ public class ExtRequestPrebid { */ @JsonProperty("paaformat") PaaFormat paaFormat; + + @JsonProperty("alternatebiddercodes") + ExtRequestPrebidAlternateBidderCodes alternateBidderCodes; } diff --git a/src/main/java/org/prebid/server/proto/openrtb/ext/request/ExtRequestPrebidAlternateBidderCodes.java b/src/main/java/org/prebid/server/proto/openrtb/ext/request/ExtRequestPrebidAlternateBidderCodes.java new file mode 100644 index 00000000000..60dc15956db --- /dev/null +++ b/src/main/java/org/prebid/server/proto/openrtb/ext/request/ExtRequestPrebidAlternateBidderCodes.java @@ -0,0 +1,14 @@ +package org.prebid.server.proto.openrtb.ext.request; + +import lombok.Value; +import org.prebid.server.auction.aliases.AlternateBidderCodesConfig; + +import java.util.Map; + +@Value(staticConstructor = "of") +public class ExtRequestPrebidAlternateBidderCodes implements AlternateBidderCodesConfig { + + Boolean enabled; + + Map bidders; +} diff --git a/src/main/java/org/prebid/server/proto/openrtb/ext/request/ExtRequestPrebidAlternateBidderCodesBidder.java b/src/main/java/org/prebid/server/proto/openrtb/ext/request/ExtRequestPrebidAlternateBidderCodesBidder.java new file mode 100644 index 00000000000..61caa45e792 --- /dev/null +++ b/src/main/java/org/prebid/server/proto/openrtb/ext/request/ExtRequestPrebidAlternateBidderCodesBidder.java @@ -0,0 +1,16 @@ +package org.prebid.server.proto.openrtb.ext.request; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Value; +import org.prebid.server.auction.aliases.AlternateBidder; + +import java.util.Set; + +@Value(staticConstructor = "of") +public class ExtRequestPrebidAlternateBidderCodesBidder implements AlternateBidder { + + Boolean enabled; + + @JsonProperty("allowedbiddercodes") + Set allowedBidderCodes; +} diff --git a/src/main/java/org/prebid/server/proto/openrtb/ext/request/resetdigital/ExtImpResetDigital.java b/src/main/java/org/prebid/server/proto/openrtb/ext/request/resetdigital/ExtImpResetDigital.java new file mode 100644 index 00000000000..78cf004662e --- /dev/null +++ b/src/main/java/org/prebid/server/proto/openrtb/ext/request/resetdigital/ExtImpResetDigital.java @@ -0,0 +1,9 @@ +package org.prebid.server.proto.openrtb.ext.request.resetdigital; + +import lombok.Value; + +@Value(staticConstructor = "of") +public class ExtImpResetDigital { + + String placementId; +} diff --git a/src/main/java/org/prebid/server/settings/model/Account.java b/src/main/java/org/prebid/server/settings/model/Account.java index c54998320d4..4286c5077f0 100644 --- a/src/main/java/org/prebid/server/settings/model/Account.java +++ b/src/main/java/org/prebid/server/settings/model/Account.java @@ -27,6 +27,9 @@ public class Account { AccountSettings settings; + @JsonAlias("alternate-bidder-codes") + AccountAlternateBidderCodes alternateBidderCodes; + public static Account empty(String id) { return Account.builder().id(id).build(); } diff --git a/src/main/java/org/prebid/server/settings/model/AccountAlternateBidderCodes.java b/src/main/java/org/prebid/server/settings/model/AccountAlternateBidderCodes.java new file mode 100644 index 00000000000..bcf8e937eb8 --- /dev/null +++ b/src/main/java/org/prebid/server/settings/model/AccountAlternateBidderCodes.java @@ -0,0 +1,14 @@ +package org.prebid.server.settings.model; + +import lombok.Value; +import org.prebid.server.auction.aliases.AlternateBidderCodesConfig; + +import java.util.Map; + +@Value(staticConstructor = "of") +public class AccountAlternateBidderCodes implements AlternateBidderCodesConfig { + + Boolean enabled; + + Map bidders; +} diff --git a/src/main/java/org/prebid/server/settings/model/AccountAlternateBidderCodesBidder.java b/src/main/java/org/prebid/server/settings/model/AccountAlternateBidderCodesBidder.java new file mode 100644 index 00000000000..50f230133d5 --- /dev/null +++ b/src/main/java/org/prebid/server/settings/model/AccountAlternateBidderCodesBidder.java @@ -0,0 +1,16 @@ +package org.prebid.server.settings.model; + +import com.fasterxml.jackson.annotation.JsonAlias; +import lombok.Value; +import org.prebid.server.auction.aliases.AlternateBidder; + +import java.util.Set; + +@Value(staticConstructor = "of") +public class AccountAlternateBidderCodesBidder implements AlternateBidder { + + Boolean enabled; + + @JsonAlias("allowed-bidder-codes") + Set allowedBidderCodes; +} diff --git a/src/main/java/org/prebid/server/spring/config/ServiceConfiguration.java b/src/main/java/org/prebid/server/spring/config/ServiceConfiguration.java index 10fd17ad162..0ab743a484f 100644 --- a/src/main/java/org/prebid/server/spring/config/ServiceConfiguration.java +++ b/src/main/java/org/prebid/server/spring/config/ServiceConfiguration.java @@ -1185,10 +1185,8 @@ DsaEnforcer dsaEnforcer(JacksonMapper mapper) { } @Bean - SkippedAuctionService skipAuctionService(StoredResponseProcessor storedResponseProcessor, - BidResponseCreator bidResponseCreator) { - - return new SkippedAuctionService(storedResponseProcessor, bidResponseCreator); + SkippedAuctionService skipAuctionService(StoredResponseProcessor storedResponseProcessor) { + return new SkippedAuctionService(storedResponseProcessor); } @Bean diff --git a/src/main/java/org/prebid/server/validation/ImpValidator.java b/src/main/java/org/prebid/server/validation/ImpValidator.java index 986e63eca68..9a31aa6e52d 100644 --- a/src/main/java/org/prebid/server/validation/ImpValidator.java +++ b/src/main/java/org/prebid/server/validation/ImpValidator.java @@ -28,7 +28,7 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.exception.ExceptionUtils; -import org.prebid.server.auction.BidderAliases; +import org.prebid.server.auction.aliases.BidderAliases; import org.prebid.server.bidder.BidderCatalog; import org.prebid.server.json.JacksonMapper; import org.prebid.server.proto.openrtb.ext.request.ExtImpPrebid; @@ -361,8 +361,11 @@ private void validateNativeEventTracker(EventTracker eventTracker, int impIndex, } } - private void validateImpExt(ObjectNode ext, Map aliases, int impIndex, + private void validateImpExt(ObjectNode ext, + Map aliases, + int impIndex, List warnings) throws ValidationException { + validateImpExtPrebid(ext != null ? ext.get(PREBID_EXT) : null, aliases, impIndex, warnings); } diff --git a/src/main/java/org/prebid/server/validation/RequestValidator.java b/src/main/java/org/prebid/server/validation/RequestValidator.java index d4838b1a5e3..d4b9fb06726 100644 --- a/src/main/java/org/prebid/server/validation/RequestValidator.java +++ b/src/main/java/org/prebid/server/validation/RequestValidator.java @@ -13,8 +13,12 @@ import com.iab.openrtb.request.User; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.MapUtils; +import org.apache.commons.collections4.map.CaseInsensitiveMap; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; +import org.prebid.server.auction.aliases.AlternateBidder; +import org.prebid.server.auction.aliases.AlternateBidderCodesConfig; +import org.prebid.server.auction.aliases.BidderAliases; import org.prebid.server.auction.model.debug.DebugContext; import org.prebid.server.bidder.BidderCatalog; import org.prebid.server.json.JacksonMapper; @@ -133,10 +137,18 @@ public ValidationResult validate(Account account, if (targeting != null) { validateTargeting(targeting); } - aliases = ObjectUtils.defaultIfNull(extRequestPrebid.getAliases(), Collections.emptyMap()); + aliases = new CaseInsensitiveMap<>(MapUtils.emptyIfNull(extRequestPrebid.getAliases())); validateAliases(aliases, warnings, account); validateAliasesGvlIds(extRequestPrebid, aliases); - validateBidAdjustmentFactors(extRequestPrebid.getBidadjustmentfactors(), aliases); + validateAlternateBidderCodes(extRequestPrebid.getAlternateBidderCodes(), aliases); + + final AlternateBidderCodesConfig alternateBidderCodesConfig = ObjectUtils.defaultIfNull( + extRequestPrebid.getAlternateBidderCodes(), + account == null ? null : account.getAlternateBidderCodes()); + + final BidderAliases bidderAliases = BidderAliases.of( + aliases, null, bidderCatalog, alternateBidderCodesConfig); + validateBidAdjustmentFactors(extRequestPrebid.getBidadjustmentfactors(), bidderAliases); validateExtBidPrebidData(extRequestPrebid.getData(), aliases, isDebugEnabled, warnings); validateSchains(extRequestPrebid.getSchains()); } @@ -217,7 +229,8 @@ private void validateCur(List currencies) throws ValidationException { private void validateAliasesGvlIds(ExtRequestPrebid extRequestPrebid, Map aliases) throws ValidationException { - final Map aliasGvlIds = MapUtils.emptyIfNull(extRequestPrebid.getAliasgvlids()); + final Map aliasGvlIds = new CaseInsensitiveMap<>(MapUtils.emptyIfNull( + extRequestPrebid.getAliasgvlids())); for (Map.Entry aliasToGvlId : aliasGvlIds.entrySet()) { @@ -238,9 +251,25 @@ private void validateAliasesGvlIds(ExtRequestPrebid extRequestPrebid, } } - private void validateBidAdjustmentFactors(ExtRequestBidAdjustmentFactors adjustmentFactors, + private void validateAlternateBidderCodes(AlternateBidderCodesConfig alternateBidderCodesConfig, Map aliases) throws ValidationException { + final Map alternateBidders = Optional.ofNullable(alternateBidderCodesConfig) + .map(AlternateBidderCodesConfig::getBidders) + .orElse(Collections.emptyMap()); + + for (Map.Entry alternateBidder : alternateBidders.entrySet()) { + final String bidder = alternateBidder.getKey(); + if (isUnknownBidderOrAlias(bidder, aliases)) { + throw new ValidationException( + "request.ext.prebid.alternatebiddercodes.bidders.%s is not a known bidder or alias", bidder); + } + } + } + + private void validateBidAdjustmentFactors(ExtRequestBidAdjustmentFactors adjustmentFactors, + BidderAliases bidderAliases) throws ValidationException { + final Map bidderAdjustments = adjustmentFactors != null ? adjustmentFactors.getAdjustments() : Collections.emptyMap(); @@ -248,7 +277,10 @@ private void validateBidAdjustmentFactors(ExtRequestBidAdjustmentFactors adjustm for (Map.Entry bidderAdjustment : bidderAdjustments.entrySet()) { final String bidder = bidderAdjustment.getKey(); - if (isUnknownBidderOrAlias(bidder, aliases)) { + if (!bidderCatalog.isValidName(bidder) + && !bidderAliases.isAliasDefined(bidder) + && !bidderAliases.isKnownAlternateBidderCode(bidder)) { + throw new ValidationException( "request.ext.prebid.bidadjustmentfactors.%s is not a known bidder or alias", bidder); } @@ -271,18 +303,21 @@ private void validateBidAdjustmentFactors(ExtRequestBidAdjustmentFactors adjustm for (Map.Entry> entry : adjustmentsMediaTypeFactors.entrySet()) { - validateBidAdjustmentFactorsByMediatype(entry.getKey(), entry.getValue(), aliases); + validateBidAdjustmentFactorsByMediatype(entry.getKey(), entry.getValue(), bidderAliases); } } private void validateBidAdjustmentFactorsByMediatype(ImpMediaType mediaType, Map bidderAdjustments, - Map aliases) throws ValidationException { + BidderAliases bidderAliases) throws ValidationException { for (Map.Entry bidderAdjustment : bidderAdjustments.entrySet()) { final String bidder = bidderAdjustment.getKey(); - if (isUnknownBidderOrAlias(bidder, aliases)) { + if (!bidderCatalog.isValidName(bidder) + && !bidderAliases.isAliasDefined(bidder) + && !bidderAliases.isKnownAlternateBidderCode(bidder)) { + throw new ValidationException( "request.ext.prebid.bidadjustmentfactors.%s.%s is not a known bidder or alias", mediaType, bidder); @@ -541,7 +576,7 @@ private void validateAliases(Map aliases, List warnings, } } - if (alias.equals(coreBidder)) { + if (alias.equalsIgnoreCase(coreBidder)) { throw new ValidationException(""" request.ext.prebid.aliases.%s defines a no-op alias. \ Choose a different alias, or remove this entry""".formatted(alias)); diff --git a/src/main/java/org/prebid/server/validation/ResponseBidValidator.java b/src/main/java/org/prebid/server/validation/ResponseBidValidator.java index 4e2f062218b..cca8f88faf7 100644 --- a/src/main/java/org/prebid/server/validation/ResponseBidValidator.java +++ b/src/main/java/org/prebid/server/validation/ResponseBidValidator.java @@ -9,7 +9,7 @@ import org.apache.commons.collections4.ListUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; -import org.prebid.server.auction.BidderAliases; +import org.prebid.server.auction.aliases.BidderAliases; import org.prebid.server.auction.model.AuctionContext; import org.prebid.server.auction.model.BidRejectionReason; import org.prebid.server.auction.model.BidRejectionTracker; @@ -39,11 +39,14 @@ public class ResponseBidValidator { private static final Logger logger = LoggerFactory.getLogger(ResponseBidValidator.class); - private static final ConditionalLogger UNRELATED_BID_LOGGER = new ConditionalLogger("not_matched_bid", logger); - private static final ConditionalLogger SECURE_CREATIVE_LOGGER = new ConditionalLogger("secure_creatives_validation", - logger); - private static final ConditionalLogger CREATIVE_SIZE_LOGGER = new ConditionalLogger("creative_size_validation", - logger); + private static final ConditionalLogger unrelatedBidLogger = + new ConditionalLogger("not_matched_bid", logger); + private static final ConditionalLogger secureCreativeLogger = + new ConditionalLogger("secure_creatives_validation", logger); + private static final ConditionalLogger creativeSizeLogger = + new ConditionalLogger("creative_size_validation", logger); + private static final ConditionalLogger alternateBidderCodeLogger = + new ConditionalLogger("alternate_bidder_code_validation", logger); private static final String[] INSECURE_MARKUP_MARKERS = {"http:", "http%3A"}; private static final String[] SECURE_MARKUP_MARKERS = {"https:", "https%3A"}; @@ -81,6 +84,7 @@ public ValidationResult validate(BidderBid bidderBid, validateCommonFields(bid); validateTypeSpecific(bidderBid, bidder); validateCurrency(bidderBid.getBidCurrency()); + validateSeat(bidderBid, bidder, account, bidRejectionTracker, aliases); final Imp correspondingImp = findCorrespondingImp(bid, bidRequest); if (bidderBid.getType() == BidType.banner) { @@ -148,6 +152,26 @@ private static void validateCurrency(String currency) throws ValidationException } } + private void validateSeat(BidderBid bid, + String bidder, + Account account, + BidRejectionTracker bidRejectionTracker, + BidderAliases bidderAliases) throws ValidationException { + + final String seat = bid.getSeat(); + if (seat != null + && !StringUtils.equalsIgnoreCase(bidder, seat) + && !bidderAliases.isAllowedAlternateBidderCode(bidder, seat)) { + + final String message = "invalid bidder code %s was set by the adapter %s for the account %s" + .formatted(bid.getSeat(), bidder, account.getId()); + bidRejectionTracker.rejectBid(bid, BidRejectionReason.RESPONSE_REJECTED_GENERAL); + metrics.updateSeatValidationMetrics(bidder); + alternateBidderCodeLogger.warn(message, logSamplingRate); + throw new ValidationException(message); + } + } + private Imp findCorrespondingImp(Bid bid, BidRequest bidRequest) throws ValidationException { return bidRequest.getImp().stream() .filter(imp -> Objects.equals(imp.getId(), bid.getImpid())) @@ -157,7 +181,7 @@ private Imp findCorrespondingImp(Bid bid, BidRequest bidRequest) throws Validati } private ValidationException exceptionAndLogOnePercent(String message) { - UNRELATED_BID_LOGGER.warn(message, logSamplingRate); + unrelatedBidLogger.warn(message, logSamplingRate); return new ValidationException(message); } @@ -193,7 +217,7 @@ private List validateBannerFields(BidderBid bidderBid, bannerMaxSizeEnforcement, metricName -> metrics.updateSizeValidationMetrics( aliases.resolveBidder(bidder), accountId, metricName), - CREATIVE_SIZE_LOGGER, + creativeSizeLogger, message, bidRejectionTracker, bidderBid, @@ -263,7 +287,7 @@ private List validateSecureMarkup(BidderBid bidderBid, secureMarkupEnforcement, metricName -> metrics.updateSecureValidationMetrics( aliases.resolveBidder(bidder), accountId, metricName), - SECURE_CREATIVE_LOGGER, + secureCreativeLogger, message, bidRejectionTracker, bidderBid, diff --git a/src/test/groovy/org/prebid/server/functional/model/bidder/BidderName.groovy b/src/test/groovy/org/prebid/server/functional/model/bidder/BidderName.groovy index 54e0a451fc6..702918fa886 100644 --- a/src/test/groovy/org/prebid/server/functional/model/bidder/BidderName.groovy +++ b/src/test/groovy/org/prebid/server/functional/model/bidder/BidderName.groovy @@ -11,6 +11,7 @@ enum BidderName { BOGUS("bogus"), ALIAS("alias"), ALIAS_CAMEL_CASE("AlIaS"), + ALIAS_UPPER_CASE("ALIAS"), GENERIC_CAMEL_CASE("GeNerIc"), GENERIC("generic"), GENER_X("gener_x"), @@ -25,7 +26,10 @@ enum BidderName { ADKERNEL("adkernel"), IX("ix"), GRID("grid"), - MEDIANET("medianet") + MEDIANET("medianet"), + AMX("amx"), + AMX_CAMEL_CASE("AmX"), + AMX_UPPER_CASE("AMX"), @JsonValue final String value diff --git a/src/test/groovy/org/prebid/server/functional/model/bidder/GeneralBidderAdapter.groovy b/src/test/groovy/org/prebid/server/functional/model/bidder/GeneralBidderAdapter.groovy index 3184fb17fee..b583363974c 100644 --- a/src/test/groovy/org/prebid/server/functional/model/bidder/GeneralBidderAdapter.groovy +++ b/src/test/groovy/org/prebid/server/functional/model/bidder/GeneralBidderAdapter.groovy @@ -1,8 +1,14 @@ package org.prebid.server.functional.model.bidder +import com.fasterxml.jackson.annotation.JsonProperty + class GeneralBidderAdapter extends Generic { String siteId List size String sid + @JsonProperty("ds") + String demandSource + @JsonProperty("bc") + BidderName bidderCode } diff --git a/src/test/groovy/org/prebid/server/functional/model/config/AccountConfig.groovy b/src/test/groovy/org/prebid/server/functional/model/config/AccountConfig.groovy index 60563ac2f5e..9dded674fee 100644 --- a/src/test/groovy/org/prebid/server/functional/model/config/AccountConfig.groovy +++ b/src/test/groovy/org/prebid/server/functional/model/config/AccountConfig.groovy @@ -23,6 +23,9 @@ class AccountConfig { AccountSetting settings @JsonProperty("cookie_sync") AccountCookieSyncConfig cookieSyncSnakeCase + AlternateBidderCodes alternateBidderCodes + @JsonProperty("alternate_bidder_codes") + AlternateBidderCodes alternateBidderCodesSnakeCase static getDefaultAccountConfig() { new AccountConfig(status: AccountStatus.ACTIVE) diff --git a/src/test/groovy/org/prebid/server/functional/model/config/AlternateBidderCodes.groovy b/src/test/groovy/org/prebid/server/functional/model/config/AlternateBidderCodes.groovy new file mode 100644 index 00000000000..465acaad2cc --- /dev/null +++ b/src/test/groovy/org/prebid/server/functional/model/config/AlternateBidderCodes.groovy @@ -0,0 +1,16 @@ +package org.prebid.server.functional.model.config + +import com.fasterxml.jackson.databind.PropertyNamingStrategies +import com.fasterxml.jackson.databind.annotation.JsonNaming +import groovy.transform.EqualsAndHashCode +import groovy.transform.ToString +import org.prebid.server.functional.model.bidder.BidderName + +@EqualsAndHashCode +@ToString(includeNames = true, ignoreNulls = true) +@JsonNaming(PropertyNamingStrategies.KebabCaseStrategy) +class AlternateBidderCodes { + + Boolean enabled + Map bidders +} diff --git a/src/test/groovy/org/prebid/server/functional/model/config/BidderConfig.groovy b/src/test/groovy/org/prebid/server/functional/model/config/BidderConfig.groovy new file mode 100644 index 00000000000..e139419e4e3 --- /dev/null +++ b/src/test/groovy/org/prebid/server/functional/model/config/BidderConfig.groovy @@ -0,0 +1,21 @@ +package org.prebid.server.functional.model.config + +import com.fasterxml.jackson.annotation.JsonProperty +import com.fasterxml.jackson.databind.PropertyNamingStrategies +import com.fasterxml.jackson.databind.annotation.JsonNaming +import groovy.transform.EqualsAndHashCode +import groovy.transform.ToString +import org.prebid.server.functional.model.bidder.BidderName + +@EqualsAndHashCode +@ToString(includeNames = true, ignoreNulls = true) +@JsonNaming(PropertyNamingStrategies.KebabCaseStrategy) +class BidderConfig { + + Boolean enabled + List allowedBidderCodes + @JsonProperty("allowedbiddercodes") + List allowedBidderCodesLowerCase + @JsonProperty("allowed_bidder_codes") + List allowedBidderCodesSnakeCase +} diff --git a/src/test/groovy/org/prebid/server/functional/model/request/auction/Amx.groovy b/src/test/groovy/org/prebid/server/functional/model/request/auction/Amx.groovy new file mode 100644 index 00000000000..3ae0dcd17a3 --- /dev/null +++ b/src/test/groovy/org/prebid/server/functional/model/request/auction/Amx.groovy @@ -0,0 +1,17 @@ +package org.prebid.server.functional.model.request.auction + +import com.fasterxml.jackson.annotation.JsonProperty +import org.prebid.server.functional.model.bidder.BidderAdapter +import org.prebid.server.functional.model.bidder.BidderName + +class Amx implements BidderAdapter { + + @JsonProperty("ct") + Integer creativeType + @JsonProperty("startdelay") + Integer startDelay + @JsonProperty("ds") + String demandSource + @JsonProperty("bc") + BidderName bidderCode +} diff --git a/src/test/groovy/org/prebid/server/functional/model/request/auction/AuctionEnvironment.groovy b/src/test/groovy/org/prebid/server/functional/model/request/auction/AuctionEnvironment.groovy index f880b7bc634..649c539e794 100644 --- a/src/test/groovy/org/prebid/server/functional/model/request/auction/AuctionEnvironment.groovy +++ b/src/test/groovy/org/prebid/server/functional/model/request/auction/AuctionEnvironment.groovy @@ -1,7 +1,6 @@ package org.prebid.server.functional.model.request.auction import com.fasterxml.jackson.annotation.JsonValue -import org.prebid.server.functional.util.PBSUtils enum AuctionEnvironment { diff --git a/src/test/groovy/org/prebid/server/functional/model/request/auction/Bidder.groovy b/src/test/groovy/org/prebid/server/functional/model/request/auction/Bidder.groovy index 125faa37c4b..9c4a17ec5cf 100644 --- a/src/test/groovy/org/prebid/server/functional/model/request/auction/Bidder.groovy +++ b/src/test/groovy/org/prebid/server/functional/model/request/auction/Bidder.groovy @@ -12,6 +12,8 @@ import org.prebid.server.functional.model.bidder.Rubicon class Bidder { Generic alias + @JsonProperty("ALIAS") + Generic aliasUpperCase Generic generic @JsonProperty("gener_x") Generic generX @@ -26,6 +28,9 @@ class Bidder { Openx openxAlias Adrino adrino Generic nativo + Amx amx + @JsonProperty("AMX") + Amx amxUpperCase static Bidder getDefaultBidder() { new Bidder().tap { diff --git a/src/test/groovy/org/prebid/server/functional/model/request/auction/Prebid.groovy b/src/test/groovy/org/prebid/server/functional/model/request/auction/Prebid.groovy index 30149d1a5ee..499dccea5a3 100644 --- a/src/test/groovy/org/prebid/server/functional/model/request/auction/Prebid.groovy +++ b/src/test/groovy/org/prebid/server/functional/model/request/auction/Prebid.groovy @@ -1,10 +1,12 @@ package org.prebid.server.functional.model.request.auction +import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.databind.PropertyNamingStrategies import com.fasterxml.jackson.databind.annotation.JsonNaming import groovy.transform.ToString import org.prebid.server.functional.model.ChannelType import org.prebid.server.functional.model.bidder.BidderName +import org.prebid.server.functional.model.config.AlternateBidderCodes @JsonNaming(PropertyNamingStrategies.LowerCaseStrategy) @ToString(includeNames = true, ignoreNulls = true) @@ -41,6 +43,8 @@ class Prebid { PrebidAnalytics analytics StoredAuctionResponse storedAuctionResponse PaaFormat paaFormat + @JsonProperty("alternatebiddercodes") + AlternateBidderCodes alternateBidderCodes static class Channel { diff --git a/src/test/groovy/org/prebid/server/functional/model/response/auction/BidExt.groovy b/src/test/groovy/org/prebid/server/functional/model/response/auction/BidExt.groovy index 61cdd7ad5f0..58d2e2178e3 100644 --- a/src/test/groovy/org/prebid/server/functional/model/response/auction/BidExt.groovy +++ b/src/test/groovy/org/prebid/server/functional/model/response/auction/BidExt.groovy @@ -1,7 +1,9 @@ package org.prebid.server.functional.model.response.auction +import com.fasterxml.jackson.annotation.JsonProperty import groovy.transform.ToString import org.prebid.server.functional.model.Currency +import org.prebid.server.functional.model.bidder.BidderName @ToString(includeNames = true, ignoreNulls = true) class BidExt { @@ -10,4 +12,12 @@ class BidExt { BigDecimal origbidcpm Currency origbidcur DsaResponse dsa + @JsonProperty("ct") + Integer creativeType + @JsonProperty("startdelay") + Integer startDelay + @JsonProperty("ds") + String demandSource + @JsonProperty("bc") + BidderName bidderCode } diff --git a/src/test/groovy/org/prebid/server/functional/model/response/auction/ErrorType.groovy b/src/test/groovy/org/prebid/server/functional/model/response/auction/ErrorType.groovy index 267a23cc067..80f504a05ec 100644 --- a/src/test/groovy/org/prebid/server/functional/model/response/auction/ErrorType.groovy +++ b/src/test/groovy/org/prebid/server/functional/model/response/auction/ErrorType.groovy @@ -14,7 +14,9 @@ enum ErrorType { ALIAS("alias"), TARGETING("targeting"), IX("ix"), - OPENX("openx") + OPENX("openx"), + AMX("amx"), + AMX_UPPER_CASE("AMX"), @JsonValue final String value diff --git a/src/test/groovy/org/prebid/server/functional/model/response/auction/Meta.groovy b/src/test/groovy/org/prebid/server/functional/model/response/auction/Meta.groovy index d022daf9646..e8bb869ebae 100644 --- a/src/test/groovy/org/prebid/server/functional/model/response/auction/Meta.groovy +++ b/src/test/groovy/org/prebid/server/functional/model/response/auction/Meta.groovy @@ -1,12 +1,15 @@ package org.prebid.server.functional.model.response.auction +import com.fasterxml.jackson.annotation.JsonProperty import groovy.transform.ToString +import org.prebid.server.functional.model.bidder.BidderName import org.prebid.server.functional.model.request.auction.RendererData @ToString(includeNames = true, ignoreNulls = true) class Meta { - String adapterCode + @JsonProperty("adaptercode") + BidderName adapterCode List advertiserDomains Integer advertiserId String advertiserName diff --git a/src/test/groovy/org/prebid/server/functional/tests/AliasSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/AliasSpec.groovy index 4e544498f44..9013978f76f 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/AliasSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/AliasSpec.groovy @@ -110,7 +110,7 @@ class AliasSpec extends BaseSpec { then: "Request should fail with error" def exception = thrown(PrebidServerException) assert exception.responseBody.contains("Invalid request format: request.ext.prebid.aliasgvlids. " + - "vendorId ${validId} refers to unknown bidder alias: ${bidderName}") + "vendorId ${validId} refers to unknown bidder alias: ${bidderName.toLowerCase()}") } def "PBS should return an error when GVL ID alias value is lower that one"() { @@ -126,7 +126,7 @@ class AliasSpec extends BaseSpec { then: "Request should fail with error" def exception = thrown(PrebidServerException) assert exception.responseBody.contains("Invalid request format: request.ext.prebid.aliasgvlids. " + - "Invalid vendorId ${invalidId} for alias: ${bidderName}. Choose a different vendorId, or remove this entry.") + "Invalid vendorId ${invalidId} for alias: ${bidderName.toLowerCase()}. Choose a different vendorId, or remove this entry.") where: invalidId << [PBSUtils.randomNegativeNumber, 0] @@ -145,7 +145,7 @@ class AliasSpec extends BaseSpec { then: "Request should fail with an error" def exception = thrown(PrebidServerException) assert exception.statusCode == BAD_REQUEST.code() - assert exception.responseBody == "Invalid request format: request.ext.prebid.aliases.$randomString " + + assert exception.responseBody == "Invalid request format: request.ext.prebid.aliases.${randomString.toLowerCase()} " + "refers to unknown bidder: $BOGUS.value" } diff --git a/src/test/groovy/org/prebid/server/functional/tests/AlternateBidderCodeSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/AlternateBidderCodeSpec.groovy new file mode 100644 index 00000000000..f47efd346f8 --- /dev/null +++ b/src/test/groovy/org/prebid/server/functional/tests/AlternateBidderCodeSpec.groovy @@ -0,0 +1,1833 @@ +package org.prebid.server.functional.tests + +import org.prebid.server.functional.model.bidder.Generic +import org.prebid.server.functional.model.config.AccountConfig +import org.prebid.server.functional.model.config.AlternateBidderCodes +import org.prebid.server.functional.model.config.BidderConfig +import org.prebid.server.functional.model.db.Account +import org.prebid.server.functional.model.db.StoredImp +import org.prebid.server.functional.model.db.StoredResponse +import org.prebid.server.functional.model.request.auction.Amx +import org.prebid.server.functional.model.request.auction.BidRequest +import org.prebid.server.functional.model.request.auction.Imp +import org.prebid.server.functional.model.request.auction.PrebidStoredRequest +import org.prebid.server.functional.model.request.auction.StoredBidResponse +import org.prebid.server.functional.model.request.auction.Targeting +import org.prebid.server.functional.model.response.auction.BidExt +import org.prebid.server.functional.model.response.auction.BidResponse +import org.prebid.server.functional.model.response.auction.ErrorType +import org.prebid.server.functional.service.PrebidServerException +import org.prebid.server.functional.service.PrebidServerService +import org.prebid.server.functional.util.PBSUtils +import spock.lang.Shared + +import static org.prebid.server.functional.model.AccountStatus.ACTIVE +import static org.prebid.server.functional.model.bidder.BidderName.ALIAS +import static org.prebid.server.functional.model.bidder.BidderName.ALIAS_CAMEL_CASE +import static org.prebid.server.functional.model.bidder.BidderName.AMX +import static org.prebid.server.functional.model.bidder.BidderName.AMX_CAMEL_CASE +import static org.prebid.server.functional.model.bidder.BidderName.BOGUS +import static org.prebid.server.functional.model.bidder.BidderName.EMPTY +import static org.prebid.server.functional.model.bidder.BidderName.GENERIC +import static org.prebid.server.functional.model.bidder.BidderName.GENERIC_CAMEL_CASE +import static org.prebid.server.functional.model.bidder.BidderName.UNKNOWN +import static org.prebid.server.functional.model.bidder.BidderName.WILDCARD +import static org.prebid.server.functional.model.response.auction.BidRejectionReason.RESPONSE_REJECTED_GENERAL +import static org.prebid.server.functional.testcontainers.Dependencies.getNetworkServiceContainer + +class AlternateBidderCodeSpec extends BaseSpec { + + private static final String ADAPTER_RESPONSE_VALIDATION_METRICS = "adapter.%s.response.validation.seat" + private static final String ERROR_BID_CODE_VALIDATION = "BidId `%s` validation messages: " + + "Error: invalid bidder code %s was set by the adapter %s for the account %s" + private static final String INVALID_BIDDER_CODE_LOGS = "invalid bidder code %s was set by the adapter %s for the account %s" + private static final Map AMX_CONFIG = ["adapters.amx.enabled" : "true", + "adapters.amx.endpoint": "$networkServiceContainer.rootUri/auction".toString()] + @Shared + private static final PrebidServerService pbsServiceWithAmxBidder = pbsServiceFactory.getService(AMX_CONFIG) + + @Override + def cleanupSpec() { + pbsServiceFactory.removeContainer(AMX_CONFIG) + } + + def "PBS shouldn't discard bid amx alias when soft alias request with allowed bidder code"() { + given: "Default bid request with amx bidder" + def bidRequest = getBidRequestWithAmxBidder().tap { + imp[0].ext.prebid.bidder.alias = new Generic() + imp[0].ext.prebid.bidder.amx = null + ext.prebid.aliases = [(ALIAS.value): AMX] + } + + and: "Bid response with bidder code" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest, AMX).tap { + it.seatbid[0].bid[0].ext = new BidExt(bidderCode: ALIAS) + } + bidder.setResponse(bidRequest.id, bidResponse) + + and: "Flash metrics" + flushMetrics(pbsServiceWithAmxBidder) + + when: "PBS processes auction request" + def response = pbsServiceWithAmxBidder.sendAuctionRequest(bidRequest) + + then: "Bid response should contain seat" + assert response.seatbid.seat == [ALIAS] + + and: "Response should contain adapter code" + assert response.seatbid.bid.ext.prebid.meta.adapterCode.flatten() == [AMX] + + and: "Response should contain bidder targeting" + def targeting = response.seatbid[0].bid[0].ext.prebid.targeting + assert targeting["hb_pb_${ALIAS}"] + assert targeting["hb_size_${ALIAS}"] + assert targeting["hb_bidder"] == ALIAS.value + assert targeting["hb_bidder_${ALIAS}"] == ALIAS.value + + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(ALIAS.value) + + and: "Bidder request should be valid" + assert bidder.getBidderRequests(bidRequest.id) + + and: "Response shouldn't contain warnings and error and seatNonBid" + assert !response.ext?.warnings + assert !response.ext?.errors + assert !response.ext?.seatnonbid + + and: "Response shouldn't contain demand source" + assert !response.seatbid.first.bid.first.ext.prebid.meta.demandSource + + and: "PBS shouldn't emit validation metrics" + def metrics = pbsServiceWithAmxBidder.sendCollectedMetricsRequest() + assert !metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(ALIAS)] + } + + def "PBS should populate meta demand source when bid response with demand source"() { + given: "Default bid request with amx bidder" + def bidRequest = getBidRequestWithAmxBidder() + + and: "Bid response with demand source" + def demandSource = PBSUtils.getRandomString() + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest, AMX).tap { + it.seatbid[0].bid[0].ext = new BidExt(demandSource: demandSource) + } + bidder.setResponse(bidRequest.id, bidResponse) + + and: "Flash metrics" + flushMetrics(pbsServiceWithAmxBidder) + + when: "PBS processes auction request" + def response = pbsServiceWithAmxBidder.sendAuctionRequest(bidRequest) + + then: "Bid response should contain seat" + assert response.seatbid.seat == [AMX] + + and: "Response should contain adapter code" + assert response.seatbid.bid.ext.prebid.meta.adapterCode.flatten() == [AMX] + + and: "Response should contain demand source" + assert response.seatbid.bid.ext.prebid.meta.demandSource.flatten() == [demandSource] + + and: "Response should contain bidder targeting" + def targeting = response.seatbid[0].bid[0].ext.prebid.targeting + assert targeting["hb_pb_${AMX}"] + assert targeting["hb_size_${AMX}"] + assert targeting["hb_bidder"] == AMX.value + assert targeting["hb_bidder_${AMX}"] == AMX.value + + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(AMX.value) + + and: "Bidder request should be valid" + assert bidder.getBidderRequests(bidRequest.id) + + and: "Response shouldn't contain warnings and error and seatNonBid" + assert !response.ext?.warnings + assert !response.ext?.errors + assert !response.ext?.seatnonbid + + and: "PBS shouldn't emit validation metrics" + def metrics = pbsServiceWithAmxBidder.sendCollectedMetricsRequest() + assert !metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(AMX)] + } + + def "PBS shouldn't populate meta demand source when bid response without demand source"() { + given: "Default bid request with amx bidder" + def bidRequest = getBidRequestWithAmxBidder() + + and: "Bid response without demand source" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest, AMX).tap { + it.seatbid[0].bid[0].ext = new BidExt(demandSource: null) + } + bidder.setResponse(bidRequest.id, bidResponse) + + and: "Flash metrics" + flushMetrics(pbsServiceWithAmxBidder) + + when: "PBS processes auction request" + def response = pbsServiceWithAmxBidder.sendAuctionRequest(bidRequest) + + then: "Bid response should contain seat" + assert response.seatbid.seat == [AMX] + + and: "Response should contain adapter code" + assert response.seatbid.bid.ext.prebid.meta.adapterCode.flatten() == [AMX] + + and: "Response shouldn't contain demand source" + assert !response.seatbid.first.bid.first.ext.prebid.meta.demandSource + + and: "Response should contain bidder targeting" + def targeting = response.seatbid[0].bid[0].ext.prebid.targeting + assert targeting["hb_pb_${AMX}"] + assert targeting["hb_size_${AMX}"] + assert targeting["hb_bidder"] == AMX.value + assert targeting["hb_bidder_${AMX}"] == AMX.value + + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(AMX.value) + + and: "Bidder request should be valid" + assert bidder.getBidderRequests(bidRequest.id) + + and: "Response shouldn't contain warnings and error and seatNonBid" + assert !response.ext?.warnings + assert !response.ext?.errors + assert !response.ext?.seatnonbid + + and: "PBS shouldn't emit validation metrics" + def metrics = pbsServiceWithAmxBidder.sendCollectedMetricsRequest() + assert !metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(AMX)] + } + + def "PBS shouldn't discard bid for amx bidder same seat in response as seat in bid.ext.bidderCode"() { + given: "Default bid request with amx bidder" + def bidRequest = getBidRequestWithAmxBidder() + + and: "Bid response with bidder code" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest, AMX).tap { + it.seatbid[0].bid[0].ext = new BidExt(bidderCode: bidderCode) + } + bidder.setResponse(bidRequest.id, bidResponse) + + and: "Flash metrics" + flushMetrics(pbsServiceWithAmxBidder) + + when: "PBS processes auction request" + def response = pbsServiceWithAmxBidder.sendAuctionRequest(bidRequest) + + then: "Bid response should contain seat" + assert response.seatbid.seat == [bidderCode] + + and: "Response should contain adapter code" + assert response.seatbid.bid.ext.prebid.meta.adapterCode.flatten() == [AMX] + + and: "Response should contain bidder targeting" + def targeting = response.seatbid[0].bid[0].ext.prebid.targeting + assert targeting["hb_pb_${bidderCode}"] + assert targeting["hb_size_${bidderCode}"] + assert targeting["hb_bidder"] == bidderCode.value + assert targeting["hb_bidder_${bidderCode}"] == bidderCode.value + + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(bidderCode.value) + + and: "Bidder request should be valid" + assert bidder.getBidderRequests(bidRequest.id) + + and: "Response shouldn't contain warnings and error and seatNonBid" + assert !response.ext?.warnings + assert !response.ext?.errors + assert !response.ext?.seatnonbid + + and: "Response shouldn't contain demand source" + assert !response.seatbid.first.bid.first.ext.prebid.meta.demandSource + + and: "PBS shouldn't emit validation metrics" + def metrics = pbsServiceWithAmxBidder.sendCollectedMetricsRequest() + assert !metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(AMX)] + + where: + bidderCode << [AMX, AMX_CAMEL_CASE] + } + + def "PBS should discard bid for amx bidder when imp[].bidder isn't same as in bid.ext.bidderCode"() { + given: "Default bid request with amx bidder" + def bidRequest = getBidRequestWithAmxBidder() + + and: "Bid response with bidder code" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest, AMX).tap { + it.seatbid[0].bid[0].ext = new BidExt(bidderCode: bidderName) + } + bidder.setResponse(bidRequest.id, bidResponse) + + and: "Flash metrics" + flushMetrics(pbsServiceWithAmxBidder) + + when: "PBS processes auction request" + def response = pbsServiceWithAmxBidder.sendAuctionRequest(bidRequest) + + then: "Bid response shouldn't seat bid" + assert response.seatbid.isEmpty() + + and: "Response should seatNon bid with code 300" + assert response.ext.seatnonbid.size() == 1 + + def seatNonBid = response.ext.seatnonbid[0] + assert seatNonBid.seat == bidderName.value + assert seatNonBid.nonBid[0].impId == bidRequest.imp[0].id + assert seatNonBid.nonBid[0].statusCode == RESPONSE_REJECTED_GENERAL + + and: "Response should contain error" + def error = response.ext?.errors[ErrorType.AMX][0] + assert error.code == 5 + assert error.message == ERROR_BID_CODE_VALIDATION + .formatted(bidResponse.seatbid[0].bid[0].id, bidderName, AMX, bidRequest.accountId) + + and: "PBS should emit logs" + def logs = pbsServiceWithAmxBidder.getLogsByValue(bidRequest.accountId) + assert logs.contains(INVALID_BIDDER_CODE_LOGS.formatted(bidderName, AMX, bidRequest.accountId)) + + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(AMX.value) + + and: "Bidder request should be valid" + assert bidder.getBidderRequests(bidRequest.id) + + and: "PBS should emit metrics" + def metrics = pbsServiceWithAmxBidder.sendCollectedMetricsRequest() + assert metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(AMX)] + + where: + bidderName << [BOGUS, UNKNOWN, WILDCARD] + } + + def "PBS should discard bid amx alias requested when imp[].bidder isn't same as in bid.ext.bidderCode"() { + given: "Default bid request with amx bidder" + def bidRequest = getBidRequestWithAmxBidder().tap { + imp[0].ext.prebid.bidder.alias = new Generic() + imp[0].ext.prebid.bidder.amx = null + ext.prebid.aliases = [(ALIAS.value): AMX] + } + + and: "Bid response with bidder code" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest, AMX).tap { + it.seatbid[0].bid[0].ext = new BidExt(bidderCode: bidderName) + } + bidder.setResponse(bidRequest.id, bidResponse) + + and: "Flash metrics" + flushMetrics(pbsServiceWithAmxBidder) + + when: "PBS processes auction request" + def response = pbsServiceWithAmxBidder.sendAuctionRequest(bidRequest) + + then: "Bid response shouldn't seat bid" + assert response.seatbid.isEmpty() + + and: "Response should seatNon bid with code 300" + assert response.ext.seatnonbid.size() == 1 + + def seatNonBid = response.ext.seatnonbid[0] + assert seatNonBid.seat == bidderName.value + assert seatNonBid.nonBid[0].impId == bidRequest.imp[0].id + assert seatNonBid.nonBid[0].statusCode == RESPONSE_REJECTED_GENERAL + + and: "Response should contain error" + def error = response.ext?.errors[ErrorType.ALIAS][0] + assert error.code == 5 + assert error.message == ERROR_BID_CODE_VALIDATION + .formatted(bidResponse.seatbid[0].bid[0].id, bidderName, ALIAS, bidRequest.accountId) + + and: "PBS should emit logs" + def logs = pbsServiceWithAmxBidder.getLogsByValue(bidRequest.accountId) + assert logs.contains(INVALID_BIDDER_CODE_LOGS.formatted(bidderName, ALIAS, bidRequest.accountId)) + + and: "Bidder request should be valid" + assert bidder.getBidderRequests(bidRequest.id) + + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(ALIAS.value) + + and: "PBS should emit validation metrics" + def metrics = pbsServiceWithAmxBidder.sendCollectedMetricsRequest() + assert metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(ALIAS)] + + where: + bidderName << [BOGUS, UNKNOWN, WILDCARD] + } + + def "PBS shouldn't discard bid amx alias requested when imp[].bidder is same as in bid.ext.bidderCode and alternate bidder code allow"() { + given: "Default bid request with amx bidder" + def bidRequest = getBidRequestWithAmxBidderAndAlternateBidderCode().tap { + imp[0].ext.prebid.bidder.alias = new Generic() + imp[0].ext.prebid.bidder.amx = null + ext.prebid.aliases = [(ALIAS.value): AMX] + ext.prebid.alternateBidderCodes = requestAlternateBidderCode + } + + and: "Save account config into DB with alternate bidder codes" + def account = getAccountWithAlternateBidderCode(bidRequest).tap { + config.alternateBidderCodes = accountAlternateBidderCodes + } + accountDao.save(account) + + and: "Bid response with bidder code" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest, ALIAS).tap { + it.seatbid[0].bid[0].ext = new BidExt(bidderCode: GENERIC) + } + bidder.setResponse(bidRequest.id, bidResponse) + + and: "Flash metrics" + flushMetrics(pbsServiceWithAmxBidder) + + when: "PBS processes auction request" + def response = pbsServiceWithAmxBidder.sendAuctionRequest(bidRequest) + + then: "Bid response should contain exp data" + assert response.seatbid.seat == [GENERIC] + + and: "Response shouldn't contain demand source" + assert !response.seatbid.first.bid.first.ext.prebid.meta.demandSource + + and: "Response should contain adapter code" + assert response.seatbid.bid.ext.prebid.meta.adapterCode.flatten() == [AMX] + + and: "Response should contain bidder targeting" + def targeting = response.seatbid[0].bid[0].ext.prebid.targeting + assert targeting["hb_pb_${GENERIC}"] + assert targeting["hb_size_${GENERIC}"] + assert targeting["hb_bidder"] == GENERIC.value + assert targeting["hb_bidder_${GENERIC}"] == GENERIC.value + + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(GENERIC.value) + + and: "Bidder request should be valid" + assert bidder.getBidderRequests(bidRequest.id) + + and: "Response shouldn't contain warnings and error and seatNonBid" + assert !response.ext?.warnings + assert !response.ext?.errors + assert !response.ext?.seatnonbid + + and: "PBS shouldn't emit validation metrics" + def metrics = pbsServiceWithAmxBidder.sendCollectedMetricsRequest() + assert !metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(ALIAS)] + + where: + requestAlternateBidderCode | accountAlternateBidderCodes + new AlternateBidderCodes(enabled: true, bidders: [(ALIAS): new BidderConfig(enabled: true, allowedBidderCodes: [GENERIC])]) | null + null | new AlternateBidderCodes(enabled: true, bidders: [(ALIAS): new BidderConfig(enabled: true, allowedBidderCodes: [GENERIC])]) + } + + def "PBS shouldn't discard bid amx alias requested when imp[].bidder is same as in bid.ext.bidderCode"() { + given: "Default bid request with amx bidder" + def bidRequest = getBidRequestWithAmxBidder().tap { + imp[0].ext.prebid.bidder.alias = new Generic() + imp[0].ext.prebid.bidder.amx = null + ext.prebid.aliases = [(ALIAS.value): AMX] + } + + and: "Bid response with bidder code" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest, ALIAS).tap { + it.seatbid[0].bid[0].ext = new BidExt(bidderCode: bidderCode) + } + bidder.setResponse(bidRequest.id, bidResponse) + + and: "Flash metrics" + flushMetrics(pbsServiceWithAmxBidder) + + when: "PBS processes auction request" + def response = pbsServiceWithAmxBidder.sendAuctionRequest(bidRequest) + + then: "Bid response should contain exp data" + assert response.seatbid.seat == [bidderCode] + + and: "Response should contain adapter code" + assert response.seatbid.bid.ext.prebid.meta.adapterCode.flatten() == [AMX] + + and: "Response shouldn't contain demand source" + assert !response.seatbid.first.bid.first.ext.prebid.meta.demandSource + + and: "Response should contain bidder targeting" + def targeting = response.seatbid[0].bid[0].ext.prebid.targeting + assert targeting["hb_pb_${bidderCode}"] + assert targeting["hb_size_${bidderCode}"] + assert targeting["hb_bidder"] == bidderCode.value + assert targeting["hb_bidder_${bidderCode}"] == bidderCode.value + + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(bidderCode.value) + + and: "Bidder request should be valid" + assert bidder.getBidderRequests(bidRequest.id) + + and: "Response shouldn't contain warnings and error and seatNonBid" + assert !response.ext?.warnings + assert !response.ext?.errors + assert !response.ext?.seatnonbid + + and: "PBS shouldn't emit validation metrics" + def metrics = pbsServiceWithAmxBidder.sendCollectedMetricsRequest() + assert !metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(bidderCode)] + + where: + bidderCode << [ALIAS, ALIAS_CAMEL_CASE] + } + + def "PBS shouldn't discard the bid or emit a response warning when account alternate bidder codes not fully configured"() { + given: "Default bid request with alternate bidder codes" + def bidRequest = getBidRequestWithAmxBidder() + + and: "Save account config into DB with alternate bidder codes" + def account = getAccountWithAlternateBidderCode(bidRequest).tap { + config.alternateBidderCodes = accountAlternateBidderCodes + } + accountDao.save(account) + + and: "Bid response with bidder code" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest, AMX).tap { + it.seatbid[0].bid[0].ext = new BidExt(bidderCode: AMX) + } + bidder.setResponse(bidRequest.id, bidResponse) + + and: "Flash metrics" + flushMetrics(pbsServiceWithAmxBidder) + + when: "PBS processes auction request" + def response = pbsServiceWithAmxBidder.sendAuctionRequest(bidRequest) + + then: "Response should contain adapter code" + assert response.seatbid.bid.ext.prebid.meta.adapterCode.flatten() == [AMX] + + and: "Response should contain seatbid.seat" + assert response.seatbid[0].seat == AMX + + and: "Response should contain bidder targeting" + def targeting = response.seatbid[0].bid[0].ext.prebid.targeting + assert targeting["hb_pb_${AMX}"] + assert targeting["hb_size_${AMX}"] + assert targeting["hb_bidder"] == AMX.value + assert targeting["hb_bidder_${AMX}"] == AMX.value + + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(AMX.value) + + and: "Bidder request should be valid" + assert bidder.getBidderRequests(bidRequest.id) + + and: "Response shouldn't contain warnings,errors and seatnonbid" + assert !response.ext?.warnings + assert !response.ext?.errors + assert !response.ext?.seatnonbid + + and: "Response shouldn't contain demand source" + assert !response.seatbid.first.bid.first.ext.prebid.meta.demandSource + + and: "Metric shouldn't be updated" + def metrics = pbsServiceWithAmxBidder.sendCollectedMetricsRequest() + assert !metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(AMX)] + + where: + accountAlternateBidderCodes << [null, + new AlternateBidderCodes(), + new AlternateBidderCodes(enabled: true), + new AlternateBidderCodes(enabled: false), + new AlternateBidderCodes(bidders: [(AMX): new BidderConfig()]), + new AlternateBidderCodes(bidders: [(UNKNOWN): new BidderConfig()]), + new AlternateBidderCodes(enabled: true, bidders: [(AMX): new BidderConfig()]), + new AlternateBidderCodes(enabled: true, bidders: [(UNKNOWN): new BidderConfig()]), + new AlternateBidderCodes(enabled: false, bidders: [(UNKNOWN): new BidderConfig()]), + new AlternateBidderCodes(enabled: false, bidders: [(AMX): new BidderConfig()]), + new AlternateBidderCodes(bidders: [(AMX): new BidderConfig(enabled: false, allowedBidderCodes: [UNKNOWN])]), + new AlternateBidderCodes(bidders: [(UNKNOWN): new BidderConfig(enabled: false, allowedBidderCodes: [AMX])]), + new AlternateBidderCodes(enabled: false, bidders: [(AMX): new BidderConfig(enabled: false, allowedBidderCodes: [UNKNOWN])]), + new AlternateBidderCodes(enabled: false, bidders: [(UNKNOWN): new BidderConfig(enabled: false, allowedBidderCodes: [AMX])]), + new AlternateBidderCodes(enabled: true, bidders: [(AMX): new BidderConfig(enabled: false, allowedBidderCodes: [UNKNOWN])]), + new AlternateBidderCodes(enabled: true, bidders: [(UNKNOWN): new BidderConfig(enabled: false, allowedBidderCodes: [AMX])])] + } + + def "PBS shouldn't discard the bid or emit a response warning when request alternate bidder codes not fully configured"() { + given: "Default bid request with alternate bidder codes" + def bidRequest = getBidRequestWithAmxBidderAndAlternateBidderCode().tap { + ext.prebid.alternateBidderCodes = requestedAlternateBidderCodes + } + + and: "Bid response with bidder code" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest, AMX).tap { + it.seatbid[0].bid[0].ext = new BidExt(bidderCode: AMX) + } + bidder.setResponse(bidRequest.id, bidResponse) + + and: "Flash metrics" + flushMetrics(pbsServiceWithAmxBidder) + + when: "PBS processes auction request" + def response = pbsServiceWithAmxBidder.sendAuctionRequest(bidRequest) + + then: "Response should contain adapter code" + assert response.seatbid.bid.ext.prebid.meta.adapterCode.flatten() == [AMX] + + and: "Response should contain seatbid.seat" + assert response.seatbid[0].seat == AMX + + and: "Response should contain bidder targeting" + def targeting = response.seatbid[0].bid[0].ext.prebid.targeting + assert targeting["hb_pb_${AMX}"] + assert targeting["hb_size_${AMX}"] + assert targeting["hb_bidder"] == AMX.value + assert targeting["hb_bidder_${AMX}"] == AMX.value + + and: "Bidder request should be valid" + assert bidder.getBidderRequests(bidRequest.id) + + and: "Response shouldn't contain warnings,errors and seatnonbid" + assert !response.ext?.warnings + assert !response.ext?.errors + assert !response.ext?.seatnonbid + + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(AMX.value) + + and: "Response shouldn't contain demand source" + assert !response.seatbid.first.bid.first.ext.prebid.meta.demandSource + + and: "Metric shouldn't be updated" + def metrics = pbsServiceWithAmxBidder.sendCollectedMetricsRequest() + assert !metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(AMX)] + + where: + requestedAlternateBidderCodes << [null, + new AlternateBidderCodes(), + new AlternateBidderCodes(enabled: true), + new AlternateBidderCodes(enabled: false), + new AlternateBidderCodes(bidders: [(AMX): new BidderConfig()]), + new AlternateBidderCodes(enabled: true, bidders: [(AMX): new BidderConfig()]), + new AlternateBidderCodes(enabled: false, bidders: [(AMX): new BidderConfig()]), + new AlternateBidderCodes(bidders: [(AMX): new BidderConfig(enabled: false, allowedBidderCodes: [UNKNOWN])]), + new AlternateBidderCodes(enabled: false, bidders: [(AMX): new BidderConfig(enabled: false, allowedBidderCodes: [UNKNOWN])]), + new AlternateBidderCodes(enabled: true, bidders: [(AMX): new BidderConfig(enabled: false, allowedBidderCodes: [UNKNOWN])]),] + } + + def "PBS should validate and throw error when request alternate bidder codes not fully configured"() { + given: "Default bid request with alternate bidder codes" + def bidRequest = getBidRequestWithAmxBidderAndAlternateBidderCode().tap { + ext.prebid.alternateBidderCodes = requestedAlternateBidderCodes + } + + and: "Bid response with bidder code" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest, AMX).tap { + it.seatbid[0].bid[0].ext = new BidExt(bidderCode: AMX) + } + bidder.setResponse(bidRequest.id, bidResponse) + + and: "Flash metrics" + flushMetrics(pbsServiceWithAmxBidder) + + when: "PBS processes auction request" + pbsServiceWithAmxBidder.sendAuctionRequest(bidRequest) + + then: "Request should fail with error" + def exception = thrown(PrebidServerException) + assert exception.statusCode == 400 + assert exception.responseBody == "Invalid request format: " + + "request.ext.prebid.alternatebiddercodes.bidders.unknown is not a known bidder or alias" + + + where: + requestedAlternateBidderCodes << [new AlternateBidderCodes(bidders: [(UNKNOWN): new BidderConfig()]), + new AlternateBidderCodes(enabled: true, bidders: [(UNKNOWN): new BidderConfig()]), + new AlternateBidderCodes(enabled: false, bidders: [(UNKNOWN): new BidderConfig()]), + new AlternateBidderCodes(bidders: [(UNKNOWN): new BidderConfig(enabled: false, allowedBidderCodes: [AMX])]), + new AlternateBidderCodes(enabled: false, bidders: [(UNKNOWN): new BidderConfig(enabled: false, allowedBidderCodes: [AMX])]), + new AlternateBidderCodes(enabled: true, bidders: [(UNKNOWN): new BidderConfig(enabled: false, allowedBidderCodes: [AMX])])] + } + + def "PBS shouldn't discard bid when alternate bidder code allows bidder codes fully configured and bidder requested in uppercase"() { + given: "Default bid request with AMX bidder" + def bidRequest = getBidRequestWithAmxBidderAndAlternateBidderCode().tap { + imp[0].ext.prebid.bidder.tap { + amxUpperCase = new Amx() + amx = null + } + ext.prebid.alternateBidderCodes.bidders[AMX].allowedBidderCodesLowerCase = [GENERIC] + } + + and: "Bid response with bidder code" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest, AMX).tap { + it.seatbid[0].bid[0].ext = new BidExt(bidderCode: GENERIC) + } + bidder.setResponse(bidRequest.id, bidResponse) + + and: "Flash metrics" + flushMetrics(pbsServiceWithAmxBidder) + + when: "PBS processes auction request" + def response = pbsServiceWithAmxBidder.sendAuctionRequest(bidRequest) + + then: "Response should contain adapter code" + assert response.seatbid.bid.ext.prebid.meta.adapterCode.flatten() == [AMX] + + and: "Response should contain seatbid.seat" + assert response.seatbid[0].seat == GENERIC + + and: "Response should contain bidder targeting" + def targeting = response.seatbid[0].bid[0].ext.prebid.targeting + assert targeting["hb_pb_${GENERIC}"] + assert targeting["hb_size_${GENERIC}"] + assert targeting["hb_bidder"] == GENERIC.value + assert targeting["hb_bidder_${GENERIC}"] == GENERIC.value + + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(GENERIC.value) + + and: "Bidder request should be valid" + assert bidder.getBidderRequests(bidRequest.id) + + and: "Response shouldn't contain demand source" + assert !response.seatbid.first.bid.first.ext.prebid.meta.demandSource + + and: "Response shouldn't contain warnings,errors and seatnonbid" + assert !response.ext?.warnings + assert !response.ext?.errors + assert !response.ext?.seatnonbid + + and: "Metric shouldn't be updated" + def metrics = pbsServiceWithAmxBidder.sendCollectedMetricsRequest() + assert !metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(GENERIC)] + } + + def "PBS shouldn't discard bid when alternate bidder code allows bidder codes fully configured with different case"() { + given: "Default bid request with amx bidder" + def bidRequest = getBidRequestWithAmxBidder() + + and: "Save account config into DB with alternate bidder codes" + def account = getAccountWithAlternateBidderCode(bidRequest).tap { + config = configAccountAlternateBidderCodes + } + accountDao.save(account) + + and: "Bid response with bidder code" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest, AMX).tap { + it.seatbid[0].bid[0].ext = new BidExt(bidderCode: GENERIC) + } + bidder.setResponse(bidRequest.id, bidResponse) + + and: "Flash metrics" + flushMetrics(pbsServiceWithAmxBidder) + + when: "PBS processes auction request" + def response = pbsServiceWithAmxBidder.sendAuctionRequest(bidRequest) + + then: "Response should contain adapter code" + assert response.seatbid.bid.ext.prebid.meta.adapterCode.flatten() == [AMX] + + and: "Response should contain seatbid.seat" + assert response.seatbid[0].seat == GENERIC + + and: "Response should contain bidder targeting" + def targeting = response.seatbid[0].bid[0].ext.prebid.targeting + assert targeting["hb_pb_${GENERIC}"] + assert targeting["hb_size_${GENERIC}"] + assert targeting["hb_bidder"] == GENERIC.value + assert targeting["hb_bidder_${GENERIC}"] == GENERIC.value + + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(GENERIC.value) + + and: "Bidder request should be valid" + assert bidder.getBidderRequests(bidRequest.id) + + and: "Response shouldn't contain warnings,errors and seatnonbid" + assert !response.ext?.warnings + assert !response.ext?.errors + assert !response.ext?.seatnonbid + + and: "Response shouldn't contain demand source" + assert !response.seatbid.first.bid.first.ext.prebid.meta.demandSource + + and: "Metric shouldn't be updated" + def metrics = pbsServiceWithAmxBidder.sendCollectedMetricsRequest() + assert !metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(AMX)] + + where: + configAccountAlternateBidderCodes << [ + new AccountConfig(alternateBidderCodesSnakeCase: new AlternateBidderCodes(enabled: true, bidders: [(AMX): new BidderConfig(enabled: true, allowedBidderCodesSnakeCase: [GENERIC])])), + new AccountConfig(alternateBidderCodes: new AlternateBidderCodes(enabled: true, bidders: [(AMX): new BidderConfig(enabled: true, allowedBidderCodesSnakeCase: [GENERIC])])), + new AccountConfig(alternateBidderCodesSnakeCase: new AlternateBidderCodes(enabled: true, bidders: [(AMX): new BidderConfig(enabled: true, allowedBidderCodes: [GENERIC])]))] + } + + def "PBS should take precede of request and discard the bid and emit a response error when alternate bidder codes enabled and bidder came with different bidder code"() { + given: "Default bid request with alternate bidder codes" + def bidRequest = getBidRequestWithAmxBidderAndAlternateBidderCode() + + and: "Save account config into DB with alternate bidder codes" + def account = getAccountWithAlternateBidderCode(bidRequest).tap { + config.alternateBidderCodes.bidders[AMX].allowedBidderCodes = [UNKNOWN] + } + accountDao.save(account) + + and: "Bid response with bidder code" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest, AMX).tap { + it.seatbid[0].bid[0].ext = new BidExt(bidderCode: UNKNOWN) + } + bidder.setResponse(bidRequest.id, bidResponse) + + and: "Flash metrics" + flushMetrics(pbsServiceWithAmxBidder) + + when: "PBS processes auction request" + def response = pbsServiceWithAmxBidder.sendAuctionRequest(bidRequest) + + then: "Bid response shouldn't seat bid" + assert response.seatbid.isEmpty() + + and: "Response should seatNon bid with code 300" + assert response.ext.seatnonbid.size() == 1 + + def seatNonBid = response.ext.seatnonbid[0] + assert seatNonBid.seat == UNKNOWN.value + assert seatNonBid.nonBid[0].impId == bidRequest.imp[0].id + assert seatNonBid.nonBid[0].statusCode == RESPONSE_REJECTED_GENERAL + + and: "Response should contain error" + def error = response.ext?.errors[ErrorType.AMX][0] + assert error.code == 5 + assert error.message == ERROR_BID_CODE_VALIDATION + .formatted(bidResponse.seatbid[0].bid[0].id, UNKNOWN, AMX, bidRequest.accountId) + + and: "PBS should emit logs" + def logs = pbsServiceWithAmxBidder.getLogsByValue(bidRequest.accountId) + assert logs.contains(INVALID_BIDDER_CODE_LOGS.formatted(UNKNOWN, AMX, bidRequest.accountId)) + + and: "PBS should emit metrics" + def metrics = pbsServiceWithAmxBidder.sendCollectedMetricsRequest() + assert metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(AMX)] + + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(AMX.value) + + and: "Bidder request should be valid" + assert bidder.getBidderRequests(bidRequest.id) + } + + def "PBS should discard the bid and emit a response warning when alternate bidder codes disabled and bidder came with different bidderCode"() { + given: "Default bid request with alternate bidder codes" + def bidRequest = getBidRequestWithAmxBidderAndAlternateBidderCode().tap { + ext.prebid.alternateBidderCodes.enabled = requestedAlternateBidderCodes + } + + and: "Save account config into DB with alternate bidder codes" + def account = getAccountWithAlternateBidderCode(bidRequest).tap { + config.alternateBidderCodes.enabled = accountAlternateBidderCodes + } + accountDao.save(account) + + and: "Bid response with bidder code" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest, AMX).tap { + it.seatbid[0].bid[0].ext = new BidExt(bidderCode: UNKNOWN) + } + bidder.setResponse(bidRequest.id, bidResponse) + + and: "Flash metrics" + flushMetrics(pbsServiceWithAmxBidder) + + when: "PBS processes auction request" + def response = pbsServiceWithAmxBidder.sendAuctionRequest(bidRequest) + + then: "Bid response shouldn't seat bid" + assert response.seatbid.isEmpty() + + and: "Response should seatNon bid with code 300" + assert response.ext.seatnonbid.size() == 1 + + def seatNonBid = response.ext.seatnonbid[0] + assert seatNonBid.seat == UNKNOWN.value + assert seatNonBid.nonBid[0].impId == bidRequest.imp[0].id + assert seatNonBid.nonBid[0].statusCode == RESPONSE_REJECTED_GENERAL + + and: "Response should contain error" + def error = response.ext?.errors[ErrorType.AMX][0] + assert error.code == 5 + assert error.message == ERROR_BID_CODE_VALIDATION + .formatted(bidResponse.seatbid[0].bid[0].id, UNKNOWN, AMX, bidRequest.accountId) + + and: "PBS should emit logs" + def logs = pbsServiceWithAmxBidder.getLogsByValue(bidRequest.accountId) + assert logs.contains(INVALID_BIDDER_CODE_LOGS.formatted(UNKNOWN, AMX, bidRequest.accountId)) + + and: "PBS should emit metrics" + def metrics = pbsServiceWithAmxBidder.sendCollectedMetricsRequest() + assert metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(AMX)] + + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(AMX.value) + + and: "Bidder request should be valid" + assert bidder.getBidderRequests(bidRequest.id) + + where: + requestedAlternateBidderCodes | accountAlternateBidderCodes + false | true + false | false + false | null + null | false + } + + def "PBS shouldn't discard the bid or emit a response warning when account alternate bidder codes are enabled and allowed bidder codes are either a wildcard or empty"() { + given: "Default bid request with alternate bidder codes" + def bidRequest = getBidRequestWithAmxBidder() + + and: "Save account config into DB with alternate bidder codes" + def account = getAccountWithAlternateBidderCode(bidRequest).tap { + config.alternateBidderCodes.bidders[AMX].allowedBidderCodes = accountAllowedBidderCodes + } + accountDao.save(account) + + and: "Bid response with bidder code" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest, AMX).tap { + it.seatbid[0].bid[0].ext = new BidExt(bidderCode: GENERIC) + } + bidder.setResponse(bidRequest.id, bidResponse) + + and: "Flash metrics" + flushMetrics(pbsServiceWithAmxBidder) + + when: "PBS processes auction request" + def response = pbsServiceWithAmxBidder.sendAuctionRequest(bidRequest) + + then: "Response should contain adapter code" + assert response.seatbid.bid.ext.prebid.meta.adapterCode.flatten() == [AMX] + + and: "Response should contain seatbid.seat" + assert response.seatbid.seat.flatten() == [GENERIC] + + and: "Response should contain bidder targeting" + def targeting = response.seatbid[0].bid[0].ext.prebid.targeting + assert targeting["hb_pb_${GENERIC}"] + assert targeting["hb_size_${GENERIC}"] + assert targeting["hb_bidder"] == GENERIC.value + assert targeting["hb_bidder_${GENERIC}"] == GENERIC.value + + and: "Bidder request should be valid" + assert bidder.getBidderRequests(bidRequest.id) + + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(GENERIC.value) + + and: "Response shouldn't contain demand source" + assert !response.seatbid.first.bid.first.ext.prebid.meta.demandSource + + and: "Response shouldn't contain warnings and errors and seatNonBid" + assert !response.ext?.warnings + assert !response.ext?.errors + assert !response.ext?.seatnonbid + + and: "PBs metric shouldn't be updated" + def metrics = pbsServiceWithAmxBidder.sendCollectedMetricsRequest() + assert !metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(AMX)] + + where: + accountAllowedBidderCodes << [[WILDCARD], [WILDCARD, EMPTY], [EMPTY, WILDCARD], null] + } + + def "PBS shouldn't discard the bid or emit a response warning when request alternate bidder codes are enabled and allowed bidder codes are either a wildcard or empty"() { + given: "Default bid request with alternate bidder codes" + def bidRequest = getBidRequestWithAmxBidderAndAlternateBidderCode().tap { + ext.prebid.alternateBidderCodes.bidders[AMX].allowedBidderCodesLowerCase = requestedAllowedBidderCodes + } + + and: "Bid response with bidder code" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest, AMX).tap { + it.seatbid[0].bid[0].ext = new BidExt(bidderCode: GENERIC) + } + bidder.setResponse(bidRequest.id, bidResponse) + + and: "Flash metrics" + flushMetrics(pbsServiceWithAmxBidder) + + when: "PBS processes auction request" + def response = pbsServiceWithAmxBidder.sendAuctionRequest(bidRequest) + + then: "Response should contain adapter code" + assert response.seatbid.bid.ext.prebid.meta.adapterCode.flatten() == [AMX] + + and: "Response should contain seatbid.seat" + assert response.seatbid.seat.flatten() == [GENERIC] + + and: "Response should contain bidder targeting" + def targeting = response.seatbid[0].bid[0].ext.prebid.targeting + assert targeting["hb_pb_${GENERIC}"] + assert targeting["hb_size_${GENERIC}"] + assert targeting["hb_bidder"] == GENERIC.value + assert targeting["hb_bidder_${GENERIC}"] == GENERIC.value + + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(GENERIC.value) + + and: "Bidder request should be valid" + assert bidder.getBidderRequests(bidRequest.id) + + and: "Response shouldn't contain warnings and errors and seatNonBid" + assert !response.ext?.warnings + assert !response.ext?.errors + assert !response.ext?.seatnonbid + + and: "Response shouldn't contain demand source" + assert !response.seatbid.first.bid.first.ext.prebid.meta.demandSource + + and: "PBs metric shouldn't be updated" + def metrics = pbsServiceWithAmxBidder.sendCollectedMetricsRequest() + assert !metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(AMX)] + + where: + requestedAllowedBidderCodes << [[WILDCARD], [WILDCARD, EMPTY], [EMPTY, WILDCARD], null] + } + + def "PBS shouldn't discard the bid or emit a response warning when request alternate bidder codes are enabled and the allowed bidder codes is same as bidder's request"() { + given: "Default bid request with alternate bidder codes" + def bidRequest = getBidRequestWithAmxBidderAndAlternateBidderCode().tap { + ext.prebid.alternateBidderCodes.bidders = requestAlternateBidders + } + + and: "Bid response with bidder code" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest, AMX).tap { + it.seatbid[0].bid[0].ext = new BidExt(bidderCode: GENERIC) + } + bidder.setResponse(bidRequest.id, bidResponse) + + and: "Flash metrics" + flushMetrics(pbsServiceWithAmxBidder) + + when: "PBS processes auction request" + def response = pbsServiceWithAmxBidder.sendAuctionRequest(bidRequest) + + then: "Response should contain adapter code" + assert response.seatbid.bid.ext.prebid.meta.adapterCode.flatten() == [AMX] + + and: "Response should contain seatbid.seat" + assert response.seatbid.seat.flatten() == [GENERIC] + + and: "Response shouldn't contain demand source" + assert !response.seatbid.first.bid.first.ext.prebid.meta.demandSource + + and: "Response should contain bidder targeting" + def targeting = response.seatbid[0].bid[0].ext.prebid.targeting + assert targeting["hb_pb_${GENERIC}"] + assert targeting["hb_size_${GENERIC}"] + assert targeting["hb_bidder"] == GENERIC.value + assert targeting["hb_bidder_${GENERIC}"] == GENERIC.value + + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(GENERIC.value) + + and: "Bidder request should be valid" + assert bidder.getBidderRequests(bidRequest.id) + + and: "Response shouldn't contain warnings and errors and seatNonBid" + assert !response.ext?.warnings + assert !response.ext?.errors + assert !response.ext?.seatnonbid + + and: "PBs metric shouldn't be updated" + def metrics = pbsServiceWithAmxBidder.sendCollectedMetricsRequest() + assert !metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(AMX)] + + where: + requestAlternateBidders << [[(AMX): new BidderConfig(enabled: true, allowedBidderCodes: [GENERIC])], + [(AMX): new BidderConfig(enabled: true, allowedBidderCodes: [GENERIC_CAMEL_CASE])], + [(AMX_CAMEL_CASE): new BidderConfig(enabled: true, allowedBidderCodes: [GENERIC_CAMEL_CASE])], + [(AMX_CAMEL_CASE): new BidderConfig(enabled: true, allowedBidderCodes: [GENERIC])]] + } + + def "PBS shouldn't discard the bid or emit a response warning when account alternate bidder codes are enabled and the allowed bidder codes is same as bidder's request"() { + given: "Default bid request with alternate bidder codes" + def bidRequest = getBidRequestWithAmxBidder() + + and: "Save account config into DB with alternate bidder codes" + def account = getAccountWithAlternateBidderCode(bidRequest).tap { + config.alternateBidderCodes.bidders = accountAlternateBidders + } + accountDao.save(account) + + and: "Bid response with bidder code" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest, AMX).tap { + it.seatbid[0].bid[0].ext = new BidExt(bidderCode: GENERIC) + } + bidder.setResponse(bidRequest.id, bidResponse) + + and: "Flash metrics" + flushMetrics(pbsServiceWithAmxBidder) + + when: "PBS processes auction request" + def response = pbsServiceWithAmxBidder.sendAuctionRequest(bidRequest) + + then: "Response should contain adapter code" + assert response.seatbid.bid.ext.prebid.meta.adapterCode.flatten() == [AMX] + + and: "Response should contain seatbid.seat" + assert response.seatbid.seat.flatten() == [GENERIC] + + and: "Bidder request should be valid" + assert bidder.getBidderRequests(bidRequest.id) + + and: "Response shouldn't contain demand source" + assert !response.seatbid.first.bid.first.ext.prebid.meta.demandSource + + and: "Response should contain bidder targeting" + def targeting = response.seatbid[0].bid[0].ext.prebid.targeting + assert targeting["hb_pb_${GENERIC}"] + assert targeting["hb_size_${GENERIC}"] + assert targeting["hb_bidder"] == GENERIC.value + assert targeting["hb_bidder_${GENERIC}"] == GENERIC.value + + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(GENERIC.value) + + and: "Response shouldn't contain warnings and errors and seatNonBid" + assert !response.ext?.warnings + assert !response.ext?.errors + assert !response.ext?.seatnonbid + + and: "PBs metric shouldn't be updated" + def metrics = pbsServiceWithAmxBidder.sendCollectedMetricsRequest() + assert !metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(AMX)] + + where: + accountAlternateBidders << [[(AMX): new BidderConfig(enabled: true, allowedBidderCodes: [GENERIC])], + [(AMX): new BidderConfig(enabled: true, allowedBidderCodes: [GENERIC_CAMEL_CASE])], + [(AMX_CAMEL_CASE): new BidderConfig(enabled: true, allowedBidderCodes: [GENERIC_CAMEL_CASE])], + [(AMX_CAMEL_CASE): new BidderConfig(enabled: true, allowedBidderCodes: [GENERIC])]] + } + + def "PBS shouldn't discard the bid or emit a response warning when default account alternate bidder codes are enabled and the allowed bidder codes match the bidder's request"() { + given: "Pbs config with default-account-config of alternate bidder code" + def defaultAccountConfig = AccountConfig.defaultAccountConfig.tap { + alternateBidderCodes = new AlternateBidderCodes().tap { + it.enabled = true + it.bidders = [(AMX): new BidderConfig(enabled: true, allowedBidderCodes: [AMX])] + } + } + def config = AMX_CONFIG + ["settings.default-account-config": encode(defaultAccountConfig)] + def pbsService = pbsServiceFactory.getService(config) + + and: "Default bid request" + def bidRequest = getBidRequestWithAmxBidderAndAlternateBidderCode().tap { + ext.prebid.alternateBidderCodes = null + } + + and: "Bid response with bidder code" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest, AMX).tap { + it.seatbid[0].bid[0].ext = new BidExt(bidderCode: AMX) + } + bidder.setResponse(bidRequest.id, bidResponse) + + and: "Flash metrics" + flushMetrics(pbsService) + + when: "PBS processes auction request" + def response = pbsService.sendAuctionRequest(bidRequest) + + then: "Response should contain adapter code" + assert response.seatbid.bid.ext.prebid.meta.adapterCode.flatten() == [AMX] + + and: "Response shouldn't contain demand source" + assert !response.seatbid.first.bid.first.ext.prebid.meta.demandSource + + and: "Response should contain seatbid.seat" + assert response.seatbid.seat.flatten() == [AMX] + + and: "Response should contain bidder targeting" + def targeting = response.seatbid[0].bid[0].ext.prebid.targeting + assert targeting["hb_pb_${AMX}"] + assert targeting["hb_size_${AMX}"] + assert targeting["hb_bidder"] == AMX.value + assert targeting["hb_bidder_${AMX}"] == AMX.value + + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(AMX.value) + + and: "Bidder request should be valid" + assert bidder.getBidderRequests(bidRequest.id) + + and: "Response shouldn't contain warnings and errors and seatnonbid" + assert !response.ext?.warnings + assert !response.ext?.errors + assert !response.ext?.seatnonbid + + and: "Alert.general metric shouldn't be updated" + def metrics = pbsService.sendCollectedMetricsRequest() + assert !metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(AMX)] + + cleanup: "Stop and remove pbs container" + pbsServiceFactory.removeContainer(config) + } + + def "PBS should discard the bid and emit a response warning when request alternate bidder codes are enabled and the allowed bidder codes doesn't match the bidder's request"() { + given: "Default bid request with alternate bidder codes" + def bidRequest = getBidRequestWithAmxBidderAndAlternateBidderCode() + + and: "Bid response with bidder code" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest, AMX).tap { + it.seatbid[0].bid[0].ext = new BidExt(bidderCode: requestedAllowedBidderCode) + } + bidder.setResponse(bidRequest.id, bidResponse) + + and: "Flash metrics" + flushMetrics(pbsServiceWithAmxBidder) + + when: "PBS processes auction request" + def response = pbsServiceWithAmxBidder.sendAuctionRequest(bidRequest) + + then: "Bid response shouldn't seat bid" + assert response.seatbid.isEmpty() + + and: "Response should seatNon bid with code 300" + assert response.ext.seatnonbid.size() == 1 + + def seatNonBid = response.ext.seatnonbid[0] + assert seatNonBid.seat == requestedAllowedBidderCode.value + assert seatNonBid.nonBid[0].impId == bidRequest.imp[0].id + assert seatNonBid.nonBid[0].statusCode == RESPONSE_REJECTED_GENERAL + + and: "Response should contain error" + def error = response.ext?.errors[ErrorType.AMX][0] + assert error.code == 5 + assert error.message == ERROR_BID_CODE_VALIDATION + .formatted(bidResponse.seatbid[0].bid[0].id, requestedAllowedBidderCode, AMX, bidRequest.accountId) + + and: "PBS should emit logs" + def logs = pbsServiceWithAmxBidder.getLogsByValue(bidRequest.accountId) + assert logs.contains(INVALID_BIDDER_CODE_LOGS.formatted(requestedAllowedBidderCode, AMX, bidRequest.accountId)) + + and: "PBS should emit metrics" + def metrics = pbsServiceWithAmxBidder.sendCollectedMetricsRequest() + assert metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(AMX)] + + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(AMX.value) + + and: "Bidder request should be valid" + assert bidder.getBidderRequests(bidRequest.id) + + where: + requestedAllowedBidderCode << [UNKNOWN, BOGUS] + } + + def "PBS should discard the bid and emit a response warning when account alternate bidder codes are enabled and the allowed bidder codes doesn't match the bidder's request"() { + given: "Default bid request with alternate bidder codes" + def bidRequest = getBidRequestWithAmxBidder() + + and: "Save account config into DB with alternate bidder codes" + def account = getAccountWithAlternateBidderCode(bidRequest) + accountDao.save(account) + + and: "Bid response with bidder code" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest, AMX).tap { + it.seatbid[0].bid[0].ext = new BidExt(bidderCode: requestedAllowedBidderCode) + } + bidder.setResponse(bidRequest.id, bidResponse) + + and: "Flash metrics" + flushMetrics(pbsServiceWithAmxBidder) + + when: "PBS processes auction request" + def response = pbsServiceWithAmxBidder.sendAuctionRequest(bidRequest) + + then: "Bid response shouldn't seat bid" + assert response.seatbid.isEmpty() + + and: "Response should seatNon bid with code 300" + assert response.ext.seatnonbid.size() == 1 + + def seatNonBid = response.ext.seatnonbid[0] + assert seatNonBid.seat == requestedAllowedBidderCode.value + assert seatNonBid.nonBid[0].impId == bidRequest.imp[0].id + assert seatNonBid.nonBid[0].statusCode == RESPONSE_REJECTED_GENERAL + + and: "Response should contain error" + def error = response.ext?.errors[ErrorType.AMX][0] + assert error.code == 5 + assert error.message == ERROR_BID_CODE_VALIDATION + .formatted(bidResponse.seatbid[0].bid[0].id, requestedAllowedBidderCode, AMX, bidRequest.accountId) + + and: "PBS should emit logs" + def logs = pbsServiceWithAmxBidder.getLogsByValue(bidRequest.accountId) + assert logs.contains(INVALID_BIDDER_CODE_LOGS.formatted(requestedAllowedBidderCode, AMX, bidRequest.accountId)) + + and: "PBS should emit metrics" + def metrics = pbsServiceWithAmxBidder.sendCollectedMetricsRequest() + assert metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(AMX)] + + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(AMX.value) + + and: "Bidder request should be valid" + assert bidder.getBidderRequests(bidRequest.id) + + where: + requestedAllowedBidderCode << [UNKNOWN, BOGUS] + } + + def "PBS should discard the bid and emit a response warning when default account alternate bidder codes are enabled and the allowed bidder codes doesn't match the bidder's request"() { + given: "Pbs config with default-account-config" + def defaultAccountConfig = AccountConfig.defaultAccountConfig.tap { + alternateBidderCodes = new AlternateBidderCodes().tap { + it.enabled = true + it.bidders = [(AMX): new BidderConfig(enabled: true, allowedBidderCodes: [AMX])] + } + } + def pbsConfig = AMX_CONFIG + ["settings.default-account-config": encode(defaultAccountConfig)] + def pbsService = pbsServiceFactory.getService(pbsConfig) + + and: "Default bid request" + def bidRequest = getBidRequestWithAmxBidder() + + and: "Bid response with bidder code" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest, AMX).tap { + it.seatbid[0].bid[0].ext = new BidExt(bidderCode: allowedBidderCodes) + } + bidder.setResponse(bidRequest.id, bidResponse) + + and: "Flash metrics" + flushMetrics(pbsService) + + when: "PBS processes auction request" + def response = pbsService.sendAuctionRequest(bidRequest) + + then: "Bid response shouldn't seat bid" + assert response.seatbid.isEmpty() + + and: "Response should seatNon bid with code 300" + assert response.ext.seatnonbid.size() == 1 + + def seatNonBid = response.ext.seatnonbid[0] + assert seatNonBid.seat == allowedBidderCodes.value + assert seatNonBid.nonBid[0].impId == bidRequest.imp[0].id + assert seatNonBid.nonBid[0].statusCode == RESPONSE_REJECTED_GENERAL + + and: "Response should contain error" + def error = response.ext?.errors[ErrorType.AMX][0] + assert error.code == 5 + assert error.message == ERROR_BID_CODE_VALIDATION + .formatted(bidResponse.seatbid[0].bid[0].id, allowedBidderCodes, AMX, bidRequest.accountId) + + and: "PBS should emit logs" + def logs = pbsService.getLogsByValue(bidRequest.accountId) + assert logs.contains(INVALID_BIDDER_CODE_LOGS.formatted(allowedBidderCodes, AMX, bidRequest.accountId)) + + and: "Response shouldn't contain demand source" + assert !response?.seatbid?.bid?.ext?.prebid?.meta?.demandSource + + and: "PBS should emit metrics" + def metrics = pbsService.sendCollectedMetricsRequest() + assert metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(AMX)] + + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(AMX.value) + + and: "Bidder request should be valid" + assert bidder.getBidderRequests(bidRequest.id) + + cleanup: "Stop and remove pbs container" + pbsServiceFactory.removeContainer(pbsConfig) + + where: + allowedBidderCodes << [BOGUS, UNKNOWN] + } + + def "PBS shouldn't discard bid when hard alias and alternate bidder allow bidder code"() { + given: "PBS config with bidder" + def pbsConfig = AMX_CONFIG + ["adapters.amx.aliases.alias.enabled" : "true", + "adapters.amx.aliases.alias.endpoint": "$networkServiceContainer.rootUri/auction".toString()] + def defaultPbsService = pbsServiceFactory.getService(pbsConfig) + + and: "Default bid request with alias" + def bidRequest = getBidRequestWithAmxBidderAndAlternateBidderCode().tap { + imp[0].ext.prebid.bidder.tap { + amx = null + alias = new Generic() + } + ext.prebid.alternateBidderCodes.bidders = [(ALIAS): new BidderConfig(enabled: true, allowedBidderCodes: [GENERIC])] + } + + and: "Bid response with bidder code" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest, ALIAS).tap { + it.seatbid[0].bid[0].ext = new BidExt(bidderCode: GENERIC) + } + bidder.setResponse(bidRequest.id, bidResponse) + + when: "PBS processes auction request" + def response = defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Response should contain adapter code" + assert response.seatbid.bid.ext.prebid.meta.adapterCode.flatten() == [ALIAS] + + and: "Response should contain seat bid" + assert response.seatbid.seat == [GENERIC] + + and: "Response should contain bidder targeting" + def targeting = response.seatbid[0].bid[0].ext.prebid.targeting + assert targeting["hb_pb_${GENERIC}"] + assert targeting["hb_size_${GENERIC}"] + assert targeting["hb_bidder"] == GENERIC.value + assert targeting["hb_bidder_${GENERIC}"] == GENERIC.value + + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(GENERIC.value) + + and: "Bidder request should be valid" + assert bidder.getBidderRequests(bidRequest.id) + + and: "Response shouldn't contain demand source" + assert !response.seatbid.first.bid.first.ext.prebid.meta.demandSource + + and: "PBS shouldn't emit validation metrics" + def metrics = defaultPbsService.sendCollectedMetricsRequest() + assert !metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(GENERIC)] + + cleanup: "Stop and remove pbs container" + pbsServiceFactory.removeContainer(pbsConfig) + } + + def "PBS shouldn't discard bid when alternate bidder code allow and soft alias with case"() { + given: "Default bid request with amx bidder" + def bidRequest = getBidRequestWithAmxBidderAndAlternateBidderCode().tap { + imp[0].ext.prebid.bidder.aliasUpperCase = new Generic() + imp[0].ext.prebid.bidder.amx = null + ext.prebid.aliases = [(ALIAS.value): AMX] + ext.prebid.alternateBidderCodes = requestAlternateBidderCode + } + + and: "Save account config into DB with alternate bidder codes" + def account = getAccountWithAlternateBidderCode(bidRequest).tap { + config.alternateBidderCodes = accountAlternateBidderCodes + } + accountDao.save(account) + + and: "Bid response with bidder code" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest, ALIAS).tap { + it.seatbid[0].bid[0].ext = new BidExt(bidderCode: GENERIC) + } + bidder.setResponse(bidRequest.id, bidResponse) + + and: "Flash metrics" + flushMetrics(pbsServiceWithAmxBidder) + + when: "PBS processes auction request" + def response = pbsServiceWithAmxBidder.sendAuctionRequest(bidRequest) + + then: "Bid response should contain exp data" + assert response.seatbid.seat == [GENERIC] + + and: "Response should contain adapter code" + assert response.seatbid.bid.ext.prebid.meta.adapterCode.flatten() == [AMX] + + and: "Response shouldn't contain demand source" + assert !response.seatbid.first.bid.first.ext.prebid.meta.demandSource + + and: "Response should contain bidder targeting" + def targeting = response.seatbid[0].bid[0].ext.prebid.targeting + assert targeting["hb_pb_${GENERIC}"] + assert targeting["hb_size_${GENERIC}"] + assert targeting["hb_bidder"] == GENERIC.value + assert targeting["hb_bidder_${GENERIC}"] == GENERIC.value + + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(GENERIC.value) + + and: "Bidder request should be valid" + assert bidder.getBidderRequests(bidRequest.id) + + and: "Response shouldn't contain warnings and error and seatNonBid" + assert !response.ext?.warnings + assert !response.ext?.errors + assert !response.ext?.seatnonbid + + and: "PBS shouldn't emit validation metrics" + def metrics = pbsServiceWithAmxBidder.sendCollectedMetricsRequest() + assert !metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(ALIAS)] + assert !metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(GENERIC)] + assert !metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(AMX)] + + where: + requestAlternateBidderCode | accountAlternateBidderCodes + new AlternateBidderCodes(enabled: true, bidders: [(ALIAS): new BidderConfig(enabled: true, allowedBidderCodes: [GENERIC])]) | null + null | new AlternateBidderCodes(enabled: true, bidders: [(ALIAS): new BidderConfig(enabled: true, allowedBidderCodes: [GENERIC])]) + } + + def "PBS shouldn't discard bid when alternate bidder code allow and soft alias with case with base bidder in alternate bidder code"() { + given: "Default bid request with amx bidder" + def bidRequest = getBidRequestWithAmxBidderAndAlternateBidderCode().tap { + imp[0].ext.prebid.bidder.aliasUpperCase = new Generic() + imp[0].ext.prebid.bidder.amx = null + ext.prebid.aliases = [(ALIAS.value): AMX] + ext.prebid.alternateBidderCodes = requestAlternateBidderCode + } + + and: "Save account config into DB with alternate bidder codes" + def account = getAccountWithAlternateBidderCode(bidRequest).tap { + config.alternateBidderCodes = accountAlternateBidderCodes + } + accountDao.save(account) + + and: "Bid response with bidder code" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest, ALIAS).tap { + it.seatbid[0].bid[0].ext = new BidExt(bidderCode: GENERIC) + } + bidder.setResponse(bidRequest.id, bidResponse) + + and: "Flash metrics" + flushMetrics(pbsServiceWithAmxBidder) + + when: "PBS processes auction request" + def response = pbsServiceWithAmxBidder.sendAuctionRequest(bidRequest) + + then: "Bid response should contain exp data" + assert response.seatbid.seat == [GENERIC] + + and: "Response should contain adapter code" + assert response.seatbid.bid.ext.prebid.meta.adapterCode.flatten() == [AMX] + + and: "Response shouldn't contain demand source" + assert !response.seatbid.first.bid.first.ext.prebid.meta.demandSource + + and: "Response should contain bidder targeting" + def targeting = response.seatbid[0].bid[0].ext.prebid.targeting + assert targeting["hb_pb_${GENERIC}"] + assert targeting["hb_size_${GENERIC}"] + assert targeting["hb_bidder"] == GENERIC.value + assert targeting["hb_bidder_${GENERIC}"] == GENERIC.value + + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(GENERIC.value) + + and: "Bidder request should be valid" + assert bidder.getBidderRequests(bidRequest.id) + + and: "Response shouldn't contain warnings and error and seatNonBid" + assert !response.ext?.warnings + assert !response.ext?.errors + assert !response.ext?.seatnonbid + + and: "PBS shouldn't emit validation metrics" + def metrics = pbsServiceWithAmxBidder.sendCollectedMetricsRequest() + assert !metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(ALIAS)] + assert !metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(GENERIC)] + assert !metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(AMX)] + + where: + requestAlternateBidderCode | accountAlternateBidderCodes + new AlternateBidderCodes(enabled: true, bidders: [(AMX): new BidderConfig(enabled: true, allowedBidderCodes: [GENERIC])]) | null + null | new AlternateBidderCodes(enabled: true, bidders: [(AMX): new BidderConfig(enabled: true, allowedBidderCodes: [GENERIC])]) + } + + def "PBS should populate adapter code with requested bidder when conflict soft and hard alias and alternate bidder code"() { + given: "PBS config with bidder" + def pbsConfig = AMX_CONFIG + ["adapters.amx.aliases.alias.enabled" : "true", + "adapters.amx.aliases.alias.endpoint": "$networkServiceContainer.rootUri/auction".toString()] + def defaultPbsService = pbsServiceFactory.getService(pbsConfig) + + and: "Bid request with amx bidder and targeting" + def bidRequest = getBidRequestWithAmxBidderAndAlternateBidderCode().tap { + imp[0].ext.prebid.bidder.alias = new Generic() + imp[0].ext.prebid.bidder.amx = null + imp[0].ext.prebid.bidder.generic = null + it.ext.prebid.aliases = [(ALIAS.value): GENERIC] + it.ext.prebid.alternateBidderCodes.bidders = [(ALIAS): new BidderConfig(enabled: true, allowedBidderCodesLowerCase: [GENERIC])] + } + + and: "Bid response with bidder code" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest, ALIAS).tap { + it.seatbid[0].bid[0].ext = new BidExt(bidderCode: GENERIC) + } + bidder.setResponse(bidRequest.id, bidResponse) + + when: "PBS processes auction request" + def response = defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Response should contain adapter code" + assert response.seatbid.bid.ext.prebid.meta.adapterCode.flatten() == [ALIAS] + + and: "Response should contain seat bid" + assert response.seatbid.seat == [GENERIC] + + and: "Response shouldn't contain demand source" + assert !response.seatbid.first.bid.first.ext.prebid.meta.demandSource + + and: "Response should contain bidder targeting" + def targeting = response.seatbid[0].bid[0].ext.prebid.targeting + assert targeting["hb_pb_${GENERIC}"] + assert targeting["hb_size_${GENERIC}"] + assert targeting["hb_bidder"] == GENERIC.value + assert targeting["hb_bidder_${GENERIC}"] == GENERIC.value + + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(GENERIC.value) + + and: "Bidder request should be valid" + assert bidder.getBidderRequests(bidRequest.id) + + and: "PBS shouldn't emit validation metrics" + def metrics = defaultPbsService.sendCollectedMetricsRequest() + assert !metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(GENERIC)] + + cleanup: "Stop and remove pbs container" + pbsServiceFactory.removeContainer(pbsConfig) + } + + def "PBS should populate two seat bid when different bidder response with same seat"() { + given: "Default bid request with amx and generic bidder" + def bidRequest = getBidRequestWithAmxBidderAndAlternateBidderCode().tap { + imp[0].ext.prebid.bidder.generic = new Generic() + ext.prebid.alternateBidderCodes.bidders = [(AMX): new BidderConfig(enabled: true, allowedBidderCodes: [GENERIC])] + } + + and: "Bid response with bidder code" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest, AMX).tap { + it.seatbid[0].bid[0].ext = new BidExt(bidderCode: GENERIC) + } + bidder.setResponse(bidRequest.id, bidResponse) + + and: "Flash metrics" + flushMetrics(pbsServiceWithAmxBidder) + + when: "PBS processes auction request" + def response = pbsServiceWithAmxBidder.sendAuctionRequest(bidRequest) + + then: "Bid response should contain seat" + assert response.seatbid.seat.sort() == [GENERIC, GENERIC].sort() + + and: "Response should contain adapter code" + assert response.seatbid.bid.ext.prebid.meta.adapterCode.flatten().sort() == [AMX, GENERIC].sort() + + and: "Response should contain bidder generic targeting" + def targeting = response.seatbid.bid.ext.prebid.targeting.flatten().collectEntries() + assert targeting["hb_pb_${GENERIC}"] + assert targeting["hb_size_${GENERIC}"] + assert targeting["hb_bidder_${GENERIC}"] == GENERIC.value + + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(GENERIC.value) + + and: "Response shouldn't contain repose millis with amx bidder" + assert !response.ext.responsetimemillis.containsKey(AMX.value) + + and: "Bidder request should be valid" + assert bidder.getBidderRequests(bidRequest.id) + + and: "Response shouldn't contain warnings and error and seatNonBid" + assert !response.ext?.warnings + assert !response.ext?.errors + assert !response.ext?.seatnonbid + + and: "Response shouldn't contain demand source" + assert !response.seatbid.first.bid.first.ext.prebid.meta.demandSource + + and: "PBS shouldn't emit validation metrics" + def metrics = pbsServiceWithAmxBidder.sendCollectedMetricsRequest() + assert !metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(AMX)] + assert !metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(GENERIC)] + } + + def "PBS should return two seat when same bidder response with different bidder code"() { + given: "Default bid request with amx and generic bidder" + def bidRequest = getBidRequestWithAmxBidderAndAlternateBidderCode().tap { + imp.add(Imp.getDefaultImpression()) + imp[1].ext.prebid.bidder.amx = new Amx() + imp[1].ext.prebid.bidder.generic = null + ext.prebid.alternateBidderCodes.bidders = [(AMX): new BidderConfig(enabled: true, allowedBidderCodes: [GENERIC, AMX])] + } + + and: "Bid response with bidder code" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest, AMX).tap { + it.seatbid[0].bid[0].ext = new BidExt(bidderCode: GENERIC) + it.seatbid[0].bid[1].ext = new BidExt(bidderCode: AMX) + } + bidder.setResponse(bidRequest.id, bidResponse) + + and: "Flash metrics" + flushMetrics(pbsServiceWithAmxBidder) + + when: "PBS processes auction request" + def response = pbsServiceWithAmxBidder.sendAuctionRequest(bidRequest) + + then: "Bid response should contain seat" + assert response.seatbid.seat.sort() == [GENERIC, AMX].sort() + + and: "Response should contain adapter code" + assert response.seatbid.bid.ext.prebid.meta.adapterCode.flatten() == [AMX, AMX] + + and: "Response should contain bidder amx targeting" + def targeting = response.seatbid.bid.ext.prebid.targeting.flatten().collectEntries() + assert targeting["hb_pb_${AMX}"] + assert targeting["hb_size_${AMX}"] + assert targeting["hb_bidder_${AMX}"] == AMX.value + + and: 'Response targeting should contain generic' + assert targeting["hb_pb_${GENERIC}"] + assert targeting["hb_size_${GENERIC}"] + assert targeting["hb_bidder_${GENERIC}"] == GENERIC.value + + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(GENERIC.value) + assert response.ext.responsetimemillis.containsKey(AMX.value) + + and: "Bidder request should be valid" + assert bidder.getBidderRequests(bidRequest.id) + + and: "Response shouldn't contain warnings and error and seatNonBid" + assert !response.ext?.warnings + assert !response.ext?.errors + assert !response.ext?.seatnonbid + + and: "Response shouldn't contain demand source" + assert !response.seatbid.first.bid.first.ext.prebid.meta.demandSource + + and: "PBS shouldn't emit validation metrics" + def metrics = pbsServiceWithAmxBidder.sendCollectedMetricsRequest() + assert !metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(AMX)] + assert !metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(GENERIC)] + } + + def "PBS should populate seat bid from stored bid response when stored bid response and alternate bidder code specified"() { + given: "Default bid request with amx bidder" + def storedResponseId = PBSUtils.randomNumber + def bidRequest = getBidRequestWithAmxBidderAndAlternateBidderCode().tap { + imp[0].ext.prebid.storedBidResponse = [new StoredBidResponse(id: storedResponseId, bidder: AMX)] + ext.prebid.alternateBidderCodes.bidders = [(AMX): new BidderConfig(enabled: true, allowedBidderCodes: [GENERIC])] + } + + and: "Stored bid response in DB" + def storedBidResponse = BidResponse.getDefaultBidResponse(bidRequest) + def storedResponse = new StoredResponse(responseId: storedResponseId, storedBidResponse: storedBidResponse) + storedResponseDao.save(storedResponse) + + and: "Bid response with bidder code" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest, AMX).tap { + it.seatbid[0].bid[0].ext = new BidExt(bidderCode: GENERIC) + } + bidder.setResponse(bidRequest.id, bidResponse) + + and: "Flash metrics" + flushMetrics(pbsServiceWithAmxBidder) + + when: "PBS processes auction request" + def response = pbsServiceWithAmxBidder.sendAuctionRequest(bidRequest) + + then: "Bid response should contain seat" + assert response.seatbid.seat == [AMX] + + and: "Response should contain adapter code" + assert response.seatbid.bid.ext.prebid.meta.adapterCode.flatten() == [AMX] + + and: "Response should contain bidder generic targeting" + def targeting = response.seatbid.bid.ext.prebid.targeting.flatten().collectEntries() + assert targeting["hb_pb_${AMX}"] + assert targeting["hb_size_${AMX}"] + assert targeting["hb_bidder_${AMX}"] == AMX.value + + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(AMX.value) + + and: "Bidder request shouldn't be called due to storedBidResponse" + assert !bidder.getBidderRequests(bidRequest.id) + + and: "Response shouldn't contain warnings and error and seatNonBid" + assert !response.ext?.warnings + assert !response.ext?.errors + assert !response.ext?.seatnonbid + + and: "Response shouldn't contain demand source" + assert !response.seatbid.first.bid.first.ext.prebid.meta.demandSource + + and: "PBS shouldn't emit validation metrics" + def metrics = pbsServiceWithAmxBidder.sendCollectedMetricsRequest() + assert !metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(AMX)] + } + + def "PBS auction allow bidder code when imp stored request and allowed bidder code present"() { + given: "Default bid request" + def bidRequest = getBidRequestWithAmxBidderAndAlternateBidderCode().tap { + imp[0].ext.prebid.storedRequest = new PrebidStoredRequest(id: PBSUtils.randomString) + ext.prebid.alternateBidderCodes.bidders = [(AMX): new BidderConfig(enabled: true, allowedBidderCodes: [GENERIC])] + } + + and: "Save storedImp into DB" + def storedImp = StoredImp.getStoredImp(bidRequest) + storedImpDao.save(storedImp) + + and: "Bid response with bidder code" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest, AMX).tap { + it.seatbid[0].bid[0].ext = new BidExt(bidderCode: GENERIC) + } + bidder.setResponse(bidRequest.id, bidResponse) + + when: "Requesting PBS auction" + def response = pbsServiceWithAmxBidder.sendAuctionRequest(bidRequest) + + then: "Bid response should contain seat" + assert response.seatbid.seat.sort() == [GENERIC].sort() + + and: "Response should contain adapter code" + assert response.seatbid.bid.ext.prebid.meta.adapterCode.flatten() == [AMX] + + and: "Response should contain bidder generic targeting" + def targeting = response.seatbid.bid.ext.prebid.targeting.flatten().collectEntries() + assert targeting["hb_pb_${GENERIC}"] + assert targeting["hb_size_${GENERIC}"] + assert targeting["hb_bidder_${GENERIC}"] == GENERIC.value + + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(GENERIC.value) + + and: "Bidder request should be called" + assert bidder.getBidderRequests(bidRequest.id) + + and: "Response shouldn't contain warnings and error and seatNonBid" + assert !response.ext?.warnings + assert !response.ext?.errors + assert !response.ext?.seatnonbid + + and: "Response shouldn't contain demand source" + assert !response.seatbid.first.bid.first.ext.prebid.meta.demandSource + + and: "PBS shouldn't emit validation metrics" + def metrics = pbsServiceWithAmxBidder.sendCollectedMetricsRequest() + assert !metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(GENERIC)] + assert !metrics[ADAPTER_RESPONSE_VALIDATION_METRICS.formatted(AMX)] + } + + private static Account getAccountWithAlternateBidderCode(BidRequest bidRequest) { + new Account().tap { + it.uuid = bidRequest.accountId + it.config = new AccountConfig(status: ACTIVE, alternateBidderCodes: new AlternateBidderCodes().tap { + it.enabled = true + it.bidders = [(AMX): new BidderConfig(enabled: true, allowedBidderCodes: [AMX])] + }) + } + } + + private static BidRequest getBidRequestWithAmxBidderAndAlternateBidderCode() { + getBidRequestWithAmxBidder().tap { + it.ext.prebid.alternateBidderCodes = new AlternateBidderCodes().tap { + enabled = true + bidders = [(AMX): new BidderConfig(enabled: true, allowedBidderCodesLowerCase: [AMX])] + } + } + } + + private static BidRequest getBidRequestWithAmxBidder() { + BidRequest.defaultBidRequest.tap { + it.imp[0].ext.prebid.bidder.tap { + generic = null + amx = new Amx() + } + ext.prebid.tap { + returnAllBidStatus = true + targeting = new Targeting() + } + } + } +} diff --git a/src/test/groovy/org/prebid/server/functional/tests/BidAdjustmentSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/BidAdjustmentSpec.groovy index 79eb960787f..8effa51b231 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/BidAdjustmentSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/BidAdjustmentSpec.groovy @@ -1,12 +1,16 @@ package org.prebid.server.functional.tests import org.prebid.server.functional.model.Currency +import org.prebid.server.functional.model.bidder.Generic import org.prebid.server.functional.model.config.AccountAuctionConfig import org.prebid.server.functional.model.config.AccountConfig +import org.prebid.server.functional.model.config.AlternateBidderCodes +import org.prebid.server.functional.model.config.BidderConfig import org.prebid.server.functional.model.db.Account import org.prebid.server.functional.model.mock.services.currencyconversion.CurrencyConversionRatesResponse import org.prebid.server.functional.model.request.auction.AdjustmentRule import org.prebid.server.functional.model.request.auction.AdjustmentType +import org.prebid.server.functional.model.request.auction.Amx import org.prebid.server.functional.model.request.auction.BidAdjustment import org.prebid.server.functional.model.request.auction.BidAdjustmentFactors import org.prebid.server.functional.model.request.auction.BidAdjustmentRule @@ -14,6 +18,7 @@ import org.prebid.server.functional.model.request.auction.BidRequest import org.prebid.server.functional.model.request.auction.Imp import org.prebid.server.functional.model.request.auction.VideoPlacementSubtypes import org.prebid.server.functional.model.request.auction.VideoPlcmtSubtype +import org.prebid.server.functional.model.response.auction.BidExt import org.prebid.server.functional.model.response.auction.BidResponse import org.prebid.server.functional.service.PrebidServerException import org.prebid.server.functional.service.PrebidServerService @@ -27,6 +32,8 @@ import static io.netty.handler.codec.http.HttpResponseStatus.BAD_REQUEST import static org.prebid.server.functional.model.Currency.EUR import static org.prebid.server.functional.model.Currency.GBP import static org.prebid.server.functional.model.Currency.USD +import static org.prebid.server.functional.model.bidder.BidderName.ALIAS +import static org.prebid.server.functional.model.bidder.BidderName.AMX import static org.prebid.server.functional.model.bidder.BidderName.APPNEXUS import static org.prebid.server.functional.model.bidder.BidderName.GENERIC import static org.prebid.server.functional.model.bidder.BidderName.RUBICON @@ -68,7 +75,9 @@ class BidAdjustmentSpec extends BaseSpec { private static final CurrencyConversion currencyConversion = new CurrencyConversion(networkServiceContainer).tap { setCurrencyConversionRatesResponse(CurrencyConversionRatesResponse.getDefaultCurrencyConversionRatesResponse(DEFAULT_CURRENCY_RATES)) } - private static final PrebidServerService pbsService = pbsServiceFactory.getService(externalCurrencyConverterConfig) + private static final Map AMX_CONFIG = ["adapters.amx.enabled" : "true", + "adapters.amx.endpoint": "$networkServiceContainer.rootUri/auction".toString()] + private static final PrebidServerService pbsService = pbsServiceFactory.getService(externalCurrencyConverterConfig + AMX_CONFIG) def "PBS should adjust bid price for matching bidder when request has per-bidder bid adjustment factors"() { given: "Default bid request with bid adjustment" @@ -1074,6 +1083,116 @@ class BidAdjustmentSpec extends BaseSpec { adjustmentType << [CPM, STATIC] } + def "PBS should adjust bid price for matching bidder and alternate bidder code when request has per-bidder bid adjustment factors"() { + given: "Default bid request with bid adjustment and amx bidder" + def bidRequest = BidRequest.getDefaultBidRequest(SITE).tap { + imp[0].ext.prebid.bidder.generic = null + imp[0].ext.prebid.bidder.amx = new Amx() + it.ext.prebid.tap { + alternateBidderCodes = new AlternateBidderCodes().tap { + enabled = true + bidders = [(AMX): new BidderConfig(enabled: true, allowedBidderCodes: [GENERIC])] + } + bidAdjustmentFactors = new BidAdjustmentFactors(adjustments: [(GENERIC): bidAdjustmentFactor]) + } + } + + and: "Bid response with bidder code" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest, AMX).tap { + it.seatbid[0].bid[0].ext = new BidExt(bidderCode: GENERIC) + } + bidder.setResponse(bidRequest.id, bidResponse) + + when: "PBS processes auction request" + def response = pbsService.sendAuctionRequest(bidRequest) + + then: "Final bid price should be adjusted" + assert response?.seatbid?.first?.bid?.first?.price == bidResponse.seatbid.first.bid.first.price * + bidAdjustmentFactor + + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(GENERIC.value) + + where: + bidAdjustmentFactor << [0.9, 1.1] + } + + def "PBS should prefer bid price adjustment based on media type and alternate bidder code when request has per-media-type bid adjustment factors"() { + given: "Default bid request with bid adjustment" + def bidRequest = BidRequest.getDefaultBidRequest(SITE).tap { + imp[0].ext.prebid.bidder.generic = null + imp[0].ext.prebid.bidder.amx = new Amx() + ext.prebid.tap { + bidAdjustmentFactors = new BidAdjustmentFactors().tap { + adjustments = [(GENERIC): randomDecimal] + mediaTypes = [(BANNER): [(GENERIC): bidAdjustmentFactor]] + } + alternateBidderCodes = new AlternateBidderCodes().tap { + enabled = true + bidders = [(AMX): new BidderConfig(enabled: true, allowedBidderCodes: [GENERIC])] + } + } + } + + and: "Bid response with bidder code" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest, AMX).tap { + it.seatbid[0].bid[0].ext = new BidExt(bidderCode: GENERIC) + } + bidder.setResponse(bidRequest.id, bidResponse) + + when: "PBS processes auction request" + def response = pbsService.sendAuctionRequest(bidRequest) + + then: "Final bid price should be adjusted" + assert response?.seatbid?.first?.bid?.first?.price == bidResponse.seatbid.first.bid.first.price * + bidAdjustmentFactor + + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(GENERIC.value) + + where: + bidAdjustmentFactor << [0.9, 1.1] + } + + def "PBS should prefer bid price adjustment based on media type and alternate bidder code when request has per-media-type bid adjustment factors with soft alias"() { + given: "Default bid request with bid adjustment" + def bidRequest = BidRequest.getDefaultBidRequest(SITE).tap { + ext.prebid.aliases = [(ALIAS.value): AMX] + imp[0].ext.prebid.bidder.generic = null + imp[0].ext.prebid.bidder.amx = null + imp[0].ext.prebid.bidder.alias = new Generic() + ext.prebid.tap { + bidAdjustmentFactors = new BidAdjustmentFactors().tap { + adjustments = [(GENERIC): randomDecimal] + mediaTypes = [(BANNER): [(GENERIC): bidAdjustmentFactor]] + } + alternateBidderCodes = new AlternateBidderCodes().tap { + enabled = true + bidders = [(AMX): new BidderConfig(enabled: true, allowedBidderCodes: [GENERIC])] + } + } + } + + and: "Bid response with bidder code" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest, AMX).tap { + it.seatbid[0].bid[0].ext = new BidExt(bidderCode: GENERIC) + } + bidder.setResponse(bidRequest.id, bidResponse) + + when: "PBS processes auction request" + def response = pbsService.sendAuctionRequest(bidRequest) + + then: "Final bid price should be adjusted" + assert response?.seatbid?.first?.bid?.first?.price == bidResponse.seatbid.first.bid.first.price * + bidAdjustmentFactor + + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(GENERIC.value) + + where: + bidAdjustmentFactor << [0.9, 1.1] + } + private static Map getExternalCurrencyConverterConfig() { ["auction.ad-server-currency" : DEFAULT_CURRENCY as String, "currency-converter.external-rates.enabled" : "true", diff --git a/src/test/groovy/org/prebid/server/functional/tests/BidderParamsSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/BidderParamsSpec.groovy index e8151762026..d92a6f17ee9 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/BidderParamsSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/BidderParamsSpec.groovy @@ -7,6 +7,7 @@ import org.prebid.server.functional.model.db.StoredImp import org.prebid.server.functional.model.db.StoredRequest import org.prebid.server.functional.model.request.amp.AmpRequest import org.prebid.server.functional.model.request.auction.Adrino +import org.prebid.server.functional.model.request.auction.Amx import org.prebid.server.functional.model.request.auction.AuctionEnvironment import org.prebid.server.functional.model.request.auction.Banner import org.prebid.server.functional.model.request.auction.BidRequest @@ -22,10 +23,12 @@ import org.prebid.server.functional.model.request.auction.Native import org.prebid.server.functional.model.request.auction.PrebidOptions import org.prebid.server.functional.model.request.auction.PrebidStoredRequest import org.prebid.server.functional.model.request.auction.Site +import org.prebid.server.functional.model.request.auction.Targeting import org.prebid.server.functional.model.request.vtrack.VtrackRequest import org.prebid.server.functional.model.request.vtrack.xml.Vast import org.prebid.server.functional.model.response.auction.Adm import org.prebid.server.functional.model.response.auction.Bid +import org.prebid.server.functional.model.response.auction.BidExt import org.prebid.server.functional.model.response.auction.BidResponse import org.prebid.server.functional.util.PBSUtils import org.prebid.server.functional.util.privacy.CcpaConsent @@ -34,7 +37,12 @@ import static org.prebid.server.functional.model.Currency.CHF import static org.prebid.server.functional.model.Currency.EUR import static org.prebid.server.functional.model.Currency.JPY import static org.prebid.server.functional.model.Currency.USD +import static org.prebid.server.functional.model.bidder.BidderName.ALIAS +import static org.prebid.server.functional.model.bidder.BidderName.ALIAS_UPPER_CASE +import static org.prebid.server.functional.model.bidder.BidderName.AMX import static org.prebid.server.functional.model.bidder.BidderName.APPNEXUS +import static org.prebid.server.functional.model.bidder.BidderName.GENERIC_CAMEL_CASE +import static org.prebid.server.functional.model.bidder.BidderName.OPENX import static org.prebid.server.functional.model.bidder.CompressionType.GZIP import static org.prebid.server.functional.model.bidder.CompressionType.NONE import static org.prebid.server.functional.model.request.auction.Asset.titleAsset @@ -1026,9 +1034,10 @@ 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(), - "adapters.generic.aliases.alias.meta-info.currency-accepted": ""] + 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) and: "Default bid request with alias bidder" @@ -1145,9 +1154,10 @@ 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(), - "adapters.generic.aliases.alias.meta-info.currency-accepted": "${USD},${EUR}".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) and: "Default basic BidRequest with alias bidder" @@ -1189,9 +1199,10 @@ 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(), - "adapters.generic.aliases.alias.meta-info.currency-accepted": "${JPY},${CHF}".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) and: "Default basic BidRequest with alias bidder" @@ -1361,4 +1372,372 @@ class BidderParamsSpec extends BaseSpec { and: "targeting should be empty" assert response.seatbid.isEmpty() } + + def "PBS should send bidder code from imp[].ext.prebid.bidder to seatbid.bid.ext.prebid.meta.adapterCode"() { + given: "Default basic bid request" + def bidRequest = BidRequest.defaultBidRequest + + and: "Default bid response" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest).tap { + seatbid[0].seat = OPENX + } + bidder.setResponse(bidRequest.id, bidResponse) + + when: "PBS processes auction request" + def response = defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Response should contain adapter code" + assert response.seatbid.bid.ext.prebid.meta.adapterCode.flatten() == [BidderName.GENERIC] + + and: "Bidder request should be valid" + assert bidder.getBidderRequest(bidRequest.id) + } + + def "PBS should send bidder code from imp[].ext.prebid.bidder to seatbid.bid.ext.prebid.meta.adapterCode when requested soft alias"() { + given: "Default bid request with alias" + def bidRequest = BidRequest.defaultBidRequest.tap { + imp[0].ext.prebid.bidder.tap { + generic = null + alias = new Generic() + } + ext.prebid.aliases = [(ALIAS.value): BidderName.GENERIC] + ext.prebid.targeting = new Targeting() + } + + when: "PBS processes auction request" + def response = defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Response should contain adapter code" + assert response.seatbid.bid.ext.prebid.meta.adapterCode.flatten() == [BidderName.GENERIC] + + and: "Response should contain seat bid" + assert response.seatbid.seat == [BidderName.ALIAS] + + and: "Response should contain bidder targeting" + def targeting = response.seatbid[0].bid[0].ext.prebid.targeting + assert targeting["hb_pb_${BidderName.ALIAS}"] + assert targeting["hb_size_${BidderName.ALIAS}"] + assert targeting["hb_bidder"] == BidderName.ALIAS.value + assert targeting["hb_bidder_${BidderName.ALIAS}"] == BidderName.ALIAS.value + + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(ALIAS.value) + + and: "Bidder request should be valid" + assert bidder.getBidderRequests(bidRequest.id) + } + + def "PBS should populate same code for adapter code when make call for generic hard code alias"() { + given: "PBS config with bidder" + def pbsConfig = ["adapters.generic.aliases.alias.enabled" : "true", + "adapters.generic.aliases.alias.endpoint": "$networkServiceContainer.rootUri/auction".toString()] + def defaultPbsService = pbsServiceFactory.getService(pbsConfig) + + and: "Default bid request with alias" + def bidRequest = BidRequest.defaultBidRequest.tap { + imp[0].ext.prebid.bidder.tap { + generic = null + alias = new Generic() + } + ext.prebid.targeting = new Targeting() + } + + when: "PBS processes auction request" + def response = defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Response should contain adapter code" + assert response.seatbid.bid.ext.prebid.meta.adapterCode.flatten() == [BidderName.ALIAS] + + and: "Response should contain seat bid" + assert response.seatbid.seat == [BidderName.ALIAS] + + and: "Response should contain bidder targeting" + def targeting = response.seatbid[0].bid[0].ext.prebid.targeting + assert targeting["hb_pb_${BidderName.ALIAS}"] + assert targeting["hb_size_${BidderName.ALIAS}"] + assert targeting["hb_bidder"] == BidderName.ALIAS.value + assert targeting["hb_bidder_${BidderName.ALIAS}"] == BidderName.ALIAS.value + + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(ALIAS.value) + + and: "Bidder request should be valid" + assert bidder.getBidderRequests(bidRequest.id) + + cleanup: "Stop and remove pbs container" + pbsServiceFactory.removeContainer(pbsConfig) + } + + def "PBS should make call for alias when hard alias and demandSource specified"() { + given: "PBS config with bidder" + def pbsConfig = ["adapters.amx.enabled" : "true", + "adapters.amx.endpoint" : "$networkServiceContainer.rootUri/auction".toString(), + "adapters.amx.aliases.alias.enabled" : "true", + "adapters.amx.aliases.alias.endpoint": "$networkServiceContainer.rootUri/auction".toString()] + def defaultPbsService = pbsServiceFactory.getService(pbsConfig) + + and: "Default bid Request with generic and openx bidder within separate imps" + def bidRequest = BidRequest.defaultBidRequest.tap { + imp[0].ext.prebid.bidder.tap { + generic = null + alias = new Generic() + } + ext.prebid.targeting = new Targeting() + } + + and: "Bid response with bidder code" + def demandSource = PBSUtils.randomString + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest, BidderName.ALIAS).tap { + it.seatbid[0].bid[0].ext = new BidExt(demandSource: demandSource) + } + bidder.setResponse(bidRequest.id, bidResponse) + + when: "PBS processes auction request" + def response = defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Response should contain demand source" + assert response.seatbid.bid.ext.prebid.meta.demandSource.flatten() == [demandSource] + + and: "Response should contain adapter code" + assert response.seatbid.bid.ext.prebid.meta.adapterCode.flatten() == [BidderName.ALIAS] + + and: "Response should contain seat bid" + assert response.seatbid.seat == [BidderName.ALIAS] + + and: "Response should contain bidder targeting" + def targeting = response.seatbid[0].bid[0].ext.prebid.targeting + assert targeting["hb_pb_${BidderName.ALIAS}"] + assert targeting["hb_size_${BidderName.ALIAS}"] + assert targeting["hb_bidder"] == BidderName.ALIAS.value + assert targeting["hb_bidder_${BidderName.ALIAS}"] == BidderName.ALIAS.value + + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(ALIAS.value) + + and: "Bidder request should be valid" + assert bidder.getBidderRequests(bidRequest.id) + + cleanup: "Stop and remove pbs container" + pbsServiceFactory.removeContainer(pbsConfig) + } + + def "PBS should send bidder code from imp[].ext.prebid.bidder to seatbid.bid.ext.prebid.meta.adapterCode when requested soft alias with upper case"() { + given: "Default bid request with alias" + def bidRequest = BidRequest.defaultBidRequest.tap { + ext.prebid.aliases = [(ALIAS.value): BidderName.GENERIC] + ext.prebid.targeting = new Targeting() + imp[0].ext.prebid.bidder.tap { + generic = null + aliasUpperCase = new Generic() + } + } + + when: "PBS processes auction request" + def response = defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Response should contain adapter code" + assert response.seatbid.bid.ext.prebid.meta.adapterCode.flatten() == [BidderName.GENERIC] + + and: "Response should contain seat bid" + assert response.seatbid.seat == [ALIAS_UPPER_CASE] + + and: "Response should contain bidder targeting" + def targeting = response.seatbid[0].bid[0].ext.prebid.targeting + assert targeting["hb_pb_${ALIAS_UPPER_CASE}"] + assert targeting["hb_size_${ALIAS_UPPER_CASE}"] + assert targeting["hb_bidder"] == ALIAS_UPPER_CASE.value + assert targeting["hb_bidder_${ALIAS_UPPER_CASE}"] == ALIAS_UPPER_CASE.value + + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(ALIAS_UPPER_CASE.value) + + and: "Bidder request should be valid" + assert bidder.getBidderRequests(bidRequest.id) + } + + def "PBS should populate targeting with bidder in camel case when bidder with camel case was requested"() { + given: "Default bid request" + def bidRequest = BidRequest.defaultBidRequest.tap { + imp[0].ext.prebid.bidder.generic = null + imp[0].ext.prebid.bidder.genericCamelCase = new Generic() + it.ext.prebid.targeting = new Targeting() + } + + when: "PBS processes auction request" + def response = defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Response should contain bidder targeting" + def targeting = response.seatbid[0].bid[0].ext.prebid.targeting + assert targeting["hb_pb_${GENERIC_CAMEL_CASE}"] + assert targeting["hb_size_${GENERIC_CAMEL_CASE}"] + assert targeting["hb_bidder"] == GENERIC_CAMEL_CASE.value + assert targeting["hb_bidder_${GENERIC_CAMEL_CASE}"] == GENERIC_CAMEL_CASE.value + + and: "Bid response should contain seat" + assert response.seatbid.seat == [GENERIC_CAMEL_CASE] + + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(GENERIC_CAMEL_CASE.value) + + and: "Response should contain adapter code" + assert response.seatbid.bid.ext.prebid.meta.adapterCode.flatten() == [BidderName.GENERIC] + } + + def "PBS should make call for alias in upper case when soft alias specified with same name in upper case strategy"() { + given: "Default bid request with soft alias and targeting" + def bidRequest = BidRequest.defaultBidRequest.tap { + ext.prebid.aliases = [(ALIAS.value): BidderName.GENERIC] + imp[0].ext.prebid.bidder.aliasUpperCase = new Generic() + imp[0].ext.prebid.bidder.generic = null + it.ext.prebid.targeting = new Targeting() + } + + when: "PBS processes auction request" + def response = defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Response should contain adapter code" + assert response.seatbid.bid.ext.prebid.meta.adapterCode.flatten() == [BidderName.GENERIC] + + and: "Response should contain seat bid" + assert response.seatbid.seat == [ALIAS_UPPER_CASE] + + and: "Response should contain bidder targeting" + def targeting = response.seatbid[0].bid[0].ext.prebid.targeting + assert targeting["hb_pb_${ALIAS_UPPER_CASE}"] + assert targeting["hb_size_${ALIAS_UPPER_CASE}"] + assert targeting["hb_bidder"] == ALIAS_UPPER_CASE.value + assert targeting["hb_bidder_${ALIAS_UPPER_CASE}"] == ALIAS_UPPER_CASE.value + + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(ALIAS_UPPER_CASE.value) + + and: "Bidder request should be valid" + assert bidder.getBidderRequests(bidRequest.id) + } + + def "PBS should populate adapter code with requested bidder when conflict with soft and hard alias"() { + given: "PBS config with bidder" + def pbsConfig = ["adapters.amx.enabled" : "true", + "adapters.amx.endpoint" : "$networkServiceContainer.rootUri/auction".toString(), + "adapters.amx.aliases.alias.enabled" : "true", + "adapters.amx.aliases.alias.endpoint": "$networkServiceContainer.rootUri/auction".toString()] + def defaultPbsService = pbsServiceFactory.getService(pbsConfig) + + and: "Bid request with amx bidder and targeting" + def bidRequest = BidRequest.getDefaultBidRequest().tap { + imp[0].ext.prebid.bidder.alias = new Generic() + imp[0].ext.prebid.bidder.amx = null + imp[0].ext.prebid.bidder.generic = null + it.ext.prebid.aliases = [(ALIAS.value): BidderName.GENERIC] + it.ext.prebid.targeting = new Targeting() + } + + when: "PBS processes auction request" + def response = defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Response should contain adapter code" + assert response.seatbid.bid.ext.prebid.meta.adapterCode.flatten() == [BidderName.ALIAS] + + and: "Response should contain seat bid" + assert response.seatbid.seat == [BidderName.ALIAS] + + and: "Response should contain bidder targeting" + def targeting = response.seatbid[0].bid[0].ext.prebid.targeting + assert targeting["hb_pb_${BidderName.ALIAS}"] + assert targeting["hb_size_${BidderName.ALIAS}"] + assert targeting["hb_bidder"] == BidderName.ALIAS.value + assert targeting["hb_bidder_${BidderName.ALIAS}"] == BidderName.ALIAS.value + + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(ALIAS.value) + + and: "Bidder request should be valid" + assert bidder.getBidderRequests(bidRequest.id) + + cleanup: "Stop and remove pbs container" + pbsServiceFactory.removeContainer(pbsConfig) + } + + def "PBS should populate adapter code with requested bidder when conflict with soft and generic hard alias"() { + given: "PBS config with bidders" + def pbsConfig = ["adapters.amx.enabled" : "true", + "adapters.amx.endpoint" : "$networkServiceContainer.rootUri/auction".toString(), + "adapters.generic.aliases.alias.enabled" : "true", + "adapters.generic.aliases.alias.endpoint": "$networkServiceContainer.rootUri/auction".toString()] + def defaultPbsService = pbsServiceFactory.getService(pbsConfig) + + and: "Bid request with amx bidder and targeting" + def bidRequest = BidRequest.getDefaultBidRequest().tap { + imp[0].ext.prebid.bidder.alias = new Generic() + imp[0].ext.prebid.bidder.amx = null + imp[0].ext.prebid.bidder.generic = null + it.ext.prebid.aliases = [(ALIAS.value): AMX] + it.ext.prebid.targeting = new Targeting() + } + + when: "PBS processes auction request" + def response = defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Response should contain adapter code" + assert response.seatbid.bid.ext.prebid.meta.adapterCode.flatten() == [BidderName.ALIAS] + + and: "Response should contain seat bid" + assert response.seatbid.seat == [BidderName.ALIAS] + + and: "Response should contain bidder targeting" + def targeting = response.seatbid[0].bid[0].ext.prebid.targeting + assert targeting["hb_pb_${BidderName.ALIAS}"] + assert targeting["hb_size_${BidderName.ALIAS}"] + assert targeting["hb_bidder"] == BidderName.ALIAS.value + assert targeting["hb_bidder_${BidderName.ALIAS}"] == BidderName.ALIAS.value + + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(ALIAS.value) + + and: "Bidder request should be valid" + assert bidder.getBidderRequests(bidRequest.id) + + cleanup: "Stop and remove pbs container" + pbsServiceFactory.removeContainer(pbsConfig) + } + + def "PBS should properly populate bidder code when soft alias ignore standalone adapter"() { + given: "PBS config with amx bidder" + def pbsConfig = ["adapters.amx.enabled" : "true", + "adapters.amx.endpoint": "$networkServiceContainer.rootUri/auction".toString()] + def defaultPbsService = pbsServiceFactory.getService(pbsConfig) + + and: "Default bid request with soft alias and targeting" + def bidRequest = BidRequest.defaultBidRequest.tap { + imp[0].ext.prebid.bidder.amx = new Amx() + imp[0].ext.prebid.bidder.generic = null + ext.prebid.targeting = new Targeting() + ext.prebid.aliases = [(AMX.value): BidderName.GENERIC] + } + + when: "PBS processes auction request" + def response = defaultPbsService.sendAuctionRequest(bidRequest) + + then: "Response should contain adapter code" + assert response.seatbid.bid.ext.prebid.meta.adapterCode.flatten() == [AMX] + + and: "Response should contain seat" + assert response.seatbid.seat == [AMX] + + and: "Response should contain bidder targeting" + def targeting = response.seatbid[0].bid[0].ext.prebid.targeting + assert targeting["hb_pb_${AMX}"] + assert targeting["hb_size_${AMX}"] + assert targeting["hb_bidder"] == AMX.value + assert targeting["hb_bidder_${AMX}"] == AMX.value + + and: "Response should contain repose millis with corresponding bidder" + assert response.ext.responsetimemillis.containsKey(AMX.value) + + and: "Bidder request should be valid" + assert bidder.getBidderRequests(bidRequest.id) + + cleanup: "Stop and remove pbs container" + pbsServiceFactory.removeContainer(pbsConfig) + } } diff --git a/src/test/groovy/org/prebid/server/functional/tests/bidder/openx/OpenxSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/bidder/openx/OpenxSpec.groovy index 20be3434042..8e6d7f1a57d 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/bidder/openx/OpenxSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/bidder/openx/OpenxSpec.groovy @@ -26,9 +26,10 @@ 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.AuctionEnvironment.SERVER_ORCHESTRATED +import static org.prebid.server.functional.model.request.auction.AuctionEnvironment.UNKNOWN import static org.prebid.server.functional.model.request.auction.PaaFormat.IAB import static org.prebid.server.functional.model.request.auction.PaaFormat.ORIGINAL import static org.prebid.server.functional.model.response.auction.ErrorType.PREBID @@ -199,7 +200,7 @@ class OpenxSpec extends BaseSpec { assert interestGroupAuctionSeller.impId == impId assert interestGroupAuctionSeller.config assert interestGroupAuctionSeller.ext.bidder == bidResponse.seatbid[0].seat.value - assert interestGroupAuctionSeller.ext.adapter == OPENX.value + assert interestGroupAuctionSeller.ext.adapter == bidResponse.seatbid[0].seat.value } def "PBS shouldn't populate fledge config when bid response didn't return fledge config"() { @@ -307,7 +308,7 @@ class OpenxSpec extends BaseSpec { assert auctionConfigs?.size() == 1 assert auctionConfigs[0].impId == impId assert auctionConfigs[0].bidder == OPENX_ALIAS.value - assert auctionConfigs[0].adapter == OPENX.value + assert auctionConfigs[0].adapter == OPENX_ALIAS.value assert auctionConfigs[0].config == fledgeConfig and: "PBS response shouldn't contain igi config" @@ -350,7 +351,13 @@ class OpenxSpec extends BaseSpec { assert interestGroupAuctionSeller.impId == impId assert interestGroupAuctionSeller.config == fledgeConfig assert interestGroupAuctionSeller.ext.bidder == OPENX_ALIAS.value - assert interestGroupAuctionSeller.ext.adapter == OPENX.value + assert interestGroupAuctionSeller.ext.adapter == OPENX_ALIAS.value + + and: "Response should contain seat" + assert response.seatbid[0].seat == OPENX_ALIAS + + and: "Response should contain seat" + assert response.seatbid[0].bid[0].ext.prebid.meta.adapterCode == OPENX_ALIAS and: "PBS response shouldn't contain igi config" assert !response.ext?.interestGroupAuctionIntent?[0].interestGroupAuctionBuyer diff --git a/src/test/groovy/org/prebid/server/functional/tests/module/responsecorrenction/ResponseCorrectionSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/module/responsecorrenction/ResponseCorrectionSpec.groovy index 1694a17dbaf..b4cbdd3fb88 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/module/responsecorrenction/ResponseCorrectionSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/module/responsecorrenction/ResponseCorrectionSpec.groovy @@ -233,7 +233,7 @@ class ResponseCorrectionSpec extends ModuleBaseSpec { assert response.seatbid.bid.ext.prebid.type.flatten() == [mediaType] and: "Response shouldn't contain media type for prebid meta" - assert !response?.seatbid?.bid?.ext?.prebid?.meta?.mediaType?.flatten()?.size() + assert !response?.seatbid?.first?.bid?.first?.ext?.prebid?.meta?.mediaType and: "Response shouldn't contain errors" assert !response.ext.errors @@ -516,7 +516,7 @@ class ResponseCorrectionSpec extends ModuleBaseSpec { assert response.seatbid.bid.ext.prebid.type.flatten() == [VIDEO] and: "Response shouldn't contain media type for prebid meta" - assert !response?.seatbid?.bid?.ext?.prebid?.meta?.mediaType?.flatten()?.size() + assert !response?.seatbid?.first?.bid?.first?.ext?.prebid?.meta?.mediaType and: "Response shouldn't contain errors" assert !response.ext.errors diff --git a/src/test/groovy/org/prebid/server/functional/tests/pricefloors/PriceFloorsRulesSpec.groovy b/src/test/groovy/org/prebid/server/functional/tests/pricefloors/PriceFloorsRulesSpec.groovy index e493bbb7df9..ee861a24587 100644 --- a/src/test/groovy/org/prebid/server/functional/tests/pricefloors/PriceFloorsRulesSpec.groovy +++ b/src/test/groovy/org/prebid/server/functional/tests/pricefloors/PriceFloorsRulesSpec.groovy @@ -4,6 +4,8 @@ import org.prebid.server.functional.model.ChannelType import org.prebid.server.functional.model.bidder.Generic import org.prebid.server.functional.model.bidder.Openx import org.prebid.server.functional.model.bidderspecific.BidderRequest +import org.prebid.server.functional.model.config.AlternateBidderCodes +import org.prebid.server.functional.model.config.BidderConfig import org.prebid.server.functional.model.db.StoredImp import org.prebid.server.functional.model.pricefloors.Country import org.prebid.server.functional.model.pricefloors.MediaType @@ -11,6 +13,7 @@ import org.prebid.server.functional.model.pricefloors.ModelGroup import org.prebid.server.functional.model.pricefloors.PriceFloorData import org.prebid.server.functional.model.pricefloors.PriceFloorSchema import org.prebid.server.functional.model.pricefloors.Rule +import org.prebid.server.functional.model.request.auction.Amx import org.prebid.server.functional.model.request.auction.Banner import org.prebid.server.functional.model.request.auction.BidRequest import org.prebid.server.functional.model.request.auction.Device @@ -22,11 +25,13 @@ import org.prebid.server.functional.model.request.auction.Imp import org.prebid.server.functional.model.request.auction.ImpExtContextData import org.prebid.server.functional.model.request.auction.ImpExtContextDataAdServer import org.prebid.server.functional.model.request.auction.PrebidStoredRequest +import org.prebid.server.functional.model.response.auction.BidExt import org.prebid.server.functional.model.response.auction.BidResponse import org.prebid.server.functional.util.PBSUtils import static org.prebid.server.functional.model.ChannelType.WEB import static org.prebid.server.functional.model.bidder.BidderName.ALIAS +import static org.prebid.server.functional.model.bidder.BidderName.AMX import static org.prebid.server.functional.model.bidder.BidderName.GENERIC import static org.prebid.server.functional.model.bidder.BidderName.OPENX import static org.prebid.server.functional.model.pricefloors.Country.USA @@ -1042,7 +1047,7 @@ class PriceFloorsRulesSpec extends PriceFloorsBaseSpec { and: "Bidder request should contain proper bid floor value" def bidderRequests = bidder.getBidderRequests(bidRequest.id) - def impIdToBidderCallImp = impIdToBidderCallImp(bidderRequests) + def impIdToBidderCallImp = impIdToBidderCallImp(bidderRequests) assert impIdToBidderCallImp[bidRequest.imp[0].id].bidFloor == genericBidFloorRuleValue assert impIdToBidderCallImp[bidRequest.imp[1].id].bidFloor == openxBidFloorRuleValue @@ -1145,6 +1150,65 @@ class PriceFloorsRulesSpec extends PriceFloorsBaseSpec { PBSUtils.randomFloorValue | PBSUtils.randomFloorValue } + def "PBS should populate seatNonBid when bid rejected due to floor and alternate bidder code specified"() { + given: "PBS config with floors config" + def config = FLOORS_CONFIG + + ["adapters.amx.enabled" : "true", + "adapters.amx.endpoint": "$networkServiceContainer.rootUri/auction".toString()] + def pbsService = pbsServiceFactory.getService(config) + + and: "Default bid request" + def bidRequest = BidRequest.defaultBidRequest.tap { + imp[0].ext.prebid.bidder.tap { + generic = null + amx = new Amx() + } + ext.prebid.tap { + floors = new ExtPrebidFloors(enforcement: new ExtPrebidPriceFloorEnforcement(enforcePbs: true)) + returnAllBidStatus = true + alternateBidderCodes = new AlternateBidderCodes( + enabled: true, + bidders: [(AMX): new BidderConfig(enabled: true, allowedBidderCodes: [GENERIC])]) + } + } + + and: "Account with enabled fetch, fetch.url in the DB" + def account = getAccountWithEnabledFetch(bidRequest.site.publisher.id) + accountDao.save(account) + + and: "Set Floors Provider response" + def floorValue = PBSUtils.randomFloorValue + def floorsResponse = PriceFloorData.priceFloorData.tap { + modelGroups[0].values = [(rule): floorValue] + } + floorsProvider.setResponse(bidRequest.site.publisher.id, floorsResponse) + + and: "PBS cache rules" + cacheFloorsProviderRules(bidRequest, floorValue, pbsService, AMX) + + and: "Set bidder response" + def bidResponse = BidResponse.getDefaultBidResponse(bidRequest).tap { + seatbid.first().bid.first().tap { + price = floorValue - 0.1 + ext = new BidExt(bidderCode: GENERIC) + } + } + bidder.setResponse(bidRequest.id, bidResponse) + + when: "PBS processes auction request" + def response = pbsService.sendAuctionRequest(bidRequest) + + then: "PBS response should contain seatNonBid" + def seatNonBids = response.ext.seatnonbid + assert seatNonBids.size() == 1 + + def seatNonBid = seatNonBids[0] + assert seatNonBid.seat == GENERIC.value + assert seatNonBid.nonBid[0].impId == bidRequest.imp[0].id + assert seatNonBid.nonBid[0].statusCode == RESPONSE_REJECTED_DUE_TO_PRICE_FLOOR + assert seatNonBid.nonBid.size() == bidResponse.seatbid[0].bid.size() + } + private static Map impIdToBidderCallImp(List bidderRequests) { bidderRequests.imp.flatten().collectEntries { [it.id, it] } as Map } diff --git a/src/test/java/org/prebid/server/auction/BidResponseCreatorTest.java b/src/test/java/org/prebid/server/auction/BidResponseCreatorTest.java index 21e20ccbcf1..01bbac7c4c7 100644 --- a/src/test/java/org/prebid/server/auction/BidResponseCreatorTest.java +++ b/src/test/java/org/prebid/server/auction/BidResponseCreatorTest.java @@ -21,6 +21,7 @@ import com.iab.openrtb.response.SeatBid; import io.vertx.core.Future; import org.apache.commons.collections4.MapUtils; +import org.apache.commons.lang3.tuple.Pair; import org.assertj.core.api.InstanceOfAssertFactories; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -91,6 +92,7 @@ import org.prebid.server.proto.openrtb.ext.response.CacheAsset; import org.prebid.server.proto.openrtb.ext.response.Events; import org.prebid.server.proto.openrtb.ext.response.ExtBidPrebid; +import org.prebid.server.proto.openrtb.ext.response.ExtBidPrebidMeta; import org.prebid.server.proto.openrtb.ext.response.ExtBidPrebidVideo; import org.prebid.server.proto.openrtb.ext.response.ExtBidResponse; import org.prebid.server.proto.openrtb.ext.response.ExtBidResponseFledge; @@ -203,8 +205,6 @@ public class BidResponseCreatorTest extends VertxTest { @Mock(strictness = LENIENT) private CacheDefaultTtlProperties cacheDefaultProperties; @Mock(strictness = LENIENT) - private BidderAliases aliases; - @Mock(strictness = LENIENT) private Metrics metrics; @Spy private WinningBidComparatorFactory winningBidComparatorFactory; @@ -229,8 +229,6 @@ public void setUp() { given(cacheDefaultProperties.getAudioTtl()).willReturn(null); given(cacheDefaultProperties.getNativeTtl()).willReturn(null); - given(aliases.resolveBidder(any())).willAnswer(request -> request.getArgument(0)); - given(categoryMappingService.createCategoryMapping(any(), any(), any())) .willAnswer(invocationOnMock -> Future.succeededFuture( CategoryMappingResult.of(emptyMap(), emptyMap(), invocationOnMock.getArgument(0), null))); @@ -283,7 +281,7 @@ public void shouldPassBidWithGeneratedIdAndPreserveExtFieldsWhenIdGeneratorTypeU .build(); final String bidder = "bidder1"; final List bidderResponses = singletonList( - BidderResponse.of(bidder, givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + BidderResponse.of(bidder, givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( givenBidRequest(imp), @@ -294,7 +292,7 @@ public void shouldPassBidWithGeneratedIdAndPreserveExtFieldsWhenIdGeneratorTypeU givenCacheServiceResult(singletonList(CacheInfo.empty())); // when - target.create(auctionContext, cacheInfo, aliases, MULTI_BIDS); + target.create(auctionContext, cacheInfo, MULTI_BIDS); // then final ExtBidPrebid extBidPrebid = ExtBidPrebid.builder() @@ -306,7 +304,7 @@ public void shouldPassBidWithGeneratedIdAndPreserveExtFieldsWhenIdGeneratorTypeU .put("origbidcur", "test") .set("prebid", mapper.valueToTree(extBidPrebid))) .build(); - final BidInfo bidInfo = toBidInfo(expectedBid, imp, bidder, banner, true); + final BidInfo bidInfo = toBidInfo(expectedBid, imp, bidder, "seat", banner, true); verify(coreCacheService).cacheBidsOpenrtb(eq(singletonList(bidInfo)), any(), any(), any()); } @@ -322,14 +320,14 @@ public void shouldSkipBidderWhenRejectedByProcessedBidderResponseHooks() { .price(BigDecimal.valueOf(5.67)) .build(); final List bidderResponses = singletonList( - BidderResponse.of("bidder1", givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + BidderResponse.of("bidder1", givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( givenBidRequest(givenImp()), contextBuilder -> contextBuilder.auctionParticipations(toAuctionParticipant(bidderResponses))); // when - final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then assertThat(bidResponse.getSeatbid()) @@ -348,6 +346,7 @@ public void shouldPassRequestModifiedByBidderRequestHooks() { .price(BigDecimal.valueOf(1.23)) .build(), video, + "seat", "EUR")))))) .when(hookStageExecutor).executeProcessedBidderResponseStage(any(), any()); @@ -357,14 +356,14 @@ public void shouldPassRequestModifiedByBidderRequestHooks() { .price(BigDecimal.valueOf(5.67)) .build(); final List bidderResponses = singletonList( - BidderResponse.of("bidder1", givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + BidderResponse.of("bidder1", givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( givenBidRequest(givenImp()), contextBuilder -> contextBuilder.auctionParticipations(toAuctionParticipant(bidderResponses))); // when - final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then assertThat(bidResponse.getSeatbid()) @@ -382,7 +381,7 @@ public void shouldPassOriginalTimeoutToCacheServiceIfCachingIsRequested() { .price(BigDecimal.valueOf(5.67)) .build(); final List bidderResponses = singletonList( - BidderResponse.of("bidder1", givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + BidderResponse.of("bidder1", givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( givenBidRequest(givenImp()), @@ -393,7 +392,7 @@ public void shouldPassOriginalTimeoutToCacheServiceIfCachingIsRequested() { givenCacheServiceResult(singletonList(CacheInfo.empty())); // when - target.create(auctionContext, cacheInfo, aliases, MULTI_BIDS); + target.create(auctionContext, cacheInfo, MULTI_BIDS); // then verify(coreCacheService).cacheBidsOpenrtb(anyList(), any(), any(), any()); @@ -410,13 +409,13 @@ public void shouldRequestCacheServiceWithExpectedArguments() { final List bidderResponses = asList( BidderResponse.of("bidder1", givenSeatBid( - BidderBid.of(bid1, banner, "USD"), - BidderBid.of(bid2, banner, "USD")), + BidderBid.of(bid1, banner, "seat1", "USD"), + BidderBid.of(bid2, banner, "seat1", "USD")), 100), BidderResponse.of("bidder2", givenSeatBid( - BidderBid.of(bid3, banner, "USD"), - BidderBid.of(bid4, banner, "USD")), + BidderBid.of(bid3, banner, "seat2", "USD"), + BidderBid.of(bid4, banner, "seat2", "USD")), 100)); final BidRequestCacheInfo cacheInfo = BidRequestCacheInfo.builder() @@ -446,7 +445,7 @@ public void shouldRequestCacheServiceWithExpectedArguments() { givenCacheServiceResult(singletonList(CacheInfo.empty())); // when - target.create(auctionContext, cacheInfo, aliases, MULTI_BIDS); + target.create(auctionContext, cacheInfo, MULTI_BIDS); // then final ArgumentCaptor contextArgumentCaptor = ArgumentCaptor.forClass(CacheContext.class); @@ -482,13 +481,13 @@ public void shouldRequestCacheServiceWithWinningBidsOnlyWhenWinningonlyIsTrue() final List bidderResponses = asList( BidderResponse.of("bidder1", givenSeatBid( - BidderBid.of(bid1, banner, "USD"), - BidderBid.of(bid2, banner, "USD")), + BidderBid.of(bid1, banner, "seat1", "USD"), + BidderBid.of(bid2, banner, "seat1", "USD")), 100), BidderResponse.of("bidder2", givenSeatBid( - BidderBid.of(bid3, banner, "USD"), - BidderBid.of(bid4, banner, "USD")), + BidderBid.of(bid3, banner, "seat2", "USD"), + BidderBid.of(bid4, banner, "seat2", "USD")), 100)); final BidRequestCacheInfo cacheInfo = BidRequestCacheInfo.builder() @@ -508,7 +507,7 @@ imp1, imp2, givenImp("impId3"), givenImp("impId4"))) givenCacheServiceResult(singletonList(CacheInfo.empty())); // when - target.create(auctionContext, cacheInfo, aliases, MULTI_BIDS); + target.create(auctionContext, cacheInfo, MULTI_BIDS); // then final ArgumentCaptor> bidsArgumentCaptor = ArgumentCaptor.forClass(List.class); @@ -550,8 +549,8 @@ public void shouldRequestCacheServiceWithVideoBidsToModify() { final String bidder1 = "bidder1"; final List bidderResponses = asList( - BidderResponse.of(bidder1, givenSeatBid(BidderBid.of(bid1, video, "USD")), 100), - BidderResponse.of("bidder2", givenSeatBid(BidderBid.of(bid2, banner, "USD")), 100)); + BidderResponse.of(bidder1, givenSeatBid(BidderBid.of(bid1, video, "seat1", "USD")), 100), + BidderResponse.of("bidder2", givenSeatBid(BidderBid.of(bid2, banner, "seat2", "USD")), 100)); final BidRequestCacheInfo cacheInfo = BidRequestCacheInfo.builder() .doCaching(true) @@ -574,7 +573,7 @@ public void shouldRequestCacheServiceWithVideoBidsToModify() { givenCacheServiceResult(singletonList(CacheInfo.empty())); // when - target.create(auctionContext, cacheInfo, aliases, MULTI_BIDS); + target.create(auctionContext, cacheInfo, MULTI_BIDS); // then final EventsContext expectedEventContext = EventsContext.builder() @@ -620,7 +619,7 @@ public void shouldModifyBidAdmWhenBidVideoAndVastModifierReturnValue() { final String bidder = "bidder1"; final List bidderResponses = singletonList( - BidderResponse.of(bidder, givenSeatBid(BidderBid.of(bid, video, "USD")), 100)); + BidderResponse.of(bidder, givenSeatBid(BidderBid.of(bid, video, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( givenBidRequest( @@ -635,7 +634,7 @@ public void shouldModifyBidAdmWhenBidVideoAndVastModifierReturnValue() { .willReturn(modifiedVast); // when - final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then assertThat(bidResponse.getSeatbid()) @@ -653,7 +652,7 @@ public void shouldCallCacheServiceEvenRoundedCpmIsZero() { // given final Bid bid1 = Bid.builder().id("bidId1").impid(IMP_ID).price(BigDecimal.valueOf(0.05)).build(); final List bidderResponses = singletonList( - BidderResponse.of("bidder1", givenSeatBid(BidderBid.of(bid1, banner, "USD")), 100)); + BidderResponse.of("bidder1", givenSeatBid(BidderBid.of(bid1, banner, "seat1", "USD")), 100)); final BidRequestCacheInfo cacheInfo = BidRequestCacheInfo.builder().doCaching(true).build(); final AuctionContext auctionContext = givenAuctionContext(givenBidRequest(givenImp())) @@ -663,7 +662,7 @@ public void shouldCallCacheServiceEvenRoundedCpmIsZero() { givenCacheServiceResult(singletonList(CacheInfo.empty())); // when - target.create(auctionContext, cacheInfo, aliases, MULTI_BIDS); + target.create(auctionContext, cacheInfo, MULTI_BIDS); // then final ArgumentCaptor> bidsArgumentCaptor = ArgumentCaptor.forClass(List.class); @@ -686,7 +685,7 @@ public void shouldSetExpectedConstantResponseFields() { contextBuilder -> contextBuilder.auctionParticipations(toAuctionParticipant(bidderResponses))); // when - final BidResponse bidResponse = target.create(auctionContext, null, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, null, MULTI_BIDS).result(); // then final BidResponse responseWithExpectedFields = BidResponse.builder() @@ -713,7 +712,7 @@ public void shouldSetNbrValueTwoAndEmptySeatbidWhenIncomingBidResponsesAreEmpty( final AuctionContext auctionContext = givenAuctionContext(givenBidRequest(givenImp())); // when - final BidResponse bidResponse = target.create(auctionContext, null, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, null, MULTI_BIDS).result(); // then assertThat(bidResponse).returns(0, BidResponse::getNbr); @@ -731,7 +730,7 @@ public void shouldSetNbrValueTwoAndEmptySeatbidWhenIncomingBidResponsesDoNotCont contextBuilder -> contextBuilder.auctionParticipations(toAuctionParticipant(bidderResponses))); // when - final BidResponse bidResponse = target.create(auctionContext, null, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, null, MULTI_BIDS).result(); // then assertThat(bidResponse).returns(0, BidResponse::getNbr); @@ -745,14 +744,14 @@ public void shouldSetNbrNullAndPopulateSeatbidWhenAtLeastOneBidIsPresent() { // given final Bid bid = Bid.builder().impid(IMP_ID).id("bidId").build(); final List bidderResponses = singletonList(BidderResponse.of("bidder1", - givenSeatBid(BidderBid.of(bid, banner, null)), 100)); + givenSeatBid(BidderBid.of(bid, banner, "seat", null)), 100)); final AuctionContext auctionContext = givenAuctionContext( givenBidRequest(givenImp()), contextBuilder -> contextBuilder.auctionParticipations(toAuctionParticipant(bidderResponses))); // when - final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then assertThat(bidResponse.getNbr()).isNull(); @@ -767,14 +766,14 @@ public void shouldSkipBidderResponsesWhereSeatBidContainEmptyBids() { final Bid bid = Bid.builder().impid(IMP_ID).id("bidId").build(); final List bidderResponses = asList( BidderResponse.of("bidder1", givenSeatBid(), 0), - BidderResponse.of("bidder2", givenSeatBid(BidderBid.of(bid, banner, "USD")), 0)); + BidderResponse.of("bidder2", givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 0)); final AuctionContext auctionContext = givenAuctionContext( givenBidRequest(givenImp()), contextBuilder -> contextBuilder.auctionParticipations(toAuctionParticipant(bidderResponses))); // when - final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then assertThat(bidResponse.getSeatbid()).hasSize(1); @@ -792,7 +791,7 @@ public void shouldOverrideBidIdWhenIdGeneratorIsUUID() { .set("prebid", mapper.valueToTree(ExtBidPrebid.builder().type(banner).build()))) .build(); final List bidderResponses = singletonList( - BidderResponse.of("bidder2", givenSeatBid(BidderBid.of(bid, banner, "USD")), 0)); + BidderResponse.of("bidder2", givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 0)); final AuctionContext auctionContext = givenAuctionContext( givenBidRequest(givenImp()), @@ -801,7 +800,7 @@ public void shouldOverrideBidIdWhenIdGeneratorIsUUID() { given(idGenerator.generateId()).willReturn("de7fc739-0a6e-41ad-8961-701c30c82166"); // when - final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then assertThat(bidResponse.getSeatbid()) @@ -827,7 +826,7 @@ public void shouldOverrideBidIdWhenBidIdHasLessThen17CharsAndRandomBidIdGenerati .set("prebid", mapper.valueToTree(ExtBidPrebid.builder().type(banner).build()))) .build(); final List bidderResponses = singletonList( - BidderResponse.of("bidder2", givenSeatBid(BidderBid.of(bid, banner, "USD")), 0)); + BidderResponse.of("bidder2", givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 0)); final AuctionContext auctionContext = givenAuctionContext( givenBidRequest(givenImp()), @@ -839,7 +838,7 @@ public void shouldOverrideBidIdWhenBidIdHasLessThen17CharsAndRandomBidIdGenerati target = givenBidResponseCreator(0, true); // when - final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then assertThat(bidResponse.getSeatbid()) @@ -868,7 +867,7 @@ public void shouldNotOverrideBidIdWhenBidIdHas17CharsAndRandomBidIdGenerationIsE .set("prebid", mapper.valueToTree(ExtBidPrebid.builder().type(banner).build()))) .build(); final List bidderResponses = singletonList( - BidderResponse.of("bidder2", givenSeatBid(BidderBid.of(bid, banner, "USD")), 0)); + BidderResponse.of("bidder2", givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 0)); final AuctionContext auctionContext = givenAuctionContext( givenBidRequest(givenImp()), @@ -880,7 +879,7 @@ public void shouldNotOverrideBidIdWhenBidIdHas17CharsAndRandomBidIdGenerationIsE target = givenBidResponseCreator(0, true); // when - final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then assertThat(bidResponse.getSeatbid()) @@ -926,7 +925,7 @@ public void shouldUseGeneratedBidIdForEventAndCacheWhenIdGeneratorIsUUIDAndEvent final String bidder = "bidder1"; final List bidderResponses = singletonList( - BidderResponse.of(bidder, givenSeatBid(BidderBid.of(bid, banner, "USD")), 0)); + BidderResponse.of(bidder, givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 0)); final AuctionContext auctionContext = givenAuctionContext( bidRequest, @@ -944,7 +943,7 @@ public void shouldUseGeneratedBidIdForEventAndCacheWhenIdGeneratorIsUUIDAndEvent .willReturn(events); // when - target.create(auctionContext, cacheInfo, aliases, MULTI_BIDS).result(); + target.create(auctionContext, cacheInfo, MULTI_BIDS).result(); // then final ExtBidPrebid extBidPrebid = ExtBidPrebid.builder() @@ -956,7 +955,7 @@ public void shouldUseGeneratedBidIdForEventAndCacheWhenIdGeneratorIsUUIDAndEvent .ext(mapper.createObjectNode().set("prebid", mapper.valueToTree(extBidPrebid))) .build(); - final BidInfo expectedBidInfo = toBidInfo(expectedBid, imp, bidder, banner, true); + final BidInfo expectedBidInfo = toBidInfo(expectedBid, imp, bidder, "seat", banner, true); verify(coreCacheService).cacheBidsOpenrtb(eq(singletonList(expectedBidInfo)), any(), any(), any()); verify(eventsService).createEvent(eq(generatedBidId), anyString(), anyString(), anyBoolean(), any()); @@ -969,27 +968,40 @@ public void shouldSetExpectedResponseSeatBidAndBidFields() { final ObjectNode bidExt = mapper.createObjectNode() .put("origbidcpm", BigDecimal.ONE) .put("origbidcur", "USD"); - final Bid bid = Bid.builder() - .id("bidId") + + final Bid bid1 = Bid.builder() + .id("bidId1") .price(BigDecimal.ONE) .adm(BID_ADM) - .impid(IMP_ID) + .impid("impId1") + .ext(bidExt) + .build(); + + final Bid bid2 = Bid.builder() + .id("bidId2") + .price(BigDecimal.ONE) + .adm(BID_ADM) + .impid("impId2") .ext(bidExt) .build(); final String bidder = "bidder1"; - final List bidderResponses = singletonList(BidderResponse.of(bidder, - givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + final List bidderResponses = singletonList(BidderResponse.of( + bidder, + givenSeatBid( + BidderBid.of(bid1, banner, "seat1", "USD"), + BidderBid.of(bid2, banner, "seat2", "USD")), + 100)); final AuctionContext auctionContext = givenAuctionContext( - givenBidRequest(givenImp()), + givenBidRequest(givenImp("impId1"), givenImp("impId2")), contextBuilder -> contextBuilder.auctionParticipations(toAuctionParticipant(bidderResponses))); final BidRequestCacheInfo cacheInfo = BidRequestCacheInfo.builder().doCaching(true).build(); givenCacheServiceResult(emptyList()); // when - final BidResponse bidResponse = target.create(auctionContext, cacheInfo, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, cacheInfo, MULTI_BIDS).result(); // then final ObjectNode expectedBidExt = mapper.createObjectNode(); @@ -1000,21 +1012,34 @@ public void shouldSetExpectedResponseSeatBidAndBidFields() { final ArgumentCaptor> bidsArgumentCaptor = ArgumentCaptor.forClass(List.class); verify(coreCacheService).cacheBidsOpenrtb(bidsArgumentCaptor.capture(), any(), any(), any()); - assertThat(bidsArgumentCaptor.getValue()).extracting(bidInfo -> bidInfo.getBid().getExt()) + assertThat(bidsArgumentCaptor.getValue()) + .extracting(bidInfo -> bidInfo.getBid().getExt()) .containsOnly(expectedBidExt); assertThat(bidResponse.getSeatbid()) - .containsOnly(SeatBid.builder() - .seat(bidder) - .group(0) - .bid(singletonList(Bid.builder() - .id("bidId") - .impid(IMP_ID) - .price(BigDecimal.ONE) - .adm(BID_ADM) - .ext(expectedBidExt) - .build())) - .build()); + .containsOnly( + SeatBid.builder() + .seat("seat1") + .group(0) + .bid(singletonList(Bid.builder() + .id("bidId1") + .impid("impId1") + .price(BigDecimal.ONE) + .adm(BID_ADM) + .ext(expectedBidExt) + .build())) + .build(), + SeatBid.builder() + .seat("seat2") + .group(0) + .bid(singletonList(Bid.builder() + .id("bidId2") + .impid("impId2") + .price(BigDecimal.ONE) + .adm(BID_ADM) + .ext(expectedBidExt) + .build())) + .build()); } @Test @@ -1025,7 +1050,7 @@ public void shouldUpdateCacheDebugLogWithExtBidResponseWhenEnabledAndBidsReturne final Bid bid = Bid.builder().id("bidId").price(BigDecimal.ONE).adm("adm").impid("i1") .ext(mapper.valueToTree(singletonMap("bidExt", 1))).build(); final List bidderResponses = singletonList(BidderResponse.of("bidder1", - givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( bidRequest, @@ -1034,11 +1059,11 @@ public void shouldUpdateCacheDebugLogWithExtBidResponseWhenEnabledAndBidsReturne .auctionParticipations(toAuctionParticipant(bidderResponses))); // when - target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then assertThat(auctionContext.getCachedDebugLog().buildCacheBody()) - .containsSequence("{\"responsetimemillis\":{\"bidder1\":100},\"tmaxrequest\":1000," + .containsSequence("{\"responsetimemillis\":{\"seat\":100},\"tmaxrequest\":1000," + "\"prebid\":{\"auctiontimestamp\":1000}}"); } @@ -1050,7 +1075,7 @@ public void shouldUpdateCacheDebugLogWithExtBidResponseWhenEnabledAndNoBidsRetur contextBuilder -> contextBuilder.cachedDebugLog(new CachedDebugLog(true, 100, null, jacksonMapper))); // when - target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then assertThat(auctionContext.getCachedDebugLog().buildCacheBody()) @@ -1079,12 +1104,14 @@ public void shouldUseBidsReturnedInCategoryMapperResultAndUpdateErrors() { given(categoryMappingService.createCategoryMapping(any(), any(), any())) .willReturn(Future.succeededFuture(CategoryMappingResult.of(emptyMap(), emptyMap(), - singletonList(BidderResponse.of("bidder1", givenSeatBid(BidderBid.of(bid1, banner, "USD")), + singletonList(BidderResponse.of( + "bidder1", + givenSeatBid(BidderBid.of(bid1, banner, "seat", "USD")), 100)), singletonList("Filtered bid 2")))); // when - final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then assertThat(bidResponse.getSeatbid()) @@ -1100,7 +1127,7 @@ public void shouldThrowExceptionWhenCategoryMappingThrowsPrebidException() { // given final Bid bid = Bid.builder().id("bidId1").price(BigDecimal.valueOf(5.67)).impid(IMP_ID).build(); final List bidderResponses = singletonList(BidderResponse.of("bidder1", - givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( givenBidRequest(identity(), identity(), givenImp()), @@ -1110,7 +1137,7 @@ public void shouldThrowExceptionWhenCategoryMappingThrowsPrebidException() { .willReturn(Future.failedFuture(new InvalidRequestException("category exception"))); // when - final Future result = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS); + final Future result = target.create(auctionContext, CACHE_INFO, MULTI_BIDS); // then assertThat(result.failed()).isTrue(); @@ -1136,7 +1163,7 @@ public void shouldNotWriteSkadnAttributeToBidderSection() { final String bidder = "bidder1"; final List bidderResponses = singletonList(BidderResponse.of(bidder, - givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( givenBidRequest(givenImp()), @@ -1146,7 +1173,7 @@ public void shouldNotWriteSkadnAttributeToBidderSection() { givenCacheServiceResult(emptyList()); // when - final BidResponse bidResponse = target.create(auctionContext, cacheInfo, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, cacheInfo, MULTI_BIDS).result(); // then final ObjectNode expectedBidExt = mapper.createObjectNode(); @@ -1198,14 +1225,14 @@ public void shouldAddTypeToNativeBidAdm() throws JsonProcessingException { .adm(mapper.writeValueAsString(responseAdm)) .ext(mapper.valueToTree(singletonMap("bidExt", 1))).build(); final List bidderResponses = singletonList(BidderResponse.of("bidder1", - givenSeatBid(BidderBid.of(bid, xNative, "USD")), 100)); + givenSeatBid(BidderBid.of(bid, xNative, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( bidRequest, contextBuilder -> contextBuilder.auctionParticipations(toAuctionParticipant(bidderResponses))); // when - final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then assertThat(bidResponse.getSeatbid()).hasSize(1) @@ -1259,14 +1286,14 @@ public void shouldReturnEmptyAssetIfImageTypeIsEmpty() throws JsonProcessingExce .ext(mapper.valueToTree(singletonMap("bidExt", 1))) .build(); final List bidderResponses = singletonList(BidderResponse.of("bidder1", - givenSeatBid(BidderBid.of(bid, xNative, "USD")), 100)); + givenSeatBid(BidderBid.of(bid, xNative, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( bidRequest, contextBuilder -> contextBuilder.auctionParticipations(toAuctionParticipant(bidderResponses))); // when - final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then assertThat(bidResponse.getSeatbid()).hasSize(1) @@ -1314,14 +1341,14 @@ public void shouldReturnEmptyAssetIfNoRelatedNativeAssetFound() throws JsonProce .ext(mapper.valueToTree(singletonMap("bidExt", 1))) .build(); final List bidderResponses = singletonList(BidderResponse.of("bidder1", - givenSeatBid(BidderBid.of(bid, xNative, "USD")), 100)); + givenSeatBid(BidderBid.of(bid, xNative, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( bidRequest, contextBuilder -> contextBuilder.auctionParticipations(toAuctionParticipant(bidderResponses))); // when - final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then assertThat(bidResponse.getSeatbid()).hasSize(1) @@ -1332,7 +1359,7 @@ public void shouldReturnEmptyAssetIfNoRelatedNativeAssetFound() throws JsonProce .isEmpty(); assertThat(bidResponse.getExt()) .extracting(ExtBidResponse::getErrors) - .isEqualTo(Map.of("bidder1", singletonList(ExtBidderError.of(3, + .isEqualTo(Map.of("seat", singletonList(ExtBidderError.of(3, "Response has an Image asset with ID:'123' present that doesn't exist in the request")))); } @@ -1373,14 +1400,14 @@ public void shouldReturnEmptyAssetIfIdIsNotPresentRelatedNativeAssetFound() thro .ext(mapper.valueToTree(singletonMap("bidExt", 1))) .build(); final List bidderResponses = singletonList(BidderResponse.of("bidder1", - givenSeatBid(BidderBid.of(bid, xNative, "USD")), 100)); + givenSeatBid(BidderBid.of(bid, xNative, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( bidRequest, contextBuilder -> contextBuilder.auctionParticipations(toAuctionParticipant(bidderResponses))); // when - final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then assertThat(bidResponse.getSeatbid()).hasSize(1) @@ -1391,7 +1418,7 @@ public void shouldReturnEmptyAssetIfIdIsNotPresentRelatedNativeAssetFound() thro .isEmpty(); assertThat(bidResponse.getExt()) .extracting(ExtBidResponse::getErrors) - .isEqualTo(Map.of("bidder1", singletonList(ExtBidderError.of(3, + .isEqualTo(Map.of("seat", singletonList(ExtBidderError.of(3, "Response has an Image asset with ID:'' present that doesn't exist in the request")))); } @@ -1431,14 +1458,14 @@ public void shouldReturnEmptyAssetIfDataTypeIsEmpty() throws JsonProcessingExcep .ext(mapper.valueToTree(singletonMap("bidExt", 1))) .build(); final List bidderResponses = singletonList(BidderResponse.of("bidder1", - givenSeatBid(BidderBid.of(bid, xNative, "USD")), 100)); + givenSeatBid(BidderBid.of(bid, xNative, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( bidRequest, contextBuilder -> contextBuilder.auctionParticipations(toAuctionParticipant(bidderResponses))); // when - final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then assertThat(bidResponse.getSeatbid()).hasSize(1) @@ -1459,7 +1486,7 @@ public void shouldSetBidAdmToNullIfCacheIdIsPresentAndReturnCreativeBidsIsFalse( .impid(IMP_ID) .build(); final List bidderResponses = singletonList(BidderResponse.of("bidder1", - givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( givenBidRequest( @@ -1473,7 +1500,7 @@ public void shouldSetBidAdmToNullIfCacheIdIsPresentAndReturnCreativeBidsIsFalse( final BidRequestCacheInfo cacheInfo = BidRequestCacheInfo.builder().doCaching(true).build(); // when - final BidResponse bidResponse = target.create(auctionContext, cacheInfo, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, cacheInfo, MULTI_BIDS).result(); // then assertThat(bidResponse.getSeatbid()) @@ -1489,7 +1516,7 @@ public void shouldSetBidAdmToNullIfVideoCacheIdIsPresentAndReturnCreativeVideoBi // given final Bid bid = Bid.builder().price(BigDecimal.ONE).adm(BID_ADM).id("bidId").impid(IMP_ID).build(); final List bidderResponses = singletonList(BidderResponse.of("bidder1", - givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( givenBidRequest( @@ -1503,7 +1530,7 @@ public void shouldSetBidAdmToNullIfVideoCacheIdIsPresentAndReturnCreativeVideoBi givenCacheServiceResult(singletonList(CacheInfo.of("id", null, null, null))); // when - final BidResponse bidResponse = target.create(auctionContext, cacheInfo, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, cacheInfo, MULTI_BIDS).result(); // then assertThat(bidResponse.getSeatbid()) @@ -1519,7 +1546,7 @@ public void shouldSetBidExpWhenCacheIdIsMatched() { // given final Bid bid = Bid.builder().price(BigDecimal.ONE).impid(IMP_ID).id("bidId").build(); final List bidderResponses = singletonList(BidderResponse.of("bidder1", - givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( givenBidRequest( @@ -1533,7 +1560,7 @@ public void shouldSetBidExpWhenCacheIdIsMatched() { final BidRequestCacheInfo cacheInfo = BidRequestCacheInfo.builder().doCaching(true).build(); // when - final BidResponse bidResponse = target.create(auctionContext, cacheInfo, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, cacheInfo, MULTI_BIDS).result(); // then assertThat(bidResponse.getSeatbid()) @@ -1549,7 +1576,7 @@ public void shouldSetBidExpMaxTtlWhenCacheIdIsMatchedAndBothTtlIsSet() { // given final Bid bid = Bid.builder().price(BigDecimal.ONE).impid(IMP_ID).id("bidId").build(); final List bidderResponses = singletonList(BidderResponse.of("bidder1", - givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( givenBidRequest( @@ -1563,7 +1590,7 @@ public void shouldSetBidExpMaxTtlWhenCacheIdIsMatchedAndBothTtlIsSet() { final BidRequestCacheInfo cacheInfo = BidRequestCacheInfo.builder().doCaching(true).build(); // when - final BidResponse bidResponse = target.create(auctionContext, cacheInfo, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, cacheInfo, MULTI_BIDS).result(); // then assertThat(bidResponse.getSeatbid()) @@ -1579,14 +1606,14 @@ public void shouldTolerateMissingExtInSeatBidAndBid() { // given final Bid bid = Bid.builder().id("bidId").price(BigDecimal.ONE).impid(IMP_ID).build(); final List bidderResponses = singletonList(BidderResponse.of("bidder1", - givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( givenBidRequest(givenImp()), contextBuilder -> contextBuilder.auctionParticipations(toAuctionParticipant(bidderResponses))); // when - final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then final ObjectNode expectedBidExt = mapper.createObjectNode(); @@ -1608,7 +1635,7 @@ public void shouldPassPreferDealsToWinningComparatorFactoryWhenBidRequestTrue() // given final Bid bid = Bid.builder().id("bidId1").price(BigDecimal.valueOf(5.67)).impid("i1").build(); final List bidderResponses = singletonList(BidderResponse.of("bidder1", - givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( givenBidRequest( @@ -1617,7 +1644,7 @@ public void shouldPassPreferDealsToWinningComparatorFactoryWhenBidRequestTrue() contextBuilder -> contextBuilder.auctionParticipations(toAuctionParticipant(bidderResponses))); // when - target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then verify(winningBidComparatorFactory, times(2)).create(eq(true)); @@ -1628,7 +1655,7 @@ public void shouldPassPreferDealsFalseWhenBidRequestPreferDealsIsNotDefined() { // given final Bid bid = Bid.builder().id("bidId1").price(BigDecimal.valueOf(5.67)).impid("i1").build(); final List bidderResponses = singletonList(BidderResponse.of("bidder1", - givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( givenBidRequest( @@ -1637,7 +1664,7 @@ public void shouldPassPreferDealsFalseWhenBidRequestPreferDealsIsNotDefined() { contextBuilder -> contextBuilder.auctionParticipations(toAuctionParticipant(bidderResponses))); // when - target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then verify(winningBidComparatorFactory, times(2)).create(eq(false)); @@ -1648,7 +1675,7 @@ public void shouldPopulateTargetingKeywords() { // given final Bid bid = Bid.builder().id("bidId1").price(BigDecimal.valueOf(5.67)).impid(IMP_ID).build(); final List bidderResponses = singletonList(BidderResponse.of("bidder1", - givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( givenBidRequest( @@ -1658,7 +1685,7 @@ public void shouldPopulateTargetingKeywords() { contextBuilder -> contextBuilder.auctionParticipations(toAuctionParticipant(bidderResponses))); // when - final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then assertThat(bidResponse.getSeatbid()) @@ -1668,11 +1695,11 @@ public void shouldPopulateTargetingKeywords() { .extracting(Map.Entry::getKey, Map.Entry::getValue) .containsOnly( tuple("hb_pb", "5.00"), - tuple("hb_pb_bidder1", "5.00"), - tuple("hb_bidder", "bidder1"), - tuple("hb_bidder_bidder1", "bidder1"), + tuple("hb_pb_seat", "5.00"), + tuple("hb_bidder", "seat"), + tuple("hb_bidder_seat", "seat"), tuple("hb_env", "mobile-app"), - tuple("hb_env_bidder1", "mobile-app")); + tuple("hb_env_seat", "mobile-app")); verify(coreCacheService, never()).cacheBidsOpenrtb(anyList(), any(), any(), any()); } @@ -1682,7 +1709,7 @@ public void shouldPopulateTargetingKeywordsForAmpRequest() { // given final Bid bid = Bid.builder().id("bidId1").price(BigDecimal.valueOf(5.67)).impid(IMP_ID).build(); final List bidderResponses = singletonList(BidderResponse.of("bidder1", - givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( givenBidRequest( @@ -1694,7 +1721,7 @@ public void shouldPopulateTargetingKeywordsForAmpRequest() { contextBuilder -> contextBuilder.auctionParticipations(toAuctionParticipant(bidderResponses))); // when - final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then assertThat(bidResponse.getSeatbid()) @@ -1704,11 +1731,11 @@ public void shouldPopulateTargetingKeywordsForAmpRequest() { .extracting(Map.Entry::getKey, Map.Entry::getValue) .containsOnly( tuple("hb_pb", "5.00"), - tuple("hb_pb_bidder1", "5.00"), - tuple("hb_bidder", "bidder1"), - tuple("hb_bidder_bidder1", "bidder1"), + tuple("hb_pb_seat", "5.00"), + tuple("hb_bidder", "seat"), + tuple("hb_bidder_seat", "seat"), tuple("hb_env", "amp"), - tuple("hb_env_bidder1", "amp")); + tuple("hb_env_seat", "amp")); verify(coreCacheService, never()).cacheBidsOpenrtb(anyList(), any(), any(), any()); } @@ -1718,7 +1745,7 @@ public void shouldTruncateTargetingKeywordsByGlobalConfig() { // given final Bid bid = Bid.builder().id("bidId1").price(BigDecimal.valueOf(5.67)).impid(IMP_ID).build(); final List bidderResponses = singletonList(BidderResponse.of("someVeryLongBidderName", - givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + givenSeatBid(BidderBid.of(bid, banner, "someVeryLongSeatName", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( givenBidRequest( @@ -1748,7 +1775,7 @@ public void shouldTruncateTargetingKeywordsByGlobalConfig() { cacheDefaultProperties); // when - final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then assertThat(bidResponse.getSeatbid()) @@ -1758,10 +1785,10 @@ public void shouldTruncateTargetingKeywordsByGlobalConfig() { .extracting(Map.Entry::getKey, Map.Entry::getValue) .containsOnly( tuple("hb_pb", "5.00"), - tuple("hb_pb_someVeryLongBi", "5.00"), - tuple("hb_bidder", "someVeryLongBidderName"), - tuple("hb_bidder_someVeryLo", "someVeryLongBidderName"), - tuple("hb_bidder_someVeryLo", "someVeryLongBidderName")); + tuple("hb_pb_someVeryLongSe", "5.00"), + tuple("hb_bidder", "someVeryLongSeatName"), + tuple("hb_bidder_someVeryLo", "someVeryLongSeatName"), + tuple("hb_bidder_someVeryLo", "someVeryLongSeatName")); } @Test @@ -1780,7 +1807,7 @@ public void shouldTruncateTargetingKeywordsByAccountConfig() { final Bid bid = Bid.builder().id("bidId1").price(BigDecimal.valueOf(5.67)).impid(IMP_ID).build(); final List bidderResponses = singletonList(BidderResponse.of("someVeryLongBidderName", - givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + givenSeatBid(BidderBid.of(bid, banner, "someVeryLongSeatName", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( bidRequest, @@ -1789,7 +1816,7 @@ public void shouldTruncateTargetingKeywordsByAccountConfig() { .auctionParticipations(toAuctionParticipant(bidderResponses))); // when - final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then assertThat(bidResponse.getSeatbid()) @@ -1799,9 +1826,9 @@ public void shouldTruncateTargetingKeywordsByAccountConfig() { .extracting(Map.Entry::getKey, Map.Entry::getValue) .containsOnly( tuple("hb_pb", "5.00"), - tuple("hb_pb_someVeryLongBi", "5.00"), - tuple("hb_bidder", "someVeryLongBidderName"), - tuple("hb_bidder_someVeryLo", "someVeryLongBidderName")); + tuple("hb_pb_someVeryLongSe", "5.00"), + tuple("hb_bidder", "someVeryLongSeatName"), + tuple("hb_bidder_someVeryLo", "someVeryLongSeatName")); } @Test @@ -1829,7 +1856,7 @@ public void shouldTruncateTargetingKeywordsByRequestPassedValue() { final Bid bid = Bid.builder().id("bidId1").price(BigDecimal.valueOf(5.67)).impid(IMP_ID).build(); final List bidderResponses = singletonList(BidderResponse.of("someVeryLongBidderName", - givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + givenSeatBid(BidderBid.of(bid, banner, "someVeryLongSeatName", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( bidRequest, @@ -1838,7 +1865,7 @@ public void shouldTruncateTargetingKeywordsByRequestPassedValue() { .auctionParticipations(toAuctionParticipant(bidderResponses))); // when - final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then assertThat(bidResponse.getSeatbid()) @@ -1848,15 +1875,16 @@ public void shouldTruncateTargetingKeywordsByRequestPassedValue() { .extracting(Map.Entry::getKey, Map.Entry::getValue) .containsOnly( tuple("hb_pb", "5.00"), - tuple("hb_pb_someVeryLongBi", "5.00"), - tuple("hb_bidder", "someVeryLongBidderName"), - tuple("hb_bidder_someVeryLo", "someVeryLongBidderName")); + tuple("hb_pb_someVeryLongSe", "5.00"), + tuple("hb_bidder", "someVeryLongSeatName"), + tuple("hb_bidder_someVeryLo", "someVeryLongSeatName")); } @Test public void shouldReduceAndNotPopulateTargetingKeywordsForExtraBidsWhenCodePrefixIsNotDefined() { // given final String bidder1 = "bidder1"; + final String seat = "seat"; final Map multiBidMap = singletonMap(bidder1, MultiBidConfig.of(bidder1, 3, null)); final Bid bidder1Bid1 = Bid.builder().id("bidder1Bid1").price(BigDecimal.valueOf(3.67)).impid("i1").build(); @@ -1868,11 +1896,11 @@ public void shouldReduceAndNotPopulateTargetingKeywordsForExtraBidsWhenCodePrefi final List bidderResponses = singletonList( BidderResponse.of(bidder1, givenSeatBid( - BidderBid.of(bidder1Bid1, banner, null), // extra bid - BidderBid.of(bidder1Bid2, banner, null), // extra bid - BidderBid.of(bidder1Bid3, banner, null), // Will be removed by price - BidderBid.of(bidder1Bid4, banner, null), - BidderBid.of(bidder1Bid5, banner, null)), + BidderBid.of(bidder1Bid1, banner, seat, null), // extra bid + BidderBid.of(bidder1Bid2, banner, seat, null), // extra bid + BidderBid.of(bidder1Bid3, banner, seat, null), // Will be removed by price + BidderBid.of(bidder1Bid4, banner, seat, null), + BidderBid.of(bidder1Bid5, banner, seat, null)), 100)); final AuctionContext auctionContext = givenAuctionContext( @@ -1883,7 +1911,7 @@ public void shouldReduceAndNotPopulateTargetingKeywordsForExtraBidsWhenCodePrefi contextBuilder -> contextBuilder.auctionParticipations(toAuctionParticipant(bidderResponses))); // when - final BidResponse result = target.create(auctionContext, CACHE_INFO, aliases, multiBidMap).result(); + final BidResponse result = target.create(auctionContext, CACHE_INFO, multiBidMap).result(); // then assertThat(result.getSeatbid()) @@ -1891,13 +1919,13 @@ public void shouldReduceAndNotPopulateTargetingKeywordsForExtraBidsWhenCodePrefi .extracting( Bid::getId, bid -> toTargetingByKey(bid, "hb_bidder"), - bid -> toTargetingByKey(bid, "hb_bidder_bidder1"), + bid -> toTargetingByKey(bid, "hb_bidder_seat"), BidResponseCreatorTest::getTargetingBidderCode) .containsOnly( - tuple("bidder1Bid4", bidder1, bidder1, bidder1), + tuple("bidder1Bid4", seat, seat, bidder1), tuple("bidder1Bid2", null, null, null), tuple("bidder1Bid1", null, null, null), - tuple("bidder1Bid5", bidder1, bidder1, null)); + tuple("bidder1Bid5", seat, seat, null)); verify(coreCacheService, never()).cacheBidsOpenrtb(anyList(), any(), any(), any()); } @@ -1927,9 +1955,9 @@ public void shouldNotPopulateTargetingKeywordsForExtraBidsWhenCodePrefixIsDefine final List bidderResponses = singletonList( BidderResponse.of(bidder1, givenSeatBid( - BidderBid.of(bidder1Bid1, banner, null), // extra bid - BidderBid.of(bidder1Bid2, banner, null), // extra bid - BidderBid.of(bidder1Bid3, banner, null)), + BidderBid.of(bidder1Bid1, banner, "seat", null), // extra bid + BidderBid.of(bidder1Bid2, banner, "seat", null), // extra bid + BidderBid.of(bidder1Bid3, banner, "seat", null)), 100)); final AuctionContext auctionContext = givenAuctionContext( @@ -1937,11 +1965,11 @@ public void shouldNotPopulateTargetingKeywordsForExtraBidsWhenCodePrefixIsDefine contextBuilder -> contextBuilder.auctionParticipations(toAuctionParticipant(bidderResponses))); // when - final BidResponse result = target.create(auctionContext, CACHE_INFO, aliases, multiBidMap).result(); + final BidResponse result = target.create(auctionContext, CACHE_INFO, multiBidMap).result(); final Map expectedWinningBidTargetingMap = new HashMap<>(); expectedWinningBidTargetingMap.put("hb_pb", "4.50"); - expectedWinningBidTargetingMap.put("hb_bidder", bidder1); + expectedWinningBidTargetingMap.put("hb_bidder", "seat"); // then assertThat(result.getSeatbid()) @@ -1959,6 +1987,7 @@ public void shouldNotPopulateTargetingKeywordsForExtraBidsWhenCodePrefixIsDefine public void shouldReduceAndPopulateTargetingKeywordsForExtraBidsWhenCodePrefixIsDefined() { // given final String bidder1 = "bidder1"; + final String seat = "seat"; final String codePrefix = "bN"; final Map multiBidMap = singletonMap(bidder1, MultiBidConfig.of(bidder1, 3, codePrefix)); @@ -1972,11 +2001,11 @@ public void shouldReduceAndPopulateTargetingKeywordsForExtraBidsWhenCodePrefixIs final List bidderResponses = singletonList( BidderResponse.of(bidder1, givenSeatBid( - BidderBid.of(bidder1Bid1, banner, null), // extra bid - BidderBid.of(bidder1Bid2, banner, null), // extra bid - BidderBid.of(bidder1Bid3, banner, null), // Will be removed by price - BidderBid.of(bidder1Bid4, banner, null), - BidderBid.of(bidder1Bid5, banner, null)), + BidderBid.of(bidder1Bid1, banner, seat, null), // extra bid + BidderBid.of(bidder1Bid2, banner, seat, null), // extra bid + BidderBid.of(bidder1Bid3, banner, seat, null), // Will be removed by price + BidderBid.of(bidder1Bid4, banner, seat, null), + BidderBid.of(bidder1Bid5, banner, seat, null)), 100)); final AuctionContext auctionContext = givenAuctionContext( @@ -1987,14 +2016,14 @@ public void shouldReduceAndPopulateTargetingKeywordsForExtraBidsWhenCodePrefixIs contextBuilder -> contextBuilder.auctionParticipations(toAuctionParticipant(bidderResponses))); // when - final BidResponse result = target.create(auctionContext, CACHE_INFO, aliases, multiBidMap).result(); + final BidResponse result = target.create(auctionContext, CACHE_INFO, multiBidMap).result(); // then final Map bidder1Bid4Targeting = new HashMap<>(); bidder1Bid4Targeting.put("hb_pb", "5.00"); - bidder1Bid4Targeting.put("hb_pb_" + bidder1, "5.00"); - bidder1Bid4Targeting.put("hb_bidder_" + bidder1, bidder1); - bidder1Bid4Targeting.put("hb_bidder", bidder1); + bidder1Bid4Targeting.put("hb_pb_" + seat, "5.00"); + bidder1Bid4Targeting.put("hb_bidder_" + seat, seat); + bidder1Bid4Targeting.put("hb_bidder", seat); final ObjectNode bidder1Bid4Ext = extWithTargeting(bidder1, bidder1Bid4Targeting); final Bid expectedBidder1Bid4 = bidder1Bid4.toBuilder().ext(bidder1Bid4Ext).build(); @@ -2014,9 +2043,9 @@ public void shouldReduceAndPopulateTargetingKeywordsForExtraBidsWhenCodePrefixIs final Map bidder1Bid5Targeting = new HashMap<>(); bidder1Bid5Targeting.put("hb_pb", "1.00"); - bidder1Bid5Targeting.put("hb_pb_" + bidder1, "1.00"); - bidder1Bid5Targeting.put("hb_bidder_" + bidder1, bidder1); - bidder1Bid5Targeting.put("hb_bidder", bidder1); + bidder1Bid5Targeting.put("hb_pb_" + seat, "1.00"); + bidder1Bid5Targeting.put("hb_bidder_" + seat, seat); + bidder1Bid5Targeting.put("hb_bidder", seat); final ObjectNode bidder1Bid5Ext = extWithTargeting(null, bidder1Bid5Targeting); final Bid expectedBidder1Bid5 = bidder1Bid5.toBuilder().ext(bidder1Bid5Ext).build(); @@ -2035,10 +2064,10 @@ public void shouldPopulateTargetingKeywordsForWinningBidsAndWinningBidsByBidder( final List bidderResponses = asList( BidderResponse.of("bidder1", givenSeatBid( - BidderBid.of(firstBid, banner, null), - BidderBid.of(secondBid, banner, null)), 100), + BidderBid.of(firstBid, banner, "seat1", null), + BidderBid.of(secondBid, banner, "seat1", null)), 100), BidderResponse.of("bidder2", - givenSeatBid(BidderBid.of(thirdBid, banner, null)), 111)); + givenSeatBid(BidderBid.of(thirdBid, banner, "seat2", null)), 111)); final AuctionContext auctionContext = givenAuctionContext( givenBidRequest( @@ -2048,7 +2077,7 @@ public void shouldPopulateTargetingKeywordsForWinningBidsAndWinningBidsByBidder( contextBuilder -> contextBuilder.auctionParticipations(toAuctionParticipant(bidderResponses))); // when - final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then assertThat(bidResponse.getSeatbid()) @@ -2056,12 +2085,12 @@ public void shouldPopulateTargetingKeywordsForWinningBidsAndWinningBidsByBidder( .extracting( Bid::getId, bid -> toTargetingByKey(bid, "hb_bidder"), - bid -> toTargetingByKey(bid, "hb_bidder_bidder1"), - bid -> toTargetingByKey(bid, "hb_bidder_bidder2")) + bid -> toTargetingByKey(bid, "hb_bidder_seat1"), + bid -> toTargetingByKey(bid, "hb_bidder_seat2")) .containsOnly( - tuple("bidId1", "bidder1", "bidder1", null), - tuple("bidId2", null, "bidder1", null), - tuple("bidId3", "bidder2", null, "bidder2")); + tuple("bidId1", "seat1", "seat1", null), + tuple("bidId2", null, "seat1", null), + tuple("bidId3", "seat2", null, "seat2")); verify(coreCacheService, never()).cacheBidsOpenrtb(anyList(), any(), any(), any()); } @@ -2089,7 +2118,7 @@ public void shouldPopulateTargetingKeywordsFromMediaTypePriceGranularities() { final Bid bid = Bid.builder().id("bidId").price(BigDecimal.valueOf(5.67)).impid(IMP_ID).build(); final List bidderResponses = singletonList(BidderResponse.of("bidder1", - givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( givenBidRequest( @@ -2099,7 +2128,7 @@ public void shouldPopulateTargetingKeywordsFromMediaTypePriceGranularities() { contextBuilder -> contextBuilder.auctionParticipations(toAuctionParticipant(bidderResponses))); // when - final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then assertThat(bidResponse.getSeatbid()) @@ -2109,9 +2138,9 @@ public void shouldPopulateTargetingKeywordsFromMediaTypePriceGranularities() { .extracting(Map.Entry::getKey, Map.Entry::getValue) .containsOnly( tuple("hb_pb", "5.000"), - tuple("hb_bidder", "bidder1"), - tuple("hb_pb_bidder1", "5.000"), - tuple("hb_bidder_bidder1", "bidder1")); + tuple("hb_bidder", "seat"), + tuple("hb_pb_seat", "5.000"), + tuple("hb_bidder_seat", "seat")); verify(coreCacheService, never()).cacheBidsOpenrtb(anyList(), any(), any(), any()); } @@ -2121,7 +2150,7 @@ public void shouldPopulateCacheIdHostPathAndUuidTargetingKeywords() { // given final Bid bid = Bid.builder().id("bidId").price(BigDecimal.valueOf(5.67)).impid(IMP_ID).build(); final List bidderResponses = singletonList(BidderResponse.of("bidder1", - givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( givenBidRequest( @@ -2135,7 +2164,7 @@ public void shouldPopulateCacheIdHostPathAndUuidTargetingKeywords() { givenCacheServiceResult(singletonList(CacheInfo.of("cacheId", "videoId", null, null))); // when - final BidResponse bidResponse = target.create(auctionContext, cacheInfo, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, cacheInfo, MULTI_BIDS).result(); // then assertThat(bidResponse.getSeatbid()) @@ -2145,17 +2174,17 @@ public void shouldPopulateCacheIdHostPathAndUuidTargetingKeywords() { .extracting(Map.Entry::getKey, Map.Entry::getValue) .containsOnly( tuple("hb_pb", "5.00"), - tuple("hb_bidder", "bidder1"), + tuple("hb_bidder", "seat"), tuple("hb_cache_id", "cacheId"), tuple("hb_uuid", "videoId"), tuple("hb_cache_host", "testHost"), tuple("hb_cache_path", "testPath"), - tuple("hb_pb_bidder1", "5.00"), - tuple("hb_bidder_bidder1", "bidder1"), - tuple("hb_cache_id_bidder1", "cacheId"), - tuple("hb_uuid_bidder1", "videoId"), - tuple("hb_cache_host_bidder1", "testHost"), - tuple("hb_cache_path_bidder1", "testPath")); + tuple("hb_pb_seat", "5.00"), + tuple("hb_bidder_seat", "seat"), + tuple("hb_cache_id_seat", "cacheId"), + tuple("hb_uuid_seat", "videoId"), + tuple("hb_cache_host_seat", "testHost"), + tuple("hb_cache_path_seat", "testPath")); verify(coreCacheService).cacheBidsOpenrtb(anyList(), any(), any(), any()); } @@ -2173,14 +2202,14 @@ public void shouldPopulateTargetingKeywordsWithAdditionalValuesFromRequest() { final Bid bid = Bid.builder().id("bidId1").price(BigDecimal.valueOf(5.67)).impid(IMP_ID).build(); final List bidderResponses = singletonList(BidderResponse.of( - "bidder1", givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + "bidder1", givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( bidRequest, contextBuilder -> contextBuilder.auctionParticipations(toAuctionParticipant(bidderResponses))); // when - final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then assertThat(bidResponse.getSeatbid()) @@ -2196,7 +2225,7 @@ public void shouldPopulateTargetingKeywordsIfBidWasCachedAndAdmWasRemoved() { // given final Bid bid = Bid.builder().id("bidId").price(BigDecimal.valueOf(5.67)).impid(IMP_ID).adm(BID_ADM).build(); final List bidderResponses = singletonList( - BidderResponse.of("bidder1", givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + BidderResponse.of("bidder1", givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( givenBidRequest( @@ -2213,7 +2242,7 @@ public void shouldPopulateTargetingKeywordsIfBidWasCachedAndAdmWasRemoved() { givenCacheServiceResult(singletonList(CacheInfo.of("cacheId", null, null, null))); // when - final BidResponse bidResponse = target.create(auctionContext, cacheInfo, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, cacheInfo, MULTI_BIDS).result(); // Check if you didn't lost any bids because of bid change in winningBids set // then @@ -2245,7 +2274,7 @@ public void shouldAddExtPrebidEventsIfEventsAreEnabledAndExtRequestPrebidEventPr .impid(IMP_ID) .build(); final List bidderResponses = singletonList( - BidderResponse.of("bidder1", givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + BidderResponse.of("bidder1", givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( bidRequest, @@ -2261,7 +2290,7 @@ public void shouldAddExtPrebidEventsIfEventsAreEnabledAndExtRequestPrebidEventPr givenCacheServiceResult(emptyList()); // when - final BidResponse bidResponse = target.create(auctionContext, cacheInfo, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, cacheInfo, MULTI_BIDS).result(); // then final ArgumentCaptor> bidsArgumentCaptor = ArgumentCaptor.forClass(List.class); @@ -2302,7 +2331,7 @@ public void shouldAddExtPrebidEventsIfEventsAreEnabledAndAccountSupportEventsFor .impid(IMP_ID) .build(); final List bidderResponses = singletonList( - BidderResponse.of("bidder1", givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + BidderResponse.of("bidder1", givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( bidRequest, @@ -2315,7 +2344,7 @@ public void shouldAddExtPrebidEventsIfEventsAreEnabledAndAccountSupportEventsFor .willReturn(events); // when - final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then assertThat(bidResponse.getSeatbid()).hasSize(1) @@ -2352,7 +2381,7 @@ public void shouldAddExtPrebidEventsIfEventsAreEnabledAndDefaultAccountAnalytics .impid(IMP_ID) .build(); final List bidderResponses = singletonList( - BidderResponse.of("bidder1", givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + BidderResponse.of("bidder1", givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( bidRequest, @@ -2365,7 +2394,7 @@ public void shouldAddExtPrebidEventsIfEventsAreEnabledAndDefaultAccountAnalytics .willReturn(events); // when - final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then assertThat(bidResponse.getSeatbid()).hasSize(1) @@ -2388,7 +2417,7 @@ public void shouldAddExtPrebidVideoToExtBidPrebidWhenVideoBids() { .ext(mapper.createObjectNode().set("prebid", mapper.valueToTree(extBidPrebid))) .build(); final List bidderResponses = singletonList(BidderResponse.of("bidder1", - givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( givenBidRequest(givenImp()), @@ -2398,7 +2427,7 @@ public void shouldAddExtPrebidVideoToExtBidPrebidWhenVideoBids() { givenCacheServiceResult(emptyList()); // when - final BidResponse bidResponse = target.create(auctionContext, cacheInfo, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, cacheInfo, MULTI_BIDS).result(); // then final ArgumentCaptor> bidsArgumentCaptor = ArgumentCaptor.forClass(List.class); @@ -2421,7 +2450,7 @@ public void shouldAddDealTierSatisfiedToExtBidPrebidWhenBidsPrioritySatisfiedMin .ext(mapper.createObjectNode().set("prebid", mapper.valueToTree( ExtBidPrebid.builder().video(ExtBidPrebidVideo.of(1, "category")).build()))).build(); final List bidderResponses = singletonList(BidderResponse.of("bidder1", - givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( givenBidRequest(Imp.builder().id("i1").build()), @@ -2433,7 +2462,7 @@ public void shouldAddDealTierSatisfiedToExtBidPrebidWhenBidsPrioritySatisfiedMin bidderResponses, emptyList()))); // when - final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then assertThat(bidResponse.getSeatbid()).hasSize(1) @@ -2457,7 +2486,7 @@ public void shouldNotAddExtPrebidEventsIfEventsAreNotEnabled() { final Bid bid = Bid.builder().id("bidId1").price(BigDecimal.valueOf(5.67)).impid(IMP_ID).build(); final List bidderResponses = singletonList(BidderResponse.of("bidder1", - givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( givenBidRequest( @@ -2469,7 +2498,7 @@ public void shouldNotAddExtPrebidEventsIfEventsAreNotEnabled() { .auctionParticipations(toAuctionParticipant(bidderResponses))); // when - final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then assertThat(bidResponse.getSeatbid()).hasSize(1) @@ -2494,7 +2523,7 @@ public void shouldNotAddExtPrebidEventsIfExtRequestPrebidEventsNull() { .impid(IMP_ID) .build(); final List bidderResponses = singletonList( - BidderResponse.of("bidder1", givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + BidderResponse.of("bidder1", givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( givenBidRequest(givenImp()), @@ -2503,7 +2532,7 @@ public void shouldNotAddExtPrebidEventsIfExtRequestPrebidEventsNull() { .auctionParticipations(toAuctionParticipant(bidderResponses))); // when - final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then assertThat(bidResponse.getSeatbid()).hasSize(1) @@ -2535,7 +2564,7 @@ public void shouldNotAddExtPrebidEventsIfAccountDoesNotSupportEventsForChannel() .impid(IMP_ID) .build(); final List bidderResponses = singletonList( - BidderResponse.of("bidder1", givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + BidderResponse.of("bidder1", givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( bidRequest, @@ -2544,7 +2573,7 @@ public void shouldNotAddExtPrebidEventsIfAccountDoesNotSupportEventsForChannel() .auctionParticipations(toAuctionParticipant(bidderResponses))); // when - final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then assertThat(bidResponse.getSeatbid()).hasSize(1) @@ -2558,7 +2587,7 @@ public void shouldReturnCacheEntityInExt() { // given final Bid bid = Bid.builder().id("bidId").price(BigDecimal.valueOf(5.67)).impid(IMP_ID).build(); final List bidderResponses = singletonList(BidderResponse.of("bidder1", - givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final BidRequestCacheInfo cacheInfo = BidRequestCacheInfo.builder() .doCaching(true) @@ -2576,7 +2605,7 @@ public void shouldReturnCacheEntityInExt() { givenCacheServiceResult(singletonList(CacheInfo.of("cacheId", "videoId", null, null))); // when - final BidResponse bidResponse = target.create(auctionContext, cacheInfo, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, cacheInfo, MULTI_BIDS).result(); // then assertThat(bidResponse.getSeatbid()) @@ -2607,7 +2636,7 @@ public void shouldNotPopulateWinningBidTargetingIfIncludeWinnersFlagIsFalse() { final Bid bid = Bid.builder().id("bidId").price(BigDecimal.valueOf(5.67)).impid(IMP_ID).build(); final List bidderResponses = singletonList(BidderResponse.of("bidder1", - givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( bidRequest, @@ -2622,16 +2651,16 @@ public void shouldNotPopulateWinningBidTargetingIfIncludeWinnersFlagIsFalse() { givenCacheServiceResult(singletonList(CacheInfo.of("cacheId", "videoId", null, null))); // when - final BidResponse bidResponse = target.create(auctionContext, cacheInfo, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, cacheInfo, MULTI_BIDS).result(); // then assertThat(bidResponse.getSeatbid()).flatExtracting(SeatBid::getBid) .extracting( Bid::getId, extractedBid -> toTargetingByKey(extractedBid, "hb_bidder"), - extractedBid -> toTargetingByKey(extractedBid, "hb_bidder_bidder1")) + extractedBid -> toTargetingByKey(extractedBid, "hb_bidder_seat")) .containsOnly( - tuple("bidId", null, "bidder1")); + tuple("bidId", null, "seat")); verify(coreCacheService).cacheBidsOpenrtb(anyList(), any(), any(), any()); } @@ -2653,7 +2682,7 @@ public void shouldNotPopulateBidderKeysTargetingIfIncludeBidderKeysFlagIsFalse() final Bid bid = Bid.builder().id("bidId").price(BigDecimal.valueOf(5.67)).impid(IMP_ID).build(); final List bidderResponses = singletonList( - BidderResponse.of("bidder1", givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + BidderResponse.of("bidder1", givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( bidRequest, @@ -2668,16 +2697,16 @@ public void shouldNotPopulateBidderKeysTargetingIfIncludeBidderKeysFlagIsFalse() givenCacheServiceResult(singletonList(CacheInfo.of("cacheId", "videoId", null, null))); // when - final BidResponse bidResponse = target.create(auctionContext, cacheInfo, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, cacheInfo, MULTI_BIDS).result(); // then assertThat(bidResponse.getSeatbid()).flatExtracting(SeatBid::getBid) .extracting( Bid::getId, extractedBid -> toTargetingByKey(extractedBid, "hb_bidder"), - extractedBid -> toTargetingByKey(extractedBid, "hb_bidder_bidder1")) + extractedBid -> toTargetingByKey(extractedBid, "hb_bidder_seat")) .containsOnly( - tuple("bidId", "bidder1", null)); + tuple("bidId", "seat", null)); verify(coreCacheService).cacheBidsOpenrtb(anyList(), any(), any(), any()); } @@ -2694,8 +2723,8 @@ public void shouldNotPopulateCacheIdTargetingKeywordsIfBidCpmIsZero() { final Bid secondBid = Bid.builder().id("bidId2").impid("impId2").price(BigDecimal.valueOf(5.67)).build(); final List bidderResponses = asList( - BidderResponse.of("bidder1", givenSeatBid(BidderBid.of(firstBid, banner, null)), 99), - BidderResponse.of("bidder2", givenSeatBid(BidderBid.of(secondBid, banner, null)), 123)); + BidderResponse.of("bidder1", givenSeatBid(BidderBid.of(firstBid, banner, "seat1", null)), 99), + BidderResponse.of("bidder2", givenSeatBid(BidderBid.of(secondBid, banner, "seat2", null)), 123)); final AuctionContext auctionContext = givenAuctionContext( bidRequest, @@ -2706,17 +2735,17 @@ public void shouldNotPopulateCacheIdTargetingKeywordsIfBidCpmIsZero() { givenCacheServiceResult(singletonList(CacheInfo.of("cacheId2", null, null, null))); // when - final BidResponse bidResponse = target.create(auctionContext, cacheInfo, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, cacheInfo, MULTI_BIDS).result(); // then assertThat(bidResponse.getSeatbid()).flatExtracting(SeatBid::getBid).hasSize(2) .extracting( bid -> toTargetingByKey(bid, "hb_bidder"), bid -> toTargetingByKey(bid, "hb_cache_id"), - bid -> toTargetingByKey(bid, "hb_cache_id_bidder2")) + bid -> toTargetingByKey(bid, "hb_cache_id_seat2")) .containsOnly( - tuple("bidder1", null, null), - tuple("bidder2", "cacheId2", "cacheId2")); + tuple("seat1", null, null), + tuple("seat2", "cacheId2", "cacheId2")); verify(coreCacheService).cacheBidsOpenrtb(anyList(), any(), any(), any()); } @@ -2732,8 +2761,8 @@ public void shouldNotCacheNonDealBidWithCpmIsZeroAndCacheDealBidWithZeroCpm() { final Bid bid2 = Bid.builder().id("bidId2").impid("impId2").price(BigDecimal.ZERO).dealid("dealId2").build(); final List bidderResponses = asList( - BidderResponse.of("bidder1", givenSeatBid(BidderBid.of(bid1, banner, null)), 99), - BidderResponse.of("bidder2", givenSeatBid(BidderBid.of(bid2, banner, null)), 99)); + BidderResponse.of("bidder1", givenSeatBid(BidderBid.of(bid1, banner, "seat1", null)), 99), + BidderResponse.of("bidder2", givenSeatBid(BidderBid.of(bid2, banner, "seat2", null)), 99)); final AuctionContext auctionContext = givenAuctionContext( givenBidRequest(imp1, imp2), @@ -2743,7 +2772,7 @@ public void shouldNotCacheNonDealBidWithCpmIsZeroAndCacheDealBidWithZeroCpm() { givenCacheServiceResult(singletonList(CacheInfo.of("cacheId2", null, null, null))); // when - target.create(auctionContext, cacheInfo, aliases, MULTI_BIDS).result(); + target.create(auctionContext, cacheInfo, MULTI_BIDS).result(); // then final ArgumentCaptor> bidsArgumentCaptor = ArgumentCaptor.forClass(List.class); @@ -2763,11 +2792,16 @@ public void shouldPopulateBidResponseExtension() { .imp(singletonList(givenImp())) .build(); - final Bid bid = Bid.builder().id("bidId1").impid(IMP_ID).adm("[]").price(BigDecimal.valueOf(5.67)).build(); + final Bid bid = Bid.builder() + .id("bidId1") + .impid(IMP_ID) + .adm("[]") + .price(BigDecimal.valueOf(5.67)) + .build(); final List bidderResponses = singletonList(BidderResponse.of( "bidder1", BidderSeatBid.builder() - .bids(singletonList(BidderBid.of(bid, xNative, null))) + .bids(singletonList(BidderBid.of(bid, xNative, "seat", null))) .errors(singletonList(BidderError.badInput("bad_input"))) .warnings(singletonList(BidderError.generic("some_warning"))) .build(), @@ -2784,19 +2818,19 @@ public void shouldPopulateBidResponseExtension() { new RuntimeException("cacheError"), emptyMap())); // when - final BidResponse bidResponse = target.create(auctionContext, cacheInfo, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, cacheInfo, MULTI_BIDS).result(); // then final ExtBidResponse responseExt = bidResponse.getExt(); assertThat(responseExt.getDebug()).isNull(); assertThat(responseExt.getWarnings()) - .containsEntry("bidder1", singletonList(ExtBidderError.of(999, "some_warning"))); + .containsEntry("seat", singletonList(ExtBidderError.of(999, "some_warning"))); assertThat(responseExt.getUsersync()).isNull(); assertThat(responseExt.getTmaxrequest()).isEqualTo(1000L); assertThat(responseExt.getErrors()).hasSize(2).containsOnly( - entry("bidder1", asList( + entry("seat", asList( ExtBidderError.of(2, "bad_input"), ExtBidderError.of(3, "Failed to decode: Cannot deserialize value" + " of type `com.iab.openrtb.response.Response` from Array value " @@ -2805,7 +2839,7 @@ public void shouldPopulateBidResponseExtension() { entry("cache", singletonList(ExtBidderError.of(999, "cacheError")))); assertThat(responseExt.getResponsetimemillis()).hasSize(2) - .containsOnly(entry("bidder1", 100), entry("cache", 666)); + .containsOnly(entry("seat", 100), entry("cache", 666)); verify(coreCacheService).cacheBidsOpenrtb(anyList(), any(), any(), any()); } @@ -2817,7 +2851,7 @@ public void shouldPopulateBidExpBasedOnCachedResult() { final Imp imp = Imp.builder().id("impId").exp(20).build(); final List bidderResponses = asList(BidderResponse.of( "bidder1", - givenSeatBid(BidderBid.of(bid, banner, "USD")), + givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final BidRequestCacheInfo cacheInfo = BidRequestCacheInfo.builder() @@ -2846,7 +2880,7 @@ public void shouldPopulateBidExpBasedOnCachedResult() { given(mediaTypeCacheTtl.getBannerCacheTtl()).willReturn(50); // when - final Future response = target.create(auctionContext, cacheInfo, aliases, MULTI_BIDS); + final Future response = target.create(auctionContext, cacheInfo, MULTI_BIDS); // then final ArgumentCaptor contextArgumentCaptor = ArgumentCaptor.forClass(CacheContext.class); @@ -2888,7 +2922,7 @@ public void impToStoredVideoJsonShouldTolerateWhenStoredVideoFetchIsFailed() { final Bid bid = Bid.builder().id("bidId1").impid(IMP_ID).price(BigDecimal.valueOf(5.67)).build(); final List bidderResponses = singletonList(BidderResponse.of("bidder1", - givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( givenBidRequest(imp), @@ -2898,7 +2932,7 @@ public void impToStoredVideoJsonShouldTolerateWhenStoredVideoFetchIsFailed() { Future.failedFuture("Fetch failed")); // when - final Future result = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS); + final Future result = target.create(auctionContext, CACHE_INFO, MULTI_BIDS); // then verify(storedRequestProcessor).videoStoredDataResult(any(), eq(singletonList(imp)), anyList(), eq(timeout)); @@ -2937,9 +2971,9 @@ public void impToStoredVideoJsonShouldInjectStoredVideoWhenExtOptionsIsTrueAndVi final Bid bid2 = Bid.builder().id("bidId2").impid("impId2").price(BigDecimal.valueOf(2)).build(); final Bid bid3 = Bid.builder().id("bidId3").impid("impId3").price(BigDecimal.valueOf(3)).build(); final List bidderBids = mutableList( - BidderBid.of(bid1, banner, "USD"), - BidderBid.of(bid2, banner, "USD"), - BidderBid.of(bid3, banner, "USD")); + BidderBid.of(bid1, banner, "seat", "USD"), + BidderBid.of(bid2, banner, "seat", "USD"), + BidderBid.of(bid3, banner, "seat", "USD")); final List bidderResponses = singletonList( BidderResponse.of("bidder1", BidderSeatBid.of(bidderBids), 100)); @@ -2955,7 +2989,7 @@ public void impToStoredVideoJsonShouldInjectStoredVideoWhenExtOptionsIsTrueAndVi givenCacheServiceResult(emptyList()); // when - final Future result = target.create(auctionContext, cacheInfo, aliases, MULTI_BIDS); + final Future result = target.create(auctionContext, cacheInfo, MULTI_BIDS); // then verify(storedRequestProcessor).videoStoredDataResult(any(), eq(asList(imp1, imp3)), anyList(), @@ -2988,7 +3022,7 @@ public void impToStoredVideoJsonShouldAddErrorsWithPrebidBidderWhenStoredVideoRe final BidRequest bidRequest = givenBidRequest(imp1); final Bid bid1 = Bid.builder().id("bidId1").impid(IMP_ID).price(BigDecimal.valueOf(5.67)).build(); - final List bidderBids = singletonList(BidderBid.of(bid1, banner, "USD")); + final List bidderBids = singletonList(BidderBid.of(bid1, banner, "seat", "USD")); final List bidderResponses = singletonList( BidderResponse.of("bidder1", BidderSeatBid.of(bidderBids), 100)); @@ -3000,7 +3034,7 @@ public void impToStoredVideoJsonShouldAddErrorsWithPrebidBidderWhenStoredVideoRe .willReturn(Future.failedFuture("Bad timeout")); // when - final Future result = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS); + final Future result = target.create(auctionContext, CACHE_INFO, MULTI_BIDS); // then verify(storedRequestProcessor).videoStoredDataResult(any(), eq(singletonList(imp1)), anyList(), eq(timeout)); @@ -3009,7 +3043,7 @@ public void impToStoredVideoJsonShouldAddErrorsWithPrebidBidderWhenStoredVideoRe ExtBidResponse.builder() .errors(singletonMap("prebid", singletonList(ExtBidderError.of(BidderError.Type.generic.getCode(), "Bad timeout")))) - .responsetimemillis(singletonMap("bidder1", 100)) + .responsetimemillis(singletonMap("seat", 100)) .tmaxrequest(1000L) .prebid(ExtBidResponsePrebid.builder().auctiontimestamp(1000L).build()) .build()); @@ -3039,7 +3073,7 @@ public void shouldProcessRequestAndAddErrorAboutDeprecatedBidder() { "invalid has been deprecated and is no longer available. Use valid instead."); // when - final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then assertThat(bidResponse.getExt()).isEqualTo( @@ -3059,7 +3093,7 @@ public void shouldProcessRequestAndAddErrorAboutDeprecatedBidder() { public void shouldProcessRequestAndAddErrorFromAuctionContext() { // given final Bid bid1 = Bid.builder().id("bidId1").impid(IMP_ID).price(BigDecimal.valueOf(5.67)).build(); - final List bidderBids = singletonList(BidderBid.of(bid1, banner, "USD")); + final List bidderBids = singletonList(BidderBid.of(bid1, banner, "seat", "USD")); final List bidderResponses = singletonList( BidderResponse.of("bidder1", BidderSeatBid.of(bidderBids), 100)); @@ -3070,7 +3104,7 @@ public void shouldProcessRequestAndAddErrorFromAuctionContext() { .auctionParticipations(toAuctionParticipant(bidderResponses))); // when - final Future result = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS); + final Future result = target.create(auctionContext, CACHE_INFO, MULTI_BIDS); // then assertThat(result.result().getExt()).isEqualTo( @@ -3078,7 +3112,7 @@ public void shouldProcessRequestAndAddErrorFromAuctionContext() { .errors(singletonMap( "prebid", singletonList(ExtBidderError.of(BidderError.Type.generic.getCode(), "privacy error")))) - .responsetimemillis(singletonMap("bidder1", 100)) + .responsetimemillis(singletonMap("seat", 100)) .tmaxrequest(1000L) .prebid(ExtBidResponsePrebid.builder().auctiontimestamp(1000L).build()) .build()); @@ -3105,7 +3139,7 @@ public void shouldPopulateResponseDebugExtensionAndWarningsIfDebugIsEnabled() { final List bidderResponses = singletonList(BidderResponse.of( "bidder1", BidderSeatBid.builder() - .bids(singletonList(BidderBid.of(bid, banner, null))) + .bids(singletonList(BidderBid.of(bid, banner, "seat", null))) .httpCalls(singletonList(ExtHttpCall.builder().status(200).build())) .build(), 100)); @@ -3125,7 +3159,7 @@ public void shouldPopulateResponseDebugExtensionAndWarningsIfDebugIsEnabled() { .build())); // when - final BidResponse bidResponse = target.create(auctionContext, cacheInfo, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, cacheInfo, MULTI_BIDS).result(); // then final ExtBidResponse responseExt = bidResponse.getExt(); @@ -3133,7 +3167,7 @@ public void shouldPopulateResponseDebugExtensionAndWarningsIfDebugIsEnabled() { assertThat(responseExt.getDebug()).isNotNull(); assertThat(responseExt.getDebug().getHttpcalls()).hasSize(3) .containsOnly( - entry("bidder1", singletonList(ExtHttpCall.builder().status(200).build())), + entry("seat", singletonList(ExtHttpCall.builder().status(200).build())), entry("cache", singletonList(ExtHttpCall.builder().uri("test.uri").status(500).build())), entry("userservice", singletonList(ExtHttpCall.builder().uri("userservice.uri").status(500) .build()))); @@ -3169,7 +3203,7 @@ public void shouldPassIntegrationToCacheServiceAndBidEvents() { final Bid bid = Bid.builder().id("bidId1").impid(IMP_ID).price(BigDecimal.valueOf(5.67)).build(); final List bidderResponses = singletonList( - BidderResponse.of("bidder1", givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + BidderResponse.of("bidder1", givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( bidRequest, @@ -3187,7 +3221,7 @@ public void shouldPassIntegrationToCacheServiceAndBidEvents() { "http://imp-url?param=value&int=integration")); // when - final Future result = target.create(auctionContext, cacheInfo, aliases, MULTI_BIDS); + final Future result = target.create(auctionContext, cacheInfo, MULTI_BIDS); // then verify(coreCacheService).cacheBidsOpenrtb(anyList(), any(), any(), @@ -3218,6 +3252,7 @@ public void shouldPopulateActivityInfrastructureTraceLogOnSpecifiedTraceLevel() givenSeatBid(BidderBid.of( Bid.builder().id("bidId1").price(BigDecimal.valueOf(5.67)).impid(IMP_ID).build(), banner, + "seat", "USD")), 100)); @@ -3229,7 +3264,7 @@ public void shouldPopulateActivityInfrastructureTraceLogOnSpecifiedTraceLevel() .auctionParticipations(toAuctionParticipant(bidderResponses))); // when - final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then assertThat(bidResponse) @@ -3256,14 +3291,14 @@ public void shouldPopulateBidResponseExtErrorIfImpExtIsInvalid() { final Bid bid = Bid.builder().id("bidId1").price(BigDecimal.valueOf(5.67)).impid(IMP_ID).build(); final List bidderResponses = singletonList(BidderResponse.of("bidder1", - givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( bidRequest, contextBuilder -> contextBuilder.auctionParticipations(toAuctionParticipant(bidderResponses))); // when - final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then assertThat(bidResponse.getExt().getErrors().get("prebid").getFirst().getMessage()).isEqualTo(errorMessage); @@ -3276,14 +3311,14 @@ public void shouldThrowErrorIfBidIdAndCorrespondingImpIdNotEquals() { final Bid bid = Bid.builder().id("bidId1").price(BigDecimal.valueOf(5.67)).impid("123").build(); final List bidderResponses = singletonList(BidderResponse.of("bidder1", - givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( bidRequest, contextBuilder -> contextBuilder.auctionParticipations(toAuctionParticipant(bidderResponses))); // when - final Future bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS); + final Future bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS); // when assertThat(bidResponse.failed()).isTrue(); @@ -3303,21 +3338,20 @@ public void shouldThrowExceptionWhenBidAdmIsParsedButImpNativeNotFound() throws .build())) .build(); - final String bidder1 = "bidder1"; - final List bidderResponses = List.of(BidderResponse.of(bidder1, - givenSeatBid(BidderBid.of(bid, xNative, "USD")), 100)); + final List bidderResponses = List.of(BidderResponse.of("bidder1", + givenSeatBid(BidderBid.of(bid, xNative, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( givenBidRequest(givenImp("impId1")), contextBuilder -> contextBuilder.auctionParticipations(toAuctionParticipant(bidderResponses))); // when - final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then assertThat(bidResponse.getExt()) .extracting(ExtBidResponse::getErrors) - .extracting(error -> error.get(bidder1)) + .extracting(error -> error.get("seat")) .extracting(extBidderErrors -> extBidderErrors.getFirst()) .isEqualTo(ExtBidderError.of(3, "Could not find native imp")); @@ -3336,9 +3370,8 @@ public void shouldThrowExceptionWhenNativeRequestIsInvalid() throws JsonProcessi .build())) .build(); - final String bidder1 = "bidder1"; - final List bidderResponses = List.of(BidderResponse.of(bidder1, - givenSeatBid(BidderBid.of(bid, xNative, "USD")), 100)); + final List bidderResponses = List.of(BidderResponse.of("bidder1", + givenSeatBid(BidderBid.of(bid, xNative, "seat", "USD")), 100)); final ObjectNode customObjectNode = mapper.createObjectNode(); customObjectNode.set("test-field", mapper @@ -3353,12 +3386,12 @@ public void shouldThrowExceptionWhenNativeRequestIsInvalid() throws JsonProcessi contextBuilder -> contextBuilder.auctionParticipations(toAuctionParticipant(bidderResponses))); // when - final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then assertThat(bidResponse.getExt()) .extracting(ExtBidResponse::getErrors) - .extracting(error -> error.get(bidder1)) + .extracting(error -> error.get("seat")) .extracting(extBidderErrors -> extBidderErrors.getFirst()) .isEqualTo(ExtBidderError.of(3, "No content to map due to end-of-input\n" + " at [Source: (String)\"\"; line: 1, column: 0]")); @@ -3382,7 +3415,7 @@ public void shouldPopulateBidAdmIfResponseAssetsIsNull() throws JsonProcessingEx final String bidder1 = "bidder1"; final List bidderResponses = List.of(BidderResponse.of(bidder1, - givenSeatBid(BidderBid.of(bid, xNative, "USD")), 100)); + givenSeatBid(BidderBid.of(bid, xNative, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( givenBidRequest(Imp.builder() @@ -3392,7 +3425,7 @@ public void shouldPopulateBidAdmIfResponseAssetsIsNull() throws JsonProcessingEx contextBuilder -> contextBuilder.auctionParticipations(toAuctionParticipant(bidderResponses))); // when - final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then assertThat(bidResponse) @@ -3420,7 +3453,7 @@ public void shouldPopulateEventsContextForRequestIfEventsEnabledForRequest() { final Bid bid = Bid.builder().id("bidId1").impid(IMP_ID).price(BigDecimal.valueOf(5.67)).build(); final List bidderResponses = singletonList( - BidderResponse.of("bidder1", givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + BidderResponse.of("bidder1", givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( givenBidRequest(bidRequestBuilder -> @@ -3439,7 +3472,7 @@ public void shouldPopulateEventsContextForRequestIfEventsEnabledForRequest() { .willReturn(givenEvents); // when - final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then assertThat(bidResponse.getSeatbid()) @@ -3458,7 +3491,7 @@ public void shouldNotPopulateBidExtTargetingWhenExtRequestTargetingPricegranular final Bid bidder1Bid1 = Bid.builder().id("bidder1Bid1").price(BigDecimal.valueOf(3.67)).impid("i1").build(); final List bidderResponses = singletonList( - BidderResponse.of("bidder1", givenSeatBid(BidderBid.of(bidder1Bid1, banner, null)), 100)); + BidderResponse.of("bidder1", givenSeatBid(BidderBid.of(bidder1Bid1, banner, "seat", null)), 100)); final AuctionContext auctionContext = givenAuctionContext( givenBidRequest( @@ -3468,7 +3501,7 @@ public void shouldNotPopulateBidExtTargetingWhenExtRequestTargetingPricegranular contextBuilder -> contextBuilder.auctionParticipations(toAuctionParticipant(bidderResponses))); // when - final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then final ObjectNode givenDefaultBidExt = @@ -3493,7 +3526,7 @@ public void shouldNotPopulateBidExtTargetingWhenExtRequestTargetingSettingsIsFal final Bid bidder1Bid1 = Bid.builder().id("bidder1Bid1").price(BigDecimal.valueOf(3.67)).impid("i1").build(); final List bidderResponses = singletonList( - BidderResponse.of("bidder1", givenSeatBid(BidderBid.of(bidder1Bid1, banner, null)), 100)); + BidderResponse.of("bidder1", givenSeatBid(BidderBid.of(bidder1Bid1, banner, "seat", null)), 100)); final AuctionContext auctionContext = givenAuctionContext( givenBidRequest( @@ -3503,7 +3536,7 @@ public void shouldNotPopulateBidExtTargetingWhenExtRequestTargetingSettingsIsFal contextBuilder -> contextBuilder.auctionParticipations(toAuctionParticipant(bidderResponses))); // when - final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then final ObjectNode givenDefaultBidExt = @@ -3519,7 +3552,7 @@ public void shouldCopyRequestExtPrebidPassThroughToResponseExtPrebidPassThroughW // given final Bid bid = Bid.builder().id("bidder1Bid1").price(BigDecimal.valueOf(3.67)).impid("i1").build(); final List bidderResponses = singletonList( - BidderResponse.of("bidder1", givenSeatBid(BidderBid.of(bid, banner, null)), 100)); + BidderResponse.of("bidder1", givenSeatBid(BidderBid.of(bid, banner, "seat", null)), 100)); final AuctionContext auctionContext = givenAuctionContext( givenBidRequest( @@ -3529,7 +3562,7 @@ public void shouldCopyRequestExtPrebidPassThroughToResponseExtPrebidPassThroughW contextBuilder -> contextBuilder.auctionParticipations(toAuctionParticipant(bidderResponses))); // when - final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then assertThat(bidResponse.getExt()) @@ -3550,7 +3583,7 @@ public void shouldCopyImpExtPrebidPassThroughToResponseBidExtPrebidPassThroughWh final Bid bid = Bid.builder().id("bidder1Bid1").price(BigDecimal.valueOf(3.67)).impid("i1").build(); final List bidderResponses = singletonList( - BidderResponse.of("bidder1", givenSeatBid(BidderBid.of(bid, banner, null)), 100)); + BidderResponse.of("bidder1", givenSeatBid(BidderBid.of(bid, banner, "seat", null)), 100)); final AuctionContext auctionContext = givenAuctionContext( givenBidRequest( @@ -3560,7 +3593,7 @@ public void shouldCopyImpExtPrebidPassThroughToResponseBidExtPrebidPassThroughWh contextBuilder -> contextBuilder.auctionParticipations(toAuctionParticipant(bidderResponses))); // when - final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then assertThat(bidResponse.getSeatbid()) @@ -3573,17 +3606,23 @@ public void shouldCopyImpExtPrebidPassThroughToResponseBidExtPrebidPassThroughWh @Test public void shouldAddExtPrebidFledgeIfAvailable() { // given - given(bidderCatalog.resolveBaseBidder("bidder1")).willReturn("adapter1"); final Imp imp = givenImp("i1").toBuilder() .ext(mapper.createObjectNode().put("ae", 1)) .build(); final BidRequest bidRequest = givenBidRequest(identity(), identity(), imp); final FledgeAuctionConfig fledgeAuctionConfig = givenFledgeAuctionConfig("i1"); - final Bid bid = Bid.builder().id("bidId1").price(BigDecimal.valueOf(2.37)).impid("i1").build(); + final Bid bid = Bid.builder() + .id("bidId1") + .price(BigDecimal.valueOf(2.37)) + .impid("i1") + .ext(mapper.createObjectNode().set("prebid", mapper.valueToTree(ExtBidPrebid.builder() + .meta(ExtBidPrebidMeta.builder().adapterCode("adapter1").build()) + .build()))) + .build(); final List bidderResponses = singletonList( BidderResponse.of("bidder1", BidderSeatBid.builder() - .bids(List.of(BidderBid.of(bid, banner, "USD"))) + .bids(List.of(BidderBid.of(bid, banner, "seat", "USD"))) .fledgeAuctionConfigs(List.of(fledgeAuctionConfig)) .build(), 100)); @@ -3593,7 +3632,7 @@ public void shouldAddExtPrebidFledgeIfAvailable() { // when final BidResponse bidResponse = target - .create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS) + .create(auctionContext, CACHE_INFO, MULTI_BIDS) .result(); // then @@ -3602,7 +3641,7 @@ public void shouldAddExtPrebidFledgeIfAvailable() { .first() .usingRecursiveComparison() .isEqualTo(fledgeAuctionConfig.toBuilder() - .bidder("bidder1") + .bidder("seat") .adapter("adapter1") .build()); } @@ -3610,7 +3649,6 @@ public void shouldAddExtPrebidFledgeIfAvailable() { @Test public void shouldAddExtIgiIfAvailableAndExtRequestPrebidPaaFormatIsIab() { // given - given(bidderCatalog.resolveBaseBidder("bidder1")).willReturn("adapter1"); final Imp imp = givenImp("i1").toBuilder() .ext(mapper.createObjectNode().put("ae", 1)) .build(); @@ -3620,11 +3658,18 @@ public void shouldAddExtIgiIfAvailableAndExtRequestPrebidPaaFormatIsIab() { .igs(singletonList(ExtIgiIgs.builder().impId("impId").config(mapper.createObjectNode()).build())) .build(); - final Bid bid = Bid.builder().id("bidId1").price(BigDecimal.valueOf(2.37)).impid("i1").build(); + final Bid bid = Bid.builder() + .id("bidId1") + .price(BigDecimal.valueOf(2.37)) + .impid("i1") + .ext(mapper.createObjectNode().set("prebid", mapper.valueToTree(ExtBidPrebid.builder() + .meta(ExtBidPrebidMeta.builder().adapterCode("adapter1").build()) + .build()))) + .build(); final List bidderResponses = singletonList( BidderResponse.of("bidder1", BidderSeatBid.builder() - .bids(List.of(BidderBid.of(bid, banner, "USD"))) + .bids(List.of(BidderBid.of(bid, banner, "seat", "USD"))) .igi(singletonList(igi)) .build(), 100)); @@ -3634,7 +3679,7 @@ public void shouldAddExtIgiIfAvailableAndExtRequestPrebidPaaFormatIsIab() { // when final BidResponse bidResponse = target - .create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS) + .create(auctionContext, CACHE_INFO, MULTI_BIDS) .result(); // then @@ -3644,7 +3689,7 @@ public void shouldAddExtIgiIfAvailableAndExtRequestPrebidPaaFormatIsIab() { .igs(singletonList(ExtIgiIgs.builder() .impId("impId") .config(mapper.createObjectNode()) - .ext(ExtIgiIgsExt.of("bidder1", "adapter1")) + .ext(ExtIgiIgsExt.of("seat", "adapter1")) .build())) .build()); } @@ -3652,7 +3697,6 @@ public void shouldAddExtIgiIfAvailableAndExtRequestPrebidPaaFormatIsIab() { @Test public void shouldAddExtPrebidFledgeIfAvailableAndExtRequestPrebidPaaFormatIsOriginal() { // given - given(bidderCatalog.resolveBaseBidder("bidder1")).willReturn("adapter1"); final Imp imp = givenImp("impId").toBuilder() .ext(mapper.createObjectNode().put("ae", 1)) .build(); @@ -3662,11 +3706,18 @@ public void shouldAddExtPrebidFledgeIfAvailableAndExtRequestPrebidPaaFormatIsOri .igs(singletonList(ExtIgiIgs.builder().impId("impId").config(mapper.createObjectNode()).build())) .build(); - final Bid bid = Bid.builder().id("bidId1").price(BigDecimal.valueOf(2.37)).impid("impId").build(); + final Bid bid = Bid.builder() + .id("bidId1") + .price(BigDecimal.valueOf(2.37)) + .ext(mapper.createObjectNode().set("prebid", mapper.valueToTree(ExtBidPrebid.builder() + .meta(ExtBidPrebidMeta.builder().adapterCode("adapter1").build()) + .build()))) + .impid("impId") + .build(); final List bidderResponses = singletonList( BidderResponse.of("bidder1", BidderSeatBid.builder() - .bids(List.of(BidderBid.of(bid, banner, "USD"))) + .bids(List.of(BidderBid.of(bid, banner, "seat", "USD"))) .igi(singletonList(igi)) .build(), 100)); @@ -3676,7 +3727,7 @@ public void shouldAddExtPrebidFledgeIfAvailableAndExtRequestPrebidPaaFormatIsOri // when final BidResponse bidResponse = target - .create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS) + .create(auctionContext, CACHE_INFO, MULTI_BIDS) .result(); // then @@ -3689,7 +3740,7 @@ public void shouldAddExtPrebidFledgeIfAvailableAndExtRequestPrebidPaaFormatIsOri FledgeAuctionConfig.builder() .impId("impId") .config(mapper.createObjectNode()) - .bidder("bidder1") + .bidder("seat") .adapter("adapter1") .build()); } @@ -3697,7 +3748,6 @@ public void shouldAddExtPrebidFledgeIfAvailableAndExtRequestPrebidPaaFormatIsOri @Test public void shouldAddExtIgiIfAvailableAndExtRequestPrebidPaaFormatIsAbsentAndAccountConfigPaaFormatSetToIab() { // given - given(bidderCatalog.resolveBaseBidder("bidder1")).willReturn("adapter1"); final Imp imp = givenImp("impId").toBuilder() .ext(mapper.createObjectNode().put("ae", 1)) .build(); @@ -3707,11 +3757,18 @@ public void shouldAddExtIgiIfAvailableAndExtRequestPrebidPaaFormatIsAbsentAndAcc .igs(singletonList(ExtIgiIgs.builder().impId("impId").config(mapper.createObjectNode()).build())) .build(); - final Bid bid = Bid.builder().id("bidId1").price(BigDecimal.valueOf(2.37)).impid("impId").build(); + final Bid bid = Bid.builder() + .id("bidId1") + .price(BigDecimal.valueOf(2.37)) + .impid("impId") + .ext(mapper.createObjectNode().set("prebid", mapper.valueToTree(ExtBidPrebid.builder() + .meta(ExtBidPrebidMeta.builder().adapterCode("adapter1").build()) + .build()))) + .build(); final List bidderResponses = singletonList( BidderResponse.of("bidder1", BidderSeatBid.builder() - .bids(List.of(BidderBid.of(bid, banner, "USD"))) + .bids(List.of(BidderBid.of(bid, banner, "seat", "USD"))) .igi(singletonList(igi)) .build(), 100)); @@ -3725,7 +3782,7 @@ public void shouldAddExtIgiIfAvailableAndExtRequestPrebidPaaFormatIsAbsentAndAcc // when final BidResponse bidResponse = target - .create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS) + .create(auctionContext, CACHE_INFO, MULTI_BIDS) .result(); // then @@ -3735,7 +3792,7 @@ public void shouldAddExtIgiIfAvailableAndExtRequestPrebidPaaFormatIsAbsentAndAcc .igs(singletonList(ExtIgiIgs.builder() .impId("impId") .config(mapper.createObjectNode()) - .ext(ExtIgiIgsExt.of("bidder1", "adapter1")) + .ext(ExtIgiIgsExt.of("seat", "adapter1")) .build())) .build()); } @@ -3743,7 +3800,6 @@ public void shouldAddExtIgiIfAvailableAndExtRequestPrebidPaaFormatIsAbsentAndAcc @Test public void shouldAddExtPrebidFledgeIfAvailableAndRequestPaaFormatIsAbsentAndAccountConfigPaaFormatSetToOriginal() { // given - given(bidderCatalog.resolveBaseBidder("bidder1")).willReturn("adapter1"); final Imp imp = givenImp("impId").toBuilder() .ext(mapper.createObjectNode().put("ae", 1)) .build(); @@ -3753,11 +3809,18 @@ public void shouldAddExtPrebidFledgeIfAvailableAndRequestPaaFormatIsAbsentAndAcc .igs(singletonList(ExtIgiIgs.builder().impId("impId").config(mapper.createObjectNode()).build())) .build(); - final Bid bid = Bid.builder().id("bidId1").price(BigDecimal.valueOf(2.37)).impid("impId").build(); + final Bid bid = Bid.builder() + .id("bidId1") + .price(BigDecimal.valueOf(2.37)) + .ext(mapper.createObjectNode().set("prebid", mapper.valueToTree(ExtBidPrebid.builder() + .meta(ExtBidPrebidMeta.builder().adapterCode("adapter1").build()) + .build()))) + .impid("impId") + .build(); final List bidderResponses = singletonList( BidderResponse.of("bidder1", BidderSeatBid.builder() - .bids(List.of(BidderBid.of(bid, banner, "USD"))) + .bids(List.of(BidderBid.of(bid, banner, "seat", "USD"))) .igi(singletonList(igi)) .build(), 100)); @@ -3771,7 +3834,7 @@ public void shouldAddExtPrebidFledgeIfAvailableAndRequestPaaFormatIsAbsentAndAcc // when final BidResponse bidResponse = target - .create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS) + .create(auctionContext, CACHE_INFO, MULTI_BIDS) .result(); // then @@ -3784,7 +3847,7 @@ public void shouldAddExtPrebidFledgeIfAvailableAndRequestPaaFormatIsAbsentAndAcc FledgeAuctionConfig.builder() .impId("impId") .config(mapper.createObjectNode()) - .bidder("bidder1") + .bidder("seat") .adapter("adapter1") .build()); } @@ -3792,7 +3855,6 @@ public void shouldAddExtPrebidFledgeIfAvailableAndRequestPaaFormatIsAbsentAndAcc @Test public void shouldDefaultToOriginalPaaFormat() { // given - given(bidderCatalog.resolveBaseBidder("bidder1")).willReturn("adapter1"); final Imp imp = givenImp("impId").toBuilder() .ext(mapper.createObjectNode().put("ae", 1)) .build(); @@ -3802,11 +3864,18 @@ public void shouldDefaultToOriginalPaaFormat() { .igs(singletonList(ExtIgiIgs.builder().impId("impId").config(mapper.createObjectNode()).build())) .build(); - final Bid bid = Bid.builder().id("bidId1").price(BigDecimal.valueOf(2.37)).impid("impId").build(); + final Bid bid = Bid.builder() + .id("bidId1") + .price(BigDecimal.valueOf(2.37)) + .impid("impId") + .ext(mapper.createObjectNode().set("prebid", mapper.valueToTree(ExtBidPrebid.builder() + .meta(ExtBidPrebidMeta.builder().adapterCode("adapter1").build()) + .build()))) + .build(); final List bidderResponses = singletonList( BidderResponse.of("bidder1", BidderSeatBid.builder() - .bids(List.of(BidderBid.of(bid, banner, "USD"))) + .bids(List.of(BidderBid.of(bid, banner, "seat", "USD"))) .igi(singletonList(igi)) .build(), 100)); @@ -3816,7 +3885,7 @@ public void shouldDefaultToOriginalPaaFormat() { // when final BidResponse bidResponse = target - .create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS) + .create(auctionContext, CACHE_INFO, MULTI_BIDS) .result(); // then @@ -3829,7 +3898,7 @@ public void shouldDefaultToOriginalPaaFormat() { FledgeAuctionConfig.builder() .impId("impId") .config(mapper.createObjectNode()) - .bidder("bidder1") + .bidder("seat") .adapter("adapter1") .build()); } @@ -3837,7 +3906,6 @@ public void shouldDefaultToOriginalPaaFormat() { @Test public void shouldDropExtIgiIgbIfAvailableAndExtIgiImpIdIsAbsent() { // given - given(bidderCatalog.resolveBaseBidder("bidder1")).willReturn("adapter1"); final Imp imp = givenImp("impId").toBuilder() .ext(mapper.createObjectNode().put("ae", 1)) .build(); @@ -3847,11 +3915,18 @@ public void shouldDropExtIgiIgbIfAvailableAndExtIgiImpIdIsAbsent() { .igb(singletonList(ExtIgiIgb.builder().build())) .build(); - final Bid bid = Bid.builder().id("bidId1").price(BigDecimal.valueOf(2.37)).impid("impId").build(); + final Bid bid = Bid.builder() + .id("bidId1") + .price(BigDecimal.valueOf(2.37)) + .impid("impId") + .ext(mapper.createObjectNode().set("prebid", mapper.valueToTree(ExtBidPrebid.builder() + .meta(ExtBidPrebidMeta.builder().adapterCode("adapter1").build()) + .build()))) + .build(); final List bidderResponses = singletonList( BidderResponse.of("bidder1", BidderSeatBid.builder() - .bids(List.of(BidderBid.of(bid, banner, "USD"))) + .bids(List.of(BidderBid.of(bid, banner, "seat", "USD"))) .igi(singletonList(igi)) .build(), 100)); @@ -3863,7 +3938,7 @@ public void shouldDropExtIgiIgbIfAvailableAndExtIgiImpIdIsAbsent() { // when final BidResponse bidResponse = target - .create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS) + .create(auctionContext, CACHE_INFO, MULTI_BIDS) .result(); // then @@ -3876,7 +3951,7 @@ public void shouldDropExtIgiIgbIfAvailableAndExtIgiImpIdIsAbsent() { ExtIgiIgs.builder() .impId("impId") .config(mapper.createObjectNode()) - .ext(ExtIgiIgsExt.of("bidder1", "adapter1")) + .ext(ExtIgiIgsExt.of("seat", "adapter1")) .build())) .build()); @@ -3887,7 +3962,7 @@ public void shouldDropExtIgiIgbIfAvailableAndExtIgiImpIdIsAbsent() { .containsExactly( ExtBidderError.of( BidderError.Type.generic.getCode(), - "ExtIgi with absent impId from bidder: bidder1")); + "ExtIgi with absent impId from bidder: seat")); verify(metrics).updateAlertsMetrics(MetricName.general); } @@ -3904,11 +3979,17 @@ public void shouldDropExtIgiIgsIfAvailableAndExtIgiIgsImpIdIsAbsent() { .igb(singletonList(ExtIgiIgb.builder().build())) .build(); - final Bid bid = Bid.builder().id("bidId1").price(BigDecimal.valueOf(2.37)).impid("impId").build(); + final Bid bid = Bid.builder() + .id("bidId1") + .price(BigDecimal.valueOf(2.37)) + .ext(mapper.createObjectNode().set("prebid", mapper.valueToTree(ExtBidPrebid.builder() + .meta(ExtBidPrebidMeta.builder().adapterCode("adapter1").build()) + .build()))) + .impid("impId").build(); final List bidderResponses = singletonList( BidderResponse.of("bidder1", BidderSeatBid.builder() - .bids(List.of(BidderBid.of(bid, banner, "USD"))) + .bids(List.of(BidderBid.of(bid, banner, "seat", "USD"))) .igi(singletonList(igi)) .build(), 100)); @@ -3920,7 +4001,7 @@ public void shouldDropExtIgiIgsIfAvailableAndExtIgiIgsImpIdIsAbsent() { // when final BidResponse bidResponse = target - .create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS) + .create(auctionContext, CACHE_INFO, MULTI_BIDS) .result(); // then @@ -3940,7 +4021,7 @@ public void shouldDropExtIgiIgsIfAvailableAndExtIgiIgsImpIdIsAbsent() { .containsExactly( ExtBidderError.of( BidderError.Type.generic.getCode(), - "ExtIgiIgs with absent impId from bidder: bidder1")); + "ExtIgiIgs with absent impId from bidder: seat")); verify(metrics).updateAlertsMetrics(MetricName.general); } @@ -3961,7 +4042,7 @@ public void shouldDropExtIgiIgsIfAvailableAndExtIgiIgsConfigIsAbsent() { final List bidderResponses = singletonList( BidderResponse.of("bidder1", BidderSeatBid.builder() - .bids(List.of(BidderBid.of(bid, banner, "USD"))) + .bids(List.of(BidderBid.of(bid, banner, "seat", "USD"))) .igi(singletonList(igi)) .build(), 100)); @@ -3973,7 +4054,7 @@ public void shouldDropExtIgiIgsIfAvailableAndExtIgiIgsConfigIsAbsent() { // when final BidResponse bidResponse = target - .create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS) + .create(auctionContext, CACHE_INFO, MULTI_BIDS) .result(); // then @@ -3993,7 +4074,7 @@ public void shouldDropExtIgiIgsIfAvailableAndExtIgiIgsConfigIsAbsent() { .containsExactly( ExtBidderError.of( BidderError.Type.generic.getCode(), - "ExtIgiIgs with absent config from bidder: bidder1")); + "ExtIgiIgs with absent config from bidder: seat")); verify(metrics).updateAlertsMetrics(MetricName.general); } @@ -4012,7 +4093,7 @@ public void shouldDropExtIgiIfAvailableAndExtIgiIgsAndExtIgiIgbAreAbsent() { final List bidderResponses = singletonList( BidderResponse.of("bidder1", BidderSeatBid.builder() - .bids(List.of(BidderBid.of(bid, banner, "USD"))) + .bids(List.of(BidderBid.of(bid, banner, "seat", "USD"))) .igi(singletonList(igi)) .build(), 100)); @@ -4024,7 +4105,7 @@ public void shouldDropExtIgiIfAvailableAndExtIgiIgsAndExtIgiIgbAreAbsent() { // when final BidResponse bidResponse = target - .create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS) + .create(auctionContext, CACHE_INFO, MULTI_BIDS) .result(); // then @@ -4036,7 +4117,6 @@ public void shouldDropExtIgiIfAvailableAndExtIgiIgsAndExtIgiIgbAreAbsent() { @Test public void shouldAddExtPrebidFledgeIfAvailableEvenIfBidsEmpty() { // given - given(bidderCatalog.resolveBaseBidder("bidder1")).willReturn("adapter1"); final Imp imp = givenImp("i1").toBuilder() .ext(mapper.createObjectNode().put("ae", 1)) .build(); @@ -4055,7 +4135,7 @@ public void shouldAddExtPrebidFledgeIfAvailableEvenIfBidsEmpty() { // when final BidResponse bidResponse = target - .create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS) + .create(auctionContext, CACHE_INFO, MULTI_BIDS) .result(); // then @@ -4065,7 +4145,7 @@ public void shouldAddExtPrebidFledgeIfAvailableEvenIfBidsEmpty() { .usingRecursiveComparison() .isEqualTo(fledgeAuctionConfig.toBuilder() .bidder("bidder1") - .adapter("adapter1") + .adapter("bidder1") .build()); } @@ -4088,7 +4168,7 @@ public void shouldDropFledgeResponsesReferencingUnknownImps() { // when final BidResponse bidResponse = target - .create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS) + .create(auctionContext, CACHE_INFO, MULTI_BIDS) .result(); // then @@ -4100,13 +4180,14 @@ public void shouldDropFledgeResponsesReferencingUnknownImps() { public void shouldPopulateExtPrebidSeatNonBidWhenReturnAllBidStatusFlagIsTrue() { // given final BidRejectionTracker bidRejectionTracker = mock(BidRejectionTracker.class); - given(bidRejectionTracker.getRejectedImps()).willReturn(singletonMap("impId2", BidRejectionReason.NO_BID)); + given(bidRejectionTracker.getRejectedImps()) + .willReturn(singletonMap("impId2", Pair.of("someBidder", BidRejectionReason.NO_BID))); final Bid bid = Bid.builder().id("bidId").price(BigDecimal.valueOf(3.67)).impid("impId").build(); final List bidderResponses = singletonList( BidderResponse.of( "someBidder", - givenSeatBid(BidderBid.of(bid, banner, null)), + givenSeatBid(BidderBid.of(bid, banner, "seat", null)), 100)); final List auctionParticipations = toAuctionParticipant(bidderResponses); @@ -4120,7 +4201,7 @@ public void shouldPopulateExtPrebidSeatNonBidWhenReturnAllBidStatusFlagIsTrue() // when final BidResponse bidResponse = target - .create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS) + .create(auctionContext, CACHE_INFO, MULTI_BIDS) .result(); // then @@ -4142,7 +4223,7 @@ public void shouldNotPopulateExtPrebidSeatNonBidWhenReturnAllBidStatusFlagIsFals final List bidderResponses = singletonList( BidderResponse.of( "someBidder", - givenSeatBid(BidderBid.of(bid, banner, null)), + givenSeatBid(BidderBid.of(bid, banner, "seat", null)), 100)); final List auctionParticipations = toAuctionParticipant(bidderResponses); @@ -4155,7 +4236,7 @@ public void shouldNotPopulateExtPrebidSeatNonBidWhenReturnAllBidStatusFlagIsFals // when final BidResponse bidResponse = target - .create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS) + .create(auctionContext, CACHE_INFO, MULTI_BIDS) .result(); // then @@ -4187,7 +4268,7 @@ public void shouldPopulateBidExtWhenExtMediaTypePriceGranularityHasValidVideoExt final Bid bid = Bid.builder().id("bidId").price(BigDecimal.valueOf(5.67)).impid(IMP_ID).build(); final List bidderResponses = singletonList(BidderResponse.of("bidder1", - givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( givenBidRequest( @@ -4197,7 +4278,7 @@ public void shouldPopulateBidExtWhenExtMediaTypePriceGranularityHasValidVideoExt contextBuilder -> contextBuilder.auctionParticipations(toAuctionParticipant(bidderResponses))); // when - final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then assertThat(bidResponse.getSeatbid()) @@ -4207,9 +4288,9 @@ public void shouldPopulateBidExtWhenExtMediaTypePriceGranularityHasValidVideoExt .extracting(Map.Entry::getKey, Map.Entry::getValue) .containsOnly( tuple("hb_pb", "5.00"), - tuple("hb_bidder", "bidder1"), - tuple("hb_pb_bidder1", "5.00"), - tuple("hb_bidder_bidder1", "bidder1")); + tuple("hb_bidder", "seat"), + tuple("hb_pb_seat", "5.00"), + tuple("hb_bidder_seat", "seat")); } @Test @@ -4233,14 +4314,14 @@ public void shouldPopulateBidExtWhenExtMediaTypePriceGranularityHasValidxNativeE final Bid bid = Bid.builder().id("bidId").price(BigDecimal.valueOf(5.67)).impid(IMP_ID).build(); final List bidderResponses = singletonList(BidderResponse.of("bidder1", - givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( givenBidRequest(identity(), extBuilder -> extBuilder.targeting(targeting), givenImp()), context -> context.auctionParticipations(toAuctionParticipant(bidderResponses))); // when - final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then assertThat(bidResponse.getSeatbid()) @@ -4250,9 +4331,9 @@ public void shouldPopulateBidExtWhenExtMediaTypePriceGranularityHasValidxNativeE .extracting(Map.Entry::getKey, Map.Entry::getValue) .containsOnly( tuple("hb_pb", "5.00"), - tuple("hb_bidder", "bidder1"), - tuple("hb_pb_bidder1", "5.00"), - tuple("hb_bidder_bidder1", "bidder1")); + tuple("hb_bidder", "seat"), + tuple("hb_pb_seat", "5.00"), + tuple("hb_bidder_seat", "seat")); } @Test @@ -4276,7 +4357,7 @@ public void shouldThrowErrorIfExtMediaTypePriceGranularityCannotBeParsed() { final Bid bid = Bid.builder().id("bidId").price(BigDecimal.valueOf(5.67)).impid(IMP_ID).build(); final List bidderResponses = singletonList(BidderResponse.of("bidder1", - givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( givenBidRequest( @@ -4286,7 +4367,7 @@ public void shouldThrowErrorIfExtMediaTypePriceGranularityCannotBeParsed() { contextBuilder -> contextBuilder.auctionParticipations(toAuctionParticipant(bidderResponses))); // when - final Future bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS); + final Future bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS); // then assertThat(bidResponse.failed()).isTrue(); @@ -4301,7 +4382,7 @@ public void shouldPopulateTargetingKeywordsWithDefaultPrefixAndRelatedWarning() // given final Bid bid = Bid.builder().id("bidId1").price(BigDecimal.valueOf(5.67)).impid(IMP_ID).build(); final List bidderResponses = singletonList(BidderResponse.of("bidder1", - givenSeatBid(BidderBid.of(bid, banner, "USD")), 100)); + givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final AuctionContext auctionContext = givenAuctionContext( givenBidRequest( identity(), @@ -4311,7 +4392,7 @@ public void shouldPopulateTargetingKeywordsWithDefaultPrefixAndRelatedWarning() contextBuilder -> contextBuilder.auctionParticipations(toAuctionParticipant(bidderResponses))); // when - final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, aliases, MULTI_BIDS).result(); + final BidResponse bidResponse = target.create(auctionContext, CACHE_INFO, MULTI_BIDS).result(); // then assertThat(bidResponse.getSeatbid()) @@ -4321,9 +4402,9 @@ public void shouldPopulateTargetingKeywordsWithDefaultPrefixAndRelatedWarning() .extracting(Map.Entry::getKey, Map.Entry::getValue) .containsOnly( tuple("hb_pb", "5.00"), - tuple("hb_pb_bidder1", "5.00"), - tuple("hb_bidder", "bidder1"), - tuple("hb_bidder_bidder1", "bidder1")); + tuple("hb_pb_seat", "5.00"), + tuple("hb_bidder", "seat"), + tuple("hb_bidder_seat", "seat")); final String expectedErrorMsg = "Key prefix value is dropped to default. " + "Decrease custom prefix length or increase truncateattrchars by 30"; @@ -4340,7 +4421,7 @@ public void createShouldSendCacheRequestWithExpectedTtlAndSetTtlFromBid() { final Imp imp = Imp.builder().id("impId").exp(20).build(); final List bidderResponses = asList(BidderResponse.of( "bidder1", - givenSeatBid(BidderBid.of(bid, video, "USD")), + givenSeatBid(BidderBid.of(bid, video, "seat", "USD")), 100)); final BidRequestCacheInfo cacheInfo = BidRequestCacheInfo.builder() @@ -4375,7 +4456,7 @@ public void createShouldSendCacheRequestWithExpectedTtlAndSetTtlFromBid() { given(cacheDefaultProperties.getNativeTtl()).willReturn(63); // when - final Future response = target.create(auctionContext, cacheInfo, aliases, MULTI_BIDS); + final Future response = target.create(auctionContext, cacheInfo, MULTI_BIDS); // then final ArgumentCaptor contextArgumentCaptor = ArgumentCaptor.forClass(CacheContext.class); @@ -4409,7 +4490,7 @@ public void createShouldSendCacheRequestWithExpectedTtlAndSetTtlFromImp() { final Imp imp = Imp.builder().id("impId").exp(20).build(); final List bidderResponses = asList(BidderResponse.of( "bidder1", - givenSeatBid(BidderBid.of(bid, video, "USD")), + givenSeatBid(BidderBid.of(bid, video, "seat", "USD")), 100)); final BidRequestCacheInfo cacheInfo = BidRequestCacheInfo.builder() @@ -4444,7 +4525,7 @@ public void createShouldSendCacheRequestWithExpectedTtlAndSetTtlFromImp() { given(cacheDefaultProperties.getNativeTtl()).willReturn(63); // when - final Future response = target.create(auctionContext, cacheInfo, aliases, MULTI_BIDS); + final Future response = target.create(auctionContext, cacheInfo, MULTI_BIDS); // then final ArgumentCaptor contextArgumentCaptor = ArgumentCaptor.forClass(CacheContext.class); @@ -4478,7 +4559,7 @@ public void createShouldSendCacheRequestWithExpectedTtlAndSetTtlFromRequest() { final Imp imp = Imp.builder().id("impId").exp(null).build(); final List bidderResponses = asList(BidderResponse.of( "bidder1", - givenSeatBid(BidderBid.of(bid, video, "USD")), + givenSeatBid(BidderBid.of(bid, video, "seat", "USD")), 100)); final BidRequestCacheInfo cacheInfo = BidRequestCacheInfo.builder() @@ -4513,7 +4594,7 @@ public void createShouldSendCacheRequestWithExpectedTtlAndSetTtlFromRequest() { given(cacheDefaultProperties.getNativeTtl()).willReturn(63); // when - final Future response = target.create(auctionContext, cacheInfo, aliases, MULTI_BIDS); + final Future response = target.create(auctionContext, cacheInfo, MULTI_BIDS); // then final ArgumentCaptor contextArgumentCaptor = ArgumentCaptor.forClass(CacheContext.class); @@ -4547,7 +4628,7 @@ public void createShouldSendCacheRequestWithExpectedTtlAndSetTtlFromAccountBanne final Imp imp = Imp.builder().id("impId").exp(null).build(); final List bidderResponses = asList(BidderResponse.of( "bidder1", - givenSeatBid(BidderBid.of(bid, banner, "USD")), + givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final BidRequestCacheInfo cacheInfo = BidRequestCacheInfo.builder() @@ -4582,7 +4663,7 @@ public void createShouldSendCacheRequestWithExpectedTtlAndSetTtlFromAccountBanne given(cacheDefaultProperties.getNativeTtl()).willReturn(63); // when - final Future response = target.create(auctionContext, cacheInfo, aliases, MULTI_BIDS); + final Future response = target.create(auctionContext, cacheInfo, MULTI_BIDS); // then final ArgumentCaptor contextArgumentCaptor = ArgumentCaptor.forClass(CacheContext.class); @@ -4616,7 +4697,7 @@ public void createShouldSendCacheRequestWithExpectedTtlAndSetTtlFromAccountVideo final Imp imp = Imp.builder().id("impId").exp(null).build(); final List bidderResponses = asList(BidderResponse.of( "bidder1", - givenSeatBid(BidderBid.of(bid, video, "USD")), + givenSeatBid(BidderBid.of(bid, video, "seat", "USD")), 100)); final BidRequestCacheInfo cacheInfo = BidRequestCacheInfo.builder() @@ -4651,7 +4732,7 @@ public void createShouldSendCacheRequestWithExpectedTtlAndSetTtlFromAccountVideo given(cacheDefaultProperties.getNativeTtl()).willReturn(63); // when - final Future response = target.create(auctionContext, cacheInfo, aliases, MULTI_BIDS); + final Future response = target.create(auctionContext, cacheInfo, MULTI_BIDS); // then final ArgumentCaptor contextArgumentCaptor = ArgumentCaptor.forClass(CacheContext.class); @@ -4685,7 +4766,7 @@ public void createShouldSendCacheRequestWithExpectedTtlAndSetTtlFromMediaTypeTtl final Imp imp = Imp.builder().id("impId").exp(null).build(); final List bidderResponses = asList(BidderResponse.of( "bidder1", - givenSeatBid(BidderBid.of(bid, banner, "USD")), + givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final BidRequestCacheInfo cacheInfo = BidRequestCacheInfo.builder() @@ -4720,7 +4801,7 @@ public void createShouldSendCacheRequestWithExpectedTtlAndSetTtlFromMediaTypeTtl given(cacheDefaultProperties.getNativeTtl()).willReturn(63); // when - final Future response = target.create(auctionContext, cacheInfo, aliases, MULTI_BIDS); + final Future response = target.create(auctionContext, cacheInfo, MULTI_BIDS); // then final ArgumentCaptor contextArgumentCaptor = ArgumentCaptor.forClass(CacheContext.class); @@ -4754,7 +4835,7 @@ public void createShouldSendCacheRequestWithExpectedTtlAndSetTtlFromMediaTypeTtl final Imp imp = Imp.builder().id("impId").exp(null).build(); final List bidderResponses = asList(BidderResponse.of( "bidder1", - givenSeatBid(BidderBid.of(bid, video, "USD")), + givenSeatBid(BidderBid.of(bid, video, "seat", "USD")), 100)); final BidRequestCacheInfo cacheInfo = BidRequestCacheInfo.builder() @@ -4789,7 +4870,7 @@ public void createShouldSendCacheRequestWithExpectedTtlAndSetTtlFromMediaTypeTtl given(cacheDefaultProperties.getNativeTtl()).willReturn(63); // when - final Future response = target.create(auctionContext, cacheInfo, aliases, MULTI_BIDS); + final Future response = target.create(auctionContext, cacheInfo, MULTI_BIDS); // then final ArgumentCaptor contextArgumentCaptor = ArgumentCaptor.forClass(CacheContext.class); @@ -4823,7 +4904,7 @@ public void createShouldSendCacheRequestWithExpectedTtlAndSetDefaultTtlForBanner final Imp imp = Imp.builder().id("impId").exp(null).build(); final List bidderResponses = asList(BidderResponse.of( "bidder1", - givenSeatBid(BidderBid.of(bid, banner, "USD")), + givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final BidRequestCacheInfo cacheInfo = BidRequestCacheInfo.builder() @@ -4858,7 +4939,7 @@ public void createShouldSendCacheRequestWithExpectedTtlAndSetDefaultTtlForBanner given(cacheDefaultProperties.getNativeTtl()).willReturn(63); // when - final Future response = target.create(auctionContext, cacheInfo, aliases, MULTI_BIDS); + final Future response = target.create(auctionContext, cacheInfo, MULTI_BIDS); // then final ArgumentCaptor contextArgumentCaptor = ArgumentCaptor.forClass(CacheContext.class); @@ -4892,7 +4973,7 @@ public void createShouldSendCacheRequestWithExpectedTtlAndSetDefaultTtlForVideoB final Imp imp = Imp.builder().id("impId").exp(null).build(); final List bidderResponses = asList(BidderResponse.of( "bidder1", - givenSeatBid(BidderBid.of(bid, video, "USD")), + givenSeatBid(BidderBid.of(bid, video, "seat", "USD")), 100)); final BidRequestCacheInfo cacheInfo = BidRequestCacheInfo.builder() @@ -4927,7 +5008,7 @@ public void createShouldSendCacheRequestWithExpectedTtlAndSetDefaultTtlForVideoB given(cacheDefaultProperties.getNativeTtl()).willReturn(63); // when - final Future response = target.create(auctionContext, cacheInfo, aliases, MULTI_BIDS); + final Future response = target.create(auctionContext, cacheInfo, MULTI_BIDS); // then final ArgumentCaptor contextArgumentCaptor = ArgumentCaptor.forClass(CacheContext.class); @@ -4961,7 +5042,7 @@ public void createShouldSendCacheRequestWithExpectedTtlAndSetDefaultTtlForAudioB final Imp imp = Imp.builder().id("impId").exp(null).build(); final List bidderResponses = asList(BidderResponse.of( "bidder1", - givenSeatBid(BidderBid.of(bid, audio, "USD")), + givenSeatBid(BidderBid.of(bid, audio, "seat", "USD")), 100)); final BidRequestCacheInfo cacheInfo = BidRequestCacheInfo.builder() @@ -4996,7 +5077,7 @@ public void createShouldSendCacheRequestWithExpectedTtlAndSetDefaultTtlForAudioB given(cacheDefaultProperties.getNativeTtl()).willReturn(63); // when - final Future response = target.create(auctionContext, cacheInfo, aliases, MULTI_BIDS); + final Future response = target.create(auctionContext, cacheInfo, MULTI_BIDS); // then final ArgumentCaptor contextArgumentCaptor = ArgumentCaptor.forClass(CacheContext.class); @@ -5030,7 +5111,7 @@ public void createShouldSendCacheRequestWithExpectedTtlAndSetDefaultTtlForNative final Imp imp = Imp.builder().id("impId").exp(null).build(); final List bidderResponses = asList(BidderResponse.of( "bidder1", - givenSeatBid(BidderBid.of(bid, xNative, "USD")), + givenSeatBid(BidderBid.of(bid, xNative, "seat", "USD")), 100)); final BidRequestCacheInfo cacheInfo = BidRequestCacheInfo.builder() @@ -5065,7 +5146,7 @@ public void createShouldSendCacheRequestWithExpectedTtlAndSetDefaultTtlForNative given(cacheDefaultProperties.getNativeTtl()).willReturn(63); // when - final Future response = target.create(auctionContext, cacheInfo, aliases, MULTI_BIDS); + final Future response = target.create(auctionContext, cacheInfo, MULTI_BIDS); // then final ArgumentCaptor contextArgumentCaptor = ArgumentCaptor.forClass(CacheContext.class); @@ -5099,7 +5180,7 @@ public void createShouldSendCacheRequestWithTtlFromMediaTypeWhenAccountIsEmpty() final Imp imp = Imp.builder().id("impId").exp(null).build(); final List bidderResponses = asList(BidderResponse.of( "bidder1", - givenSeatBid(BidderBid.of(bid, banner, "USD")), + givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final BidRequestCacheInfo cacheInfo = BidRequestCacheInfo.builder() @@ -5124,7 +5205,7 @@ public void createShouldSendCacheRequestWithTtlFromMediaTypeWhenAccountIsEmpty() given(mediaTypeCacheTtl.getBannerCacheTtl()).willReturn(50); // when - final Future response = target.create(auctionContext, cacheInfo, aliases, MULTI_BIDS); + final Future response = target.create(auctionContext, cacheInfo, MULTI_BIDS); // then final ArgumentCaptor contextArgumentCaptor = ArgumentCaptor.forClass(CacheContext.class); @@ -5157,7 +5238,7 @@ public void createShouldSendCacheRequestWithNoTtlAndSetEmptyTtl() { final Imp imp = Imp.builder().id("impId").exp(null).build(); final List bidderResponses = asList(BidderResponse.of( "bidder1", - givenSeatBid(BidderBid.of(bid, banner, "USD")), + givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final BidRequestCacheInfo cacheInfo = BidRequestCacheInfo.builder() @@ -5182,7 +5263,7 @@ public void createShouldSendCacheRequestWithNoTtlAndSetEmptyTtl() { given(mediaTypeCacheTtl.getBannerCacheTtl()).willReturn(null); // when - final Future response = target.create(auctionContext, cacheInfo, aliases, MULTI_BIDS); + final Future response = target.create(auctionContext, cacheInfo, MULTI_BIDS); // then final ArgumentCaptor contextArgumentCaptor = ArgumentCaptor.forClass(CacheContext.class); @@ -5215,7 +5296,7 @@ public void createShouldSendCacheRequestWithVideoBidWithTtlMaxOfTtlAndVideoTtl() final Imp imp = Imp.builder().id("impId").exp(null).build(); final List bidderResponses = asList(BidderResponse.of( "bidder1", - givenSeatBid(BidderBid.of(bid, video, "USD")), + givenSeatBid(BidderBid.of(bid, video, "seat", "USD")), 100)); final BidRequestCacheInfo cacheInfo = BidRequestCacheInfo.builder() @@ -5240,7 +5321,7 @@ public void createShouldSendCacheRequestWithVideoBidWithTtlMaxOfTtlAndVideoTtl() given(mediaTypeCacheTtl.getBannerCacheTtl()).willReturn(null); // when - final Future response = target.create(auctionContext, cacheInfo, aliases, MULTI_BIDS); + final Future response = target.create(auctionContext, cacheInfo, MULTI_BIDS); // then assertThat(response.succeeded()).isTrue(); @@ -5274,7 +5355,7 @@ public void createShouldSendCacheRequestWithBannerBidWithTtlMaxOfTtlAndVideoTtl( final Imp imp = Imp.builder().id("impId").exp(null).build(); final List bidderResponses = asList(BidderResponse.of( "bidder1", - givenSeatBid(BidderBid.of(bid, banner, "USD")), + givenSeatBid(BidderBid.of(bid, banner, "seat", "USD")), 100)); final BidRequestCacheInfo cacheInfo = BidRequestCacheInfo.builder() @@ -5299,7 +5380,7 @@ public void createShouldSendCacheRequestWithBannerBidWithTtlMaxOfTtlAndVideoTtl( given(mediaTypeCacheTtl.getBannerCacheTtl()).willReturn(null); // when - final Future response = target.create(auctionContext, cacheInfo, aliases, MULTI_BIDS); + final Future response = target.create(auctionContext, cacheInfo, MULTI_BIDS); // then assertThat(response.succeeded()).isTrue(); @@ -5326,61 +5407,6 @@ public void createShouldSendCacheRequestWithBannerBidWithTtlMaxOfTtlAndVideoTtl( }); } - @Test - public void createOnSkippedAuctionShouldReturnExpectedBidResponse() { - // given - final Bid bid = Bid.builder().id("bidId1").price(BigDecimal.valueOf(5.67)).impid(IMP_ID).build(); - final List givenSeatBids = singletonList(SeatBid.builder().seat("bidder1").bid(List.of(bid)).build()); - - final AuctionContext givenAuctionContext = givenAuctionContext( - givenBidRequest(requestBuilder -> requestBuilder.cur(singletonList("USD"))), - builder -> builder.debugWarnings(List.of("warning1", "warning2"))); - - // when - final Future bidResponseResult = target.createOnSkippedAuction( - givenAuctionContext, - givenSeatBids); - - // then - assertThat(bidResponseResult.succeeded()).isTrue(); - final BidResponse expectedBidResponse = BidResponse.builder() - .id("123") - .cur("USD") - .seatbid(givenSeatBids) - .ext(ExtBidResponse.builder() - .tmaxrequest(1000L) - .warnings(singletonMap("prebid", List.of( - ExtBidderError.of(BidderError.Type.generic.getCode(), "warning1"), - ExtBidderError.of(BidderError.Type.generic.getCode(), "warning2")))) - .build()) - .build(); - - assertThat(bidResponseResult.result()).isEqualTo(expectedBidResponse); - } - - @Test - public void createOnSkippedAuctionShouldReturnExpectedBidResponseWithEmptySeatBidWhenSeatBidIsNull() { - // given - final AuctionContext givenAuctionContext = givenAuctionContext(givenBidRequest(identity())); - - // when - final Future bidResponseResult = target.createOnSkippedAuction(givenAuctionContext, null); - - // then - assertThat(bidResponseResult.succeeded()).isTrue(); - final BidResponse expectedBidResponse = BidResponse.builder() - .id("123") - .cur("USD") - .seatbid(emptyList()) - .ext(ExtBidResponse.builder() - .tmaxrequest(1000L) - .warnings(emptyMap()) - .build()) - .build(); - - assertThat(bidResponseResult.result()).isEqualTo(expectedBidResponse); - } - private AuctionContext givenAuctionContext(BidRequest bidRequest, UnaryOperator contextCustomizer) { @@ -5433,6 +5459,7 @@ private static Map zipBidsWithCacheInfos(List bidInfos, private static BidInfo toBidInfo(Bid bid, Imp correspondingImp, String bidder, + String seat, BidType bidType, boolean isWinningBid) { @@ -5440,9 +5467,11 @@ private static BidInfo toBidInfo(Bid bid, .bid(bid) .correspondingImp(correspondingImp) .bidder(bidder) + .seat(seat) .bidType(bidType) .targetingInfo(TargetingInfo.builder() .bidderCode(bidder) + .seat(seat) .isTargetingEnabled(true) .isWinningBid(isWinningBid) .isBidderWinningBid(true) diff --git a/src/test/java/org/prebid/server/auction/BidderAliasesTest.java b/src/test/java/org/prebid/server/auction/BidderAliasesTest.java deleted file mode 100644 index 30fc23a21fa..00000000000 --- a/src/test/java/org/prebid/server/auction/BidderAliasesTest.java +++ /dev/null @@ -1,194 +0,0 @@ -package org.prebid.server.auction; - -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.bidder.BidderCatalog; - -import java.util.Map; - -import static java.util.Collections.singletonMap; -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.BDDMockito.given; -import static org.mockito.Mock.Strictness.LENIENT; - -@ExtendWith(MockitoExtension.class) -public class BidderAliasesTest { - - @Mock(strictness = LENIENT) - private BidderCatalog bidderCatalog; - - @BeforeEach - public void before() { - given(bidderCatalog.isValidName(any())).willReturn(false); - given(bidderCatalog.isActive(any())).willReturn(false); - } - - @Test - public void isAliasDefinedShouldReturnFalseWhenNoAliasesInRequest() { - // given - final BidderAliases aliases = BidderAliases.of(null, null, bidderCatalog); - - // when and then - assertThat(aliases.isAliasDefined("alias")).isFalse(); - } - - @Test - public void isAliasDefinedShouldReturnFalseWhenAliasIsNotDefinedInRequest() { - // given - final BidderAliases aliases = BidderAliases.of(singletonMap("anotherAlias", "bidder"), null, bidderCatalog); - - // when and then - assertThat(aliases.isAliasDefined("alias")).isFalse(); - } - - @Test - public void isAliasDefinedShouldDetectAliasInRequest() { - // given - final BidderAliases aliases = BidderAliases.of(singletonMap("alias", "bidder"), null, bidderCatalog); - - // when and then - assertThat(aliases.isAliasDefined("alias")).isTrue(); - } - - @Test - public void resolveBidderShouldReturnInputWhenNoAliasesInRequest() { - // given - final BidderAliases aliases = BidderAliases.of(null, null, bidderCatalog); - - // when and then - assertThat(aliases.resolveBidder("alias")).isEqualTo("alias"); - } - - @Test - public void resolveBidderShouldReturnInputWhenNoAliasesInRequestButAliasIsValidInBidderCatalog() { - // given - given(bidderCatalog.isValidName("alias")).willReturn(true); - final BidderAliases aliases = BidderAliases.of(null, null, bidderCatalog); - - // when and then - assertThat(aliases.resolveBidder("alias")).isEqualTo("alias"); - } - - @Test - public void resolveBidderShouldReturnInputWhenAliasIsNotDefinedInRequest() { - // given - final BidderAliases aliases = BidderAliases.of(singletonMap("anotherAlias", "bidder"), null, bidderCatalog); - - // when and then - assertThat(aliases.resolveBidder("alias")).isEqualTo("alias"); - } - - @Test - public void resolveBidderShouldReturnInputWhenAliasIsNotDefinedInRequestButAliasIsValidInBidderCatalog() { - // given - given(bidderCatalog.isValidName("alias")).willReturn(true); - final BidderAliases aliases = BidderAliases.of(singletonMap("anotherAlias", "bidder"), null, bidderCatalog); - - // when and then - assertThat(aliases.resolveBidder("alias")).isEqualTo("alias"); - } - - @Test - public void resolveBidderShouldDetectAliasInRequest() { - // given - final BidderAliases aliases = BidderAliases.of(singletonMap("alias", "bidder"), null, bidderCatalog); - - // when and then - assertThat(aliases.resolveBidder("alias")).isEqualTo("bidder"); - } - - @Test - public void resolveBidderShouldDetectInBidderCatalogWhenItIsValid() { - // given - given(bidderCatalog.isValidName("alias")).willReturn(true); - final BidderAliases aliases = BidderAliases.of(singletonMap("alias", "bidder"), null, bidderCatalog); - - // when and then - assertThat(aliases.resolveBidder("alias")).isEqualTo("alias"); - } - - @Test - public void isSameShouldReturnTrueIfBiddersSameConsideringAliases() { - // given - final BidderAliases aliases = BidderAliases.of( - Map.of("alias1", "bidder", "alias2", "bidder"), - null, - bidderCatalog); - - // when and then - assertThat(aliases.isSame("bidder", "bidder")).isTrue(); - assertThat(aliases.isSame("alias1", "bidder")).isTrue(); - assertThat(aliases.isSame("alias2", "bidder")).isTrue(); - assertThat(aliases.isSame("alias1", "alias2")).isTrue(); - } - - @Test - public void isSameShouldReturnTrueIfBiddersSameConsideringAliasesIgnoringCase() { - // given - final BidderAliases aliases = BidderAliases.of( - Map.of("alias1", "bidder", "alias2", "BiDdEr"), - null, - bidderCatalog); - - // when and then - assertThat(aliases.isSame("BIDder", "bidDER")).isTrue(); - assertThat(aliases.isSame("alias1", "bidDER")).isTrue(); - assertThat(aliases.isSame("alias2", "bidDER")).isTrue(); - assertThat(aliases.isSame("alias1", "alias2")).isTrue(); - } - - @Test - public void resolveAliasVendorIdShouldReturnNullWhenNoVendorIdsInRequest() { - // given - final BidderAliases aliases = BidderAliases.of(null, null, bidderCatalog); - - // when and then - assertThat(aliases.resolveAliasVendorId("alias")).isNull(); - } - - @Test - public void resolveAliasVendorIdShouldReturnVendorIdFromBidderCatalogWhenNoVendorIdsInRequest() { - // given - given(bidderCatalog.isActive("alias")).willReturn(true); - given(bidderCatalog.vendorIdByName("alias")).willReturn(3); - final BidderAliases aliases = BidderAliases.of(null, null, bidderCatalog); - - // when and then - assertThat(aliases.resolveAliasVendorId("alias")).isEqualTo(3); - } - - @Test - public void resolveAliasVendorIdShouldReturnNullWhenVendorIdIsNotDefinedInRequest() { - // given - final BidderAliases aliases = BidderAliases.of(null, singletonMap("anotherAlias", 2), bidderCatalog); - - // when and then - assertThat(aliases.resolveAliasVendorId("alias")).isNull(); - } - - @Test - public void resolveAliasVendorIdShouldReturnVendorIdFromBidderCatalogWhenVendorIdIsNotDefinedInRequest() { - // given - given(bidderCatalog.isActive("alias")).willReturn(true); - given(bidderCatalog.vendorIdByName("alias")).willReturn(3); - final BidderAliases aliases = BidderAliases.of(null, singletonMap("anotherAlias", 2), bidderCatalog); - - // when and then - assertThat(aliases.resolveAliasVendorId("alias")).isEqualTo(3); - } - - @Test - public void resolveAliasVendorIdShouldReturnVendorIdFromBidderCatalogWhenVendorIdIsInRequest() { - // given - given(bidderCatalog.isActive("alias")).willReturn(true); - given(bidderCatalog.vendorIdByName("alias")).willReturn(3); - final BidderAliases aliases = BidderAliases.of(null, singletonMap("alias", 2), bidderCatalog); - - // when and then - assertThat(aliases.resolveAliasVendorId("alias")).isEqualTo(3); - } -} diff --git a/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java b/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java index 2e8c9a5e2c1..d5ae7bcf6e3 100644 --- a/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java +++ b/src/test/java/org/prebid/server/auction/ExchangeServiceTest.java @@ -30,6 +30,7 @@ import com.iab.openrtb.response.SeatBid; import io.vertx.core.Future; import org.apache.commons.collections4.MapUtils; +import org.apache.commons.lang3.tuple.Pair; import org.assertj.core.api.InstanceOfAssertFactories; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -46,7 +47,6 @@ import org.prebid.server.auction.mediatypeprocessor.MediaTypeProcessor; import org.prebid.server.auction.model.AuctionContext; import org.prebid.server.auction.model.AuctionParticipation; -import org.prebid.server.auction.model.BidRejectionReason; import org.prebid.server.auction.model.BidRejectionTracker; import org.prebid.server.auction.model.BidRequestCacheInfo; import org.prebid.server.auction.model.BidderPrivacyResult; @@ -111,6 +111,7 @@ import org.prebid.server.proto.openrtb.ext.request.ExtRequest; import org.prebid.server.proto.openrtb.ext.request.ExtRequestCurrency; import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebid; +import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidAlternateBidderCodes; import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidBidderConfig; import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidCache; import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidCacheBids; @@ -128,6 +129,7 @@ import org.prebid.server.proto.openrtb.ext.response.ExtAnalytics; import org.prebid.server.proto.openrtb.ext.response.ExtAnalyticsTags; import org.prebid.server.proto.openrtb.ext.response.ExtBidPrebid; +import org.prebid.server.proto.openrtb.ext.response.ExtBidPrebidMeta; import org.prebid.server.proto.openrtb.ext.response.ExtBidResponse; import org.prebid.server.proto.openrtb.ext.response.ExtBidResponsePrebid; import org.prebid.server.proto.openrtb.ext.response.ExtBidderError; @@ -145,6 +147,8 @@ import org.prebid.server.proto.openrtb.ext.response.ExtResponseDebug; import org.prebid.server.proto.openrtb.ext.response.FledgeAuctionConfig; import org.prebid.server.settings.model.Account; +import org.prebid.server.settings.model.AccountAlternateBidderCodes; +import org.prebid.server.settings.model.AccountAlternateBidderCodesBidder; import org.prebid.server.settings.model.AccountAnalyticsConfig; import org.prebid.server.settings.model.AccountAuctionConfig; import org.prebid.server.settings.model.AccountEventsConfig; @@ -164,6 +168,7 @@ import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Set; import java.util.UUID; import java.util.function.Function; import java.util.function.UnaryOperator; @@ -199,6 +204,7 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoInteractions; +import static org.prebid.server.auction.model.BidRejectionReason.REQUEST_BLOCKED_UNACCEPTABLE_CURRENCY; import static org.prebid.server.proto.openrtb.ext.response.BidType.banner; import static org.prebid.server.proto.openrtb.ext.response.BidType.video; @@ -287,7 +293,7 @@ public class ExchangeServiceTest extends VertxTest { @SuppressWarnings("unchecked") @BeforeEach public void setUp() { - given(bidResponseCreator.create(any(), any(), any(), any())) + given(bidResponseCreator.create(any(), any(), any())) .willReturn(Future.succeededFuture(givenBidResponseWithBids(singletonList(givenBid(identity()))))); given(bidderCatalog.isValidName(anyString())).willReturn(true); @@ -312,6 +318,7 @@ public void setUp() { CompressionType.NONE, Ortb.of(false), 0L)); + given(bidderCatalog.configuredName(anyString())).willAnswer(invocation -> invocation.getArgument(0)); given(privacyEnforcementService.mask(any(), argThat(MapUtils::isNotEmpty), any())) .willAnswer(inv -> @@ -1269,7 +1276,7 @@ public void shouldReturnSeparateSeatBidsForTheSameBidderIfBiddersAliasAndBidderW .auctiontimestamp(1000L) .build()))); - given(bidResponseCreator.create(any(), any(), any(), any())) + given(bidResponseCreator.create(any(), any(), any())) .willReturn(Future.succeededFuture(BidResponse.builder() .seatbid(asList( givenSeatBid(singletonList(givenBid(identity())), identity()), @@ -1350,7 +1357,7 @@ public void shouldOverrideDebugEnabledFlag() { .httpCalls(singletonList(ExtHttpCall.builder().build())) .build())); - given(bidResponseCreator.create(any(), any(), any(), any())) + given(bidResponseCreator.create(any(), any(), any())) .willReturn(Future.succeededFuture( BidResponse.builder() .ext(ExtBidResponse.builder() @@ -1365,7 +1372,7 @@ public void shouldOverrideDebugEnabledFlag() { verify(httpBidderRequester).requestBids(any(), any(), any(), any(), any(), any(), eq(true)); final ArgumentCaptor captor = ArgumentCaptor.forClass(AuctionContext.class); - verify(bidResponseCreator).create(captor.capture(), any(), any(), anyMap()); + verify(bidResponseCreator).create(captor.capture(), any(), anyMap()); assertThat(captor.getValue().getDebugContext()).isEqualTo(DebugContext.of(true, true, null)); assertThat(result.getBidResponse().getExt().getDebug()).isNotNull(); @@ -1380,7 +1387,7 @@ public void shouldAddDebugInfoIfDebugEnabledAndPublisherAndBidderAllowedDebug() given(httpBidderRequester.requestBids(any(), any(), any(), any(), any(), any(), eq(true))) .willReturn(Future.succeededFuture(bidderSeatBid)); - given(bidResponseCreator.create(any(), any(), any(), any())) + given(bidResponseCreator.create(any(), any(), any())) .willReturn(Future.succeededFuture( BidResponse.builder() .ext(ExtBidResponse.builder() @@ -1402,7 +1409,7 @@ public void shouldAddDebugInfoIfDebugEnabledAndPublisherAndBidderAllowedDebug() verify(httpBidderRequester).requestBids(any(), any(), any(), any(), any(), any(), eq(true)); final ArgumentCaptor captor = ArgumentCaptor.forClass(AuctionContext.class); - verify(bidResponseCreator).create(captor.capture(), any(), any(), anyMap()); + verify(bidResponseCreator).create(captor.capture(), any(), anyMap()); assertThat(captor.getValue().getDebugContext()) .isEqualTo(DebugContext.of(true, true, null)); @@ -1423,7 +1430,7 @@ public void shouldNotAddDebugInfoIfPublisherIsNotAllowedToDebug() { given(debugResolver.resolveDebugForBidder(any(), eq("bidder"))) .willReturn(false); - given(bidResponseCreator.create(any(), any(), any(), any())).willReturn( + given(bidResponseCreator.create(any(), any(), any())).willReturn( Future.succeededFuture(BidResponse.builder().ext(ExtBidResponse.builder().build()).build())); // when @@ -1433,7 +1440,7 @@ public void shouldNotAddDebugInfoIfPublisherIsNotAllowedToDebug() { verify(httpBidderRequester).requestBids(any(), any(), any(), any(), any(), any(), eq(false)); final ArgumentCaptor captor = ArgumentCaptor.forClass(AuctionContext.class); - verify(bidResponseCreator).create(captor.capture(), any(), any(), anyMap()); + verify(bidResponseCreator).create(captor.capture(), any(), anyMap()); assertThat(captor.getValue().getDebugContext()).isEqualTo( DebugContext.of(false, false, null)); @@ -1454,7 +1461,7 @@ public void shouldNotAddDebugInfoIfBidderDisabledDebug() { given(debugResolver.resolveDebugForBidder(any(), eq("bidder"))) .willReturn(false); - given(bidResponseCreator.create(any(), any(), any(), any())).willReturn( + given(bidResponseCreator.create(any(), any(), any())).willReturn( Future.succeededFuture(BidResponse.builder().ext(ExtBidResponse.builder().build()).build())); // when @@ -1464,7 +1471,7 @@ public void shouldNotAddDebugInfoIfBidderDisabledDebug() { verify(httpBidderRequester).requestBids(any(), any(), any(), any(), any(), any(), eq(false)); final ArgumentCaptor captor = ArgumentCaptor.forClass(AuctionContext.class); - verify(bidResponseCreator).create(captor.capture(), any(), any(), anyMap()); + verify(bidResponseCreator).create(captor.capture(), any(), anyMap()); assertThat(captor.getValue().getDebugContext()).isEqualTo( DebugContext.of(true, true, null)); @@ -1543,12 +1550,17 @@ public void shouldCallBidResponseCreatorWithExpectedParamsAndUpdateDebugErrors() final ArgumentCaptor contextArgumentCaptor = ArgumentCaptor.forClass(AuctionContext.class); verify(bidResponseCreator) - .create(contextArgumentCaptor.capture(), eq(expectedCacheInfo), any(), eq(expectedMultiBidMap)); + .create(contextArgumentCaptor.capture(), eq(expectedCacheInfo), eq(expectedMultiBidMap)); final Bid expectedThirdBid = Bid.builder() .id("bidId3") .impid("impId3") .price(BigDecimal.valueOf(7.89)) + .ext(mapper.createObjectNode().set("prebid", mapper.valueToTree(ExtBidPrebid.builder() + .meta(ExtBidPrebidMeta.builder() + .adapterCode("bidder2") + .build()) + .build()))) .build(); final List auctionParticipations = contextArgumentCaptor.getValue().getAuctionParticipations(); @@ -1557,7 +1569,8 @@ public void shouldCallBidResponseCreatorWithExpectedParamsAndUpdateDebugErrors() .containsOnly( BidderResponse.of( "bidder2", - BidderSeatBid.of(singletonList(BidderBid.of(expectedThirdBid, banner, null))), + BidderSeatBid.of(singletonList( + BidderBid.of(expectedThirdBid, banner, "bidder2", null))), 0), BidderResponse.of("bidder1", BidderSeatBid.empty(), 0)); @@ -1610,7 +1623,6 @@ public void shouldCallBidResponseCreatorWithWinningOnlyTrueWhenIncludeBidderKeys verify(bidResponseCreator).create( auctionContextArgumentCaptor.capture(), eq(BidRequestCacheInfo.builder().doCaching(true).shouldCacheWinningBidsOnly(true).build()), - any(), eq(emptyMap())); assertThat(singletonList(auctionContextArgumentCaptor.getValue().getBidRequest())) @@ -1645,7 +1657,7 @@ public void shouldCallBidResponseCreatorWithWinningOnlyFalseWhenWinningOnlyIsNul target.holdAuction(givenRequestContext(bidRequest)); // then - verify(bidResponseCreator).create(any(), eq(BidRequestCacheInfo.builder().build()), any(), eq(emptyMap())); + verify(bidResponseCreator).create(any(), eq(BidRequestCacheInfo.builder().build()), eq(emptyMap())); } @Test @@ -3055,6 +3067,124 @@ public void shouldIncrementCommonMetrics() { eq("someBidder"), any(), eq(10000L), eq(false), eq("banner")); } + @Test + public void shouldValidateBidsWithExtRequestPrebidAlternateBidderCodes() { + // given + given(httpBidderRequester.requestBids(any(), any(), any(), any(), any(), any(), anyBoolean())) + .willReturn(Future.succeededFuture(givenSingleSeatBid( + givenBidderBid(Bid.builder().impid("impId").price(TEN).build())))); + + final ExtRequestPrebidAlternateBidderCodes requestAlternateBidderCodes = + ExtRequestPrebidAlternateBidderCodes.of(false, null); + + final BidRequest bidRequest = givenBidRequest(givenSingleImp(singletonMap("someBidder", 1)), + builder -> builder + .ext(ExtRequest.of(ExtRequestPrebid.builder() + .alternateBidderCodes(requestAlternateBidderCodes) + .build()))); + + final AccountAlternateBidderCodes accountAlternateBidderCodes = AccountAlternateBidderCodes.of( + true, + Map.of("someBidder", AccountAlternateBidderCodesBidder.of(true, Set.of("seat")))); + + final Account givenAccount = Account.builder() + .id("accountId") + .auction(AccountAuctionConfig.builder() + .events(AccountEventsConfig.of(true)) + .build()) + .alternateBidderCodes(accountAlternateBidderCodes) + .build(); + + // when + target.holdAuction(givenRequestContext(bidRequest, givenAccount)); + + // then + verify(bidsAdjuster).validateAndAdjustBids( + any(), any(), argThat(aliases -> !aliases.isAllowedAlternateBidderCode("someBidder", "seat"))); + } + + @Test + public void shouldValidateBidsWithAccountAlternateBidderCodesWhenRequestOnesAreAbsent() { + // given + given(httpBidderRequester.requestBids(any(), any(), any(), any(), any(), any(), anyBoolean())) + .willReturn(Future.succeededFuture(givenSeatBid(singletonList( + givenBidderBid(Bid.builder().impid("impId").price(TEN).build()))))); + + final BidRequest bidRequest = givenBidRequest(givenSingleImp(singletonMap("someBidder", 1)), + builder -> builder.ext(ExtRequest.of(ExtRequestPrebid.builder().build()))); + + final AccountAlternateBidderCodes accountAlternateBidderCodes = AccountAlternateBidderCodes.of( + true, + Map.of("someBidder", AccountAlternateBidderCodesBidder.of(true, Set.of("seat")))); + + final Account givenAccount = Account.builder() + .id("accountId") + .auction(AccountAuctionConfig.builder() + .events(AccountEventsConfig.of(true)) + .build()) + .alternateBidderCodes(accountAlternateBidderCodes) + .build(); + + // when + target.holdAuction(givenRequestContext(bidRequest, givenAccount)); + + // then + verify(bidsAdjuster).validateAndAdjustBids( + any(), any(), argThat(aliases -> aliases.isAllowedAlternateBidderCode("someBidder", "seat"))); + + } + + @Test + public void shouldPopulateSoftAliasToSeatAndHardAliasToAdapterCodeWhenBidDoesNotHaveSeat() { + // given + given(bidderCatalog.isValidName("softAlias")).willReturn(false); + given(httpBidderRequester.requestBids(any(), any(), any(), any(), any(), any(), anyBoolean())) + .willReturn(Future.succeededFuture(givenSingleSeatBid( + givenBidderBid(Bid.builder().impid("impId").price(TEN).build())))); + + final BidRequest bidRequest = givenBidRequest(givenSingleImp(singletonMap("softAlias", 1)), + builder -> builder + .ext(ExtRequest.of(ExtRequestPrebid.builder() + .aliases(Map.of("softAlias", "hardAlias")) + .build()))); + + // when + final AuctionContext result = target.holdAuction(givenRequestContext(bidRequest)).result(); + + // then + assertThat(result.getAuctionParticipations()) + .extracting(AuctionParticipation::getBidderResponse) + .extracting(BidderResponse::getSeatBid) + .flatExtracting(BidderSeatBid::getBids) + .extracting( + BidderBid::getSeat, + bid -> bid.getBid().getExt().get("prebid").get("meta").get("adaptercode").asText()) + .containsOnly(tuple("softAlias", "hardAlias")); + } + + @Test + public void shouldPopulateSeatToSeatAndActualBidderToAdapterCodeWhenBidHasSeat() { + // given + given(httpBidderRequester.requestBids(any(), any(), any(), any(), any(), any(), anyBoolean())) + .willReturn(Future.succeededFuture(givenSingleSeatBid(BidderBid.of( + Bid.builder().impid("impId").price(TEN).build(), banner, "seat", null)))); + + final BidRequest bidRequest = givenBidRequest(givenSingleImp(singletonMap("someBidder", 1))); + + // when + final AuctionContext result = target.holdAuction(givenRequestContext(bidRequest)).result(); + + // then + assertThat(result.getAuctionParticipations()) + .extracting(AuctionParticipation::getBidderResponse) + .extracting(BidderResponse::getSeatBid) + .flatExtracting(BidderSeatBid::getBids) + .extracting( + BidderBid::getSeat, + bid -> bid.getBid().getExt().get("prebid").get("meta").get("adaptercode").asText()) + .containsOnly(tuple("seat", "someBidder")); + } + @Test public void shouldCallUpdateCookieMetricsWithExpectedValue() { // given @@ -3724,7 +3854,7 @@ public void shouldReduceBidsHavingDealIdWithSameImpIdByBidderWithToleratingNotOb // then final ArgumentCaptor contextArgumentCaptor = ArgumentCaptor.forClass(AuctionContext.class); - verify(bidResponseCreator).create(contextArgumentCaptor.capture(), any(), any(), any()); + verify(bidResponseCreator).create(contextArgumentCaptor.capture(), any(), any()); assertThat(contextArgumentCaptor.getValue().getAuctionParticipations()).hasSize(1) .extracting(AuctionParticipation::getBidderResponse) .extracting(BidderResponse::getSeatBid) @@ -3756,7 +3886,7 @@ public void shouldReduceBidsHavingDealIdWithSameImpIdByBidderWithToleratingNotOb // then final ArgumentCaptor contextArgumentCaptor = ArgumentCaptor.forClass(AuctionContext.class); - verify(bidResponseCreator).create(contextArgumentCaptor.capture(), any(), any(), any()); + verify(bidResponseCreator).create(contextArgumentCaptor.capture(), any(), any()); assertThat(contextArgumentCaptor.getValue().getAuctionParticipations()).hasSize(1) .extracting(AuctionParticipation::getBidderResponse) @@ -3785,7 +3915,6 @@ public void shouldResponseWithEmptySeatBidIfBidderNotSupportProvidedMediaTypes() .build(), 0))), any(), - any(), any())) .willReturn(Future.succeededFuture(BidResponse.builder().id("uniqId").build())); @@ -3838,7 +3967,6 @@ public void shouldResponseWithEmptySeatBidIfBidderNotSupportRequestCurrency() { .build(), 0))), any(), - any(), any())) .willReturn(Future.succeededFuture(BidResponse.builder().id("uniqId").build())); @@ -3853,7 +3981,7 @@ public void shouldResponseWithEmptySeatBidIfBidderNotSupportRequestCurrency() { .extracting(AuctionContext::getBidRejectionTrackers) .extracting(rejectionTrackers -> rejectionTrackers.get("bidder1")) .extracting(BidRejectionTracker::getRejectedImps) - .isEqualTo(Map.of("impId1", BidRejectionReason.REQUEST_BLOCKED_UNACCEPTABLE_CURRENCY)); + .isEqualTo(Map.of("impId1", Pair.of("bidder1", REQUEST_BLOCKED_UNACCEPTABLE_CURRENCY))); } @@ -4060,7 +4188,7 @@ private BidRequest captureBidRequest() { private List captureAuctionParticipations() { final ArgumentCaptor contextArgumentCaptor = ArgumentCaptor.forClass(AuctionContext.class); - verify(bidResponseCreator).create(contextArgumentCaptor.capture(), any(), any(), any()); + verify(bidResponseCreator).create(contextArgumentCaptor.capture(), any(), any()); return contextArgumentCaptor.getValue().getAuctionParticipations(); } @@ -4164,12 +4292,12 @@ private static ExtRequestTargeting givenTargeting(boolean includebidderkeys) { } private void givenBidResponseCreator(List bids) { - given(bidResponseCreator.create(any(), any(), any(), any())) + given(bidResponseCreator.create(any(), any(), any())) .willReturn(Future.succeededFuture(givenBidResponseWithBids(bids))); } private void givenBidResponseCreator(Map> errors) { - given(bidResponseCreator.create(any(), any(), any(), any())) + given(bidResponseCreator.create(any(), any(), any())) .willReturn(Future.succeededFuture(givenBidResponseWithError(errors))); } diff --git a/src/test/java/org/prebid/server/auction/ImpAdjusterTest.java b/src/test/java/org/prebid/server/auction/ImpAdjusterTest.java index 06be50d94a6..9dc196f7884 100644 --- a/src/test/java/org/prebid/server/auction/ImpAdjusterTest.java +++ b/src/test/java/org/prebid/server/auction/ImpAdjusterTest.java @@ -12,6 +12,7 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.prebid.server.VertxTest; +import org.prebid.server.auction.aliases.BidderAliases; import org.prebid.server.bidder.BidderCatalog; import org.prebid.server.json.JsonMerger; import org.prebid.server.validation.ImpValidator; diff --git a/src/test/java/org/prebid/server/auction/SkippedAuctionServiceTest.java b/src/test/java/org/prebid/server/auction/SkippedAuctionServiceTest.java index 3976a4bbd8f..7f6e1623b37 100644 --- a/src/test/java/org/prebid/server/auction/SkippedAuctionServiceTest.java +++ b/src/test/java/org/prebid/server/auction/SkippedAuctionServiceTest.java @@ -17,19 +17,20 @@ 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.ExtStoredAuctionResponse; +import org.prebid.server.proto.openrtb.ext.response.ExtBidResponse; +import org.prebid.server.proto.openrtb.ext.response.ExtBidderError; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.List; import static java.util.Collections.emptyList; import static java.util.Collections.singletonList; +import static java.util.Collections.singletonMap; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoInteractions; +import static org.prebid.server.bidder.model.BidderError.Type.generic; @ExtendWith(MockitoExtension.class) public class SkippedAuctionServiceTest { @@ -37,15 +38,13 @@ public class SkippedAuctionServiceTest { @Mock private StoredResponseProcessor storedResponseProcessor; @Mock - private BidResponseCreator bidResponseCreator; - @Mock private Timeout timeout; private SkippedAuctionService target; @BeforeEach public void setUp() { - target = new SkippedAuctionService(storedResponseProcessor, bidResponseCreator); + target = new SkippedAuctionService(storedResponseProcessor); } @Test @@ -61,7 +60,7 @@ public void skipAuctionShouldReturnFailedFutureWhenRequestIsRejected() { // then assertThat(result.failed()).isTrue(); assertThat(result.cause()).hasMessage("Rejected request cannot be skipped"); - verifyNoInteractions(storedResponseProcessor, bidResponseCreator); + verifyNoInteractions(storedResponseProcessor); } @Test @@ -79,7 +78,7 @@ public void skipAuctionShouldReturnFailedFutureWhenBidRequestExtIsNull() { assertThat(result.cause()) .hasMessage("the auction can not be skipped, ext.prebid.storedauctionresponse is absent"); - verifyNoInteractions(storedResponseProcessor, bidResponseCreator); + verifyNoInteractions(storedResponseProcessor); } @Test @@ -97,7 +96,7 @@ public void skipAuctionShouldReturnFailedFutureWhenBidRequestExtPrebidIsNull() { assertThat(result.cause()) .hasMessage("the auction can not be skipped, ext.prebid.storedauctionresponse is absent"); - verifyNoInteractions(storedResponseProcessor, bidResponseCreator); + verifyNoInteractions(storedResponseProcessor); } @Test @@ -117,7 +116,7 @@ public void skipAuctionShouldReturnFailedFutureWhenStoredResponseIsNull() { assertThat(result.cause()) .hasMessage("the auction can not be skipped, ext.prebid.storedauctionresponse is absent"); - verifyNoInteractions(storedResponseProcessor, bidResponseCreator); + verifyNoInteractions(storedResponseProcessor); } @Test @@ -140,7 +139,7 @@ public void skipAuctionShouldReturnFailedFutureWhenStoredResponseSeatBidAndIdAre .hasMessage("the auction can not be skipped, " + "ext.prebid.storedauctionresponse can not be resolved properly"); - verifyNoInteractions(storedResponseProcessor, bidResponseCreator); + verifyNoInteractions(storedResponseProcessor); } @Test @@ -151,28 +150,37 @@ public void skipAuctionShouldReturnBidResponseWithSeatBidsFromStoredAuctionRespo final AuctionContext givenAuctionContext = AuctionContext.builder() .debugWarnings(new ArrayList<>()) .bidRequest(BidRequest.builder() + .id("requestId") + .tmax(1000L) + .cur(List.of("USD")) .ext(ExtRequest.of(ExtRequestPrebid.builder() .storedAuctionResponse(givenStoredResponse) .build())) .build()) .build(); - final BidResponse givenBidResponse = BidResponse.builder().build(); - given(bidResponseCreator.createOnSkippedAuction(any(), any())) - .willReturn(Future.succeededFuture(givenBidResponse)); - // when final Future result = target.skipAuction(givenAuctionContext); // then final AuctionContext expectedAuctionContext = givenAuctionContext.toBuilder() .debugWarnings(singletonList("no auction. response defined by storedauctionresponse")) + .bidResponse(BidResponse.builder() + .id("requestId") + .cur("USD") + .seatbid(givenSeatBids) + .ext(ExtBidResponse.builder() + .tmaxrequest(1000L) + .warnings(singletonMap("prebid", List.of(ExtBidderError.of( + generic.getCode(), + "no auction. response defined by storedauctionresponse")))) + .build()) + .build()) .build(); assertThat(result.succeeded()).isTrue(); - assertThat(result.result()).isEqualTo(expectedAuctionContext.with(givenBidResponse).skipAuction()); + assertThat(result.result()).isEqualTo(expectedAuctionContext.skipAuction()); - verify(bidResponseCreator).createOnSkippedAuction(expectedAuctionContext, givenSeatBids); verifyNoInteractions(storedResponseProcessor); } @@ -184,16 +192,15 @@ public void skipAuctionShouldReturnEmptySeatBidsWhenSeatBidIsNull() { final AuctionContext givenAuctionContext = AuctionContext.builder() .debugWarnings(new ArrayList<>()) .bidRequest(BidRequest.builder() + .id("requestId") + .tmax(1000L) + .cur(List.of("USD")) .ext(ExtRequest.of(ExtRequestPrebid.builder() .storedAuctionResponse(givenStoredResponse) .build())) .build()) .build(); - final BidResponse givenBidResponse = BidResponse.builder().build(); - given(bidResponseCreator.createOnSkippedAuction(any(), any())) - .willReturn(Future.succeededFuture(givenBidResponse)); - // when final Future result = target.skipAuction(givenAuctionContext); @@ -202,12 +209,24 @@ public void skipAuctionShouldReturnEmptySeatBidsWhenSeatBidIsNull() { .debugWarnings(List.of( "SeatBid can't be null in stored response", "no auction. response defined by storedauctionresponse")) + .bidResponse(BidResponse.builder() + .id("requestId") + .cur("USD") + .seatbid(emptyList()) + .ext(ExtBidResponse.builder() + .tmaxrequest(1000L) + .warnings(singletonMap("prebid", List.of( + ExtBidderError.of(generic.getCode(), + "SeatBid can't be null in stored response"), + ExtBidderError.of(generic.getCode(), + "no auction. response defined by storedauctionresponse")))) + .build()) + .build()) .build(); assertThat(result.succeeded()).isTrue(); - assertThat(result.result()).isEqualTo(expectedAuctionContext.with(givenBidResponse).skipAuction()); + assertThat(result.result()).isEqualTo(expectedAuctionContext.skipAuction()); - verify(bidResponseCreator).createOnSkippedAuction(expectedAuctionContext, emptyList()); verifyNoInteractions(storedResponseProcessor); } @@ -219,16 +238,15 @@ public void skipAuctionShouldReturnEmptySeatBidsWhenSeatIsEmpty() { final AuctionContext givenAuctionContext = AuctionContext.builder() .debugWarnings(new ArrayList<>()) .bidRequest(BidRequest.builder() + .id("requestId") + .tmax(1000L) + .cur(List.of("USD")) .ext(ExtRequest.of(ExtRequestPrebid.builder() .storedAuctionResponse(givenStoredResponse) .build())) .build()) .build(); - final BidResponse givenBidResponse = BidResponse.builder().build(); - given(bidResponseCreator.createOnSkippedAuction(any(), any())) - .willReturn(Future.succeededFuture(givenBidResponse)); - // when final Future result = target.skipAuction(givenAuctionContext); @@ -237,12 +255,24 @@ public void skipAuctionShouldReturnEmptySeatBidsWhenSeatIsEmpty() { .debugWarnings(List.of( "Seat can't be empty in stored response seatBid", "no auction. response defined by storedauctionresponse")) + .bidResponse(BidResponse.builder() + .id("requestId") + .cur("USD") + .seatbid(emptyList()) + .ext(ExtBidResponse.builder() + .tmaxrequest(1000L) + .warnings(singletonMap("prebid", List.of( + ExtBidderError.of(generic.getCode(), + "Seat can't be empty in stored response seatBid"), + ExtBidderError.of(generic.getCode(), + "no auction. response defined by storedauctionresponse")))) + .build()) + .build()) .build(); assertThat(result.succeeded()).isTrue(); - assertThat(result.result()).isEqualTo(expectedAuctionContext.with(givenBidResponse).skipAuction()); + assertThat(result.result()).isEqualTo(expectedAuctionContext.skipAuction()); - verify(bidResponseCreator).createOnSkippedAuction(expectedAuctionContext, emptyList()); verifyNoInteractions(storedResponseProcessor); } @@ -254,16 +284,15 @@ public void skipAuctionShouldReturnEmptySeatBidsWhenBidsAreEmpty() { final AuctionContext givenAuctionContext = AuctionContext.builder() .debugWarnings(new ArrayList<>()) .bidRequest(BidRequest.builder() + .id("requestId") + .tmax(1000L) + .cur(List.of("USD")) .ext(ExtRequest.of(ExtRequestPrebid.builder() .storedAuctionResponse(givenStoredResponse) .build())) .build()) .build(); - final BidResponse givenBidResponse = BidResponse.builder().build(); - given(bidResponseCreator.createOnSkippedAuction(any(), any())) - .willReturn(Future.succeededFuture(givenBidResponse)); - // when final Future result = target.skipAuction(givenAuctionContext); @@ -272,12 +301,24 @@ public void skipAuctionShouldReturnEmptySeatBidsWhenBidsAreEmpty() { .debugWarnings(List.of( "There must be at least one bid in stored response seatBid", "no auction. response defined by storedauctionresponse")) + .bidResponse(BidResponse.builder() + .id("requestId") + .cur("USD") + .seatbid(emptyList()) + .ext(ExtBidResponse.builder() + .tmaxrequest(1000L) + .warnings(singletonMap("prebid", List.of( + ExtBidderError.of(generic.getCode(), + "There must be at least one bid in stored response seatBid"), + ExtBidderError.of(generic.getCode(), + "no auction. response defined by storedauctionresponse")))) + .build()) + .build()) .build(); assertThat(result.succeeded()).isTrue(); - assertThat(result.result()).isEqualTo(expectedAuctionContext.with(givenBidResponse).skipAuction()); + assertThat(result.result()).isEqualTo(expectedAuctionContext.skipAuction()); - verify(bidResponseCreator).createOnSkippedAuction(expectedAuctionContext, emptyList()); verifyNoInteractions(storedResponseProcessor); } @@ -289,15 +330,15 @@ public void skipAuctionShouldReturnBidResponseWithEmptySeatBidsWhenNoValueAvaila .debugWarnings(new ArrayList<>()) .timeoutContext(TimeoutContext.of(1000L, timeout, 0)) .bidRequest(BidRequest.builder() + .id("requestId") + .tmax(1000L) + .cur(List.of("USD")) .ext(ExtRequest.of(ExtRequestPrebid.builder() .storedAuctionResponse(givenStoredResponse) .build())) .build()) .build(); - final BidResponse givenBidResponse = BidResponse.builder().build(); - given(bidResponseCreator.createOnSkippedAuction(any(), any())) - .willReturn(Future.succeededFuture(givenBidResponse)); given(storedResponseProcessor.getStoredResponseResult("id", timeout)) .willReturn(Future.failedFuture("no value")); @@ -309,12 +350,22 @@ public void skipAuctionShouldReturnBidResponseWithEmptySeatBidsWhenNoValueAvaila .debugWarnings(List.of( "no value", "no auction. response defined by storedauctionresponse")) + .bidResponse(BidResponse.builder() + .id("requestId") + .cur("USD") + .seatbid(emptyList()) + .ext(ExtBidResponse.builder() + .tmaxrequest(1000L) + .warnings(singletonMap("prebid", List.of( + ExtBidderError.of(generic.getCode(), "no value"), + ExtBidderError.of(generic.getCode(), + "no auction. response defined by storedauctionresponse")))) + .build()) + .build()) .build(); assertThat(result.succeeded()).isTrue(); - assertThat(result.result()).isEqualTo(expectedAuctionContext.with(givenBidResponse).skipAuction()); - - verify(bidResponseCreator).createOnSkippedAuction(expectedAuctionContext, Collections.emptyList()); + assertThat(result.result()).isEqualTo(expectedAuctionContext.skipAuction()); } @Test @@ -326,15 +377,15 @@ public void skipAuctionShouldReturnBidResponseWithStoredSeatBidsByProvidedId() { .debugWarnings(new ArrayList<>()) .timeoutContext(TimeoutContext.of(1000L, timeout, 0)) .bidRequest(BidRequest.builder() + .id("requestId") + .tmax(1000L) + .cur(List.of("USD")) .ext(ExtRequest.of(ExtRequestPrebid.builder() .storedAuctionResponse(givenStoredResponse) .build())) .build()) .build(); - final BidResponse givenBidResponse = BidResponse.builder().build(); - given(bidResponseCreator.createOnSkippedAuction(any(), any())) - .willReturn(Future.succeededFuture(givenBidResponse)); given(storedResponseProcessor.getStoredResponseResult("id", timeout)) .willReturn(Future.succeededFuture(StoredResponseResult.of(null, givenSeatBids, null))); @@ -344,12 +395,21 @@ public void skipAuctionShouldReturnBidResponseWithStoredSeatBidsByProvidedId() { // then final AuctionContext expectedAuctionContext = givenAuctionContext.toBuilder() .debugWarnings(singletonList("no auction. response defined by storedauctionresponse")) + .bidResponse(BidResponse.builder() + .id("requestId") + .cur("USD") + .seatbid(givenSeatBids) + .ext(ExtBidResponse.builder() + .tmaxrequest(1000L) + .warnings(singletonMap("prebid", List.of(ExtBidderError.of( + generic.getCode(), + "no auction. response defined by storedauctionresponse")))) + .build()) + .build()) .build(); assertThat(result.succeeded()).isTrue(); - assertThat(result.result()).isEqualTo(expectedAuctionContext.with(givenBidResponse).skipAuction()); - - verify(bidResponseCreator).createOnSkippedAuction(expectedAuctionContext, givenSeatBids); + assertThat(result.result()).isEqualTo(expectedAuctionContext.skipAuction()); } private static List givenSeatBids(String... bidIds) { diff --git a/src/test/java/org/prebid/server/auction/StoredResponseProcessorTest.java b/src/test/java/org/prebid/server/auction/StoredResponseProcessorTest.java index a137578ef14..dc57b3c1f11 100644 --- a/src/test/java/org/prebid/server/auction/StoredResponseProcessorTest.java +++ b/src/test/java/org/prebid/server/auction/StoredResponseProcessorTest.java @@ -530,7 +530,8 @@ public void mergeWithBidderResponsesShouldReturnMergedStoredSeatWithResponseWith // given final BidderResponse bidderResponse = BidderResponse.of( "rubicon", - BidderSeatBid.of(singletonList(BidderBid.of(Bid.builder().id("bid1").build(), BidType.banner, "USD"))), + BidderSeatBid.of(singletonList(BidderBid.of( + Bid.builder().id("bid1").build(), BidType.banner, "rubicon", "USD"))), 100); final AuctionParticipation requestAuctionParticipation = AuctionParticipation.builder() .bidder("rubicon") @@ -566,12 +567,14 @@ public void mergeWithBidderResponsesShouldReturnMergedStoredSeatWithResponseWith .impid("storedImp") .build(), BidType.banner, + "rubicon", "USD"), BidderBid.of( Bid.builder() .id("bid1") .build(), BidType.banner, + "rubicon", "USD")); verifyNoInteractions(appnexusBidRejectionTracker); @@ -611,7 +614,7 @@ public void mergeWithBidderResponsesShouldMergeBidderResponsesWithoutCorrespondi // then final List expectedAppnexusBids = singletonList( - BidderBid.of(Bid.builder().id("bid2").impid("storedImp").build(), BidType.banner, "USD")); + BidderBid.of(Bid.builder().id("bid2").impid("storedImp").build(), BidType.banner, "appnexus", "USD")); verify(rubiconBidRejectionTracker).restoreFromRejection(givenRubiconBids); verify(appnexusBidRejectionTracker).restoreFromRejection(expectedAppnexusBids); @@ -647,6 +650,7 @@ public void mergeWithBidderResponsesShouldMergeStoredSeatBidsWithoutBidderRespon final List expectedBids = singletonList(BidderBid.of( Bid.builder().id("bid2").impid("storedImp").build(), BidType.banner, + "rubicon", "USD")); verify(rubiconBidRejectionTracker).restoreFromRejection(expectedBids); @@ -663,7 +667,8 @@ public void mergeWithBidderResponsesShouldResolveCurrencyFromBidderResponse() { final BidderResponse bidderResponse = BidderResponse.of( "rubicon", BidderSeatBid.of( - singletonList(BidderBid.of(Bid.builder().id("bid1").build(), BidType.banner, "EUR"))), + singletonList(BidderBid.of( + Bid.builder().id("bid1").build(), BidType.banner, "rubicon", "EUR"))), 100); final AuctionParticipation requestAuctionParticipation = AuctionParticipation.builder() .bidder("rubicon") @@ -691,10 +696,12 @@ public void mergeWithBidderResponsesShouldResolveCurrencyFromBidderResponse() { BidderBid.of( Bid.builder().id("bid2").impid("storedImp").build(), BidType.banner, + "rubicon", "EUR"), BidderBid.of( Bid.builder().id("bid1").build(), BidType.banner, + "rubicon", "EUR")); verify(rubiconBidRejectionTracker).restoreFromRejection(expectedBids); @@ -711,7 +718,8 @@ public void mergeWithBidderResponsesShouldResolveBidTypeFromStoredBidExt() { final BidderResponse bidderResponse = BidderResponse.of( "rubicon", BidderSeatBid.of( - singletonList(BidderBid.of(Bid.builder().id("bid1").build(), BidType.banner, "USD"))), + singletonList(BidderBid.of( + Bid.builder().id("bid1").build(), BidType.banner, "rubicon", "USD"))), 100); final AuctionParticipation requestAuctionParticipation = AuctionParticipation.builder() .bidder("rubicon") @@ -748,8 +756,8 @@ public void mergeWithBidderResponsesShouldResolveBidTypeFromStoredBidExt() { .impid("storedImp") .ext(mapper.createObjectNode() .set("prebid", mapper.valueToTree(extBidPrebid))).build(), - BidType.video, "USD"), - BidderBid.of(Bid.builder().id("bid1").build(), BidType.banner, "USD")); + BidType.video, "rubicon", "USD"), + BidderBid.of(Bid.builder().id("bid1").build(), BidType.banner, "rubicon", "USD")); verify(rubiconBidRejectionTracker).restoreFromRejection(expectedBids); verifyNoInteractions(appnexusBidRejectionTracker); diff --git a/src/test/java/org/prebid/server/auction/UidUpdaterTest.java b/src/test/java/org/prebid/server/auction/UidUpdaterTest.java index a076d4c7a43..e6c0af37067 100644 --- a/src/test/java/org/prebid/server/auction/UidUpdaterTest.java +++ b/src/test/java/org/prebid/server/auction/UidUpdaterTest.java @@ -10,6 +10,7 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.prebid.server.VertxTest; +import org.prebid.server.auction.aliases.BidderAliases; import org.prebid.server.auction.model.AuctionContext; import org.prebid.server.bidder.BidderCatalog; import org.prebid.server.cookie.UidsCookie; diff --git a/src/test/java/org/prebid/server/auction/adjustment/BidAdjustmentFactorResolverTest.java b/src/test/java/org/prebid/server/auction/adjustment/BidAdjustmentFactorResolverTest.java index 7ff8439a960..f9267899fd5 100644 --- a/src/test/java/org/prebid/server/auction/adjustment/BidAdjustmentFactorResolverTest.java +++ b/src/test/java/org/prebid/server/auction/adjustment/BidAdjustmentFactorResolverTest.java @@ -1,6 +1,5 @@ package org.prebid.server.auction.adjustment; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.prebid.server.proto.openrtb.ext.request.ExtRequestBidAdjustmentFactors; import org.prebid.server.proto.openrtb.ext.request.ImpMediaType; @@ -13,25 +12,36 @@ public class BidAdjustmentFactorResolverTest { - private BidAdjustmentFactorResolver bidAdjustmentFactorResolver; - - @BeforeEach - public void setUp() { - bidAdjustmentFactorResolver = new BidAdjustmentFactorResolver(); - } + private final BidAdjustmentFactorResolver target = new BidAdjustmentFactorResolver(); @Test - public void resolveShouldReturnOneIfAdjustmentsByMediaTypeAndBidderAreAbsent() { + public void resolveShouldReturnOneIfAdjustmentsByMediaTypeAndBidderAreAbsentForBidderAndForSeat() { // when - final BigDecimal result = bidAdjustmentFactorResolver.resolve( + final BigDecimal result = target.resolve( ImpMediaType.video, ExtRequestBidAdjustmentFactors.builder().build(), - "bidder"); + "bidder1", + "bidder2"); // then assertThat(result).isEqualTo(BigDecimal.ONE); } + @Test + public void resolveShouldReturnSeatAdjustmentFactorOverBidderIfAdjustmentsByTypeAreAbsentIgnoringCase() { + // given + final ExtRequestBidAdjustmentFactors adjustmentFactors = + ExtRequestBidAdjustmentFactors.builder().build(); + adjustmentFactors.addFactor("BIDder", BigDecimal.valueOf(3.456)); + adjustmentFactors.addFactor("seat", BigDecimal.valueOf(4.456)); + + // when + final BigDecimal result = target.resolve(ImpMediaType.video, adjustmentFactors, "bidDER", "seAT"); + + // then + assertThat(result).isEqualTo(BigDecimal.valueOf(4.456)); + } + @Test public void resolveShouldReturnBidderAdjustmentFactorIfAdjustmentsByTypeAreAbsentIgnoringCase() { // given @@ -40,12 +50,62 @@ public void resolveShouldReturnBidderAdjustmentFactorIfAdjustmentsByTypeAreAbsen adjustmentFactors.addFactor("BIDder", BigDecimal.valueOf(3.456)); // when - final BigDecimal result = bidAdjustmentFactorResolver.resolve(ImpMediaType.video, adjustmentFactors, "bidDER"); + final BigDecimal result = target.resolve(ImpMediaType.video, adjustmentFactors, "bidDER", "seAT"); // then assertThat(result).isEqualTo(BigDecimal.valueOf(3.456)); } + @Test + public void resolveShouldReturnSeatAdjustmentByMediaTypeIfPresentIgnoringCase() { + // given + final EnumMap> adjustmentFactorsByMediaType = new EnumMap<>(Map.of( + ImpMediaType.video, Map.of( + "seat", BigDecimal.valueOf(0.234), + "BIDder", BigDecimal.valueOf(1.234)), + ImpMediaType.video_outstream, Map.of( + "bidder", BigDecimal.valueOf(2.345), + "SEAT", BigDecimal.valueOf(3.345)), + ImpMediaType.banner, Map.of("bidder", BigDecimal.valueOf(4.456)))); + + final ExtRequestBidAdjustmentFactors adjustmentFactors = + ExtRequestBidAdjustmentFactors.builder() + .mediatypes(adjustmentFactorsByMediaType) + .build(); + + adjustmentFactors.addFactor("BIDder", BigDecimal.valueOf(5.456)); + adjustmentFactors.addFactor("seat", BigDecimal.valueOf(6.456)); + + // when + final BigDecimal result = target.resolve(ImpMediaType.video, adjustmentFactors, "bidDER", "Seat"); + + // then + assertThat(result).isEqualTo(BigDecimal.valueOf(0.234)); + } + + @Test + public void resolveShouldReturnSeatAdjustmentFactorOverBidderByMediaTypeIfPresentIgnoringCase() { + // given + final EnumMap> adjustmentFactorsByMediaType = new EnumMap<>(Map.of( + ImpMediaType.video, Map.of("BIDder", BigDecimal.valueOf(1.234)), + ImpMediaType.video_outstream, Map.of("bidder", BigDecimal.valueOf(2.345)), + ImpMediaType.banner, Map.of("bidder", BigDecimal.valueOf(3.456)))); + + final ExtRequestBidAdjustmentFactors adjustmentFactors = + ExtRequestBidAdjustmentFactors.builder() + .mediatypes(adjustmentFactorsByMediaType) + .build(); + + adjustmentFactors.addFactor("BIDder", BigDecimal.valueOf(5.456)); + adjustmentFactors.addFactor("seat", BigDecimal.valueOf(6.456)); + + // when + final BigDecimal result = target.resolve(ImpMediaType.video, adjustmentFactors, "bidDER", "Seat"); + + // then + assertThat(result).isEqualTo(BigDecimal.valueOf(6.456)); + } + @Test public void resolveShouldReturnAdjustmentByMediaTypeIfPresentIgnoringCase() { // given @@ -59,8 +119,10 @@ public void resolveShouldReturnAdjustmentByMediaTypeIfPresentIgnoringCase() { .mediatypes(adjustmentFactorsByMediaType) .build(); + adjustmentFactors.addFactor("BIDder", BigDecimal.valueOf(5.456)); + // when - final BigDecimal result = bidAdjustmentFactorResolver.resolve(ImpMediaType.video, adjustmentFactors, "bidDER"); + final BigDecimal result = target.resolve(ImpMediaType.video, adjustmentFactors, "bidDER", "Seat"); // then assertThat(result).isEqualTo(BigDecimal.valueOf(1.234)); diff --git a/src/test/java/org/prebid/server/auction/aliases/BidderAliasesTest.java b/src/test/java/org/prebid/server/auction/aliases/BidderAliasesTest.java new file mode 100644 index 00000000000..a84149e1ef7 --- /dev/null +++ b/src/test/java/org/prebid/server/auction/aliases/BidderAliasesTest.java @@ -0,0 +1,437 @@ +package org.prebid.server.auction.aliases; + +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.bidder.BidderCatalog; +import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidAlternateBidderCodes; +import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidAlternateBidderCodesBidder; + +import java.util.Map; +import java.util.Set; + +import static java.util.Collections.singletonMap; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mock.Strictness.LENIENT; + +@ExtendWith(MockitoExtension.class) +public class BidderAliasesTest { + + @Mock(strictness = LENIENT) + private BidderCatalog bidderCatalog; + + @BeforeEach + public void before() { + given(bidderCatalog.isValidName(any())).willReturn(false); + given(bidderCatalog.isActive(any())).willReturn(false); + } + + @Test + public void isAliasDefinedShouldReturnFalseWhenNoAliasesInRequest() { + // given + final BidderAliases aliases = BidderAliases.of(null, null, bidderCatalog); + + // when and then + assertThat(aliases.isAliasDefined("alias")).isFalse(); + } + + @Test + public void isAliasDefinedShouldReturnFalseWhenAliasIsNotDefinedInRequest() { + // given + final BidderAliases aliases = BidderAliases.of(singletonMap("anotherAlias", "bidder"), null, bidderCatalog); + + // when and then + assertThat(aliases.isAliasDefined("alias")).isFalse(); + } + + @Test + public void isAliasDefinedShouldDetectAliasInRequest() { + // given + final BidderAliases aliases = BidderAliases.of(singletonMap("alias", "bidder"), null, bidderCatalog); + + // when and then + assertThat(aliases.isAliasDefined("alias")).isTrue(); + } + + @Test + public void resolveBidderShouldReturnInputWhenNoAliasesInRequest() { + // given + final BidderAliases aliases = BidderAliases.of(null, null, bidderCatalog); + + // when and then + assertThat(aliases.resolveBidder("alias")).isEqualTo("alias"); + } + + @Test + public void resolveBidderShouldReturnInputWhenNoAliasesInRequestButAliasIsValidInBidderCatalog() { + // given + given(bidderCatalog.isValidName("alias")).willReturn(true); + final BidderAliases aliases = BidderAliases.of(null, null, bidderCatalog); + + // when and then + assertThat(aliases.resolveBidder("alias")).isEqualTo("alias"); + } + + @Test + public void resolveBidderShouldReturnInputWhenAliasIsNotDefinedInRequest() { + // given + final BidderAliases aliases = BidderAliases.of(singletonMap("anotherAlias", "bidder"), null, bidderCatalog); + + // when and then + assertThat(aliases.resolveBidder("alias")).isEqualTo("alias"); + } + + @Test + public void resolveBidderShouldReturnInputWhenAliasIsNotDefinedInRequestButAliasIsValidInBidderCatalog() { + // given + given(bidderCatalog.isValidName("alias")).willReturn(true); + final BidderAliases aliases = BidderAliases.of(singletonMap("anotherAlias", "bidder"), null, bidderCatalog); + + // when and then + assertThat(aliases.resolveBidder("alias")).isEqualTo("alias"); + } + + @Test + public void resolveBidderShouldDetectAliasInRequest() { + // given + final BidderAliases aliases = BidderAliases.of(singletonMap("alias", "bidder"), null, bidderCatalog); + + // when and then + assertThat(aliases.resolveBidder("alias")).isEqualTo("bidder"); + } + + @Test + public void resolveBidderShouldDetectInBidderCatalogWhenItIsValid() { + // given + given(bidderCatalog.isValidName("alias")).willReturn(true); + final BidderAliases aliases = BidderAliases.of(singletonMap("alias", "bidder"), null, bidderCatalog); + + // when and then + assertThat(aliases.resolveBidder("alias")).isEqualTo("alias"); + } + + @Test + public void isSameShouldReturnTrueIfBiddersSameConsideringAliases() { + // given + final BidderAliases aliases = BidderAliases.of( + Map.of("alias1", "bidder", "alias2", "bidder"), + null, + bidderCatalog); + + // when and then + assertThat(aliases.isSame("bidder", "bidder")).isTrue(); + assertThat(aliases.isSame("alias1", "bidder")).isTrue(); + assertThat(aliases.isSame("alias2", "bidder")).isTrue(); + assertThat(aliases.isSame("alias1", "alias2")).isTrue(); + } + + @Test + public void isSameShouldReturnTrueIfBiddersSameConsideringAliasesIgnoringCase() { + // given + final BidderAliases aliases = BidderAliases.of( + Map.of("alias1", "bidder", "alias2", "BiDdEr"), + null, + bidderCatalog); + + // when and then + assertThat(aliases.isSame("BIDder", "bidDER")).isTrue(); + assertThat(aliases.isSame("alias1", "bidDER")).isTrue(); + assertThat(aliases.isSame("alias2", "bidDER")).isTrue(); + assertThat(aliases.isSame("alias1", "alias2")).isTrue(); + } + + @Test + public void resolveAliasVendorIdShouldReturnNullWhenNoVendorIdsInRequest() { + // given + final BidderAliases aliases = BidderAliases.of(null, null, bidderCatalog); + + // when and then + assertThat(aliases.resolveAliasVendorId("alias")).isNull(); + } + + @Test + public void resolveAliasVendorIdShouldReturnVendorIdFromBidderCatalogWhenNoVendorIdsInRequest() { + // given + given(bidderCatalog.isActive("alias")).willReturn(true); + given(bidderCatalog.vendorIdByName("alias")).willReturn(3); + final BidderAliases aliases = BidderAliases.of(null, null, bidderCatalog); + + // when and then + assertThat(aliases.resolveAliasVendorId("alias")).isEqualTo(3); + } + + @Test + public void resolveAliasVendorIdShouldReturnNullWhenVendorIdIsNotDefinedInRequest() { + // given + final BidderAliases aliases = BidderAliases.of(null, singletonMap("anotherAlias", 2), bidderCatalog); + + // when and then + assertThat(aliases.resolveAliasVendorId("alias")).isNull(); + } + + @Test + public void resolveAliasVendorIdShouldReturnVendorIdFromBidderCatalogWhenVendorIdIsNotDefinedInRequest() { + // given + given(bidderCatalog.isActive("alias")).willReturn(true); + given(bidderCatalog.vendorIdByName("alias")).willReturn(3); + final BidderAliases aliases = BidderAliases.of(null, singletonMap("anotherAlias", 2), bidderCatalog); + + // when and then + assertThat(aliases.resolveAliasVendorId("alias")).isEqualTo(3); + } + + @Test + public void resolveAliasVendorIdShouldReturnVendorIdFromBidderCatalogWhenVendorIdIsInRequest() { + // given + given(bidderCatalog.isActive("alias")).willReturn(true); + given(bidderCatalog.vendorIdByName("alias")).willReturn(3); + final BidderAliases aliases = BidderAliases.of(null, singletonMap("alias", 2), bidderCatalog); + + // when and then + assertThat(aliases.resolveAliasVendorId("alias")).isEqualTo(3); + } + + @Test + public void isAllowedAlternateBidderCodeShouldReturnFalseWhenAlternateBidderCodesAreDisabledForBidder() { + // given + final ExtRequestPrebidAlternateBidderCodes alternateBidderCodes = ExtRequestPrebidAlternateBidderCodes.of( + true, + Map.of("bidder", ExtRequestPrebidAlternateBidderCodesBidder.of(false, Set.of("seat")))); + final BidderAliases aliases = BidderAliases.of(null, null, bidderCatalog, alternateBidderCodes); + + // when and then + assertThat(aliases.isAllowedAlternateBidderCode("bidder", "seat")).isFalse(); + } + + @Test + public void isAllowedAlternateBidderCodeShouldReturnFalseWhenAlternateBidderCodesAreLackingSeat() { + // given + final ExtRequestPrebidAlternateBidderCodes alternateBidderCodes = ExtRequestPrebidAlternateBidderCodes.of( + true, + Map.of("bidder", ExtRequestPrebidAlternateBidderCodesBidder.of(true, Set.of("another")))); + final BidderAliases aliases = BidderAliases.of(null, null, bidderCatalog, alternateBidderCodes); + + // when and then + assertThat(aliases.isAllowedAlternateBidderCode("bidder", "seat")).isFalse(); + } + + @Test + public void isAllowedAlternateBidderCodeShouldReturnFalseWhenAlternateBidderCodesAreLackingBidders() { + // given + final ExtRequestPrebidAlternateBidderCodes alternateBidderCodes = ExtRequestPrebidAlternateBidderCodes.of( + true, + null); + final BidderAliases aliases = BidderAliases.of(null, null, bidderCatalog, alternateBidderCodes); + + // when and then + assertThat(aliases.isAllowedAlternateBidderCode("bidder", "seat")).isFalse(); + } + + @Test + public void isAllowedAlternateBidderCodeShouldReturnFalseWhenAlternateBidderCodesAreDisabled() { + // given + final ExtRequestPrebidAlternateBidderCodes alternateBidderCodes = ExtRequestPrebidAlternateBidderCodes.of( + false, + Map.of("bidder", ExtRequestPrebidAlternateBidderCodesBidder.of(true, Set.of("seat")))); + final BidderAliases aliases = BidderAliases.of(null, null, bidderCatalog, alternateBidderCodes); + + // when and then + assertThat(aliases.isAllowedAlternateBidderCode("bidder", "seat")).isFalse(); + } + + @Test + public void isAllowedAlternateBidderCodeShouldReturnTrueWhenAllowedAlternateCodesAreNull() { + // given + final ExtRequestPrebidAlternateBidderCodes alternateBidderCodes = ExtRequestPrebidAlternateBidderCodes.of( + true, + Map.of("bidder", ExtRequestPrebidAlternateBidderCodesBidder.of(true, null))); + final BidderAliases aliases = BidderAliases.of(null, null, bidderCatalog, alternateBidderCodes); + + // when and then + assertThat(aliases.isAllowedAlternateBidderCode("bidder", "seat")).isTrue(); + } + + @Test + public void isAllowedAlternateBidderCodeShouldReturnTrueWhenAllowedAlternateCodesContainsWildcard() { + // given + final ExtRequestPrebidAlternateBidderCodes alternateBidderCodes = ExtRequestPrebidAlternateBidderCodes.of( + true, + Map.of("bidder", ExtRequestPrebidAlternateBidderCodesBidder.of(true, Set.of("*")))); + final BidderAliases aliases = BidderAliases.of(null, null, bidderCatalog, alternateBidderCodes); + + // when and then + assertThat(aliases.isAllowedAlternateBidderCode("bidder", "seat")).isTrue(); + } + + @Test + public void isAllowedAlternateBidderCodeShouldReturnTrueWhenAllowedAlternateCodesContainsSeatCaseInsensitive() { + // given + final ExtRequestPrebidAlternateBidderCodes alternateBidderCodes = ExtRequestPrebidAlternateBidderCodes.of( + true, + Map.of("BiDDEr", ExtRequestPrebidAlternateBidderCodesBidder.of(true, Set.of("SeaT")))); + + final BidderAliases aliases = BidderAliases.of(null, null, bidderCatalog, alternateBidderCodes); + + // when and then + assertThat(aliases.isAllowedAlternateBidderCode("bidder", "seat")).isTrue(); + } + + @Test + public void isAllowedAlternateBidderCodeShouldReturnTrueForActualBidderWhenAliasIsNotDefined() { + // given + final ExtRequestPrebidAlternateBidderCodes alternateBidderCodes = ExtRequestPrebidAlternateBidderCodes.of( + true, + Map.of("bidder", ExtRequestPrebidAlternateBidderCodesBidder.of(true, Set.of("seat")))); + + final BidderAliases aliases = BidderAliases.of( + Map.of("alias", "bidder"), + null, + bidderCatalog, + alternateBidderCodes); + + // when and then + assertThat(aliases.isAllowedAlternateBidderCode("alias", "seat")).isTrue(); + } + + @Test + public void isAllowedAlternateBidderCodeShouldReturnTrueForAliasWhenAliasIsDefined() { + // given + final ExtRequestPrebidAlternateBidderCodes alternateBidderCodes = ExtRequestPrebidAlternateBidderCodes.of( + true, + Map.of("bidder", ExtRequestPrebidAlternateBidderCodesBidder.of(true, Set.of("another")), + "alias", ExtRequestPrebidAlternateBidderCodesBidder.of(true, Set.of("seat")))); + + final BidderAliases aliases = BidderAliases.of( + Map.of("alias", "bidder"), + null, + bidderCatalog, + alternateBidderCodes); + + // when and then + assertThat(aliases.isAllowedAlternateBidderCode("alias", "seat")).isTrue(); + } + + @Test + public void isKnownAlternateBidderCodeShouldReturnFalseWhenAlternateBidderCodesAreDisabledForBidder() { + // given + final ExtRequestPrebidAlternateBidderCodes alternateBidderCodes = ExtRequestPrebidAlternateBidderCodes.of( + true, + Map.of("bidder", ExtRequestPrebidAlternateBidderCodesBidder.of(false, Set.of("seat")))); + final BidderAliases aliases = BidderAliases.of(null, null, bidderCatalog, alternateBidderCodes); + + // when and then + assertThat(aliases.isKnownAlternateBidderCode("seat")).isFalse(); + } + + @Test + public void isKnownAlternateBidderCodeShouldReturnFalseWhenAlternateBidderCodesAreLackingSeat() { + // given + final ExtRequestPrebidAlternateBidderCodes alternateBidderCodes = ExtRequestPrebidAlternateBidderCodes.of( + true, + Map.of("bidder", ExtRequestPrebidAlternateBidderCodesBidder.of(true, Set.of("another")))); + final BidderAliases aliases = BidderAliases.of(null, null, bidderCatalog, alternateBidderCodes); + + // when and then + assertThat(aliases.isKnownAlternateBidderCode("seat")).isFalse(); + } + + @Test + public void isKnownAlternateBidderCodeShouldReturnFalseWhenAlternateBidderCodesAreLackingBidders() { + // given + final ExtRequestPrebidAlternateBidderCodes alternateBidderCodes = ExtRequestPrebidAlternateBidderCodes.of( + true, + null); + final BidderAliases aliases = BidderAliases.of(null, null, bidderCatalog, alternateBidderCodes); + + // when and then + assertThat(aliases.isKnownAlternateBidderCode("seat")).isFalse(); + } + + @Test + public void iisKnownAlternateBidderCodeShouldReturnFalseWhenAlternateBidderCodesAreDisabled() { + // given + final ExtRequestPrebidAlternateBidderCodes alternateBidderCodes = ExtRequestPrebidAlternateBidderCodes.of( + false, + Map.of("bidder", ExtRequestPrebidAlternateBidderCodesBidder.of(true, Set.of("seat")))); + final BidderAliases aliases = BidderAliases.of(null, null, bidderCatalog, alternateBidderCodes); + + // when and then + assertThat(aliases.isKnownAlternateBidderCode("seat")).isFalse(); + } + + @Test + public void isKnownAlternateBidderCodeShouldReturnTrueWhenAllowedAlternateCodesAreNull() { + // given + final ExtRequestPrebidAlternateBidderCodes alternateBidderCodes = ExtRequestPrebidAlternateBidderCodes.of( + true, + Map.of("bidder", ExtRequestPrebidAlternateBidderCodesBidder.of(true, null))); + final BidderAliases aliases = BidderAliases.of(null, null, bidderCatalog, alternateBidderCodes); + + // when and then + assertThat(aliases.isKnownAlternateBidderCode("seat")).isTrue(); + } + + @Test + public void isKnownAlternateBidderCodeShouldReturnTrueWhenAllowedAlternateCodesContainsWildcard() { + // given + final ExtRequestPrebidAlternateBidderCodes alternateBidderCodes = ExtRequestPrebidAlternateBidderCodes.of( + true, + Map.of("bidder", ExtRequestPrebidAlternateBidderCodesBidder.of(true, Set.of("*")))); + final BidderAliases aliases = BidderAliases.of(null, null, bidderCatalog, alternateBidderCodes); + + // when and then + assertThat(aliases.isKnownAlternateBidderCode("seat")).isTrue(); + } + + @Test + public void isKnownAlternateBidderCodeShouldReturnTrueWhenAllowedAlternateCodesContainsSeatCaseInsensitive() { + // given + final ExtRequestPrebidAlternateBidderCodes alternateBidderCodes = ExtRequestPrebidAlternateBidderCodes.of( + true, + Map.of("BiDDEr", ExtRequestPrebidAlternateBidderCodesBidder.of(true, Set.of("SeaT")))); + + final BidderAliases aliases = BidderAliases.of(null, null, bidderCatalog, alternateBidderCodes); + + // when and then + assertThat(aliases.isKnownAlternateBidderCode("seat")).isTrue(); + } + + @Test + public void isKnownAlternateBidderCodeShouldReturnTrueForActualBidderWhenAliasIsNotDefined() { + // given + final ExtRequestPrebidAlternateBidderCodes alternateBidderCodes = ExtRequestPrebidAlternateBidderCodes.of( + true, + Map.of("bidder", ExtRequestPrebidAlternateBidderCodesBidder.of(true, Set.of("seat")))); + + final BidderAliases aliases = BidderAliases.of( + Map.of("alias", "bidder"), + null, + bidderCatalog, + alternateBidderCodes); + + // when and then + assertThat(aliases.isKnownAlternateBidderCode("seat")).isTrue(); + } + + @Test + public void isKnownAlternateBidderCodeShouldReturnTrueForAliasWhenAliasIsDefined() { + // given + final ExtRequestPrebidAlternateBidderCodes alternateBidderCodes = ExtRequestPrebidAlternateBidderCodes.of( + true, + Map.of("bidder", ExtRequestPrebidAlternateBidderCodesBidder.of(true, Set.of("another")), + "alias", ExtRequestPrebidAlternateBidderCodesBidder.of(true, Set.of("seat")))); + + final BidderAliases aliases = BidderAliases.of( + Map.of("alias", "bidder"), + null, + bidderCatalog, + alternateBidderCodes); + + // when and then + assertThat(aliases.isKnownAlternateBidderCode("seat")).isTrue(); + } +} diff --git a/src/test/java/org/prebid/server/auction/mediatypeprocessor/BidderMediaTypeProcessorTest.java b/src/test/java/org/prebid/server/auction/mediatypeprocessor/BidderMediaTypeProcessorTest.java index 16875667fae..d6e002489f8 100644 --- a/src/test/java/org/prebid/server/auction/mediatypeprocessor/BidderMediaTypeProcessorTest.java +++ b/src/test/java/org/prebid/server/auction/mediatypeprocessor/BidderMediaTypeProcessorTest.java @@ -14,7 +14,7 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.prebid.server.VertxTest; -import org.prebid.server.auction.BidderAliases; +import org.prebid.server.auction.aliases.BidderAliases; import org.prebid.server.auction.versionconverter.OrtbVersion; import org.prebid.server.bidder.BidderCatalog; import org.prebid.server.bidder.BidderInfo; diff --git a/src/test/java/org/prebid/server/auction/mediatypeprocessor/CompositeMediaTypeProcessorTest.java b/src/test/java/org/prebid/server/auction/mediatypeprocessor/CompositeMediaTypeProcessorTest.java index 0ed72d11aa1..0bc3c835600 100644 --- a/src/test/java/org/prebid/server/auction/mediatypeprocessor/CompositeMediaTypeProcessorTest.java +++ b/src/test/java/org/prebid/server/auction/mediatypeprocessor/CompositeMediaTypeProcessorTest.java @@ -6,7 +6,7 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import org.prebid.server.auction.BidderAliases; +import org.prebid.server.auction.aliases.BidderAliases; import org.prebid.server.bidder.model.BidderError; import static java.util.Arrays.asList; diff --git a/src/test/java/org/prebid/server/auction/mediatypeprocessor/MultiFormatMediaTypeProcessorTest.java b/src/test/java/org/prebid/server/auction/mediatypeprocessor/MultiFormatMediaTypeProcessorTest.java index 61bf49b8745..a8da73fe320 100644 --- a/src/test/java/org/prebid/server/auction/mediatypeprocessor/MultiFormatMediaTypeProcessorTest.java +++ b/src/test/java/org/prebid/server/auction/mediatypeprocessor/MultiFormatMediaTypeProcessorTest.java @@ -14,7 +14,7 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.prebid.server.VertxTest; -import org.prebid.server.auction.BidderAliases; +import org.prebid.server.auction.aliases.BidderAliases; import org.prebid.server.auction.versionconverter.OrtbVersion; import org.prebid.server.bidder.BidderCatalog; import org.prebid.server.bidder.BidderInfo; diff --git a/src/test/java/org/prebid/server/auction/model/BidRejectionTrackerTest.java b/src/test/java/org/prebid/server/auction/model/BidRejectionTrackerTest.java index 502b09108b5..e25207e0e16 100644 --- a/src/test/java/org/prebid/server/auction/model/BidRejectionTrackerTest.java +++ b/src/test/java/org/prebid/server/auction/model/BidRejectionTrackerTest.java @@ -14,6 +14,13 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.core.api.Assertions.entry; +import static org.prebid.server.auction.model.BidRejectionReason.ERROR_GENERAL; +import static org.prebid.server.auction.model.BidRejectionReason.ERROR_INVALID_BID_RESPONSE; +import static org.prebid.server.auction.model.BidRejectionReason.ERROR_TIMED_OUT; +import static org.prebid.server.auction.model.BidRejectionReason.NO_BID; +import static org.prebid.server.auction.model.BidRejectionReason.RESPONSE_REJECTED_BELOW_FLOOR; +import static org.prebid.server.auction.model.BidRejectionReason.RESPONSE_REJECTED_DSA_PRIVACY; +import static org.prebid.server.auction.model.BidRejectionReason.RESPONSE_REJECTED_GENERAL; public class BidRejectionTrackerTest { @@ -27,23 +34,23 @@ public void setUp() { @Test public void succeedShouldRestoreImpFromImpRejection() { // given - target.rejectImp("impId1", BidRejectionReason.ERROR_GENERAL); + target.rejectImp("impId1", ERROR_GENERAL); // when - final BidderBid bid = BidderBid.builder().bid(Bid.builder().id("bidId1").impid("impId1").build()).build(); + final BidderBid bid = givenBid("bidId1", "impId1"); target.succeed(singleton(bid)); // then assertThat(target.getRejectedImps()).isEmpty(); assertThat(target.getRejectedBids()) - .containsOnly(entry("impId1", List.of(Pair.of(null, BidRejectionReason.ERROR_GENERAL)))); + .containsOnly(entry("impId1", List.of(Pair.of(null, ERROR_GENERAL)))); } @Test public void succeedShouldRestoreImpFromBidRejection() { // given - final BidderBid bid = BidderBid.builder().bid(Bid.builder().id("bidId1").impid("impId1").build()).build(); - target.rejectBid(bid, BidRejectionReason.ERROR_GENERAL); + final BidderBid bid = givenBid("bidId1", "impId1"); + target.rejectBid(bid, ERROR_GENERAL); // when target.succeed(singleton(bid)); @@ -51,166 +58,166 @@ public void succeedShouldRestoreImpFromBidRejection() { // then assertThat(target.getRejectedImps()).isEmpty(); assertThat(target.getRejectedBids()) - .containsOnly(entry("impId1", List.of(Pair.of(bid, BidRejectionReason.ERROR_GENERAL)))); + .containsOnly(entry("impId1", List.of(Pair.of(bid, ERROR_GENERAL)))); } @Test public void succeedShouldIgnoreUninvolvedImpIdsOnImpRejection() { // given - target.rejectImp("impId1", BidRejectionReason.ERROR_GENERAL); + target.rejectImp("impId1", ERROR_GENERAL); // when - final BidderBid bid = BidderBid.builder().bid(Bid.builder().id("bidId2").impid("impId2").build()).build(); + final BidderBid bid = givenBid("bidId2", "impId2"); target.succeed(singleton(bid)); // then - assertThat(target.getRejectedImps()).containsOnly(entry("impId1", BidRejectionReason.ERROR_GENERAL)); + assertThat(target.getRejectedImps()).containsOnly(entry("impId1", Pair.of("bidder", ERROR_GENERAL))); assertThat(target.getRejectedBids()) - .containsOnly(entry("impId1", List.of(Pair.of(null, BidRejectionReason.ERROR_GENERAL)))); + .containsOnly(entry("impId1", List.of(Pair.of(null, ERROR_GENERAL)))); } @Test public void succeedShouldIgnoreUninvolvedImpIdsOnBidRejection() { // given - final BidderBid bid1 = BidderBid.builder().bid(Bid.builder().id("bidId1").impid("impId1").build()).build(); - target.rejectBid(bid1, BidRejectionReason.ERROR_GENERAL); + final BidderBid bid1 = givenBid("bidId1", "impId1"); + target.rejectBid(bid1, ERROR_GENERAL); // when - final BidderBid bid2 = BidderBid.builder().bid(Bid.builder().id("bidId2").impid("impId2").build()).build(); + final BidderBid bid2 = givenBid("bidId2", "impId2"); target.succeed(singleton(bid2)); // then - assertThat(target.getRejectedImps()).containsOnly(entry("impId1", BidRejectionReason.ERROR_GENERAL)); + assertThat(target.getRejectedImps()).containsOnly(entry("impId1", Pair.of("seat", ERROR_GENERAL))); assertThat(target.getRejectedBids()) - .containsOnly(entry("impId1", List.of(Pair.of(bid1, BidRejectionReason.ERROR_GENERAL)))); + .containsOnly(entry("impId1", List.of(Pair.of(bid1, ERROR_GENERAL)))); } @Test public void rejectImpShouldRecordImpRejectionFirstTimeIfImpIdIsInvolved() { // when - target.rejectImp("impId1", BidRejectionReason.ERROR_GENERAL); + target.rejectImp("impId1", ERROR_GENERAL); // then - assertThat(target.getRejectedImps()).containsOnly(entry("impId1", BidRejectionReason.ERROR_GENERAL)); + assertThat(target.getRejectedImps()).containsOnly(entry("impId1", Pair.of("bidder", ERROR_GENERAL))); assertThat(target.getRejectedBids()) - .containsOnly(entry("impId1", List.of(Pair.of(null, BidRejectionReason.ERROR_GENERAL)))); + .containsOnly(entry("impId1", List.of(Pair.of(null, ERROR_GENERAL)))); } @Test public void rejectBidShouldRecordBidRejectionFirstTimeIfImpIdIsInvolved() { // when - final BidderBid bid = BidderBid.builder().bid(Bid.builder().id("bidId1").impid("impId1").build()).build(); - target.rejectBid(bid, BidRejectionReason.ERROR_GENERAL); + final BidderBid bid = givenBid("bidId1", "impId1"); + target.rejectBid(bid, ERROR_GENERAL); // then - assertThat(target.getRejectedImps()).containsOnly(entry("impId1", BidRejectionReason.ERROR_GENERAL)); + assertThat(target.getRejectedImps()).containsOnly(entry("impId1", Pair.of("seat", ERROR_GENERAL))); assertThat(target.getRejectedBids()) - .containsOnly(entry("impId1", List.of(Pair.of(bid, BidRejectionReason.ERROR_GENERAL)))); + .containsOnly(entry("impId1", List.of(Pair.of(bid, ERROR_GENERAL)))); } @Test public void rejectBidShouldRecordBidRejectionAfterPreviouslySucceededBid() { // given - final BidderBid bid1 = BidderBid.builder().bid(Bid.builder().id("bidId1").impid("impId1").build()).build(); - final BidderBid bid2 = BidderBid.builder().bid(Bid.builder().id("bidId2").impid("impId1").build()).build(); + final BidderBid bid1 = givenBid("bidId1", "impId1"); + final BidderBid bid2 = givenBid("bidId2", "impId1"); target.succeed(Set.of(bid1, bid2)); // when - target.rejectBid(bid1, BidRejectionReason.ERROR_GENERAL); + target.rejectBid(bid1, ERROR_GENERAL); // then assertThat(target.getRejectedImps()).isEmpty(); assertThat(target.getRejectedBids()) - .containsOnly(entry("impId1", List.of(Pair.of(bid1, BidRejectionReason.ERROR_GENERAL)))); + .containsOnly(entry("impId1", List.of(Pair.of(bid1, ERROR_GENERAL)))); } @Test public void rejectImpShouldNotRecordImpRejectionIfImpIdIsAlreadyRejected() { // given - target.rejectImp("impId1", BidRejectionReason.ERROR_GENERAL); + target.rejectImp("impId1", ERROR_GENERAL); // when - target.rejectImp("impId1", BidRejectionReason.ERROR_INVALID_BID_RESPONSE); + target.rejectImp("impId1", ERROR_INVALID_BID_RESPONSE); // then - assertThat(target.getRejectedImps()).containsOnly(entry("impId1", BidRejectionReason.ERROR_GENERAL)); + assertThat(target.getRejectedImps()).containsOnly(entry("impId1", Pair.of("bidder", ERROR_GENERAL))); assertThat(target.getRejectedBids()) .containsOnly(entry("impId1", List.of( - Pair.of(null, BidRejectionReason.ERROR_GENERAL), - Pair.of(null, BidRejectionReason.ERROR_INVALID_BID_RESPONSE)))); + Pair.of(null, ERROR_GENERAL), + Pair.of(null, ERROR_INVALID_BID_RESPONSE)))); } @Test public void rejectBidShouldNotRecordImpRejectionButRecordBidRejectionEvenIfImpIsAlreadyRejected() { // given - final BidderBid bid1 = BidderBid.builder().bid(Bid.builder().id("bidId1").impid("impId1").build()).build(); - target.rejectBid(bid1, BidRejectionReason.RESPONSE_REJECTED_GENERAL); + final BidderBid bid1 = givenBid("bidId1", "impId1"); + target.rejectBid(bid1, RESPONSE_REJECTED_GENERAL); // when - final BidderBid bid2 = BidderBid.builder().bid(Bid.builder().id("bidId2").impid("impId1").build()).build(); - target.rejectBid(bid2, BidRejectionReason.RESPONSE_REJECTED_BELOW_FLOOR); + final BidderBid bid2 = givenBid("bidId2", "impId1"); + target.rejectBid(bid2, RESPONSE_REJECTED_BELOW_FLOOR); // then assertThat(target.getRejectedImps()) - .containsOnly(entry("impId1", BidRejectionReason.RESPONSE_REJECTED_GENERAL)); + .containsOnly(entry("impId1", Pair.of("seat", RESPONSE_REJECTED_GENERAL))); assertThat(target.getRejectedBids()) .containsOnly(entry("impId1", List.of( - Pair.of(bid1, BidRejectionReason.RESPONSE_REJECTED_GENERAL), - Pair.of(bid2, BidRejectionReason.RESPONSE_REJECTED_BELOW_FLOOR)))); + Pair.of(bid1, RESPONSE_REJECTED_GENERAL), + Pair.of(bid2, RESPONSE_REJECTED_BELOW_FLOOR)))); } @Test public void rejectAllImpsShouldTryRejectingEachImpId() { // given target = new BidRejectionTracker("bidder", Set.of("impId1", "impId2", "impId3"), 0); - target.rejectImp("impId1", BidRejectionReason.NO_BID); + target.rejectImp("impId1", NO_BID); // when - target.rejectAllImps(BidRejectionReason.ERROR_TIMED_OUT); + target.rejectAllImps(ERROR_TIMED_OUT); // then assertThat(target.getRejectedImps()) .isEqualTo(Map.of( - "impId1", BidRejectionReason.NO_BID, - "impId2", BidRejectionReason.ERROR_TIMED_OUT, - "impId3", BidRejectionReason.ERROR_TIMED_OUT)); + "impId1", Pair.of("bidder", NO_BID), + "impId2", Pair.of("bidder", ERROR_TIMED_OUT), + "impId3", Pair.of("bidder", ERROR_TIMED_OUT))); assertThat(target.getRejectedBids()) .containsOnly( entry("impId1", List.of( - Pair.of(null, BidRejectionReason.NO_BID), - Pair.of(null, BidRejectionReason.ERROR_TIMED_OUT))), - entry("impId2", List.of(Pair.of(null, BidRejectionReason.ERROR_TIMED_OUT))), - entry("impId3", List.of(Pair.of(null, BidRejectionReason.ERROR_TIMED_OUT)))); + Pair.of(null, NO_BID), + Pair.of(null, ERROR_TIMED_OUT))), + entry("impId2", List.of(Pair.of(null, ERROR_TIMED_OUT))), + entry("impId3", List.of(Pair.of(null, ERROR_TIMED_OUT)))); } @Test public void rejectBidsShouldTryRejectingEachBid() { // given target = new BidRejectionTracker("bidder", Set.of("impId1", "impId2", "impId3"), 0); - final BidderBid bid0 = BidderBid.builder().bid(Bid.builder().id("bidId0").impid("impId1").build()).build(); - target.rejectBid(bid0, BidRejectionReason.RESPONSE_REJECTED_GENERAL); + final BidderBid bid0 = givenBid("bidId0", "impId1"); + target.rejectBid(bid0, RESPONSE_REJECTED_GENERAL); // when - final BidderBid bid1 = BidderBid.builder().bid(Bid.builder().id("bidId1").impid("impId1").build()).build(); - final BidderBid bid2 = BidderBid.builder().bid(Bid.builder().id("bidId2").impid("impId2").build()).build(); - final BidderBid bid3 = BidderBid.builder().bid(Bid.builder().id("bidId3").impid("impId3").build()).build(); - target.rejectBids(Set.of(bid1, bid2, bid3), BidRejectionReason.RESPONSE_REJECTED_DSA_PRIVACY); + final BidderBid bid1 = givenBid("bidId1", "impId1"); + final BidderBid bid2 = givenBid("bidId2", "impId2"); + final BidderBid bid3 = givenBid("bidId3", "impId3"); + target.rejectBids(Set.of(bid1, bid2, bid3), RESPONSE_REJECTED_DSA_PRIVACY); // then assertThat(target.getRejectedImps()) .isEqualTo(Map.of( - "impId1", BidRejectionReason.RESPONSE_REJECTED_GENERAL, - "impId2", BidRejectionReason.RESPONSE_REJECTED_DSA_PRIVACY, - "impId3", BidRejectionReason.RESPONSE_REJECTED_DSA_PRIVACY)); + "impId1", Pair.of("seat", RESPONSE_REJECTED_GENERAL), + "impId2", Pair.of("seat", RESPONSE_REJECTED_DSA_PRIVACY), + "impId3", Pair.of("seat", RESPONSE_REJECTED_DSA_PRIVACY))); assertThat(target.getRejectedBids()) .containsOnly( entry("impId1", List.of( - Pair.of(bid0, BidRejectionReason.RESPONSE_REJECTED_GENERAL), - Pair.of(bid1, BidRejectionReason.RESPONSE_REJECTED_DSA_PRIVACY))), - entry("impId2", List.of(Pair.of(bid2, BidRejectionReason.RESPONSE_REJECTED_DSA_PRIVACY))), - entry("impId3", List.of(Pair.of(bid3, BidRejectionReason.RESPONSE_REJECTED_DSA_PRIVACY)))); + Pair.of(bid0, RESPONSE_REJECTED_GENERAL), + Pair.of(bid1, RESPONSE_REJECTED_DSA_PRIVACY))), + entry("impId2", List.of(Pair.of(bid2, RESPONSE_REJECTED_DSA_PRIVACY))), + entry("impId3", List.of(Pair.of(bid3, RESPONSE_REJECTED_DSA_PRIVACY)))); } @Test @@ -221,14 +228,21 @@ public void getRejectedImpsShouldTreatUnsuccessfulImpsAsNoBidRejection() { target.succeed(singleton(bid)); // then - assertThat(target.getRejectedImps()).containsOnly(entry("impId1", BidRejectionReason.NO_BID)); + assertThat(target.getRejectedImps()).containsOnly(entry("impId1", Pair.of("bidder", NO_BID))); } @Test public void rejectImpShouldFailRejectingWithReasonThatImpliesExistingBidToReject() { - assertThatThrownBy(() -> target.rejectImp("impId1", BidRejectionReason.RESPONSE_REJECTED_DSA_PRIVACY)) + assertThatThrownBy(() -> target.rejectImp("impId1", RESPONSE_REJECTED_DSA_PRIVACY)) .isInstanceOf(IllegalArgumentException.class) .hasMessage("The non-bid code 300 and higher assumes " + "that there is a rejected bid that shouldn't be lost"); } + + private BidderBid givenBid(String bidId, String impId) { + return BidderBid.builder() + .seat("seat") + .bid(Bid.builder().id(bidId).impid(impId).build()) + .build(); + } } diff --git a/src/test/java/org/prebid/server/auction/privacy/enforcement/ActivityEnforcementTest.java b/src/test/java/org/prebid/server/auction/privacy/enforcement/ActivityEnforcementTest.java index 6e4662a501d..0ffa9111b0c 100644 --- a/src/test/java/org/prebid/server/auction/privacy/enforcement/ActivityEnforcementTest.java +++ b/src/test/java/org/prebid/server/auction/privacy/enforcement/ActivityEnforcementTest.java @@ -9,7 +9,7 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.prebid.server.activity.infrastructure.ActivityInfrastructure; -import org.prebid.server.auction.BidderAliases; +import org.prebid.server.auction.aliases.BidderAliases; import org.prebid.server.auction.model.AuctionContext; import org.prebid.server.auction.model.BidderPrivacyResult; import org.prebid.server.auction.privacy.enforcement.mask.UserFpdActivityMask; diff --git a/src/test/java/org/prebid/server/auction/privacy/enforcement/CcpaEnforcementTest.java b/src/test/java/org/prebid/server/auction/privacy/enforcement/CcpaEnforcementTest.java index 178e48ff97d..0133741f248 100644 --- a/src/test/java/org/prebid/server/auction/privacy/enforcement/CcpaEnforcementTest.java +++ b/src/test/java/org/prebid/server/auction/privacy/enforcement/CcpaEnforcementTest.java @@ -9,7 +9,7 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.prebid.server.activity.infrastructure.ActivityInfrastructure; -import org.prebid.server.auction.BidderAliases; +import org.prebid.server.auction.aliases.BidderAliases; import org.prebid.server.auction.model.AuctionContext; import org.prebid.server.auction.model.BidderPrivacyResult; import org.prebid.server.auction.privacy.enforcement.mask.UserFpdCcpaMask; diff --git a/src/test/java/org/prebid/server/auction/privacy/enforcement/CoppaEnforcementTest.java b/src/test/java/org/prebid/server/auction/privacy/enforcement/CoppaEnforcementTest.java index 9e9d47d0488..c5e94d3ce56 100644 --- a/src/test/java/org/prebid/server/auction/privacy/enforcement/CoppaEnforcementTest.java +++ b/src/test/java/org/prebid/server/auction/privacy/enforcement/CoppaEnforcementTest.java @@ -9,7 +9,7 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.prebid.server.activity.infrastructure.ActivityInfrastructure; -import org.prebid.server.auction.BidderAliases; +import org.prebid.server.auction.aliases.BidderAliases; import org.prebid.server.auction.model.AuctionContext; import org.prebid.server.auction.model.BidderPrivacyResult; import org.prebid.server.auction.privacy.enforcement.mask.UserFpdCoppaMask; diff --git a/src/test/java/org/prebid/server/auction/privacy/enforcement/PrivacyEnforcementServiceTest.java b/src/test/java/org/prebid/server/auction/privacy/enforcement/PrivacyEnforcementServiceTest.java index 4333eebb5d8..906952bc9b3 100644 --- a/src/test/java/org/prebid/server/auction/privacy/enforcement/PrivacyEnforcementServiceTest.java +++ b/src/test/java/org/prebid/server/auction/privacy/enforcement/PrivacyEnforcementServiceTest.java @@ -8,7 +8,7 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import org.prebid.server.auction.BidderAliases; +import org.prebid.server.auction.aliases.BidderAliases; import org.prebid.server.auction.model.AuctionContext; import org.prebid.server.auction.model.BidderPrivacyResult; diff --git a/src/test/java/org/prebid/server/auction/privacy/enforcement/TcfEnforcementTest.java b/src/test/java/org/prebid/server/auction/privacy/enforcement/TcfEnforcementTest.java index dcecd091334..2c065c386a7 100644 --- a/src/test/java/org/prebid/server/auction/privacy/enforcement/TcfEnforcementTest.java +++ b/src/test/java/org/prebid/server/auction/privacy/enforcement/TcfEnforcementTest.java @@ -12,7 +12,7 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.prebid.server.activity.infrastructure.ActivityInfrastructure; -import org.prebid.server.auction.BidderAliases; +import org.prebid.server.auction.aliases.BidderAliases; import org.prebid.server.auction.model.AuctionContext; import org.prebid.server.auction.model.BidderPrivacyResult; import org.prebid.server.auction.privacy.enforcement.mask.UserFpdTcfMask; diff --git a/src/test/java/org/prebid/server/bidadjustments/BidAdjustmentsProcessorTest.java b/src/test/java/org/prebid/server/bidadjustments/BidAdjustmentsProcessorTest.java index 2affb167eef..2875d044cad 100644 --- a/src/test/java/org/prebid/server/bidadjustments/BidAdjustmentsProcessorTest.java +++ b/src/test/java/org/prebid/server/bidadjustments/BidAdjustmentsProcessorTest.java @@ -31,6 +31,8 @@ import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebid; import org.prebid.server.proto.openrtb.ext.request.ImpMediaType; import org.prebid.server.proto.openrtb.ext.response.BidType; +import org.prebid.server.proto.openrtb.ext.response.ExtBidPrebid; +import org.prebid.server.proto.openrtb.ext.response.ExtBidPrebidMeta; import java.math.BigDecimal; import java.util.EnumMap; @@ -95,7 +97,8 @@ public void shouldReturnBidsWithUpdatedPriceCurrencyConversionAndAdjusted() { final AuctionParticipation auctionParticipation = givenAuctionParticipation(bidderResponse, bidRequest); final Price adjustedPrice = Price.of("EUR", BigDecimal.valueOf(5.0)); - given(bidAdjustmentsResolver.resolve(any(), any(), any(), any(), any(), any())).willReturn(adjustedPrice); + given(bidAdjustmentsResolver.resolve(any(), any(), any(), any(), any(), any())) + .willReturn(adjustedPrice); final BigDecimal expectedPrice = new BigDecimal("123.5"); given(currencyService.convertCurrency(any(), any(), eq("EUR"), eq("UAH"))).willReturn(expectedPrice); @@ -199,8 +202,14 @@ public void shouldDropBidIfPrebidExceptionWasThrownDuringBidAdjustmentResolving( @Test public void shouldUpdateBidPriceWithCurrencyConversionAndPriceAdjustmentFactorAndBidAdjustments() { // given - final BidderResponse bidderResponse = givenBidderResponse( - Bid.builder().impid("impId").price(BigDecimal.valueOf(2.0)).dealid("dealId").build()); + final BidderResponse bidderResponse = givenBidderResponse(Bid.builder() + .impid("impId") + .price(BigDecimal.valueOf(2.0)) + .dealid("dealId") + .ext(mapper.createObjectNode().set("prebid", mapper.valueToTree(ExtBidPrebid.builder() + .meta(ExtBidPrebidMeta.builder().adapterCode("adapter").build()) + .build()))) + .build()); final ExtRequestBidAdjustmentFactors givenAdjustments = ExtRequestBidAdjustmentFactors.builder().build(); givenAdjustments.addFactor("bidder", BigDecimal.TEN); @@ -214,10 +223,11 @@ public void shouldUpdateBidPriceWithCurrencyConversionAndPriceAdjustmentFactorAn final AuctionParticipation auctionParticipation = givenAuctionParticipation(bidderResponse, bidRequest); - given(bidAdjustmentFactorResolver.resolve(ImpMediaType.banner, givenAdjustments, "bidder")) + given(bidAdjustmentFactorResolver.resolve(ImpMediaType.banner, givenAdjustments, "adapter", "seat")) .willReturn(BigDecimal.TEN); final Price adjustedPrice = Price.of("EUR", BigDecimal.valueOf(5.0)); - given(bidAdjustmentsResolver.resolve(any(), any(), any(), any(), any(), any())).willReturn(adjustedPrice); + given(bidAdjustmentsResolver.resolve(any(), any(), any(), any(), any(), any())) + .willReturn(adjustedPrice); final BigDecimal expectedPrice = new BigDecimal("123.5"); given(currencyService.convertCurrency(any(), any(), eq("EUR"), eq("UAH"))).willReturn(expectedPrice); @@ -278,7 +288,7 @@ public void shouldUpdatePriceForOneBidAndDropAnotherIfPrebidExceptionHappensForS expectedBidExt.put("origbidcpm", new BigDecimal("2.0")); expectedBidExt.put("origbidcur", "CUR1"); final Bid expectedBid = Bid.builder().impid("impId1").price(updatedPrice).ext(expectedBidExt).build(); - final BidderBid expectedBidderBid = BidderBid.of(expectedBid, banner, "UAH"); + final BidderBid expectedBidderBid = BidderBid.of(expectedBid, banner, "seat", "UAH"); final BidderError expectedError = BidderError.generic("Unable to convert bid currency CUR2 to desired ad server currency USD"); @@ -326,7 +336,7 @@ public void shouldRespondWithOneBidAndErrorWhenBidResponseContainsOneUnsupported expectedBidExt.put("origbidcpm", new BigDecimal("2.0")); expectedBidExt.put("origbidcur", "USD"); final Bid expectedBid = Bid.builder().impid("impId1").price(updatedPrice).ext(expectedBidExt).build(); - final BidderBid expectedBidderBid = BidderBid.of(expectedBid, banner, "CUR"); + final BidderBid expectedBidderBid = BidderBid.of(expectedBid, banner, "seat", "CUR"); assertThat(result.getBidderResponse().getSeatBid().getBids()).containsOnly(expectedBidderBid); final BidderError expectedError = BidderError.generic( @@ -383,11 +393,18 @@ public void shouldUpdateBidPriceWithCurrencyConversionForMultipleBid() { public void shouldReturnBidsWithAdjustedPricesWhenAdjustmentFactorPresent() { // given final BidderResponse bidderResponse = givenBidderResponse( - Bid.builder().impid("impId").price(BigDecimal.valueOf(2)).dealid("dealId").build()); + Bid.builder() + .impid("impId") + .price(BigDecimal.valueOf(2)) + .dealid("dealId") + .ext(mapper.createObjectNode().set("prebid", mapper.valueToTree(ExtBidPrebid.builder() + .meta(ExtBidPrebidMeta.builder().adapterCode("adapter").build()) + .build()))) + .build()); final ExtRequestBidAdjustmentFactors givenAdjustments = ExtRequestBidAdjustmentFactors.builder().build(); givenAdjustments.addFactor("bidder", BigDecimal.valueOf(2.468)); - given(bidAdjustmentFactorResolver.resolve(ImpMediaType.banner, givenAdjustments, "bidder")) + given(bidAdjustmentFactorResolver.resolve(ImpMediaType.banner, givenAdjustments, "adapter", "seat")) .willReturn(BigDecimal.valueOf(2.468)); final BidRequest bidRequest = givenBidRequest(singletonList(givenImp(singletonMap("bidder", 2), identity())), @@ -421,24 +438,23 @@ public void shouldReturnBidsWithAdjustedPricesWhenAdjustmentFactorPresent() { @Test public void shouldReturnBidsWithAdjustedPricesWithVideoInstreamMediaTypeIfVideoPlacementEqualsOne() { // given - final BidderResponse bidderResponse = BidderResponse.of( - "bidder", - BidderSeatBid.builder() - .bids(List.of( - givenBidderBid(Bid.builder() - .impid("123") - .price(BigDecimal.valueOf(2)) - .dealid("dealId") - .build(), - "USD", video))) - .build(), - 1); + final BidderSeatBid seatBid = BidderSeatBid.builder().bids(List.of(givenBidderBid(Bid.builder() + .impid("123") + .price(BigDecimal.valueOf(2)) + .dealid("dealId") + .ext(mapper.createObjectNode().set("prebid", mapper.valueToTree(ExtBidPrebid.builder() + .meta(ExtBidPrebidMeta.builder().adapterCode("adapter").build()) + .build()))) + .build(), + "USD", video))) + .build(); + final BidderResponse bidderResponse = BidderResponse.of("bidder", seatBid, 1); final ExtRequestBidAdjustmentFactors givenAdjustments = ExtRequestBidAdjustmentFactors.builder() .mediatypes(new EnumMap<>(singletonMap(ImpMediaType.video, singletonMap("bidder", BigDecimal.valueOf(3.456))))) .build(); - given(bidAdjustmentFactorResolver.resolve(ImpMediaType.video, givenAdjustments, "bidder")) + given(bidAdjustmentFactorResolver.resolve(ImpMediaType.video, givenAdjustments, "adapter", "seat")) .willReturn(BigDecimal.valueOf(3.456)); final BidRequest bidRequest = givenBidRequest(singletonList(givenImp(singletonMap("bidder", 2), impBuilder -> @@ -473,24 +489,23 @@ public void shouldReturnBidsWithAdjustedPricesWithVideoInstreamMediaTypeIfVideoP @Test public void shouldReturnBidsWithAdjustedPricesWithVideoInstreamMediaTypeIfVideoPlcmtEqualsOne() { // given - final BidderResponse bidderResponse = BidderResponse.of( - "bidder", - BidderSeatBid.builder() - .bids(List.of( - givenBidderBid(Bid.builder() - .impid("123") - .price(BigDecimal.valueOf(2)) - .dealid("dealId") - .build(), - "USD", video))) - .build(), - 1); + final BidderSeatBid seatBid = BidderSeatBid.builder().bids(List.of(givenBidderBid(Bid.builder() + .impid("123") + .price(BigDecimal.valueOf(2)) + .dealid("dealId") + .ext(mapper.createObjectNode().set("prebid", mapper.valueToTree(ExtBidPrebid.builder() + .meta(ExtBidPrebidMeta.builder().adapterCode("adapter").build()) + .build()))) + .build(), + "USD", video))) + .build(); + final BidderResponse bidderResponse = BidderResponse.of("bidder", seatBid, 1); final ExtRequestBidAdjustmentFactors givenAdjustments = ExtRequestBidAdjustmentFactors.builder() .mediatypes(new EnumMap<>(singletonMap(ImpMediaType.video, singletonMap("bidder", BigDecimal.valueOf(3.456))))) .build(); - given(bidAdjustmentFactorResolver.resolve(ImpMediaType.video, givenAdjustments, "bidder")) + given(bidAdjustmentFactorResolver.resolve(ImpMediaType.video, givenAdjustments, "adapter", "seat")) .willReturn(BigDecimal.valueOf(3.456)); final BidRequest bidRequest = givenBidRequest(singletonList(givenImp(singletonMap("bidder", 2), impBuilder -> @@ -525,24 +540,26 @@ public void shouldReturnBidsWithAdjustedPricesWithVideoInstreamMediaTypeIfVideoP @Test public void shouldReturnBidsWithAdjustedPricesWithVideoOutstreamMediaTypeIfVideoPlacementAndPlcmtIsMissing() { // given + final BidderSeatBid seatBid = BidderSeatBid.builder().bids(List.of(givenBidderBid(Bid.builder() + .impid("123") + .price(BigDecimal.valueOf(2)) + .dealid("dealId") + .ext(mapper.createObjectNode().set("prebid", mapper.valueToTree(ExtBidPrebid.builder() + .meta(ExtBidPrebidMeta.builder().adapterCode("adapter").build()) + .build()))) + .build(), + "USD", video))) + .build(); final BidderResponse bidderResponse = BidderResponse.of( "bidder", - BidderSeatBid.builder() - .bids(List.of( - givenBidderBid(Bid.builder() - .impid("123") - .price(BigDecimal.valueOf(2)) - .dealid("dealId") - .build(), - "USD", video))) - .build(), + seatBid, 1); final ExtRequestBidAdjustmentFactors givenAdjustments = ExtRequestBidAdjustmentFactors.builder() .mediatypes(new EnumMap<>(singletonMap(ImpMediaType.video, singletonMap("bidder", BigDecimal.valueOf(3.456))))) .build(); - given(bidAdjustmentFactorResolver.resolve(ImpMediaType.video_outstream, givenAdjustments, "bidder")) + given(bidAdjustmentFactorResolver.resolve(ImpMediaType.video_outstream, givenAdjustments, "adapter", "seat")) .willReturn(BigDecimal.valueOf(3.456)); final BidRequest bidRequest = givenBidRequest(singletonList(givenImp(singletonMap("bidder", 2), impBuilder -> @@ -576,18 +593,17 @@ public void shouldReturnBidsWithAdjustedPricesWithVideoOutstreamMediaTypeIfVideo @Test public void shouldReturnBidAdjustmentMediaTypeVideoOutstreamIfImpIdNotEqualBidImpId() { // given - final BidderResponse bidderResponse = BidderResponse.of( - "bidder", - BidderSeatBid.builder() - .bids(List.of( - givenBidderBid(Bid.builder() - .impid("125") - .price(BigDecimal.valueOf(2)) - .dealid("dealId") - .build(), - "USD", video))) - .build(), - 1); + final BidderSeatBid seatBid = BidderSeatBid.builder().bids(List.of(givenBidderBid(Bid.builder() + .impid("125") + .price(BigDecimal.valueOf(2)) + .dealid("dealId") + .ext(mapper.createObjectNode().set("prebid", mapper.valueToTree(ExtBidPrebid.builder() + .meta(ExtBidPrebidMeta.builder().adapterCode("adapter").build()) + .build()))) + .build(), + "USD", video))) + .build(); + final BidderResponse bidderResponse = BidderResponse.of("bidder", seatBid, 1); final ExtRequestBidAdjustmentFactors givenAdjustments = ExtRequestBidAdjustmentFactors.builder() .mediatypes(new EnumMap<>(singletonMap(ImpMediaType.video, @@ -614,7 +630,7 @@ public void shouldReturnBidAdjustmentMediaTypeVideoOutstreamIfImpIdNotEqualBidIm .extracting(Bid::getPrice) .containsExactly(BigDecimal.valueOf(2)); - verify(bidAdjustmentFactorResolver).resolve(ImpMediaType.video_outstream, givenAdjustments, "bidder"); + verify(bidAdjustmentFactorResolver).resolve(ImpMediaType.video_outstream, givenAdjustments, "adapter", "seat"); verify(bidAdjustmentsResolver).resolve( eq(Price.of("USD", BigDecimal.valueOf(2))), eq(bidRequest), @@ -691,7 +707,7 @@ public void shouldReturnBidsWithAdjustedPricesWhenAdjustmentMediaFactorPresent() .mediatypes(new EnumMap<>(singletonMap(ImpMediaType.banner, singletonMap("bidder", BigDecimal.valueOf(3.456))))) .build(); - given(bidAdjustmentFactorResolver.resolve(ImpMediaType.banner, givenAdjustments, "bidder")) + given(bidAdjustmentFactorResolver.resolve(ImpMediaType.banner, givenAdjustments, null, "seat")) .willReturn(BigDecimal.valueOf(3.456)); final BidRequest bidRequest = givenBidRequest(singletonList(givenImp(singletonMap("bidder", 2), identity())), @@ -720,17 +736,19 @@ public void shouldReturnBidsWithAdjustedPricesWhenAdjustmentMediaFactorPresent() @Test public void shouldAdjustPriceWithPriorityForMediaTypeAdjustment() { // given + final BidderSeatBid seatBid = BidderSeatBid.builder().bids(List.of(givenBidderBid(Bid.builder() + .impid("123") + .price(BigDecimal.valueOf(2)) + .dealid("dealId") + .ext(mapper.createObjectNode().set("prebid", mapper.valueToTree(ExtBidPrebid.builder() + .meta(ExtBidPrebidMeta.builder().adapterCode("adapter").build()) + .build()))) + .build(), + "USD"))) + .build(); final BidderResponse bidderResponse = BidderResponse.of( "bidder", - BidderSeatBid.builder() - .bids(List.of( - givenBidderBid(Bid.builder() - .impid("123") - .price(BigDecimal.valueOf(2)) - .dealid("dealId") - .build(), - "USD"))) - .build(), + seatBid, 1); final ExtRequestBidAdjustmentFactors givenAdjustments = ExtRequestBidAdjustmentFactors.builder() @@ -738,7 +756,7 @@ public void shouldAdjustPriceWithPriorityForMediaTypeAdjustment() { singletonMap("bidder", BigDecimal.valueOf(3.456))))) .build(); givenAdjustments.addFactor("bidder", BigDecimal.valueOf(2.468)); - given(bidAdjustmentFactorResolver.resolve(ImpMediaType.banner, givenAdjustments, "bidder")) + given(bidAdjustmentFactorResolver.resolve(ImpMediaType.banner, givenAdjustments, "adapter", "seat")) .willReturn(BigDecimal.valueOf(3.456)); final BidRequest bidRequest = givenBidRequest(singletonList(givenImp(singletonMap("bidder", 2), identity())), @@ -834,11 +852,11 @@ private static Imp givenImp(T ext, UnaryOperator impBuilderC } private static BidderBid givenBidderBid(Bid bid, String currency) { - return BidderBid.of(bid, banner, currency); + return BidderBid.of(bid, banner, "seat", currency); } private static BidderBid givenBidderBid(Bid bid, String currency, BidType type) { - return BidderBid.of(bid, type, currency); + return BidderBid.of(bid, type, "seat", currency); } private static Map doubleMap(K key1, V value1, K key2, V value2) { @@ -856,7 +874,7 @@ private BidderResponse givenBidderResponse(Bid bid) { return BidderResponse.of( "bidder", BidderSeatBid.builder() - .bids(singletonList(givenBidderBid(bid, "USD"))) + .bids(singletonList(givenBidderBid(bid, "USD", banner))) .build(), 1); } diff --git a/src/test/java/org/prebid/server/bidder/BidderCatalogTest.java b/src/test/java/org/prebid/server/bidder/BidderCatalogTest.java index 44a3253c143..347279cd3b5 100644 --- a/src/test/java/org/prebid/server/bidder/BidderCatalogTest.java +++ b/src/test/java/org/prebid/server/bidder/BidderCatalogTest.java @@ -395,4 +395,26 @@ public void bidderByNameShouldReturnNullForUnknownBidder() { // when and then assertThat(target.bidderByName("unknown_bidder")).isNull(); } + + @Test + public void configuredNameShouldReturnOriginalBidderNameForKnownBidderIgnoringCase() { + // given + final BidderDeps bidderDeps = BidderDeps.of(singletonList(BidderInstanceDeps.builder() + .name("BIDder") + .deprecatedNames(emptyList()) + .build())); + target = new BidderCatalog(singletonList(bidderDeps)); + + // when and then + assertThat(target.configuredName("bidDER")).isEqualTo("BIDder"); + } + + @Test + public void configuredNameShouldReturnNullForUnknownBidder() { + // given + target = new BidderCatalog(emptyList()); + + // when and then + assertThat(target.configuredName("unknown_bidder")).isNull(); + } } diff --git a/src/test/java/org/prebid/server/bidder/HttpBidderRequestEnricherTest.java b/src/test/java/org/prebid/server/bidder/HttpBidderRequestEnricherTest.java index 4773319266a..a6004aa2ece 100644 --- a/src/test/java/org/prebid/server/bidder/HttpBidderRequestEnricherTest.java +++ b/src/test/java/org/prebid/server/bidder/HttpBidderRequestEnricherTest.java @@ -8,7 +8,7 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import org.prebid.server.auction.BidderAliases; +import org.prebid.server.auction.aliases.BidderAliases; import org.prebid.server.model.CaseInsensitiveMultiMap; import org.prebid.server.proto.openrtb.ext.request.ExtApp; import org.prebid.server.proto.openrtb.ext.request.ExtAppPrebid; diff --git a/src/test/java/org/prebid/server/bidder/HttpBidderRequesterTest.java b/src/test/java/org/prebid/server/bidder/HttpBidderRequesterTest.java index 2b067ab06d8..f12bb887ca9 100644 --- a/src/test/java/org/prebid/server/bidder/HttpBidderRequesterTest.java +++ b/src/test/java/org/prebid/server/bidder/HttpBidderRequesterTest.java @@ -21,7 +21,7 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.prebid.server.VertxTest; -import org.prebid.server.auction.BidderAliases; +import org.prebid.server.auction.aliases.BidderAliases; import org.prebid.server.auction.model.BidRejectionReason; import org.prebid.server.auction.model.BidRejectionTracker; import org.prebid.server.auction.model.BidderRequest; diff --git a/src/test/java/org/prebid/server/bidder/amx/AmxBidderTest.java b/src/test/java/org/prebid/server/bidder/amx/AmxBidderTest.java index bf5d788808f..d7e7c053209 100644 --- a/src/test/java/org/prebid/server/bidder/amx/AmxBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/amx/AmxBidderTest.java @@ -203,6 +203,26 @@ public void makeBidsShouldReturnBannerBidIfBannerIsBidExtNotPresent() throws Jso .containsExactly(BidderBid.of(Bid.builder().build(), banner, "USD")); } + @Test + public void makeBidsShouldReturnBannerBidWithSeatSetWhenBidderCodeIsPresentInBidExt() + throws JsonProcessingException { + + // given + final ObjectNode bidExt = mapper.createObjectNode(); + bidExt.put("bc", "seat"); + final BidderCall httpCall = givenHttpCall(BidRequest.builder().build(), + mapper.writeValueAsString( + givenBidResponse(bidBuilder -> bidBuilder.ext(bidExt)))); + + // when + final Result> result = target.makeBids(httpCall, null); + + // then + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getValue()) + .containsExactly(BidderBid.of(Bid.builder().ext(bidExt).build(), banner, "seat", "USD")); + } + @Test public void makeBidsShouldReturnVideoBidIfStartDelayIsPresentInBidExt() throws JsonProcessingException { // given diff --git a/src/test/java/org/prebid/server/bidder/pubmatic/PubmaticBidderTest.java b/src/test/java/org/prebid/server/bidder/pubmatic/PubmaticBidderTest.java index ae22bb5a300..58f5b4d5a02 100644 --- a/src/test/java/org/prebid/server/bidder/pubmatic/PubmaticBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/pubmatic/PubmaticBidderTest.java @@ -1138,7 +1138,7 @@ public void makeBidderResponseShouldFillExtBidPrebidVideoDurationIfDurationIsNot mapper.writeValueAsString( givenBidResponse(bidBuilder -> bidBuilder.impid("123") .ext(mapper.valueToTree( - PubmaticBidExt.of(null, VideoCreativeInfo.of(1), null)))))); + PubmaticBidExt.of(null, VideoCreativeInfo.of(1), null, null)))))); // when final CompositeBidderResponse result = target.makeBidderResponse(httpCall, null); @@ -1161,7 +1161,7 @@ public void makeBidderResponseShouldNotFillExtBidPrebidVideoDurationIfDurationIs mapper.writeValueAsString( givenBidResponse(bidBuilder -> bidBuilder.impid("123") .ext(mapper.valueToTree( - PubmaticBidExt.of(null, VideoCreativeInfo.of(null), null)))))); + PubmaticBidExt.of(null, VideoCreativeInfo.of(null), null, null)))))); // when final CompositeBidderResponse result = target.makeBidderResponse(httpCall, null); @@ -1182,7 +1182,7 @@ public void makeBidderResponseShouldNotFillExtBidPrebidVideoDurationIfVideoIsNul mapper.writeValueAsString( givenBidResponse(bidBuilder -> bidBuilder.impid("123") .ext(mapper.valueToTree( - PubmaticBidExt.of(null, null, null)))))); + PubmaticBidExt.of(null, null, null, null)))))); // when final CompositeBidderResponse result = target.makeBidderResponse(httpCall, null); @@ -1200,7 +1200,7 @@ public void makeBidderResponseShouldFillDealPriorityData() throws JsonProcessing mapper.writeValueAsString( givenBidResponse(bidBuilder -> bidBuilder.impid("123") .ext(mapper.valueToTree( - PubmaticBidExt.of(null, null, 12)))))); + PubmaticBidExt.of(null, null, 12, null)))))); // when final CompositeBidderResponse result = target.makeBidderResponse(httpCall, null); @@ -1212,6 +1212,25 @@ public void makeBidderResponseShouldFillDealPriorityData() throws JsonProcessing .containsExactly(12); } + @Test + public void makeBidderResponseShouldFillSeat() throws JsonProcessingException { + // given + final BidderCall httpCall = givenHttpCall( + mapper.writeValueAsString( + givenBidResponse(bidBuilder -> bidBuilder.impid("123") + .ext(mapper.valueToTree( + PubmaticBidExt.of(null, null, 12, "marketplace")))))); + + // when + final CompositeBidderResponse result = target.makeBidderResponse(httpCall, null); + + // then + assertThat(result.getErrors()).isEmpty(); + assertThat(result.getBids()) + .extracting(BidderBid::getSeat) + .containsExactly("marketplace"); + } + @Test public void makeBidderResponseShouldParseNativeAdmData() throws JsonProcessingException { // given @@ -1224,7 +1243,7 @@ public void makeBidderResponseShouldParseNativeAdmData() throws JsonProcessingEx givenBidResponse(bidBuilder -> bidBuilder.impid("123") .adm(admNode.toString()) .ext(mapper.valueToTree( - PubmaticBidExt.of(2, null, 12)))))); + PubmaticBidExt.of(2, null, 12, null)))))); // when final CompositeBidderResponse result = target.makeBidderResponse(httpCall, null); diff --git a/src/test/java/org/prebid/server/bidder/vungle/VungleBidderTest.java b/src/test/java/org/prebid/server/bidder/vungle/VungleBidderTest.java index e609e2055f8..31967ae4523 100644 --- a/src/test/java/org/prebid/server/bidder/vungle/VungleBidderTest.java +++ b/src/test/java/org/prebid/server/bidder/vungle/VungleBidderTest.java @@ -359,7 +359,7 @@ public void makeBidsShouldReturnVideoBidIfVideoIsPresentInRequestImp() throws Js // then assertThat(result.getErrors()).isEmpty(); assertThat(result.getValue()) - .containsOnly(BidderBid.of(Bid.builder().impid("123").build(), video, null)); + .containsOnly(BidderBid.of(Bid.builder().impid("123").build(), video, "seat", null)); } @Test @@ -377,7 +377,7 @@ public void makeBidsShouldReturnVideoBidIfBaneerIsPresentInRequestImp() throws J // then assertThat(result.getErrors()).isEmpty(); assertThat(result.getValue()) - .containsOnly(BidderBid.of(Bid.builder().impid("123").build(), video, null)); + .containsOnly(BidderBid.of(Bid.builder().impid("123").build(), video, "seat", null)); } private static BidRequest givenBidRequest( @@ -403,7 +403,9 @@ private static Imp givenImp(UnaryOperator impCustomizer) { private static BidResponse givenBidResponse(UnaryOperator bidCustomizer) { return BidResponse.builder() - .seatbid(singletonList(SeatBid.builder().bid(singletonList(bidCustomizer.apply(Bid.builder()).build())) + .seatbid(singletonList(SeatBid.builder() + .seat("seat") + .bid(singletonList(bidCustomizer.apply(Bid.builder()).build())) .build())) .build(); } diff --git a/src/test/java/org/prebid/server/it/hooks/SampleItProcessedBidderResponseHook.java b/src/test/java/org/prebid/server/it/hooks/SampleItProcessedBidderResponseHook.java index b626e03d5ac..d2c2066bb39 100644 --- a/src/test/java/org/prebid/server/it/hooks/SampleItProcessedBidderResponseHook.java +++ b/src/test/java/org/prebid/server/it/hooks/SampleItProcessedBidderResponseHook.java @@ -39,6 +39,7 @@ private List updateBids(List originalBids) { + "") .build(), bidderBid.getType(), + bidderBid.getSeat(), bidderBid.getBidCurrency())) .toList(); } diff --git a/src/test/java/org/prebid/server/it/hooks/SampleItRawBidderResponseHook.java b/src/test/java/org/prebid/server/it/hooks/SampleItRawBidderResponseHook.java index 0f30527519b..91b130382ed 100644 --- a/src/test/java/org/prebid/server/it/hooks/SampleItRawBidderResponseHook.java +++ b/src/test/java/org/prebid/server/it/hooks/SampleItRawBidderResponseHook.java @@ -39,6 +39,7 @@ private List updateBids(List originalBids) { + "") .build(), bidderBid.getType(), + bidderBid.getSeat(), bidderBid.getBidCurrency())) .toList(); } diff --git a/src/test/java/org/prebid/server/metric/MetricsTest.java b/src/test/java/org/prebid/server/metric/MetricsTest.java index 6f33ceab01f..243ef33e66d 100644 --- a/src/test/java/org/prebid/server/metric/MetricsTest.java +++ b/src/test/java/org/prebid/server/metric/MetricsTest.java @@ -682,6 +682,17 @@ public void updateSecureValidationMetricsShouldIncrementMetrics() { assertThat(metricRegistry.counter("account.accountId.response.validation.secure.err").getCount()).isEqualTo(2); } + @Test + public void updateSeatValidationMetricsShouldIncrementMetrics() { + // when + metrics.updateSeatValidationMetrics(RUBICON); + metrics.updateSeatValidationMetrics(CONVERSANT); + + // then + assertThat(metricRegistry.counter("adapter.rubicon.response.validation.seat").getCount()).isEqualTo(1); + assertThat(metricRegistry.counter("adapter.conversant.response.validation.seat").getCount()).isEqualTo(1); + } + @Test public void updateCookieSyncRequestMetricShouldIncrementMetric() { // when diff --git a/src/test/java/org/prebid/server/validation/RequestValidatorTest.java b/src/test/java/org/prebid/server/validation/RequestValidatorTest.java index e2eb6a0d205..e4efd99feb9 100644 --- a/src/test/java/org/prebid/server/validation/RequestValidatorTest.java +++ b/src/test/java/org/prebid/server/validation/RequestValidatorTest.java @@ -34,6 +34,8 @@ import org.prebid.server.proto.openrtb.ext.request.ExtRequest; import org.prebid.server.proto.openrtb.ext.request.ExtRequestBidAdjustmentFactors; import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebid; +import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidAlternateBidderCodes; +import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidAlternateBidderCodesBidder; import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidData; import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidDataEidPermissions; import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebidSchain; @@ -49,6 +51,8 @@ import java.util.Collections; import java.util.EnumMap; import java.util.List; +import java.util.Map; +import java.util.Set; import static java.util.Arrays.asList; import static java.util.Collections.emptyList; @@ -1326,6 +1330,27 @@ public void validateShouldReturnValidationMessageWhenAdjustmentMediaFactorNegati + "must be a positive number. Got -1.100000"); } + @Test + public void validateShouldReturnValidationMessageWhenAlternateBidderUnknown() { + // given + final ExtRequestPrebidAlternateBidderCodes unknownBidderCodes = ExtRequestPrebidAlternateBidderCodes.of( + true, + Map.of("unknownBidder", ExtRequestPrebidAlternateBidderCodesBidder.of(true, Set.of("*")))); + final BidRequest bidRequest = validBidRequestBuilder() + .ext(ExtRequest.of( + ExtRequestPrebid.builder() + .alternateBidderCodes(unknownBidderCodes) + .build())) + .build(); + + // when + final ValidationResult result = target.validate(Account.empty(ACCOUNT_ID), bidRequest, null, null); + + // then + assertThat(result.getErrors()).hasSize(1).containsOnly( + "request.ext.prebid.alternatebiddercodes.bidders.unknownBidder is not a known bidder or alias"); + } + @Test public void validateShouldReturnValidationMessageWhenBidderUnknown() { // given @@ -1342,8 +1367,31 @@ public void validateShouldReturnValidationMessageWhenBidderUnknown() { final ValidationResult result = target.validate(Account.empty(ACCOUNT_ID), bidRequest, null, null); // then - assertThat(result.getErrors()).hasSize(1) - .containsOnly("request.ext.prebid.bidadjustmentfactors.unknownBidder is not a known bidder or alias"); + assertThat(result.getErrors()).hasSize(1).containsOnly( + "request.ext.prebid.bidadjustmentfactors.unknownBidder is not a known bidder or alias"); + } + + @Test + public void validateShouldNotFailWhenBidderIsKnownAsAlternativeBidderCode() { + // given + final ExtRequestBidAdjustmentFactors givenAdjustments = ExtRequestBidAdjustmentFactors.builder().build(); + givenAdjustments.addFactor("unknownBidder", BigDecimal.valueOf(1.1F)); + final ExtRequestPrebidAlternateBidderCodes givenAlternativeBidderCodes = + ExtRequestPrebidAlternateBidderCodes.of(true, Map.of("rubicon", + ExtRequestPrebidAlternateBidderCodesBidder.of(true, Set.of("unknownBidder")))); + final BidRequest bidRequest = validBidRequestBuilder() + .ext(ExtRequest.of( + ExtRequestPrebid.builder() + .bidadjustmentfactors(givenAdjustments) + .alternateBidderCodes(givenAlternativeBidderCodes) + .build())) + .build(); + + // when + final ValidationResult result = target.validate(Account.empty(ACCOUNT_ID), bidRequest, null, null); + + // then + assertThat(result.getErrors()).isEmpty(); } @Test @@ -1368,6 +1416,32 @@ public void validateShouldReturnValidationMessageWhenMediaBidderUnknown() { "request.ext.prebid.bidadjustmentfactors.native.unknownBidder is not a known bidder or alias"); } + @Test + public void validateShouldNotFailWhenMediaBidderIsKnownAsAlternativeBidderCode() { + // given + final ExtRequestBidAdjustmentFactors givenAdjustments = ExtRequestBidAdjustmentFactors.builder() + .mediatypes(new EnumMap<>(Collections.singletonMap(ImpMediaType.xNative, + Collections.singletonMap("unknownBidder", BigDecimal.valueOf(1.1))))) + .build(); + givenAdjustments.addFactor("unknownBidder", BigDecimal.valueOf(1.1F)); + final ExtRequestPrebidAlternateBidderCodes givenAlternativeBidderCodes = + ExtRequestPrebidAlternateBidderCodes.of(true, Map.of("rubicon", + ExtRequestPrebidAlternateBidderCodesBidder.of(true, Set.of("unknownBidder")))); + final BidRequest bidRequest = validBidRequestBuilder() + .ext(ExtRequest.of( + ExtRequestPrebid.builder() + .bidadjustmentfactors(givenAdjustments) + .alternateBidderCodes(givenAlternativeBidderCodes) + .build())) + .build(); + + // when + final ValidationResult result = target.validate(Account.empty(ACCOUNT_ID), bidRequest, null, null); + + // then + assertThat(result.getErrors()).isEmpty(); + } + @Test public void validateShouldReturnEmptyValidationMessagesWhenBidderIsKnownAndAdjustmentIsValid() { // given diff --git a/src/test/java/org/prebid/server/validation/ResponseBidValidatorTest.java b/src/test/java/org/prebid/server/validation/ResponseBidValidatorTest.java index ffb6c9e6804..91969151268 100644 --- a/src/test/java/org/prebid/server/validation/ResponseBidValidatorTest.java +++ b/src/test/java/org/prebid/server/validation/ResponseBidValidatorTest.java @@ -12,7 +12,7 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.prebid.server.VertxTest; -import org.prebid.server.auction.BidderAliases; +import org.prebid.server.auction.aliases.BidderAliases; import org.prebid.server.auction.model.AuctionContext; import org.prebid.server.auction.model.BidRejectionReason; import org.prebid.server.auction.model.BidRejectionTracker; @@ -36,6 +36,7 @@ import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.BDDMockito.given; import static org.mockito.Mock.Strictness.LENIENT; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoInteractions; import static org.prebid.server.settings.model.BidValidationEnforcement.enforce; @@ -64,6 +65,7 @@ public void setUp() { target = new ResponseBidValidator(enforce, enforce, metrics, 0.01); given(bidderAliases.resolveBidder(anyString())).willReturn(BIDDER_NAME); + given(bidderAliases.isAllowedAlternateBidderCode(anyString(), anyString())).willReturn(true); } @Test @@ -84,7 +86,10 @@ public void validateShouldFailedIfBidderBidCurrencyIsIncorrect() { public void validateShouldFailIfMissingBid() { // when final ValidationResult result = target.validate( - BidderBid.of(null, null, "USD"), BIDDER_NAME, givenAuctionContext(), bidderAliases); + BidderBid.of(null, null, "USD"), + BIDDER_NAME, + givenAuctionContext(), + bidderAliases); // then assertThat(result.getErrors()).containsOnly("Empty bid object submitted"); @@ -142,7 +147,8 @@ public void validateShouldFailIfBidHasNoCrid() { public void validateShouldFailIfBannerBidHasNoWidthAndHeight() { // when final BidderBid givenBid = givenBid(builder -> builder.w(null).h(null)); - final ValidationResult result = target.validate(givenBid, BIDDER_NAME, givenAuctionContext(), bidderAliases); + final ValidationResult result = target.validate( + givenBid, BIDDER_NAME, givenAuctionContext(), bidderAliases); // then assertThat(result.getErrors()) @@ -158,7 +164,8 @@ public void validateShouldFailIfBannerBidHasNoWidthAndHeight() { public void validateShouldFailIfBannerBidWidthIsGreaterThanImposedByImp() { // when final BidderBid givenBid = givenBid(builder -> builder.w(150).h(150)); - final ValidationResult result = target.validate(givenBid, BIDDER_NAME, givenAuctionContext(), bidderAliases); + final ValidationResult result = target.validate( + givenBid, BIDDER_NAME, givenAuctionContext(), bidderAliases); // then assertThat(result.getErrors()) @@ -174,7 +181,8 @@ public void validateShouldFailIfBannerBidWidthIsGreaterThanImposedByImp() { public void validateShouldFailIfBannerBidHeightIsGreaterThanImposedByImp() { // when final BidderBid givenBid = givenBid(builder -> builder.w(50).h(250)); - final ValidationResult result = target.validate(givenBid, BIDDER_NAME, givenAuctionContext(), bidderAliases); + final ValidationResult result = target.validate( + givenBid, BIDDER_NAME, givenAuctionContext(), bidderAliases); // then assertThat(result.getErrors()) @@ -522,6 +530,62 @@ public void validateShouldIncrementSecureValidationWarnMetrics() { verifyNoInteractions(bidRejectionTracker); } + @Test + public void validateShouldNotFailOnSeatValidationWhenSeatEqualsIgnoringCaseToBidder() { + // when + final ValidationResult result = target.validate( + givenBid(identity()).toBuilder().seat("biDDEr").build(), + BIDDER_NAME, + givenAuctionContext(), + bidderAliases); + + // then + assertThat(result.getWarnings()).isEmpty(); + assertThat(result.getErrors()).isEmpty(); + verify(metrics, never()).updateSeatValidationMetrics(BIDDER_NAME); + verifyNoInteractions(bidRejectionTracker); + } + + @Test + public void validateShouldFailOnSeatValidationWhenSeatIsNotAllowed() { + // given + final BidderBid givenBid = givenBid(identity()).toBuilder().seat("seat").build(); + given(bidderAliases.isAllowedAlternateBidderCode(BIDDER_NAME, "seat")).willReturn(false); + + // when + final ValidationResult result = target.validate( + givenBid, + BIDDER_NAME, + givenAuctionContext(givenAccount(identity())), + bidderAliases); + + // then + assertThat(result.getErrors()) + .containsOnly("invalid bidder code seat was set by the adapter bidder for the account account"); + verify(metrics).updateSeatValidationMetrics(BIDDER_NAME); + verify(bidRejectionTracker).rejectBid(givenBid, BidRejectionReason.RESPONSE_REJECTED_GENERAL); + } + + @Test + public void validateShouldNotFailOnSeatValidationWhenSeatIsAllowed() { + // given + final BidderBid givenBid = givenBid(identity()).toBuilder().seat("seat").build(); + given(bidderAliases.isAllowedAlternateBidderCode(BIDDER_NAME, "seat")).willReturn(true); + + // when + final ValidationResult result = target.validate( + givenBid, + BIDDER_NAME, + givenAuctionContext(givenAccount(identity())), + bidderAliases); + + // then + assertThat(result.getWarnings()).isEmpty(); + assertThat(result.getErrors()).isEmpty(); + verify(metrics, never()).updateSeatValidationMetrics(BIDDER_NAME); + verifyNoInteractions(bidRejectionTracker); + } + private BidRequest givenRequest(UnaryOperator impCustomizer) { final ObjectNode ext = mapper.createObjectNode().set( "prebid", mapper.createObjectNode().set( diff --git a/src/test/resources/org/prebid/server/it/amp/test-cache-request.json b/src/test/resources/org/prebid/server/it/amp/test-cache-request.json index fe8eba5c934..8f94e6c3fc8 100644 --- a/src/test/resources/org/prebid/server/it/amp/test-cache-request.json +++ b/src/test/resources/org/prebid/server/it/amp/test-cache-request.json @@ -12,7 +12,10 @@ "h": 600, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "generic" + } }, "rp": { "targeting": [ @@ -48,7 +51,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "genericAlias" + } }, "genericAlias": { "brand_id": 1, diff --git a/src/test/resources/org/prebid/server/it/cache/update/test-auction-response.json b/src/test/resources/org/prebid/server/it/cache/update/test-auction-response.json index e6127bea4f0..6b1a866f018 100644 --- a/src/test/resources/org/prebid/server/it/cache/update/test-auction-response.json +++ b/src/test/resources/org/prebid/server/it/cache/update/test-auction-response.json @@ -15,6 +15,9 @@ "ext": { "prebid": { "type": "banner", + "meta": { + "adaptercode": "generic" + }, "targeting": { "hb_pb": "4.20", "hb_pb_generic": "4.20", @@ -45,6 +48,9 @@ "ext": { "prebid": { "type": "video", + "meta": { + "adaptercode": "genericAlias" + }, "targeting": { "hb_pb": "3.00", "hb_pb_genericAlias": "3.00", diff --git a/src/test/resources/org/prebid/server/it/openrtb2/33across/test-auction-33across-response.json b/src/test/resources/org/prebid/server/it/openrtb2/33across/test-auction-33across-response.json index b7a0ac4311d..cde627280fa 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/33across/test-auction-33across-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/33across/test-auction-33across-response.json @@ -14,7 +14,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "33across" + } }, "origbidcpm": 1.25 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/aax/test-auction-aax-response.json b/src/test/resources/org/prebid/server/it/openrtb2/aax/test-auction-aax-response.json index f6f8aa08087..b15064c49c2 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/aax/test-auction-aax-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/aax/test-auction-aax-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "aax" + } }, "origbidcpm": 0.5, "origbidcur": "USD" diff --git a/src/test/resources/org/prebid/server/it/openrtb2/aceex/test-auction-aceex-response.json b/src/test/resources/org/prebid/server/it/openrtb2/aceex/test-auction-aceex-response.json index b9b61a696c0..d01603ad742 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/aceex/test-auction-aceex-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/aceex/test-auction-aceex-response.json @@ -13,7 +13,10 @@ "crid": "24080", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "aceex" + } }, "origbidcpm": 0.01 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/acuityads/test-auction-acuityads-response.json b/src/test/resources/org/prebid/server/it/openrtb2/acuityads/test-auction-acuityads-response.json index a0bab7d6cc2..42131d2826a 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/acuityads/test-auction-acuityads-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/acuityads/test-auction-acuityads-response.json @@ -13,7 +13,10 @@ "crid": "24080", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "acuityads" + } }, "origbidcpm": 0.01 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/adelement/test-auction-adelement-response.json b/src/test/resources/org/prebid/server/it/openrtb2/adelement/test-auction-adelement-response.json index 0c48f3a8431..5e53a30ee9a 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/adelement/test-auction-adelement-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/adelement/test-auction-adelement-response.json @@ -17,7 +17,10 @@ "mtype": 1, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "adelement" + } }, "origbidcpm": 0.5 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/adf/test-auction-adf-response.json b/src/test/resources/org/prebid/server/it/openrtb2/adf/test-auction-adf-response.json index f4417095fa3..70a4616692e 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/adf/test-auction-adf-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/adf/test-auction-adf-response.json @@ -13,7 +13,10 @@ "crid": "test-creative-id-1", "ext": { "prebid": { - "type": "native" + "type": "native", + "meta": { + "adaptercode": "adf" + } }, "pt": "gross", "origbidcpm": 10, @@ -30,7 +33,10 @@ "crid": "test-creative-id-2", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "adf" + } }, "pt": "gross", "origbidcpm": 10, diff --git a/src/test/resources/org/prebid/server/it/openrtb2/adgeneration/test-auction-adgeneration-response.json b/src/test/resources/org/prebid/server/it/openrtb2/adgeneration/test-auction-adgeneration-response.json index 25ebe533dcc..81ddb4c26b9 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/adgeneration/test-auction-adgeneration-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/adgeneration/test-auction-adgeneration-response.json @@ -15,7 +15,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "adgeneration" + } }, "origbidcpm": 46.6, "origbidcur": "USD" diff --git a/src/test/resources/org/prebid/server/it/openrtb2/adhese/test-auction-adhese-response.json b/src/test/resources/org/prebid/server/it/openrtb2/adhese/test-auction-adhese-response.json index f5fd5214de2..2b538c0f78d 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/adhese/test-auction-adhese-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/adhese/test-auction-adhese-response.json @@ -24,7 +24,10 @@ "origbidcpm": 2.184, "origbidcur": "USD", "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "adhese" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/adinify/test-auction-adinify-response.json b/src/test/resources/org/prebid/server/it/openrtb2/adinify/test-auction-adinify-response.json index c1163d30d8c..f250edca1c2 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/adinify/test-auction-adinify-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/adinify/test-auction-adinify-response.json @@ -18,7 +18,10 @@ "mediaType": "video", "origbidcpm": 3.33, "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "adinify" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/adkernel/test-auction-adkernel-response.json b/src/test/resources/org/prebid/server/it/openrtb2/adkernel/test-auction-adkernel-response.json index a6a8e2bd0c8..ee54b00b505 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/adkernel/test-auction-adkernel-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/adkernel/test-auction-adkernel-response.json @@ -18,7 +18,10 @@ "mtype": 1, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "adkernel" + } }, "origbidcpm": 2.25 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/adkerneladn/test-auction-adkerneladn-response.json b/src/test/resources/org/prebid/server/it/openrtb2/adkerneladn/test-auction-adkerneladn-response.json index 9563c1ff672..b93c9596668 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/adkerneladn/test-auction-adkerneladn-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/adkerneladn/test-auction-adkerneladn-response.json @@ -22,7 +22,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "adkernelAdn" + } }, "origbidcpm": 0.5 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/adman/test-auction-adman-response.json b/src/test/resources/org/prebid/server/it/openrtb2/adman/test-auction-adman-response.json index 8884760961e..6c12865d18e 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/adman/test-auction-adman-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/adman/test-auction-adman-response.json @@ -14,7 +14,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "adman" + } }, "origbidcpm": 1.25 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/admatic/test-auction-admatic-response.json b/src/test/resources/org/prebid/server/it/openrtb2/admatic/test-auction-admatic-response.json index 0277bb7f78d..cb9952334cc 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/admatic/test-auction-admatic-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/admatic/test-auction-admatic-response.json @@ -13,7 +13,10 @@ "crid": "24080", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "admatic" + } }, "origbidcpm": 0.01 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/admaticde/test-auction-admaticde-response.json b/src/test/resources/org/prebid/server/it/openrtb2/admaticde/test-auction-admaticde-response.json index 6a5b940a2cb..e00935f7bef 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/admaticde/test-auction-admaticde-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/admaticde/test-auction-admaticde-response.json @@ -13,7 +13,10 @@ "crid": "24080", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "admaticde" + } }, "origbidcpm": 0.01 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/admixer/test-auction-admixer-response.json b/src/test/resources/org/prebid/server/it/openrtb2/admixer/test-auction-admixer-response.json index 75f33a522f6..5294abfff5c 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/admixer/test-auction-admixer-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/admixer/test-auction-admixer-response.json @@ -10,7 +10,10 @@ "ext": { "format": "BANNER", "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "admixer" + } }, "origbidcpm": 0.01 }, diff --git a/src/test/resources/org/prebid/server/it/openrtb2/adnuntius/test-auction-adnuntius-response.json b/src/test/resources/org/prebid/server/it/openrtb2/adnuntius/test-auction-adnuntius-response.json index 61bac864a49..6d033a9c208 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/adnuntius/test-auction-adnuntius-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/adnuntius/test-auction-adnuntius-response.json @@ -20,7 +20,10 @@ "h": 90, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "adnuntius" + } }, "origbidcpm": 42420.00, "origbidcur": "USD" diff --git a/src/test/resources/org/prebid/server/it/openrtb2/adocean/test-auction-adocean-response.json b/src/test/resources/org/prebid/server/it/openrtb2/adocean/test-auction-adocean-response.json index 3f62c1fb7db..ea7c23c5bb4 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/adocean/test-auction-adocean-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/adocean/test-auction-adocean-response.json @@ -14,7 +14,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "adocean" + } }, "origbidcpm": 10, "origbidcur": "USD" diff --git a/src/test/resources/org/prebid/server/it/openrtb2/adoppler/test-auction-adoppler-response.json b/src/test/resources/org/prebid/server/it/openrtb2/adoppler/test-auction-adoppler-response.json index 7822b00cdbb..cbfeaa10b25 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/adoppler/test-auction-adoppler-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/adoppler/test-auction-adoppler-response.json @@ -18,7 +18,10 @@ ], "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "adoppler" + } }, "origbidcpm": 3.33, "ads": { diff --git a/src/test/resources/org/prebid/server/it/openrtb2/adot/test-auction-adot-response.json b/src/test/resources/org/prebid/server/it/openrtb2/adot/test-auction-adot-response.json index b2c52bb7d9e..fd3bea140aa 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/adot/test-auction-adot-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/adot/test-auction-adot-response.json @@ -18,7 +18,10 @@ }, "origbidcpm": 1.16346, "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "adot" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/adpone/test-auction-adpone-response.json b/src/test/resources/org/prebid/server/it/openrtb2/adpone/test-auction-adpone-response.json index 3c4fc34a311..cb895905e04 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/adpone/test-auction-adpone-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/adpone/test-auction-adpone-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "adpone" + } }, "origbidcpm": 6.66 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/adport/test-auction-adport-response.json b/src/test/resources/org/prebid/server/it/openrtb2/adport/test-auction-adport-response.json index f4914655cb9..4411e470915 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/adport/test-auction-adport-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/adport/test-auction-adport-response.json @@ -20,7 +20,10 @@ "origbidcpm": 1.23, "origbidcur": "USD", "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "adport" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/adprime/test-auction-adprime-response.json b/src/test/resources/org/prebid/server/it/openrtb2/adprime/test-auction-adprime-response.json index 073a812bcdb..59fcbbbfc93 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/adprime/test-auction-adprime-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/adprime/test-auction-adprime-response.json @@ -15,7 +15,10 @@ "mtype": 1, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "adprime" + } }, "origbidcpm": 1.25 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/adquery/test-auction-adquery-response.json b/src/test/resources/org/prebid/server/it/openrtb2/adquery/test-auction-adquery-response.json index 1d301f75624..eaacefd6e37 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/adquery/test-auction-adquery-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/adquery/test-auction-adquery-response.json @@ -19,7 +19,10 @@ "origbidcpm": 4.14, "origbidcur": "PLN", "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "adquery" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/adrino/test-auction-adrino-response.json b/src/test/resources/org/prebid/server/it/openrtb2/adrino/test-auction-adrino-response.json index e1341dbdcca..fe0402359f2 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/adrino/test-auction-adrino-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/adrino/test-auction-adrino-response.json @@ -15,7 +15,10 @@ "h": 250, "ext": { "prebid": { - "type": "native" + "type": "native", + "meta": { + "adaptercode": "adrino" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/adsyield/test-auction-adsyield-response.json b/src/test/resources/org/prebid/server/it/openrtb2/adsyield/test-auction-adsyield-response.json index 855d418643f..7a0e6a0da88 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/adsyield/test-auction-adsyield-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/adsyield/test-auction-adsyield-response.json @@ -12,7 +12,10 @@ "ext": { "origbidcpm": 3.33, "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "adsyield" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/adt/test-auction-adt-response.json b/src/test/resources/org/prebid/server/it/openrtb2/adt/test-auction-adt-response.json index c4f8a96adbf..044f26a4777 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/adt/test-auction-adt-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/adt/test-auction-adt-response.json @@ -13,7 +13,10 @@ "crid": "24080", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "adt" + } }, "origbidcpm": 0.01 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/adtarget/test-auction-adtarget-response.json b/src/test/resources/org/prebid/server/it/openrtb2/adtarget/test-auction-adtarget-response.json index 809b063e228..536240551f1 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/adtarget/test-auction-adtarget-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/adtarget/test-auction-adtarget-response.json @@ -14,7 +14,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "adtarget" + } }, "origbidcpm": 8.43 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/adtelligent/test-auction-adtelligent-response.json b/src/test/resources/org/prebid/server/it/openrtb2/adtelligent/test-auction-adtelligent-response.json index b73512ad65c..fef8a263859 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/adtelligent/test-auction-adtelligent-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/adtelligent/test-auction-adtelligent-response.json @@ -14,7 +14,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "adtelligent" + } }, "origbidcpm": 8.43 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/adtonos/test-auction-adtonos-response.json b/src/test/resources/org/prebid/server/it/openrtb2/adtonos/test-auction-adtonos-response.json index c5bfdb6d592..3258c4cc98b 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/adtonos/test-auction-adtonos-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/adtonos/test-auction-adtonos-response.json @@ -13,7 +13,10 @@ "ext": { "origbidcpm": 3.33, "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "adtonos" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/adtrgtme/test-auction-adtrgtme-response.json b/src/test/resources/org/prebid/server/it/openrtb2/adtrgtme/test-auction-adtrgtme-response.json index d786080f717..76d53b3e7c3 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/adtrgtme/test-auction-adtrgtme-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/adtrgtme/test-auction-adtrgtme-response.json @@ -14,7 +14,10 @@ "ext": { "origbidcpm": 3.33, "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "adtrgtme" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/advangelists/test-auction-advangelists-response.json b/src/test/resources/org/prebid/server/it/openrtb2/advangelists/test-auction-advangelists-response.json index 92ba70c5c42..0253ead2b9a 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/advangelists/test-auction-advangelists-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/advangelists/test-auction-advangelists-response.json @@ -13,7 +13,10 @@ "crid": "24080", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "advangelists" + } }, "origbidcpm": 0.01 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/adverxo/test-auction-adverxo-response.json b/src/test/resources/org/prebid/server/it/openrtb2/adverxo/test-auction-adverxo-response.json index 0d282ff107d..da298568255 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/adverxo/test-auction-adverxo-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/adverxo/test-auction-adverxo-response.json @@ -20,7 +20,10 @@ "origbidcpm": 1.23, "origbidcur": "USD", "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "adverxo" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/adview/test-auction-adview-response.json b/src/test/resources/org/prebid/server/it/openrtb2/adview/test-auction-adview-response.json index a6c118e0913..9c24d558743 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/adview/test-auction-adview-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/adview/test-auction-adview-response.json @@ -15,7 +15,10 @@ "ext": { "origbidcpm": 0.01, "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "adview" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/adxcg/test-auction-adxcg-response.json b/src/test/resources/org/prebid/server/it/openrtb2/adxcg/test-auction-adxcg-response.json index 0961b1f67ec..9e0135219f3 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/adxcg/test-auction-adxcg-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/adxcg/test-auction-adxcg-response.json @@ -17,7 +17,10 @@ "mtype": 1, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "adxcg" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/adyoulike/test-auction-adyoulike-response.json b/src/test/resources/org/prebid/server/it/openrtb2/adyoulike/test-auction-adyoulike-response.json index 96aa18de5d8..1c403a36179 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/adyoulike/test-auction-adyoulike-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/adyoulike/test-auction-adyoulike-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "adyoulike" + } }, "origbidcpm": 3.33, "origbidcur" : "USD" diff --git a/src/test/resources/org/prebid/server/it/openrtb2/aidem/test-auction-aidem-response.json b/src/test/resources/org/prebid/server/it/openrtb2/aidem/test-auction-aidem-response.json index f5ee4e08e9c..5d681f38d56 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/aidem/test-auction-aidem-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/aidem/test-auction-aidem-response.json @@ -13,7 +13,10 @@ "ext": { "origbidcpm": 3.33, "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "aidem" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/aja/test-auction-aja-response.json b/src/test/resources/org/prebid/server/it/openrtb2/aja/test-auction-aja-response.json index 7010f75f5e6..42fbe4116e3 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/aja/test-auction-aja-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/aja/test-auction-aja-response.json @@ -17,7 +17,10 @@ "ext": { "origbidcpm": 10, "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "aja" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/algorix/test-auction-algorix-response.json b/src/test/resources/org/prebid/server/it/openrtb2/algorix/test-auction-algorix-response.json index b61aebbccd6..f9ede300eb2 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/algorix/test-auction-algorix-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/algorix/test-auction-algorix-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "algorix" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/alkimi/test-auction-alkimi-response.json b/src/test/resources/org/prebid/server/it/openrtb2/alkimi/test-auction-alkimi-response.json index b8ccdb2d3b3..19a0d9f4f3a 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/alkimi/test-auction-alkimi-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/alkimi/test-auction-alkimi-response.json @@ -15,7 +15,10 @@ "nurl": "https://example.com/nurl", "ext": { "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "alkimi" + } }, "origbidcpm": 1 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/amx/test-auction-amx-response.json b/src/test/resources/org/prebid/server/it/openrtb2/amx/test-auction-amx-response.json index ec393ab7ca0..fc1daacf1f9 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/amx/test-auction-amx-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/amx/test-auction-amx-response.json @@ -15,7 +15,10 @@ "nurl": "nurl001", "ext": { "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "amx" + } }, "origbidcpm": 0.01, "ct": 0, diff --git a/src/test/resources/org/prebid/server/it/openrtb2/apacdex/test-auction-apacdex-response.json b/src/test/resources/org/prebid/server/it/openrtb2/apacdex/test-auction-apacdex-response.json index 2122bfc623a..e309156e72f 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/apacdex/test-auction-apacdex-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/apacdex/test-auction-apacdex-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "apacdex" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/appush/test-auction-appush-response.json b/src/test/resources/org/prebid/server/it/openrtb2/appush/test-auction-appush-response.json index f673f770ad2..6c5b20129bf 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/appush/test-auction-appush-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/appush/test-auction-appush-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "appush" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/artechnology/test-auction-artechnology-response.json b/src/test/resources/org/prebid/server/it/openrtb2/artechnology/test-auction-artechnology-response.json index 676d1ec67c0..a1b190da013 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/artechnology/test-auction-artechnology-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/artechnology/test-auction-artechnology-response.json @@ -18,7 +18,10 @@ "mediaType": "video", "origbidcpm": 3.33, "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "artechnology" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/aso/test-auction-aso-response.json b/src/test/resources/org/prebid/server/it/openrtb2/aso/test-auction-aso-response.json index 6b9a19e7187..7670fae5f7f 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/aso/test-auction-aso-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/aso/test-auction-aso-response.json @@ -13,7 +13,10 @@ "crid": "crid6", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "aso" + } }, "origbidcpm": 4.7 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/audiencenetwork/test-auction-audiencenetwork-response.json b/src/test/resources/org/prebid/server/it/openrtb2/audiencenetwork/test-auction-audiencenetwork-response.json index e1d18a2ecb5..2f513a5ee51 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/audiencenetwork/test-auction-audiencenetwork-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/audiencenetwork/test-auction-audiencenetwork-response.json @@ -15,7 +15,10 @@ "h": 50, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "audienceNetwork" + } }, "origbidcpm": 9.0 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/automatad/test-auction-automatad-response.json b/src/test/resources/org/prebid/server/it/openrtb2/automatad/test-auction-automatad-response.json index c4c971e466e..5d1340fba78 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/automatad/test-auction-automatad-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/automatad/test-auction-automatad-response.json @@ -12,7 +12,10 @@ "ext": { "origbidcpm": 3.33, "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "automatad" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/avocet/test-auction-avocet-response.json b/src/test/resources/org/prebid/server/it/openrtb2/avocet/test-auction-avocet-response.json index 6fca036d997..d74e2cf643b 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/avocet/test-auction-avocet-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/avocet/test-auction-avocet-response.json @@ -23,7 +23,10 @@ "duration": 30 }, "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "avocet" + } }, "origbidcpm": 0.5 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/axis/test-auction-axis-response.json b/src/test/resources/org/prebid/server/it/openrtb2/axis/test-auction-axis-response.json index 676eb7d802a..cf54843f074 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/axis/test-auction-axis-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/axis/test-auction-axis-response.json @@ -14,7 +14,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "axis" + } }, "origbidcpm": 1.25 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/axonix/test-auction-axonix-response.json b/src/test/resources/org/prebid/server/it/openrtb2/axonix/test-auction-axonix-response.json index e0e02fc7381..644897f8e35 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/axonix/test-auction-axonix-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/axonix/test-auction-axonix-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "axonix" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/bcmint/test-auction-bcmint-response.json b/src/test/resources/org/prebid/server/it/openrtb2/bcmint/test-auction-bcmint-response.json index c591ef97cfd..9f6384c7795 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/bcmint/test-auction-bcmint-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/bcmint/test-auction-bcmint-response.json @@ -13,7 +13,10 @@ "crid": "crid6", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "bcmint" + } }, "origbidcpm": 4.7 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/beachfront/test-auction-beachfront-response.json b/src/test/resources/org/prebid/server/it/openrtb2/beachfront/test-auction-beachfront-response.json index 5e10a21b5de..f65afc48130 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/beachfront/test-auction-beachfront-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/beachfront/test-auction-beachfront-response.json @@ -14,7 +14,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "beachfront" + } }, "origbidcpm": 2.942807912826538, "origbidcur": "USD" diff --git a/src/test/resources/org/prebid/server/it/openrtb2/beintoo/test-auction-beintoo-response.json b/src/test/resources/org/prebid/server/it/openrtb2/beintoo/test-auction-beintoo-response.json index bed5b0e3939..c0e516408b2 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/beintoo/test-auction-beintoo-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/beintoo/test-auction-beintoo-response.json @@ -14,7 +14,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "beintoo" + } }, "origbidcpm": 2.942808, "origbidcur": "USD" diff --git a/src/test/resources/org/prebid/server/it/openrtb2/bematterfull/test-auction-bematterfull-response.json b/src/test/resources/org/prebid/server/it/openrtb2/bematterfull/test-auction-bematterfull-response.json index 1d2bac9f898..5163e685fe7 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/bematterfull/test-auction-bematterfull-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/bematterfull/test-auction-bematterfull-response.json @@ -12,7 +12,10 @@ "crid": "crid6", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "bematterfull" + } }, "origbidcpm": 4.7 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/between/test-auction-between-response.json b/src/test/resources/org/prebid/server/it/openrtb2/between/test-auction-between-response.json index cf2a6e0d031..731eaca081a 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/between/test-auction-between-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/between/test-auction-between-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "between" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/beyondmedia/test-auction-beyondmedia-response.json b/src/test/resources/org/prebid/server/it/openrtb2/beyondmedia/test-auction-beyondmedia-response.json index e63089babb2..7f8969fa554 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/beyondmedia/test-auction-beyondmedia-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/beyondmedia/test-auction-beyondmedia-response.json @@ -14,7 +14,10 @@ "h": 600, "ext": { "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "beyondmedia" + } }, "origbidcpm": 1.25 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/bidagency/test-auction-bidagency-response.json b/src/test/resources/org/prebid/server/it/openrtb2/bidagency/test-auction-bidagency-response.json index fdba12487c7..0f9f64d5403 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/bidagency/test-auction-bidagency-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/bidagency/test-auction-bidagency-response.json @@ -13,7 +13,10 @@ "crid": "crid6", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "bidagency" + } }, "origbidcpm": 4.7 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/bidmachine/test-auction-bidmachine-response.json b/src/test/resources/org/prebid/server/it/openrtb2/bidmachine/test-auction-bidmachine-response.json index 0ea56280b80..34cb407ea7f 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/bidmachine/test-auction-bidmachine-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/bidmachine/test-auction-bidmachine-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "bidmachine" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/bidmatic/test-auction-bidmatic-response.json b/src/test/resources/org/prebid/server/it/openrtb2/bidmatic/test-auction-bidmatic-response.json index ba0b73cfaf1..ea2ddc26844 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/bidmatic/test-auction-bidmatic-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/bidmatic/test-auction-bidmatic-response.json @@ -15,7 +15,10 @@ "mtype": 1, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "bidmatic" + } }, "origbidcpm": 8.43 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/bidmyadz/test-auction-bidmyadz-response.json b/src/test/resources/org/prebid/server/it/openrtb2/bidmyadz/test-auction-bidmyadz-response.json index 399a568d088..633ba502bd4 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/bidmyadz/test-auction-bidmyadz-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/bidmyadz/test-auction-bidmyadz-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "bidmyadz" + } }, "mediaType": "banner", "origbidcpm": 3.33 diff --git a/src/test/resources/org/prebid/server/it/openrtb2/bidscube/test-auction-bidscube-response.json b/src/test/resources/org/prebid/server/it/openrtb2/bidscube/test-auction-bidscube-response.json index 8c8b0128e98..13b44ba7e75 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/bidscube/test-auction-bidscube-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/bidscube/test-auction-bidscube-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "bidscube" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/bidsmind/test-auction-bidsmind-response.json b/src/test/resources/org/prebid/server/it/openrtb2/bidsmind/test-auction-bidsmind-response.json index 86ea73d0bba..fedecccb3ea 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/bidsmind/test-auction-bidsmind-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/bidsmind/test-auction-bidsmind-response.json @@ -20,7 +20,10 @@ "origbidcpm": 1.23, "origbidcur": "USD", "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "bidsmind" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/bidstack/test-auction-bidstack-response.json b/src/test/resources/org/prebid/server/it/openrtb2/bidstack/test-auction-bidstack-response.json index 9428b19fd0a..6897c027859 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/bidstack/test-auction-bidstack-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/bidstack/test-auction-bidstack-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "bidstack" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/bigoad/test-auction-bigoad-response.json b/src/test/resources/org/prebid/server/it/openrtb2/bigoad/test-auction-bigoad-response.json index 013cd170712..8440c97bcb3 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/bigoad/test-auction-bigoad-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/bigoad/test-auction-bigoad-response.json @@ -17,7 +17,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "bigoad" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/blasto/test-auction-blasto-response.json b/src/test/resources/org/prebid/server/it/openrtb2/blasto/test-auction-blasto-response.json index 22a67229971..ed8c5305e03 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/blasto/test-auction-blasto-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/blasto/test-auction-blasto-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "blasto" + } }, "origbidcur": "USD", "origbidcpm": 3.33 diff --git a/src/test/resources/org/prebid/server/it/openrtb2/bliink/test-auction-bliink-response.json b/src/test/resources/org/prebid/server/it/openrtb2/bliink/test-auction-bliink-response.json index f4ddf9222af..1a70759e914 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/bliink/test-auction-bliink-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/bliink/test-auction-bliink-response.json @@ -12,7 +12,10 @@ "ext": { "origbidcpm": 3.33, "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "bliink" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/blue/test-auction-blue-response.json b/src/test/resources/org/prebid/server/it/openrtb2/blue/test-auction-blue-response.json index f241baedf4c..897aed832f7 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/blue/test-auction-blue-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/blue/test-auction-blue-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "blue" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/bluesea/test-auction-bluesea-response.json b/src/test/resources/org/prebid/server/it/openrtb2/bluesea/test-auction-bluesea-response.json index 71412aa8e6c..a855aaabb71 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/bluesea/test-auction-bluesea-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/bluesea/test-auction-bluesea-response.json @@ -15,7 +15,10 @@ "ext": { "mediatype":"banner", "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "bluesea" + } }, "origbidcpm": 1.25 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/bmtm/test-auction-bmtm-response.json b/src/test/resources/org/prebid/server/it/openrtb2/bmtm/test-auction-bmtm-response.json index cbbae431606..ab990f9727a 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/bmtm/test-auction-bmtm-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/bmtm/test-auction-bmtm-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "bmtm" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/boldwin/test-auction-boldwin-response.json b/src/test/resources/org/prebid/server/it/openrtb2/boldwin/test-auction-boldwin-response.json index 4d5d8f5ce9e..8c800af18a4 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/boldwin/test-auction-boldwin-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/boldwin/test-auction-boldwin-response.json @@ -14,7 +14,10 @@ "h": 600, "ext": { "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "boldwin" + } }, "origbidcpm": 1.25 }, diff --git a/src/test/resources/org/prebid/server/it/openrtb2/brave/test-auction-brave-response.json b/src/test/resources/org/prebid/server/it/openrtb2/brave/test-auction-brave-response.json index 43de8398d78..749db2a5fdb 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/brave/test-auction-brave-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/brave/test-auction-brave-response.json @@ -13,7 +13,10 @@ "crid": "crid", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "brave" + } }, "origbidcur": "USD", "origbidcpm": 0.01 diff --git a/src/test/resources/org/prebid/server/it/openrtb2/bwx/test-auction-bwx-response.json b/src/test/resources/org/prebid/server/it/openrtb2/bwx/test-auction-bwx-response.json index 6107fe586a3..91c952abb28 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/bwx/test-auction-bwx-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/bwx/test-auction-bwx-response.json @@ -14,7 +14,10 @@ "crid": "crid", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "bwx" + } }, "origbidcpm": 0.01 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/cadentaperturemx/test-auction-cadentaperturemx-response.json b/src/test/resources/org/prebid/server/it/openrtb2/cadentaperturemx/test-auction-cadentaperturemx-response.json index f2f43ba2c1d..f6efa7130f2 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/cadentaperturemx/test-auction-cadentaperturemx-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/cadentaperturemx/test-auction-cadentaperturemx-response.json @@ -15,7 +15,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "cadent_aperture_mx" + } }, "origbidcpm": 2.942808, "origbidcur": "USD" diff --git a/src/test/resources/org/prebid/server/it/openrtb2/ccx/test-auction-ccx-response.json b/src/test/resources/org/prebid/server/it/openrtb2/ccx/test-auction-ccx-response.json index 7fcafb472c7..f285ee8bfca 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/ccx/test-auction-ccx-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/ccx/test-auction-ccx-response.json @@ -12,7 +12,10 @@ "ext": { "origbidcpm": 3.33, "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "ccx" + } }, "type": "standard" }, diff --git a/src/test/resources/org/prebid/server/it/openrtb2/cointraffic/test-auction-cointraffic-response.json b/src/test/resources/org/prebid/server/it/openrtb2/cointraffic/test-auction-cointraffic-response.json index 06fadbf0b09..6b6d3e48a42 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/cointraffic/test-auction-cointraffic-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/cointraffic/test-auction-cointraffic-response.json @@ -13,7 +13,10 @@ "crid": "24080", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "cointraffic" + } }, "origbidcpm": 0.01 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/coinzilla/test-auction-coinzilla-response.json b/src/test/resources/org/prebid/server/it/openrtb2/coinzilla/test-auction-coinzilla-response.json index 9f59c942b28..c324ea7e396 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/coinzilla/test-auction-coinzilla-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/coinzilla/test-auction-coinzilla-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "coinzilla" + } }, "origbidcpm": 6.66 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/colossus/aliases/test-auction-colossusssp-response.json b/src/test/resources/org/prebid/server/it/openrtb2/colossus/aliases/test-auction-colossusssp-response.json index f551e12bbe4..a7561797cd2 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/colossus/aliases/test-auction-colossusssp-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/colossus/aliases/test-auction-colossusssp-response.json @@ -14,7 +14,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "colossusssp" + } }, "origbidcpm": 1.25 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/colossus/test-auction-colossus-response.json b/src/test/resources/org/prebid/server/it/openrtb2/colossus/test-auction-colossus-response.json index d7914b5fb58..00b82c6832c 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/colossus/test-auction-colossus-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/colossus/test-auction-colossus-response.json @@ -14,7 +14,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "colossus" + } }, "mediaType" : "banner", "origbidcpm": 1.25 diff --git a/src/test/resources/org/prebid/server/it/openrtb2/compass/test-auction-compass-response.json b/src/test/resources/org/prebid/server/it/openrtb2/compass/test-auction-compass-response.json index 20f86d6a348..8d99466cf31 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/compass/test-auction-compass-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/compass/test-auction-compass-response.json @@ -14,7 +14,10 @@ "h": 600, "ext": { "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "compass" + } }, "origbidcpm": 1.25 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/concert/test-auction-concert-response.json b/src/test/resources/org/prebid/server/it/openrtb2/concert/test-auction-concert-response.json index 666a177b9c1..0bf7901ecec 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/concert/test-auction-concert-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/concert/test-auction-concert-response.json @@ -17,7 +17,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "concert" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/connatix/test-banner-auction-connatix-response.json b/src/test/resources/org/prebid/server/it/openrtb2/connatix/test-banner-auction-connatix-response.json index 3d1b37feaad..7c00ed3b4a3 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/connatix/test-banner-auction-connatix-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/connatix/test-banner-auction-connatix-response.json @@ -22,7 +22,10 @@ "origbidcpm": 0.3, "origbidcur": "USD", "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "connatix" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/connectad/test-auction-connectad-response.json b/src/test/resources/org/prebid/server/it/openrtb2/connectad/test-auction-connectad-response.json index d24913feeef..e797ec6a137 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/connectad/test-auction-connectad-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/connectad/test-auction-connectad-response.json @@ -14,7 +14,10 @@ "ext": { "format": "BANNER", "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "connectad" + } }, "origbidcpm": 0.01 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/connektai/test-auction-connektai-response.json b/src/test/resources/org/prebid/server/it/openrtb2/connektai/test-auction-connektai-response.json index 66239692835..14df1f1c64d 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/connektai/test-auction-connektai-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/connektai/test-auction-connektai-response.json @@ -14,7 +14,10 @@ "crid": "test-creative-id-1", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "connektai" + } }, "origbidcpm": 10, "origbidcur": "EUR" diff --git a/src/test/resources/org/prebid/server/it/openrtb2/consumable/test-auction-consumable-response.json b/src/test/resources/org/prebid/server/it/openrtb2/consumable/test-auction-consumable-response.json index a28d27cf14a..08b04afa02b 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/consumable/test-auction-consumable-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/consumable/test-auction-consumable-response.json @@ -18,7 +18,10 @@ "origbidcpm": 0.5, "origbidcur": "USD", "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "consumable" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/copper6/test-auction-copper6-response.json b/src/test/resources/org/prebid/server/it/openrtb2/copper6/test-auction-copper6-response.json index 3ac3ccb1672..a0761e1f8f5 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/copper6/test-auction-copper6-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/copper6/test-auction-copper6-response.json @@ -14,7 +14,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "copper6" + } }, "origbidcpm": 8.43 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/copper6ssp/test-auction-copper6ssp-response.json b/src/test/resources/org/prebid/server/it/openrtb2/copper6ssp/test-auction-copper6ssp-response.json index 52b36682c8a..5568f0c15de 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/copper6ssp/test-auction-copper6ssp-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/copper6ssp/test-auction-copper6ssp-response.json @@ -14,7 +14,10 @@ "h": 600, "ext": { "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "copper6ssp" + } }, "origbidcpm": 1.25 }, diff --git a/src/test/resources/org/prebid/server/it/openrtb2/cpmstar/test-auction-cpmstar-response.json b/src/test/resources/org/prebid/server/it/openrtb2/cpmstar/test-auction-cpmstar-response.json index 6a685a06ba4..c3dbd66dd05 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/cpmstar/test-auction-cpmstar-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/cpmstar/test-auction-cpmstar-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "cpmstar" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/criteo/test-auction-criteo-response.json b/src/test/resources/org/prebid/server/it/openrtb2/criteo/test-auction-criteo-response.json index 9d7e6b1ca5b..0968661be88 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/criteo/test-auction-criteo-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/criteo/test-auction-criteo-response.json @@ -14,7 +14,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "criteo" + } }, "origbidcpm": 1.25 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/cwire/test-auction-cwire-response.json b/src/test/resources/org/prebid/server/it/openrtb2/cwire/test-auction-cwire-response.json index ba9923d657c..be6517f1b26 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/cwire/test-auction-cwire-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/cwire/test-auction-cwire-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "cwire" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/datablocks/test-auction-datablocks-response.json b/src/test/resources/org/prebid/server/it/openrtb2/datablocks/test-auction-datablocks-response.json index a73407d0bb8..93ee48f70a3 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/datablocks/test-auction-datablocks-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/datablocks/test-auction-datablocks-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "datablocks" + } }, "origbidcpm": 7.77 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/decenterads/test-auction-decenterads-response.json b/src/test/resources/org/prebid/server/it/openrtb2/decenterads/test-auction-decenterads-response.json index 6b058b84507..84a45888fd2 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/decenterads/test-auction-decenterads-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/decenterads/test-auction-decenterads-response.json @@ -14,7 +14,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "decenterads" + } }, "origbidcpm": 1.25 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/deepintent/test-auction-deepintent-response.json b/src/test/resources/org/prebid/server/it/openrtb2/deepintent/test-auction-deepintent-response.json index 223095836df..26021d2b4cf 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/deepintent/test-auction-deepintent-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/deepintent/test-auction-deepintent-response.json @@ -13,7 +13,10 @@ "crid": "24080", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "deepintent" + } }, "origbidcpm": 0.01 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/definemedia/test-auction-definemedia-response.json b/src/test/resources/org/prebid/server/it/openrtb2/definemedia/test-auction-definemedia-response.json index 34d7cd3fbf2..381bc91c43e 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/definemedia/test-auction-definemedia-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/definemedia/test-auction-definemedia-response.json @@ -13,7 +13,10 @@ "crid": "test-creative-id-1", "ext": { "prebid": { - "type": "native" + "type": "native", + "meta": { + "adaptercode": "definemedia" + } }, "origbidcpm": 10, "origbidcur": "EUR" diff --git a/src/test/resources/org/prebid/server/it/openrtb2/dianomi/test-auction-dianomi-response.json b/src/test/resources/org/prebid/server/it/openrtb2/dianomi/test-auction-dianomi-response.json index 0725b710372..3ce055440ed 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/dianomi/test-auction-dianomi-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/dianomi/test-auction-dianomi-response.json @@ -13,7 +13,10 @@ "crid": "test-creative-id-2", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "dianomi" + } }, "pt": "gross", "origbidcpm": 10, diff --git a/src/test/resources/org/prebid/server/it/openrtb2/dianomi/test-dianomi-bid-response.json b/src/test/resources/org/prebid/server/it/openrtb2/dianomi/test-dianomi-bid-response.json index eabb1b30546..f4d5e5d39d9 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/dianomi/test-dianomi-bid-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/dianomi/test-dianomi-bid-response.json @@ -12,7 +12,10 @@ "crid": "test-creative-id-2", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "gross" + } }, "pt": "gross" } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/displayio/test-auction-displayio-response.json b/src/test/resources/org/prebid/server/it/openrtb2/displayio/test-auction-displayio-response.json index ad84acca12c..bdb825cec4c 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/displayio/test-auction-displayio-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/displayio/test-auction-displayio-response.json @@ -14,7 +14,10 @@ "mtype": 1, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "displayio" + } }, "origbidcpm": 0.01 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/dmx/test-auction-dmx-response.json b/src/test/resources/org/prebid/server/it/openrtb2/dmx/test-auction-dmx-response.json index e7b10ebdda4..d330b13d7f2 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/dmx/test-auction-dmx-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/dmx/test-auction-dmx-response.json @@ -13,7 +13,10 @@ "ext": { "format": "BANNER", "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "dmx" + } }, "origbidcpm": 0.01 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/driftpixel/test-auction-driftpixel-response.json b/src/test/resources/org/prebid/server/it/openrtb2/driftpixel/test-auction-driftpixel-response.json index d28852c4ccd..277f808bce6 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/driftpixel/test-auction-driftpixel-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/driftpixel/test-auction-driftpixel-response.json @@ -14,7 +14,10 @@ "mtype": 1, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "driftpixel" + } }, "origbidcpm": 0.01 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/dxkulture/test-auction-dxkulture-response.json b/src/test/resources/org/prebid/server/it/openrtb2/dxkulture/test-auction-dxkulture-response.json index b2442775de6..5756bce1878 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/dxkulture/test-auction-dxkulture-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/dxkulture/test-auction-dxkulture-response.json @@ -13,7 +13,10 @@ "ext": { "origbidcpm": 3.33, "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "dxkulture" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/edge226/test-auction-edge226-response.json b/src/test/resources/org/prebid/server/it/openrtb2/edge226/test-auction-edge226-response.json index 2b9d8f83ca4..ba20d1a291a 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/edge226/test-auction-edge226-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/edge226/test-auction-edge226-response.json @@ -14,7 +14,10 @@ "mtype": 1, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "edge226" + } }, "origbidcpm": 0.01 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/embimedia/test-auction-embimedia-response.json b/src/test/resources/org/prebid/server/it/openrtb2/embimedia/test-auction-embimedia-response.json index 930aa7c8b06..baeaf2c7c8c 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/embimedia/test-auction-embimedia-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/embimedia/test-auction-embimedia-response.json @@ -12,7 +12,10 @@ "ext": { "origbidcpm": 3.33, "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "embimedia" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/emtv/test-auction-emtv-response.json b/src/test/resources/org/prebid/server/it/openrtb2/emtv/test-auction-emtv-response.json index 3795c5a9c62..a1e1b4586a6 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/emtv/test-auction-emtv-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/emtv/test-auction-emtv-response.json @@ -14,7 +14,10 @@ "h": 600, "ext": { "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "emtv" + } }, "origbidcpm": 1.25 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/emxdigital/test-auction-emxdigital-response.json b/src/test/resources/org/prebid/server/it/openrtb2/emxdigital/test-auction-emxdigital-response.json index 552b0f3a934..0c7409ad7f1 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/emxdigital/test-auction-emxdigital-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/emxdigital/test-auction-emxdigital-response.json @@ -15,7 +15,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "emx_digital" + } }, "origbidcpm": 2.942808, "origbidcur": "USD" diff --git a/src/test/resources/org/prebid/server/it/openrtb2/eplanning/test-auction-eplanning-response.json b/src/test/resources/org/prebid/server/it/openrtb2/eplanning/test-auction-eplanning-response.json index ce65aba9a9b..aee270657c9 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/eplanning/test-auction-eplanning-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/eplanning/test-auction-eplanning-response.json @@ -16,7 +16,10 @@ "ext": { "origbidcpm": 0.5, "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "eplanning" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/epom/test-auction-epom-response.json b/src/test/resources/org/prebid/server/it/openrtb2/epom/test-auction-epom-response.json index f10ab8e286e..f6922d0abf4 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/epom/test-auction-epom-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/epom/test-auction-epom-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "epom" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/epsilon/alias/test-auction-epsilon-response.json b/src/test/resources/org/prebid/server/it/openrtb2/epsilon/alias/test-auction-epsilon-response.json index 3dd393badc9..99c0ed3bfce 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/epsilon/alias/test-auction-epsilon-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/epsilon/alias/test-auction-epsilon-response.json @@ -14,7 +14,10 @@ "h": 600, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "conversant" + } }, "origbidcpm": 5.0 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/epsilon/test-auction-epsilon-response.json b/src/test/resources/org/prebid/server/it/openrtb2/epsilon/test-auction-epsilon-response.json index 4aa8c6d0985..1331eadb2b9 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/epsilon/test-auction-epsilon-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/epsilon/test-auction-epsilon-response.json @@ -14,7 +14,10 @@ "h": 600, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "epsilon" + } }, "origbidcpm": 6.0 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/escalax/test-auction-escalax-response.json b/src/test/resources/org/prebid/server/it/openrtb2/escalax/test-auction-escalax-response.json index 7f2babf609e..197c5aeb8c0 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/escalax/test-auction-escalax-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/escalax/test-auction-escalax-response.json @@ -15,7 +15,10 @@ "mtype": 2, "ext": { "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "escalax" + } }, "origbidcpm": 1.25 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/evolution/test-auction-evolution-response.json b/src/test/resources/org/prebid/server/it/openrtb2/evolution/test-auction-evolution-response.json index d0043247edf..af999a6b058 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/evolution/test-auction-evolution-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/evolution/test-auction-evolution-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "e_volution" + } }, "mediaType": "banner", "origbidcpm": 3.33 diff --git a/src/test/resources/org/prebid/server/it/openrtb2/felixads/test-auction-felixads-response.json b/src/test/resources/org/prebid/server/it/openrtb2/felixads/test-auction-felixads-response.json index 0b63bd03f57..28796b6b966 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/felixads/test-auction-felixads-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/felixads/test-auction-felixads-response.json @@ -18,7 +18,10 @@ "mediaType": "video", "origbidcpm": 3.33, "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "felixads" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/filmzie/test-auction-filmzie-response.json b/src/test/resources/org/prebid/server/it/openrtb2/filmzie/test-auction-filmzie-response.json index e2c3508d1ab..b56413dc9a0 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/filmzie/test-auction-filmzie-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/filmzie/test-auction-filmzie-response.json @@ -12,7 +12,10 @@ "ext": { "origbidcpm": 3.33, "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "filmzie" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/finative/test-auction-finative-response.json b/src/test/resources/org/prebid/server/it/openrtb2/finative/test-auction-finative-response.json index e055b56bb65..33e56e2c057 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/finative/test-auction-finative-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/finative/test-auction-finative-response.json @@ -14,7 +14,10 @@ "crid": "test-creative-id-1", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "finative" + } }, "origbidcpm": 10, "origbidcur": "EUR" diff --git a/src/test/resources/org/prebid/server/it/openrtb2/flipp/test-auction-flipp-response.json b/src/test/resources/org/prebid/server/it/openrtb2/flipp/test-auction-flipp-response.json index a79558cbd9f..6de3f2adc6a 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/flipp/test-auction-flipp-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/flipp/test-auction-flipp-response.json @@ -16,7 +16,10 @@ "origbidcpm": 12.34, "origbidcur": "USD", "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "flipp" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/floors/floors-test-auction-response-no-signal.json b/src/test/resources/org/prebid/server/it/openrtb2/floors/floors-test-auction-response-no-signal.json index bc2278e74a3..09b7be0add3 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/floors/floors-test-auction-response-no-signal.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/floors/floors-test-auction-response-no-signal.json @@ -12,7 +12,10 @@ "crid": "24080", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "generic" + } }, "origbidcpm": 13, "origbidcur": "GBP" diff --git a/src/test/resources/org/prebid/server/it/openrtb2/floors/floors-test-auction-response.json b/src/test/resources/org/prebid/server/it/openrtb2/floors/floors-test-auction-response.json index 179a08e5cb1..d74037d285a 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/floors/floors-test-auction-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/floors/floors-test-auction-response.json @@ -12,7 +12,10 @@ "crid": "24080", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "generic" + } }, "origbidcpm": 13, "origbidcur":"GBP" diff --git a/src/test/resources/org/prebid/server/it/openrtb2/freewheelssp/test-auction-freewheelssp-response.json b/src/test/resources/org/prebid/server/it/openrtb2/freewheelssp/test-auction-freewheelssp-response.json index d583e32cc4f..0ad3c8e2466 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/freewheelssp/test-auction-freewheelssp-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/freewheelssp/test-auction-freewheelssp-response.json @@ -14,7 +14,10 @@ "crid": "7857", "ext": { "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "freewheelssp" + } }, "origbidcpm": 1 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/frvradn/test-auction-frvradn-response.json b/src/test/resources/org/prebid/server/it/openrtb2/frvradn/test-auction-frvradn-response.json index 683c42863d0..c9aaea5890b 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/frvradn/test-auction-frvradn-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/frvradn/test-auction-frvradn-response.json @@ -12,7 +12,10 @@ "ext": { "origbidcpm": 3.33, "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "frvradn" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/gamma/test-auction-gamma-response.json b/src/test/resources/org/prebid/server/it/openrtb2/gamma/test-auction-gamma-response.json index ce0e41775aa..6890852a1da 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/gamma/test-auction-gamma-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/gamma/test-auction-gamma-response.json @@ -19,7 +19,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "gamma" + } }, "origbidcpm": 0.5, "origbidcur": "USD" diff --git a/src/test/resources/org/prebid/server/it/openrtb2/gamoshi/test-auction-gamoshi-response.json b/src/test/resources/org/prebid/server/it/openrtb2/gamoshi/test-auction-gamoshi-response.json index 4d6ea3f9060..5d1b6d4f355 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/gamoshi/test-auction-gamoshi-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/gamoshi/test-auction-gamoshi-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "gamoshi" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/generic/test-auction-generic-response.json b/src/test/resources/org/prebid/server/it/openrtb2/generic/test-auction-generic-response.json index 8f2d2e4407c..5d0d9e49553 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/generic/test-auction-generic-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/generic/test-auction-generic-response.json @@ -15,7 +15,7 @@ "type": "banner", "meta": { "mediaType": "banner", - "adaptercode": "adaptercode" + "adaptercode": "generic" } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/generic_core_functionality/test-auction-generic-response.json b/src/test/resources/org/prebid/server/it/openrtb2/generic_core_functionality/test-auction-generic-response.json index 4ee1ff6a6c8..5aac6629309 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/generic_core_functionality/test-auction-generic-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/generic_core_functionality/test-auction-generic-response.json @@ -55,7 +55,8 @@ "rendererData": { "data": "some data" }, - "rendererUrl": "rendererUrl" + "rendererUrl": "rendererUrl", + "adaptercode": "generic" } }, "origbidcpm": 3.33 diff --git a/src/test/resources/org/prebid/server/it/openrtb2/generic_core_functionality/test-cache-generic-request.json b/src/test/resources/org/prebid/server/it/openrtb2/generic_core_functionality/test-cache-generic-request.json index a6d65dfcae0..aa611ad083c 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/generic_core_functionality/test-cache-generic-request.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/generic_core_functionality/test-cache-generic-request.json @@ -30,7 +30,8 @@ "rendererData": { "data": "some data" }, - "rendererUrl": "rendererUrl" + "rendererUrl": "rendererUrl", + "adaptercode": "generic" } }, "origbidcpm": 3.33 diff --git a/src/test/resources/org/prebid/server/it/openrtb2/globalsun/test-auction-globalsun-response.json b/src/test/resources/org/prebid/server/it/openrtb2/globalsun/test-auction-globalsun-response.json index 505a3ca4b5c..bbf696d0d99 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/globalsun/test-auction-globalsun-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/globalsun/test-auction-globalsun-response.json @@ -14,7 +14,10 @@ "h": 600, "ext": { "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "globalsun" + } }, "origbidcpm": 1.25 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/gothamads/test-auction-gothamads-response.json b/src/test/resources/org/prebid/server/it/openrtb2/gothamads/test-auction-gothamads-response.json index 728dccb2b13..b7439b4fb7a 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/gothamads/test-auction-gothamads-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/gothamads/test-auction-gothamads-response.json @@ -14,7 +14,10 @@ "mtype": 1, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "gothamads" + } }, "origbidcpm": 0.01 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/greedygame/test-auction-greedygame-response.json b/src/test/resources/org/prebid/server/it/openrtb2/greedygame/test-auction-greedygame-response.json index 7d19f2a3f5c..0a31a380e73 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/greedygame/test-auction-greedygame-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/greedygame/test-auction-greedygame-response.json @@ -12,7 +12,10 @@ "ext": { "origbidcpm": 3.33, "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "greedygame" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/grid/test-auction-grid-response.json b/src/test/resources/org/prebid/server/it/openrtb2/grid/test-auction-grid-response.json index f6a034ca8a3..eef83d5e402 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/grid/test-auction-grid-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/grid/test-auction-grid-response.json @@ -18,7 +18,8 @@ "prebid": { "type": "banner", "meta": { - "demandSource": "trustx" + "demandSource": "trustx", + "adaptercode": "grid" } }, "origbidcpm": 3.33 diff --git a/src/test/resources/org/prebid/server/it/openrtb2/gumgum/test-auction-gumgum-response.json b/src/test/resources/org/prebid/server/it/openrtb2/gumgum/test-auction-gumgum-response.json index 7c131a1f180..76e63e1666c 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/gumgum/test-auction-gumgum-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/gumgum/test-auction-gumgum-response.json @@ -14,7 +14,10 @@ "crid": "crid001", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "gumgum" + } }, "origbidcpm": 1.25 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_app_promotion_type/test-huaweiads-auction-response.json b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_app_promotion_type/test-huaweiads-auction-response.json index 2068eb254c5..b2422c4ed4b 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_app_promotion_type/test-huaweiads-auction-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_app_promotion_type/test-huaweiads-auction-response.json @@ -30,7 +30,10 @@ "origbidcpm": 2.8, "origbidcur": "CNY", "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "huaweiads" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_ch_endpoint/test-huaweiads-auction-response.json b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_ch_endpoint/test-huaweiads-auction-response.json index 931449bc021..76e68233f75 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_ch_endpoint/test-huaweiads-auction-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_ch_endpoint/test-huaweiads-auction-response.json @@ -30,7 +30,10 @@ "origbidcpm": 2.8, "origbidcur": "CNY", "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "huaweiads" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_eu_endpoint/test-huaweiads-auction-response.json b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_eu_endpoint/test-huaweiads-auction-response.json index 931449bc021..76e68233f75 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_eu_endpoint/test-huaweiads-auction-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_eu_endpoint/test-huaweiads-auction-response.json @@ -30,7 +30,10 @@ "origbidcpm": 2.8, "origbidcur": "CNY", "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "huaweiads" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_imei/test-huaweiads-auction-response.json b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_imei/test-huaweiads-auction-response.json index 931449bc021..76e68233f75 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_imei/test-huaweiads-auction-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_imei/test-huaweiads-auction-response.json @@ -30,7 +30,10 @@ "origbidcpm": 2.8, "origbidcur": "CNY", "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "huaweiads" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_interstitial_type/test-huaweiads-auction-response.json b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_interstitial_type/test-huaweiads-auction-response.json index 3f3b9084e45..40bfe76cd7c 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_interstitial_type/test-huaweiads-auction-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_interstitial_type/test-huaweiads-auction-response.json @@ -30,7 +30,10 @@ "origbidcpm": 2.8, "origbidcur": "CNY", "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "huaweiads" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_mccmnc/test-huaweiads-auction-response.json b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_mccmnc/test-huaweiads-auction-response.json index d6d29d2c614..760903a05d1 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_mccmnc/test-huaweiads-auction-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_mccmnc/test-huaweiads-auction-response.json @@ -23,7 +23,10 @@ "origbidcpm": 2.8, "origbidcur": "CNY", "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "huaweiads" + } } }, "h": 250, diff --git a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_non_integer_mccmnc/test-huaweiads-auction-response.json b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_non_integer_mccmnc/test-huaweiads-auction-response.json index d6d29d2c614..760903a05d1 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_non_integer_mccmnc/test-huaweiads-auction-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_non_integer_mccmnc/test-huaweiads-auction-response.json @@ -23,7 +23,10 @@ "origbidcpm": 2.8, "origbidcur": "CNY", "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "huaweiads" + } } }, "h": 250, diff --git a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_not_app_promotion_type/test-huaweiads-auction-response.json b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_not_app_promotion_type/test-huaweiads-auction-response.json index 05a00845f55..5543b401836 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_not_app_promotion_type/test-huaweiads-auction-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_not_app_promotion_type/test-huaweiads-auction-response.json @@ -30,7 +30,10 @@ "origbidcpm": 2.8, "origbidcur": "CNY", "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "huaweiads" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_ru_endpoint/test-huaweiads-auction-response.json b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_ru_endpoint/test-huaweiads-auction-response.json index dee5e9c6ebb..5c1737a381e 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_ru_endpoint/test-huaweiads-auction-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_ru_endpoint/test-huaweiads-auction-response.json @@ -30,7 +30,10 @@ "origbidcpm": 2.8, "origbidcur": "CNY", "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "huaweiads" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_with_user_geo/test-huaweiads-auction-response.json b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_with_user_geo/test-huaweiads-auction-response.json index d6d29d2c614..760903a05d1 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_with_user_geo/test-huaweiads-auction-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_with_user_geo/test-huaweiads-auction-response.json @@ -23,7 +23,10 @@ "origbidcpm": 2.8, "origbidcur": "CNY", "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "huaweiads" + } } }, "h": 250, diff --git a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_without_device_geo/test-huaweiads-auction-response.json b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_without_device_geo/test-huaweiads-auction-response.json index d6d29d2c614..760903a05d1 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_without_device_geo/test-huaweiads-auction-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_without_device_geo/test-huaweiads-auction-response.json @@ -23,7 +23,10 @@ "origbidcpm": 2.8, "origbidcur": "CNY", "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "huaweiads" + } } }, "h": 250, diff --git a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_without_userext/test-huaweiads-auction-response.json b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_without_userext/test-huaweiads-auction-response.json index 2fcaffd7d5b..2adeb193b23 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_without_userext/test-huaweiads-auction-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_without_userext/test-huaweiads-auction-response.json @@ -23,7 +23,10 @@ "origbidcpm": 2.8, "origbidcur": "CNY", "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "huaweiads" + } } }, "h": 300, diff --git a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_wrong_mccmnc/test-huaweiads-auction-response.json b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_wrong_mccmnc/test-huaweiads-auction-response.json index d6d29d2c614..760903a05d1 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_wrong_mccmnc/test-huaweiads-auction-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/banner_wrong_mccmnc/test-huaweiads-auction-response.json @@ -23,7 +23,10 @@ "origbidcpm": 2.8, "origbidcur": "CNY", "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "huaweiads" + } } }, "h": 250, diff --git a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/native_include_video/test-huaweiads-auction-response.json b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/native_include_video/test-huaweiads-auction-response.json index 78e93b06659..49ae58c1eee 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/native_include_video/test-huaweiads-auction-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/native_include_video/test-huaweiads-auction-response.json @@ -30,7 +30,10 @@ "origbidcpm": 2.8, "origbidcur": "CNY", "prebid": { - "type": "native" + "type": "native", + "meta": { + "adaptercode": "huaweiads" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/native_single_image/test-huaweiads-auction-response.json b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/native_single_image/test-huaweiads-auction-response.json index 3da566123a6..4776880e4ec 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/native_single_image/test-huaweiads-auction-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/native_single_image/test-huaweiads-auction-response.json @@ -30,7 +30,10 @@ "origbidcpm": 2.8, "origbidcur": "CNY", "prebid": { - "type": "native" + "type": "native", + "meta": { + "adaptercode": "huaweiads" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/native_three_image/test-huaweiads-auction-response.json b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/native_three_image/test-huaweiads-auction-response.json index 8253f6b3e62..ff14f4ba509 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/native_three_image/test-huaweiads-auction-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/native_three_image/test-huaweiads-auction-response.json @@ -30,7 +30,10 @@ "origbidcpm": 2.8, "origbidcur": "CNY", "prebid": { - "type": "native" + "type": "native", + "meta": { + "adaptercode": "huaweiads" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/native_three_image_include_icon/test-huaweiads-auction-response.json b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/native_three_image_include_icon/test-huaweiads-auction-response.json index b67ae7292e1..256999feb13 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/native_three_image_include_icon/test-huaweiads-auction-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/native_three_image_include_icon/test-huaweiads-auction-response.json @@ -30,7 +30,10 @@ "origbidcpm": 2.8, "origbidcur": "CNY", "prebid": { - "type": "native" + "type": "native", + "meta": { + "adaptercode": "huaweiads" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/simple_video/test-huaweiads-auction-response.json b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/simple_video/test-huaweiads-auction-response.json index 928b8e37d12..1cc40a53944 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/simple_video/test-huaweiads-auction-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/simple_video/test-huaweiads-auction-response.json @@ -30,7 +30,10 @@ "origbidcpm": 2.8, "origbidcur": "CNY", "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "huaweiads" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/test-huaweiads-auction-response.json b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/test-huaweiads-auction-response.json index c59dbe20672..75796bc960d 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/test-huaweiads-auction-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/test-huaweiads-auction-response.json @@ -23,7 +23,10 @@ "origbidcpm": 2.8, "origbidcur": "CNY", "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "huaweiads" + } } }, "h": 300, diff --git a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/video_interstitial_type/test-huaweiads-auction-response.json b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/video_interstitial_type/test-huaweiads-auction-response.json index 2d7403f3e7e..2a84688584f 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/video_interstitial_type/test-huaweiads-auction-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/video_interstitial_type/test-huaweiads-auction-response.json @@ -30,7 +30,10 @@ "origbidcpm": 2.8, "origbidcur": "CNY", "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "huaweiads" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/video_rewarded_type_no_icons_no_images/test-huaweiads-auction-response.json b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/video_rewarded_type_no_icons_no_images/test-huaweiads-auction-response.json index 2d7403f3e7e..2a84688584f 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/video_rewarded_type_no_icons_no_images/test-huaweiads-auction-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/video_rewarded_type_no_icons_no_images/test-huaweiads-auction-response.json @@ -30,7 +30,10 @@ "origbidcpm": 2.8, "origbidcur": "CNY", "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "huaweiads" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/video_rewarded_type_with_icon/test-huaweiads-auction-response.json b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/video_rewarded_type_with_icon/test-huaweiads-auction-response.json index 72686361101..17d0533c6f8 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/video_rewarded_type_with_icon/test-huaweiads-auction-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/video_rewarded_type_with_icon/test-huaweiads-auction-response.json @@ -30,7 +30,10 @@ "origbidcpm": 2.8, "origbidcur": "CNY", "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "huaweiads" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/video_rewarded_type_with_images/test-huaweiads-auction-response.json b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/video_rewarded_type_with_images/test-huaweiads-auction-response.json index 9425d23926c..c40c4f33af5 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/video_rewarded_type_with_images/test-huaweiads-auction-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/video_rewarded_type_with_images/test-huaweiads-auction-response.json @@ -30,7 +30,10 @@ "origbidcpm": 2.8, "origbidcur": "CNY", "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "huaweiads" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/video_roll_type/test-huaweiads-auction-response.json b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/video_roll_type/test-huaweiads-auction-response.json index 16f6247161f..5fd3eaec873 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/video_roll_type/test-huaweiads-auction-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/huaweiads/video_roll_type/test-huaweiads-auction-response.json @@ -30,7 +30,10 @@ "origbidcpm": 2.8, "origbidcur": "CNY", "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "huaweiads" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/iionads/test-auction-iionads-response.json b/src/test/resources/org/prebid/server/it/openrtb2/iionads/test-auction-iionads-response.json index e37c977df53..fa138bf0b8d 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/iionads/test-auction-iionads-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/iionads/test-auction-iionads-response.json @@ -12,7 +12,10 @@ "ext": { "origbidcpm": 3.33, "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "iionads" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/imds/test-auction-imds-response.json b/src/test/resources/org/prebid/server/it/openrtb2/imds/test-auction-imds-response.json index 8eae0a3d518..f5dc635bb4c 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/imds/test-auction-imds-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/imds/test-auction-imds-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "imds" + } }, "origbidcpm": 7.77 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/impactify/test-auction-impactify-response.json b/src/test/resources/org/prebid/server/it/openrtb2/impactify/test-auction-impactify-response.json index 9ea7cb8766f..7ca8055396d 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/impactify/test-auction-impactify-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/impactify/test-auction-impactify-response.json @@ -13,7 +13,10 @@ "crid": "24080", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "impactify" + } }, "origbidcpm": 0.01 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/improvedigital/test-auction-improvedigital-response.json b/src/test/resources/org/prebid/server/it/openrtb2/improvedigital/test-auction-improvedigital-response.json index a826a40c221..c9d91591fb8 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/improvedigital/test-auction-improvedigital-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/improvedigital/test-auction-improvedigital-response.json @@ -15,7 +15,10 @@ "mtype": 1, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "improvedigital" + } }, "origbidcpm": 1.25 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/indicue/test-auction-indicue-response.json b/src/test/resources/org/prebid/server/it/openrtb2/indicue/test-auction-indicue-response.json index 6361cafe796..f373e228ec5 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/indicue/test-auction-indicue-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/indicue/test-auction-indicue-response.json @@ -14,7 +14,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "indicue" + } }, "origbidcpm": 8.43 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/infytv/test-auction-infytv-response.json b/src/test/resources/org/prebid/server/it/openrtb2/infytv/test-auction-infytv-response.json index 55bd555ed6b..4b75b8e41ae 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/infytv/test-auction-infytv-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/infytv/test-auction-infytv-response.json @@ -14,7 +14,10 @@ "h": 250, "ext": { "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "infytv" + } }, "origbidcpm": 8.43 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/inmobi/test-auction-inmobi-response.json b/src/test/resources/org/prebid/server/it/openrtb2/inmobi/test-auction-inmobi-response.json index d2d1bd207fa..bc62d022ada 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/inmobi/test-auction-inmobi-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/inmobi/test-auction-inmobi-response.json @@ -17,7 +17,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "inmobi" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/insticator/test-auction-insticator-response.json b/src/test/resources/org/prebid/server/it/openrtb2/insticator/test-auction-insticator-response.json index fa2b0a4accd..71881371150 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/insticator/test-auction-insticator-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/insticator/test-auction-insticator-response.json @@ -17,7 +17,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "insticator" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/interactiveoffers/test-auction-interactiveoffers-response.json b/src/test/resources/org/prebid/server/it/openrtb2/interactiveoffers/test-auction-interactiveoffers-response.json index 3100814d919..48554d736f8 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/interactiveoffers/test-auction-interactiveoffers-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/interactiveoffers/test-auction-interactiveoffers-response.json @@ -13,7 +13,10 @@ "crid": "crid", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "interactiveoffers" + } }, "origbidcpm": 10, "origbidcur": "USD" diff --git a/src/test/resources/org/prebid/server/it/openrtb2/intertech/test-auction-intertech-response.json b/src/test/resources/org/prebid/server/it/openrtb2/intertech/test-auction-intertech-response.json index 9a0fc145939..2771d04af3c 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/intertech/test-auction-intertech-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/intertech/test-auction-intertech-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "intertech" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/invibes/test-auction-invibes-response.json b/src/test/resources/org/prebid/server/it/openrtb2/invibes/test-auction-invibes-response.json index 4322850fa9d..da11cc5491d 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/invibes/test-auction-invibes-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/invibes/test-auction-invibes-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "invibes" + } }, "origbidcpm": 1.3, "origbidcur": "USD" diff --git a/src/test/resources/org/prebid/server/it/openrtb2/iqx/test-auction-iqx-response.json b/src/test/resources/org/prebid/server/it/openrtb2/iqx/test-auction-iqx-response.json index 3fc5c87e169..6bf6568f794 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/iqx/test-auction-iqx-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/iqx/test-auction-iqx-response.json @@ -13,7 +13,10 @@ "ext": { "origbidcpm": 3.33, "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "iqx" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/iqzone/test-auction-iqzone-response.json b/src/test/resources/org/prebid/server/it/openrtb2/iqzone/test-auction-iqzone-response.json index b73fb55b074..f490a4e9011 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/iqzone/test-auction-iqzone-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/iqzone/test-auction-iqzone-response.json @@ -17,7 +17,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "iqzone" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/ix/test-auction-ix-response.json b/src/test/resources/org/prebid/server/it/openrtb2/ix/test-auction-ix-response.json index c2c8e90c3f5..85e32f2eb24 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/ix/test-auction-ix-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/ix/test-auction-ix-response.json @@ -12,7 +12,10 @@ "crid": "crid6", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "ix" + } }, "origbidcpm": 4.7 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/jambojar/test-auction-jambojar-response.json b/src/test/resources/org/prebid/server/it/openrtb2/jambojar/test-auction-jambojar-response.json index f0af52f749f..852d757e414 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/jambojar/test-auction-jambojar-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/jambojar/test-auction-jambojar-response.json @@ -18,7 +18,10 @@ "mediaType": "video", "origbidcpm": 3.33, "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "jambojar" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/jdpmedia/test-auction-jdpmedia-response.json b/src/test/resources/org/prebid/server/it/openrtb2/jdpmedia/test-auction-jdpmedia-response.json index 31a01fdf368..9c8dff89602 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/jdpmedia/test-auction-jdpmedia-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/jdpmedia/test-auction-jdpmedia-response.json @@ -18,7 +18,10 @@ "mediaType": "video", "origbidcpm": 3.33, "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "jdpmedia" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/jixie/test-auction-jixie-response.json b/src/test/resources/org/prebid/server/it/openrtb2/jixie/test-auction-jixie-response.json index 196ed6b59e7..603142e9877 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/jixie/test-auction-jixie-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/jixie/test-auction-jixie-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "jixie" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/kargo/test-auction-kargo-response.json b/src/test/resources/org/prebid/server/it/openrtb2/kargo/test-auction-kargo-response.json index 2589f6a4a4d..8fc4472a83f 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/kargo/test-auction-kargo-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/kargo/test-auction-kargo-response.json @@ -12,7 +12,10 @@ "ext": { "origbidcpm": 3.33, "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "kargo" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/kayzen/test-auction-kayzen-response.json b/src/test/resources/org/prebid/server/it/openrtb2/kayzen/test-auction-kayzen-response.json index aaccad9be2d..e25c44a8af5 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/kayzen/test-auction-kayzen-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/kayzen/test-auction-kayzen-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "kayzen" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/kidoz/test-auction-kidoz-response.json b/src/test/resources/org/prebid/server/it/openrtb2/kidoz/test-auction-kidoz-response.json index 5cec9fef037..621b632e05f 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/kidoz/test-auction-kidoz-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/kidoz/test-auction-kidoz-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "kidoz" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/kiviads/test-auction-kiviads-response.json b/src/test/resources/org/prebid/server/it/openrtb2/kiviads/test-auction-kiviads-response.json index 07da2713c33..3cadec764df 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/kiviads/test-auction-kiviads-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/kiviads/test-auction-kiviads-response.json @@ -14,7 +14,10 @@ "h": 600, "ext": { "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "kiviads" + } }, "origbidcpm": 1.25 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/kobler/test-auction-kobler-response.json b/src/test/resources/org/prebid/server/it/openrtb2/kobler/test-auction-kobler-response.json index 7c9f11b5cf5..e5578a4dc18 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/kobler/test-auction-kobler-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/kobler/test-auction-kobler-response.json @@ -17,7 +17,10 @@ "mtype": 1, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "kobler" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/krushmedia/test-auction-krushmedia-response.json b/src/test/resources/org/prebid/server/it/openrtb2/krushmedia/test-auction-krushmedia-response.json index 56f25641c69..0360f81eea1 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/krushmedia/test-auction-krushmedia-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/krushmedia/test-auction-krushmedia-response.json @@ -13,7 +13,10 @@ "crid": "crid", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "krushmedia" + } }, "origbidcpm": 0.01 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/lemmaDigital/test-auction-lemmaDigital-response.json b/src/test/resources/org/prebid/server/it/openrtb2/lemmaDigital/test-auction-lemmaDigital-response.json index 59dc0706b2d..dbb331eb850 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/lemmaDigital/test-auction-lemmaDigital-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/lemmaDigital/test-auction-lemmaDigital-response.json @@ -12,7 +12,10 @@ "ext": { "origbidcpm": 3.33, "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "lemmadigital" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/liftoff/test-auction-liftoff-response.json b/src/test/resources/org/prebid/server/it/openrtb2/liftoff/test-auction-liftoff-response.json index e90d9b5f6aa..101268dc8ec 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/liftoff/test-auction-liftoff-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/liftoff/test-auction-liftoff-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "liftoff" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/limelightDigital/test-auction-limelightDigital-response.json b/src/test/resources/org/prebid/server/it/openrtb2/limelightDigital/test-auction-limelightDigital-response.json index 5bf9bad0853..43ab715d0db 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/limelightDigital/test-auction-limelightDigital-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/limelightDigital/test-auction-limelightDigital-response.json @@ -12,7 +12,10 @@ "ext": { "origbidcpm": 3.33, "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "limelightDigital" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/lmkiviads/test-auction-lmkiviads-response.json b/src/test/resources/org/prebid/server/it/openrtb2/lmkiviads/test-auction-lmkiviads-response.json index 200e13238f8..23be1717a5f 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/lmkiviads/test-auction-lmkiviads-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/lmkiviads/test-auction-lmkiviads-response.json @@ -12,7 +12,10 @@ "ext": { "origbidcpm": 3.33, "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "lmkiviads" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/lockerdome/test-auction-lockerdome-response.json b/src/test/resources/org/prebid/server/it/openrtb2/lockerdome/test-auction-lockerdome-response.json index d1ae959bebe..c95d3501afe 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/lockerdome/test-auction-lockerdome-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/lockerdome/test-auction-lockerdome-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "lockerdome" + } }, "origbidcpm": 7.35 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/logan/test-auction-logan-response.json b/src/test/resources/org/prebid/server/it/openrtb2/logan/test-auction-logan-response.json index f5503cf319d..a16b502cf0a 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/logan/test-auction-logan-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/logan/test-auction-logan-response.json @@ -14,7 +14,10 @@ "h": 600, "ext": { "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "logan" + } }, "origbidcpm": 1.25 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/logicad/test-auction-logicad-response.json b/src/test/resources/org/prebid/server/it/openrtb2/logicad/test-auction-logicad-response.json index 4319787685b..4b72dbcf6aa 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/logicad/test-auction-logicad-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/logicad/test-auction-logicad-response.json @@ -13,7 +13,10 @@ "crid": "crid", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "logicad" + } }, "origbidcpm": 0.01 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/loopme/test-auction-loopme-response.json b/src/test/resources/org/prebid/server/it/openrtb2/loopme/test-auction-loopme-response.json index 30397fe4de4..fc3da869072 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/loopme/test-auction-loopme-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/loopme/test-auction-loopme-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "loopme" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/loyal/test-auction-loyal-response.json b/src/test/resources/org/prebid/server/it/openrtb2/loyal/test-auction-loyal-response.json index 58b5b47ee41..e64c7ced101 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/loyal/test-auction-loyal-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/loyal/test-auction-loyal-response.json @@ -13,7 +13,10 @@ "ext": { "origbidcpm": 3.33, "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "loyal" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/lunamedia/test-auction-lunamedia-response.json b/src/test/resources/org/prebid/server/it/openrtb2/lunamedia/test-auction-lunamedia-response.json index 194301eae99..e4a3cebc79a 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/lunamedia/test-auction-lunamedia-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/lunamedia/test-auction-lunamedia-response.json @@ -13,7 +13,10 @@ "crid": "crid", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "lunamedia" + } }, "origbidcpm": 0.01 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/mabidder/test-auction-mabidder-response.json b/src/test/resources/org/prebid/server/it/openrtb2/mabidder/test-auction-mabidder-response.json index 28e33d7e084..b22c9f2d97d 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/mabidder/test-auction-mabidder-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/mabidder/test-auction-mabidder-response.json @@ -20,7 +20,10 @@ "origbidcpm": 3.5764000415802, "origbidcur": "CAD", "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "mabidder" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/madvertise/test-auction-madvertise-response.json b/src/test/resources/org/prebid/server/it/openrtb2/madvertise/test-auction-madvertise-response.json index 1c31dddaea0..5ecd1600b55 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/madvertise/test-auction-madvertise-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/madvertise/test-auction-madvertise-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "madvertise" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/magnite/test-auction-magnite-response.json b/src/test/resources/org/prebid/server/it/openrtb2/magnite/test-auction-magnite-response.json index 26ab91ce9d2..0f321a8402e 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/magnite/test-auction-magnite-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/magnite/test-auction-magnite-response.json @@ -22,7 +22,8 @@ "id1", "id2" ], - "networkId": 123 + "networkId": 123, + "adaptercode": "magnite" }, "type": "video" }, diff --git a/src/test/resources/org/prebid/server/it/openrtb2/markapp/test-auction-markapp-response.json b/src/test/resources/org/prebid/server/it/openrtb2/markapp/test-auction-markapp-response.json index a6bccc7525a..8c80a52e822 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/markapp/test-auction-markapp-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/markapp/test-auction-markapp-response.json @@ -18,7 +18,10 @@ "mediaType": "video", "origbidcpm": 3.33, "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "markapp" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/marsmedia/test-auction-marsmedia-response.json b/src/test/resources/org/prebid/server/it/openrtb2/marsmedia/test-auction-marsmedia-response.json index b2536b23494..e21c8c5869f 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/marsmedia/test-auction-marsmedia-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/marsmedia/test-auction-marsmedia-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "marsmedia" + } }, "origbidcpm": 7.35 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/mediago/test-auction-mediago-response.json b/src/test/resources/org/prebid/server/it/openrtb2/mediago/test-auction-mediago-response.json index 7eb299b660f..09f2788051d 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/mediago/test-auction-mediago-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/mediago/test-auction-mediago-response.json @@ -14,7 +14,10 @@ "mtype": 1, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "mediago" + } }, "origbidcpm": 0.01 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/medianet/test-auction-medianet-response.json b/src/test/resources/org/prebid/server/it/openrtb2/medianet/test-auction-medianet-response.json index 55b8dba2496..5df4d60c940 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/medianet/test-auction-medianet-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/medianet/test-auction-medianet-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "medianet" + } }, "origbidcpm": 0.5 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/melozen/test-auction-melozen-response.json b/src/test/resources/org/prebid/server/it/openrtb2/melozen/test-auction-melozen-response.json index a810ba066a1..3ac02ff89bd 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/melozen/test-auction-melozen-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/melozen/test-auction-melozen-response.json @@ -13,7 +13,10 @@ "crid": "24080", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "melozen" + } }, "origbidcpm": 0.01 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/metax/test-auction-metax-response.json b/src/test/resources/org/prebid/server/it/openrtb2/metax/test-auction-metax-response.json index 82cc50b31be..db8a2a68ca6 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/metax/test-auction-metax-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/metax/test-auction-metax-response.json @@ -14,7 +14,10 @@ "h": 600, "ext": { "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "metax" + } }, "origbidcpm": 1.25 }, diff --git a/src/test/resources/org/prebid/server/it/openrtb2/mgid/test-auction-mgid-response.json b/src/test/resources/org/prebid/server/it/openrtb2/mgid/test-auction-mgid-response.json index f2c474641aa..0f09db81a25 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/mgid/test-auction-mgid-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/mgid/test-auction-mgid-response.json @@ -15,7 +15,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "mgid" + } }, "origbidcpm": 3.5, "crtype": "banner" diff --git a/src/test/resources/org/prebid/server/it/openrtb2/mgidx/test-auction-mgidx-response.json b/src/test/resources/org/prebid/server/it/openrtb2/mgidx/test-auction-mgidx-response.json index d24c8274ed9..e2ff4979eb5 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/mgidx/test-auction-mgidx-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/mgidx/test-auction-mgidx-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "mgidX" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/minutemedia/test-auction-minutemedia-response.json b/src/test/resources/org/prebid/server/it/openrtb2/minutemedia/test-auction-minutemedia-response.json index 10cdbd0a6f5..3811d587bd1 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/minutemedia/test-auction-minutemedia-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/minutemedia/test-auction-minutemedia-response.json @@ -22,7 +22,10 @@ "origbidcpm": 0.5, "origbidcur": "USD", "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "minutemedia" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/missena/test-auction-missena-response.json b/src/test/resources/org/prebid/server/it/openrtb2/missena/test-auction-missena-response.json index 28f9caabf7e..344c58cb6e6 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/missena/test-auction-missena-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/missena/test-auction-missena-response.json @@ -14,7 +14,10 @@ "origbidcpm": 10.2, "origbidcur": "USD", "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "missena" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/mobfoxpb/test-auction-mobfoxpb-response.json b/src/test/resources/org/prebid/server/it/openrtb2/mobfoxpb/test-auction-mobfoxpb-response.json index fb8a20ae2b0..b37259f2079 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/mobfoxpb/test-auction-mobfoxpb-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/mobfoxpb/test-auction-mobfoxpb-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "mobfoxpb" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/mobilefuse/test-auction-mobilefuse-response.json b/src/test/resources/org/prebid/server/it/openrtb2/mobilefuse/test-auction-mobilefuse-response.json index 3f22980426a..57423a842ec 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/mobilefuse/test-auction-mobilefuse-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/mobilefuse/test-auction-mobilefuse-response.json @@ -13,7 +13,10 @@ "crid": "test_banner_crid", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "mobilefuse" + } }, "origbidcpm": 0.01 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/mobupps/test-auction-mobupps-response.json b/src/test/resources/org/prebid/server/it/openrtb2/mobupps/test-auction-mobupps-response.json index 735fcd2ee33..6019f0e1752 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/mobupps/test-auction-mobupps-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/mobupps/test-auction-mobupps-response.json @@ -20,7 +20,10 @@ "origbidcpm": 1.23, "origbidcur": "USD", "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "mobupps" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/monetixads/test-auction-monetixads-response.json b/src/test/resources/org/prebid/server/it/openrtb2/monetixads/test-auction-monetixads-response.json index 45a89668316..43502b3a60c 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/monetixads/test-auction-monetixads-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/monetixads/test-auction-monetixads-response.json @@ -13,7 +13,10 @@ "crid": "24080", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "monetixads" + } }, "origbidcpm": 0.01 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/motorik/test-auction-motorik-response.json b/src/test/resources/org/prebid/server/it/openrtb2/motorik/test-auction-motorik-response.json index fba432c5be4..2be376398c8 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/motorik/test-auction-motorik-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/motorik/test-auction-motorik-response.json @@ -14,7 +14,10 @@ "h": 600, "ext": { "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "motorik" + } }, "origbidcpm": 1.25 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/multi_bid/test-auction-generic-genericAlias-response.json b/src/test/resources/org/prebid/server/it/openrtb2/multi_bid/test-auction-generic-genericAlias-response.json index 1e4f6f4a489..59bcbfb5eac 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/multi_bid/test-auction-generic-genericAlias-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/multi_bid/test-auction-generic-genericAlias-response.json @@ -15,6 +15,9 @@ "ext": { "prebid": { "type": "video", + "meta": { + "adaptercode": "generic" + }, "targeting": { "hb_size_generic": "300x250", "hb_cache_id": "07a81993-a3f4-4582-89c1-44a6935b192b", @@ -72,6 +75,9 @@ "ext": { "prebid": { "type": "video", + "meta": { + "adaptercode": "generic" + }, "targeting": { "hb_pb_rubN2": "8.40", "hb_uuid_rubN2": "d4f001de-4cc9-4857-9fad-70feff5c0dbc", @@ -132,6 +138,9 @@ "ext": { "prebid": { "type": "video", + "meta": { + "adaptercode": "genericAlias" + }, "targeting": { "hb_pb_genericAlias": "5.50", "hb_uuid_genericAlias": "5d7bfab8-69ea-416e-a5a1-a64db0bb218c", @@ -183,6 +192,9 @@ "ext": { "prebid": { "type": "video", + "meta": { + "adaptercode": "genericAlias" + }, "cache": { "bids": { "url": "{{ cache.resource_url }}c2da8624-f28a-4d01-bbd7-f348478c1185", diff --git a/src/test/resources/org/prebid/server/it/openrtb2/multi_bid/test-cache-generic-genericAlias-request.json b/src/test/resources/org/prebid/server/it/openrtb2/multi_bid/test-cache-generic-genericAlias-request.json index 770ee7c9d39..618d0f9a784 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/multi_bid/test-cache-generic-genericAlias-request.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/multi_bid/test-cache-generic-genericAlias-request.json @@ -13,6 +13,9 @@ "ext": { "prebid": { "type": "video", + "meta": { + "adaptercode": "generic" + }, "events": { "win": "http://localhost:8080/event?t=win&b=21521324&a=5001&aid=tid&ts=1000&bidder=generic&f=i&int=", "imp": "http://localhost:8080/event?t=imp&b=21521324&a=5001&aid=tid&ts=1000&bidder=generic&f=i&int=" @@ -52,6 +55,9 @@ "ext": { "prebid": { "type": "video", + "meta": { + "adaptercode": "genericAlias" + }, "events": { "win": "http://localhost:8080/event?t=win&b=7706636740145184841&a=5001&aid=tid&ts=1000&bidder=genericAlias&f=i&int=", "imp": "http://localhost:8080/event?t=imp&b=7706636740145184841&a=5001&aid=tid&ts=1000&bidder=genericAlias&f=i&int=" @@ -85,6 +91,9 @@ "ext": { "prebid": { "type": "video", + "meta": { + "adaptercode": "generic" + }, "events": { "win": "http://localhost:8080/event?t=win&b=880290288&a=5001&aid=tid&ts=1000&bidder=generic&f=i&int=", "imp": "http://localhost:8080/event?t=imp&b=880290288&a=5001&aid=tid&ts=1000&bidder=generic&f=i&int=" @@ -124,6 +133,9 @@ "ext": { "prebid": { "type": "video", + "meta": { + "adaptercode": "genericAlias" + }, "events": { "win": "http://localhost:8080/event?t=win&b=222214214214&a=5001&aid=tid&ts=1000&bidder=genericAlias&f=i&int=", "imp": "http://localhost:8080/event?t=imp&b=222214214214&a=5001&aid=tid&ts=1000&bidder=genericAlias&f=i&int=" diff --git a/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-auction-nextmillennium-response.json b/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-auction-nextmillennium-response.json index be5cf8b9277..a3fa75acc8c 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-auction-nextmillennium-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/nextmillennium/test-auction-nextmillennium-response.json @@ -14,7 +14,10 @@ "crid": "crid001", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "nextmillennium" + } }, "origbidcpm": 0.01 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/nobid/test-auction-nobid-response.json b/src/test/resources/org/prebid/server/it/openrtb2/nobid/test-auction-nobid-response.json index ebeea62aba0..7ec74e81f08 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/nobid/test-auction-nobid-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/nobid/test-auction-nobid-response.json @@ -13,7 +13,10 @@ "crid": "crid", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "nobid" + } }, "origbidcpm": 0.01 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/ogury/test-auction-ogury-response.json b/src/test/resources/org/prebid/server/it/openrtb2/ogury/test-auction-ogury-response.json index 299240bce6f..c30c4f090e6 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/ogury/test-auction-ogury-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/ogury/test-auction-ogury-response.json @@ -15,7 +15,10 @@ "mtype": 1, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "ogury" + } }, "origbidcpm": 1.25 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/oms/test-auction-oms-response.json b/src/test/resources/org/prebid/server/it/openrtb2/oms/test-auction-oms-response.json index 315114b4f75..ea09d34deff 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/oms/test-auction-oms-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/oms/test-auction-oms-response.json @@ -12,7 +12,10 @@ "ext": { "origbidcpm": 3.33, "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "oms" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/onetag/test-auction-onetag-response.json b/src/test/resources/org/prebid/server/it/openrtb2/onetag/test-auction-onetag-response.json index 4496bc2e4b6..5f53bca34d8 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/onetag/test-auction-onetag-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/onetag/test-auction-onetag-response.json @@ -13,7 +13,10 @@ "crid": "crid", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "onetag" + } }, "origbidcpm": 0.01 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/openweb/test-auction-openweb-response.json b/src/test/resources/org/prebid/server/it/openrtb2/openweb/test-auction-openweb-response.json index a996e780237..e67cbb854a7 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/openweb/test-auction-openweb-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/openweb/test-auction-openweb-response.json @@ -16,7 +16,10 @@ "ext": { "origbidcpm": 5.78, "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "openweb" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/openx/test-auction-openx-response.json b/src/test/resources/org/prebid/server/it/openrtb2/openx/test-auction-openx-response.json index 0c22b5e89b9..a575e3573a2 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/openx/test-auction-openx-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/openx/test-auction-openx-response.json @@ -14,7 +14,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "openx" + } }, "origbidcpm": 5.78, "origbidcur": "USD" diff --git a/src/test/resources/org/prebid/server/it/openrtb2/operaads/test-auction-operaads-response.json b/src/test/resources/org/prebid/server/it/openrtb2/operaads/test-auction-operaads-response.json index 91f9dc59e5c..ae4a671ce05 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/operaads/test-auction-operaads-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/operaads/test-auction-operaads-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "operaads" + } }, "origbidcpm": 3.33, "origbidcur": "USD" diff --git a/src/test/resources/org/prebid/server/it/openrtb2/oraki/test-auction-oraki-response.json b/src/test/resources/org/prebid/server/it/openrtb2/oraki/test-auction-oraki-response.json index 4bbd63fe482..8b55962f074 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/oraki/test-auction-oraki-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/oraki/test-auction-oraki-response.json @@ -14,7 +14,10 @@ "h": 600, "ext": { "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "oraki" + } }, "origbidcpm": 1.25 }, diff --git a/src/test/resources/org/prebid/server/it/openrtb2/orangeclickmedia/test-auction-orangeclickmedia-response.json b/src/test/resources/org/prebid/server/it/openrtb2/orangeclickmedia/test-auction-orangeclickmedia-response.json index 017bbf45c09..026c7bb1b14 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/orangeclickmedia/test-auction-orangeclickmedia-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/orangeclickmedia/test-auction-orangeclickmedia-response.json @@ -12,7 +12,10 @@ "ext": { "origbidcpm": 3.33, "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "orangeclickmedia" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/orbidder/test-auction-orbidder-response.json b/src/test/resources/org/prebid/server/it/openrtb2/orbidder/test-auction-orbidder-response.json index 40a02aff7f5..eabe3a40c94 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/orbidder/test-auction-orbidder-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/orbidder/test-auction-orbidder-response.json @@ -10,7 +10,10 @@ "ext": { "format": "BANNER", "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "orbidder" + } }, "origbidcpm": 0.01 }, diff --git a/src/test/resources/org/prebid/server/it/openrtb2/outbrain/test-auction-outbrain-response.json b/src/test/resources/org/prebid/server/it/openrtb2/outbrain/test-auction-outbrain-response.json index cb7fbc34fe8..b0d5f699b4d 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/outbrain/test-auction-outbrain-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/outbrain/test-auction-outbrain-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "outbrain" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/ownadx/test-auction-ownadx-response.json b/src/test/resources/org/prebid/server/it/openrtb2/ownadx/test-auction-ownadx-response.json index d7a74ef6d6d..da0e101f488 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/ownadx/test-auction-ownadx-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/ownadx/test-auction-ownadx-response.json @@ -17,7 +17,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "ownadx" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/pangle/test-auction-pangle-response.json b/src/test/resources/org/prebid/server/it/openrtb2/pangle/test-auction-pangle-response.json index b0995267c08..d62c429d154 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/pangle/test-auction-pangle-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/pangle/test-auction-pangle-response.json @@ -14,7 +14,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "pangle" + } }, "pangle": { "adtype": 1 diff --git a/src/test/resources/org/prebid/server/it/openrtb2/pgam/test-auction-pgam-response.json b/src/test/resources/org/prebid/server/it/openrtb2/pgam/test-auction-pgam-response.json index 82e6a8182df..9ccb517cd0b 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/pgam/test-auction-pgam-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/pgam/test-auction-pgam-response.json @@ -14,7 +14,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "pgam" + } }, "origbidcpm": 8.43 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/pgamssp/test-auction-pgamssp-response.json b/src/test/resources/org/prebid/server/it/openrtb2/pgamssp/test-auction-pgamssp-response.json index 303e8a7826c..9ea4e19e8db 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/pgamssp/test-auction-pgamssp-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/pgamssp/test-auction-pgamssp-response.json @@ -14,7 +14,10 @@ "mtype": 1, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "pgamssp" + } }, "origbidcpm": 0.01 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/pixad/test-auction-pixad-response.json b/src/test/resources/org/prebid/server/it/openrtb2/pixad/test-auction-pixad-response.json index 495a6b0c0ee..6519af26a50 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/pixad/test-auction-pixad-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/pixad/test-auction-pixad-response.json @@ -13,7 +13,10 @@ "crid": "24080", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "pixad" + } }, "origbidcpm": 0.01 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/playdigo/test-auction-playdigo-response.json b/src/test/resources/org/prebid/server/it/openrtb2/playdigo/test-auction-playdigo-response.json index 8bfc8b3f515..a8b4e24b945 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/playdigo/test-auction-playdigo-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/playdigo/test-auction-playdigo-response.json @@ -13,7 +13,10 @@ "ext": { "origbidcpm": 3.33, "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "playdigo" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/preciso/test-auction-preciso-response.json b/src/test/resources/org/prebid/server/it/openrtb2/preciso/test-auction-preciso-response.json index c26bf519990..dc71d04d980 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/preciso/test-auction-preciso-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/preciso/test-auction-preciso-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "preciso" + } }, "origbidcpm": 0.5 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/pubmatic/test-auction-pubmatic-response.json b/src/test/resources/org/prebid/server/it/openrtb2/pubmatic/test-auction-pubmatic-response.json index 4df8cf0c723..964d4ea072b 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/pubmatic/test-auction-pubmatic-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/pubmatic/test-auction-pubmatic-response.json @@ -15,7 +15,10 @@ "ext": { "bidtype": 1, "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "pubmatic" + } }, "origbidcpm": 4.75 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/pubnative/test-auction-pubnative-response.json b/src/test/resources/org/prebid/server/it/openrtb2/pubnative/test-auction-pubnative-response.json index d263e2b1f43..9e3188b3a0c 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/pubnative/test-auction-pubnative-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/pubnative/test-auction-pubnative-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "pubnative" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/pubrise/test-auction-pubrise-response.json b/src/test/resources/org/prebid/server/it/openrtb2/pubrise/test-auction-pubrise-response.json index 752b5519b40..56679417c40 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/pubrise/test-auction-pubrise-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/pubrise/test-auction-pubrise-response.json @@ -14,7 +14,10 @@ "h": 600, "ext": { "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "pubrise" + } }, "origbidcpm": 1.25 }, diff --git a/src/test/resources/org/prebid/server/it/openrtb2/pulsepoint/test-auction-pulsepoint-response.json b/src/test/resources/org/prebid/server/it/openrtb2/pulsepoint/test-auction-pulsepoint-response.json index 88c15aebf71..4562ed7bcbd 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/pulsepoint/test-auction-pulsepoint-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/pulsepoint/test-auction-pulsepoint-response.json @@ -14,7 +14,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "pulsepoint" + } }, "origbidcpm": 4.75 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/pwbid/test-auction-pwbid-response.json b/src/test/resources/org/prebid/server/it/openrtb2/pwbid/test-auction-pwbid-response.json index b6c810ede52..0e18ccd7416 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/pwbid/test-auction-pwbid-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/pwbid/test-auction-pwbid-response.json @@ -14,7 +14,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "pwbid" + } }, "origbidcpm": 8.43 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/qt/test-auction-qt-response.json b/src/test/resources/org/prebid/server/it/openrtb2/qt/test-auction-qt-response.json index 16db7e67c68..735c9327556 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/qt/test-auction-qt-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/qt/test-auction-qt-response.json @@ -14,7 +14,10 @@ "h": 600, "ext": { "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "qt" + } }, "origbidcpm": 1.25 }, diff --git a/src/test/resources/org/prebid/server/it/openrtb2/readpeak/test-auction-readpeak-response.json b/src/test/resources/org/prebid/server/it/openrtb2/readpeak/test-auction-readpeak-response.json index 06a8c3170aa..e05df94de09 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/readpeak/test-auction-readpeak-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/readpeak/test-auction-readpeak-response.json @@ -13,7 +13,9 @@ "ext": { "prebid": { "type": "banner", - "meta": {} + "meta": { + "adaptercode": "readpeak" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/relevantdigital/test-auction-relevantdigital-response.json b/src/test/resources/org/prebid/server/it/openrtb2/relevantdigital/test-auction-relevantdigital-response.json index d3531b49cca..021308ba7dc 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/relevantdigital/test-auction-relevantdigital-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/relevantdigital/test-auction-relevantdigital-response.json @@ -15,7 +15,10 @@ "mtype": 2, "ext": { "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "relevantdigital" + } }, "origbidcpm": 5.78 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/resetdigital/test-auction-resetdigital-response.json b/src/test/resources/org/prebid/server/it/openrtb2/resetdigital/test-auction-resetdigital-response.json index f595ea39c9f..556bc6d3217 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/resetdigital/test-auction-resetdigital-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/resetdigital/test-auction-resetdigital-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "resetdigital" + } }, "origbidcpm": 3.33, "origbidcur": "USD" diff --git a/src/test/resources/org/prebid/server/it/openrtb2/revcontent/test-auction-revcontent-response.json b/src/test/resources/org/prebid/server/it/openrtb2/revcontent/test-auction-revcontent-response.json index 4e6047c3738..f6b0d0d8a47 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/revcontent/test-auction-revcontent-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/revcontent/test-auction-revcontent-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "revcontent" + } }, "origbidcpm": 0.5 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/richaudience/test-auction-richaudience-response.json b/src/test/resources/org/prebid/server/it/openrtb2/richaudience/test-auction-richaudience-response.json index eff55f8f91a..1e51e32b51d 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/richaudience/test-auction-richaudience-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/richaudience/test-auction-richaudience-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "richaudience" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/rise/test-auction-rise-response.json b/src/test/resources/org/prebid/server/it/openrtb2/rise/test-auction-rise-response.json index bd6fcb25dff..bce592cf6ad 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/rise/test-auction-rise-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/rise/test-auction-rise-response.json @@ -15,7 +15,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "rise" + } }, "origbidcpm": 1.25 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/roulax/test-auction-roulax-response.json b/src/test/resources/org/prebid/server/it/openrtb2/roulax/test-auction-roulax-response.json index a5bbb8909ea..7055f194f31 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/roulax/test-auction-roulax-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/roulax/test-auction-roulax-response.json @@ -13,7 +13,10 @@ "ext": { "origbidcpm": 3.33, "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "roulax" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/rtbhouse/test-auction-rtbhouse-response.json b/src/test/resources/org/prebid/server/it/openrtb2/rtbhouse/test-auction-rtbhouse-response.json index af521daf6b9..065913162d7 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/rtbhouse/test-auction-rtbhouse-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/rtbhouse/test-auction-rtbhouse-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "rtbhouse" + } }, "origbidcpm": 0.5 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/rubicon/test-auction-rubicon-response.json b/src/test/resources/org/prebid/server/it/openrtb2/rubicon/test-auction-rubicon-response.json index c577324825d..3baa5fddcda 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/rubicon/test-auction-rubicon-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/rubicon/test-auction-rubicon-response.json @@ -22,7 +22,8 @@ "id1", "id2" ], - "networkId": 123 + "networkId": 123, + "adaptercode": "rubicon" }, "type": "video" }, diff --git a/src/test/resources/org/prebid/server/it/openrtb2/salunamedia/test-auction-salunamedia-response.json b/src/test/resources/org/prebid/server/it/openrtb2/salunamedia/test-auction-salunamedia-response.json index 1ac268bddad..122a98acd88 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/salunamedia/test-auction-salunamedia-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/salunamedia/test-auction-salunamedia-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "sa_lunamedia" + } }, "mediaType": "banner", "origbidcpm": 3.33 diff --git a/src/test/resources/org/prebid/server/it/openrtb2/screencore/test-auction-screencore-response.json b/src/test/resources/org/prebid/server/it/openrtb2/screencore/test-auction-screencore-response.json index b644dd7caf2..92ac3fffe4c 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/screencore/test-auction-screencore-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/screencore/test-auction-screencore-response.json @@ -14,7 +14,10 @@ "mtype": 1, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "screencore" + } }, "origbidcpm": 0.01 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/seedingAlliance/test-auction-seedingAlliance-response.json b/src/test/resources/org/prebid/server/it/openrtb2/seedingAlliance/test-auction-seedingAlliance-response.json index b444c1eb55d..56c5476411d 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/seedingAlliance/test-auction-seedingAlliance-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/seedingAlliance/test-auction-seedingAlliance-response.json @@ -14,7 +14,10 @@ "crid": "test-creative-id-1", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "seedingAlliance" + } }, "origbidcpm": 10, "origbidcur": "EUR" diff --git a/src/test/resources/org/prebid/server/it/openrtb2/sharethrough/test-auction-sharethrough-response.json b/src/test/resources/org/prebid/server/it/openrtb2/sharethrough/test-auction-sharethrough-response.json index edb951916c4..16c59d6da56 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/sharethrough/test-auction-sharethrough-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/sharethrough/test-auction-sharethrough-response.json @@ -13,7 +13,10 @@ "crid": "crid", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "sharethrough" + } }, "origbidcpm": 0.01, "origbidcur": "USD" diff --git a/src/test/resources/org/prebid/server/it/openrtb2/silvermob/test-auction-silvermob-response.json b/src/test/resources/org/prebid/server/it/openrtb2/silvermob/test-auction-silvermob-response.json index b5bbb53f45a..9e46c8d7fce 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/silvermob/test-auction-silvermob-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/silvermob/test-auction-silvermob-response.json @@ -13,7 +13,10 @@ "crid": "crid", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "silvermob" + } }, "origbidcpm": 0.01, "origbidcur": "USD" diff --git a/src/test/resources/org/prebid/server/it/openrtb2/silverpush/test-auction-silverpush-response.json b/src/test/resources/org/prebid/server/it/openrtb2/silverpush/test-auction-silverpush-response.json index 35c5e13b170..3835f9b1adc 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/silverpush/test-auction-silverpush-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/silverpush/test-auction-silverpush-response.json @@ -13,7 +13,10 @@ "ext": { "origbidcpm": 3.33, "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "silverpush" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/smaato/test-auction-smaato-response.json b/src/test/resources/org/prebid/server/it/openrtb2/smaato/test-auction-smaato-response.json index 463da2b0945..32dc7209653 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/smaato/test-auction-smaato-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/smaato/test-auction-smaato-response.json @@ -14,7 +14,10 @@ "exp": 300, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "smaato" + } }, "origbidcpm": 0.01, "format": "BANNER", diff --git a/src/test/resources/org/prebid/server/it/openrtb2/smartadserver/test-auction-smartadserver-response.json b/src/test/resources/org/prebid/server/it/openrtb2/smartadserver/test-auction-smartadserver-response.json index 7b143f69a40..4bb230de7f8 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/smartadserver/test-auction-smartadserver-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/smartadserver/test-auction-smartadserver-response.json @@ -19,7 +19,10 @@ "h": 576, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "smartadserver" + } }, "origbidcpm": 0.5 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/smarthub/test-auction-smarthub-response.json b/src/test/resources/org/prebid/server/it/openrtb2/smarthub/test-auction-smarthub-response.json index 5121930a9be..85adc4f4103 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/smarthub/test-auction-smarthub-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/smarthub/test-auction-smarthub-response.json @@ -18,7 +18,10 @@ "mediaType": "video", "origbidcpm": 3.33, "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "smarthub" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/smartrtb/test-auction-smartrtb-response.json b/src/test/resources/org/prebid/server/it/openrtb2/smartrtb/test-auction-smartrtb-response.json index 0797e39c9a7..2ff787b7c55 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/smartrtb/test-auction-smartrtb-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/smartrtb/test-auction-smartrtb-response.json @@ -10,7 +10,10 @@ "crid": "crid", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "smartrtb" + } }, "origbidcpm": 0.01 }, diff --git a/src/test/resources/org/prebid/server/it/openrtb2/smartx/test-auction-smartx-response.json b/src/test/resources/org/prebid/server/it/openrtb2/smartx/test-auction-smartx-response.json index 0e92d0f7a89..9746b66b080 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/smartx/test-auction-smartx-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/smartx/test-auction-smartx-response.json @@ -14,7 +14,10 @@ "ext": { "origbidcpm": 3.33, "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "smartx" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/smartyads/test-auction-smartyads-response.json b/src/test/resources/org/prebid/server/it/openrtb2/smartyads/test-auction-smartyads-response.json index 0b6d4de8672..d62bae570f7 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/smartyads/test-auction-smartyads-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/smartyads/test-auction-smartyads-response.json @@ -13,7 +13,10 @@ "crid": "crid", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "smartyads" + } }, "origbidcpm": 0.01 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/smilewanted/test-auction-smilewanted-response.json b/src/test/resources/org/prebid/server/it/openrtb2/smilewanted/test-auction-smilewanted-response.json index c7e19cf69cf..b32e54468eb 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/smilewanted/test-auction-smilewanted-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/smilewanted/test-auction-smilewanted-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "smilewanted" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/smrtconnect/test-auction-smrtconnect-response.json b/src/test/resources/org/prebid/server/it/openrtb2/smrtconnect/test-auction-smrtconnect-response.json index d3c9f4e8a2d..ef4f6b493ac 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/smrtconnect/test-auction-smrtconnect-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/smrtconnect/test-auction-smrtconnect-response.json @@ -17,7 +17,10 @@ "mtype": 1, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "smrtconnect" + } }, "origbidcpm": 0.5 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/sonobi/test-auction-sonobi-response.json b/src/test/resources/org/prebid/server/it/openrtb2/sonobi/test-auction-sonobi-response.json index 59208dd177e..60dc8cb5f31 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/sonobi/test-auction-sonobi-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/sonobi/test-auction-sonobi-response.json @@ -14,7 +14,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "sonobi" + } }, "origbidcpm": 1.25, "origbidcur": "USD" diff --git a/src/test/resources/org/prebid/server/it/openrtb2/sovrn/test-auction-sovrn-response.json b/src/test/resources/org/prebid/server/it/openrtb2/sovrn/test-auction-sovrn-response.json index 58d1bef9d8d..70c6e55cd08 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/sovrn/test-auction-sovrn-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/sovrn/test-auction-sovrn-response.json @@ -14,7 +14,10 @@ "h": 250, "ext": { "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "sovrn" + } }, "origbidcpm": 5.78 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/sovrnxsp/test-auction-sovrnxsp-response.json b/src/test/resources/org/prebid/server/it/openrtb2/sovrnxsp/test-auction-sovrnxsp-response.json index 3d0373bdb97..3aa06b3a2b1 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/sovrnxsp/test-auction-sovrnxsp-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/sovrnxsp/test-auction-sovrnxsp-response.json @@ -16,7 +16,10 @@ "ext": { "creative_type": 1, "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "sovrnXsp" + } }, "origbidcpm": 5.78 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/sspbc/test-auction-sspbc-response.json b/src/test/resources/org/prebid/server/it/openrtb2/sspbc/test-auction-sspbc-response.json index 8e87bb83efd..fd673b34ff5 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/sspbc/test-auction-sspbc-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/sspbc/test-auction-sspbc-response.json @@ -21,7 +21,10 @@ "slotid": "005", "tagid": "slot", "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "sspbc" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/storedresponse/test-auction-response.json b/src/test/resources/org/prebid/server/it/openrtb2/storedresponse/test-auction-response.json index f25cdd92a2f..0e09537a4c7 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/storedresponse/test-auction-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/storedresponse/test-auction-response.json @@ -15,6 +15,9 @@ "ext": { "prebid": { "type": "banner", + "meta": { + "adaptercode": "generic" + }, "targeting": { "hb_size_generic": "300x250", "hb_cache_id": "474175c2-815f-4bde-90ad-935d2f6e1aa0", diff --git a/src/test/resources/org/prebid/server/it/openrtb2/storedresponse/test-cache-request.json b/src/test/resources/org/prebid/server/it/openrtb2/storedresponse/test-cache-request.json index ba1f6a2d32c..369d162359a 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/storedresponse/test-cache-request.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/storedresponse/test-cache-request.json @@ -12,7 +12,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "generic" + } }, "origbidcpm": 0.8 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/streamlyn/test-auction-streamlyn-response.json b/src/test/resources/org/prebid/server/it/openrtb2/streamlyn/test-auction-streamlyn-response.json index 919e3fcdcb6..65df62c2c58 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/streamlyn/test-auction-streamlyn-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/streamlyn/test-auction-streamlyn-response.json @@ -12,7 +12,10 @@ "ext": { "origbidcpm": 3.33, "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "streamlyn" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/streamvision/test-auction-streamvision-response.json b/src/test/resources/org/prebid/server/it/openrtb2/streamvision/test-auction-streamvision-response.json index 02a0168c46a..0d6a9babc51 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/streamvision/test-auction-streamvision-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/streamvision/test-auction-streamvision-response.json @@ -12,7 +12,10 @@ "ext": { "origbidcpm": 3.33, "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "streamvision" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/stroeercore/test-auction-stroeercore-response.json b/src/test/resources/org/prebid/server/it/openrtb2/stroeercore/test-auction-stroeercore-response.json index c27cc4c6474..aab841a83de 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/stroeercore/test-auction-stroeercore-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/stroeercore/test-auction-stroeercore-response.json @@ -16,7 +16,10 @@ "origbidcpm": 6.77, "origbidcur": "EUR", "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "stroeerCore" + } } } }, @@ -31,7 +34,10 @@ "origbidcpm": 5.7, "origbidcur": "EUR", "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "stroeerCore" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/suntContent/test-auction-suntContent-response.json b/src/test/resources/org/prebid/server/it/openrtb2/suntContent/test-auction-suntContent-response.json index 7977110e93b..eb1dbb4ffc9 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/suntContent/test-auction-suntContent-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/suntContent/test-auction-suntContent-response.json @@ -14,7 +14,10 @@ "crid": "test-creative-id-1", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "suntContent" + } }, "origbidcpm": 10, "origbidcur": "EUR" diff --git a/src/test/resources/org/prebid/server/it/openrtb2/taboola/test-auction-taboola-response.json b/src/test/resources/org/prebid/server/it/openrtb2/taboola/test-auction-taboola-response.json index ba87a68d153..a90d55133e1 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/taboola/test-auction-taboola-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/taboola/test-auction-taboola-response.json @@ -15,7 +15,10 @@ "ext": { "origbidcpm": 8.43, "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "taboola" + } } } }, @@ -31,7 +34,10 @@ "ext": { "origbidcpm": 8.43, "prebid": { - "type": "native" + "type": "native", + "meta": { + "adaptercode": "taboola" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/tappx/test-auction-tappx-response.json b/src/test/resources/org/prebid/server/it/openrtb2/tappx/test-auction-tappx-response.json index 1fe9c183839..18479e94b80 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/tappx/test-auction-tappx-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/tappx/test-auction-tappx-response.json @@ -22,7 +22,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "tappx" + } }, "origbidcpm": 0.5 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/teads/test-auction-teads-response.json b/src/test/resources/org/prebid/server/it/openrtb2/teads/test-auction-teads-response.json index 37411e7dfb1..79678687307 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/teads/test-auction-teads-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/teads/test-auction-teads-response.json @@ -25,7 +25,8 @@ "type": "banner", "meta": { "rendererName": "teads", - "rendererVersion": "5.0.25" + "rendererVersion": "5.0.25", + "adaptercode": "teads" } }, "origbidcpm": 33 diff --git a/src/test/resources/org/prebid/server/it/openrtb2/telaria/test-auction-telaria-response.json b/src/test/resources/org/prebid/server/it/openrtb2/telaria/test-auction-telaria-response.json index a25794e3d5d..a62c605a690 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/telaria/test-auction-telaria-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/telaria/test-auction-telaria-response.json @@ -13,7 +13,10 @@ "exp": 120, "ext": { "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "telaria" + } }, "origbidcpm": 0.01, "format": "VIDEO" diff --git a/src/test/resources/org/prebid/server/it/openrtb2/tgm/test-auction-tgm-response.json b/src/test/resources/org/prebid/server/it/openrtb2/tgm/test-auction-tgm-response.json index 7630f73ad2a..17361a0bdb4 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/tgm/test-auction-tgm-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/tgm/test-auction-tgm-response.json @@ -12,7 +12,10 @@ "ext": { "origbidcpm": 3.33, "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "tgm" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/theadx/test-auction-theadx-response.json b/src/test/resources/org/prebid/server/it/openrtb2/theadx/test-auction-theadx-response.json index 023554088ff..a01054542d7 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/theadx/test-auction-theadx-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/theadx/test-auction-theadx-response.json @@ -12,7 +12,10 @@ "crid": "crid6", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "theadx" + } }, "origbidcpm": 4.7 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/thetradedesk/test-auction-thetradedesk-response.json b/src/test/resources/org/prebid/server/it/openrtb2/thetradedesk/test-auction-thetradedesk-response.json index 1bc78519e0b..e3fe5f37e65 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/thetradedesk/test-auction-thetradedesk-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/thetradedesk/test-auction-thetradedesk-response.json @@ -14,7 +14,10 @@ "mtype": 1, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "thetradedesk" + } }, "origbidcpm": 0.01 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/thirtythreeacross/test-auction-thirtythreeacross-response.json b/src/test/resources/org/prebid/server/it/openrtb2/thirtythreeacross/test-auction-thirtythreeacross-response.json index e83af540d6d..1013a518a70 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/thirtythreeacross/test-auction-thirtythreeacross-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/thirtythreeacross/test-auction-thirtythreeacross-response.json @@ -14,7 +14,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "thirtythreeacross" + } }, "origbidcpm": 1.25 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/tpmn/test-auction-tpmn-response.json b/src/test/resources/org/prebid/server/it/openrtb2/tpmn/test-auction-tpmn-response.json index 96eba6c8ffc..8075c1dcf84 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/tpmn/test-auction-tpmn-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/tpmn/test-auction-tpmn-response.json @@ -13,7 +13,10 @@ "ext": { "origbidcpm": 3.33, "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "tpmn" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/tradplus/test-auction-tradplus-response.json b/src/test/resources/org/prebid/server/it/openrtb2/tradplus/test-auction-tradplus-response.json index cf2087e1fab..affccd3fcdf 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/tradplus/test-auction-tradplus-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/tradplus/test-auction-tradplus-response.json @@ -17,7 +17,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "tradplus" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/trafficgate/test-auction-trafficgate-response.json b/src/test/resources/org/prebid/server/it/openrtb2/trafficgate/test-auction-trafficgate-response.json index d6161b71c26..9d6ee41808e 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/trafficgate/test-auction-trafficgate-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/trafficgate/test-auction-trafficgate-response.json @@ -12,7 +12,10 @@ "ext": { "origbidcpm": 3.33, "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "trafficgate" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/tredio/test-auction-tredio-response.json b/src/test/resources/org/prebid/server/it/openrtb2/tredio/test-auction-tredio-response.json index 8bfb5d60490..2cbb636a34c 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/tredio/test-auction-tredio-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/tredio/test-auction-tredio-response.json @@ -18,7 +18,10 @@ "mediaType": "video", "origbidcpm": 3.33, "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "tredio" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/triplelift/test-auction-triplelift-response.json b/src/test/resources/org/prebid/server/it/openrtb2/triplelift/test-auction-triplelift-response.json index db4cc84b585..3a2447d9657 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/triplelift/test-auction-triplelift-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/triplelift/test-auction-triplelift-response.json @@ -20,7 +20,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "triplelift" + } }, "origbidcpm": 0.5, "origbidcur": "USD", diff --git a/src/test/resources/org/prebid/server/it/openrtb2/tripleliftnative/test-auction-triplelift-native-response.json b/src/test/resources/org/prebid/server/it/openrtb2/tripleliftnative/test-auction-triplelift-native-response.json index e1b8d7476fa..7c6a3dd8f39 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/tripleliftnative/test-auction-triplelift-native-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/tripleliftnative/test-auction-triplelift-native-response.json @@ -20,7 +20,10 @@ "w": 300, "ext": { "prebid": { - "type": "native" + "type": "native", + "meta": { + "adaptercode": "triplelift_native" + } }, "origbidcpm": 0.5, "origbidcur": "USD" diff --git a/src/test/resources/org/prebid/server/it/openrtb2/trustedstack/test-auction-trustedstack-response.json b/src/test/resources/org/prebid/server/it/openrtb2/trustedstack/test-auction-trustedstack-response.json index d9c328fcd58..2591b3962f0 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/trustedstack/test-auction-trustedstack-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/trustedstack/test-auction-trustedstack-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "trustedstack" + } }, "origbidcpm": 0.5 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/ttx/test-auction-ttx-response.json b/src/test/resources/org/prebid/server/it/openrtb2/ttx/test-auction-ttx-response.json index e8c5b12f12d..2beebab027e 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/ttx/test-auction-ttx-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/ttx/test-auction-ttx-response.json @@ -14,7 +14,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "ttx" + } }, "origbidcpm": 1.25 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/ucfunnel/test-auction-ucfunnel-response.json b/src/test/resources/org/prebid/server/it/openrtb2/ucfunnel/test-auction-ucfunnel-response.json index 6fa5ba63fb0..ea1a7cf8684 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/ucfunnel/test-auction-ucfunnel-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/ucfunnel/test-auction-ucfunnel-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "ucfunnel" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/undertone/test-auction-undertone-response.json b/src/test/resources/org/prebid/server/it/openrtb2/undertone/test-auction-undertone-response.json index 2d3ab23f164..46e401ac9e8 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/undertone/test-auction-undertone-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/undertone/test-auction-undertone-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "undertone" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/unicorn/test-auction-unicorn-response.json b/src/test/resources/org/prebid/server/it/openrtb2/unicorn/test-auction-unicorn-response.json index 1e5d00d5b89..c989c1f58fe 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/unicorn/test-auction-unicorn-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/unicorn/test-auction-unicorn-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "unicorn" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/unruly/test-auction-unruly-response.json b/src/test/resources/org/prebid/server/it/openrtb2/unruly/test-auction-unruly-response.json index 94153ee8cdc..a8a5561e567 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/unruly/test-auction-unruly-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/unruly/test-auction-unruly-response.json @@ -14,7 +14,10 @@ "h": 600, "ext": { "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "unruly" + } }, "origbidcpm": 1.25 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/vidazoo/test-auction-vidazoo-response.json b/src/test/resources/org/prebid/server/it/openrtb2/vidazoo/test-auction-vidazoo-response.json index 57c24081c54..d1c667b4127 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/vidazoo/test-auction-vidazoo-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/vidazoo/test-auction-vidazoo-response.json @@ -14,7 +14,10 @@ "mtype": 1, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "vidazoo" + } }, "origbidcpm": 0.01 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/videobyte/test-auction-videobyte-response.json b/src/test/resources/org/prebid/server/it/openrtb2/videobyte/test-auction-videobyte-response.json index 705f5bf376b..61e235ccdba 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/videobyte/test-auction-videobyte-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/videobyte/test-auction-videobyte-response.json @@ -18,7 +18,10 @@ "origbidcpm": 3.33, "origbidcur": "USD", "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "videobyte" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/videoheroes/test-auction-videoheroes-response.json b/src/test/resources/org/prebid/server/it/openrtb2/videoheroes/test-auction-videoheroes-response.json index 4b345c3aef3..7bcb0989798 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/videoheroes/test-auction-videoheroes-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/videoheroes/test-auction-videoheroes-response.json @@ -14,7 +14,10 @@ "h": 600, "ext": { "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "videoheroes" + } }, "origbidcpm": 1.25 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/vidoomy/test-auction-vidoomy-response.json b/src/test/resources/org/prebid/server/it/openrtb2/vidoomy/test-auction-vidoomy-response.json index 45012edd4c0..65e53d320ab 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/vidoomy/test-auction-vidoomy-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/vidoomy/test-auction-vidoomy-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "vidoomy" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/vimayx/test-auction-vimayx-response.json b/src/test/resources/org/prebid/server/it/openrtb2/vimayx/test-auction-vimayx-response.json index 0e17226a62c..218b16cda60 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/vimayx/test-auction-vimayx-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/vimayx/test-auction-vimayx-response.json @@ -18,7 +18,10 @@ "mediaType": "video", "origbidcpm": 3.33, "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "vimayx" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/visiblemeasures/test-auction-visiblemeasures-response.json b/src/test/resources/org/prebid/server/it/openrtb2/visiblemeasures/test-auction-visiblemeasures-response.json index 141b8f5959a..57c0b534e34 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/visiblemeasures/test-auction-visiblemeasures-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/visiblemeasures/test-auction-visiblemeasures-response.json @@ -14,7 +14,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "visiblemeasures" + } }, "origbidcpm": 1.25 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/visx/test-auction-visx-response.json b/src/test/resources/org/prebid/server/it/openrtb2/visx/test-auction-visx-response.json index 6f9563edecd..3982971cb7f 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/visx/test-auction-visx-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/visx/test-auction-visx-response.json @@ -17,7 +17,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "visx" + } }, "origbidcpm": 0.5 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/vox/test-auction-vox-response.json b/src/test/resources/org/prebid/server/it/openrtb2/vox/test-auction-vox-response.json index b7dfff7b29f..6416b1a430f 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/vox/test-auction-vox-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/vox/test-auction-vox-response.json @@ -15,7 +15,10 @@ "mtype": 1, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "vox" + } }, "origbidcpm": 3.1415, "origbidcur": "USD" diff --git a/src/test/resources/org/prebid/server/it/openrtb2/vrtcal/test-auction-vrtcal-response.json b/src/test/resources/org/prebid/server/it/openrtb2/vrtcal/test-auction-vrtcal-response.json index 554ace08a73..85fb5ab85cc 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/vrtcal/test-auction-vrtcal-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/vrtcal/test-auction-vrtcal-response.json @@ -15,7 +15,10 @@ "mtype": 1, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "vrtcal" + } }, "origbidcpm": 1.25 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/vungle/test-auction-vungle-response.json b/src/test/resources/org/prebid/server/it/openrtb2/vungle/test-auction-vungle-response.json index 2226f9e6b7f..9b3dae5a329 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/vungle/test-auction-vungle-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/vungle/test-auction-vungle-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "video" + "type": "video", + "meta": { + "adaptercode": "vungle" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/xeworks/test-auction-xeworks-response.json b/src/test/resources/org/prebid/server/it/openrtb2/xeworks/test-auction-xeworks-response.json index b3ece494e63..f0f18f26c37 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/xeworks/test-auction-xeworks-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/xeworks/test-auction-xeworks-response.json @@ -14,7 +14,10 @@ "crid": "test-creative-id-1", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "xeworks" + } }, "origbidcpm": 10, "origbidcur": "EUR" diff --git a/src/test/resources/org/prebid/server/it/openrtb2/xtrmqb/test-auction-xtrmqb-response.json b/src/test/resources/org/prebid/server/it/openrtb2/xtrmqb/test-auction-xtrmqb-response.json index 961f3c98437..582e82578f8 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/xtrmqb/test-auction-xtrmqb-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/xtrmqb/test-auction-xtrmqb-response.json @@ -12,7 +12,10 @@ "ext": { "origbidcpm": 3.33, "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "xtrmqb" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/yahooads/test-auction-yahooads-response.json b/src/test/resources/org/prebid/server/it/openrtb2/yahooads/test-auction-yahooads-response.json index 2ef360e66b4..c91a58fa074 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/yahooads/test-auction-yahooads-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/yahooads/test-auction-yahooads-response.json @@ -14,7 +14,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "yahooAds" + } }, "origbidcpm": 1.25 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/yandex/test-auction-yandex-response.json b/src/test/resources/org/prebid/server/it/openrtb2/yandex/test-auction-yandex-response.json index 50db4b9296f..e08cecc8bb3 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/yandex/test-auction-yandex-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/yandex/test-auction-yandex-response.json @@ -14,7 +14,10 @@ "h": 600, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "yandex" + } }, "origbidcpm": 1.25 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/yeahmobi/test-auction-yeahmobi-response.json b/src/test/resources/org/prebid/server/it/openrtb2/yeahmobi/test-auction-yeahmobi-response.json index 4bc553b800e..b89a2e90580 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/yeahmobi/test-auction-yeahmobi-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/yeahmobi/test-auction-yeahmobi-response.json @@ -13,7 +13,10 @@ "crid": "1", "ext": { "prebid": { - "type": "native" + "type": "native", + "meta": { + "adaptercode": "yeahmobi" + } }, "origbidcpm": 1.2 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/yearxero/test-auction-yearxero-response.json b/src/test/resources/org/prebid/server/it/openrtb2/yearxero/test-auction-yearxero-response.json index f17d2e27d7d..ed08050f4cf 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/yearxero/test-auction-yearxero-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/yearxero/test-auction-yearxero-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "yearxero" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/yieldlab/test-auction-yieldlab-response.json b/src/test/resources/org/prebid/server/it/openrtb2/yieldlab/test-auction-yieldlab-response.json index 52e84781542..bb940fbcddd 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/yieldlab/test-auction-yieldlab-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/yieldlab/test-auction-yieldlab-response.json @@ -17,7 +17,10 @@ "origbidcpm": 2.01, "origbidcur": "EUR", "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "yieldlab" + } } } } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/yieldmo/test-auction-yieldmo-response.json b/src/test/resources/org/prebid/server/it/openrtb2/yieldmo/test-auction-yieldmo-response.json index 7971beb1204..4c4c4658f46 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/yieldmo/test-auction-yieldmo-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/yieldmo/test-auction-yieldmo-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "yieldmo" + } }, "origbidcpm": 3.33, "mediatype": "banner" diff --git a/src/test/resources/org/prebid/server/it/openrtb2/yieldone/test-auction-yieldone-response.json b/src/test/resources/org/prebid/server/it/openrtb2/yieldone/test-auction-yieldone-response.json index e2bca209c2c..040ca8b8f94 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/yieldone/test-auction-yieldone-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/yieldone/test-auction-yieldone-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "yieldone" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/yobee/test-auction-yobee-response.json b/src/test/resources/org/prebid/server/it/openrtb2/yobee/test-auction-yobee-response.json index 694ea619bf5..4e1c489647e 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/yobee/test-auction-yobee-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/yobee/test-auction-yobee-response.json @@ -13,7 +13,10 @@ "crid": "24080", "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "yobee" + } }, "origbidcpm": 0.01 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/zeroclickfraud/test-auction-zeroclickfraud-response.json b/src/test/resources/org/prebid/server/it/openrtb2/zeroclickfraud/test-auction-zeroclickfraud-response.json index 3fc40dda751..277d2322d4d 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/zeroclickfraud/test-auction-zeroclickfraud-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/zeroclickfraud/test-auction-zeroclickfraud-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "zeroclickfraud" + } }, "origbidcpm": 7.77 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/zeta_global_ssp/test-auction-zeta_global_ssp-response.json b/src/test/resources/org/prebid/server/it/openrtb2/zeta_global_ssp/test-auction-zeta_global_ssp-response.json index e1de127c348..5de8569c298 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/zeta_global_ssp/test-auction-zeta_global_ssp-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/zeta_global_ssp/test-auction-zeta_global_ssp-response.json @@ -16,7 +16,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "zeta_global_ssp" + } }, "origbidcpm": 3.33 } diff --git a/src/test/resources/org/prebid/server/it/openrtb2/zmaticoo/test-auction-zmaticoo-response.json b/src/test/resources/org/prebid/server/it/openrtb2/zmaticoo/test-auction-zmaticoo-response.json index ab36fa541e6..aaa264babf4 100644 --- a/src/test/resources/org/prebid/server/it/openrtb2/zmaticoo/test-auction-zmaticoo-response.json +++ b/src/test/resources/org/prebid/server/it/openrtb2/zmaticoo/test-auction-zmaticoo-response.json @@ -17,7 +17,10 @@ "h": 250, "ext": { "prebid": { - "type": "banner" + "type": "banner", + "meta": { + "adaptercode": "zmaticoo" + } }, "origbidcpm": 3.33 }