diff --git a/extra/pom.xml b/extra/pom.xml
index 338ca170dc6..7b11154539d 100644
--- a/extra/pom.xml
+++ b/extra/pom.xml
@@ -50,7 +50,7 @@
1.3.4
0.16.0
2.0.10
- 3.2.3
+ 3.2.4
4.2.1
3.25.6
${protobuf.version}
diff --git a/src/main/java/org/prebid/server/bidder/afront/AfrontBidder.java b/src/main/java/org/prebid/server/bidder/afront/AfrontBidder.java
new file mode 100644
index 00000000000..3b71087d380
--- /dev/null
+++ b/src/main/java/org/prebid/server/bidder/afront/AfrontBidder.java
@@ -0,0 +1,146 @@
+package org.prebid.server.bidder.afront;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.iab.openrtb.request.BidRequest;
+import com.iab.openrtb.request.Device;
+import com.iab.openrtb.request.Imp;
+import com.iab.openrtb.response.BidResponse;
+import com.iab.openrtb.response.SeatBid;
+import io.vertx.core.MultiMap;
+import org.apache.commons.collections4.CollectionUtils;
+import org.prebid.server.bidder.Bidder;
+import org.prebid.server.bidder.model.BidderBid;
+import org.prebid.server.bidder.model.BidderCall;
+import org.prebid.server.bidder.model.BidderError;
+import org.prebid.server.bidder.model.HttpRequest;
+import org.prebid.server.bidder.model.Result;
+import org.prebid.server.exception.PreBidException;
+import org.prebid.server.json.DecodeException;
+import org.prebid.server.json.JacksonMapper;
+import org.prebid.server.proto.openrtb.ext.ExtPrebid;
+import org.prebid.server.proto.openrtb.ext.request.afront.ExtImpAfront;
+import org.prebid.server.proto.openrtb.ext.response.BidType;
+import org.prebid.server.util.BidderUtil;
+import org.prebid.server.util.HttpUtil;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+public class AfrontBidder implements Bidder {
+
+ private static final TypeReference> TYPE_REFERENCE = new TypeReference<>() {
+ };
+
+ private static final String ACCOUNT_ID_MACRO = "{{AccountId}}";
+ private static final String SOURCE_ID_MACRO = "{{SourceId}}";
+
+ private final String endpointUrl;
+ private final JacksonMapper mapper;
+
+ public AfrontBidder(String endpointUrl, JacksonMapper mapper) {
+ this.endpointUrl = HttpUtil.validateUrl(Objects.requireNonNull(endpointUrl));
+ this.mapper = Objects.requireNonNull(mapper);
+ }
+
+ @Override
+ public Result>> makeHttpRequests(BidRequest request) {
+ final ExtImpAfront extImp;
+ try {
+ extImp = parseImpExt(request.getImp().getFirst());
+ } catch (PreBidException e) {
+ return Result.withError(BidderError.badInput(e.getMessage()));
+ }
+
+ final String resolvedEndpoint = resolveEndpoint(extImp);
+ final BidRequest outgoingRequest = modifyRequest(request);
+ final HttpRequest httpRequest =
+ BidderUtil.defaultRequest(outgoingRequest, makeHeaders(request.getDevice()), resolvedEndpoint, mapper);
+
+ return Result.withValue(httpRequest);
+ }
+
+ private ExtImpAfront parseImpExt(Imp imp) {
+ try {
+ return mapper.mapper().convertValue(imp.getExt(), TYPE_REFERENCE).getBidder();
+ } catch (IllegalArgumentException e) {
+ throw new PreBidException("ext.bidder not provided");
+ }
+ }
+
+ private String resolveEndpoint(ExtImpAfront extImp) {
+ return endpointUrl
+ .replace(ACCOUNT_ID_MACRO, HttpUtil.encodeUrl(extImp.getAccountId()))
+ .replace(SOURCE_ID_MACRO, HttpUtil.encodeUrl(extImp.getSourceId()));
+ }
+
+ private static BidRequest modifyRequest(BidRequest request) {
+ final List modifiedImps = request.getImp().stream()
+ .map(imp -> imp.toBuilder().ext(null).build())
+ .toList();
+
+ return request.toBuilder()
+ .imp(modifiedImps)
+ .build();
+ }
+
+ private static MultiMap makeHeaders(Device device) {
+ final MultiMap headers = HttpUtil.headers()
+ .add(HttpUtil.X_OPENRTB_VERSION_HEADER, "2.5");
+
+ if (device != null) {
+ HttpUtil.addHeaderIfValueIsNotEmpty(headers, HttpUtil.X_FORWARDED_FOR_HEADER, device.getIpv6());
+ HttpUtil.addHeaderIfValueIsNotEmpty(headers, HttpUtil.X_FORWARDED_FOR_HEADER, device.getIp());
+ HttpUtil.addHeaderIfValueIsNotEmpty(headers, HttpUtil.USER_AGENT_HEADER, device.getUa());
+ }
+
+ return headers;
+ }
+
+ @Override
+ public Result> makeBids(BidderCall httpCall, BidRequest bidRequest) {
+ try {
+ final BidResponse bidResponse = mapper.decodeValue(httpCall.getResponse().getBody(), BidResponse.class);
+ return Result.withValues(extractBids(bidRequest, bidResponse));
+ } catch (DecodeException e) {
+ return Result.withError(BidderError.badServerResponse(e.getMessage()));
+ }
+ }
+
+ private static List extractBids(BidRequest bidRequest, BidResponse bidResponse) {
+ if (bidResponse == null || CollectionUtils.isEmpty(bidResponse.getSeatbid())) {
+ return Collections.emptyList();
+ }
+ return bidsFromResponse(bidRequest, bidResponse);
+ }
+
+ private static List bidsFromResponse(BidRequest bidRequest, BidResponse bidResponse) {
+ final Map imps = bidRequest.getImp().stream()
+ .collect(Collectors.toMap(Imp::getId, Function.identity()));
+
+ return bidResponse.getSeatbid().stream()
+ .filter(Objects::nonNull)
+ .map(SeatBid::getBid)
+ .filter(Objects::nonNull)
+ .flatMap(Collection::stream)
+ .filter(Objects::nonNull)
+ .map(bid -> BidderBid.of(bid, getBidType(bid.getImpid(), imps), bidResponse.getCur()))
+ .collect(Collectors.toList());
+ }
+
+ private static BidType getBidType(String impId, Map imps) {
+ final Imp imp = imps.get(impId);
+ if (imp != null) {
+ if (imp.getVideo() != null) {
+ return BidType.video;
+ } else if (imp.getXNative() != null) {
+ return BidType.xNative;
+ }
+ }
+ return BidType.banner;
+ }
+}
diff --git a/src/main/java/org/prebid/server/bidder/ix/IxBidder.java b/src/main/java/org/prebid/server/bidder/ix/IxBidder.java
index 12916afd6e7..5770772c1bd 100644
--- a/src/main/java/org/prebid/server/bidder/ix/IxBidder.java
+++ b/src/main/java/org/prebid/server/bidder/ix/IxBidder.java
@@ -21,7 +21,6 @@
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.prebid.server.bidder.Bidder;
-import org.prebid.server.bidder.ix.model.request.IxDiag;
import org.prebid.server.bidder.ix.model.response.IxBidResponse;
import org.prebid.server.bidder.ix.model.response.IxExtBidResponse;
import org.prebid.server.bidder.ix.model.response.NativeV11Wrapper;
@@ -65,6 +64,8 @@ public class IxBidder implements Bidder {
private static final TypeReference> IX_EXT_TYPE_REFERENCE =
new TypeReference<>() {
};
+ private static final String PBSP_JAVA = "java";
+ private static final String PBS_VERSION_UNKNOWN = "unknown";
private final String endpointUrl;
private final PrebidVersionProvider prebidVersionProvider;
@@ -204,11 +205,11 @@ private ExtRequest modifyRequestExt(ExtRequest extRequest, Set siteIds)
modifiedExt = ExtRequest.empty();
}
- modifiedExt.addProperty("ixdiag", mapper.mapper().valueToTree(makeDiagData(extRequest, siteIds)));
+ modifiedExt.addProperty("ixdiag", makeDiagData(extRequest, siteIds));
return modifiedExt;
}
- private IxDiag makeDiagData(ExtRequest extRequest, Set siteIds) {
+ private ObjectNode makeDiagData(ExtRequest extRequest, Set siteIds) {
final String pbjsv = Optional.ofNullable(extRequest)
.map(ExtRequest::getPrebid)
.map(ExtRequestPrebid::getChannel)
@@ -221,7 +222,23 @@ private IxDiag makeDiagData(ExtRequest extRequest, Set siteIds) {
? siteIds.stream().sorted().collect(Collectors.joining(", "))
: null;
- return IxDiag.of(pbsv, pbjsv, multipleSiteIds);
+ final ObjectNode ixdiag = Optional.ofNullable(extRequest)
+ .map(ext -> ext.getProperty("ixdiag"))
+ .filter(JsonNode::isObject)
+ .map(ObjectNode.class::cast)
+ .orElse(mapper.mapper().createObjectNode())
+ .put("pbsv", pbsv == null ? PBS_VERSION_UNKNOWN : pbsv)
+ .put("pbsp", PBSP_JAVA);
+
+ if (multipleSiteIds != null) {
+ ixdiag.put("multipleSiteIds", multipleSiteIds);
+ }
+
+ if (pbjsv != null) {
+ ixdiag.put("pbjsv", pbjsv);
+ }
+
+ return ixdiag;
}
@Override
diff --git a/src/main/java/org/prebid/server/bidder/ix/model/request/IxDiag.java b/src/main/java/org/prebid/server/bidder/ix/model/request/IxDiag.java
deleted file mode 100644
index b3323edb849..00000000000
--- a/src/main/java/org/prebid/server/bidder/ix/model/request/IxDiag.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package org.prebid.server.bidder.ix.model.request;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import lombok.Value;
-
-@Value(staticConstructor = "of")
-public class IxDiag {
-
- String pbsv;
-
- String pbjsv;
-
- @JsonProperty("multipleSiteIds")
- String multipleSiteIds;
-}
diff --git a/src/main/java/org/prebid/server/bidder/onetag/OnetagBidder.java b/src/main/java/org/prebid/server/bidder/onetag/OnetagBidder.java
index c7fa5589fb2..ec6c9718ea5 100644
--- a/src/main/java/org/prebid/server/bidder/onetag/OnetagBidder.java
+++ b/src/main/java/org/prebid/server/bidder/onetag/OnetagBidder.java
@@ -22,7 +22,6 @@
import org.prebid.server.util.BidderUtil;
import org.prebid.server.util.HttpUtil;
-import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
@@ -45,20 +44,18 @@ public OnetagBidder(String endpointUrl, JacksonMapper mapper) {
@Override
public Result>> makeHttpRequests(BidRequest request) {
- final List modifiedImps = new ArrayList<>();
String requestPubId = null;
for (Imp imp : request.getImp()) {
try {
final ExtImpOnetag impExt = parseImpExt(imp);
requestPubId = resolveAndValidatePubId(impExt.getPubId(), requestPubId);
-
- modifiedImps.add(imp.toBuilder().ext(impExt.getExt()).build());
} catch (PreBidException e) {
return Result.withError(BidderError.badInput(e.getMessage()));
}
}
- return Result.withValue(createRequest(request, modifiedImps, requestPubId));
+ final String url = endpointUrl.replace(URL_PUBLISHER_ID_MACRO, StringUtils.defaultString(requestPubId));
+ return Result.withValue(BidderUtil.defaultRequest(request, url, mapper));
}
private ExtImpOnetag parseImpExt(Imp imp) {
@@ -69,8 +66,8 @@ private ExtImpOnetag parseImpExt(Imp imp) {
}
}
- private String resolveAndValidatePubId(String impExtPubId, String requestPubId) {
- if (StringUtils.isEmpty(impExtPubId)) {
+ private static String resolveAndValidatePubId(String impExtPubId, String requestPubId) {
+ if (StringUtils.isBlank(impExtPubId)) {
throw new PreBidException("The publisher ID must not be empty");
}
if (requestPubId != null && !impExtPubId.equals(requestPubId)) {
@@ -79,13 +76,6 @@ private String resolveAndValidatePubId(String impExtPubId, String requestPubId)
return impExtPubId;
}
- private HttpRequest createRequest(BidRequest request, List imps, String pubId) {
- final String url = endpointUrl.replace(URL_PUBLISHER_ID_MACRO, pubId);
- final BidRequest outgoingRequest = request.toBuilder().imp(imps).build();
-
- return BidderUtil.defaultRequest(outgoingRequest, url, mapper);
- }
-
@Override
public final Result> makeBids(BidderCall httpCall, BidRequest bidRequest) {
try {
diff --git a/src/main/java/org/prebid/server/proto/openrtb/ext/request/afront/ExtImpAfront.java b/src/main/java/org/prebid/server/proto/openrtb/ext/request/afront/ExtImpAfront.java
new file mode 100644
index 00000000000..d4502835ed8
--- /dev/null
+++ b/src/main/java/org/prebid/server/proto/openrtb/ext/request/afront/ExtImpAfront.java
@@ -0,0 +1,14 @@
+package org.prebid.server.proto.openrtb.ext.request.afront;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Value;
+
+@Value(staticConstructor = "of")
+public class ExtImpAfront {
+
+ @JsonProperty("accountId")
+ String accountId;
+
+ @JsonProperty("sourceId")
+ String sourceId;
+}
diff --git a/src/main/java/org/prebid/server/spring/config/bidder/AfrontConfiguration.java b/src/main/java/org/prebid/server/spring/config/bidder/AfrontConfiguration.java
new file mode 100644
index 00000000000..60617aa5ea8
--- /dev/null
+++ b/src/main/java/org/prebid/server/spring/config/bidder/AfrontConfiguration.java
@@ -0,0 +1,41 @@
+package org.prebid.server.spring.config.bidder;
+
+import org.prebid.server.bidder.BidderDeps;
+import org.prebid.server.bidder.afront.AfrontBidder;
+import org.prebid.server.json.JacksonMapper;
+import org.prebid.server.spring.config.bidder.model.BidderConfigurationProperties;
+import org.prebid.server.spring.config.bidder.util.BidderDepsAssembler;
+import org.prebid.server.spring.config.bidder.util.UsersyncerCreator;
+import org.prebid.server.spring.env.YamlPropertySourceFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.PropertySource;
+
+import jakarta.validation.constraints.NotBlank;
+
+@Configuration
+@PropertySource(value = "classpath:/bidder-config/afront.yaml", factory = YamlPropertySourceFactory.class)
+public class AfrontConfiguration {
+
+ private static final String BIDDER_NAME = "afront";
+
+ @Bean("afrontConfigurationProperties")
+ @ConfigurationProperties("adapters.afront")
+ BidderConfigurationProperties configurationProperties() {
+ return new BidderConfigurationProperties();
+ }
+
+ @Bean
+ BidderDeps afrontBidderDeps(BidderConfigurationProperties afrontConfigurationProperties,
+ @NotBlank @Value("${external-url}") String externalUrl,
+ JacksonMapper mapper) {
+
+ return BidderDepsAssembler.forBidder(BIDDER_NAME)
+ .withConfig(afrontConfigurationProperties)
+ .usersyncerCreator(UsersyncerCreator.create(externalUrl))
+ .bidderCreator(config -> new AfrontBidder(config.getEndpoint(), mapper))
+ .assemble();
+ }
+}
diff --git a/src/main/resources/bidder-config/afront.yaml b/src/main/resources/bidder-config/afront.yaml
new file mode 100644
index 00000000000..bd59185f20e
--- /dev/null
+++ b/src/main/resources/bidder-config/afront.yaml
@@ -0,0 +1,22 @@
+# Contact support@afront.io to connect with Afront exchange.
+# We have the following regional endpoint sub-domains:
+# US East: snt1
+# APAC: snt2
+# EU: snt3
+# Please deploy this config in each of your datacenters with the appropriate regional subdomain
+adapters:
+ afront:
+ endpoint: https://snt1.afront.io/?rsd={{SourceId}}&sk={{AccountId}}
+ endpoint-compression: gzip
+ meta-info:
+ maintainer-email: support@afront.io
+ app-media-types:
+ - banner
+ - video
+ - native
+ site-media-types:
+ - banner
+ - video
+ - native
+ supported-vendors:
+ vendor-id: 0
diff --git a/src/main/resources/bidder-config/copper6ssp.yaml b/src/main/resources/bidder-config/copper6ssp.yaml
index 5e5b7d5d5bb..692697b6ea3 100644
--- a/src/main/resources/bidder-config/copper6ssp.yaml
+++ b/src/main/resources/bidder-config/copper6ssp.yaml
@@ -12,7 +12,7 @@ adapters:
- video
- native
supported-vendors:
- vendor-id: 0
+ vendor-id: 1356
usersync:
cookie-family-name: copper6ssp
redirect:
diff --git a/src/main/resources/bidder-config/kobler.yaml b/src/main/resources/bidder-config/kobler.yaml
index 0adbb174ad8..cd49ef2ea75 100644
--- a/src/main/resources/bidder-config/kobler.yaml
+++ b/src/main/resources/bidder-config/kobler.yaml
@@ -11,4 +11,6 @@ adapters:
maintainer-email: bidding-support@kobler.no
site-media-types:
- banner
+ app-media-types:
+ - banner
vendor-id: 0
diff --git a/src/main/resources/bidder-config/seedtag.yaml b/src/main/resources/bidder-config/seedtag.yaml
index 6012eb5a2de..44eed6fd01b 100644
--- a/src/main/resources/bidder-config/seedtag.yaml
+++ b/src/main/resources/bidder-config/seedtag.yaml
@@ -12,6 +12,6 @@ adapters:
usersync:
cookie-family-name: seedtag
iframe:
- url: https://s.seedtag.com/cs/cookiesync/prebid?gdpr={{gdpr}}&gdpr_consent={{gdpr_consent}}&usp_consent={{us_privacy}}&redirect={{redirect_url}}
+ url: https://s.seedtag.com/cs/cookiesync/prebid?gdpr={{gdpr}}&gdpr_consent={{gdpr_consent}}&usp_consent={{us_privacy}}&gpp={{gpp}}&gpp_sid={{gpp_sid}}&redirect={{redirect_url}}
support-cors: false
uid-macro: '$UID'
diff --git a/src/main/resources/bidder-config/xeworks.yaml b/src/main/resources/bidder-config/xeworks.yaml
index 4280d88ce95..6464a99c8ae 100644
--- a/src/main/resources/bidder-config/xeworks.yaml
+++ b/src/main/resources/bidder-config/xeworks.yaml
@@ -7,6 +7,22 @@ adapters:
endpoint: http://rtb.connektai.live/?pid={{SourceId}}&host={{Host}}&s=pbs
meta-info:
maintainer-email: adops@connekt.ai
+ adipolo:
+ enabled: false
+ endpoint: http://rtb.adipolo.live?pid={{SourceId}}&host={{Host}}&pbs=1
+ meta-info:
+ maintainer-email: smart@adipolo.com
+ usersync:
+ enabled: true
+ cookie-family-name: adipolo
+ redirect:
+ url: https://sync.adipolo.live/psync?t=s&e=0&gdpr={{gdpr}}&gdpr_consent={{gdpr_consent}}&us_privacy={{us_privacy}}&gpp={{gpp}}&gpp_sid={{gpp_sid}}&cb={{redirect_url}}
+ support-cors: false
+ uid-macro: '$UID'
+ iframe:
+ url: https://sync.adipolo.live/static/adisync.html?gdpr={{gdpr}}&gdpr_consent={{gdpr_consent}}&us_privacy={{us_privacy}}&gpp={{gpp}}&gpp_sid={{gpp_sid}}&cb={{redirect_url}}
+ support-cors: false
+ uid-macro: '$UID'
meta-info:
maintainer-email: team@xe.works
app-media-types:
diff --git a/src/main/resources/bidder-config/zmaticoo.yaml b/src/main/resources/bidder-config/zmaticoo.yaml
index 718fff17436..51da390a37d 100644
--- a/src/main/resources/bidder-config/zmaticoo.yaml
+++ b/src/main/resources/bidder-config/zmaticoo.yaml
@@ -1,6 +1,6 @@
adapters:
zmaticoo:
- endpoint: https://bid.zmaticoo.com/prebid/bid
+ endpoint: https://rtbbid.zmaticoo.com/prebid/bid
meta-info:
maintainer-email: adam.li@eclicktech.com.cn
app-media-types:
diff --git a/src/main/resources/metrics-config/prometheus-labels.yaml b/src/main/resources/metrics-config/prometheus-labels.yaml
index 2088021372c..b40139d6a8a 100644
--- a/src/main/resources/metrics-config/prometheus-labels.yaml
+++ b/src/main/resources/metrics-config/prometheus-labels.yaml
@@ -202,3 +202,9 @@ mappers:
labels:
adapter: ${0}
action: ${1}
+ - match: adapter.*.activity.*.*.count
+ name: adapter.activity
+ labels:
+ adapter: ${0}
+ activity: ${1}
+ action: ${2}
diff --git a/src/main/resources/static/bidder-params/afront.json b/src/main/resources/static/bidder-params/afront.json
new file mode 100644
index 00000000000..071d9772169
--- /dev/null
+++ b/src/main/resources/static/bidder-params/afront.json
@@ -0,0 +1,22 @@
+{
+ "$schema": "http://json-schema.org/draft-04/schema#",
+ "title": "Afront Adapter Params",
+ "description": "A schema which validates params accepted by the Afront adapter",
+ "type": "object",
+ "properties": {
+ "accountId": {
+ "type": "string",
+ "description": "Client account id",
+ "minLength": 1
+ },
+ "sourceId": {
+ "type": "string",
+ "description": "Data source id",
+ "minLength": 1
+ }
+ },
+ "required": [
+ "accountId",
+ "sourceId"
+ ]
+}
diff --git a/src/test/java/org/prebid/server/bidder/afront/AfrontBidderTest.java b/src/test/java/org/prebid/server/bidder/afront/AfrontBidderTest.java
new file mode 100644
index 00000000000..9ea4f96c36b
--- /dev/null
+++ b/src/test/java/org/prebid/server/bidder/afront/AfrontBidderTest.java
@@ -0,0 +1,249 @@
+package org.prebid.server.bidder.afront;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.iab.openrtb.request.BidRequest;
+import com.iab.openrtb.request.Device;
+import com.iab.openrtb.request.Imp;
+import com.iab.openrtb.request.Native;
+import com.iab.openrtb.request.Video;
+import com.iab.openrtb.response.Bid;
+import com.iab.openrtb.response.BidResponse;
+import com.iab.openrtb.response.SeatBid;
+import org.junit.jupiter.api.Test;
+import org.prebid.server.VertxTest;
+import org.prebid.server.bidder.model.BidderBid;
+import org.prebid.server.bidder.model.BidderCall;
+import org.prebid.server.bidder.model.BidderError;
+import org.prebid.server.bidder.model.HttpRequest;
+import org.prebid.server.bidder.model.HttpResponse;
+import org.prebid.server.bidder.model.Result;
+import org.prebid.server.proto.openrtb.ext.ExtPrebid;
+import org.prebid.server.proto.openrtb.ext.request.afront.ExtImpAfront;
+import org.prebid.server.proto.openrtb.ext.response.BidType;
+
+import java.math.BigDecimal;
+import java.util.Arrays;
+import java.util.List;
+import java.util.function.UnaryOperator;
+
+import static java.util.Collections.singletonList;
+import static java.util.function.UnaryOperator.identity;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
+import static org.prebid.server.util.HttpUtil.ACCEPT_HEADER;
+import static org.prebid.server.util.HttpUtil.APPLICATION_JSON_CONTENT_TYPE;
+import static org.prebid.server.util.HttpUtil.CONTENT_TYPE_HEADER;
+import static org.prebid.server.util.HttpUtil.USER_AGENT_HEADER;
+import static org.prebid.server.util.HttpUtil.X_FORWARDED_FOR_HEADER;
+import static org.prebid.server.util.HttpUtil.X_OPENRTB_VERSION_HEADER;
+import static org.springframework.util.MimeTypeUtils.APPLICATION_JSON_VALUE;
+
+public class AfrontBidderTest extends VertxTest {
+
+ private static final String ENDPOINT_URL = "https://test.com/?aid={{AccountId}}&sid={{SourceId}}";
+
+ private final AfrontBidder target = new AfrontBidder(ENDPOINT_URL, jacksonMapper);
+
+ @Test
+ public void creationShouldFailOnInvalidEndpointUrl() {
+ assertThatIllegalArgumentException().isThrownBy(() -> new AfrontBidder("invalid_url", jacksonMapper));
+ }
+
+ @Test
+ public void makeHttpRequestsShouldReturnErrorIfImpExtCouldNotBeParsed() {
+ // given
+ final BidRequest bidRequest = givenBidRequest(
+ imp -> imp.ext(mapper.valueToTree(ExtPrebid.of(null, mapper.createArrayNode()))));
+
+ // when
+ final Result>> result = target.makeHttpRequests(bidRequest);
+
+ // then
+ assertThat(result.getErrors()).hasSize(1)
+ .allSatisfy(error -> {
+ assertThat(error.getType()).isEqualTo(BidderError.Type.bad_input);
+ assertThat(error.getMessage()).startsWith("ext.bidder not provided");
+ });
+ assertThat(result.getValue()).isEmpty();
+ }
+
+ @Test
+ public void makeHttpRequestsShouldUseFirstImpExtToResolveUrl() {
+ // given
+ final BidRequest bidRequest = givenBidRequest(
+ imp -> imp.ext(givenImpExt("acc1", "src1")),
+ imp -> imp.ext(givenImpExt("acc2", "src2")));
+
+ // when
+ final Result>> result = target.makeHttpRequests(bidRequest);
+
+ // then
+ assertThat(result.getErrors()).isEmpty();
+ assertThat(result.getValue()).hasSize(1).first()
+ .extracting(HttpRequest::getUri)
+ .isEqualTo("https://test.com/?aid=acc1&sid=src1");
+ }
+
+ @Test
+ public void makeHttpRequestsShouldRemoveExtFromAllImps() {
+ // given
+ final BidRequest bidRequest = givenBidRequest(
+ imp -> imp.ext(givenImpExt("acc1", "src1")),
+ imp -> imp.ext(givenImpExt("acc2", "src2")));
+
+ // when
+ final Result>> result = target.makeHttpRequests(bidRequest);
+
+ // then
+ assertThat(result.getErrors()).isEmpty();
+ assertThat(result.getValue()).hasSize(1)
+ .extracting(HttpRequest::getPayload)
+ .flatExtracting(BidRequest::getImp)
+ .extracting(Imp::getExt)
+ .containsOnlyNulls();
+ }
+
+ @Test
+ public void makeHttpRequestsShouldSetCorrectHeaders() {
+ // given
+ final BidRequest bidRequest = givenBidRequest(identity())
+ .toBuilder()
+ .device(Device.builder()
+ .ua("Test User Agent")
+ .ip("ip")
+ .ipv6("ipv6")
+ .build())
+ .build();
+
+ // when
+ final Result>> result = target.makeHttpRequests(bidRequest);
+
+ // then
+ assertThat(result.getErrors()).isEmpty();
+ assertThat(result.getValue()).hasSize(1).first()
+ .extracting(HttpRequest::getHeaders)
+ .satisfies(headers -> {
+ assertThat(headers.get(CONTENT_TYPE_HEADER)).isEqualTo(APPLICATION_JSON_CONTENT_TYPE);
+ assertThat(headers.get(ACCEPT_HEADER)).isEqualTo(APPLICATION_JSON_VALUE);
+ assertThat(headers.get(X_OPENRTB_VERSION_HEADER)).isEqualTo("2.5");
+ assertThat(headers.get(USER_AGENT_HEADER)).isEqualTo("Test User Agent");
+ assertThat(headers.get(X_FORWARDED_FOR_HEADER)).isEqualTo("ipv6");
+ });
+ }
+
+ @Test
+ public void makeBidsShouldReturnErrorWhenResponseBodyCouldNotBeParsed() {
+ // given
+ final BidderCall httpCall = givenHttpCall("invalid_json");
+
+ // when
+ final Result> result = target.makeBids(httpCall, null);
+
+ // then
+ assertThat(result.getErrors()).hasSize(1)
+ .allSatisfy(error -> {
+ assertThat(error.getType()).isEqualTo(BidderError.Type.bad_server_response);
+ assertThat(error.getMessage()).startsWith("Failed to decode: Unrecognized token 'invalid_json'");
+ });
+ assertThat(result.getValue()).isEmpty();
+ }
+
+ @Test
+ public void makeBidsShouldReturnBannerBidWhenImpHasNoVideoOrNative() throws JsonProcessingException {
+ // given
+ final Bid bannerBid = givenBid(imp -> imp.id("banner_imp"));
+
+ final BidRequest bidRequest = BidRequest.builder()
+ .imp(List.of(
+ givenImp(imp -> imp.id("banner_imp"))))
+ .build();
+
+ final BidderCall httpCall = givenHttpCall(givenBidResponse(bannerBid));
+
+ // when
+ final Result> result = target.makeBids(httpCall, bidRequest);
+
+ // then
+ assertThat(result.getErrors()).isEmpty();
+ assertThat(result.getValue()).hasSize(1)
+ .containsOnly(BidderBid.of(bannerBid, BidType.banner, "USD"));
+ }
+
+ @Test
+ public void makeBidsShouldReturnVideoBidWhenImpHasVideo() throws JsonProcessingException {
+ // given
+ final Bid videoBid = givenBid(imp -> imp.id("video_imp"));
+
+ final BidRequest bidRequest = BidRequest.builder()
+ .imp(List.of(
+ givenImp(imp -> imp.id("video_imp").video(Video.builder().build()))))
+ .build();
+
+ final BidderCall httpCall = givenHttpCall(givenBidResponse(videoBid));
+
+ // when
+ final Result> result = target.makeBids(httpCall, bidRequest);
+
+ // then
+ assertThat(result.getErrors()).isEmpty();
+ assertThat(result.getValue()).hasSize(1)
+ .containsOnly(BidderBid.of(videoBid, BidType.video, "USD"));
+ }
+
+ @Test
+ public void makeBidsShouldReturnNativeBidWhenImpHasNative() throws JsonProcessingException {
+ // given
+ final Bid nativeBid = givenBid(imp -> imp.id("native_imp"));
+
+ final BidRequest bidRequest = BidRequest.builder()
+ .imp(List.of(givenImp(imp -> imp.id("native_imp").xNative(Native.builder().build()))))
+ .build();
+
+ final BidderCall httpCall = givenHttpCall(givenBidResponse(nativeBid));
+
+ // when
+ final Result> result = target.makeBids(httpCall, bidRequest);
+
+ // then
+ assertThat(result.getErrors()).isEmpty();
+ assertThat(result.getValue()).hasSize(1)
+ .containsOnly(BidderBid.of(nativeBid, BidType.xNative, "USD"));
+ }
+
+ private static BidRequest givenBidRequest(UnaryOperator... impCustomizers) {
+ final List imps = Arrays.stream(impCustomizers)
+ .map(AfrontBidderTest::givenImp)
+ .toList();
+ return BidRequest.builder().imp(imps).build();
+ }
+
+ private static Imp givenImp(UnaryOperator impCustomizer) {
+ return impCustomizer.apply(Imp.builder()
+ .id("impId")
+ .ext(givenImpExt("accountId", "sourceId")))
+ .build();
+ }
+
+ private static ObjectNode givenImpExt(String accountId, String sourceId) {
+ return mapper.valueToTree(ExtPrebid.of(null, ExtImpAfront.of(accountId, sourceId)));
+ }
+
+ private static Bid givenBid(UnaryOperator impCustomizer) {
+ return Bid.builder().impid(givenImp(impCustomizer).getId()).price(BigDecimal.ONE).build();
+ }
+
+ private static String givenBidResponse(Bid... bids) throws JsonProcessingException {
+ return mapper.writeValueAsString(BidResponse.builder()
+ .cur("USD")
+ .seatbid(singletonList(SeatBid.builder().bid(List.of(bids)).build()))
+ .build());
+ }
+
+ private static BidderCall givenHttpCall(String body) {
+ return BidderCall.succeededHttp(
+ HttpRequest.builder().build(),
+ HttpResponse.of(200, null, body),
+ null);
+ }
+}
diff --git a/src/test/java/org/prebid/server/bidder/ix/IxBidderTest.java b/src/test/java/org/prebid/server/bidder/ix/IxBidderTest.java
index ee0fdfa3368..051077ab03e 100644
--- a/src/test/java/org/prebid/server/bidder/ix/IxBidderTest.java
+++ b/src/test/java/org/prebid/server/bidder/ix/IxBidderTest.java
@@ -26,7 +26,6 @@
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.prebid.server.VertxTest;
-import org.prebid.server.bidder.ix.model.request.IxDiag;
import org.prebid.server.bidder.ix.model.response.AuctionConfigExtBidResponse;
import org.prebid.server.bidder.ix.model.response.IxBidResponse;
import org.prebid.server.bidder.ix.model.response.IxExtBidResponse;
@@ -191,8 +190,10 @@ public void makeHttpRequestsShouldReturnIxDiagWithPbjsVersionIfRequestExtPrebidC
.extracting(HttpRequest::getPayload)
.extracting(BidRequest::getExt)
.extracting(ext -> ext.getProperty("ixdiag"))
- .extracting(diagNode -> mapper.treeToValue(diagNode, IxDiag.class))
- .containsExactly(IxDiag.of(null, "pbjsv", null));
+ .containsExactly(mapper.createObjectNode()
+ .put("pbsv", "unknown")
+ .put("pbjsv", "pbjsv")
+ .put("pbsp", "java"));
}
@Test
@@ -210,8 +211,9 @@ public void makeHttpRequestsShouldReturnIxDiagWithPbsVersion() {
.extracting(HttpRequest::getPayload)
.extracting(BidRequest::getExt)
.extracting(ext -> ext.getProperty("ixdiag"))
- .extracting(diagNode -> mapper.treeToValue(diagNode, IxDiag.class))
- .containsExactly(IxDiag.of("pbsv", null, null));
+ .containsExactly(mapper.createObjectNode()
+ .put("pbsv", "pbsv")
+ .put("pbsp", "java"));
}
@Test
@@ -230,8 +232,51 @@ public void makeHttpRequestsShouldReturnIxDiagWithMultipleSiteIdsWhenMultipleImp
.extracting(HttpRequest::getPayload)
.extracting(BidRequest::getExt)
.extracting(ext -> ext.getProperty("ixdiag"))
- .extracting(diagNode -> mapper.treeToValue(diagNode, IxDiag.class))
- .containsExactly(IxDiag.of(null, null, "site1, site2"));
+ .containsExactly(mapper.createObjectNode()
+ .put("pbsv", "unknown")
+ .put("pbsp", "java")
+ .put("multipleSiteIds", "site1, site2"));
+ }
+
+ @Test
+ public void makeHttpRequestsShouldPassThroughProvidedIxDiagFields() {
+ // given
+ given(prebidVersionProvider.getNameVersionRecord()).willReturn("pbsv1");
+ final ObjectNode givenIxDiag = mapper.createObjectNode();
+ givenIxDiag.put("pbsv", "pbsv2");
+ givenIxDiag.put("pbjsv", "pbjsv2");
+ givenIxDiag.put("pbsp", "go");
+ givenIxDiag.put("multipleSiteIds", "site1");
+ givenIxDiag.put("property1", "value");
+ givenIxDiag.put("property2", 1);
+
+ final BidRequest bidRequest = givenBidRequest(
+ bidRequestBuilder -> bidRequestBuilder.ext(givenExtRequestWithIxDiag(
+ "pbjsv1",
+ givenIxDiag)),
+ List.of(
+ impBuilder -> impBuilder.ext(givenImpExt("site1", null)),
+ impBuilder -> impBuilder.ext(givenImpExt("site2", null))));
+
+ // when
+ final Result>> result = target.makeHttpRequests(bidRequest);
+
+ // then
+ assertThat(result.getErrors()).isEmpty();
+
+ final ObjectNode expectedIxDiag = mapper.createObjectNode();
+ expectedIxDiag.put("pbsv", "pbsv1");
+ expectedIxDiag.put("pbjsv", "pbjsv1");
+ expectedIxDiag.put("pbsp", "java");
+ expectedIxDiag.put("multipleSiteIds", "site1, site2");
+ expectedIxDiag.put("property1", "value");
+ expectedIxDiag.put("property2", 1);
+
+ assertThat(result.getValue())
+ .extracting(HttpRequest::getPayload)
+ .extracting(BidRequest::getExt)
+ .extracting(ext -> ext.getProperty("ixdiag"))
+ .containsExactly(expectedIxDiag);
}
@Test
@@ -886,6 +931,12 @@ private static ExtRequest givenExtRequest(String pbjsv) {
.build());
}
+ private static ExtRequest givenExtRequestWithIxDiag(String pbjsv, ObjectNode ixDiag) {
+ final ExtRequest extRequest = givenExtRequest(pbjsv);
+ extRequest.addProperty("ixdiag", ixDiag);
+ return extRequest;
+ }
+
private static ObjectNode givenImpExt(String siteId, String sid) {
return mapper.valueToTree(ExtPrebid.of(null, ExtImpIx.of(siteId, null, sid)));
}
diff --git a/src/test/java/org/prebid/server/bidder/onetag/OnetagBidderTest.java b/src/test/java/org/prebid/server/bidder/onetag/OnetagBidderTest.java
index 0d742960bc1..73d6035303d 100644
--- a/src/test/java/org/prebid/server/bidder/onetag/OnetagBidderTest.java
+++ b/src/test/java/org/prebid/server/bidder/onetag/OnetagBidderTest.java
@@ -103,29 +103,6 @@ public void makeHttpRequestsShouldReturnErrorIfImpExtCanNotBeParsed() {
assertThat(result.getValue()).isEmpty();
}
- @Test
- public void makeHttpRequestsShouldUpdateImpExt() {
- // given
- final ObjectNode oneTagExt = mapper.createObjectNode();
- oneTagExt.put("someField", "someName");
- final BidRequest bidRequest = BidRequest.builder()
- .imp(singletonList(Imp.builder()
- .ext(mapper.valueToTree(ExtPrebid.of(null, ExtImpOnetag.of("somePubId", oneTagExt))))
- .build()))
- .build();
-
- // when
- final Result>> result = target.makeHttpRequests(bidRequest);
-
- // then
- assertThat(result.getErrors()).isEmpty();
- assertThat(result.getValue())
- .extracting(HttpRequest::getPayload)
- .flatExtracting(BidRequest::getImp)
- .extracting(Imp::getExt)
- .containsExactly(oneTagExt);
- }
-
@Test
public void makeHttpRequestsShouldReturnErrorIfPubIdNotPresent() {
// given
diff --git a/src/test/java/org/prebid/server/it/AdipoloTest.java b/src/test/java/org/prebid/server/it/AdipoloTest.java
new file mode 100644
index 00000000000..18b33013e9d
--- /dev/null
+++ b/src/test/java/org/prebid/server/it/AdipoloTest.java
@@ -0,0 +1,35 @@
+package org.prebid.server.it;
+
+import io.restassured.response.Response;
+import org.json.JSONException;
+import org.junit.jupiter.api.Test;
+import org.prebid.server.model.Endpoint;
+
+import java.io.IOException;
+
+import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
+import static com.github.tomakehurst.wiremock.client.WireMock.equalToJson;
+import static com.github.tomakehurst.wiremock.client.WireMock.post;
+import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo;
+import static java.util.Collections.singletonList;
+
+public class AdipoloTest extends IntegrationTest {
+
+ @Test
+ public void openrtb2AuctionShouldRespondWithBidsFromAdipolo() throws IOException, JSONException {
+ // given
+ WIRE_MOCK_RULE.stubFor(post(urlPathEqualTo("/adipolo-exchange"))
+ .withRequestBody(equalToJson(
+ jsonFrom("openrtb2/adipolo/test-adipolo-bid-request.json")))
+ .willReturn(aResponse().withBody(
+ jsonFrom("openrtb2/adipolo/test-adipolo-bid-response.json"))));
+
+ // when
+ final Response response = responseFor("openrtb2/adipolo/test-auction-adipolo-request.json",
+ Endpoint.openrtb2_auction);
+
+ // then
+ assertJsonEquals("openrtb2/adipolo/test-auction-adipolo-response.json", response,
+ singletonList("adipolo"));
+ }
+}
diff --git a/src/test/java/org/prebid/server/it/AfrontTest.java b/src/test/java/org/prebid/server/it/AfrontTest.java
new file mode 100644
index 00000000000..0351ca31c33
--- /dev/null
+++ b/src/test/java/org/prebid/server/it/AfrontTest.java
@@ -0,0 +1,32 @@
+package org.prebid.server.it;
+
+import io.restassured.response.Response;
+import org.json.JSONException;
+import org.junit.jupiter.api.Test;
+import org.prebid.server.model.Endpoint;
+
+import java.io.IOException;
+
+import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
+import static com.github.tomakehurst.wiremock.client.WireMock.equalToJson;
+import static com.github.tomakehurst.wiremock.client.WireMock.post;
+import static com.github.tomakehurst.wiremock.client.WireMock.urlPathEqualTo;
+import static java.util.Collections.singletonList;
+
+public class AfrontTest extends IntegrationTest {
+
+ @Test
+ public void openrtb2AuctionShouldRespondWithBidsFromAfront() throws IOException, JSONException {
+ // given
+ WIRE_MOCK_RULE.stubFor(post(urlPathEqualTo("/afront-exchange"))
+ .withRequestBody(equalToJson(jsonFrom("openrtb2/afront/test-afront-bid-request.json")))
+ .willReturn(aResponse().withBody(jsonFrom("openrtb2/afront/test-afront-bid-response.json"))));
+
+ // when
+ final Response response = responseFor("openrtb2/afront/test-auction-afront-request.json",
+ Endpoint.openrtb2_auction);
+
+ // then
+ assertJsonEquals("openrtb2/afront/test-auction-afront-response.json", response, singletonList("afront"));
+ }
+}
diff --git a/src/test/resources/org/prebid/server/it/openrtb2/adipolo/test-adipolo-bid-request.json b/src/test/resources/org/prebid/server/it/openrtb2/adipolo/test-adipolo-bid-request.json
new file mode 100644
index 00000000000..9849089cf56
--- /dev/null
+++ b/src/test/resources/org/prebid/server/it/openrtb2/adipolo/test-adipolo-bid-request.json
@@ -0,0 +1,57 @@
+{
+ "id": "request_id",
+ "imp": [
+ {
+ "id": "imp_id",
+ "secure": 1,
+ "banner": {
+ "w": 300,
+ "h": 250
+ },
+ "ext": {
+ "tid": "${json-unit.any-string}",
+ "bidder": {
+ "env": "envValue",
+ "pid": "pidValue"
+ }
+ }
+ }
+ ],
+ "source": {
+ "tid": "${json-unit.any-string}"
+ },
+ "site": {
+ "domain": "www.example.com",
+ "page": "http://www.example.com",
+ "publisher": {
+ "domain": "example.com"
+ },
+ "ext": {
+ "amp": 0
+ }
+ },
+ "device": {
+ "ua": "userAgent",
+ "ip": "193.168.244.1"
+ },
+ "at": 1,
+ "tmax": "${json-unit.any-number}",
+ "regs": {
+ "ext": {
+ "gdpr": 0
+ }
+ },
+ "cur": [
+ "USD"
+ ],
+ "ext": {
+ "prebid": {
+ "server": {
+ "externalurl": "http://localhost:8080",
+ "gvlid": 1,
+ "datacenter": "local",
+ "endpoint": "/openrtb2/auction"
+ }
+ }
+ }
+}
diff --git a/src/test/resources/org/prebid/server/it/openrtb2/adipolo/test-adipolo-bid-response.json b/src/test/resources/org/prebid/server/it/openrtb2/adipolo/test-adipolo-bid-response.json
new file mode 100644
index 00000000000..164be5d891e
--- /dev/null
+++ b/src/test/resources/org/prebid/server/it/openrtb2/adipolo/test-adipolo-bid-response.json
@@ -0,0 +1,23 @@
+{
+ "id": "request_id",
+ "seatbid": [
+ {
+ "bid": [
+ {
+ "id": "bid_id",
+ "impid": "imp_id",
+ "adm": "some adm value",
+ "price": 10,
+ "adomain": [],
+ "crid": "test-creative-id-1",
+ "ext": {
+ "prebid": {
+ "type": "banner"
+ }
+ }
+ }
+ ]
+ }
+ ],
+ "cur": "EUR"
+}
diff --git a/src/test/resources/org/prebid/server/it/openrtb2/adipolo/test-auction-adipolo-request.json b/src/test/resources/org/prebid/server/it/openrtb2/adipolo/test-auction-adipolo-request.json
new file mode 100644
index 00000000000..e3f23d7b26c
--- /dev/null
+++ b/src/test/resources/org/prebid/server/it/openrtb2/adipolo/test-auction-adipolo-request.json
@@ -0,0 +1,24 @@
+{
+ "id": "request_id",
+ "imp": [
+ {
+ "id": "imp_id",
+ "banner": {
+ "w": 300,
+ "h": 250
+ },
+ "ext": {
+ "adipolo": {
+ "env": "envValue",
+ "pid": "pidValue"
+ }
+ }
+ }
+ ],
+ "tmax": 5000,
+ "regs": {
+ "ext": {
+ "gdpr": 0
+ }
+ }
+}
diff --git a/src/test/resources/org/prebid/server/it/openrtb2/adipolo/test-auction-adipolo-response.json b/src/test/resources/org/prebid/server/it/openrtb2/adipolo/test-auction-adipolo-response.json
new file mode 100644
index 00000000000..fa3f54ab318
--- /dev/null
+++ b/src/test/resources/org/prebid/server/it/openrtb2/adipolo/test-auction-adipolo-response.json
@@ -0,0 +1,41 @@
+{
+ "id": "request_id",
+ "seatbid": [
+ {
+ "bid": [
+ {
+ "id": "bid_id",
+ "impid": "imp_id",
+ "exp": 300,
+ "price": 11.393,
+ "adm": "some adm value",
+ "adomain": [
+ ],
+ "crid": "test-creative-id-1",
+ "ext": {
+ "prebid": {
+ "type": "banner",
+ "meta": {
+ "adaptercode": "adipolo"
+ }
+ },
+ "origbidcpm": 10,
+ "origbidcur": "EUR"
+ }
+ }
+ ],
+ "seat": "adipolo",
+ "group": 0
+ }
+ ],
+ "cur": "USD",
+ "ext": {
+ "responsetimemillis": {
+ "adipolo": "{{ adipolo.response_time_ms }}"
+ },
+ "tmaxrequest": 5000,
+ "prebid": {
+ "auctiontimestamp": 0
+ }
+ }
+}
diff --git a/src/test/resources/org/prebid/server/it/openrtb2/afront/test-afront-bid-request.json b/src/test/resources/org/prebid/server/it/openrtb2/afront/test-afront-bid-request.json
new file mode 100644
index 00000000000..7c09fbd33f7
--- /dev/null
+++ b/src/test/resources/org/prebid/server/it/openrtb2/afront/test-afront-bid-request.json
@@ -0,0 +1,50 @@
+{
+ "id": "request_id",
+ "imp": [
+ {
+ "id": "imp_id",
+ "secure": 1,
+ "banner": {
+ "w": 320,
+ "h": 250
+ }
+ }
+ ],
+ "source": {
+ "tid": "${json-unit.any-string}"
+ },
+ "site": {
+ "domain": "www.example.com",
+ "page": "http://www.example.com",
+ "publisher": {
+ "domain": "example.com"
+ },
+ "ext": {
+ "amp": 0
+ }
+ },
+ "device": {
+ "ua": "userAgent",
+ "ip": "193.168.244.1"
+ },
+ "at": 1,
+ "tmax": "${json-unit.any-number}",
+ "cur": [
+ "USD"
+ ],
+ "regs": {
+ "ext": {
+ "gdpr": 0
+ }
+ },
+ "ext": {
+ "prebid": {
+ "server": {
+ "externalurl": "http://localhost:8080",
+ "gvlid": 1,
+ "datacenter": "local",
+ "endpoint": "/openrtb2/auction"
+ }
+ }
+ }
+}
diff --git a/src/test/resources/org/prebid/server/it/openrtb2/afront/test-afront-bid-response.json b/src/test/resources/org/prebid/server/it/openrtb2/afront/test-afront-bid-response.json
new file mode 100644
index 00000000000..da5c7fc51cd
--- /dev/null
+++ b/src/test/resources/org/prebid/server/it/openrtb2/afront/test-afront-bid-response.json
@@ -0,0 +1,18 @@
+{
+ "id": "tid",
+ "seatbid": [
+ {
+ "bid": [
+ {
+ "crid": "24080",
+ "adid": "2068416",
+ "price": 0.01,
+ "id": "bid_id",
+ "impid": "imp_id",
+ "cid": "8048"
+ }
+ ],
+ "type": "banner"
+ }
+ ]
+}
diff --git a/src/test/resources/org/prebid/server/it/openrtb2/afront/test-auction-afront-request.json b/src/test/resources/org/prebid/server/it/openrtb2/afront/test-auction-afront-request.json
new file mode 100644
index 00000000000..47d31107b50
--- /dev/null
+++ b/src/test/resources/org/prebid/server/it/openrtb2/afront/test-auction-afront-request.json
@@ -0,0 +1,24 @@
+{
+ "id": "request_id",
+ "imp": [
+ {
+ "id": "imp_id",
+ "banner": {
+ "w": 320,
+ "h": 250
+ },
+ "ext": {
+ "afront": {
+ "accountId": "accountid",
+ "sourceId": "sourceId"
+ }
+ }
+ }
+ ],
+ "tmax": 5000,
+ "regs": {
+ "ext": {
+ "gdpr": 0
+ }
+ }
+}
diff --git a/src/test/resources/org/prebid/server/it/openrtb2/afront/test-auction-afront-response.json b/src/test/resources/org/prebid/server/it/openrtb2/afront/test-auction-afront-response.json
new file mode 100644
index 00000000000..46854f1ff84
--- /dev/null
+++ b/src/test/resources/org/prebid/server/it/openrtb2/afront/test-auction-afront-response.json
@@ -0,0 +1,39 @@
+{
+ "id": "request_id",
+ "seatbid": [
+ {
+ "bid": [
+ {
+ "id": "bid_id",
+ "impid": "imp_id",
+ "exp": 300,
+ "price": 0.01,
+ "adid": "2068416",
+ "cid": "8048",
+ "crid": "24080",
+ "ext": {
+ "prebid": {
+ "type": "banner",
+ "meta": {
+ "adaptercode": "afront"
+ }
+ },
+ "origbidcpm": 0.01
+ }
+ }
+ ],
+ "seat": "afront",
+ "group": 0
+ }
+ ],
+ "cur": "USD",
+ "ext": {
+ "responsetimemillis": {
+ "afront": "{{ afront.response_time_ms }}"
+ },
+ "prebid": {
+ "auctiontimestamp": 0
+ },
+ "tmaxrequest": 5000
+ }
+}
diff --git a/src/test/resources/org/prebid/server/it/openrtb2/ix/test-auction-ix-request.json b/src/test/resources/org/prebid/server/it/openrtb2/ix/test-auction-ix-request.json
index 1fc85c3cd79..6d99b8b6278 100644
--- a/src/test/resources/org/prebid/server/it/openrtb2/ix/test-auction-ix-request.json
+++ b/src/test/resources/org/prebid/server/it/openrtb2/ix/test-auction-ix-request.json
@@ -20,5 +20,14 @@
"ext": {
"gdpr": 0
}
+ },
+ "ext": {
+ "ixdiag": {
+ "msd": 2,
+ "msi": 2,
+ "mfu": 0,
+ "ren": false,
+ "version": "6.29.1"
+ }
}
}
diff --git a/src/test/resources/org/prebid/server/it/openrtb2/ix/test-ix-bid-request.json b/src/test/resources/org/prebid/server/it/openrtb2/ix/test-ix-bid-request.json
index d27e2ec709c..0b9d5fb0aaf 100644
--- a/src/test/resources/org/prebid/server/it/openrtb2/ix/test-ix-bid-request.json
+++ b/src/test/resources/org/prebid/server/it/openrtb2/ix/test-ix-bid-request.json
@@ -62,7 +62,13 @@
}
},
"ixdiag": {
- "pbsv": "{{ pbs.java.version }}"
+ "pbsv": "{{ pbs.java.version }}",
+ "pbsp": "java",
+ "msd": 2,
+ "msi": 2,
+ "mfu": 0,
+ "ren": false,
+ "version": "6.29.1"
}
}
}
diff --git a/src/test/resources/org/prebid/server/it/openrtb2/onetag/test-onetag-bid-request.json b/src/test/resources/org/prebid/server/it/openrtb2/onetag/test-onetag-bid-request.json
index 27f8b3dfba7..b0d37448267 100644
--- a/src/test/resources/org/prebid/server/it/openrtb2/onetag/test-onetag-bid-request.json
+++ b/src/test/resources/org/prebid/server/it/openrtb2/onetag/test-onetag-bid-request.json
@@ -12,8 +12,14 @@
"displaymanagerver": "2.0.0",
"tagid": "possibleTagId",
"ext": {
- "key1": "value1",
- "key2": "value2"
+ "tid": "${json-unit.any-string}",
+ "bidder": {
+ "pubId": "386276e072",
+ "ext": {
+ "key1": "value1",
+ "key2": "value2"
+ }
+ }
}
}
],
diff --git a/src/test/resources/org/prebid/server/it/test-application.properties b/src/test/resources/org/prebid/server/it/test-application.properties
index 51958ab075b..4cedf6582f2 100644
--- a/src/test/resources/org/prebid/server/it/test-application.properties
+++ b/src/test/resources/org/prebid/server/it/test-application.properties
@@ -104,6 +104,8 @@ adapters.adxcg.enabled=true
adapters.adxcg.endpoint=http://localhost:8090/adxcg-exchange
adapters.adyoulike.enabled=true
adapters.adyoulike.endpoint=http://localhost:8090/adyoulike-exchange
+adapters.afront.enabled=true
+adapters.afront.endpoint=http://localhost:8090/afront-exchange
adapters.aidem.enabled=true
adapters.aidem.endpoint=http://localhost:8090/aidem-exchange
adapters.aja.enabled=true
@@ -602,6 +604,8 @@ adapters.xeworks.enabled=true
adapters.xeworks.endpoint=http://localhost:8090/xeworks-exchange
adapters.xeworks.aliases.connektai.enabled=true
adapters.xeworks.aliases.connektai.endpoint=http://localhost:8090/connektai-exchange
+adapters.xeworks.aliases.adipolo.enabled=true
+adapters.xeworks.aliases.adipolo.endpoint=http://localhost:8090/adipolo-exchange
adapters.vidazoo.enabled=true
adapters.vidazoo.endpoint=http://localhost:8090/vidazoo-exchange/
adapters.vidazoo.aliases.progx.enabled=true