Skip to content

Commit 6b7fecb

Browse files
Update Alias Behavior (#3639)
1 parent 74fbd3e commit 6b7fecb

File tree

9 files changed

+251
-25
lines changed

9 files changed

+251
-25
lines changed

src/main/java/org/prebid/server/auction/BidderAliases.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,17 +39,18 @@ public boolean isAliasDefined(String alias) {
3939
}
4040

4141
public String resolveBidder(String aliasOrBidder) {
42-
return aliasToBidder.getOrDefault(aliasOrBidder, aliasOrBidder);
42+
return bidderCatalog.isValidName(aliasOrBidder)
43+
? aliasOrBidder
44+
: aliasToBidder.getOrDefault(aliasOrBidder, aliasOrBidder);
4345
}
4446

4547
public boolean isSame(String bidder1, String bidder2) {
4648
return StringUtils.equalsIgnoreCase(resolveBidder(bidder1), resolveBidder(bidder2));
4749
}
4850

4951
public Integer resolveAliasVendorId(String alias) {
50-
return aliasToVendorId.containsKey(alias)
51-
? aliasToVendorId.get(alias)
52-
: resolveAliasVendorIdViaCatalog(alias);
52+
final Integer vendorId = resolveAliasVendorIdViaCatalog(alias);
53+
return vendorId == null ? aliasToVendorId.get(alias) : vendorId;
5354
}
5455

5556
private Integer resolveAliasVendorIdViaCatalog(String alias) {

src/main/java/org/prebid/server/auction/privacy/enforcement/TcfEnforcement.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public Future<List<BidderPrivacyResult>> enforce(AuctionContext auctionContext,
7373

7474
return tcfDefinerService.resultForBidderNames(
7575
bidders,
76-
VendorIdResolver.of(aliases, bidderCatalog),
76+
VendorIdResolver.of(aliases),
7777
auctionContext.getPrivacyContext().getTcfContext(),
7878
accountGdprConfig(auctionContext.getAccount()))
7979
.map(TcfResponse::getActions)

src/main/java/org/prebid/server/privacy/gdpr/VendorIdResolver.java

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,30 +6,20 @@
66
public class VendorIdResolver {
77

88
private final BidderAliases aliases;
9-
private final BidderCatalog bidderCatalog;
109

11-
private VendorIdResolver(BidderAliases aliases, BidderCatalog bidderCatalog) {
10+
private VendorIdResolver(BidderAliases aliases) {
1211
this.aliases = aliases;
13-
this.bidderCatalog = bidderCatalog;
1412
}
1513

16-
public static VendorIdResolver of(BidderAliases aliases, BidderCatalog bidderCatalog) {
17-
return new VendorIdResolver(aliases, bidderCatalog);
14+
public static VendorIdResolver of(BidderAliases aliases) {
15+
return new VendorIdResolver(aliases);
1816
}
1917

2018
public static VendorIdResolver of(BidderCatalog bidderCatalog) {
21-
return of(null, bidderCatalog);
19+
return of(BidderAliases.of(null, null, bidderCatalog));
2220
}
2321

2422
public Integer resolve(String aliasOrBidder) {
25-
final Integer requestAliasVendorId = aliases != null ? aliases.resolveAliasVendorId(aliasOrBidder) : null;
26-
27-
return requestAliasVendorId != null ? requestAliasVendorId : resolveViaCatalog(aliasOrBidder);
28-
}
29-
30-
private Integer resolveViaCatalog(String aliasOrBidder) {
31-
final String bidderName = aliases != null ? aliases.resolveBidder(aliasOrBidder) : aliasOrBidder;
32-
33-
return bidderCatalog.isActive(bidderName) ? bidderCatalog.vendorIdByName(bidderName) : null;
23+
return aliases != null ? aliases.resolveAliasVendorId(aliasOrBidder) : null;
3424
}
3525
}

src/test/groovy/org/prebid/server/functional/model/bidder/BidderName.groovy

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ enum BidderName {
1313
ALIAS_CAMEL_CASE("AlIaS"),
1414
GENERIC_CAMEL_CASE("GeNerIc"),
1515
GENERIC("generic"),
16+
GENER_X("gener_x"),
1617
RUBICON("rubicon"),
1718
APPNEXUS("appnexus"),
1819
RUBICON_ALIAS("rubiconAlias"),

src/test/groovy/org/prebid/server/functional/model/request/auction/Bidder.groovy

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ class Bidder {
1313

1414
Generic alias
1515
Generic generic
16+
@JsonProperty("gener_x")
17+
Generic generX
1618
@JsonProperty("GeNerIc")
1719
Generic genericCamelCase
1820
Rubicon rubicon

src/test/groovy/org/prebid/server/functional/tests/AliasSpec.groovy

Lines changed: 102 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
11
package org.prebid.server.functional.tests
22

33
import org.prebid.server.functional.model.bidder.Generic
4+
import org.prebid.server.functional.model.bidder.Openx
45
import org.prebid.server.functional.model.request.auction.BidRequest
56
import org.prebid.server.functional.service.PrebidServerException
7+
import org.prebid.server.functional.testcontainers.Dependencies
68
import org.prebid.server.functional.util.PBSUtils
79

810
import static io.netty.handler.codec.http.HttpResponseStatus.BAD_REQUEST
911
import static org.prebid.server.functional.model.bidder.BidderName.ALIAS
1012
import static org.prebid.server.functional.model.bidder.BidderName.BOGUS
1113
import static org.prebid.server.functional.model.bidder.BidderName.GENERIC
14+
import static org.prebid.server.functional.model.bidder.BidderName.GENER_X
15+
import static org.prebid.server.functional.model.bidder.BidderName.OPENX
1216
import static org.prebid.server.functional.model.bidder.CompressionType.GZIP
13-
import static org.prebid.server.functional.testcontainers.Dependencies.getNetworkServiceContainer
17+
import static org.prebid.server.functional.testcontainers.Dependencies.networkServiceContainer
1418
import static org.prebid.server.functional.util.HttpUtil.CONTENT_ENCODING_HEADER
1519

1620
class AliasSpec extends BaseSpec {
@@ -144,4 +148,101 @@ class AliasSpec extends BaseSpec {
144148
def bidderRequests = bidder.getBidderRequests(bidRequest.id)
145149
assert bidderRequests.size() == 2
146150
}
151+
152+
def "PBS should ignore alias logic when hardcoded alias endpoints are present"() {
153+
given: "PBs server with aliases config"
154+
def pbsConfig = ["adapters.generic.aliases.alias.enabled" : "true",
155+
"adapters.generic.aliases.alias.endpoint": "$networkServiceContainer.rootUri/alias/auction".toString(),
156+
"adapters.openx.enabled" : "true",
157+
"adapters.openx.endpoint" : "$networkServiceContainer.rootUri/openx/auction".toString()]
158+
def pbsService = pbsServiceFactory.getService(pbsConfig)
159+
160+
and: "Default bid request with openx and alias bidder"
161+
def bidRequest = BidRequest.defaultBidRequest.tap {
162+
imp[0].ext.prebid.bidder.alias = new Generic()
163+
imp[0].ext.prebid.bidder.generic = new Generic()
164+
imp[0].ext.prebid.bidder.openx = new Openx()
165+
ext.prebid.aliases = [(ALIAS.value): OPENX]
166+
}
167+
168+
when: "PBS processes auction request"
169+
def bidResponse = pbsService.sendAuctionRequest(bidRequest)
170+
171+
then: "PBS should call only generic bidder"
172+
def responseDebug = bidResponse.ext.debug
173+
assert responseDebug.httpcalls[GENERIC.value]
174+
175+
and: "PBS shouldn't call only opexn,alias bidder"
176+
assert !responseDebug.httpcalls[OPENX.value]
177+
assert !responseDebug.httpcalls[ALIAS.value]
178+
179+
and: "PBS should call only generic bidder"
180+
assert bidder.getBidderRequest(bidRequest.id)
181+
182+
cleanup: "Stop and remove pbs container"
183+
pbsServiceFactory.removeContainer(pbsConfig)
184+
}
185+
186+
def "PBS should ignore aliases for requests with a base adapter"() {
187+
given: "PBs server with aliases config"
188+
def pbsConfig = ["adapters.openx.enabled" : "true",
189+
"adapters.openx.endpoint": "$networkServiceContainer.rootUri/openx/auction".toString()]
190+
def pbsService = pbsServiceFactory.getService(pbsConfig)
191+
192+
and: "Default bid request with openx and alias bidder"
193+
def bidRequest = BidRequest.defaultBidRequest.tap {
194+
imp[0].ext.prebid.bidder.openx = Openx.defaultOpenx
195+
imp[0].ext.prebid.bidder.generic = new Generic()
196+
ext.prebid.aliases = [(OPENX.value): GENERIC]
197+
}
198+
199+
when: "PBS processes auction request"
200+
def bidResponse = pbsService.sendAuctionRequest(bidRequest)
201+
202+
then: "PBS contain two http calls and the different url for both"
203+
def responseDebug = bidResponse.ext.debug
204+
assert responseDebug.httpcalls.size() == 2
205+
assert responseDebug.httpcalls[OPENX.value]*.uri == ["$networkServiceContainer.rootUri/openx/auction"]
206+
assert responseDebug.httpcalls[GENERIC.value]*.uri == ["$networkServiceContainer.rootUri/auction"]
207+
208+
cleanup: "Stop and remove pbs container"
209+
pbsServiceFactory.removeContainer(pbsConfig)
210+
}
211+
212+
def "PBS should invoke as aliases when alias is unknown and core bidder is specified"() {
213+
given: "Default bid request with generic and alias bidder"
214+
def bidRequest = BidRequest.defaultBidRequest.tap {
215+
imp[0].ext.prebid.bidder.generX = new Generic()
216+
ext.prebid.aliases = [(GENER_X.value): GENERIC]
217+
}
218+
219+
when: "PBS processes auction request"
220+
def bidResponse = defaultPbsService.sendAuctionRequest(bidRequest)
221+
222+
then: "PBS contain two http calls and the same url for both"
223+
def responseDebug = bidResponse.ext.debug
224+
assert responseDebug.httpcalls.size() == 2
225+
assert responseDebug.httpcalls[GENER_X.value]*.uri == responseDebug.httpcalls[GENERIC.value]*.uri
226+
227+
and: "Bidder request should contain request per-alies"
228+
def bidderRequests = bidder.getBidderRequests(bidRequest.id)
229+
assert bidderRequests.size() == 2
230+
}
231+
232+
def "PBS should invoke aliases when alias is unknown and no core bidder is specified"() {
233+
given: "Default bid request with generic and alias bidder"
234+
def bidRequest = BidRequest.defaultBidRequest.tap {
235+
imp[0].ext.prebid.bidder.generX = new Generic()
236+
imp[0].ext.prebid.bidder.generic = null
237+
ext.prebid.aliases = [(GENER_X.value): GENERIC]
238+
}
239+
240+
when: "PBS processes auction request"
241+
def bidResponse = defaultPbsService.sendAuctionRequest(bidRequest)
242+
243+
then: "PBS contain two http calls and the same url for both"
244+
def responseDebug = bidResponse.ext.debug
245+
assert responseDebug.httpcalls.size() == 1
246+
assert responseDebug.httpcalls[GENER_X.value]
247+
}
147248
}

src/test/groovy/org/prebid/server/functional/tests/ImpRequestSpec.groovy

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.prebid.server.functional.tests
22

3+
import org.prebid.server.functional.model.bidder.Generic
34
import org.prebid.server.functional.model.bidder.Openx
45
import org.prebid.server.functional.model.db.StoredImp
56
import org.prebid.server.functional.model.request.auction.BidRequest
@@ -103,8 +104,10 @@ class ImpRequestSpec extends BaseSpec {
103104
imp.first.tap {
104105
pmp = Pmp.defaultPmp
105106
ext.prebid.imp = [(aliasName): new Imp(pmp: extPmp)]
107+
ext.prebid.bidder.generic = null
108+
ext.prebid.bidder.alias = new Generic()
106109
}
107-
ext.prebid.aliases = [(aliasName.value): GENERIC]
110+
ext.prebid.aliases = [(aliasName.value): bidderName]
108111
}
109112

110113
when: "Requesting PBS auction"

src/test/java/org/prebid/server/auction/BidderAliasesTest.java

Lines changed: 67 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.prebid.server.auction;
22

3+
import org.junit.jupiter.api.BeforeEach;
34
import org.junit.jupiter.api.Test;
45
import org.junit.jupiter.api.extension.ExtendWith;
56
import org.mockito.Mock;
@@ -10,13 +11,22 @@
1011

1112
import static java.util.Collections.singletonMap;
1213
import static org.assertj.core.api.Assertions.assertThat;
14+
import static org.mockito.ArgumentMatchers.any;
15+
import static org.mockito.BDDMockito.given;
16+
import static org.mockito.Mock.Strictness.LENIENT;
1317

1418
@ExtendWith(MockitoExtension.class)
1519
public class BidderAliasesTest {
1620

17-
@Mock
21+
@Mock(strictness = LENIENT)
1822
private BidderCatalog bidderCatalog;
1923

24+
@BeforeEach
25+
public void before() {
26+
given(bidderCatalog.isValidName(any())).willReturn(false);
27+
given(bidderCatalog.isActive(any())).willReturn(false);
28+
}
29+
2030
@Test
2131
public void isAliasDefinedShouldReturnFalseWhenNoAliasesInRequest() {
2232
// given
@@ -53,6 +63,16 @@ public void resolveBidderShouldReturnInputWhenNoAliasesInRequest() {
5363
assertThat(aliases.resolveBidder("alias")).isEqualTo("alias");
5464
}
5565

66+
@Test
67+
public void resolveBidderShouldReturnInputWhenNoAliasesInRequestButAliasIsValidInBidderCatalog() {
68+
// given
69+
given(bidderCatalog.isValidName("alias")).willReturn(true);
70+
final BidderAliases aliases = BidderAliases.of(null, null, bidderCatalog);
71+
72+
// when and then
73+
assertThat(aliases.resolveBidder("alias")).isEqualTo("alias");
74+
}
75+
5676
@Test
5777
public void resolveBidderShouldReturnInputWhenAliasIsNotDefinedInRequest() {
5878
// given
@@ -62,6 +82,16 @@ public void resolveBidderShouldReturnInputWhenAliasIsNotDefinedInRequest() {
6282
assertThat(aliases.resolveBidder("alias")).isEqualTo("alias");
6383
}
6484

85+
@Test
86+
public void resolveBidderShouldReturnInputWhenAliasIsNotDefinedInRequestButAliasIsValidInBidderCatalog() {
87+
// given
88+
given(bidderCatalog.isValidName("alias")).willReturn(true);
89+
final BidderAliases aliases = BidderAliases.of(singletonMap("anotherAlias", "bidder"), null, bidderCatalog);
90+
91+
// when and then
92+
assertThat(aliases.resolveBidder("alias")).isEqualTo("alias");
93+
}
94+
6595
@Test
6696
public void resolveBidderShouldDetectAliasInRequest() {
6797
// given
@@ -71,6 +101,16 @@ public void resolveBidderShouldDetectAliasInRequest() {
71101
assertThat(aliases.resolveBidder("alias")).isEqualTo("bidder");
72102
}
73103

104+
@Test
105+
public void resolveBidderShouldDetectInBidderCatalogWhenItIsValid() {
106+
// given
107+
given(bidderCatalog.isValidName("alias")).willReturn(true);
108+
final BidderAliases aliases = BidderAliases.of(singletonMap("alias", "bidder"), null, bidderCatalog);
109+
110+
// when and then
111+
assertThat(aliases.resolveBidder("alias")).isEqualTo("alias");
112+
}
113+
74114
@Test
75115
public void isSameShouldReturnTrueIfBiddersSameConsideringAliases() {
76116
// given
@@ -110,6 +150,17 @@ public void resolveAliasVendorIdShouldReturnNullWhenNoVendorIdsInRequest() {
110150
assertThat(aliases.resolveAliasVendorId("alias")).isNull();
111151
}
112152

153+
@Test
154+
public void resolveAliasVendorIdShouldReturnVendorIdFromBidderCatalogWhenNoVendorIdsInRequest() {
155+
// given
156+
given(bidderCatalog.isActive("alias")).willReturn(true);
157+
given(bidderCatalog.vendorIdByName("alias")).willReturn(3);
158+
final BidderAliases aliases = BidderAliases.of(null, null, bidderCatalog);
159+
160+
// when and then
161+
assertThat(aliases.resolveAliasVendorId("alias")).isEqualTo(3);
162+
}
163+
113164
@Test
114165
public void resolveAliasVendorIdShouldReturnNullWhenVendorIdIsNotDefinedInRequest() {
115166
// given
@@ -120,11 +171,24 @@ public void resolveAliasVendorIdShouldReturnNullWhenVendorIdIsNotDefinedInReques
120171
}
121172

122173
@Test
123-
public void resolveAliasVendorIdShouldDetectVendorIdInRequest() {
174+
public void resolveAliasVendorIdShouldReturnVendorIdFromBidderCatalogWhenVendorIdIsNotDefinedInRequest() {
175+
// given
176+
given(bidderCatalog.isActive("alias")).willReturn(true);
177+
given(bidderCatalog.vendorIdByName("alias")).willReturn(3);
178+
final BidderAliases aliases = BidderAliases.of(null, singletonMap("anotherAlias", 2), bidderCatalog);
179+
180+
// when and then
181+
assertThat(aliases.resolveAliasVendorId("alias")).isEqualTo(3);
182+
}
183+
184+
@Test
185+
public void resolveAliasVendorIdShouldReturnVendorIdFromBidderCatalogWhenVendorIdIsInRequest() {
124186
// given
187+
given(bidderCatalog.isActive("alias")).willReturn(true);
188+
given(bidderCatalog.vendorIdByName("alias")).willReturn(3);
125189
final BidderAliases aliases = BidderAliases.of(null, singletonMap("alias", 2), bidderCatalog);
126190

127191
// when and then
128-
assertThat(aliases.resolveAliasVendorId("alias")).isEqualTo(2);
192+
assertThat(aliases.resolveAliasVendorId("alias")).isEqualTo(3);
129193
}
130194
}

0 commit comments

Comments
 (0)