From 347fb6b32737d17e3481e27ceb7d5452aae3d79e Mon Sep 17 00:00:00 2001 From: ddubyk Date: Tue, 10 Sep 2024 20:49:59 +0200 Subject: [PATCH 1/4] Update segtax logic. --- adapters/rubicon/rubicon.go | 127 ++++- .../exemplary/25-26-transition-period.json | 202 +------ .../rubicontest/exemplary/app-imp-fpd.json | 112 ---- .../exemplary/flexible-schema.json | 112 ---- .../exemplary/hardcode-secure.json | 203 +------ .../exemplary/segtax-attributes.json | 502 ++++++++++++++++++ .../rubicontest/exemplary/simple-banner.json | 199 +------ .../rubicontest/exemplary/simple-native.json | 199 +------ .../rubicontest/exemplary/simple-video.json | 199 +------ .../rubicontest/exemplary/site-imp-fpd.json | 276 +--------- .../rubicontest/exemplary/user-fpd.json | 112 ---- .../supplemental/no-site-content-data.json | 112 ---- .../supplemental/no-site-content.json | 112 ---- go.mod | 1 + go.sum | 6 + 15 files changed, 632 insertions(+), 1842 deletions(-) create mode 100644 adapters/rubicon/rubicontest/exemplary/segtax-attributes.json diff --git a/adapters/rubicon/rubicon.go b/adapters/rubicon/rubicon.go index 1cb2ab49465..b6303f72df0 100644 --- a/adapters/rubicon/rubicon.go +++ b/adapters/rubicon/rubicon.go @@ -8,6 +8,8 @@ import ( "strconv" "strings" + "github.com/golang-collections/collections/stack" + "github.com/prebid/prebid-server/v2/adapters" "github.com/prebid/prebid-server/v2/config" "github.com/prebid/prebid-server/v2/errortypes" @@ -431,7 +433,7 @@ func (a *RubiconAdapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *ada siteExtRP := rubiconSiteExt{RP: rubiconSiteExtRP{SiteID: int(siteId)}} if siteCopy.Content != nil { siteTarget := make(map[string]interface{}) - updateExtWithIabAttribute(siteTarget, siteCopy.Content.Data, []int{1, 2, 5, 6}) + updateExtWithIabAndSegtaxAttribute(siteTarget, siteCopy.Content.Data, []int{1, 2, 5, 6}) if len(siteTarget) > 0 { updatedSiteTarget, err := json.Marshal(siteTarget) if err != nil { @@ -793,7 +795,7 @@ func updateUserRpTargetWithFpdAttributes(visitor json.RawMessage, user openrtb2. if err != nil { return nil, err } - updateExtWithIabAttribute(target, user.Data, []int{4}) + updateExtWithIabAndSegtaxAttribute(target, user.Data, []int{4}) updatedTarget, err := json.Marshal(target) if err != nil { @@ -802,13 +804,106 @@ func updateUserRpTargetWithFpdAttributes(visitor json.RawMessage, user openrtb2. return updatedTarget, nil } -func updateExtWithIabAttribute(target map[string]interface{}, data []openrtb2.Data, segTaxes []int) { - var segmentIdsToCopy = getSegmentIdsToCopy(data, segTaxes) - if len(segmentIdsToCopy) == 0 { +func updateExtWithIabAndSegtaxAttribute(target map[string]interface{}, data []openrtb2.Data, segTaxes []int) { + taxonomyIdToSegments := getTaxonomyIdToSegments(data) + if len(taxonomyIdToSegments) == 0 { return } - target["iab"] = segmentIdsToCopy + relevantSegments := pickRelevantSegments(taxonomyIdToSegments) + groupedSegments := groupSegments(relevantSegments, segTaxes) + + for key, value := range groupedSegments { + target[key] = value + } +} + +func getTaxonomyIdToSegments(data []openrtb2.Data) map[int]*stack.Stack { + var taxonomyIdToSegments = make(map[int]*stack.Stack) + for _, dataRecord := range data { + if dataRecord.Ext == nil { + continue + } + + var dataRecordExt rubiconDataExt + err := json.Unmarshal(dataRecord.Ext, &dataRecordExt) + if err != nil { + continue + } + + taxonomyId := dataRecordExt.SegTax + originalSegments := dataRecord.Segment + if len(originalSegments) == 0 { + continue + } + + segments, exists := taxonomyIdToSegments[taxonomyId] + if !exists { + segments = stack.New() + taxonomyIdToSegments[taxonomyId] = segments + } + + for _, originalSegment := range originalSegments { + if originalSegment.ID != "" { + segments.Push(originalSegment) + } + } + + if segments.Len() == 0 { + delete(taxonomyIdToSegments, taxonomyId) + } + } + + return taxonomyIdToSegments +} + +func pickRelevantSegments(taxonomyIdToSegments map[int]*stack.Stack) map[int][]string { + var relevantSegments = make(map[int][]string) + taxonomyIds := make([]int, 0) + + for taxonomyId := range taxonomyIdToSegments { + taxonomyIds = append(taxonomyIds, taxonomyId) + } + + i := 0 + consumedSegmentsCount := 0 + for consumedSegmentsCount < 100 && len(taxonomyIds) > 0 { + taxonomyIdIndex := i % len(taxonomyIds) + taxonomyId := taxonomyIds[taxonomyIdIndex] + currentSegments := taxonomyIdToSegments[taxonomyId] + lastSegment := currentSegments.Pop().(openrtb2.Segment) + + if _, exists := relevantSegments[taxonomyId]; !exists { + relevantSegments[taxonomyId] = make([]string, 0) + } + relevantSegments[taxonomyId] = append(relevantSegments[taxonomyId], lastSegment.ID) + consumedSegmentsCount++ + + if currentSegments.Len() == 0 { + taxonomyIds = append(taxonomyIds[:taxonomyIdIndex], taxonomyIds[taxonomyIdIndex+1:]...) + i-- + } + i++ + } + + return relevantSegments +} + +func groupSegments(taxonomyIdToSegmentsIds map[int][]string, segTaxes []int) map[string][]string { + var groupedSegments = make(map[string][]string) + for taxonomyId, segmentsIds := range taxonomyIdToSegmentsIds { + segmentName := "iab" + if !contains(segTaxes, taxonomyId) { + segmentName = "tax" + strconv.Itoa(taxonomyId) + } + + if _, exists := groupedSegments[segmentName]; !exists { + groupedSegments[segmentName] = make([]string, 0) + } + groupedSegments[segmentName] = append(groupedSegments[segmentName], segmentsIds...) + } + + return groupedSegments } func populateFirstPartyDataAttributes(source json.RawMessage, target map[string]interface{}) error { @@ -887,26 +982,6 @@ func mapFromRawJSON(message json.RawMessage) (map[string]interface{}, error) { return targetAsMap, nil } -func getSegmentIdsToCopy(data []openrtb2.Data, segTaxValues []int) []string { - var segmentIdsToCopy = make([]string, 0, len(data)) - - for _, dataRecord := range data { - if dataRecord.Ext != nil { - var dataExtObject rubiconDataExt - err := json.Unmarshal(dataRecord.Ext, &dataExtObject) - if err != nil { - continue - } - if contains(segTaxValues, dataExtObject.SegTax) { - for _, segment := range dataRecord.Segment { - segmentIdsToCopy = append(segmentIdsToCopy, segment.ID) - } - } - } - } - return segmentIdsToCopy -} - func contains(s []int, e int) bool { for _, a := range s { if a == e { diff --git a/adapters/rubicon/rubicontest/exemplary/25-26-transition-period.json b/adapters/rubicon/rubicontest/exemplary/25-26-transition-period.json index d64f2361521..b46f9e58eef 100644 --- a/adapters/rubicon/rubicontest/exemplary/25-26-transition-period.json +++ b/adapters/rubicon/rubicontest/exemplary/25-26-transition-period.json @@ -13,44 +13,7 @@ "pagecat": [ "val1", "val2" - ], - "content": { - "data": [ - { - "ext": { - "segtax": 1 - }, - "segment": [ - { - "id": "segmentId1" - }, - { - "id": "segmentId2" - } - ] - }, - { - "ext": { - "segtax": "1" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": 2 - }, - "segment": [ - { - "id": "segmentId3" - } - ] - } - ] - } + ] }, "user": { "yob": 2000, @@ -60,60 +23,6 @@ "lon": -122.346200 }, "gender": "f", - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ], "ext": { "consent": "consent" } @@ -131,7 +40,6 @@ "ver": "1.0" } } - }, "regs": { "ext": { @@ -194,53 +102,9 @@ "val1", "val2" ], - "content": { - "data": [ - { - "ext": { - "segtax": 1 - }, - "segment": [ - { - "id": "segmentId1" - }, - { - "id": "segmentId2" - } - ] - }, - { - "ext": { - "segtax": "1" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": 2 - }, - "segment": [ - { - "id": "segmentId3" - } - ] - } - ] - }, "ext": { "rp": { - "site_id": 113932, - "target": { - "iab": [ - "segmentId1", - "segmentId2", - "segmentId3" - ] - } + "site_id": 113932 } }, "publisher": { @@ -252,68 +116,10 @@ } }, "user": { - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ], "ext": { "consent": "consent", "rp": { "target": { - "iab": [ - "idToCopy", - "idToCopy2" - ] } } } @@ -389,7 +195,9 @@ } ] }, - "impIDs":["test-imp-id"] + "impIDs": [ + "test-imp-id" + ] }, "mockResponse": { "status": 200, diff --git a/adapters/rubicon/rubicontest/exemplary/app-imp-fpd.json b/adapters/rubicon/rubicontest/exemplary/app-imp-fpd.json index 914cfce03de..33c970dd735 100644 --- a/adapters/rubicon/rubicontest/exemplary/app-imp-fpd.json +++ b/adapters/rubicon/rubicontest/exemplary/app-imp-fpd.json @@ -46,60 +46,6 @@ "lon": -122.346200 }, "gender": "f", - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ], "ext": { "data": { "attr1": "val1", @@ -207,60 +153,6 @@ } }, "user": { - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ], "ext": { "rp": { "target": { @@ -282,10 +174,6 @@ ], "attr5": [ "3" - ], - "iab": [ - "idToCopy", - "idToCopy2" ] } } diff --git a/adapters/rubicon/rubicontest/exemplary/flexible-schema.json b/adapters/rubicon/rubicontest/exemplary/flexible-schema.json index 0434f6bab83..42345d6afd3 100644 --- a/adapters/rubicon/rubicontest/exemplary/flexible-schema.json +++ b/adapters/rubicon/rubicontest/exemplary/flexible-schema.json @@ -46,60 +46,6 @@ "lon": -122.346200 }, "gender": "f", - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ], "ext": { "data": { "attr1": "val1", @@ -207,60 +153,6 @@ } }, "user": { - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ], "ext": { "rp": { "target": { @@ -282,10 +174,6 @@ ], "attr5": [ "3" - ], - "iab": [ - "idToCopy", - "idToCopy2" ] } } diff --git a/adapters/rubicon/rubicontest/exemplary/hardcode-secure.json b/adapters/rubicon/rubicontest/exemplary/hardcode-secure.json index c349b86da91..964cc79080d 100644 --- a/adapters/rubicon/rubicontest/exemplary/hardcode-secure.json +++ b/adapters/rubicon/rubicontest/exemplary/hardcode-secure.json @@ -13,44 +13,7 @@ "pagecat": [ "val1", "val2" - ], - "content": { - "data": [ - { - "ext": { - "segtax": 1 - }, - "segment": [ - { - "id": "segmentId1" - }, - { - "id": "segmentId2" - } - ] - }, - { - "ext": { - "segtax": "1" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": 2 - }, - "segment": [ - { - "id": "segmentId3" - } - ] - } - ] - } + ] }, "user": { "yob": 2000, @@ -59,61 +22,7 @@ "lat": 47.627500, "lon": -122.346200 }, - "gender": "f", - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ] + "gender": "f" }, "imp": [ { @@ -167,53 +76,9 @@ "val1", "val2" ], - "content": { - "data": [ - { - "ext": { - "segtax": 1 - }, - "segment": [ - { - "id": "segmentId1" - }, - { - "id": "segmentId2" - } - ] - }, - { - "ext": { - "segtax": "1" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": 2 - }, - "segment": [ - { - "id": "segmentId3" - } - ] - } - ] - }, "ext": { "rp": { - "site_id": 113932, - "target": { - "iab": [ - "segmentId1", - "segmentId2", - "segmentId3" - ] - } + "site_id": 113932 } }, "publisher": { @@ -225,67 +90,9 @@ } }, "user": { - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ], "ext": { "rp": { "target": { - "iab": [ - "idToCopy", - "idToCopy2" - ] } } } @@ -335,7 +142,9 @@ } ] }, - "impIDs":["test-imp-id"] + "impIDs": [ + "test-imp-id" + ] }, "mockResponse": { "status": 200, diff --git a/adapters/rubicon/rubicontest/exemplary/segtax-attributes.json b/adapters/rubicon/rubicontest/exemplary/segtax-attributes.json new file mode 100644 index 00000000000..7854120b67c --- /dev/null +++ b/adapters/rubicon/rubicontest/exemplary/segtax-attributes.json @@ -0,0 +1,502 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "device": { + "ip": "123.123.123.123", + "ifa": "zxcjbzxmc-zxcbmz-zxbcz-zxczx" + }, + "app": { + "id": "1", + "bundle": "com.wls.testwlsapplication" + }, + "site": { + "pagecat": [ + "val1", + "val2" + ], + "content": { + "data": [ + { + "ext": { + "segtax": 1 + }, + "segment": [ + { + "id": "segmentId1" + }, + { + "id": "segmentId2" + } + ] + }, + { + "ext": { + "segtax": "1" + }, + "segment": [ + { + "id": "shouldNotBeCopied" + } + ] + }, + { + "ext": { + "segtax": 2 + }, + "segment": [ + { + "id": "segmentId3" + } + ] + }, + { + "ext": { + "segtax": 10 + }, + "segment": [ + { + "id": "segmentId4" + } + ] + } + ] + } + }, + "user": { + "yob": 2000, + "geo": { + "country": "USA", + "lat": 47.627500, + "lon": -122.346200 + }, + "gender": "f", + "data": [ + { + "ext": { + "segtax": 4 + }, + "segment": [ + { + "id": "idToCopy" + } + ] + }, + { + "ext": { + "segtax": "someValue" + }, + "segment": [ + { + "id": "shouldNotBeCopied" + } + ] + }, + { + "ext": { + "segtax": "4" + }, + "segment": [ + { + "id": "shouldNotBeCopied2" + } + ] + }, + { + "ext": { + "segtax": 4 + }, + "segment": [ + { + "id": "idToCopy2" + } + ] + }, + { + "ext": { + "segtax": [ + 4 + ] + }, + "segment": [ + { + "id": "shouldNotBeCopied3" + } + ] + }, + { + "ext": { + "segtax": 2 + }, + "segment": [ + { + "id": "idToCopy3" + } + ] + } + ], + "ext": { + "consent": "consent" + } + }, + "source": { + "ext": { + "schain": { + "complete": 0, + "nodes": [ + { + "asi": "asi", + "sid": "sid" + } + ], + "ver": "1.0" + } + } + }, + "regs": { + "ext": { + "gdpr": 1, + "us_privacy": "us_privacy" + } + }, + "imp": [ + { + "id": "test-imp-id", + "instl": 1, + "banner": { + "w": 1024, + "h": 576 + }, + "ext": { + "data": { + "pbadslot": "pbadslot" + }, + "bidder": { + "accountId": 1001, + "siteId": 113932, + "zoneId": 535510, + "pchain": "pchain" + }, + "skadn": { + "version": "1.0", + "sourceapp": "000", + "skadnetlist": { + "max": 0, + "excl": [ + 1 + ], + "addl": [ + "x.skadnetwork" + ] + } + } + } + } + ] + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "uri?tk_xint=pbs-test-tracker", + "body": { + "id": "test-request-id", + "device": { + "ext": { + "rp": { + "pixelratio": 0 + } + }, + "ip": "123.123.123.123", + "ifa": "zxcjbzxmc-zxcbmz-zxbcz-zxczx" + }, + "site": { + "pagecat": [ + "val1", + "val2" + ], + "content": { + "data": [ + { + "ext": { + "segtax": 1 + }, + "segment": [ + { + "id": "segmentId1" + }, + { + "id": "segmentId2" + } + ] + }, + { + "ext": { + "segtax": "1" + }, + "segment": [ + { + "id": "shouldNotBeCopied" + } + ] + }, + { + "ext": { + "segtax": 2 + }, + "segment": [ + { + "id": "segmentId3" + } + ] + }, + { + "ext": { + "segtax": 10 + }, + "segment": [ + { + "id": "segmentId4" + } + ] + } + ] + }, + "ext": { + "rp": { + "site_id": 113932, + "target": { + "iab": [ + "segmentId2", + "segmentId1", + "segmentId3" + ], + "tax10": [ + "segmentId4" + ] + } + } + }, + "publisher": { + "ext": { + "rp": { + "account_id": 1001 + } + } + } + }, + "user": { + "data": [ + { + "ext": { + "segtax": 4 + }, + "segment": [ + { + "id": "idToCopy" + } + ] + }, + { + "ext": { + "segtax": "someValue" + }, + "segment": [ + { + "id": "shouldNotBeCopied" + } + ] + }, + { + "ext": { + "segtax": "4" + }, + "segment": [ + { + "id": "shouldNotBeCopied2" + } + ] + }, + { + "ext": { + "segtax": 4 + }, + "segment": [ + { + "id": "idToCopy2" + } + ] + }, + { + "ext": { + "segtax": [ + 4 + ] + }, + "segment": [ + { + "id": "shouldNotBeCopied3" + } + ] + }, + { + "ext": { + "segtax": 2 + }, + "segment": [ + { + "id": "idToCopy3" + } + ] + } + ], + "ext": { + "consent": "consent", + "rp": { + "target": { + "iab": [ + "idToCopy2", + "idToCopy" + ], + "tax2": [ + "idToCopy3" + ] + } + } + } + }, + "app": { + "id": "1", + "bundle": "com.wls.testwlsapplication" + }, + "source": { + "pchain": "pchain", + "ext": { + "schain": { + "complete": 0, + "nodes": [ + { + "asi": "asi", + "sid": "sid" + } + ], + "ver": "1.0" + } + } + }, + "regs": { + "ext": { + "gdpr": 1, + "us_privacy": "us_privacy" + } + }, + "imp": [ + { + "id": "test-imp-id", + "instl": 1, + "secure": 1, + "banner": { + "ext": { + "rp": { + "mime": "text/html" + } + }, + "w": 1024, + "h": 576 + }, + "ext": { + "rp": { + "target": { + "pbadslot": "pbadslot", + "pagecat": [ + "val1", + "val2" + ] + }, + "track": { + "mint": "", + "mint_version": "" + }, + "zone_id": 535510 + }, + "skadn": { + "skadnetlist": { + "max": 0, + "excl": [ + 1 + ], + "addl": [ + "x.skadnetwork" + ] + }, + "sourceapp": "000", + "version": "1.0" + } + } + } + ] + }, + "impIDs": [ + "test-imp-id" + ] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "seatbid": [ + { + "buyer": "123", + "bid": [ + { + "id": "test_bid_id", + "impid": "test-imp-id", + "price": 0.27543, + "adm": "some-test-ad", + "cid": "test_cid", + "crid": "test_crid", + "dealid": "test_dealid", + "ext": { + "prebid": { + "meta": { + "networkId": 123 + }, + "type": "banner" + } + } + } + ], + "seat": "adman" + } + ], + "cur": "USD" + } + } + } + ], + "expectedBidResponses": [ + { + "currency": "USD", + "bids": [ + { + "bid": { + "id": "test_bid_id", + "impid": "test-imp-id", + "price": 0.27543, + "adm": "some-test-ad", + "cid": "test_cid", + "crid": "test_crid", + "dealid": "test_dealid", + "ext": { + "prebid": { + "meta": { + "networkId": 123 + }, + "type": "banner" + } + } + }, + "type": "banner" + } + ] + } + ] +} diff --git a/adapters/rubicon/rubicontest/exemplary/simple-banner.json b/adapters/rubicon/rubicontest/exemplary/simple-banner.json index d2da4ce8a8d..ab7194eb6bc 100644 --- a/adapters/rubicon/rubicontest/exemplary/simple-banner.json +++ b/adapters/rubicon/rubicontest/exemplary/simple-banner.json @@ -13,44 +13,7 @@ "pagecat": [ "val1", "val2" - ], - "content": { - "data": [ - { - "ext": { - "segtax": 1 - }, - "segment": [ - { - "id": "segmentId1" - }, - { - "id": "segmentId2" - } - ] - }, - { - "ext": { - "segtax": "1" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": 2 - }, - "segment": [ - { - "id": "segmentId3" - } - ] - } - ] - } + ] }, "user": { "yob": 2000, @@ -60,61 +23,7 @@ "lon": -122.346200 }, "gender": "f", - "consent": "consent", - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ] + "consent": "consent" }, "imp": [ { @@ -171,53 +80,9 @@ "val1", "val2" ], - "content": { - "data": [ - { - "ext": { - "segtax": 1 - }, - "segment": [ - { - "id": "segmentId1" - }, - { - "id": "segmentId2" - } - ] - }, - { - "ext": { - "segtax": "1" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": 2 - }, - "segment": [ - { - "id": "segmentId3" - } - ] - } - ] - }, "ext": { "rp": { - "site_id": 113932, - "target": { - "iab": [ - "segmentId1", - "segmentId2", - "segmentId3" - ] - } + "site_id": 113932 } }, "publisher": { @@ -229,68 +94,10 @@ } }, "user": { - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ], "ext": { "consent": "consent", "rp": { "target": { - "iab": [ - "idToCopy", - "idToCopy2" - ] } } } diff --git a/adapters/rubicon/rubicontest/exemplary/simple-native.json b/adapters/rubicon/rubicontest/exemplary/simple-native.json index f5e43ff9211..95694a0967c 100644 --- a/adapters/rubicon/rubicontest/exemplary/simple-native.json +++ b/adapters/rubicon/rubicontest/exemplary/simple-native.json @@ -13,44 +13,7 @@ "pagecat": [ "val1", "val2" - ], - "content": { - "data": [ - { - "ext": { - "segtax": 1 - }, - "segment": [ - { - "id": "segmentId1" - }, - { - "id": "segmentId2" - } - ] - }, - { - "ext": { - "segtax": "1" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": 2 - }, - "segment": [ - { - "id": "segmentId3" - } - ] - } - ] - } + ] }, "user": { "yob": 2000, @@ -59,61 +22,7 @@ "lat": 47.627500, "lon": -122.346200 }, - "gender": "f", - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ] + "gender": "f" }, "imp": [ { @@ -158,53 +67,9 @@ "val1", "val2" ], - "content": { - "data": [ - { - "ext": { - "segtax": 1 - }, - "segment": [ - { - "id": "segmentId1" - }, - { - "id": "segmentId2" - } - ] - }, - { - "ext": { - "segtax": "1" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": 2 - }, - "segment": [ - { - "id": "segmentId3" - } - ] - } - ] - }, "ext": { "rp": { - "site_id": 113932, - "target": { - "iab": [ - "segmentId1", - "segmentId2", - "segmentId3" - ] - } + "site_id": 113932 } }, "publisher": { @@ -216,67 +81,9 @@ } }, "user": { - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ], "ext": { "rp": { "target": { - "iab": [ - "idToCopy", - "idToCopy2" - ] } } } diff --git a/adapters/rubicon/rubicontest/exemplary/simple-video.json b/adapters/rubicon/rubicontest/exemplary/simple-video.json index 5552dd71816..2a006438020 100644 --- a/adapters/rubicon/rubicontest/exemplary/simple-video.json +++ b/adapters/rubicon/rubicontest/exemplary/simple-video.json @@ -13,44 +13,7 @@ "pagecat": [ "val1", "val2" - ], - "content": { - "data": [ - { - "ext": { - "segtax": 1 - }, - "segment": [ - { - "id": "segmentId1" - }, - { - "id": "segmentId2" - } - ] - }, - { - "ext": { - "segtax": "1" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": 2 - }, - "segment": [ - { - "id": "segmentId3" - } - ] - } - ] - } + ] }, "user": { "yob": 2000, @@ -59,61 +22,7 @@ "lat": 47.627500, "lon": -122.346200 }, - "gender": "f", - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ] + "gender": "f" }, "imp": [ { @@ -166,53 +75,9 @@ "val1", "val2" ], - "content": { - "data": [ - { - "ext": { - "segtax": 1 - }, - "segment": [ - { - "id": "segmentId1" - }, - { - "id": "segmentId2" - } - ] - }, - { - "ext": { - "segtax": "1" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": 2 - }, - "segment": [ - { - "id": "segmentId3" - } - ] - } - ] - }, "ext": { "rp": { - "site_id": 113932, - "target": { - "iab": [ - "segmentId1", - "segmentId2", - "segmentId3" - ] - } + "site_id": 113932 } }, "publisher": { @@ -224,67 +89,9 @@ } }, "user": { - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ], "ext": { "rp": { "target": { - "iab": [ - "idToCopy", - "idToCopy2" - ] } } } diff --git a/adapters/rubicon/rubicontest/exemplary/site-imp-fpd.json b/adapters/rubicon/rubicontest/exemplary/site-imp-fpd.json index 87c20e227b1..3d1af246cdc 100644 --- a/adapters/rubicon/rubicontest/exemplary/site-imp-fpd.json +++ b/adapters/rubicon/rubicontest/exemplary/site-imp-fpd.json @@ -39,82 +39,6 @@ ], "attr7": 1.23 } - }, - "content": { - "data": [ - { - "ext": { - "segtax": 1 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "2" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 2 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": 5 - }, - "segment": [ - { - "id": "idToCopy3" - } - ] - }, - { - "ext": { - "segtax": 6 - }, - "segment": [ - { - "id": "idToCopy4" - } - ] - }, - { - "ext": { - "segtax": [ - 2 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ] } }, "user": { @@ -124,61 +48,7 @@ "lat": 47.627500, "lon": -122.346200 }, - "gender": "f", - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ] + "gender": "f" }, "imp": [ { @@ -243,93 +113,9 @@ "page": "somePage", "ref": "someRef", "search": "someSearch", - "content": { - "data": [ - { - "ext": { - "segtax": 1 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "2" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 2 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": 5 - }, - "segment": [ - { - "id": "idToCopy3" - } - ] - }, - { - "ext": { - "segtax": 6 - }, - "segment": [ - { - "id": "idToCopy4" - } - ] - }, - { - "ext": { - "segtax": [ - 2 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ] - }, "ext": { "rp": { - "site_id": 113932, - "target": { - "iab": [ - "idToCopy", - "idToCopy2", - "idToCopy3", - "idToCopy4" - ] - } + "site_id": 113932 } }, "publisher": { @@ -341,67 +127,9 @@ } }, "user": { - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ], "ext": { "rp": { "target": { - "iab": [ - "idToCopy", - "idToCopy2" - ] } } } diff --git a/adapters/rubicon/rubicontest/exemplary/user-fpd.json b/adapters/rubicon/rubicontest/exemplary/user-fpd.json index 42ab0f0babe..81c77c0b007 100644 --- a/adapters/rubicon/rubicontest/exemplary/user-fpd.json +++ b/adapters/rubicon/rubicontest/exemplary/user-fpd.json @@ -18,60 +18,6 @@ "lon": -122.346200 }, "gender": "f", - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ], "keywords": "someKeywords", "ext": { "rp": { @@ -158,60 +104,6 @@ } }, "user": { - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ], "ext": { "rp": { "target": { @@ -225,10 +117,6 @@ ], "dataKey3": [ "true" - ], - "iab": [ - "idToCopy", - "idToCopy2" ] } } diff --git a/adapters/rubicon/rubicontest/supplemental/no-site-content-data.json b/adapters/rubicon/rubicontest/supplemental/no-site-content-data.json index b2f463a95dc..dcff35518a5 100644 --- a/adapters/rubicon/rubicontest/supplemental/no-site-content-data.json +++ b/adapters/rubicon/rubicontest/supplemental/no-site-content-data.json @@ -18,60 +18,6 @@ } }, "user": { - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ] }, "imp": [ { @@ -137,67 +83,9 @@ } }, "user": { - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ], "ext": { "rp": { "target": { - "iab": [ - "idToCopy", - "idToCopy2" - ] } } } diff --git a/adapters/rubicon/rubicontest/supplemental/no-site-content.json b/adapters/rubicon/rubicontest/supplemental/no-site-content.json index 5744b2c9e47..ce9c2b09487 100644 --- a/adapters/rubicon/rubicontest/supplemental/no-site-content.json +++ b/adapters/rubicon/rubicontest/supplemental/no-site-content.json @@ -16,60 +16,6 @@ ] }, "user": { - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ] }, "imp": [ { @@ -133,67 +79,9 @@ } }, "user": { - "data": [ - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy" - } - ] - }, - { - "ext": { - "segtax": "someValue" - }, - "segment": [ - { - "id": "shouldNotBeCopied" - } - ] - }, - { - "ext": { - "segtax": "4" - }, - "segment": [ - { - "id": "shouldNotBeCopied2" - } - ] - }, - { - "ext": { - "segtax": 4 - }, - "segment": [ - { - "id": "idToCopy2" - } - ] - }, - { - "ext": { - "segtax": [ - 4 - ] - }, - "segment": [ - { - "id": "shouldNotBeCopied3" - } - ] - } - ], "ext": { "rp": { "target": { - "iab": [ - "idToCopy", - "idToCopy2" - ] } } } diff --git a/go.mod b/go.mod index c16acc331df..780591cfca7 100644 --- a/go.mod +++ b/go.mod @@ -15,6 +15,7 @@ require ( github.com/docker/go-units v0.4.0 github.com/go-sql-driver/mysql v1.6.0 github.com/gofrs/uuid v4.2.0+incompatible + github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3 github.com/golang/glog v1.1.0 github.com/google/go-cmp v0.6.0 github.com/json-iterator/go v1.1.12 diff --git a/go.sum b/go.sum index 00827d6fb6c..c80b98ee079 100644 --- a/go.sum +++ b/go.sum @@ -135,6 +135,7 @@ github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= +github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= @@ -161,6 +162,8 @@ github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZg github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3 h1:zN2lZNZRflqFyxVaTIU61KNKQ9C0055u9CAfpmqUvo4= +github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3/go.mod h1:nPpo7qLxd6XL3hWJG/O60sR8ZKfMCiIoNap5GvD12KU= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= @@ -316,9 +319,11 @@ github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFB github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/lib/pq v1.10.4 h1:SO9z7FRPzA03QhHKJrH5BXA6HU1rS4V2nIVrrNC1iYk= github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lyft/protoc-gen-star v0.5.3/go.mod h1:V0xaHgaf5oCCqmcxYcWiDfTiKsZsRc87/1qhoTACD8w= @@ -436,6 +441,7 @@ github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqn github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rs/cors v1.8.2 h1:KCooALfAYGs415Cwu5ABvv9n9509fSiG5SQJn/AQo4U= github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= From 2a602909e2ae9322adf4f9087ffa551fda27d403 Mon Sep 17 00:00:00 2001 From: ddubyk Date: Mon, 14 Oct 2024 18:49:31 +0200 Subject: [PATCH 2/4] Fix tests. --- adapters/rubicon/rubicontest/exemplary/segtax-attributes.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/adapters/rubicon/rubicontest/exemplary/segtax-attributes.json b/adapters/rubicon/rubicontest/exemplary/segtax-attributes.json index 7854120b67c..d75fb48f0a7 100644 --- a/adapters/rubicon/rubicontest/exemplary/segtax-attributes.json +++ b/adapters/rubicon/rubicontest/exemplary/segtax-attributes.json @@ -406,6 +406,9 @@ "rp": { "target": { "pbadslot": "pbadslot", + "pbs_login": "xuser", + "pbs_url": "http://hosturl.com", + "pbs_version": "", "pagecat": [ "val1", "val2" From 786b280379cc991a6a8fec0cbfcde4c3a7aa9bed Mon Sep 17 00:00:00 2001 From: ddubyk Date: Tue, 18 Feb 2025 20:58:43 +0100 Subject: [PATCH 3/4] Use `container.list` instead of `collections.Stack` --- adapters/rubicon/rubicon.go | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/adapters/rubicon/rubicon.go b/adapters/rubicon/rubicon.go index 2d4af994d96..5292d03f62f 100644 --- a/adapters/rubicon/rubicon.go +++ b/adapters/rubicon/rubicon.go @@ -1,6 +1,7 @@ package rubicon import ( + "container/list" "encoding/json" "fmt" "net/http" @@ -8,8 +9,6 @@ import ( "strconv" "strings" - "github.com/golang-collections/collections/stack" - "github.com/prebid/prebid-server/v3/version" "github.com/prebid/prebid-server/v3/adapters" @@ -779,8 +778,8 @@ func updateExtWithIabAndSegtaxAttribute(target map[string]interface{}, data []op } } -func getTaxonomyIdToSegments(data []openrtb2.Data) map[int]*stack.Stack { - var taxonomyIdToSegments = make(map[int]*stack.Stack) +func getTaxonomyIdToSegments(data []openrtb2.Data) map[int]*list.List { + var taxonomyIdToSegments = make(map[int]*list.List) for _, dataRecord := range data { if dataRecord.Ext == nil { continue @@ -800,13 +799,13 @@ func getTaxonomyIdToSegments(data []openrtb2.Data) map[int]*stack.Stack { segments, exists := taxonomyIdToSegments[taxonomyId] if !exists { - segments = stack.New() + segments = list.New() taxonomyIdToSegments[taxonomyId] = segments } for _, originalSegment := range originalSegments { if originalSegment.ID != "" { - segments.Push(originalSegment) + segments.PushBack(&list.Element{Value: originalSegment}) } } @@ -818,7 +817,7 @@ func getTaxonomyIdToSegments(data []openrtb2.Data) map[int]*stack.Stack { return taxonomyIdToSegments } -func pickRelevantSegments(taxonomyIdToSegments map[int]*stack.Stack) map[int][]string { +func pickRelevantSegments(taxonomyIdToSegments map[int]*list.List) map[int][]string { var relevantSegments = make(map[int][]string) taxonomyIds := make([]int, 0) @@ -832,7 +831,9 @@ func pickRelevantSegments(taxonomyIdToSegments map[int]*stack.Stack) map[int][]s taxonomyIdIndex := i % len(taxonomyIds) taxonomyId := taxonomyIds[taxonomyIdIndex] currentSegments := taxonomyIdToSegments[taxonomyId] - lastSegment := currentSegments.Pop().(openrtb2.Segment) + + lastElement := currentSegments.Back() + lastSegment := currentSegments.Remove(lastElement).(openrtb2.Segment) if _, exists := relevantSegments[taxonomyId]; !exists { relevantSegments[taxonomyId] = make([]string, 0) From c6f652c8f2394171c9ab97434033cd98d1357ef1 Mon Sep 17 00:00:00 2001 From: ddubyk Date: Tue, 18 Feb 2025 22:59:19 +0100 Subject: [PATCH 4/4] Add unit test and small fixes --- adapters/rubicon/rubicon.go | 3 +- adapters/rubicon/rubicon_test.go | 93 +++++++++++++++++++ .../exemplary/segtax-attributes.json | 6 +- 3 files changed, 95 insertions(+), 7 deletions(-) diff --git a/adapters/rubicon/rubicon.go b/adapters/rubicon/rubicon.go index 5292d03f62f..0e4abcd5728 100644 --- a/adapters/rubicon/rubicon.go +++ b/adapters/rubicon/rubicon.go @@ -832,8 +832,7 @@ func pickRelevantSegments(taxonomyIdToSegments map[int]*list.List) map[int][]str taxonomyId := taxonomyIds[taxonomyIdIndex] currentSegments := taxonomyIdToSegments[taxonomyId] - lastElement := currentSegments.Back() - lastSegment := currentSegments.Remove(lastElement).(openrtb2.Segment) + lastSegment := currentSegments.Remove(currentSegments.Back()).(*list.Element).Value.(openrtb2.Segment) if _, exists := relevantSegments[taxonomyId]; !exists { relevantSegments[taxonomyId] = make([]string, 0) diff --git a/adapters/rubicon/rubicon_test.go b/adapters/rubicon/rubicon_test.go index 06a603b9d71..28eeebe0c4c 100644 --- a/adapters/rubicon/rubicon_test.go +++ b/adapters/rubicon/rubicon_test.go @@ -778,6 +778,99 @@ func TestOpenRTBRequestWithVideoImpAndEnabledRewardedInventoryFlag(t *testing.T) "Unexpected VideoType. Got %s. Expected %s", videoExt.VideoType, "rewarded") } +func TestOpenRTBRequestWithTooManySegments(t *testing.T) { + generateDataEntry := func(segtax int, idFrom int, idTo int) openrtb2.Data { + segment := make([]openrtb2.Segment, idTo-idFrom) + + for i := 0; i < idTo-idFrom; i++ { + segment[i] = openrtb2.Segment{ + ID: strconv.Itoa(idFrom + i), + } + } + + return openrtb2.Data{ + Segment: segment, + Ext: json.RawMessage(`{"segtax": ` + strconv.Itoa(segtax) + `}`), + } + } + + bidder := new(RubiconAdapter) + + request := &openrtb2.BidRequest{ + ID: "test-request-id", + Imp: []openrtb2.Imp{{ + ID: "test-imp-id", + Banner: &openrtb2.Banner{ + Format: []openrtb2.Format{ + {W: 300, H: 250}, + }, + }, + Ext: json.RawMessage(`{ + "bidder": { + "zoneId": 8394, + "siteId": 283282, + "accountId": 7891 + } + }`), + }}, + App: &openrtb2.App{ + ID: "com.test", + Name: "testApp", + }, + User: &openrtb2.User{ + Data: []openrtb2.Data{ + generateDataEntry(4, 1, 50), + generateDataEntry(4, 50, 150), + }, + }, + Site: &openrtb2.Site{ + Content: &openrtb2.Content{ + Data: []openrtb2.Data{ + generateDataEntry(5, 50, 100), + generateDataEntry(6, 100, 150), + generateDataEntry(500, 3, 8), + generateDataEntry(600, 1, 2), + }, + }, + }, + } + + reqs, _ := bidder.MakeRequests(request, &adapters.ExtraRequestInfo{}) + + rubiconReq := &openrtb2.BidRequest{} + reqErr := json.Unmarshal(reqs[0].Body, rubiconReq) + assert.NoError(t, reqErr, "Unexpected error while decoding request.") + + userExt := &rubiconUserExt{} + userErr := json.Unmarshal(rubiconReq.User.Ext, userExt) + assert.NoError(t, userErr, "Error unmarshalling request.user.ext object.") + userExtRpTarget := map[string][]string{} + userErr = json.Unmarshal(userExt.RP.Target, &userExtRpTarget) + assert.NoError(t, userErr, "Error unmarshalling request.user.ext.rp.target object.") + + siteExt := &rubiconSiteExt{} + siteErr := json.Unmarshal(rubiconReq.Site.Ext, siteExt) + assert.NoError(t, siteErr, "Error unmarshalling request.site.ext object.") + siteExtRpTarget := map[string][]string{} + siteErr = json.Unmarshal(siteExt.RP.Target, &siteExtRpTarget) + assert.NoError(t, userErr, "Error unmarshalling request.site.ext.rp.target object.") + + generateDescRange := func(from int, to int) []string { + a := make([]string, to-from) + for i := 0; i < to-from; i++ { + a[i] = strconv.Itoa(to - i - 1) + } + + return a + } + + assert.Equal(t, userExtRpTarget["iab"], generateDescRange(50, 150)) + + assert.ElementsMatch(t, siteExtRpTarget["iab"], append(generateDescRange(53, 100), generateDescRange(103, 150)...)) + assert.ElementsMatch(t, siteExtRpTarget["tax500"], generateDescRange(3, 8)) + assert.ElementsMatch(t, siteExtRpTarget["tax600"], generateDescRange(1, 2)) +} + func TestOpenRTBEmptyResponse(t *testing.T) { httpResp := &adapters.ResponseData{ StatusCode: http.StatusNoContent, diff --git a/adapters/rubicon/rubicontest/exemplary/segtax-attributes.json b/adapters/rubicon/rubicontest/exemplary/segtax-attributes.json index d75fb48f0a7..526e02c52a1 100644 --- a/adapters/rubicon/rubicontest/exemplary/segtax-attributes.json +++ b/adapters/rubicon/rubicontest/exemplary/segtax-attributes.json @@ -408,11 +408,7 @@ "pbadslot": "pbadslot", "pbs_login": "xuser", "pbs_url": "http://hosturl.com", - "pbs_version": "", - "pagecat": [ - "val1", - "val2" - ] + "pbs_version": "" }, "track": { "mint": "",