Skip to content

Commit ce331a7

Browse files
authored
Fix: Aliases Of Bidders With UserSync Supports Declared Only (#3850)
1 parent 211f13a commit ce331a7

File tree

3 files changed

+118
-6
lines changed

3 files changed

+118
-6
lines changed

config/bidderinfo.go

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,21 @@ func (bi BidderInfo) IsEnabled() bool {
201201
return !bi.Disabled
202202
}
203203

204+
// Defined returns true if at least one field exists, except for the supports field.
205+
func (s *Syncer) Defined() bool {
206+
if s == nil {
207+
return false
208+
}
209+
210+
return s.Key != "" ||
211+
s.IFrame != nil ||
212+
s.Redirect != nil ||
213+
s.ExternalURL != "" ||
214+
s.SupportCORS != nil ||
215+
s.FormatOverride != "" ||
216+
s.SkipWhen != nil
217+
}
218+
204219
type InfoReader interface {
205220
Read() (map[string][]byte, error)
206221
}
@@ -335,7 +350,7 @@ func processBidderAliases(aliasNillableFieldsByBidder map[string]aliasNillableFi
335350
if aliasBidderInfo.PlatformID == "" {
336351
aliasBidderInfo.PlatformID = parentBidderInfo.PlatformID
337352
}
338-
if aliasBidderInfo.Syncer == nil && parentBidderInfo.Syncer != nil {
353+
if aliasBidderInfo.Syncer == nil && parentBidderInfo.Syncer.Defined() {
339354
syncerKey := aliasBidderInfo.AliasOf
340355
if parentBidderInfo.Syncer.Key != "" {
341356
syncerKey = parentBidderInfo.Syncer.Key

config/bidderinfo_test.go

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"gopkg.in/yaml.v3"
99

1010
"github.com/prebid/prebid-server/v2/openrtb_ext"
11+
"github.com/prebid/prebid-server/v2/util/ptrutil"
1112
"github.com/stretchr/testify/assert"
1213
"github.com/stretchr/testify/require"
1314
)
@@ -401,6 +402,15 @@ func TestProcessAliasBidderInfo(t *testing.T) {
401402
Key: "bidderA",
402403
}
403404

405+
parentWithSyncerSupports := parentWithoutSyncerKey
406+
parentWithSyncerSupports.Syncer = &Syncer{
407+
Supports: []string{"iframe"},
408+
}
409+
410+
aliasWithoutSyncer := parentWithoutSyncerKey
411+
aliasWithoutSyncer.AliasOf = "bidderA"
412+
aliasWithoutSyncer.Syncer = nil
413+
404414
testCases := []struct {
405415
description string
406416
aliasInfos map[string]aliasNillableFields
@@ -428,6 +438,26 @@ func TestProcessAliasBidderInfo(t *testing.T) {
428438
expectedErr: nil,
429439
expectedBidderInfos: BidderInfos{"bidderA": parentWithSyncerKey, "bidderB": bidderB},
430440
},
441+
{
442+
description: "inherit all parent info in alias bidder, except for syncer is parent only defines supports",
443+
aliasInfos: map[string]aliasNillableFields{
444+
"bidderB": {
445+
Disabled: nil,
446+
ModifyingVastXmlAllowed: nil,
447+
Experiment: nil,
448+
XAPI: nil,
449+
},
450+
},
451+
bidderInfos: BidderInfos{
452+
"bidderA": parentWithSyncerSupports,
453+
"bidderB": BidderInfo{
454+
AliasOf: "bidderA",
455+
// all other fields should be inherited from parent bidder, except for syncer
456+
},
457+
},
458+
expectedErr: nil,
459+
expectedBidderInfos: BidderInfos{"bidderA": parentWithSyncerSupports, "bidderB": aliasWithoutSyncer},
460+
},
431461
{
432462
description: "inherit all parent info in alias bidder, use parent name as syncer alias key",
433463
aliasInfos: map[string]aliasNillableFields{
@@ -1522,6 +1552,77 @@ func TestSyncerEndpointOverride(t *testing.T) {
15221552
}
15231553
}
15241554

1555+
func TestSyncerDefined(t *testing.T) {
1556+
testCases := []struct {
1557+
name string
1558+
givenSyncer *Syncer
1559+
expected bool
1560+
}{
1561+
{
1562+
name: "nil",
1563+
givenSyncer: nil,
1564+
expected: false,
1565+
},
1566+
{
1567+
name: "empty",
1568+
givenSyncer: &Syncer{},
1569+
expected: false,
1570+
},
1571+
{
1572+
name: "key-only",
1573+
givenSyncer: &Syncer{Key: "anyKey"},
1574+
expected: true,
1575+
},
1576+
{
1577+
name: "iframe-only",
1578+
givenSyncer: &Syncer{IFrame: &SyncerEndpoint{}},
1579+
expected: true,
1580+
},
1581+
{
1582+
name: "redirect-only",
1583+
givenSyncer: &Syncer{Redirect: &SyncerEndpoint{}},
1584+
expected: true,
1585+
},
1586+
{
1587+
name: "externalurl-only",
1588+
givenSyncer: &Syncer{ExternalURL: "anyURL"},
1589+
expected: true,
1590+
},
1591+
{
1592+
name: "supportscors-only",
1593+
givenSyncer: &Syncer{SupportCORS: ptrutil.ToPtr(false)},
1594+
expected: true,
1595+
},
1596+
{
1597+
name: "formatoverride-only",
1598+
givenSyncer: &Syncer{FormatOverride: "anyFormat"},
1599+
expected: true,
1600+
},
1601+
{
1602+
name: "skipwhen-only",
1603+
givenSyncer: &Syncer{SkipWhen: &SkipWhen{}},
1604+
expected: true,
1605+
},
1606+
{
1607+
name: "supports-only",
1608+
givenSyncer: &Syncer{Supports: []string{"anySupports"}},
1609+
expected: false,
1610+
},
1611+
{
1612+
name: "supports-with-other",
1613+
givenSyncer: &Syncer{Key: "anyKey", Supports: []string{"anySupports"}},
1614+
expected: true,
1615+
},
1616+
}
1617+
1618+
for _, test := range testCases {
1619+
t.Run(test.name, func(t *testing.T) {
1620+
result := test.givenSyncer.Defined()
1621+
assert.Equal(t, test.expected, result)
1622+
})
1623+
}
1624+
}
1625+
15251626
func TestApplyBidderInfoConfigSyncerOverrides(t *testing.T) {
15261627
var (
15271628
givenFileSystem = BidderInfos{"a": {Syncer: &Syncer{Key: "original"}}}

usersync/syncersbuilder.go

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,13 +84,9 @@ func shouldCreateSyncer(cfg config.BidderInfo) bool {
8484
return false
8585
}
8686

87-
if cfg.Syncer == nil {
88-
return false
89-
}
90-
9187
// a syncer may provide just a Supports field to provide hints to the host. we should only try to create a syncer
9288
// if there is at least one non-Supports value populated.
93-
return cfg.Syncer.Key != "" || cfg.Syncer.IFrame != nil || cfg.Syncer.Redirect != nil || cfg.Syncer.SupportCORS != nil
89+
return cfg.Syncer.Defined()
9490
}
9591

9692
func chooseSyncerConfig(biddersSyncerConfig []namedSyncerConfig) (namedSyncerConfig, error) {

0 commit comments

Comments
 (0)