From c6dc0a9c93c763e680d661c8103e7cb96b8ecf8d Mon Sep 17 00:00:00 2001 From: madsenseops Date: Mon, 20 Jan 2025 16:13:23 +0100 Subject: [PATCH 1/4] Submit madSense bidder adapter --- adapters/madsense/madsense.go | 127 +++++++ adapters/madsense/madsense_test.go | 18 + .../madsensetest/exemplary/banner-app.json | 116 +++++++ .../madsensetest/exemplary/banner-web.json | 121 +++++++ .../exemplary/mixed-imp-types.json | 312 ++++++++++++++++++ .../madsensetest/exemplary/video-app.json | 141 ++++++++ .../madsensetest/exemplary/video-web-pod.json | 212 ++++++++++++ .../madsensetest/exemplary/video-web.json | 146 ++++++++ .../supplemental/bad-request-example.json | 98 ++++++ .../supplemental/bad-response-status-500.json | 92 ++++++ .../supplemental/no-content-response.json | 87 +++++ adapters/madsense/params_test.go | 55 +++ adapters/madsense/utils.go | 98 ++++++ exchange/adapter_builders.go | 2 + openrtb_ext/bidders.go | 2 + openrtb_ext/imp_madsense.go | 5 + static/bidder-info/madsense.yaml | 12 + static/bidder-params/madsense.json | 13 + 18 files changed, 1657 insertions(+) create mode 100644 adapters/madsense/madsense.go create mode 100644 adapters/madsense/madsense_test.go create mode 100644 adapters/madsense/madsensetest/exemplary/banner-app.json create mode 100644 adapters/madsense/madsensetest/exemplary/banner-web.json create mode 100644 adapters/madsense/madsensetest/exemplary/mixed-imp-types.json create mode 100644 adapters/madsense/madsensetest/exemplary/video-app.json create mode 100644 adapters/madsense/madsensetest/exemplary/video-web-pod.json create mode 100644 adapters/madsense/madsensetest/exemplary/video-web.json create mode 100644 adapters/madsense/madsensetest/supplemental/bad-request-example.json create mode 100644 adapters/madsense/madsensetest/supplemental/bad-response-status-500.json create mode 100644 adapters/madsense/madsensetest/supplemental/no-content-response.json create mode 100644 adapters/madsense/params_test.go create mode 100644 adapters/madsense/utils.go create mode 100644 openrtb_ext/imp_madsense.go create mode 100644 static/bidder-info/madsense.yaml create mode 100644 static/bidder-params/madsense.json diff --git a/adapters/madsense/madsense.go b/adapters/madsense/madsense.go new file mode 100644 index 00000000000..91614810180 --- /dev/null +++ b/adapters/madsense/madsense.go @@ -0,0 +1,127 @@ +package madsense + +import ( + "encoding/json" + "net/http" + "net/url" + + "github.com/prebid/openrtb/v20/openrtb2" + "github.com/prebid/prebid-server/v3/adapters" + "github.com/prebid/prebid-server/v3/config" + "github.com/prebid/prebid-server/v3/errortypes" + "github.com/prebid/prebid-server/v3/openrtb_ext" + "github.com/prebid/prebid-server/v3/util/jsonutil" +) + +type adapter struct { + endpoint string +} + +// Builder builds a new instance of the MadSense adapter for the given bidder with the given config. +func Builder(bidderName openrtb_ext.BidderName, config config.Adapter, server config.Server) (adapters.Bidder, error) { + bidder := &adapter{ + endpoint: config.Endpoint, + } + return bidder, nil +} + +func (a *adapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *adapters.ExtraRequestInfo) (requests []*adapters.RequestData, errors []error) { + reqs := make([]*adapters.RequestData, 0, len(request.Imp)) + var errs []error + + appendReq := func(imps []openrtb2.Imp) { + req, err := a.makeRequest(request, imps) + if err != nil { + errors = append(errors, err) + return + } + if req != nil { + reqs = append(reqs, req) + } + } + + var videoImps, bannerImps []openrtb2.Imp + for _, imp := range request.Imp { + if imp.Banner != nil { + bannerImps = append(bannerImps, imp) + } else if imp.Video != nil { + videoImps = append(videoImps, imp) + } + } + + // we support video podding, so we want to send all video impressions in a single request + appendReq(videoImps) + for _, bannerImp := range bannerImps { + appendReq([]openrtb2.Imp{bannerImp}) + } + + return reqs, errs +} + +func (a *adapter) makeRequest(request *openrtb2.BidRequest, imps []openrtb2.Imp) (*adapters.RequestData, error) { + if len(imps) == 0 { + return nil, nil + } + ext, err := parseImpExt(&imps[0]) + if err != nil { + return nil, err + } + + request.Imp = imps + body, err := json.Marshal(request) + if err != nil { + return nil, err + } + + if request.Test == 1 { + ext.CompanyId = "test" + } + + return &adapters.RequestData{ + Method: http.MethodPost, + Uri: a.getEndpointURL(ext), + Body: body, + Headers: getHeaders(request), + ImpIDs: openrtb_ext.GetImpIDs(request.Imp), + }, nil +} + +func (a *adapter) getEndpointURL(ext *openrtb_ext.ExtImpMadSense) string { + params := url.Values{} + params.Add("company_id", ext.CompanyId) + return a.endpoint + "?" + params.Encode() +} + +func (a *adapter) MakeBids(internalRequest *openrtb2.BidRequest, externalRequest *adapters.RequestData, response *adapters.ResponseData) (*adapters.BidderResponse, []error) { + if adapters.IsResponseStatusCodeNoContent(response) { + return nil, nil + } + + if err := adapters.CheckResponseStatusCodeForErrors(response); err != nil { + return nil, []error{err} + } + + var resp openrtb2.BidResponse + if err := jsonutil.Unmarshal(response.Body, &resp); err != nil { + return nil, []error{&errortypes.BadServerResponse{ + Message: "Bad Server Response", + }} + } + + var bidErrors []error + bidderResponse := adapters.NewBidderResponseWithBidsCapacity(1) + for _, seatBid := range resp.SeatBid { + for i := range seatBid.Bid { + bid := &seatBid.Bid[i] + typedBid, err := getTypedBidFromBid(bid) + if err != nil { + bidErrors = append(bidErrors, err) + continue + } + + bidderResponse.Bids = append(bidderResponse.Bids, typedBid) + } + } + + return bidderResponse, bidErrors +} diff --git a/adapters/madsense/madsense_test.go b/adapters/madsense/madsense_test.go new file mode 100644 index 00000000000..cb9dca50f79 --- /dev/null +++ b/adapters/madsense/madsense_test.go @@ -0,0 +1,18 @@ +package madsense + +import ( + "github.com/prebid/prebid-server/v3/adapters/adapterstest" + "github.com/prebid/prebid-server/v3/config" + "github.com/prebid/prebid-server/v3/openrtb_ext" + "testing" +) + +func TestJsonSamples(t *testing.T) { + bidder, buildErr := Builder(openrtb_ext.BidderMadSense, config.Adapter{ + Endpoint: "https://ads.madsense.io/pbs"}, config.Server{ExternalUrl: "http://hosturl.com", GvlID: 1, DataCenter: "2"}) + + if buildErr != nil { + t.Fatalf("Builder returned unexpected error %v", buildErr) + } + adapterstest.RunJSONBidderTest(t, "madsensetest", bidder) +} diff --git a/adapters/madsense/madsensetest/exemplary/banner-app.json b/adapters/madsense/madsensetest/exemplary/banner-app.json new file mode 100644 index 00000000000..21a921b7d7e --- /dev/null +++ b/adapters/madsense/madsensetest/exemplary/banner-app.json @@ -0,0 +1,116 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "w": 300, + "h": 250 + }, + "ext": { + "bidder": { + "company_id": "9876543" + } + } + } + ], + "device": { + "ua": "user-agent", + "ip": "1.2.3.4" + }, + "app": { + "bundle": "54321" + } + }, + "httpCalls": [ + { + "expectedRequest": { + "method": "POST", + "headers": { + "Accept": [ + "application/json" + ], + "Content-Type": [ + "application/json;charset=utf-8" + ], + "X-Openrtb-Version": [ + "2.6" + ], + "User-Agent": [ + "user-agent" + ], + "X-Forwarded-For": [ + "1.2.3.4" + ] + }, + "uri": "https://ads.madsense.io/pbs?company_id=9876543", + "body": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "w": 300, + "h": 250 + }, + "ext": { + "bidder": { + "company_id": "9876543" + } + } + } + ], + "device": { + "ua": "user-agent", + "ip": "1.2.3.4" + }, + "app": { + "bundle": "54321" + } + }, + "impIDs":["test-imp-id"] + }, + "mockResponse": { + "status": 200, + "body": { + "cur": "USD", + "seatbid": [ + { + "bid": [ + { + "id": "884f46aa-25ab-488a-bd7e-90e3a31a03e0", + "crid": "b83e6e58-9342-4e8c-bf6a-4ad09b231547", + "price": 10, + "impid": "test-imp-id", + "adm": "", + "mtype": 1 + } + ] + } + ], + "seat": "madsense" + } + } + } + ], + "expectedBidResponses": [ + { + "currency": "USD", + "bids": [ + { + "bid": { + "id": "884f46aa-25ab-488a-bd7e-90e3a31a03e0", + "crid": "b83e6e58-9342-4e8c-bf6a-4ad09b231547", + "price": 10, + "impid": "test-imp-id", + "adm": "", + "mtype": 1 + }, + "type": "banner" + } + ], + "seat": "madsense" + } + ] +} diff --git a/adapters/madsense/madsensetest/exemplary/banner-web.json b/adapters/madsense/madsensetest/exemplary/banner-web.json new file mode 100644 index 00000000000..49cdbf61160 --- /dev/null +++ b/adapters/madsense/madsensetest/exemplary/banner-web.json @@ -0,0 +1,121 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "w": 300, + "h": 250 + }, + "ext": { + "bidder": { + "company_id": "9876543" + } + } + } + ], + "device": { + "ua": "user-agent", + "ip": "1.2.3.4" + }, + "site": { + "domain": "domain.com", + "page": "http://domain.com/page" + } + }, + "httpCalls": [ + { + "expectedRequest": { + "method": "POST", + "headers": { + "Accept": [ + "application/json" + ], + "Content-Type": [ + "application/json;charset=utf-8" + ], + "Origin": [ + "domain.com" + ], + "X-Openrtb-Version": [ + "2.6" + ], + "User-Agent": [ + "user-agent" + ], + "X-Forwarded-For": [ + "1.2.3.4" + ] + }, + "uri": "https://ads.madsense.io/pbs?company_id=9876543", + "body": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "w": 300, + "h": 250 + }, + "ext": { + "bidder": { + "company_id": "9876543" + } + } + } + ], + "device": { + "ua": "user-agent", + "ip": "1.2.3.4" + }, + "site": { + "domain": "domain.com", + "page": "http://domain.com/page" + } + }, + "impIDs":["test-imp-id"] + }, + "mockResponse": { + "status": 200, + "body": { + "cur": "USD", + "seatbid": [ + { + "bid": [ + { + "id": "884f46aa-25ab-488a-bd7e-90e3a31a03e0", + "crid": "b83e6e58-9342-4e8c-bf6a-4ad09b231547", + "price": 10, + "impid": "test-imp-id", + "adm": "", + "mtype": 1 + } + ] + } + ], + "seat": "madsense" + } + } + } + ], + "expectedBidResponses": [ + { + "currency": "USD", + "bids": [ + { + "bid": { + "id": "884f46aa-25ab-488a-bd7e-90e3a31a03e0", + "crid": "b83e6e58-9342-4e8c-bf6a-4ad09b231547", + "price": 10, + "impid": "test-imp-id", + "adm": "", + "mtype": 1 + }, + "type": "banner" + } + ], + "seat": "madsense" + } + ] +} diff --git a/adapters/madsense/madsensetest/exemplary/mixed-imp-types.json b/adapters/madsense/madsensetest/exemplary/mixed-imp-types.json new file mode 100644 index 00000000000..42d6ffeb88e --- /dev/null +++ b/adapters/madsense/madsensetest/exemplary/mixed-imp-types.json @@ -0,0 +1,312 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "video": { + "mimes": [ + "video/mp4" + ], + "w": 1920, + "h": 1080 + }, + "ext": { + "bidder": { + "company_id": "9876543" + } + } + }, + { + "id": "test-imp-id-2", + "video": { + "mimes": [ + "video/mp4" + ], + "w": 1920, + "h": 1080 + }, + "ext": { + "bidder": { + "company_id": "9876543" + } + } + }, + { + "id": "test-imp-id-3", + "banner": { + "w": 300, + "h": 250 + }, + "ext": { + "bidder": { + "company_id": "9876543" + } + } + } + ], + "site": { + "domain": "domain.com", + "page": "http://domain.com/page" + }, + "device": { + "ip": "1.2.3.4", + "ua": "user-agent" + } + }, + "httpCalls": [ + { + "expectedRequest": { + "method": "POST", + "uri": "https://ads.madsense.io/pbs?company_id=9876543", + "headers": { + "Accept": [ + "application/json" + ], + "Content-Type": [ + "application/json;charset=utf-8" + ], + "Origin": [ + "domain.com" + ], + "X-Openrtb-Version": [ + "2.6" + ], + "User-Agent": [ + "user-agent" + ], + "X-Forwarded-For": [ + "1.2.3.4" + ] + }, + "body": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "video": { + "mimes": [ + "video/mp4" + ], + "w": 1920, + "h": 1080 + }, + "ext": { + "bidder": { + "company_id": "9876543" + } + } + }, + { + "id": "test-imp-id-2", + "video": { + "mimes": [ + "video/mp4" + ], + "w": 1920, + "h": 1080 + }, + "ext": { + "bidder": { + "company_id": "9876543" + } + } + } + ], + "device": { + "ip": "1.2.3.4", + "ua": "user-agent" + }, + "site": { + "domain": "domain.com", + "page": "http://domain.com/page" + } + }, + "impIDs":["test-imp-id","test-imp-id-2"] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "cur": "USD", + "seatbid": [ + { + "bid": [ + { + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800", + "impid": "test-imp-id", + "price": 10, + "adm": "some-test-ad", + "crid": "54321", + "w": 1920, + "h": 1080, + "mtype": 2, + "dur": 15, + "cat": [ + "IAB1-5", + "IAB1-6" + ] + }, + { + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e801", + "impid": "test-imp-id-2", + "price": 10, + "adm": "some-test-ad-2", + "crid": "54321", + "w": 1920, + "h": 1080, + "mtype": 2, + "dur": 30, + "cat": [ + "IAB1-1" + ] + } + ], + "seat": "madsense" + } + ] + } + } + }, + { + "expectedRequest": { + "method": "POST", + "uri": "https://ads.madsense.io/pbs?company_id=9876543", + "headers": { + "Accept": [ + "application/json" + ], + "Content-Type": [ + "application/json;charset=utf-8" + ], + "Origin": [ + "domain.com" + ], + "X-Openrtb-Version": [ + "2.6" + ], + "User-Agent": [ + "user-agent" + ], + "X-Forwarded-For": [ + "1.2.3.4" + ] + }, + "body": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id-3", + "banner": { + "w": 300, + "h": 250 + }, + "ext": { + "bidder": { + "company_id": "9876543" + } + } + } + ], + "device": { + "ip": "1.2.3.4", + "ua": "user-agent" + }, + "site": { + "domain": "domain.com", + "page": "http://domain.com/page" + } + }, + "impIDs":["test-imp-id-3"] + }, + "mockResponse": { + "status": 200, + "body": { + "cur": "USD", + "seatbid": [ + { + "bid": [ + { + "id": "884f46aa-25ab-488a-bd7e-90e3a31a03e2", + "crid": "b83e6e58-9342-4e8c-bf6a-4ad09b231547", + "price": 10, + "impid": "test-imp-id-3", + "adm": "", + "mtype": 1 + } + ] + } + ], + "seat": "madsense" + } + } + } + ], + "expectedBidResponses": [ + { + "currency": "USD", + "bids": [ + { + "bid": { + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800", + "impid": "test-imp-id", + "price": 10, + "adm": "some-test-ad", + "crid": "54321", + "w": 1920, + "h": 1080, + "mtype": 2, + "dur": 15, + "cat": [ + "IAB1-5", + "IAB1-6" + ] + }, + "type": "video", + "video": { + "duration": 15, + "primary_category": "IAB1-5" + } + }, + { + "bid": { + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e801", + "impid": "test-imp-id-2", + "price": 10, + "adm": "some-test-ad-2", + "crid": "54321", + "w": 1920, + "h": 1080, + "mtype": 2, + "dur": 30, + "cat": [ + "IAB1-1" + ] + }, + "type": "video", + "video": { + "duration": 30, + "primary_category": "IAB1-1" + } + } + ] + }, + { + "currency": "USD", + "bids": [ + { + "bid": { + "id": "884f46aa-25ab-488a-bd7e-90e3a31a03e2", + "crid": "b83e6e58-9342-4e8c-bf6a-4ad09b231547", + "price": 10, + "impid": "test-imp-id-3", + "adm": "", + "mtype": 1 + }, + "type": "banner" + } + ] + } + ] +} + diff --git a/adapters/madsense/madsensetest/exemplary/video-app.json b/adapters/madsense/madsensetest/exemplary/video-app.json new file mode 100644 index 00000000000..e36d6c54d6f --- /dev/null +++ b/adapters/madsense/madsensetest/exemplary/video-app.json @@ -0,0 +1,141 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "video": { + "mimes": [ + "video/mp4" + ], + "w": 1920, + "h": 1080 + }, + "ext": { + "bidder": { + "company_id": "9876543" + } + } + } + ], + "app": { + "bundle": "54321" + }, + "device": { + "ip": "1.2.3.4", + "ua": "user-agent" + } + }, + "httpCalls": [ + { + "expectedRequest": { + "method": "POST", + "uri": "https://ads.madsense.io/pbs?company_id=9876543", + "headers": { + "Accept": [ + "application/json" + ], + "Content-Type": [ + "application/json;charset=utf-8" + ], + "X-Openrtb-Version": [ + "2.6" + ], + "User-Agent": [ + "user-agent" + ], + "X-Forwarded-For": [ + "1.2.3.4" + ] + }, + "body": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "video": { + "mimes": [ + "video/mp4" + ], + "w": 1920, + "h": 1080 + }, + "ext": { + "bidder": { + "company_id": "9876543" + } + } + } + ], + "device": { + "ip": "1.2.3.4", + "ua": "user-agent" + }, + "app": { + "bundle": "54321" + } + }, + "impIDs":["test-imp-id"] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "cur": "USD", + "seatbid": [ + { + "bid": [ + { + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800", + "impid": "test-imp-id", + "price": 10, + "adm": "some-test-ad", + "crid": "54321", + "w": 1920, + "h": 1080, + "mtype": 2, + "dur": 15, + "cat": [ + "IAB1-5", + "IAB1-6" + ] + } + ], + "seat": "madsense" + } + ] + } + } + } + ], + "expectedBidResponses": [ + { + "currency": "USD", + "bids": [ + { + "bid": { + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800", + "impid": "test-imp-id", + "price": 10, + "adm": "some-test-ad", + "crid": "54321", + "w": 1920, + "h": 1080, + "mtype": 2, + "dur": 15, + "cat": [ + "IAB1-5", + "IAB1-6" + ] + }, + "type": "video", + "video": { + "duration": 15, + "primary_category": "IAB1-5" + } + } + ] + } + ] +} + diff --git a/adapters/madsense/madsensetest/exemplary/video-web-pod.json b/adapters/madsense/madsensetest/exemplary/video-web-pod.json new file mode 100644 index 00000000000..b2194049dc1 --- /dev/null +++ b/adapters/madsense/madsensetest/exemplary/video-web-pod.json @@ -0,0 +1,212 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "video": { + "mimes": [ + "video/mp4" + ], + "w": 1920, + "h": 1080 + }, + "ext": { + "bidder": { + "company_id": "9876543" + } + } + }, + { + "id": "test-imp-id-2", + "video": { + "mimes": [ + "video/mp4" + ], + "w": 1920, + "h": 1080 + }, + "ext": { + "bidder": { + "company_id": "9876543" + } + } + } + + ], + "site": { + "domain": "domain.com", + "page": "http://domain.com/page" + }, + "device": { + "ip": "1.2.3.4", + "ua": "user-agent" + } + }, + "httpCalls": [ + { + "expectedRequest": { + "method": "POST", + "uri": "https://ads.madsense.io/pbs?company_id=9876543", + "headers": { + "Accept": [ + "application/json" + ], + "Content-Type": [ + "application/json;charset=utf-8" + ], + "Origin": [ + "domain.com" + ], + "X-Openrtb-Version": [ + "2.6" + ], + "User-Agent": [ + "user-agent" + ], + "X-Forwarded-For": [ + "1.2.3.4" + ] + }, + "body": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "video": { + "mimes": [ + "video/mp4" + ], + "w": 1920, + "h": 1080 + }, + "ext": { + "bidder": { + "company_id": "9876543" + } + } + }, + { + "id": "test-imp-id-2", + "video": { + "mimes": [ + "video/mp4" + ], + "w": 1920, + "h": 1080 + }, + "ext": { + "bidder": { + "company_id": "9876543" + } + } + } + ], + "device": { + "ip": "1.2.3.4", + "ua": "user-agent" + }, + "site": { + "domain": "domain.com", + "page": "http://domain.com/page" + } + }, + "impIDs":["test-imp-id","test-imp-id-2"] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "cur": "USD", + "seatbid": [ + { + "bid": [ + { + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800", + "impid": "test-imp-id", + "price": 10, + "adm": "some-test-ad", + "crid": "54321", + "w": 1920, + "h": 1080, + "mtype": 2, + "dur": 15, + "cat": [ + "IAB1-5", + "IAB1-6" + ] + }, + { + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e801", + "impid": "test-imp-id-2", + "price": 10, + "adm": "some-test-ad-2", + "crid": "54321", + "w": 1920, + "h": 1080, + "mtype": 2, + "dur": 30, + "cat": [ + "IAB1-1" + ] + } + ], + "seat": "madsense" + } + ] + } + } + } + ], + "expectedBidResponses": [ + { + "currency": "USD", + "bids": [ + { + "bid": { + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800", + "impid": "test-imp-id", + "price": 10, + "adm": "some-test-ad", + "crid": "54321", + "w": 1920, + "h": 1080, + "mtype": 2, + "dur": 15, + "cat": [ + "IAB1-5", + "IAB1-6" + ] + }, + "type": "video", + "video": { + "duration": 15, + "primary_category": "IAB1-5" + } + }, + { + "bid": { + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e801", + "impid": "test-imp-id-2", + "price": 10, + "adm": "some-test-ad-2", + "crid": "54321", + "w": 1920, + "h": 1080, + "mtype": 2, + "dur": 30, + "cat": [ + "IAB1-1" + ] + }, + "type": "video", + "video": { + "duration": 30, + "primary_category": "IAB1-1" + } + } + ] + } + ] +} + diff --git a/adapters/madsense/madsensetest/exemplary/video-web.json b/adapters/madsense/madsensetest/exemplary/video-web.json new file mode 100644 index 00000000000..0b4470cd60e --- /dev/null +++ b/adapters/madsense/madsensetest/exemplary/video-web.json @@ -0,0 +1,146 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "video": { + "mimes": [ + "video/mp4" + ], + "w": 1920, + "h": 1080 + }, + "ext": { + "bidder": { + "company_id": "9876543" + } + } + } + ], + "site": { + "domain": "domain.com", + "page": "http://domain.com/page" + }, + "device": { + "ip": "1.2.3.4", + "ua": "user-agent" + } + }, + "httpCalls": [ + { + "expectedRequest": { + "method": "POST", + "uri": "https://ads.madsense.io/pbs?company_id=9876543", + "headers": { + "Accept": [ + "application/json" + ], + "Content-Type": [ + "application/json;charset=utf-8" + ], + "Origin": [ + "domain.com" + ], + "X-Openrtb-Version": [ + "2.6" + ], + "User-Agent": [ + "user-agent" + ], + "X-Forwarded-For": [ + "1.2.3.4" + ] + }, + "body": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "video": { + "mimes": [ + "video/mp4" + ], + "w": 1920, + "h": 1080 + }, + "ext": { + "bidder": { + "company_id": "9876543" + } + } + } + ], + "device": { + "ip": "1.2.3.4", + "ua": "user-agent" + }, + "site": { + "domain": "domain.com", + "page": "http://domain.com/page" + } + }, + "impIDs":["test-imp-id"] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "cur": "USD", + "seatbid": [ + { + "bid": [ + { + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800", + "impid": "test-imp-id", + "price": 10, + "adm": "some-test-ad", + "crid": "54321", + "w": 1920, + "h": 1080, + "mtype": 2, + "dur": 15, + "cat": [ + "IAB1-5", + "IAB1-6" + ] + } + ], + "seat": "madsense" + } + ] + } + } + } + ], + "expectedBidResponses": [ + { + "currency": "USD", + "bids": [ + { + "bid": { + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800", + "impid": "test-imp-id", + "price": 10, + "adm": "some-test-ad", + "crid": "54321", + "w": 1920, + "h": 1080, + "mtype": 2, + "dur": 15, + "cat": [ + "IAB1-5", + "IAB1-6" + ] + }, + "type": "video", + "video": { + "duration": 15, + "primary_category": "IAB1-5" + } + } + ] + } + ] +} + diff --git a/adapters/madsense/madsensetest/supplemental/bad-request-example.json b/adapters/madsense/madsensetest/supplemental/bad-request-example.json new file mode 100644 index 00000000000..40e1efabfad --- /dev/null +++ b/adapters/madsense/madsensetest/supplemental/bad-request-example.json @@ -0,0 +1,98 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "video": { + "w": 1920, + "h": 1080, + "mimes": [ + "video/x-flv", + "video/mp4" + ] + }, + "ext": { + "bidder": { + "company_id": "9876543" + } + } + } + ], + "device": { + "ua": "user-agent", + "ip": "1.2.3.4" + }, + "site": { + "domain": "domain.com", + "page": "page.com/test" + } + }, + "httpCalls": [ + { + "expectedRequest": { + "method": "POST", + "headers": { + "Accept": [ + "application/json" + ], + "Content-Type": [ + "application/json;charset=utf-8" + ], + "Origin": [ + "domain.com" + ], + "X-Openrtb-Version": [ + "2.6" + ], + "User-Agent": [ + "user-agent" + ], + "X-Forwarded-For": [ + "1.2.3.4" + ] + }, + "uri": "https://ads.madsense.io/pbs?company_id=9876543", + "body": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "video": { + "w": 1920, + "h": 1080, + "mimes": [ + "video/x-flv", + "video/mp4" + ] + }, + "ext": { + "bidder": { + "company_id": "9876543" + } + } + } + ], + "device": { + "ua": "user-agent", + "ip": "1.2.3.4" + }, + "site": { + "domain": "domain.com", + "page": "page.com/test" + } + }, + "impIDs":["test-imp-id"] + }, + "mockResponse": { + "status": 400 + } + } + ], + "expectedMakeBidsErrors": [ + { + "value": "Unexpected status code: 400. Run with request.debug = 1 for more info", + "comparison": "literal" + } + ] +} diff --git a/adapters/madsense/madsensetest/supplemental/bad-response-status-500.json b/adapters/madsense/madsensetest/supplemental/bad-response-status-500.json new file mode 100644 index 00000000000..f3b5a593b4b --- /dev/null +++ b/adapters/madsense/madsensetest/supplemental/bad-response-status-500.json @@ -0,0 +1,92 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "video": { + "mimes": [ + "video/mp4" + ], + "w": 1920, + "h": 1080 + }, + "ext": { + "bidder": { + "company_id": "9876543" + } + } + } + ], + "app": { + "bundle": "54321" + }, + "device": { + "ip": "1.2.3.4", + "ua": "user-agent" + } + }, + "httpCalls": [ + { + "expectedRequest": { + "method": "POST", + "uri": "https://ads.madsense.io/pbs?company_id=9876543", + "headers": { + "Accept": [ + "application/json" + ], + "Content-Type": [ + "application/json;charset=utf-8" + ], + "X-Openrtb-Version": [ + "2.6" + ], + "User-Agent": [ + "user-agent" + ], + "X-Forwarded-For": [ + "1.2.3.4" + ] + }, + "body": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "video": { + "mimes": [ + "video/mp4" + ], + "w": 1920, + "h": 1080 + }, + "ext": { + "bidder": { + "company_id": "9876543" + } + } + } + ], + "device": { + "ip": "1.2.3.4", + "ua": "user-agent" + }, + "app": { + "bundle": "54321" + } + }, + "impIDs":["test-imp-id"] + }, + "mockResponse": { + "status": 500 + } + } + ], + "expectedMakeBidsErrors": [ + { + "value": "Unexpected status code: 500. Run with request.debug = 1 for more info", + "comparison": "literal" + } + ] +} + diff --git a/adapters/madsense/madsensetest/supplemental/no-content-response.json b/adapters/madsense/madsensetest/supplemental/no-content-response.json new file mode 100644 index 00000000000..af9940c6db3 --- /dev/null +++ b/adapters/madsense/madsensetest/supplemental/no-content-response.json @@ -0,0 +1,87 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "video": { + "mimes": [ + "video/mp4" + ], + "w": 1920, + "h": 1080 + }, + "ext": { + "bidder": { + "company_id": "9876543" + } + } + } + ], + "app": { + "bundle": "54321" + }, + "device": { + "ip": "1.2.3.4", + "ua": "user-agent" + } + }, + "httpCalls": [ + { + "expectedRequest": { + "method": "POST", + "uri": "https://ads.madsense.io/pbs?company_id=9876543", + "headers": { + "Accept": [ + "application/json" + ], + "Content-Type": [ + "application/json;charset=utf-8" + ], + "X-Openrtb-Version": [ + "2.6" + ], + "User-Agent": [ + "user-agent" + ], + "X-Forwarded-For": [ + "1.2.3.4" + ] + }, + "body": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "video": { + "mimes": [ + "video/mp4" + ], + "w": 1920, + "h": 1080 + }, + "ext": { + "bidder": { + "company_id": "9876543" + } + } + } + ], + "device": { + "ip": "1.2.3.4", + "ua": "user-agent" + }, + "app": { + "bundle": "54321" + } + }, + "impIDs":["test-imp-id"] + }, + "mockResponse": { + "status": 204 + } + } + ], + "expectedBidResponses": [] +} + diff --git a/adapters/madsense/params_test.go b/adapters/madsense/params_test.go new file mode 100644 index 00000000000..7c0e7c002fc --- /dev/null +++ b/adapters/madsense/params_test.go @@ -0,0 +1,55 @@ +package madsense + +import ( + "encoding/json" + "github.com/prebid/prebid-server/v3/openrtb_ext" + "testing" +) + +// This file actually intends to test static/bidder-params/madsense.json +// +// These also validate the format of the external API: request.imp[i].ext.prebid.bidder.madsense + +// TestValidParams makes sure that the madsense schema accepts all imp.ext fields which we intend to support. +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.BidderMadSense, json.RawMessage(validParam)); err != nil { + t.Errorf("Schema rejected madsense params: %s", validParam) + } + } +} + +// TestInvalidParams makes sure that the madsense schema rejects all the imp.ext fields we don't support. +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.BidderMadSense, json.RawMessage(invalidParam)); err == nil { + t.Errorf("Schema allowed unexpected params: %s", invalidParam) + } + } +} + +var validParams = []string{ + `{"company_id": "9876543"}`, +} + +var invalidParams = []string{ + ``, + `null`, + `true`, + `5`, + `4.2`, + `[]`, + `{}`, + `{"companyId": "987654a"}`, + `{"companyId": "98765432"}`, +} diff --git a/adapters/madsense/utils.go b/adapters/madsense/utils.go new file mode 100644 index 00000000000..7831d233bae --- /dev/null +++ b/adapters/madsense/utils.go @@ -0,0 +1,98 @@ +package madsense + +import ( + "fmt" + "github.com/prebid/openrtb/v20/openrtb2" + "github.com/prebid/prebid-server/v3/adapters" + "github.com/prebid/prebid-server/v3/errortypes" + "github.com/prebid/prebid-server/v3/openrtb_ext" + "github.com/prebid/prebid-server/v3/util/jsonutil" + "net/http" +) + +func parseImpExt(imp *openrtb2.Imp) (*openrtb_ext.ExtImpMadSense, error) { + var bidderExt adapters.ExtImpBidder + + if err := jsonutil.Unmarshal(imp.Ext, &bidderExt); err != nil { + return nil, &errortypes.BadInput{ + Message: fmt.Sprintf("Error while decoding extImpBidder, err: %v", err), + } + } + + ext := openrtb_ext.ExtImpMadSense{} + err := jsonutil.Unmarshal(bidderExt.Bidder, &ext) + if err != nil { + return nil, &errortypes.BadInput{ + Message: fmt.Sprintf("Error while decoding impExt, err: %v", err), + } + } + + return &ext, nil +} + +func getHeaders(request *openrtb2.BidRequest) http.Header { + headers := http.Header{} + headers.Add("Content-Type", "application/json;charset=utf-8") + headers.Add("Accept", "application/json") + headers.Add("X-Openrtb-Version", "2.6") + + if request.Device != nil { + if len(request.Device.UA) > 0 { + headers.Add("User-Agent", request.Device.UA) + } + + if len(request.Device.IP) > 0 { + headers.Add("X-Forwarded-For", request.Device.IP) + } + + if len(request.Device.IPv6) > 0 { + headers.Add("X-Forwarded-For", request.Device.IPv6) + } + } + + if request.Site != nil { + if request.Site.Domain != "" { + headers.Add("Origin", request.Site.Domain) + } + if request.Site.Ref != "" { + headers.Set("Referer", request.Site.Ref) + } + } + return headers +} + +func getTypedBidFromBid(bid *openrtb2.Bid) (*adapters.TypedBid, error) { + bidType, err := getMediaTypeForBid(bid) + if err != nil { + return nil, err + } + + var bidVideo *openrtb_ext.ExtBidPrebidVideo + if bidType == openrtb_ext.BidTypeVideo { + bidVideo = &openrtb_ext.ExtBidPrebidVideo{} + if len(bid.Cat) > 0 { + bidVideo.PrimaryCategory = bid.Cat[0] + } + if bid.Dur > 0 { + bidVideo.Duration = int(bid.Dur) + } + } + return &adapters.TypedBid{ + Bid: bid, + BidType: bidType, + BidVideo: bidVideo, + }, nil +} + +func getMediaTypeForBid(bid *openrtb2.Bid) (openrtb_ext.BidType, error) { + switch bid.MType { + case openrtb2.MarkupBanner: + return openrtb_ext.BidTypeBanner, nil + case openrtb2.MarkupVideo: + return openrtb_ext.BidTypeVideo, nil + default: + return "", &errortypes.BadServerResponse{ + Message: fmt.Sprintf("MType %v not supported", bid.MType), + } + } +} diff --git a/exchange/adapter_builders.go b/exchange/adapter_builders.go index 3867cbde72b..0baf95b2d76 100755 --- a/exchange/adapter_builders.go +++ b/exchange/adapter_builders.go @@ -134,6 +134,7 @@ import ( "github.com/prebid/prebid-server/v3/adapters/loyal" "github.com/prebid/prebid-server/v3/adapters/lunamedia" "github.com/prebid/prebid-server/v3/adapters/mabidder" + "github.com/prebid/prebid-server/v3/adapters/madsense" "github.com/prebid/prebid-server/v3/adapters/madvertise" "github.com/prebid/prebid-server/v3/adapters/marsmedia" "github.com/prebid/prebid-server/v3/adapters/mediago" @@ -371,6 +372,7 @@ func newAdapterBuilders() map[openrtb_ext.BidderName]adapters.Builder { openrtb_ext.BidderLoyal: loyal.Builder, openrtb_ext.BidderLunaMedia: lunamedia.Builder, openrtb_ext.BidderMabidder: mabidder.Builder, + openrtb_ext.BidderMadSense: madsense.Builder, openrtb_ext.BidderMadvertise: madvertise.Builder, openrtb_ext.BidderMarsmedia: marsmedia.Builder, openrtb_ext.BidderMediafuse: appnexus.Builder, diff --git a/openrtb_ext/bidders.go b/openrtb_ext/bidders.go index 894baf9a3bb..542d3998c59 100644 --- a/openrtb_ext/bidders.go +++ b/openrtb_ext/bidders.go @@ -151,6 +151,7 @@ var coreBidderNames []BidderName = []BidderName{ BidderLoyal, BidderLunaMedia, BidderMabidder, + BidderMadSense, BidderMadvertise, BidderMarsmedia, BidderMediafuse, @@ -493,6 +494,7 @@ const ( BidderLoyal BidderName = "loyal" BidderLunaMedia BidderName = "lunamedia" BidderMabidder BidderName = "mabidder" + BidderMadSense BidderName = "madsense" BidderMadvertise BidderName = "madvertise" BidderMarsmedia BidderName = "marsmedia" BidderMediafuse BidderName = "mediafuse" diff --git a/openrtb_ext/imp_madsense.go b/openrtb_ext/imp_madsense.go new file mode 100644 index 00000000000..a0d4c0a6df0 --- /dev/null +++ b/openrtb_ext/imp_madsense.go @@ -0,0 +1,5 @@ +package openrtb_ext + +type ExtImpMadSense struct { + CompanyId string `json:"company_id"` +} diff --git a/static/bidder-info/madsense.yaml b/static/bidder-info/madsense.yaml new file mode 100644 index 00000000000..4105c65fe98 --- /dev/null +++ b/static/bidder-info/madsense.yaml @@ -0,0 +1,12 @@ +endpoint: "https://ads.madsense.io/pbs" +maintainer: + email: "prebid@madsense.io" +capabilities: + app: + mediaTypes: + - banner + - video + site: + mediaTypes: + - banner + - video \ No newline at end of file diff --git a/static/bidder-params/madsense.json b/static/bidder-params/madsense.json new file mode 100644 index 00000000000..39b5ddab32e --- /dev/null +++ b/static/bidder-params/madsense.json @@ -0,0 +1,13 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "madSense Adapter Params", + "description": "A schema which validates params accepted by the madSense adapter", + "type": "object", + "properties": { + "company_id": { + "type": "string", + "description": "An id used to identify madSense company" + } + }, + "required": ["company_id"] +} From 33446bb97b10fba62baa4f7d8e94aa168e0285e5 Mon Sep 17 00:00:00 2001 From: MadSense Ops Date: Thu, 30 Jan 2025 13:23:01 +0100 Subject: [PATCH 2/4] pr comments --- adapters/madsense/madsense.go | 1 - .../supplemental/bad-response-mtype.json | 122 ++++++++++++++++++ adapters/madsense/utils.go | 3 +- 3 files changed, 124 insertions(+), 2 deletions(-) create mode 100644 adapters/madsense/madsensetest/supplemental/bad-response-mtype.json diff --git a/adapters/madsense/madsense.go b/adapters/madsense/madsense.go index 91614810180..d34b1b8a9e7 100644 --- a/adapters/madsense/madsense.go +++ b/adapters/madsense/madsense.go @@ -118,7 +118,6 @@ func (a *adapter) MakeBids(internalRequest *openrtb2.BidRequest, externalRequest bidErrors = append(bidErrors, err) continue } - bidderResponse.Bids = append(bidderResponse.Bids, typedBid) } } diff --git a/adapters/madsense/madsensetest/supplemental/bad-response-mtype.json b/adapters/madsense/madsensetest/supplemental/bad-response-mtype.json new file mode 100644 index 00000000000..fdae93b1249 --- /dev/null +++ b/adapters/madsense/madsensetest/supplemental/bad-response-mtype.json @@ -0,0 +1,122 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "video": { + "mimes": [ + "video/mp4" + ], + "w": 1920, + "h": 1080 + }, + "ext": { + "bidder": { + "company_id": "9876543" + } + } + } + ], + "app": { + "bundle": "54321" + }, + "device": { + "ip": "1.2.3.4", + "ua": "user-agent" + } + }, + "httpCalls": [ + { + "expectedRequest": { + "method": "POST", + "uri": "https://ads.madsense.com/pbs?company_id=9876543", + "headers": { + "Accept": [ + "application/json" + ], + "Content-Type": [ + "application/json;charset=utf-8" + ], + "X-Openrtb-Version": [ + "2.6" + ], + "User-Agent": [ + "user-agent" + ], + "X-Forwarded-For": [ + "1.2.3.4" + ] + }, + "body": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "video": { + "mimes": [ + "video/mp4" + ], + "w": 1920, + "h": 1080 + }, + "ext": { + "bidder": { + "company_id": "9876543" + } + } + } + ], + "device": { + "ip": "1.2.3.4", + "ua": "user-agent" + }, + "app": { + "bundle": "54321" + } + }, + "impIDs":["test-imp-id"] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "cur": "USD", + "seatbid": [ + { + "bid": [ + { + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800", + "impid": "test-imp-id", + "price": 10, + "adm": "some-test-ad", + "crid": "54321", + "w": 1920, + "h": 1080, + "mtype": 4, + "dur": 15, + "cat": [ + "IAB1-5", + "IAB1-6" + ] + } + ], + "seat": "madsense" + } + ] + } + } + } + ], + "expectedBidResponses": [{ + "currency": "USD", + "bids": [] + }], + "expectedMakeBidsErrors": [ + { + "value": "MType 4 not supported", + "comparison": "literal" + } + ] +} + diff --git a/adapters/madsense/utils.go b/adapters/madsense/utils.go index 7831d233bae..7ff97cd65f5 100644 --- a/adapters/madsense/utils.go +++ b/adapters/madsense/utils.go @@ -2,12 +2,13 @@ package madsense import ( "fmt" + "net/http" + "github.com/prebid/openrtb/v20/openrtb2" "github.com/prebid/prebid-server/v3/adapters" "github.com/prebid/prebid-server/v3/errortypes" "github.com/prebid/prebid-server/v3/openrtb_ext" "github.com/prebid/prebid-server/v3/util/jsonutil" - "net/http" ) func parseImpExt(imp *openrtb2.Imp) (*openrtb_ext.ExtImpMadSense, error) { From 2db4f8f93fcb9a33c4e4aa996b9aacaa7a25a0de Mon Sep 17 00:00:00 2001 From: MadSense Ops Date: Thu, 30 Jan 2025 13:27:30 +0100 Subject: [PATCH 3/4] typo --- .../madsense/madsensetest/supplemental/bad-response-mtype.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adapters/madsense/madsensetest/supplemental/bad-response-mtype.json b/adapters/madsense/madsensetest/supplemental/bad-response-mtype.json index fdae93b1249..e3b8c2fdd11 100644 --- a/adapters/madsense/madsensetest/supplemental/bad-response-mtype.json +++ b/adapters/madsense/madsensetest/supplemental/bad-response-mtype.json @@ -30,7 +30,7 @@ { "expectedRequest": { "method": "POST", - "uri": "https://ads.madsense.com/pbs?company_id=9876543", + "uri": "https://ads.madsense.io/pbs?company_id=9876543", "headers": { "Accept": [ "application/json" From c1696fbae81ff668b651427fb80bfccb35805168 Mon Sep 17 00:00:00 2001 From: MadSense Ops Date: Fri, 28 Feb 2025 14:48:47 +0100 Subject: [PATCH 4/4] pr comments --- adapters/madsense/madsense.go | 4 +- adapters/madsense/madsense_test.go | 2 +- .../madsensetest/exemplary/banner-app.json | 2 +- .../madsensetest/exemplary/banner-web.json | 17 ++- .../exemplary/mixed-imp-types.json | 4 +- .../madsensetest/exemplary/video-app.json | 2 +- .../madsensetest/exemplary/video-web-pod.json | 2 +- .../madsensetest/exemplary/video-web.json | 2 +- .../supplemental/bad-response-error.json | 93 ++++++++++++ .../supplemental/bad-response-mtype.json | 2 +- ...mple.json => bad-response-status-400.json} | 2 +- .../supplemental/bad-response-status-500.json | 2 +- .../supplemental/no-content-response.json | 2 +- .../supplemental/test-response.json | 143 ++++++++++++++++++ adapters/madsense/params_test.go | 1 + static/bidder-params/madsense.json | 3 +- 16 files changed, 263 insertions(+), 20 deletions(-) create mode 100644 adapters/madsense/madsensetest/supplemental/bad-response-error.json rename adapters/madsense/madsensetest/supplemental/{bad-request-example.json => bad-response-status-400.json} (96%) create mode 100644 adapters/madsense/madsensetest/supplemental/test-response.json diff --git a/adapters/madsense/madsense.go b/adapters/madsense/madsense.go index d34b1b8a9e7..f5d0fa9df5c 100644 --- a/adapters/madsense/madsense.go +++ b/adapters/madsense/madsense.go @@ -25,14 +25,14 @@ func Builder(bidderName openrtb_ext.BidderName, config config.Adapter, server co return bidder, nil } -func (a *adapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *adapters.ExtraRequestInfo) (requests []*adapters.RequestData, errors []error) { +func (a *adapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) { reqs := make([]*adapters.RequestData, 0, len(request.Imp)) var errs []error appendReq := func(imps []openrtb2.Imp) { req, err := a.makeRequest(request, imps) if err != nil { - errors = append(errors, err) + errs = append(errs, err) return } if req != nil { diff --git a/adapters/madsense/madsense_test.go b/adapters/madsense/madsense_test.go index cb9dca50f79..c9792e13921 100644 --- a/adapters/madsense/madsense_test.go +++ b/adapters/madsense/madsense_test.go @@ -9,7 +9,7 @@ import ( func TestJsonSamples(t *testing.T) { bidder, buildErr := Builder(openrtb_ext.BidderMadSense, config.Adapter{ - Endpoint: "https://ads.madsense.io/pbs"}, config.Server{ExternalUrl: "http://hosturl.com", GvlID: 1, DataCenter: "2"}) + Endpoint: "https://test.localhost.com"}, config.Server{ExternalUrl: "http://hosturl.com", GvlID: 1, DataCenter: "2"}) if buildErr != nil { t.Fatalf("Builder returned unexpected error %v", buildErr) diff --git a/adapters/madsense/madsensetest/exemplary/banner-app.json b/adapters/madsense/madsensetest/exemplary/banner-app.json index 21a921b7d7e..bc1b2668fce 100644 --- a/adapters/madsense/madsensetest/exemplary/banner-app.json +++ b/adapters/madsense/madsensetest/exemplary/banner-app.json @@ -44,7 +44,7 @@ "1.2.3.4" ] }, - "uri": "https://ads.madsense.io/pbs?company_id=9876543", + "uri": "https://test.localhost.com?company_id=9876543", "body": { "id": "test-request-id", "imp": [ diff --git a/adapters/madsense/madsensetest/exemplary/banner-web.json b/adapters/madsense/madsensetest/exemplary/banner-web.json index 49cdbf61160..0ad9c5c8960 100644 --- a/adapters/madsense/madsensetest/exemplary/banner-web.json +++ b/adapters/madsense/madsensetest/exemplary/banner-web.json @@ -17,11 +17,12 @@ ], "device": { "ua": "user-agent", - "ip": "1.2.3.4" + "ipv6": "2001:db8:3333:4444:5555:6666:7777:8888" }, "site": { "domain": "domain.com", - "page": "http://domain.com/page" + "page": "http://domain.com/page", + "ref": "https://example.com/page" } }, "httpCalls": [ @@ -45,10 +46,13 @@ "user-agent" ], "X-Forwarded-For": [ - "1.2.3.4" + "2001:db8:3333:4444:5555:6666:7777:8888" + ], + "Referer": [ + "https://example.com/page" ] }, - "uri": "https://ads.madsense.io/pbs?company_id=9876543", + "uri": "https://test.localhost.com?company_id=9876543", "body": { "id": "test-request-id", "imp": [ @@ -67,11 +71,12 @@ ], "device": { "ua": "user-agent", - "ip": "1.2.3.4" + "ipv6": "2001:db8:3333:4444:5555:6666:7777:8888" }, "site": { "domain": "domain.com", - "page": "http://domain.com/page" + "page": "http://domain.com/page", + "ref": "https://example.com/page" } }, "impIDs":["test-imp-id"] diff --git a/adapters/madsense/madsensetest/exemplary/mixed-imp-types.json b/adapters/madsense/madsensetest/exemplary/mixed-imp-types.json index 42d6ffeb88e..a453fd989ad 100644 --- a/adapters/madsense/madsensetest/exemplary/mixed-imp-types.json +++ b/adapters/madsense/madsensetest/exemplary/mixed-imp-types.json @@ -58,7 +58,7 @@ { "expectedRequest": { "method": "POST", - "uri": "https://ads.madsense.io/pbs?company_id=9876543", + "uri": "https://test.localhost.com?company_id=9876543", "headers": { "Accept": [ "application/json" @@ -171,7 +171,7 @@ { "expectedRequest": { "method": "POST", - "uri": "https://ads.madsense.io/pbs?company_id=9876543", + "uri": "https://test.localhost.com?company_id=9876543", "headers": { "Accept": [ "application/json" diff --git a/adapters/madsense/madsensetest/exemplary/video-app.json b/adapters/madsense/madsensetest/exemplary/video-app.json index e36d6c54d6f..d3007dc2b83 100644 --- a/adapters/madsense/madsensetest/exemplary/video-app.json +++ b/adapters/madsense/madsensetest/exemplary/video-app.json @@ -30,7 +30,7 @@ { "expectedRequest": { "method": "POST", - "uri": "https://ads.madsense.io/pbs?company_id=9876543", + "uri": "https://test.localhost.com?company_id=9876543", "headers": { "Accept": [ "application/json" diff --git a/adapters/madsense/madsensetest/exemplary/video-web-pod.json b/adapters/madsense/madsensetest/exemplary/video-web-pod.json index b2194049dc1..ce3e354cb60 100644 --- a/adapters/madsense/madsensetest/exemplary/video-web-pod.json +++ b/adapters/madsense/madsensetest/exemplary/video-web-pod.json @@ -47,7 +47,7 @@ { "expectedRequest": { "method": "POST", - "uri": "https://ads.madsense.io/pbs?company_id=9876543", + "uri": "https://test.localhost.com?company_id=9876543", "headers": { "Accept": [ "application/json" diff --git a/adapters/madsense/madsensetest/exemplary/video-web.json b/adapters/madsense/madsensetest/exemplary/video-web.json index 0b4470cd60e..bf66a6470fd 100644 --- a/adapters/madsense/madsensetest/exemplary/video-web.json +++ b/adapters/madsense/madsensetest/exemplary/video-web.json @@ -31,7 +31,7 @@ { "expectedRequest": { "method": "POST", - "uri": "https://ads.madsense.io/pbs?company_id=9876543", + "uri": "https://test.localhost.com?company_id=9876543", "headers": { "Accept": [ "application/json" diff --git a/adapters/madsense/madsensetest/supplemental/bad-response-error.json b/adapters/madsense/madsensetest/supplemental/bad-response-error.json new file mode 100644 index 00000000000..1ce30f8c3f3 --- /dev/null +++ b/adapters/madsense/madsensetest/supplemental/bad-response-error.json @@ -0,0 +1,93 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "video": { + "mimes": [ + "video/mp4" + ], + "w": 1920, + "h": 1080 + }, + "ext": { + "bidder": { + "company_id": "9876543" + } + } + } + ], + "app": { + "bundle": "54321" + }, + "device": { + "ip": "1.2.3.4", + "ua": "user-agent" + } + }, + "httpCalls": [ + { + "expectedRequest": { + "method": "POST", + "uri": "https://test.localhost.com?company_id=9876543", + "headers": { + "Accept": [ + "application/json" + ], + "Content-Type": [ + "application/json;charset=utf-8" + ], + "X-Openrtb-Version": [ + "2.6" + ], + "User-Agent": [ + "user-agent" + ], + "X-Forwarded-For": [ + "1.2.3.4" + ] + }, + "body": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "video": { + "mimes": [ + "video/mp4" + ], + "w": 1920, + "h": 1080 + }, + "ext": { + "bidder": { + "company_id": "9876543" + } + } + } + ], + "device": { + "ip": "1.2.3.4", + "ua": "user-agent" + }, + "app": { + "bundle": "54321" + } + }, + "impIDs":["test-imp-id"] + }, + "mockResponse": { + "status": 200, + "body": "invalid response" + } + } + ], + "expectedMakeBidsErrors": [ + { + "value": "Bad Server Response", + "comparison": "literal" + } + ] +} + diff --git a/adapters/madsense/madsensetest/supplemental/bad-response-mtype.json b/adapters/madsense/madsensetest/supplemental/bad-response-mtype.json index e3b8c2fdd11..6c9c6c94a67 100644 --- a/adapters/madsense/madsensetest/supplemental/bad-response-mtype.json +++ b/adapters/madsense/madsensetest/supplemental/bad-response-mtype.json @@ -30,7 +30,7 @@ { "expectedRequest": { "method": "POST", - "uri": "https://ads.madsense.io/pbs?company_id=9876543", + "uri": "https://test.localhost.com?company_id=9876543", "headers": { "Accept": [ "application/json" diff --git a/adapters/madsense/madsensetest/supplemental/bad-request-example.json b/adapters/madsense/madsensetest/supplemental/bad-response-status-400.json similarity index 96% rename from adapters/madsense/madsensetest/supplemental/bad-request-example.json rename to adapters/madsense/madsensetest/supplemental/bad-response-status-400.json index 40e1efabfad..87424d2f86c 100644 --- a/adapters/madsense/madsensetest/supplemental/bad-request-example.json +++ b/adapters/madsense/madsensetest/supplemental/bad-response-status-400.json @@ -52,7 +52,7 @@ "1.2.3.4" ] }, - "uri": "https://ads.madsense.io/pbs?company_id=9876543", + "uri": "https://test.localhost.com?company_id=9876543", "body": { "id": "test-request-id", "imp": [ diff --git a/adapters/madsense/madsensetest/supplemental/bad-response-status-500.json b/adapters/madsense/madsensetest/supplemental/bad-response-status-500.json index f3b5a593b4b..143431c7144 100644 --- a/adapters/madsense/madsensetest/supplemental/bad-response-status-500.json +++ b/adapters/madsense/madsensetest/supplemental/bad-response-status-500.json @@ -30,7 +30,7 @@ { "expectedRequest": { "method": "POST", - "uri": "https://ads.madsense.io/pbs?company_id=9876543", + "uri": "https://test.localhost.com?company_id=9876543", "headers": { "Accept": [ "application/json" diff --git a/adapters/madsense/madsensetest/supplemental/no-content-response.json b/adapters/madsense/madsensetest/supplemental/no-content-response.json index af9940c6db3..27caa245cd3 100644 --- a/adapters/madsense/madsensetest/supplemental/no-content-response.json +++ b/adapters/madsense/madsensetest/supplemental/no-content-response.json @@ -30,7 +30,7 @@ { "expectedRequest": { "method": "POST", - "uri": "https://ads.madsense.io/pbs?company_id=9876543", + "uri": "https://test.localhost.com?company_id=9876543", "headers": { "Accept": [ "application/json" diff --git a/adapters/madsense/madsensetest/supplemental/test-response.json b/adapters/madsense/madsensetest/supplemental/test-response.json new file mode 100644 index 00000000000..9ef7c7894f4 --- /dev/null +++ b/adapters/madsense/madsensetest/supplemental/test-response.json @@ -0,0 +1,143 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "test": 1, + "imp": [ + { + "id": "test-imp-id", + "video": { + "mimes": [ + "video/mp4" + ], + "w": 1920, + "h": 1080 + }, + "ext": { + "bidder": { + "company_id": "9876543" + } + } + } + ], + "app": { + "bundle": "54321" + }, + "device": { + "ip": "1.2.3.4", + "ua": "user-agent" + } + }, + "httpCalls": [ + { + "expectedRequest": { + "method": "POST", + "uri": "https://test.localhost.com?company_id=test", + "headers": { + "Accept": [ + "application/json" + ], + "Content-Type": [ + "application/json;charset=utf-8" + ], + "X-Openrtb-Version": [ + "2.6" + ], + "User-Agent": [ + "user-agent" + ], + "X-Forwarded-For": [ + "1.2.3.4" + ] + }, + "body": { + "id": "test-request-id", + "test": 1, + "imp": [ + { + "id": "test-imp-id", + "video": { + "mimes": [ + "video/mp4" + ], + "w": 1920, + "h": 1080 + }, + "ext": { + "bidder": { + "company_id": "9876543" + } + } + } + ], + "device": { + "ip": "1.2.3.4", + "ua": "user-agent" + }, + "app": { + "bundle": "54321" + } + }, + "impIDs":["test-imp-id"] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "cur": "USD", + "seatbid": [ + { + "bid": [ + { + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800", + "impid": "test-imp-id", + "price": 10, + "adm": "some-test-ad", + "crid": "54321", + "w": 1920, + "h": 1080, + "mtype": 2, + "dur": 15, + "cat": [ + "IAB1-5", + "IAB1-6" + ] + } + ], + "seat": "madsense" + } + ] + } + } + } + ], + "expectedBidResponses": [ + { + "currency": "USD", + "bids": [ + { + "bid": { + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800", + "impid": "test-imp-id", + "price": 10, + "adm": "some-test-ad", + "crid": "54321", + "w": 1920, + "h": 1080, + "mtype": 2, + "dur": 15, + "cat": [ + "IAB1-5", + "IAB1-6" + ] + }, + "type": "video", + "video": { + "duration": 15, + "primary_category": "IAB1-5" + } + } + ] + } + ] +} + diff --git a/adapters/madsense/params_test.go b/adapters/madsense/params_test.go index 7c0e7c002fc..6591767acc2 100644 --- a/adapters/madsense/params_test.go +++ b/adapters/madsense/params_test.go @@ -52,4 +52,5 @@ var invalidParams = []string{ `{}`, `{"companyId": "987654a"}`, `{"companyId": "98765432"}`, + `{"company_id": ""}`, } diff --git a/static/bidder-params/madsense.json b/static/bidder-params/madsense.json index 39b5ddab32e..54410fd2aee 100644 --- a/static/bidder-params/madsense.json +++ b/static/bidder-params/madsense.json @@ -6,7 +6,8 @@ "properties": { "company_id": { "type": "string", - "description": "An id used to identify madSense company" + "description": "An id used to identify madSense company", + "minLength": 1 } }, "required": ["company_id"]