diff --git a/adapters/bidmyadz/bidmyadz.go b/adapters/bidmyadz/bidmyadz.go new file mode 100644 index 00000000000..829d57e606f --- /dev/null +++ b/adapters/bidmyadz/bidmyadz.go @@ -0,0 +1,157 @@ +package bidmyadz + +import ( + "encoding/json" + "fmt" + "github.com/mxmCherry/openrtb/v15/openrtb2" + "github.com/prebid/prebid-server/adapters" + "github.com/prebid/prebid-server/config" + "github.com/prebid/prebid-server/errortypes" + "github.com/prebid/prebid-server/openrtb_ext" + "net/http" +) + +type adapter struct { + endpoint string +} + +type bidExt struct { + MediaType string `json:"mediaType"` +} + +func Builder(bidderName openrtb_ext.BidderName, config config.Adapter) (adapters.Bidder, error) { + bidder := &adapter{ + endpoint: config.Endpoint, + } + return bidder, nil +} + +func (a *adapter) MakeRequests( + openRTBRequest *openrtb2.BidRequest, + reqInfo *adapters.ExtraRequestInfo, +) ( + requestsToBidder []*adapters.RequestData, + errs []error, +) { + + var errors []error + + if len(openRTBRequest.Imp) > 1 { + errors = append(errors, &errortypes.BadInput{ + Message: "Bidder does not support multi impression", + }) + } + + if openRTBRequest.Device.IP == "" && openRTBRequest.Device.IPv6 == "" { + errors = append(errors, &errortypes.BadInput{ + Message: "IP/IPv6 is a required field", + }) + } + + if openRTBRequest.Device.UA == "" { + errors = append(errors, &errortypes.BadInput{ + Message: "User-Agent is a required field", + }) + } + + if len(errors) != 0 { + return nil, errors + } + + reqJSON, err := json.Marshal(openRTBRequest) + if err != nil { + return nil, []error{err} + } + + headers := http.Header{} + headers.Add("Content-Type", "application/json;charset=utf-8") + headers.Add("Accept", "application/json") + headers.Add("X-Openrtb-Version", "2.5") + + return []*adapters.RequestData{{ + Method: http.MethodPost, + Body: reqJSON, + Uri: a.endpoint, + Headers: headers, + }}, nil +} + +func (a *adapter) MakeBids( + openRTBRequest *openrtb2.BidRequest, + requestToBidder *adapters.RequestData, + bidderRawResponse *adapters.ResponseData, +) ( + bidderResponse *adapters.BidderResponse, + errs []error, +) { + if bidderRawResponse.StatusCode == http.StatusNoContent { + return nil, nil + } + + if bidderRawResponse.StatusCode == http.StatusBadRequest { + return nil, []error{&errortypes.BadInput{ + Message: fmt.Sprintf("Bad Request. %s", string(bidderRawResponse.Body)), + }} + } + + if bidderRawResponse.StatusCode == http.StatusServiceUnavailable { + return nil, []error{&errortypes.BadServerResponse{ + Message: "Bidder is unavailable. Please contact your account manager.", + }} + } + + if bidderRawResponse.StatusCode != http.StatusOK { + return nil, []error{&errortypes.BadServerResponse{ + Message: fmt.Sprintf("Something went wrong. Status Code: [ %d ] %s", bidderRawResponse.StatusCode, string(bidderRawResponse.Body)), + }} + } + + responseBody := bidderRawResponse.Body + var bidResp openrtb2.BidResponse + if err := json.Unmarshal(responseBody, &bidResp); err != nil { + return nil, []error{err} + } + + if len(bidResp.SeatBid) == 0 { + return nil, []error{&errortypes.BadServerResponse{ + Message: "Empty SeatBid", + }} + } + + bidResponse := adapters.NewBidderResponseWithBidsCapacity(1) + + bids := bidResp.SeatBid[0].Bid + + if len(bids) == 0 { + return nil, []error{&errortypes.BadServerResponse{ + Message: "Empty SeatBid.Bids", + }} + } + + bid := bids[0] + + var bidExt bidExt + var bidType openrtb_ext.BidType + + if err := json.Unmarshal(bid.Ext, &bidExt); err != nil { + return nil, []error{&errortypes.BadServerResponse{ + Message: fmt.Sprintf("BidExt parsing error. %s", err.Error()), + }} + } + + bidType, err := getBidType(bidExt) + + if err != nil { + return nil, []error{err} + } + + bidResponse.Bids = append(bidResponse.Bids, &adapters.TypedBid{ + Bid: &bid, + BidType: bidType, + }) + return bidResponse, nil +} + +func getBidType(ext bidExt) (openrtb_ext.BidType, error) { + return openrtb_ext.ParseBidType(ext.MediaType) +} diff --git a/adapters/bidmyadz/bidmyadz_test.go b/adapters/bidmyadz/bidmyadz_test.go new file mode 100644 index 00000000000..b0de6a02956 --- /dev/null +++ b/adapters/bidmyadz/bidmyadz_test.go @@ -0,0 +1,18 @@ +package bidmyadz + +import ( + "github.com/stretchr/testify/assert" + "testing" + + "github.com/prebid/prebid-server/adapters/adapterstest" + "github.com/prebid/prebid-server/config" + "github.com/prebid/prebid-server/openrtb_ext" +) + +func TestJsonSamples(t *testing.T) { + bidder, buildErr := Builder(openrtb_ext.BidderBidmyadz, config.Adapter{ + Endpoint: "http://endpoint.bidmyadz.com/c0f68227d14ed938c6c49f3967cbe9bc"}) + + assert.NoError(t, buildErr) + adapterstest.RunJSONBidderTest(t, "bidmyadztest", bidder) +} diff --git a/adapters/bidmyadz/bidmyadztest/exemplary/banner.json b/adapters/bidmyadz/bidmyadztest/exemplary/banner.json new file mode 100644 index 00000000000..460291bc4f0 --- /dev/null +++ b/adapters/bidmyadz/bidmyadztest/exemplary/banner.json @@ -0,0 +1,146 @@ +{ + "mockBidRequest": { + "id": "12345", + "imp": [{ + "id": "1", + "secure": 1, + "bidfloor": 0.31, + "bidfloorcur": "USD", + "banner": { + "w": 300, + "h": 250 + }, + "ext": { + "bidder": { + "placementId": "tbanner" + } + } + }], + "device": { + "ua": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36", + "geo": { + "country": "USA", + "lat": 47.627500, + "lon": -122.346200 + }, + "ip": "18.146.18.241", + "devicetype": 2 + }, + "user": { + "id": "a66e61ff8c2ab5460ecf156c4b892fd84d41fad5" + }, + "site": { + "id": "banner", + "domain": "test.com", + "cat": ["IAB1"], + "page": "https://test.com", + "publisher": { + "id": "1" + } + } + }, + + "httpCalls": [ + { + "expectedRequest": { + "uri": "http://endpoint.bidmyadz.com/c0f68227d14ed938c6c49f3967cbe9bc", + "body": { + "id": "12345", + "imp": [{ + "id": "1", + "secure": 1, + "bidfloor": 0.31, + "bidfloorcur": "USD", + "banner": { + "w": 300, + "h": 250 + }, + "ext": { + "bidder": { + "placementId": "tbanner" + } + } + }], + "device": { + "ua": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36", + "geo": { + "country": "USA", + "lat": 47.627500, + "lon": -122.346200 + }, + "ip": "18.146.18.241", + "devicetype": 2 + }, + "user": { + "id": "a66e61ff8c2ab5460ecf156c4b892fd84d41fad5" + }, + "site": { + "id": "banner", + "domain": "test.com", + "cat": ["IAB1"], + "page": "https://test.com", + "publisher": { + "id": "1" + } + } + } + }, + "mockResponse": { + "status": 200, + "body": { + "id": "d910ceef496ff2d746176506e296f4b3_z53356_a126365", + "bidid": "880184da7ec02b1f42802acb46b63b3c", + "seatbid": [{ + "bid": [{ + "id": "6ca51ef38eb42820d27503ee96b634b5", + "impid": "126365", + "price": 0.1, + "nurl": "http://test.com/nurl", + "burl": "http://test.com/burl", + "adm": "", + "adomain": ["test.com"], + "cat": ["IAB1"], + "cid": "1", + "crid": "1", + "w": 300, + "h": 250, + "ext": { + "mediaType": "banner" + } + }], + "seat": "1" + }], + "cur": "USD" + } + } + } + ], + + "expectedBidResponses": [ + { + "currency": "USD", + "bids": [ + { + "bid": { + "id": "6ca51ef38eb42820d27503ee96b634b5", + "impid": "126365", + "price": 0.1, + "nurl": "http://test.com/nurl", + "burl": "http://test.com/burl", + "adm": "", + "adomain": ["test.com"], + "cat": ["IAB1"], + "cid": "1", + "crid": "1", + "w": 300, + "h": 250, + "ext": { + "mediaType": "banner" + } + }, + "type": "banner" + } + ] + } + ] +} \ No newline at end of file diff --git a/adapters/bidmyadz/bidmyadztest/exemplary/native.json b/adapters/bidmyadz/bidmyadztest/exemplary/native.json new file mode 100644 index 00000000000..984802601c0 --- /dev/null +++ b/adapters/bidmyadz/bidmyadztest/exemplary/native.json @@ -0,0 +1,141 @@ +{ + "mockBidRequest": { + "id": "111", + "tmax": 150, + "at": 1, + "device": { + "dnt": 0, + "devicetype": 2, + "ip": "71.106.52.124", + "ua": "Mozilla/5.0 (X11; Linux x86_64; Ubuntu 14.04.2 LTS) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.0 Maxthon/1.0.5.3 Safari/537.36" + }, + "user": { + "id": "user-id" + }, + "site": { + "id": "native", + "domain": "test.com", + "cat": ["IAB1"], + "page": "https://test.com", + "publisher": { + "id": "1" + } + }, + "cur": [ + "USD" + ], + "imp": [{ + "id": "1", + "bidfloor": 0.01, + "bidfloorcur": "USD", + "instl": 0, + "secure": 1, + "native": { + "request": "{\"ver\":\"1.1\",\"layout\":1,\"adunit\":2,\"plcmtcnt\":6,\"plcmttype\":4,\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":15}},{\"id\":2,\"required\":1,\"img\":{\"wmin\":300,\"hmin\":300,\"type\":3}}, {\"id\":6,\"required\":0,\"data\":{\"type\":1,\"len\":20}}]}", + "ver": "1.1" + }, + "ext": { + "bidder": { + "placementId": "tnative" + } + } + }] + }, + + "httpCalls": [{ + "expectedRequest": { + "uri": "http://endpoint.bidmyadz.com/c0f68227d14ed938c6c49f3967cbe9bc", + "body": { + "id": "111", + "tmax": 150, + "at": 1, + "device": { + "dnt": 0, + "devicetype": 2, + "ip": "71.106.52.124", + "ua": "Mozilla/5.0 (X11; Linux x86_64; Ubuntu 14.04.2 LTS) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.0 Maxthon/1.0.5.3 Safari/537.36" + }, + "user": { + "id": "user-id" + }, + "site": { + "id": "native", + "domain": "test.com", + "cat": ["IAB1"], + "page": "https://test.com", + "publisher": { + "id": "1" + } + }, + "cur": [ + "USD" + ], + "imp": [{ + "id": "1", + "bidfloor": 0.01, + "bidfloorcur": "USD", + "secure": 1, + "native": { + "request": "{\"ver\":\"1.1\",\"layout\":1,\"adunit\":2,\"plcmtcnt\":6,\"plcmttype\":4,\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":15}},{\"id\":2,\"required\":1,\"img\":{\"wmin\":300,\"hmin\":300,\"type\":3}}, {\"id\":6,\"required\":0,\"data\":{\"type\":1,\"len\":20}}]}", + "ver": "1.1" + }, + "ext": { + "bidder": { + "placementId": "tnative" + } + } + }] + } + }, + "mockResponse": { + "status": 200, + "body": { + "id": "a1580f2f-be6d-11eb-a150-d094662c1c35", + "bidid": "359da97d0384d8a14767029c18fd840d", + "seatbid": [{ + "bid": [{ + "id": "1", + "impid": "1", + "price": 0.1, + "nurl": "http://test.com/nurl", + "burl": "http://test.com/burl", + "adm": "{native-ads}", + "adomain": ["test.com"], + "cat": ["IAB1"], + "cid": "1", + "crid": "2", + "w": 0, + "h": 0, + "ext": { + "mediaType": "native" + } + }], + "seat": "1" + }], + "cur": "USD" + } + } + }], + + "expectedBidResponses": [{ + "currency": "USD", + "bids": [{ + "bid": { + "id": "1", + "impid": "1", + "price": 0.1, + "nurl": "http://test.com/nurl", + "burl": "http://test.com/burl", + "adm": "{native-ads}", + "adomain": ["test.com"], + "cat": ["IAB1"], + "cid": "1", + "crid": "2", + "ext": { + "mediaType": "native" + } + }, + "type": "native" + }] + }] +} \ No newline at end of file diff --git a/adapters/bidmyadz/bidmyadztest/exemplary/video.json b/adapters/bidmyadz/bidmyadztest/exemplary/video.json new file mode 100644 index 00000000000..92c42f8331a --- /dev/null +++ b/adapters/bidmyadz/bidmyadztest/exemplary/video.json @@ -0,0 +1,160 @@ +{ + "mockBidRequest": { + "id": "12345", + "imp": [{ + "id": "1", + "video": { + "mimes": ["video/mp4", "video/ogg", "video/webm"], + "minduration": 5, + "maxduration": 60, + "protocols": [2, 3, 5, 6, 7, 8], + "w": 300, + "h": 250, + "linearity": 1, + "playbackmethod": [2] + }, + "bidfloor": 0.001, + "bidfloorcur": "USD", + "secure": 1, + "exp": 3600, + "ext": { + "bidder": { + "placementId": "tvideo" + } + } + }], + "device": { + "ua": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36", + "geo": { + "country": "USA", + "lat": 47.627500, + "lon": -122.346200 + }, + "ip": "18.146.18.241", + "devicetype": 2 + }, + "user": { + "id": "a66e61ff8c2ab5460ecf156c4b892fd84d41fad5" + }, + "site": { + "id": "banner", + "domain": "test.com", + "cat": ["IAB1"], + "page": "https://test.com", + "publisher": { + "id": "1" + } + } + }, + + "httpCalls": [ + { + "expectedRequest": { + "uri": "http://endpoint.bidmyadz.com/c0f68227d14ed938c6c49f3967cbe9bc", + "body": { + "id": "12345", + "imp": [{ + "id": "1", + "video": { + "mimes": ["video/mp4", "video/ogg", "video/webm"], + "minduration": 5, + "maxduration": 60, + "protocols": [2, 3, 5, 6, 7, 8], + "w": 300, + "h": 250, + "linearity": 1, + "playbackmethod": [2] + }, + "bidfloor": 0.001, + "bidfloorcur": "USD", + "secure": 1, + "exp": 3600, + "ext": { + "bidder": { + "placementId": "tvideo" + } + } + }], + "device": { + "ua": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36", + "geo": { + "country": "USA", + "lat": 47.627500, + "lon": -122.346200 + }, + "ip": "18.146.18.241", + "devicetype": 2 + }, + "user": { + "id": "a66e61ff8c2ab5460ecf156c4b892fd84d41fad5" + }, + "site": { + "id": "banner", + "domain": "test.com", + "cat": ["IAB1"], + "page": "https://test.com", + "publisher": { + "id": "1" + } + } + } + }, + "mockResponse": { + "status": 200, + "body": { + "id": "d910ceef496ff2d746176506e296f4b3_z53356_a126365", + "bidid": "880184da7ec02b1f42802acb46b63b3c", + "seatbid": [{ + "bid": [{ + "id": "6ca51ef38eb42820d27503ee96b634b5", + "impid": "126365", + "price": 0.1, + "nurl": "http://test.com/nurl", + "burl": "http://test.com/burl", + "adm": "", + "adomain": ["test.com"], + "cat": ["IAB1"], + "cid": "1", + "crid": "1", + "w": 300, + "h": 250, + "ext": { + "mediaType": "video" + } + }], + "seat": "1" + }], + "cur": "USD" + } + } + } + ], + + "expectedBidResponses": [ + { + "currency": "USD", + "bids": [ + { + "bid": { + "id": "6ca51ef38eb42820d27503ee96b634b5", + "impid": "126365", + "price": 0.1, + "nurl": "http://test.com/nurl", + "burl": "http://test.com/burl", + "adm": "", + "adomain": ["test.com"], + "cat": ["IAB1"], + "cid": "1", + "crid": "1", + "w": 300, + "h": 250, + "ext": { + "mediaType": "video" + } + }, + "type": "video" + } + ] + } + ] +} \ No newline at end of file diff --git a/adapters/bidmyadz/bidmyadztest/params/race/banner.json b/adapters/bidmyadz/bidmyadztest/params/race/banner.json new file mode 100644 index 00000000000..18dce42f2c4 --- /dev/null +++ b/adapters/bidmyadz/bidmyadztest/params/race/banner.json @@ -0,0 +1,3 @@ +{ + "placementId": "tbanner" +} \ No newline at end of file diff --git a/adapters/bidmyadz/bidmyadztest/params/race/native.json b/adapters/bidmyadz/bidmyadztest/params/race/native.json new file mode 100644 index 00000000000..0600af3a894 --- /dev/null +++ b/adapters/bidmyadz/bidmyadztest/params/race/native.json @@ -0,0 +1,3 @@ +{ + "placementId": "tnative" +} \ No newline at end of file diff --git a/adapters/bidmyadz/bidmyadztest/params/race/video.json b/adapters/bidmyadz/bidmyadztest/params/race/video.json new file mode 100644 index 00000000000..85478bf22c5 --- /dev/null +++ b/adapters/bidmyadz/bidmyadztest/params/race/video.json @@ -0,0 +1,3 @@ +{ + "placementId": "tvideo" +} \ No newline at end of file diff --git a/adapters/bidmyadz/bidmyadztest/supplemental/invalid-device-fields.json b/adapters/bidmyadz/bidmyadztest/supplemental/invalid-device-fields.json new file mode 100644 index 00000000000..d620a050632 --- /dev/null +++ b/adapters/bidmyadz/bidmyadztest/supplemental/invalid-device-fields.json @@ -0,0 +1,48 @@ +{ + "mockBidRequest": { + "id": "12345", + "imp": [{ + "id": "1", + "secure": 1, + "bidfloor": 0.31, + "bidfloorcur": "USD", + "banner": { + "w": 300, + "h": 250 + }, + "ext": { + "bidder": { + "placementId": "tbanner" + } + } + }], + "device": { + "geo": { + "country": "USA", + "lat": 47.627500, + "lon": -122.346200 + }, + "devicetype": 2 + }, + "user": { + "id": "460ecf1d41fa6656c4b892fd84e61ff8c2ab5ad5" + }, + "site": { + "id": "banner", + "domain": "test.com", + "cat": ["IAB1"], + "page": "https://test.com", + "publisher": { + "id": "test" + } + } + }, + + "expectedMakeRequestsErrors": [{ + "value": "IP/IPv6 is a required field", + "comparison": "literal" + }, { + "value": "User-Agent is a required field", + "comparison": "literal" + }] +} \ No newline at end of file diff --git a/adapters/bidmyadz/bidmyadztest/supplemental/invalid-multi-imps.json b/adapters/bidmyadz/bidmyadztest/supplemental/invalid-multi-imps.json new file mode 100644 index 00000000000..09020fc89e9 --- /dev/null +++ b/adapters/bidmyadz/bidmyadztest/supplemental/invalid-multi-imps.json @@ -0,0 +1,61 @@ +{ + "mockBidRequest": { + "id": "12345", + "imp": [{ + "id": "1", + "secure": 1, + "bidfloor": 0.31, + "bidfloorcur": "USD", + "banner": { + "w": 300, + "h": 250 + }, + "ext": { + "bidder": { + "placementId": "tbanner" + } + } + }, { + "id": "1", + "secure": 1, + "bidfloor": 0.11, + "bidfloorcur": "USD", + "banner": { + "w": 320, + "h": 50 + }, + "ext": { + "bidder": { + "placementId": "3234" + } + } + }], + "device": { + "ua": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36", + "geo": { + "country": "USA", + "lat": 47.627500, + "lon": -122.346200 + }, + "ip": "18.146.18.241", + "devicetype": 2 + }, + "user": { + "id": "460ecf1d41fa6656c4b892fd84e61ff8c2ab5ad5" + }, + "site": { + "id": "banner", + "domain": "test.com", + "cat": ["IAB1"], + "page": "https://test.com", + "publisher": { + "id": "test" + } + } + }, + + "expectedMakeRequestsErrors": [{ + "value": "Bidder does not support multi impression", + "comparison": "literal" + }] +} \ No newline at end of file diff --git a/adapters/bidmyadz/bidmyadztest/supplemental/missing-mediatype.json b/adapters/bidmyadz/bidmyadztest/supplemental/missing-mediatype.json new file mode 100644 index 00000000000..486d7324dfc --- /dev/null +++ b/adapters/bidmyadz/bidmyadztest/supplemental/missing-mediatype.json @@ -0,0 +1,122 @@ +{ + "mockBidRequest": { + "id": "12345", + "imp": [{ + "id": "1", + "secure": 1, + "bidfloor": 0.31, + "bidfloorcur": "USD", + "banner": { + "w": 300, + "h": 250 + }, + "ext": { + "bidder": { + "placementId": "tbanner" + } + } + }], + "device": { + "ua": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36", + "geo": { + "country": "USA", + "lat": 47.627500, + "lon": -122.346200 + }, + "ip": "18.146.18.241", + "devicetype": 2 + }, + "user": { + "id": "a66e61ff8c2ab5460ecf156c4b892fd84d41fad5" + }, + "site": { + "id": "banner", + "domain": "test.com", + "cat": ["IAB1"], + "page": "https://test.com", + "publisher": { + "id": "1" + } + } + }, + + "httpCalls": [ + { + "expectedRequest": { + "uri": "http://endpoint.bidmyadz.com/c0f68227d14ed938c6c49f3967cbe9bc", + "body": { + "id": "12345", + "imp": [{ + "id": "1", + "secure": 1, + "bidfloor": 0.31, + "bidfloorcur": "USD", + "banner": { + "w": 300, + "h": 250 + }, + "ext": { + "bidder": { + "placementId": "tbanner" + } + } + }], + "device": { + "ua": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36", + "geo": { + "country": "USA", + "lat": 47.627500, + "lon": -122.346200 + }, + "ip": "18.146.18.241", + "devicetype": 2 + }, + "user": { + "id": "a66e61ff8c2ab5460ecf156c4b892fd84d41fad5" + }, + "site": { + "id": "banner", + "domain": "test.com", + "cat": ["IAB1"], + "page": "https://test.com", + "publisher": { + "id": "1" + } + } + } + }, + "mockResponse": { + "status": 200, + "body": { + "id": "d910ceef496ff2d746176506e296f4b3_z53356_a126365", + "bidid": "880184da7ec02b1f42802acb46b63b3c", + "seatbid": [{ + "bid": [{ + "id": "6ca51ef38eb42820d27503ee96b634b5", + "impid": "126365", + "price": 0.1, + "nurl": "http://test.com/nurl", + "burl": "http://test.com/burl", + "adm": "", + "adomain": ["test.com"], + "cat": ["IAB1"], + "cid": "1", + "crid": "1", + "w": 300, + "h": 250 + }], + "seat": "1" + }], + "cur": "USD" + } + } + } + ], + + "expectedMakeBidsErrors": [ + { + "value": "BidExt parsing error. unexpected end of JSON input", + "comparison": "literal" + } + ] +} \ No newline at end of file diff --git a/adapters/bidmyadz/bidmyadztest/supplemental/response-without-bids.json b/adapters/bidmyadz/bidmyadztest/supplemental/response-without-bids.json new file mode 100644 index 00000000000..fe3361f69d8 --- /dev/null +++ b/adapters/bidmyadz/bidmyadztest/supplemental/response-without-bids.json @@ -0,0 +1,109 @@ +{ + "mockBidRequest": { + "id": "12345", + "imp": [{ + "id": "1", + "secure": 1, + "bidfloor": 0.31, + "bidfloorcur": "USD", + "banner": { + "w": 300, + "h": 250 + }, + "ext": { + "bidder": { + "placementId": "tbanner" + } + } + }], + "device": { + "ua": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36", + "geo": { + "country": "USA", + "lat": 47.627500, + "lon": -122.346200 + }, + "ip": "18.146.18.241", + "devicetype": 2 + }, + "user": { + "id": "a66e61ff8c2ab5460ecf156c4b892fd84d41fad5" + }, + "site": { + "id": "banner", + "domain": "test.com", + "cat": ["IAB1"], + "page": "https://test.com", + "publisher": { + "id": "1" + } + } + }, + + "httpCalls": [ + { + "expectedRequest": { + "uri": "http://endpoint.bidmyadz.com/c0f68227d14ed938c6c49f3967cbe9bc", + "body": { + "id": "12345", + "imp": [{ + "id": "1", + "secure": 1, + "bidfloor": 0.31, + "bidfloorcur": "USD", + "banner": { + "w": 300, + "h": 250 + }, + "ext": { + "bidder": { + "placementId": "tbanner" + } + } + }], + "device": { + "ua": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36", + "geo": { + "country": "USA", + "lat": 47.627500, + "lon": -122.346200 + }, + "ip": "18.146.18.241", + "devicetype": 2 + }, + "user": { + "id": "a66e61ff8c2ab5460ecf156c4b892fd84d41fad5" + }, + "site": { + "id": "banner", + "domain": "test.com", + "cat": ["IAB1"], + "page": "https://test.com", + "publisher": { + "id": "1" + } + } + } + }, + "mockResponse": { + "status": 200, + "body": { + "id": "d910ceef496ff2d746176506e296f4b3_z53356_a126365", + "bidid": "880184da7ec02b1f42802acb46b63b3c", + "seatbid": [{ + "bid": [], + "seat": "1" + }], + "cur": "USD" + } + } + } + ], + + "expectedMakeBidsErrors": [ + { + "value": "Empty SeatBid.Bids", + "comparison": "literal" + } + ] +} \ No newline at end of file diff --git a/adapters/bidmyadz/bidmyadztest/supplemental/response-without-seatbid.json b/adapters/bidmyadz/bidmyadztest/supplemental/response-without-seatbid.json new file mode 100644 index 00000000000..727e745e762 --- /dev/null +++ b/adapters/bidmyadz/bidmyadztest/supplemental/response-without-seatbid.json @@ -0,0 +1,106 @@ +{ + "mockBidRequest": { + "id": "12345", + "imp": [{ + "id": "1", + "secure": 1, + "bidfloor": 0.31, + "bidfloorcur": "USD", + "banner": { + "w": 300, + "h": 250 + }, + "ext": { + "bidder": { + "placementId": "tbanner" + } + } + }], + "device": { + "ua": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36", + "geo": { + "country": "USA", + "lat": 47.627500, + "lon": -122.346200 + }, + "ip": "18.146.18.241", + "devicetype": 2 + }, + "user": { + "id": "a66e61ff8c2ab5460ecf156c4b892fd84d41fad5" + }, + "site": { + "id": "banner", + "domain": "test.com", + "cat": ["IAB1"], + "page": "https://test.com", + "publisher": { + "id": "1" + } + } + }, + + "httpCalls": [ + { + "expectedRequest": { + "uri": "http://endpoint.bidmyadz.com/c0f68227d14ed938c6c49f3967cbe9bc", + "body": { + "id": "12345", + "imp": [{ + "id": "1", + "secure": 1, + "bidfloor": 0.31, + "bidfloorcur": "USD", + "banner": { + "w": 300, + "h": 250 + }, + "ext": { + "bidder": { + "placementId": "tbanner" + } + } + }], + "device": { + "ua": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36", + "geo": { + "country": "USA", + "lat": 47.627500, + "lon": -122.346200 + }, + "ip": "18.146.18.241", + "devicetype": 2 + }, + "user": { + "id": "a66e61ff8c2ab5460ecf156c4b892fd84d41fad5" + }, + "site": { + "id": "banner", + "domain": "test.com", + "cat": ["IAB1"], + "page": "https://test.com", + "publisher": { + "id": "1" + } + } + } + }, + "mockResponse": { + "status": 200, + "body": { + "id": "d910ceef496ff2d746176506e296f4b3_z53356_a126365", + "bidid": "880184da7ec02b1f42802acb46b63b3c", + "seatbid": [], + "cur": "USD" + } + } + } + ], + + "expectedMakeBidsErrors": [ + { + "value": "Empty SeatBid", + "comparison": "literal" + } + ] +} \ No newline at end of file diff --git a/adapters/bidmyadz/bidmyadztest/supplemental/status-204.json b/adapters/bidmyadz/bidmyadztest/supplemental/status-204.json new file mode 100644 index 00000000000..05efda0e9f3 --- /dev/null +++ b/adapters/bidmyadz/bidmyadztest/supplemental/status-204.json @@ -0,0 +1,94 @@ +{ + "mockBidRequest": { + "id": "12345", + "imp": [{ + "id": "1", + "secure": 1, + "bidfloor": 0.31, + "bidfloorcur": "USD", + "banner": { + "w": 300, + "h": 250 + }, + "ext": { + "bidder": { + "placementId": "tbanner" + } + } + }], + "device": { + "ua": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36", + "geo": { + "country": "USA", + "lat": 47.627500, + "lon": -122.346200 + }, + "ip": "18.146.18.241", + "devicetype": 2 + }, + "user": { + "id": "460ecf1d41fa6656c4b892fd84e61ff8c2ab5ad5" + }, + "site": { + "id": "banner", + "domain": "test.com", + "cat": ["IAB1"], + "page": "https://test.com", + "publisher": { + "id": "test" + } + } + }, + + "httpCalls": [ + { + "expectedRequest": { + "uri": "http://endpoint.bidmyadz.com/c0f68227d14ed938c6c49f3967cbe9bc", + "body": { + "id": "12345", + "imp": [{ + "id": "1", + "secure": 1, + "bidfloor": 0.31, + "bidfloorcur": "USD", + "banner": { + "w": 300, + "h": 250 + }, + "ext": { + "bidder": { + "placementId": "tbanner" + } + } + }], + "device": { + "ua": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36", + "geo": { + "country": "USA", + "lat": 47.627500, + "lon": -122.346200 + }, + "ip": "18.146.18.241", + "devicetype": 2 + }, + "user": { + "id": "460ecf1d41fa6656c4b892fd84e61ff8c2ab5ad5" + }, + "site": { + "id": "banner", + "domain": "test.com", + "cat": ["IAB1"], + "page": "https://test.com", + "publisher": { + "id": "test" + } + } + } + }, + "mockResponse": { + "status": 204, + "body": {} + } + } + ] +} \ No newline at end of file diff --git a/adapters/bidmyadz/bidmyadztest/supplemental/status-400.json b/adapters/bidmyadz/bidmyadztest/supplemental/status-400.json new file mode 100644 index 00000000000..e24acdc6766 --- /dev/null +++ b/adapters/bidmyadz/bidmyadztest/supplemental/status-400.json @@ -0,0 +1,101 @@ +{ + "mockBidRequest": { + "id": "12345", + "imp": [{ + "id": "1", + "secure": 1, + "bidfloor": 0.31, + "bidfloorcur": "USD", + "banner": { + "w": 300, + "h": 250 + }, + "ext": { + "bidder": { + "placementId": "tbanner" + } + } + }], + "device": { + "ua": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36", + "geo": { + "country": "USA", + "lat": 47.627500, + "lon": -122.346200 + }, + "ip": "18.146.18.241", + "devicetype": 2 + }, + "user": { + "id": "460ecf1d41fa6656c4b892fd84e61ff8c2ab5ad5" + }, + "site": { + "id": "banner", + "domain": "test.com", + "cat": ["IAB1"], + "page": "https://test.com", + "publisher": { + "id": "test" + } + } + }, + + "httpCalls": [ + { + "expectedRequest": { + "uri": "http://endpoint.bidmyadz.com/c0f68227d14ed938c6c49f3967cbe9bc", + "body": { + "id": "12345", + "imp": [{ + "id": "1", + "secure": 1, + "bidfloor": 0.31, + "bidfloorcur": "USD", + "banner": { + "w": 300, + "h": 250 + }, + "ext": { + "bidder": { + "placementId": "tbanner" + } + } + }], + "device": { + "ua": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36", + "geo": { + "country": "USA", + "lat": 47.627500, + "lon": -122.346200 + }, + "ip": "18.146.18.241", + "devicetype": 2 + }, + "user": { + "id": "460ecf1d41fa6656c4b892fd84e61ff8c2ab5ad5" + }, + "site": { + "id": "banner", + "domain": "test.com", + "cat": ["IAB1"], + "page": "https://test.com", + "publisher": { + "id": "test" + } + } + } + }, + "mockResponse": { + "status": 400, + "body": "Source blocked" + } + } + ], + + "expectedMakeBidsErrors": [ + { + "value": "Bad Request. \"Source blocked\"", + "comparison": "literal" + } + ] +} \ No newline at end of file diff --git a/adapters/bidmyadz/bidmyadztest/supplemental/status-service-unavailable.json b/adapters/bidmyadz/bidmyadztest/supplemental/status-service-unavailable.json new file mode 100644 index 00000000000..13e22f55889 --- /dev/null +++ b/adapters/bidmyadz/bidmyadztest/supplemental/status-service-unavailable.json @@ -0,0 +1,100 @@ +{ + "mockBidRequest": { + "id": "12345", + "imp": [{ + "id": "1", + "secure": 1, + "bidfloor": 0.31, + "bidfloorcur": "USD", + "banner": { + "w": 300, + "h": 250 + }, + "ext": { + "bidder": { + "placementId": "tbanner" + } + } + }], + "device": { + "ua": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36", + "geo": { + "country": "USA", + "lat": 47.627500, + "lon": -122.346200 + }, + "ip": "18.146.18.241", + "devicetype": 2 + }, + "user": { + "id": "460ecf1d41fa6656c4b892fd84e61ff8c2ab5ad5" + }, + "site": { + "id": "banner", + "domain": "test.com", + "cat": ["IAB1"], + "page": "https://test.com", + "publisher": { + "id": "test" + } + } + }, + + "httpCalls": [ + { + "expectedRequest": { + "uri": "http://endpoint.bidmyadz.com/c0f68227d14ed938c6c49f3967cbe9bc", + "body": { + "id": "12345", + "imp": [{ + "id": "1", + "secure": 1, + "bidfloor": 0.31, + "bidfloorcur": "USD", + "banner": { + "w": 300, + "h": 250 + }, + "ext": { + "bidder": { + "placementId": "tbanner" + } + } + }], + "device": { + "ua": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36", + "geo": { + "country": "USA", + "lat": 47.627500, + "lon": -122.346200 + }, + "ip": "18.146.18.241", + "devicetype": 2 + }, + "user": { + "id": "460ecf1d41fa6656c4b892fd84e61ff8c2ab5ad5" + }, + "site": { + "id": "banner", + "domain": "test.com", + "cat": ["IAB1"], + "page": "https://test.com", + "publisher": { + "id": "test" + } + } + } + }, + "mockResponse": { + "status": 503 + } + } + ], + + "expectedMakeBidsErrors": [ + { + "value": "Bidder is unavailable. Please contact your account manager.", + "comparison": "literal" + } + ] +} \ No newline at end of file diff --git a/adapters/bidmyadz/bidmyadztest/supplemental/status-unknown.json b/adapters/bidmyadz/bidmyadztest/supplemental/status-unknown.json new file mode 100644 index 00000000000..69b649e19ad --- /dev/null +++ b/adapters/bidmyadz/bidmyadztest/supplemental/status-unknown.json @@ -0,0 +1,101 @@ +{ + "mockBidRequest": { + "id": "12345", + "imp": [{ + "id": "1", + "secure": 1, + "bidfloor": 0.31, + "bidfloorcur": "USD", + "banner": { + "w": 300, + "h": 250 + }, + "ext": { + "bidder": { + "placementId": "tbanner" + } + } + }], + "device": { + "ua": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36", + "geo": { + "country": "USA", + "lat": 47.627500, + "lon": -122.346200 + }, + "ip": "18.146.18.241", + "devicetype": 2 + }, + "user": { + "id": "460ecf1d41fa6656c4b892fd84e61ff8c2ab5ad5" + }, + "site": { + "id": "banner", + "domain": "test.com", + "cat": ["IAB1"], + "page": "https://test.com", + "publisher": { + "id": "test" + } + } + }, + + "httpCalls": [ + { + "expectedRequest": { + "uri": "http://endpoint.bidmyadz.com/c0f68227d14ed938c6c49f3967cbe9bc", + "body": { + "id": "12345", + "imp": [{ + "id": "1", + "secure": 1, + "bidfloor": 0.31, + "bidfloorcur": "USD", + "banner": { + "w": 300, + "h": 250 + }, + "ext": { + "bidder": { + "placementId": "tbanner" + } + } + }], + "device": { + "ua": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36", + "geo": { + "country": "USA", + "lat": 47.627500, + "lon": -122.346200 + }, + "ip": "18.146.18.241", + "devicetype": 2 + }, + "user": { + "id": "460ecf1d41fa6656c4b892fd84e61ff8c2ab5ad5" + }, + "site": { + "id": "banner", + "domain": "test.com", + "cat": ["IAB1"], + "page": "https://test.com", + "publisher": { + "id": "test" + } + } + } + }, + "mockResponse": { + "status": 403, + "body": "Forbidden" + } + } + ], + + "expectedMakeBidsErrors": [ + { + "value": "Something went wrong. Status Code: [ 403 ] \"Forbidden\"", + "comparison": "literal" + } + ] +} \ No newline at end of file diff --git a/adapters/bidmyadz/params_test.go b/adapters/bidmyadz/params_test.go new file mode 100644 index 00000000000..857cde86d22 --- /dev/null +++ b/adapters/bidmyadz/params_test.go @@ -0,0 +1,49 @@ +package bidmyadz + +import ( + "encoding/json" + "testing" + + "github.com/prebid/prebid-server/openrtb_ext" +) + +var validParams = []string{ + `{ "placementId": "1234" }`, +} + +func TestValidParams(t *testing.T) { + validator, err := openrtb_ext.NewBidderParamsValidator("../../static/bidder-params") + if err != nil { + t.Fatalf("Failed to fetch the json-schemas. %v", err) + } + + for _, validParam := range validParams { + if err := validator.Validate(openrtb_ext.BidderBidmyadz, json.RawMessage(validParam)); err != nil { + t.Errorf("Schema rejected bidmyadz params: %s", validParam) + } + } +} + +var invalidParams = []string{ + `1234`, + ``, + `true`, + `null`, + `[]`, + `{}`, + `{ "anyparam": "anyvalue" }`, + `{ "placementId": null }`, +} + +func TestInvalidParams(t *testing.T) { + validator, err := openrtb_ext.NewBidderParamsValidator("../../static/bidder-params") + if err != nil { + t.Fatalf("Failed to fetch the json-schemas. %v", err) + } + + for _, invalidParam := range invalidParams { + if err := validator.Validate(openrtb_ext.BidderBidmyadz, json.RawMessage(invalidParam)); err == nil { + t.Errorf("Schema allowed unexpected params: %s", invalidParam) + } + } +} diff --git a/adapters/bidmyadz/usersync.go b/adapters/bidmyadz/usersync.go new file mode 100644 index 00000000000..755a184d6e4 --- /dev/null +++ b/adapters/bidmyadz/usersync.go @@ -0,0 +1,12 @@ +package bidmyadz + +import ( + "text/template" + + "github.com/prebid/prebid-server/adapters" + "github.com/prebid/prebid-server/usersync" +) + +func NewBidmyadzSyncer(temp *template.Template) usersync.Usersyncer { + return adapters.NewSyncer("bidmyadz", temp, adapters.SyncTypeRedirect) +} diff --git a/adapters/bidmyadz/usersync_test.go b/adapters/bidmyadz/usersync_test.go new file mode 100644 index 00000000000..11b5fedd73f --- /dev/null +++ b/adapters/bidmyadz/usersync_test.go @@ -0,0 +1,33 @@ +package bidmyadz + +import ( + "testing" + "text/template" + + "github.com/prebid/prebid-server/privacy" + "github.com/prebid/prebid-server/privacy/ccpa" + "github.com/prebid/prebid-server/privacy/gdpr" + "github.com/stretchr/testify/assert" +) + +func TestNewBidmyadzSyncer(t *testing.T) { + syncURL := "https://test.com/c0f68227d14ed938c6c49f3967cbe9bc?gdpr={{.GDPR}}&gdpr_consent={{.GDPRConsent}}&ccpa={{.USPrivacy}}" + syncURLTemplate := template.Must( + template.New("sync-template").Parse(syncURL), + ) + syncer := NewBidmyadzSyncer(syncURLTemplate) + syncInfo, err := syncer.GetUsersyncInfo(privacy.Policies{ + GDPR: gdpr.Policy{ + Signal: "0", + Consent: "allGdpr", + }, + CCPA: ccpa.Policy{ + Consent: "1---", + }, + }) + + assert.NoError(t, err) + assert.Equal(t, "https://test.com/c0f68227d14ed938c6c49f3967cbe9bc?gdpr=0&gdpr_consent=allGdpr&ccpa=1---", syncInfo.URL) + assert.Equal(t, "redirect", syncInfo.Type) + assert.Equal(t, false, syncInfo.SupportCORS) +} diff --git a/config/config.go b/config/config.go index 58bb40a592c..47db6b57b9c 100644 --- a/config/config.go +++ b/config/config.go @@ -587,6 +587,7 @@ func (cfg *Configuration) setDerivedDefaults() { setDefaultUsersync(cfg.Adapters, openrtb_ext.BidderAvocet, "https://ads.avct.cloud/getuid?&gdpr={{.GDPR}}&gdpr_consent={{.GDPRConsent}}&us_privacy={{.USPrivacy}}&url="+url.QueryEscape(externalURL)+"%2Fsetuid%3Fbidder%3Davocet%26gdpr%3D{{.GDPR}}%26gdpr_consent%3D{{.GDPRConsent}}%26uid%3D%7B%7BUUID%7D%7D") setDefaultUsersync(cfg.Adapters, openrtb_ext.BidderBeachfront, "https://sync.bfmio.com/sync_s2s?gdpr={{.GDPR}}&us_privacy={{.USPrivacy}}&url="+url.QueryEscape(externalURL)+"%2Fsetuid%3Fbidder%3Dbeachfront%26gdpr%3D{{.GDPR}}%26gdpr_consent%3D{{.GDPRConsent}}%26uid%3D%5Bio_cid%5D") setDefaultUsersync(cfg.Adapters, openrtb_ext.BidderBeintoo, "https://ib.beintoo.com/um?ssp=pbs&gdpr={{.GDPR}}&gdpr_consent={{.GDPRConsent}}&us_privacy={{.USPrivacy}}&redirect="+url.QueryEscape(externalURL)+"%2Fsetuid%3Fbidder%3Dbeintoo%26uid%3D%24UID") + setDefaultUsersync(cfg.Adapters, openrtb_ext.BidderBidmyadz, "https://cookie-sync.bidmyadz.com/c0f68227d14ed938c6c49f3967cbe9bc?gdpr={{.GDPR}}&gdpr_consent={{.GDPRConsent}}&ccpa={{.USPrivacy}}&red="+url.QueryEscape(externalURL)+"%2Fsetuid%3Fbidder%3Dbidmyadz%26uid%3D%5BUID%5D%26us_privacy%3D{{.USPrivacy}}%26gdpr_consent%3D{{.GDPRConsent}}%26gdpr%3D{{.GDPR}}") // openrtb_ext.BidderBidsCube doesn't have a good default. // openrtb_ext.BidderBmtm doesn't have a good default. setDefaultUsersync(cfg.Adapters, openrtb_ext.BidderBrightroll, "https://pr-bh.ybp.yahoo.com/sync/appnexusprebidserver/?gdpr={{.GDPR}}&euconsent={{.GDPRConsent}}&us_privacy={{.USPrivacy}}&url="+url.QueryEscape(externalURL)+"%2Fsetuid%3Fbidder%3Dbrightroll%26gdpr%3D{{.GDPR}}%26gdpr_consent%3D{{.GDPRConsent}}%26uid%3D%24UID") @@ -842,6 +843,7 @@ func SetupViper(v *viper.Viper, filename string) { v.SetDefault("adapters.beintoo.endpoint", "https://ib.beintoo.com/um") v.SetDefault("adapters.between.endpoint", "http://{{.Host}}.betweendigital.com/openrtb_bid?sspId={{.PublisherID}}") v.SetDefault("adapters.bidmachine.endpoint", "https://{{.Host}}.bidmachine.io") + v.SetDefault("adapters.bidmyadz.endpoint", "http://endpoint.bidmyadz.com/c0f68227d14ed938c6c49f3967cbe9bc") v.SetDefault("adapters.bidscube.endpoint", "http://supply.bidscube.com/?c=o&m=rtb") v.SetDefault("adapters.bmtm.endpoint", "https://one.elitebidder.com/api/pbs") v.SetDefault("adapters.brightroll.endpoint", "http://east-bid.ybp.yahoo.com/bid/appnexuspbs") diff --git a/exchange/adapter_builders.go b/exchange/adapter_builders.go index 1fdb7c2489d..dd6638126c9 100755 --- a/exchange/adapter_builders.go +++ b/exchange/adapter_builders.go @@ -33,6 +33,7 @@ import ( "github.com/prebid/prebid-server/adapters/beintoo" "github.com/prebid/prebid-server/adapters/between" "github.com/prebid/prebid-server/adapters/bidmachine" + "github.com/prebid/prebid-server/adapters/bidmyadz" "github.com/prebid/prebid-server/adapters/bidscube" "github.com/prebid/prebid-server/adapters/bmtm" "github.com/prebid/prebid-server/adapters/brightroll" @@ -154,6 +155,7 @@ func newAdapterBuilders() map[openrtb_ext.BidderName]adapters.Builder { openrtb_ext.BidderBeintoo: beintoo.Builder, openrtb_ext.BidderBetween: between.Builder, openrtb_ext.BidderBidmachine: bidmachine.Builder, + openrtb_ext.BidderBidmyadz: bidmyadz.Builder, openrtb_ext.BidderBidsCube: bidscube.Builder, openrtb_ext.BidderBmtm: bmtm.Builder, openrtb_ext.BidderBrightroll: brightroll.Builder, diff --git a/openrtb_ext/bidders.go b/openrtb_ext/bidders.go index 91ce9f0d27f..d6075bb15b5 100644 --- a/openrtb_ext/bidders.go +++ b/openrtb_ext/bidders.go @@ -104,6 +104,7 @@ const ( BidderBeintoo BidderName = "beintoo" BidderBetween BidderName = "between" BidderBidmachine BidderName = "bidmachine" + BidderBidmyadz BidderName = "bidmyadz" BidderBidsCube BidderName = "bidscube" BidderBmtm BidderName = "bmtm" BidderBrightroll BidderName = "brightroll" @@ -225,6 +226,7 @@ func CoreBidderNames() []BidderName { BidderBeintoo, BidderBetween, BidderBidmachine, + BidderBidmyadz, BidderBidsCube, BidderBmtm, BidderBrightroll, diff --git a/static/bidder-info/bidmyadz.yaml b/static/bidder-info/bidmyadz.yaml new file mode 100644 index 00000000000..70a995a2798 --- /dev/null +++ b/static/bidder-info/bidmyadz.yaml @@ -0,0 +1,13 @@ +maintainer: + email: "contact@bidmyadz.com" +capabilities: + app: + mediaTypes: + - banner + - video + - native + site: + mediaTypes: + - banner + - video + - native \ No newline at end of file diff --git a/static/bidder-params/bidmyadz.json b/static/bidder-params/bidmyadz.json new file mode 100644 index 00000000000..4e7b1119e08 --- /dev/null +++ b/static/bidder-params/bidmyadz.json @@ -0,0 +1,12 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "BidMyAdz Adapter Params", + "description": "A schema which validates params accepted by the BidMyAdz adapter", + "type": "object", + "properties": { + "placementId": { + "type": "string" + } + }, + "required": ["placementId"] + } \ No newline at end of file diff --git a/usersync/usersyncers/syncer.go b/usersync/usersyncers/syncer.go index 169417e07e8..7de59491e02 100644 --- a/usersync/usersyncers/syncer.go +++ b/usersync/usersyncers/syncer.go @@ -28,6 +28,7 @@ import ( "github.com/prebid/prebid-server/adapters/beachfront" "github.com/prebid/prebid-server/adapters/beintoo" "github.com/prebid/prebid-server/adapters/between" + "github.com/prebid/prebid-server/adapters/bidmyadz" "github.com/prebid/prebid-server/adapters/bmtm" "github.com/prebid/prebid-server/adapters/brightroll" "github.com/prebid/prebid-server/adapters/colossus" @@ -128,6 +129,7 @@ func NewSyncerMap(cfg *config.Configuration) map[openrtb_ext.BidderName]usersync insertIntoMap(cfg, syncers, openrtb_ext.BidderBeintoo, beintoo.NewBeintooSyncer) insertIntoMap(cfg, syncers, openrtb_ext.BidderBmtm, bmtm.NewBmtmSyncer) insertIntoMap(cfg, syncers, openrtb_ext.BidderBrightroll, brightroll.NewBrightrollSyncer) + insertIntoMap(cfg, syncers, openrtb_ext.BidderBidmyadz, bidmyadz.NewBidmyadzSyncer) insertIntoMap(cfg, syncers, openrtb_ext.BidderColossus, colossus.NewColossusSyncer) insertIntoMap(cfg, syncers, openrtb_ext.BidderConnectAd, connectad.NewConnectAdSyncer) insertIntoMap(cfg, syncers, openrtb_ext.BidderConsumable, consumable.NewConsumableSyncer) diff --git a/usersync/usersyncers/syncer_test.go b/usersync/usersyncers/syncer_test.go index 0cea346e423..d86efea30d8 100644 --- a/usersync/usersyncers/syncer_test.go +++ b/usersync/usersyncers/syncer_test.go @@ -37,6 +37,7 @@ func TestNewSyncerMap(t *testing.T) { string(openrtb_ext.BidderBeachfront): syncConfig, string(openrtb_ext.BidderBeintoo): syncConfig, string(openrtb_ext.BidderBetween): syncConfig, + string(openrtb_ext.BidderBidmyadz): syncConfig, string(openrtb_ext.BidderBmtm): syncConfig, string(openrtb_ext.BidderBrightroll): syncConfig, string(openrtb_ext.BidderColossus): syncConfig,