From dc07339c72f78a06a9d611e91efe747f3f0e32bd Mon Sep 17 00:00:00 2001 From: wildcat0601 Date: Mon, 30 Aug 2021 11:25:52 +0800 Subject: [PATCH 01/15] adview adapter v1.0 --- adapters/adview/adview.go | 167 ++++++++++++++++++ adapters/adview/adview_test.go | 28 +++ .../adviewtest/exemplary/banner-app.json | 146 +++++++++++++++ .../adviewtest/exemplary/native-app.json | 144 +++++++++++++++ .../adviewtest/exemplary/video-app.json | 156 ++++++++++++++++ .../adview/adviewtest/params/race/banner.json | 4 + .../adview/adviewtest/params/race/native.json | 4 + .../adview/adviewtest/params/race/video.json | 4 + .../adviewtest/supplemental/bad-request.json | 50 ++++++ .../supplemental/empty-response.json | 44 +++++ .../supplemental/invalid-imp-mediatype.json | 61 +++++++ .../supplemental/nobid-response.json | 51 ++++++ .../adviewtest/supplemental/server-error.json | 51 ++++++ .../supplemental/unparsable-response.json | 51 ++++++ adapters/adview/params_test.go | 51 ++++++ config/config.go | 1 + exchange/adapter_builders.go | 2 + openrtb_ext/bidders.go | 2 + openrtb_ext/imp_adview.go | 6 + static/bidder-info/adview.yaml | 9 + static/bidder-params/adview.json | 18 ++ 21 files changed, 1050 insertions(+) create mode 100644 adapters/adview/adview.go create mode 100644 adapters/adview/adview_test.go create mode 100644 adapters/adview/adviewtest/exemplary/banner-app.json create mode 100644 adapters/adview/adviewtest/exemplary/native-app.json create mode 100644 adapters/adview/adviewtest/exemplary/video-app.json create mode 100644 adapters/adview/adviewtest/params/race/banner.json create mode 100644 adapters/adview/adviewtest/params/race/native.json create mode 100644 adapters/adview/adviewtest/params/race/video.json create mode 100644 adapters/adview/adviewtest/supplemental/bad-request.json create mode 100644 adapters/adview/adviewtest/supplemental/empty-response.json create mode 100644 adapters/adview/adviewtest/supplemental/invalid-imp-mediatype.json create mode 100644 adapters/adview/adviewtest/supplemental/nobid-response.json create mode 100644 adapters/adview/adviewtest/supplemental/server-error.json create mode 100644 adapters/adview/adviewtest/supplemental/unparsable-response.json create mode 100644 adapters/adview/params_test.go create mode 100644 openrtb_ext/imp_adview.go create mode 100644 static/bidder-info/adview.yaml create mode 100644 static/bidder-params/adview.json diff --git a/adapters/adview/adview.go b/adapters/adview/adview.go new file mode 100644 index 00000000000..37e4c2c2ce0 --- /dev/null +++ b/adapters/adview/adview.go @@ -0,0 +1,167 @@ +package adview + +import ( + "encoding/json" + "fmt" + "net/http" + "text/template" + + "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/macros" + "github.com/prebid/prebid-server/openrtb_ext" +) + +type adViewAdapter struct { + EndpointTemplate template.Template +} + +// Builder builds a new instance of the Adf adapter for the given bidder with the given config. +func Builder(bidderName openrtb_ext.BidderName, config config.Adapter) (adapters.Bidder, error) { + + urlTemplate, err := template.New("endpointTemplate").Parse(config.Endpoint) + if err != nil { + return nil, fmt.Errorf("unable to parse endpoint url template: %v", err) + } + + bidder := &adViewAdapter{ + EndpointTemplate: *urlTemplate, + } + return bidder, nil +} + +func (adapter *adViewAdapter) MakeRequests(request *openrtb2.BidRequest, requestInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) { + var errors []error + var validImps = make([]openrtb2.Imp, 0, len(request.Imp)) + requestData := make([]*adapters.RequestData, 0, len(request.Imp)) + + for _, imp := range request.Imp { + + var bidderExt adapters.ExtImpBidder + if err := json.Unmarshal(imp.Ext, &bidderExt); err != nil { + errors = append(errors, &errortypes.BadInput{ + Message: err.Error(), + }) + continue + } + //采用 adview + var advImpExt openrtb_ext.ExtImpAdview + if err := json.Unmarshal(bidderExt.Bidder, &advImpExt); err != nil { + errors = append(errors, &errortypes.BadInput{ + Message: err.Error(), + }) + continue + } + + imp.TagID = advImpExt.MasterTagID //tagid means posid + + //for adview bid request + if imp.Banner != nil { + if len(imp.Banner.Format) != 0 { + imp.Banner.H = &imp.Banner.Format[0].H + imp.Banner.W = &imp.Banner.Format[0].W + } + } + + validImps = append(validImps, imp) + request.Imp = validImps + + //make json + requestJSON, err := json.Marshal(request) + if err != nil { + errors = append(errors, err) + continue + } + + //end point + url, err := adapter.buildEndpointURL(&advImpExt) + if err != nil { + errors = append(errors, err) + continue + } + + reqData := &adapters.RequestData{ + Method: http.MethodPost, + Body: requestJSON, + Uri: url, + } + + requestData = append(requestData, reqData) + } + + //return []*adapters.RequestData{requestData}, errors + return requestData, errors +} + +func (adapter *adViewAdapter) MakeBids(request *openrtb2.BidRequest, requestData *adapters.RequestData, responseData *adapters.ResponseData) (*adapters.BidderResponse, []error) { + + if responseData.StatusCode == http.StatusNoContent { + return nil, nil + } + + if responseData.StatusCode == http.StatusBadRequest { + err := &errortypes.BadInput{ + Message: "Unexpected status code: 400. Bad request from publisher.", + } + return nil, []error{err} + } + + if responseData.StatusCode != http.StatusOK { + err := &errortypes.BadServerResponse{ + Message: fmt.Sprintf("Unexpected status code: %d.", responseData.StatusCode), + } + return nil, []error{err} + } + + var response openrtb2.BidResponse + if err := json.Unmarshal(responseData.Body, &response); err != nil { + return nil, []error{err} + } + + bidResponse := adapters.NewBidderResponseWithBidsCapacity(len(request.Imp)) + bidResponse.Currency = response.Cur + var errors []error + for _, seatBid := range response.SeatBid { + for i, bid := range seatBid.Bid { + bidType, err := getMediaTypeForImp(bid.ImpID, request.Imp) + if err != nil { + errors = append(errors, err) + continue + } + bidResponse.Bids = append(bidResponse.Bids, &adapters.TypedBid{ + Bid: &seatBid.Bid[i], + BidType: bidType, + }) + } + } + + return bidResponse, errors +} + +// Builds endpoint url based on adapter-specific pub settings from imp.ext +func (adapter *adViewAdapter) buildEndpointURL(params *openrtb_ext.ExtImpAdview) (string, error) { + + endpointParams := macros.EndpointTemplateParams{AccountID: params.AccountID} + return macros.ResolveMacros(adapter.EndpointTemplate, endpointParams) + +} + +func getMediaTypeForImp(impID string, imps []openrtb2.Imp) (openrtb_ext.BidType, error) { + for _, imp := range imps { + if imp.ID == impID { + if imp.Banner != nil { + return openrtb_ext.BidTypeBanner, nil + } else if imp.Video != nil { + return openrtb_ext.BidTypeVideo, nil + } else if imp.Native != nil { + return openrtb_ext.BidTypeNative, nil + } + } + } + + return "", &errortypes.BadInput{ + Message: fmt.Sprintf("Failed to find supported impression \"%s\" mediatype", impID), + } +} diff --git a/adapters/adview/adview_test.go b/adapters/adview/adview_test.go new file mode 100644 index 00000000000..fa5d7f079f0 --- /dev/null +++ b/adapters/adview/adview_test.go @@ -0,0 +1,28 @@ +package adview + +import ( + "testing" + + "github.com/prebid/prebid-server/adapters/adapterstest" + "github.com/prebid/prebid-server/config" + "github.com/prebid/prebid-server/openrtb_ext" + "github.com/stretchr/testify/assert" +) + +func TestJsonSamples(t *testing.T) { + bidder, buildErr := Builder(openrtb_ext.BidderAdview, config.Adapter{ + Endpoint: "https://bid.adview.com/agent/thirdAdxService/{{.AccountID}}"}) + + if buildErr != nil { + t.Fatalf("Builder returned unexpected error %v", buildErr) + } + + adapterstest.RunJSONBidderTest(t, "adviewtest", bidder) +} + +func TestEndpointTemplateMalformed(t *testing.T) { + _, buildErr := Builder(openrtb_ext.BidderAdview, config.Adapter{ + Endpoint: "{{Malformed}}"}) + + assert.Error(t, buildErr) +} diff --git a/adapters/adview/adviewtest/exemplary/banner-app.json b/adapters/adview/adviewtest/exemplary/banner-app.json new file mode 100644 index 00000000000..87ed6eac6a1 --- /dev/null +++ b/adapters/adview/adviewtest/exemplary/banner-app.json @@ -0,0 +1,146 @@ +{ + "mockBidRequest": { + "id": "some-request-id", + "device": { + "ua": "test-user-agent", + "ip": "123.123.123.123", + "ifa":"00000000-0000-0000-0000-000000000000", + "language": "en", + "dnt": 0 + }, + "tmax": 1000, + "user": { + "buyeruid": "awesome-user" + }, + "app": { + "publisher": { + "id": "123456789" + }, + "cat": [ + "IAB22-1" + ], + "bundle": "com.app.awesome", + "name": "Awesome App", + "domain": "awesomeapp.com", + "id": "123456789" + }, + "imp": [ + { + "id": "some-impression-id", + "banner": { + "w": 320, + "h": 50 + }, + "ext": { + "bidder": { + "placementId": "posid00001", + "accountId": "accountid01" + } + } + } + ] + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://bid.adview.com/agent/thirdAdxService/accountid01", + "body": { + "id": "some-request-id", + "device": { + "ua": "test-user-agent", + "ip": "123.123.123.123", + "ifa":"00000000-0000-0000-0000-000000000000", + "language": "en", + "dnt": 0 + }, + "imp": [ + { + "id": "some-impression-id", + "banner": { + "w": 320, + "h": 50 + }, + "tagid": "posid00001", + "ext": { + "bidder": { + "placementId": "posid00001", + "accountId": "accountid01" + } + } + } + ], + "app": { + "id": "123456789", + "name": "Awesome App", + "bundle": "com.app.awesome", + "domain": "awesomeapp.com", + "cat": [ + "IAB22-1" + ], + "publisher": { + "id": "123456789" + } + }, + "user": { + "buyeruid": "awesome-user" + }, + "tmax": 1000 + } + }, + "mockResponse": { + "status": 200, + "body": { + "id": "awesome-resp-id", + "seatbid": [ + { + "bid": [ + { + "id": "a3ae1b4e2fc24a4fb45540082e98e161", + "impid": "some-impression-id", + "price": 3.5, + "adm": "awesome-markup", + "adomain": [ + "awesome.com" + ], + "crid": "20", + "w": 320, + "h": 50 + } + ], + "type": "banner", + "seat": "adview" + } + ], + "cur": "USD", + "ext": { + "responsetimemillis": { + "adview": 154 + }, + "tmaxrequest": 1000 + } + } + } + } + ], + "expectedBidResponses": [ + { + "bids": [ + { + "bid": { + "id": "a3ae1b4e2fc24a4fb45540082e98e161", + "impid": "some-impression-id", + "price": 3.5, + "adm": "awesome-markup", + "adomain": [ + "awesome.com" + ], + "crid": "20", + "w": 320, + "h": 50 + }, + "type": "banner" + } + ] + } + ] +} diff --git a/adapters/adview/adviewtest/exemplary/native-app.json b/adapters/adview/adviewtest/exemplary/native-app.json new file mode 100644 index 00000000000..aa64b20a2a2 --- /dev/null +++ b/adapters/adview/adviewtest/exemplary/native-app.json @@ -0,0 +1,144 @@ +{ + "mockBidRequest": { + "id": "some-request-id", + "device": { + "ua": "test-user-agent", + "ip": "123.123.123.123", + "ifa":"00000000-0000-0000-0000-000000000000", + "language": "en", + "dnt": 0 + }, + "tmax": 1000, + "user": { + "buyeruid": "awesome-user" + }, + "app": { + "publisher": { + "id": "123456789" + }, + "cat": [ + "IAB22-1" + ], + "bundle": "com.app.awesome", + "name": "Awesome App", + "domain": "awesomeapp.com", + "id": "123456789" + }, + "imp": [ + { + "id": "some-impression-id", + "tagid": "posid00001", + "native": { + "ver":"1.1", + "request":"{\"adunit\":2,\"assets\":[{\"id\":3,\"img\":{\"h\":120,\"hmin\":0,\"type\":3,\"w\":180,\"wmin\":0},\"required\":1},{\"id\":0,\"required\":1,\"title\":{\"len\":25}},{\"data\":{\"len\":25,\"type\":1},\"id\":4,\"required\":1},{\"data\":{\"len\":140,\"type\":2},\"id\":6,\"required\":1}],\"context\":1,\"layout\":1,\"contextsubtype\":11,\"plcmtcnt\":1,\"plcmttype\":2,\"ver\":\"1.1\",\"ext\":{\"banner\":{\"w\":320,\"h\":50}}}" + }, + "ext": { + "bidder": { + "placementId": "posid00001", + "accountId": "accountid01" + } + } + } + ] + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://bid.adview.com/agent/thirdAdxService/accountid01", + "body": { + "id": "some-request-id", + "device": { + "ua": "test-user-agent", + "ip": "123.123.123.123", + "ifa":"00000000-0000-0000-0000-000000000000", + "language": "en", + "dnt": 0 + }, + "imp": [ + { + "id": "some-impression-id", + "native": { + "ver":"1.1", + "request":"{\"adunit\":2,\"assets\":[{\"id\":3,\"img\":{\"h\":120,\"hmin\":0,\"type\":3,\"w\":180,\"wmin\":0},\"required\":1},{\"id\":0,\"required\":1,\"title\":{\"len\":25}},{\"data\":{\"len\":25,\"type\":1},\"id\":4,\"required\":1},{\"data\":{\"len\":140,\"type\":2},\"id\":6,\"required\":1}],\"context\":1,\"layout\":1,\"contextsubtype\":11,\"plcmtcnt\":1,\"plcmttype\":2,\"ver\":\"1.1\",\"ext\":{\"banner\":{\"w\":320,\"h\":50}}}" + }, + "ext": { + "bidder": { + "placementId": "posid00001", + "accountId": "accountid01" + } + }, + "tagid": "posid00001" + } + ], + "app": { + "id": "123456789", + "name": "Awesome App", + "bundle": "com.app.awesome", + "domain": "awesomeapp.com", + "cat": [ + "IAB22-1" + ], + "publisher": { + "id": "123456789" + } + }, + "user": { + "buyeruid": "awesome-user" + }, + "tmax": 1000 + } + }, + "mockResponse": { + "status": 200, + "body": { + "id": "awesome-resp-id", + "seatbid": [ + { + "bid": [ + { + "id": "a3ae1b4e2fc24a4fb45540082e98e161", + "impid": "some-impression-id", + "price": 3.5, + "adm": "awesome-markup", + "adomain": [ + "awesome.com" + ], + "crid": "20" + } + ], + "type": "native", + "seat": "adview" + } + ], + "cur": "USD", + "ext": { + "responsetimemillis": { + "adview": 154 + }, + "tmaxrequest": 1000 + } + } + } + } + ], + "expectedBidResponses": [ + { + "bids":[ + { + "bid": { + "id": "a3ae1b4e2fc24a4fb45540082e98e161", + "impid": "some-impression-id", + "price": 3.5, + "adm": "awesome-markup", + "crid": "20", + "adomain": [ + "awesome.com" + ] + }, + "type": "native" + } + ] + } + ] + } + diff --git a/adapters/adview/adviewtest/exemplary/video-app.json b/adapters/adview/adviewtest/exemplary/video-app.json new file mode 100644 index 00000000000..c24522f52b6 --- /dev/null +++ b/adapters/adview/adviewtest/exemplary/video-app.json @@ -0,0 +1,156 @@ +{ + "mockBidRequest": { + "id": "some-request-id", + "device": { + "ua": "test-user-agent", + "ip": "123.123.123.123", + "ifa":"00000000-0000-0000-0000-000000000000", + "language": "en", + "dnt": 0 + }, + "tmax": 1000, + "user": { + "buyeruid": "awesome-user" + }, + "app": { + "publisher": { + "id": "123456789" + }, + "cat": [ + "IAB22-1" + ], + "bundle": "com.app.awesome", + "name": "Awesome App", + "domain": "awesomeapp.com", + "id": "123456789" + }, + "imp": [ + { + "id": "some-impression-id", + "tagid": "posid00001", + "video": { + "mimes": [ + "video/mp4" + ], + "w": 640, + "h": 480, + "minduration": 120, + "maxduration": 150 + }, + "ext": { + "bidder": { + "placementId": "posid00001", + "accountId": "accountid01" + } + } + } + ] + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://bid.adview.com/agent/thirdAdxService/accountid01", + "body": { + "id": "some-request-id", + "device": { + "ua": "test-user-agent", + "ip": "123.123.123.123", + "ifa":"00000000-0000-0000-0000-000000000000", + "language": "en", + "dnt": 0 + }, + "imp": [ + { + "id": "some-impression-id", + "video": { + "mimes": [ + "video/mp4" + ], + "minduration": 120, + "maxduration": 150, + "w": 640, + "h": 480 + }, + "ext": { + "bidder": { + "placementId": "posid00001", + "accountId": "accountid01" + } + }, + "tagid": "posid00001" + } + ], + "app": { + "id": "123456789", + "name": "Awesome App", + "bundle": "com.app.awesome", + "domain": "awesomeapp.com", + "cat": [ + "IAB22-1" + ], + "publisher": { + "id": "123456789" + } + }, + "user": { + "buyeruid": "awesome-user" + }, + "tmax": 1000 + } + }, + "mockResponse": { + "status": 200, + "body": { + "id": "awesome-resp-id", + "seatbid": [ + { + "bid": [ + { + "id": "a3ae1b4e2fc24a4fb45540082e98e161", + "impid": "some-impression-id", + "price": 3.5, + "adm": "awesome-markup", + "adomain": [ + "awesome.com" + ], + "crid": "20", + "w": 1280, + "h": 720 + } + ], + "seat": "adview" + } + ], + "cur": "USD", + "ext": { + "responsetimemillis": { + "acuityads": 154 + }, + "tmaxrequest": 1000 + } + } + } + } + ], + "expectedBidResponses": [ + { + "bids":[ + { + "bid": { + "id": "a3ae1b4e2fc24a4fb45540082e98e161", + "impid": "some-impression-id", + "price": 3.5, + "adm": "awesome-markup", + "crid": "20", + "adomain": [ + "awesome.com" + ], + "w": 1280, + "h": 720 + }, + "type": "video" + } + ] + } + ] +} diff --git a/adapters/adview/adviewtest/params/race/banner.json b/adapters/adview/adviewtest/params/race/banner.json new file mode 100644 index 00000000000..9d8ae638e2d --- /dev/null +++ b/adapters/adview/adviewtest/params/race/banner.json @@ -0,0 +1,4 @@ +{ + "placementId": "posid00001", + "accountId": "touchpal18" +} diff --git a/adapters/adview/adviewtest/params/race/native.json b/adapters/adview/adviewtest/params/race/native.json new file mode 100644 index 00000000000..9d8ae638e2d --- /dev/null +++ b/adapters/adview/adviewtest/params/race/native.json @@ -0,0 +1,4 @@ +{ + "placementId": "posid00001", + "accountId": "touchpal18" +} diff --git a/adapters/adview/adviewtest/params/race/video.json b/adapters/adview/adviewtest/params/race/video.json new file mode 100644 index 00000000000..9d8ae638e2d --- /dev/null +++ b/adapters/adview/adviewtest/params/race/video.json @@ -0,0 +1,4 @@ +{ + "placementId": "posid00001", + "accountId": "touchpal18" +} diff --git a/adapters/adview/adviewtest/supplemental/bad-request.json b/adapters/adview/adviewtest/supplemental/bad-request.json new file mode 100644 index 00000000000..131e6d830a2 --- /dev/null +++ b/adapters/adview/adviewtest/supplemental/bad-request.json @@ -0,0 +1,50 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [{ + "id": "test-imp-id", + "native": { + "request": "" + }, + "ext": { + "bidder": { + "placementId": "posid00001", + "accountId": "accountid01" + } + } + }] + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://bid.adview.com/agent/thirdAdxService/accountid01", + "body": { + "id": "test-request-id", + "imp": [{ + "ext": { + "bidder": { + "placementId": "posid00001", + "accountId": "accountid01" + } + }, + "id": "test-imp-id", + "native": { + "request": "" + }, + "tagid": "posid00001" + }] + } + }, + "mockResponse": { + "status": 400 + } + } + ], + "expectedBidResponses": [], + "expectedMakeBidsErrors": [ + { + "value": "Unexpected status code: 400. Bad request from publisher.", + "comparison": "literal" + } + ] +} diff --git a/adapters/adview/adviewtest/supplemental/empty-response.json b/adapters/adview/adviewtest/supplemental/empty-response.json new file mode 100644 index 00000000000..5bd86bc99a1 --- /dev/null +++ b/adapters/adview/adviewtest/supplemental/empty-response.json @@ -0,0 +1,44 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [{ + "id": "test-imp-id", + "native": { + "request": "" + }, + "ext": { + "bidder": { + "placementId": "posid00001", + "accountId": "accountid01" + } + } + }] + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://bid.adview.com/agent/thirdAdxService/accountid01", + "body": { + "id": "test-request-id", + "imp": [{ + "ext": { + "bidder": { + "placementId": "posid00001", + "accountId": "accountid01" + } + }, + "id": "test-imp-id", + "native": { + "request": "" + }, + "tagid": "posid00001" + }] + } + }, + "mockResponse": { + "status": 204 + } + } + ], + "expectedBidResponses": [] +} diff --git a/adapters/adview/adviewtest/supplemental/invalid-imp-mediatype.json b/adapters/adview/adviewtest/supplemental/invalid-imp-mediatype.json new file mode 100644 index 00000000000..c0d83047e53 --- /dev/null +++ b/adapters/adview/adviewtest/supplemental/invalid-imp-mediatype.json @@ -0,0 +1,61 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [{ + "id": "test-imp-id", + "audio": {}, + "ext": { + "bidder": { + "placementId": "posid00001", + "accountId": "accountid01" + } + } + }] + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://bid.adview.com/agent/thirdAdxService/accountid01", + "body": { + "id": "test-request-id", + "imp": [{ + "ext": { + "bidder": { + "placementId": "posid00001", + "accountId": "accountid01" + } + }, + "id": "test-imp-id", + "audio": { + "mimes": null + }, + "tagid": "posid00001" + }] + } + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "seatbid": [{ + "bid": [{ + "id": "test-bid-id", + "impid": "test-imp-id", + "price": 10, + "adm": "{vast xml}", + "crid": "test-creative-id" + }] + }], + "cur": "USD" + } + } + } + ], + "expectedBidResponses": [], + "expectedMakeBidsErrors": [ + { + "value": "Failed to find supported impression \"test-imp-id\" mediatype", + "comparison": "literal" + } + ] +} diff --git a/adapters/adview/adviewtest/supplemental/nobid-response.json b/adapters/adview/adviewtest/supplemental/nobid-response.json new file mode 100644 index 00000000000..f2c8864d4b1 --- /dev/null +++ b/adapters/adview/adviewtest/supplemental/nobid-response.json @@ -0,0 +1,51 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [{ + "id": "test-imp-id", + "native": { + "request": "" + }, + "ext": { + "bidder": { + "placementId": "posid00001", + "accountId": "accountid01" + } + } + }] + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://bid.adview.com/agent/thirdAdxService/accountid01", + "body": { + "id": "test-request-id", + "imp": [{ + "ext": { + "bidder": { + "placementId": "posid00001", + "accountId": "accountid01" + } + }, + "id": "test-imp-id", + "native": { + "request": "" + }, + "tagid": "posid00001" + }] + } + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "seatbid": null, + "bidid": null, + "cur": null + } + } + } + ], + "expectedBidResponses": [], + "expectedMakeBidsErrors": [] +} diff --git a/adapters/adview/adviewtest/supplemental/server-error.json b/adapters/adview/adviewtest/supplemental/server-error.json new file mode 100644 index 00000000000..7894be1b70a --- /dev/null +++ b/adapters/adview/adviewtest/supplemental/server-error.json @@ -0,0 +1,51 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [{ + "id": "test-imp-id", + "native": { + "request": "" + }, + "ext": { + "bidder": { + "placementId": "posid00001", + "accountId": "accountid01" + } + } + }] + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://bid.adview.com/agent/thirdAdxService/accountid01", + "body": { + "id": "test-request-id", + "imp": [{ + "ext": { + "bidder": { + "placementId": "posid00001", + "accountId": "accountid01" + } + }, + "id": "test-imp-id", + "native": { + "request": "" + }, + "tagid": "posid00001" + }] + } + }, + "mockResponse": { + "status": 500, + "body": "Server error" + } + } + ], + "expectedBidResponses": [], + "expectedMakeBidsErrors": [ + { + "value": "Unexpected status code: 500.", + "comparison": "literal" + } + ] +} diff --git a/adapters/adview/adviewtest/supplemental/unparsable-response.json b/adapters/adview/adviewtest/supplemental/unparsable-response.json new file mode 100644 index 00000000000..cef70ba8771 --- /dev/null +++ b/adapters/adview/adviewtest/supplemental/unparsable-response.json @@ -0,0 +1,51 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [{ + "id": "test-imp-id", + "native": { + "request": "" + }, + "ext": { + "bidder": { + "placementId": "posid00001", + "accountId": "accountid01" + } + } + }] + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://bid.adview.com/agent/thirdAdxService/accountid01", + "body": { + "id": "test-request-id", + "imp": [{ + "ext": { + "bidder": { + "placementId": "posid00001", + "accountId": "accountid01" + } + }, + "id": "test-imp-id", + "native": { + "request": "" + }, + "tagid": "posid00001" + }] + } + }, + "mockResponse": { + "status": 200, + "body": "" + } + } + ], + "expectedBidResponses": [], + "expectedMakeBidsErrors": [ + { + "value": "json: cannot unmarshal string into Go value of type openrtb2.BidResponse", + "comparison": "literal" + } + ] +} diff --git a/adapters/adview/params_test.go b/adapters/adview/params_test.go new file mode 100644 index 00000000000..e7c2838c4c7 --- /dev/null +++ b/adapters/adview/params_test.go @@ -0,0 +1,51 @@ +package adview + +import ( + "encoding/json" + "testing" + + "github.com/prebid/prebid-server/openrtb_ext" +) + +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.BidderAdview, json.RawMessage(validParam)); err != nil { + t.Errorf("Schema rejected Adview params: %s", validParam) + } + } +} + +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.BidderAdview, json.RawMessage(invalidParam)); err == nil { + t.Errorf("Schema allowed unexpected params: %s", invalidParam) + } + } +} + +var validParams = []string{ + `{ "placementId": "posid00001", "accountId": "accountid01"}`, +} + +var invalidParams = []string{ + ``, + `null`, + `true`, + `5`, + `4.2`, + `[]`, + `{}`, + `{"adCode": "string", "seatCode": 5, "originalPublisherid": "string"}`, + `{ "accountId": "accountid01" }`, + `{ "placementId": "", "accountId": "" }`, +} diff --git a/config/config.go b/config/config.go index c701bcd5242..be29740bf8c 100644 --- a/config/config.go +++ b/config/config.go @@ -756,6 +756,7 @@ func SetupViper(v *viper.Viper, filename string) { v.SetDefault("adapters.adtarget.endpoint", "http://ghb.console.adtarget.com.tr/pbs/ortb") v.SetDefault("adapters.adtelligent.endpoint", "http://ghb.adtelligent.com/pbs/ortb") v.SetDefault("adapters.advangelists.endpoint", "http://nep.advangelists.com/xp/get?pubid={{.PublisherID}}") + v.SetDefault("adapters.adview.endpoint", "https://bid.adview.com/agent/thirdAdxService/{{.AccountID}}") v.SetDefault("adapters.adxcg.disabled", true) v.SetDefault("adapters.adyoulike.endpoint", "https://broker.omnitagjs.com/broker/bid?partnerId=19340f4f097d16f41f34fc0274981ca4") v.SetDefault("adapters.aja.endpoint", "https://ad.as.amanad.adtdp.com/v1/bid/4") diff --git a/exchange/adapter_builders.go b/exchange/adapter_builders.go index ae7db1967d7..60dbcf40337 100755 --- a/exchange/adapter_builders.go +++ b/exchange/adapter_builders.go @@ -21,6 +21,7 @@ import ( "github.com/prebid/prebid-server/adapters/adtarget" "github.com/prebid/prebid-server/adapters/adtelligent" "github.com/prebid/prebid-server/adapters/advangelists" + "github.com/prebid/prebid-server/adapters/adview" "github.com/prebid/prebid-server/adapters/adxcg" "github.com/prebid/prebid-server/adapters/adyoulike" "github.com/prebid/prebid-server/adapters/aja" @@ -150,6 +151,7 @@ func newAdapterBuilders() map[openrtb_ext.BidderName]adapters.Builder { openrtb_ext.BidderAdtarget: adtarget.Builder, openrtb_ext.BidderAdtelligent: adtelligent.Builder, openrtb_ext.BidderAdvangelists: advangelists.Builder, + openrtb_ext.BidderAdview: adview.Builder, openrtb_ext.BidderAdxcg: adxcg.Builder, openrtb_ext.BidderAdyoulike: adyoulike.Builder, openrtb_ext.BidderAJA: aja.Builder, diff --git a/openrtb_ext/bidders.go b/openrtb_ext/bidders.go index 760e520eca4..e8918d442bc 100644 --- a/openrtb_ext/bidders.go +++ b/openrtb_ext/bidders.go @@ -92,6 +92,7 @@ const ( BidderAdtarget BidderName = "adtarget" BidderAdtelligent BidderName = "adtelligent" BidderAdvangelists BidderName = "advangelists" + BidderAdview BidderName = "adview" BidderAdxcg BidderName = "adxcg" BidderAdyoulike BidderName = "adyoulike" BidderAJA BidderName = "aja" @@ -221,6 +222,7 @@ func CoreBidderNames() []BidderName { BidderAdtarget, BidderAdtelligent, BidderAdvangelists, + BidderAdview, BidderAdxcg, BidderAdyoulike, BidderAJA, diff --git a/openrtb_ext/imp_adview.go b/openrtb_ext/imp_adview.go new file mode 100644 index 00000000000..fb8769ab34f --- /dev/null +++ b/openrtb_ext/imp_adview.go @@ -0,0 +1,6 @@ +package openrtb_ext + +type ExtImpAdview struct { + MasterTagID string `json:"placementId"` + AccountID string `json:"accountId"` +} \ No newline at end of file diff --git a/static/bidder-info/adview.yaml b/static/bidder-info/adview.yaml new file mode 100644 index 00000000000..077bce62b45 --- /dev/null +++ b/static/bidder-info/adview.yaml @@ -0,0 +1,9 @@ +maintainer: + email: "partner@adview.com" +gvlVendorID: 1022 +capabilities: + app: + mediaTypes: + - banner + - native + - video diff --git a/static/bidder-params/adview.json b/static/bidder-params/adview.json new file mode 100644 index 00000000000..cc30c8f75fb --- /dev/null +++ b/static/bidder-params/adview.json @@ -0,0 +1,18 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Adview Adapter Params", + "description": "A schema which validates params accepted by the adview adapter", + "type": "object", + "properties": { + "placementId": { + "type": "string", + "description": "An ID which identifies the placement selling the impression" + }, + "accountId": { + "type": "string", + "description": "Account id", + "minLength": 1 + } + }, + "required": ["placementId", "accountId"] +} From 2121b668a6ed34bf25518ab687a1e074527f4a4c Mon Sep 17 00:00:00 2001 From: wildcat0601 Date: Tue, 31 Aug 2021 15:20:46 +0800 Subject: [PATCH 02/15] fix for review #1982. --- adapters/adview/adview.go | 130 +++++++-------- adapters/adview/adview_test.go | 4 +- .../exemplary/banner-app-format.json | 152 ++++++++++++++++++ .../adviewtest/exemplary/banner-app.json | 2 +- .../adviewtest/exemplary/native-app.json | 2 +- .../adviewtest/exemplary/video-app.json | 2 +- .../adview/adviewtest/params/race/banner.json | 4 - .../adview/adviewtest/params/race/native.json | 4 - .../adview/adviewtest/params/race/video.json | 4 - adapters/adview/params_test.go | 11 +- exchange/adapter_builders.go | 2 +- openrtb_ext/bidders.go | 4 +- openrtb_ext/imp_adview.go | 2 +- static/bidder-params/adview.json | 5 +- 14 files changed, 222 insertions(+), 106 deletions(-) create mode 100644 adapters/adview/adviewtest/exemplary/banner-app-format.json delete mode 100644 adapters/adview/adviewtest/params/race/banner.json delete mode 100644 adapters/adview/adviewtest/params/race/native.json delete mode 100644 adapters/adview/adviewtest/params/race/video.json diff --git a/adapters/adview/adview.go b/adapters/adview/adview.go index 37e4c2c2ce0..a1ec855ea73 100644 --- a/adapters/adview/adview.go +++ b/adapters/adview/adview.go @@ -14,89 +14,72 @@ import ( "github.com/prebid/prebid-server/openrtb_ext" ) -type adViewAdapter struct { - EndpointTemplate template.Template +type adapter struct { + endpoint *template.Template } -// Builder builds a new instance of the Adf adapter for the given bidder with the given config. +// Builder builds a new instance of the adview adapter for the given bidder with the given config. func Builder(bidderName openrtb_ext.BidderName, config config.Adapter) (adapters.Bidder, error) { - - urlTemplate, err := template.New("endpointTemplate").Parse(config.Endpoint) + template, err := template.New("endpointTemplate").Parse(config.Endpoint) if err != nil { return nil, fmt.Errorf("unable to parse endpoint url template: %v", err) } - bidder := &adViewAdapter{ - EndpointTemplate: *urlTemplate, + bidder := &adapter{ + endpoint: template, } return bidder, nil } -func (adapter *adViewAdapter) MakeRequests(request *openrtb2.BidRequest, requestInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) { +func (a *adapter) MakeRequests(request *openrtb2.BidRequest, requestInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) { var errors []error - var validImps = make([]openrtb2.Imp, 0, len(request.Imp)) - requestData := make([]*adapters.RequestData, 0, len(request.Imp)) - - for _, imp := range request.Imp { - - var bidderExt adapters.ExtImpBidder - if err := json.Unmarshal(imp.Ext, &bidderExt); err != nil { - errors = append(errors, &errortypes.BadInput{ - Message: err.Error(), - }) - continue - } - //采用 adview - var advImpExt openrtb_ext.ExtImpAdview - if err := json.Unmarshal(bidderExt.Bidder, &advImpExt); err != nil { - errors = append(errors, &errortypes.BadInput{ - Message: err.Error(), - }) - continue - } - - imp.TagID = advImpExt.MasterTagID //tagid means posid - - //for adview bid request - if imp.Banner != nil { - if len(imp.Banner.Format) != 0 { - imp.Banner.H = &imp.Banner.Format[0].H - imp.Banner.W = &imp.Banner.Format[0].W - } - } - - validImps = append(validImps, imp) - request.Imp = validImps - - //make json - requestJSON, err := json.Marshal(request) - if err != nil { - errors = append(errors, err) - continue - } + var bidderExt adapters.ExtImpBidder + imp := &request.Imp[0]; + if err := json.Unmarshal(imp.Ext, &bidderExt); err != nil { + errors = append(errors, &errortypes.BadInput{ + Message: fmt.Sprintf("invalid imp.ext, %s", err), + }) + return nil, append(errors, err) + } + //use adview + var advImpExt openrtb_ext.ExtImpAdView + if err := json.Unmarshal(bidderExt.Bidder, &advImpExt); err != nil { + errors = append(errors, &errortypes.BadInput{ + Message: fmt.Sprintf("invalid bidderExt.Bidder, %s", err), + }) + return nil, append(errors, err) + } - //end point - url, err := adapter.buildEndpointURL(&advImpExt) - if err != nil { - errors = append(errors, err) - continue + imp.TagID = advImpExt.MasterTagID //tagid means posid + //for adview bid request + if imp.Banner != nil { + if len(imp.Banner.Format) != 0 { + bannerCopy := *imp.Banner + bannerCopy.H = &imp.Banner.Format[0].H + bannerCopy.W = &imp.Banner.Format[0].W + imp.Banner = &bannerCopy } + } - reqData := &adapters.RequestData{ - Method: http.MethodPost, - Body: requestJSON, - Uri: url, - } + url, err := a.buildEndpointURL(&advImpExt) + if err != nil { + return nil, []error{err} + } - requestData = append(requestData, reqData) + imp.Ext = nil //do not forward ext to adview + reqJSON, err := json.Marshal(request) + if err != nil { + return nil, []error{err} } - //return []*adapters.RequestData{requestData}, errors - return requestData, errors + return []*adapters.RequestData{{ + Method: http.MethodPost, + Body: reqJSON, + Uri: url, + }}, nil } -func (adapter *adViewAdapter) MakeBids(request *openrtb2.BidRequest, requestData *adapters.RequestData, responseData *adapters.ResponseData) (*adapters.BidderResponse, []error) { - +func (a *adapter) MakeBids(request *openrtb2.BidRequest, requestData *adapters.RequestData, responseData *adapters.ResponseData) (*adapters.BidderResponse, []error) { if responseData.StatusCode == http.StatusNoContent { return nil, nil } @@ -141,27 +124,22 @@ func (adapter *adViewAdapter) MakeBids(request *openrtb2.BidRequest, requestData } // Builds endpoint url based on adapter-specific pub settings from imp.ext -func (adapter *adViewAdapter) buildEndpointURL(params *openrtb_ext.ExtImpAdview) (string, error) { - +func (a *adapter) buildEndpointURL(params *openrtb_ext.ExtImpAdView) (string, error) { endpointParams := macros.EndpointTemplateParams{AccountID: params.AccountID} - return macros.ResolveMacros(adapter.EndpointTemplate, endpointParams) - + return macros.ResolveMacros(a.endpoint, endpointParams) } func getMediaTypeForImp(impID string, imps []openrtb2.Imp) (openrtb_ext.BidType, error) { + mediaType := openrtb_ext.BidTypeBanner for _, imp := range imps { if imp.ID == impID { - if imp.Banner != nil { - return openrtb_ext.BidTypeBanner, nil - } else if imp.Video != nil { - return openrtb_ext.BidTypeVideo, nil + if imp.Video != nil { + mediaType = openrtb_ext.BidTypeVideo } else if imp.Native != nil { - return openrtb_ext.BidTypeNative, nil + mediaType = openrtb_ext.BidTypeNative } + return mediaType, nil } } - - return "", &errortypes.BadInput{ - Message: fmt.Sprintf("Failed to find supported impression \"%s\" mediatype", impID), - } + return mediaType, nil } diff --git a/adapters/adview/adview_test.go b/adapters/adview/adview_test.go index fa5d7f079f0..5b872581c9a 100644 --- a/adapters/adview/adview_test.go +++ b/adapters/adview/adview_test.go @@ -10,7 +10,7 @@ import ( ) func TestJsonSamples(t *testing.T) { - bidder, buildErr := Builder(openrtb_ext.BidderAdview, config.Adapter{ + bidder, buildErr := Builder(openrtb_ext.BidderAdView, config.Adapter{ Endpoint: "https://bid.adview.com/agent/thirdAdxService/{{.AccountID}}"}) if buildErr != nil { @@ -21,7 +21,7 @@ func TestJsonSamples(t *testing.T) { } func TestEndpointTemplateMalformed(t *testing.T) { - _, buildErr := Builder(openrtb_ext.BidderAdview, config.Adapter{ + _, buildErr := Builder(openrtb_ext.BidderAdView, config.Adapter{ Endpoint: "{{Malformed}}"}) assert.Error(t, buildErr) diff --git a/adapters/adview/adviewtest/exemplary/banner-app-format.json b/adapters/adview/adviewtest/exemplary/banner-app-format.json new file mode 100644 index 00000000000..19714805997 --- /dev/null +++ b/adapters/adview/adviewtest/exemplary/banner-app-format.json @@ -0,0 +1,152 @@ +{ + "mockBidRequest": { + "id": "some-request-id", + "device": { + "ua": "test-user-agent", + "ip": "123.123.123.123", + "ifa":"00000000-0000-0000-0000-000000000000", + "language": "en", + "dnt": 0 + }, + "tmax": 1000, + "user": { + "buyeruid": "awesome-user" + }, + "app": { + "publisher": { + "id": "123456789" + }, + "cat": [ + "IAB22-1" + ], + "bundle": "com.app.awesome", + "name": "Awesome App", + "domain": "awesomeapp.com", + "id": "123456789" + }, + "imp": [ + { + "id": "some-impression-id", + "banner": { + "format": { + "w": 320, + "h": 50 + } + }, + "ext": { + "bidder": { + "placementId": "posid00001", + "accountId": "accountid01" + } + } + } + ] + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://bid.adview.com/agent/thirdAdxService/accountid01", + "body": { + "id": "some-request-id", + "device": { + "ua": "test-user-agent", + "ip": "123.123.123.123", + "ifa":"00000000-0000-0000-0000-000000000000", + "language": "en", + "dnt": 0 + }, + "imp": [ + { + "id": "some-impression-id", + "banner": { + "w": 320, + "h": 50, + "format": { + "w": 320, + "h": 50 + } + }, + "tagid": "posid00001", + "ext": { + "bidder": { + "placementId": "posid00001", + "accountId": "accountid01" + } + } + } + ], + "app": { + "id": "123456789", + "name": "Awesome App", + "bundle": "com.app.awesome", + "domain": "awesomeapp.com", + "cat": [ + "IAB22-1" + ], + "publisher": { + "id": "123456789" + } + }, + "user": { + "buyeruid": "awesome-user" + }, + "tmax": 1000 + } + }, + "mockResponse": { + "status": 200, + "body": { + "id": "awesome-resp-id", + "seatbid": [ + { + "bid": [ + { + "id": "a3ae1b4e2fc24a4fb45540082e98e161", + "impid": "some-impression-id", + "price": 3.5, + "adm": "awesome-markup", + "adomain": [ + "awesome.com" + ], + "crid": "20", + "w": 320, + "h": 50 + } + ], + "type": "banner", + "seat": "adview" + } + ], + "cur": "USD", + "ext": { + "responsetimemillis": { + "adview": 154 + }, + "tmaxrequest": 1000 + } + } + } + } + ], + "expectedBidResponses": [ + { + "bids": [ + { + "bid": { + "id": "a3ae1b4e2fc24a4fb45540082e98e161", + "impid": "some-impression-id", + "price": 3.5, + "adm": "awesome-markup", + "adomain": [ + "awesome.com" + ], + "crid": "20", + "w": 320, + "h": 50 + }, + "type": "banner" + } + ] + } + ] +} diff --git a/adapters/adview/adviewtest/exemplary/banner-app.json b/adapters/adview/adviewtest/exemplary/banner-app.json index 87ed6eac6a1..42ce5b2e20f 100644 --- a/adapters/adview/adviewtest/exemplary/banner-app.json +++ b/adapters/adview/adviewtest/exemplary/banner-app.json @@ -49,7 +49,7 @@ "device": { "ua": "test-user-agent", "ip": "123.123.123.123", - "ifa":"00000000-0000-0000-0000-000000000000", + "ifa":"00000000-0000-0000-0000-000000000000", "language": "en", "dnt": 0 }, diff --git a/adapters/adview/adviewtest/exemplary/native-app.json b/adapters/adview/adviewtest/exemplary/native-app.json index aa64b20a2a2..5aa2fedbdb5 100644 --- a/adapters/adview/adviewtest/exemplary/native-app.json +++ b/adapters/adview/adviewtest/exemplary/native-app.json @@ -4,7 +4,7 @@ "device": { "ua": "test-user-agent", "ip": "123.123.123.123", - "ifa":"00000000-0000-0000-0000-000000000000", + "ifa":"00000000-0000-0000-0000-000000000000", "language": "en", "dnt": 0 }, diff --git a/adapters/adview/adviewtest/exemplary/video-app.json b/adapters/adview/adviewtest/exemplary/video-app.json index c24522f52b6..01d6ed5e45d 100644 --- a/adapters/adview/adviewtest/exemplary/video-app.json +++ b/adapters/adview/adviewtest/exemplary/video-app.json @@ -55,7 +55,7 @@ "device": { "ua": "test-user-agent", "ip": "123.123.123.123", - "ifa":"00000000-0000-0000-0000-000000000000", + "ifa":"00000000-0000-0000-0000-000000000000", "language": "en", "dnt": 0 }, diff --git a/adapters/adview/adviewtest/params/race/banner.json b/adapters/adview/adviewtest/params/race/banner.json deleted file mode 100644 index 9d8ae638e2d..00000000000 --- a/adapters/adview/adviewtest/params/race/banner.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "placementId": "posid00001", - "accountId": "touchpal18" -} diff --git a/adapters/adview/adviewtest/params/race/native.json b/adapters/adview/adviewtest/params/race/native.json deleted file mode 100644 index 9d8ae638e2d..00000000000 --- a/adapters/adview/adviewtest/params/race/native.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "placementId": "posid00001", - "accountId": "touchpal18" -} diff --git a/adapters/adview/adviewtest/params/race/video.json b/adapters/adview/adviewtest/params/race/video.json deleted file mode 100644 index 9d8ae638e2d..00000000000 --- a/adapters/adview/adviewtest/params/race/video.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "placementId": "posid00001", - "accountId": "touchpal18" -} diff --git a/adapters/adview/params_test.go b/adapters/adview/params_test.go index e7c2838c4c7..6d124e9b556 100644 --- a/adapters/adview/params_test.go +++ b/adapters/adview/params_test.go @@ -14,8 +14,8 @@ func TestValidParams(t *testing.T) { } for _, validParam := range validParams { - if err := validator.Validate(openrtb_ext.BidderAdview, json.RawMessage(validParam)); err != nil { - t.Errorf("Schema rejected Adview params: %s", validParam) + if err := validator.Validate(openrtb_ext.BidderAdView, json.RawMessage(validParam)); err != nil { + t.Errorf("Schema rejected adview params: %s", validParam) } } } @@ -27,7 +27,7 @@ func TestInvalidParams(t *testing.T) { } for _, invalidParam := range invalidParams { - if err := validator.Validate(openrtb_ext.BidderAdview, json.RawMessage(invalidParam)); err == nil { + if err := validator.Validate(openrtb_ext.BidderAdView, json.RawMessage(invalidParam)); err == nil { t.Errorf("Schema allowed unexpected params: %s", invalidParam) } } @@ -40,12 +40,9 @@ var validParams = []string{ var invalidParams = []string{ ``, `null`, - `true`, - `5`, - `4.2`, - `[]`, `{}`, `{"adCode": "string", "seatCode": 5, "originalPublisherid": "string"}`, `{ "accountId": "accountid01" }`, + `{ "placementId": "posid00001" }`, `{ "placementId": "", "accountId": "" }`, } diff --git a/exchange/adapter_builders.go b/exchange/adapter_builders.go index 60dbcf40337..ad1b4cc2284 100755 --- a/exchange/adapter_builders.go +++ b/exchange/adapter_builders.go @@ -151,7 +151,7 @@ func newAdapterBuilders() map[openrtb_ext.BidderName]adapters.Builder { openrtb_ext.BidderAdtarget: adtarget.Builder, openrtb_ext.BidderAdtelligent: adtelligent.Builder, openrtb_ext.BidderAdvangelists: advangelists.Builder, - openrtb_ext.BidderAdview: adview.Builder, + openrtb_ext.BidderAdView: adview.Builder, openrtb_ext.BidderAdxcg: adxcg.Builder, openrtb_ext.BidderAdyoulike: adyoulike.Builder, openrtb_ext.BidderAJA: aja.Builder, diff --git a/openrtb_ext/bidders.go b/openrtb_ext/bidders.go index e8918d442bc..cdf4371363c 100644 --- a/openrtb_ext/bidders.go +++ b/openrtb_ext/bidders.go @@ -92,7 +92,7 @@ const ( BidderAdtarget BidderName = "adtarget" BidderAdtelligent BidderName = "adtelligent" BidderAdvangelists BidderName = "advangelists" - BidderAdview BidderName = "adview" + BidderAdView BidderName = "adview" BidderAdxcg BidderName = "adxcg" BidderAdyoulike BidderName = "adyoulike" BidderAJA BidderName = "aja" @@ -222,7 +222,7 @@ func CoreBidderNames() []BidderName { BidderAdtarget, BidderAdtelligent, BidderAdvangelists, - BidderAdview, + BidderAdView, BidderAdxcg, BidderAdyoulike, BidderAJA, diff --git a/openrtb_ext/imp_adview.go b/openrtb_ext/imp_adview.go index fb8769ab34f..a0aa208a5bd 100644 --- a/openrtb_ext/imp_adview.go +++ b/openrtb_ext/imp_adview.go @@ -1,6 +1,6 @@ package openrtb_ext -type ExtImpAdview struct { +type ExtImpAdView struct { MasterTagID string `json:"placementId"` AccountID string `json:"accountId"` } \ No newline at end of file diff --git a/static/bidder-params/adview.json b/static/bidder-params/adview.json index cc30c8f75fb..b5c927aaeb2 100644 --- a/static/bidder-params/adview.json +++ b/static/bidder-params/adview.json @@ -1,12 +1,13 @@ { "$schema": "http://json-schema.org/draft-04/schema#", - "title": "Adview Adapter Params", + "title": "AdView Adapter Params", "description": "A schema which validates params accepted by the adview adapter", "type": "object", "properties": { "placementId": { "type": "string", - "description": "An ID which identifies the placement selling the impression" + "description": "An ID which identifies the placement selling the impression", + "minLength": 1 }, "accountId": { "type": "string", From b8a4d78cc78ec47b62bf2613927d32a3851a387a Mon Sep 17 00:00:00 2001 From: wildcat0601 Date: Tue, 31 Aug 2021 16:06:46 +0800 Subject: [PATCH 03/15] fix format test json. --- .../exemplary/banner-app-format.json | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/adapters/adview/adviewtest/exemplary/banner-app-format.json b/adapters/adview/adviewtest/exemplary/banner-app-format.json index 19714805997..a30663caf76 100644 --- a/adapters/adview/adviewtest/exemplary/banner-app-format.json +++ b/adapters/adview/adviewtest/exemplary/banner-app-format.json @@ -28,10 +28,12 @@ { "id": "some-impression-id", "banner": { - "format": { - "w": 320, - "h": 50 - } + "format": [ + { + "w": 320, + "h": 50 + } + ] }, "ext": { "bidder": { @@ -61,10 +63,12 @@ "banner": { "w": 320, "h": 50, - "format": { - "w": 320, - "h": 50 - } + "format": [ + { + "w": 320, + "h": 50 + } + ] }, "tagid": "posid00001", "ext": { From 4b60aa150d3477e02047373d86ada8281731a514 Mon Sep 17 00:00:00 2001 From: wildcat0601 Date: Tue, 31 Aug 2021 16:15:23 +0800 Subject: [PATCH 04/15] recover ext in request to adview bid. --- adapters/adview/adview.go | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/adapters/adview/adview.go b/adapters/adview/adview.go index a1ec855ea73..831b8f7766e 100644 --- a/adapters/adview/adview.go +++ b/adapters/adview/adview.go @@ -20,13 +20,13 @@ type adapter struct { // Builder builds a new instance of the adview adapter for the given bidder with the given config. func Builder(bidderName openrtb_ext.BidderName, config config.Adapter) (adapters.Bidder, error) { - template, err := template.New("endpointTemplate").Parse(config.Endpoint) + endpointTemplate, err := template.New("endpointTemplate").Parse(config.Endpoint) if err != nil { return nil, fmt.Errorf("unable to parse endpoint url template: %v", err) } bidder := &adapter{ - endpoint: template, + endpoint: endpointTemplate, } return bidder, nil } @@ -34,7 +34,7 @@ func Builder(bidderName openrtb_ext.BidderName, config config.Adapter) (adapters func (a *adapter) MakeRequests(request *openrtb2.BidRequest, requestInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) { var errors []error var bidderExt adapters.ExtImpBidder - imp := &request.Imp[0]; + imp := &request.Imp[0] if err := json.Unmarshal(imp.Ext, &bidderExt); err != nil { errors = append(errors, &errortypes.BadInput{ Message: fmt.Sprintf("invalid imp.ext, %s", err), @@ -66,16 +66,15 @@ func (a *adapter) MakeRequests(request *openrtb2.BidRequest, requestInfo *adapte return nil, []error{err} } - imp.Ext = nil //do not forward ext to adview reqJSON, err := json.Marshal(request) if err != nil { return nil, []error{err} } return []*adapters.RequestData{{ - Method: http.MethodPost, - Body: reqJSON, - Uri: url, + Method: http.MethodPost, + Body: reqJSON, + Uri: url, }}, nil } From 93fb6c7cdf0f468302241a0186b6d2c165c69724 Mon Sep 17 00:00:00 2001 From: wildcat0601 Date: Tue, 31 Aug 2021 16:39:47 +0800 Subject: [PATCH 05/15] remove invalid mediatype test --- .../supplemental/invalid-imp-mediatype.json | 61 ------------------- 1 file changed, 61 deletions(-) delete mode 100644 adapters/adview/adviewtest/supplemental/invalid-imp-mediatype.json diff --git a/adapters/adview/adviewtest/supplemental/invalid-imp-mediatype.json b/adapters/adview/adviewtest/supplemental/invalid-imp-mediatype.json deleted file mode 100644 index c0d83047e53..00000000000 --- a/adapters/adview/adviewtest/supplemental/invalid-imp-mediatype.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "mockBidRequest": { - "id": "test-request-id", - "imp": [{ - "id": "test-imp-id", - "audio": {}, - "ext": { - "bidder": { - "placementId": "posid00001", - "accountId": "accountid01" - } - } - }] - }, - "httpCalls": [ - { - "expectedRequest": { - "uri": "https://bid.adview.com/agent/thirdAdxService/accountid01", - "body": { - "id": "test-request-id", - "imp": [{ - "ext": { - "bidder": { - "placementId": "posid00001", - "accountId": "accountid01" - } - }, - "id": "test-imp-id", - "audio": { - "mimes": null - }, - "tagid": "posid00001" - }] - } - }, - "mockResponse": { - "status": 200, - "body": { - "id": "test-request-id", - "seatbid": [{ - "bid": [{ - "id": "test-bid-id", - "impid": "test-imp-id", - "price": 10, - "adm": "{vast xml}", - "crid": "test-creative-id" - }] - }], - "cur": "USD" - } - } - } - ], - "expectedBidResponses": [], - "expectedMakeBidsErrors": [ - { - "value": "Failed to find supported impression \"test-imp-id\" mediatype", - "comparison": "literal" - } - ] -} From 1dce3fa454836053a97c44285896bddfe6259472 Mon Sep 17 00:00:00 2001 From: wildcat0601 Date: Wed, 1 Sep 2021 10:50:37 +0800 Subject: [PATCH 06/15] remove tabs from codes --- exchange/adapter_builders.go | 2 +- openrtb_ext/imp_adview.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/exchange/adapter_builders.go b/exchange/adapter_builders.go index ad1b4cc2284..31964f2e850 100755 --- a/exchange/adapter_builders.go +++ b/exchange/adapter_builders.go @@ -151,7 +151,7 @@ func newAdapterBuilders() map[openrtb_ext.BidderName]adapters.Builder { openrtb_ext.BidderAdtarget: adtarget.Builder, openrtb_ext.BidderAdtelligent: adtelligent.Builder, openrtb_ext.BidderAdvangelists: advangelists.Builder, - openrtb_ext.BidderAdView: adview.Builder, + openrtb_ext.BidderAdView: adview.Builder, openrtb_ext.BidderAdxcg: adxcg.Builder, openrtb_ext.BidderAdyoulike: adyoulike.Builder, openrtb_ext.BidderAJA: aja.Builder, diff --git a/openrtb_ext/imp_adview.go b/openrtb_ext/imp_adview.go index a0aa208a5bd..d41d23ff2f5 100644 --- a/openrtb_ext/imp_adview.go +++ b/openrtb_ext/imp_adview.go @@ -1,6 +1,6 @@ package openrtb_ext type ExtImpAdView struct { - MasterTagID string `json:"placementId"` - AccountID string `json:"accountId"` + MasterTagID string `json:"placementId"` + AccountID string `json:"accountId"` } \ No newline at end of file From a482d51d625a8194152cd55954f92c3668790427 Mon Sep 17 00:00:00 2001 From: wildcat0601 Date: Wed, 1 Sep 2021 11:10:01 +0800 Subject: [PATCH 07/15] tab issue fix. --- openrtb_ext/imp_adview.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openrtb_ext/imp_adview.go b/openrtb_ext/imp_adview.go index d41d23ff2f5..a0aa208a5bd 100644 --- a/openrtb_ext/imp_adview.go +++ b/openrtb_ext/imp_adview.go @@ -1,6 +1,6 @@ package openrtb_ext type ExtImpAdView struct { - MasterTagID string `json:"placementId"` - AccountID string `json:"accountId"` + MasterTagID string `json:"placementId"` + AccountID string `json:"accountId"` } \ No newline at end of file From cab079dda38706d8926e611aa20d593c1e118055 Mon Sep 17 00:00:00 2001 From: AdviewOpen Date: Wed, 1 Sep 2021 11:16:12 +0800 Subject: [PATCH 08/15] fix gofmt --- openrtb_ext/imp_adview.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openrtb_ext/imp_adview.go b/openrtb_ext/imp_adview.go index a0aa208a5bd..adaa59f36e7 100644 --- a/openrtb_ext/imp_adview.go +++ b/openrtb_ext/imp_adview.go @@ -2,5 +2,5 @@ package openrtb_ext type ExtImpAdView struct { MasterTagID string `json:"placementId"` - AccountID string `json:"accountId"` -} \ No newline at end of file + AccountID string `json:"accountId"` +} From c4269083cd791b2550dec46aeb47833c7db8c6b0 Mon Sep 17 00:00:00 2001 From: wildcat0601 Date: Thu, 2 Sep 2021 11:43:40 +0800 Subject: [PATCH 09/15] 1.fixed error log process. 2.json format tidy up. --- adapters/adview/adview.go | 15 +- .../exemplary/banner-app-format.json | 2 +- .../adviewtest/exemplary/banner-app.json | 2 +- .../adviewtest/exemplary/native-app.json | 262 +++++++++--------- .../adviewtest/exemplary/video-app.json | 15 +- 5 files changed, 145 insertions(+), 151 deletions(-) diff --git a/adapters/adview/adview.go b/adapters/adview/adview.go index 831b8f7766e..c3e78b4221c 100644 --- a/adapters/adview/adview.go +++ b/adapters/adview/adview.go @@ -32,22 +32,19 @@ func Builder(bidderName openrtb_ext.BidderName, config config.Adapter) (adapters } func (a *adapter) MakeRequests(request *openrtb2.BidRequest, requestInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) { - var errors []error var bidderExt adapters.ExtImpBidder imp := &request.Imp[0] if err := json.Unmarshal(imp.Ext, &bidderExt); err != nil { - errors = append(errors, &errortypes.BadInput{ - Message: fmt.Sprintf("invalid imp.ext, %s", err), - }) - return nil, append(errors, err) + return nil, []error{&errortypes.BadInput{ + Message: fmt.Sprintf("invalid imp.ext, %s", err.Error()), + }} } //use adview var advImpExt openrtb_ext.ExtImpAdView if err := json.Unmarshal(bidderExt.Bidder, &advImpExt); err != nil { - errors = append(errors, &errortypes.BadInput{ - Message: fmt.Sprintf("invalid bidderExt.Bidder, %s", err), - }) - return nil, append(errors, err) + return nil, []error{&errortypes.BadInput{ + Message: fmt.Sprintf("invalid bidderExt.Bidder, %s", err.Error()), + }} } imp.TagID = advImpExt.MasterTagID //tagid means posid diff --git a/adapters/adview/adviewtest/exemplary/banner-app-format.json b/adapters/adview/adviewtest/exemplary/banner-app-format.json index a30663caf76..49956cdc519 100644 --- a/adapters/adview/adviewtest/exemplary/banner-app-format.json +++ b/adapters/adview/adviewtest/exemplary/banner-app-format.json @@ -71,7 +71,7 @@ ] }, "tagid": "posid00001", - "ext": { + "ext": { "bidder": { "placementId": "posid00001", "accountId": "accountid01" diff --git a/adapters/adview/adviewtest/exemplary/banner-app.json b/adapters/adview/adviewtest/exemplary/banner-app.json index 42ce5b2e20f..e8697229f4a 100644 --- a/adapters/adview/adviewtest/exemplary/banner-app.json +++ b/adapters/adview/adviewtest/exemplary/banner-app.json @@ -61,7 +61,7 @@ "h": 50 }, "tagid": "posid00001", - "ext": { + "ext": { "bidder": { "placementId": "posid00001", "accountId": "accountid01" diff --git a/adapters/adview/adviewtest/exemplary/native-app.json b/adapters/adview/adviewtest/exemplary/native-app.json index 5aa2fedbdb5..df776a36d30 100644 --- a/adapters/adview/adviewtest/exemplary/native-app.json +++ b/adapters/adview/adviewtest/exemplary/native-app.json @@ -1,144 +1,142 @@ { - "mockBidRequest": { - "id": "some-request-id", - "device": { - "ua": "test-user-agent", - "ip": "123.123.123.123", - "ifa":"00000000-0000-0000-0000-000000000000", - "language": "en", - "dnt": 0 - }, - "tmax": 1000, - "user": { - "buyeruid": "awesome-user" - }, - "app": { - "publisher": { - "id": "123456789" - }, - "cat": [ - "IAB22-1" - ], - "bundle": "com.app.awesome", - "name": "Awesome App", - "domain": "awesomeapp.com", + "mockBidRequest": { + "id": "some-request-id", + "device": { + "ua": "test-user-agent", + "ip": "123.123.123.123", + "ifa":"00000000-0000-0000-0000-000000000000", + "language": "en", + "dnt": 0 + }, + "tmax": 1000, + "user": { + "buyeruid": "awesome-user" + }, + "app": { + "publisher": { "id": "123456789" }, - "imp": [ - { - "id": "some-impression-id", - "tagid": "posid00001", - "native": { - "ver":"1.1", - "request":"{\"adunit\":2,\"assets\":[{\"id\":3,\"img\":{\"h\":120,\"hmin\":0,\"type\":3,\"w\":180,\"wmin\":0},\"required\":1},{\"id\":0,\"required\":1,\"title\":{\"len\":25}},{\"data\":{\"len\":25,\"type\":1},\"id\":4,\"required\":1},{\"data\":{\"len\":140,\"type\":2},\"id\":6,\"required\":1}],\"context\":1,\"layout\":1,\"contextsubtype\":11,\"plcmtcnt\":1,\"plcmttype\":2,\"ver\":\"1.1\",\"ext\":{\"banner\":{\"w\":320,\"h\":50}}}" - }, - "ext": { - "bidder": { - "placementId": "posid00001", - "accountId": "accountid01" - } - } - } - ] + "cat": [ + "IAB22-1" + ], + "bundle": "com.app.awesome", + "name": "Awesome App", + "domain": "awesomeapp.com", + "id": "123456789" }, - "httpCalls": [ + "imp": [ { - "expectedRequest": { - "uri": "https://bid.adview.com/agent/thirdAdxService/accountid01", - "body": { - "id": "some-request-id", - "device": { - "ua": "test-user-agent", - "ip": "123.123.123.123", - "ifa":"00000000-0000-0000-0000-000000000000", - "language": "en", - "dnt": 0 - }, - "imp": [ - { - "id": "some-impression-id", - "native": { - "ver":"1.1", - "request":"{\"adunit\":2,\"assets\":[{\"id\":3,\"img\":{\"h\":120,\"hmin\":0,\"type\":3,\"w\":180,\"wmin\":0},\"required\":1},{\"id\":0,\"required\":1,\"title\":{\"len\":25}},{\"data\":{\"len\":25,\"type\":1},\"id\":4,\"required\":1},{\"data\":{\"len\":140,\"type\":2},\"id\":6,\"required\":1}],\"context\":1,\"layout\":1,\"contextsubtype\":11,\"plcmtcnt\":1,\"plcmttype\":2,\"ver\":\"1.1\",\"ext\":{\"banner\":{\"w\":320,\"h\":50}}}" - }, - "ext": { - "bidder": { - "placementId": "posid00001", - "accountId": "accountid01" - } - }, - "tagid": "posid00001" - } - ], - "app": { - "id": "123456789", - "name": "Awesome App", - "bundle": "com.app.awesome", - "domain": "awesomeapp.com", - "cat": [ - "IAB22-1" - ], - "publisher": { - "id": "123456789" - } - }, - "user": { - "buyeruid": "awesome-user" - }, - "tmax": 1000 - } + "id": "some-impression-id", + "native": { + "ver":"1.1", + "request":"{\"adunit\":2,\"assets\":[{\"id\":3,\"img\":{\"h\":120,\"hmin\":0,\"type\":3,\"w\":180,\"wmin\":0},\"required\":1},{\"id\":0,\"required\":1,\"title\":{\"len\":25}},{\"data\":{\"len\":25,\"type\":1},\"id\":4,\"required\":1},{\"data\":{\"len\":140,\"type\":2},\"id\":6,\"required\":1}],\"context\":1,\"layout\":1,\"contextsubtype\":11,\"plcmtcnt\":1,\"plcmttype\":2,\"ver\":\"1.1\",\"ext\":{\"banner\":{\"w\":320,\"h\":50}}}" }, - "mockResponse": { - "status": 200, - "body": { - "id": "awesome-resp-id", - "seatbid": [ - { - "bid": [ - { - "id": "a3ae1b4e2fc24a4fb45540082e98e161", - "impid": "some-impression-id", - "price": 3.5, - "adm": "awesome-markup", - "adomain": [ - "awesome.com" - ], - "crid": "20" - } - ], - "type": "native", - "seat": "adview" - } - ], - "cur": "USD", - "ext": { - "responsetimemillis": { - "adview": 154 - }, - "tmaxrequest": 1000 - } + "ext": { + "bidder": { + "placementId": "posid00001", + "accountId": "accountid01" } } } - ], - "expectedBidResponses": [ - { - "bids":[ - { - "bid": { - "id": "a3ae1b4e2fc24a4fb45540082e98e161", - "impid": "some-impression-id", - "price": 3.5, - "adm": "awesome-markup", - "crid": "20", - "adomain": [ - "awesome.com" - ] + ] + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://bid.adview.com/agent/thirdAdxService/accountid01", + "body": { + "id": "some-request-id", + "device": { + "ua": "test-user-agent", + "ip": "123.123.123.123", + "ifa":"00000000-0000-0000-0000-000000000000", + "language": "en", + "dnt": 0 + }, + "imp": [ + { + "id": "some-impression-id", + "native": { + "ver":"1.1", + "request":"{\"adunit\":2,\"assets\":[{\"id\":3,\"img\":{\"h\":120,\"hmin\":0,\"type\":3,\"w\":180,\"wmin\":0},\"required\":1},{\"id\":0,\"required\":1,\"title\":{\"len\":25}},{\"data\":{\"len\":25,\"type\":1},\"id\":4,\"required\":1},{\"data\":{\"len\":140,\"type\":2},\"id\":6,\"required\":1}],\"context\":1,\"layout\":1,\"contextsubtype\":11,\"plcmtcnt\":1,\"plcmttype\":2,\"ver\":\"1.1\",\"ext\":{\"banner\":{\"w\":320,\"h\":50}}}" + }, + "ext": { + "bidder": { + "placementId": "posid00001", + "accountId": "accountid01" + } + }, + "tagid": "posid00001" + } + ], + "app": { + "id": "123456789", + "name": "Awesome App", + "bundle": "com.app.awesome", + "domain": "awesomeapp.com", + "cat": [ + "IAB22-1" + ], + "publisher": { + "id": "123456789" + } + }, + "user": { + "buyeruid": "awesome-user" + }, + "tmax": 1000 + } + }, + "mockResponse": { + "status": 200, + "body": { + "id": "awesome-resp-id", + "seatbid": [ + { + "bid": [ + { + "id": "a3ae1b4e2fc24a4fb45540082e98e161", + "impid": "some-impression-id", + "price": 3.5, + "adm": "awesome-markup", + "adomain": [ + "awesome.com" + ], + "crid": "20" + } + ], + "type": "native", + "seat": "adview" + } + ], + "cur": "USD", + "ext": { + "responsetimemillis": { + "adview": 154 }, - "type": "native" + "tmaxrequest": 1000 } - ] + } } - ] - } - + } + ], + "expectedBidResponses": [ + { + "bids":[ + { + "bid": { + "id": "a3ae1b4e2fc24a4fb45540082e98e161", + "impid": "some-impression-id", + "price": 3.5, + "adm": "awesome-markup", + "crid": "20", + "adomain": [ + "awesome.com" + ] + }, + "type": "native" + } + ] + } + ] +} diff --git a/adapters/adview/adviewtest/exemplary/video-app.json b/adapters/adview/adviewtest/exemplary/video-app.json index 01d6ed5e45d..2136a8f7f33 100644 --- a/adapters/adview/adviewtest/exemplary/video-app.json +++ b/adapters/adview/adviewtest/exemplary/video-app.json @@ -27,7 +27,6 @@ "imp": [ { "id": "some-impression-id", - "tagid": "posid00001", "video": { "mimes": [ "video/mp4" @@ -71,12 +70,12 @@ "w": 640, "h": 480 }, - "ext": { - "bidder": { - "placementId": "posid00001", - "accountId": "accountid01" - } - }, + "ext": { + "bidder": { + "placementId": "posid00001", + "accountId": "accountid01" + } + }, "tagid": "posid00001" } ], @@ -124,7 +123,7 @@ "cur": "USD", "ext": { "responsetimemillis": { - "acuityads": 154 + "adview": 154 }, "tmaxrequest": 1000 } From 77747c799677aaadc110cfcc6b8c9690a4325cd9 Mon Sep 17 00:00:00 2001 From: wildcat0601 Date: Tue, 26 Oct 2021 09:50:50 +0800 Subject: [PATCH 10/15] for adapter currency fix. --- adapters/adview/adview.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/adapters/adview/adview.go b/adapters/adview/adview.go index c3e78b4221c..c1b4161503a 100644 --- a/adapters/adview/adview.go +++ b/adapters/adview/adview.go @@ -100,7 +100,9 @@ func (a *adapter) MakeBids(request *openrtb2.BidRequest, requestData *adapters.R } bidResponse := adapters.NewBidderResponseWithBidsCapacity(len(request.Imp)) - bidResponse.Currency = response.Cur + //bidResponse.Currency = response.Cur + bidResponse.Currency = "USD" //we just support USD for resp + var errors []error for _, seatBid := range response.SeatBid { for i, bid := range seatBid.Bid { From ef9ab394d019e24554ee87137f51d8c877058cf8 Mon Sep 17 00:00:00 2001 From: wildcat0601 Date: Fri, 29 Oct 2021 10:30:46 +0800 Subject: [PATCH 11/15] (1)remove unused codes (2)add test codes for currency. --- adapters/adview/adview.go | 1 - adapters/adview/adviewtest/exemplary/banner-app-format.json | 1 + adapters/adview/adviewtest/exemplary/banner-app.json | 1 + adapters/adview/adviewtest/exemplary/native-app.json | 1 + adapters/adview/adviewtest/exemplary/video-app.json | 1 + 5 files changed, 4 insertions(+), 1 deletion(-) diff --git a/adapters/adview/adview.go b/adapters/adview/adview.go index c1b4161503a..69d78c9d8ae 100644 --- a/adapters/adview/adview.go +++ b/adapters/adview/adview.go @@ -100,7 +100,6 @@ func (a *adapter) MakeBids(request *openrtb2.BidRequest, requestData *adapters.R } bidResponse := adapters.NewBidderResponseWithBidsCapacity(len(request.Imp)) - //bidResponse.Currency = response.Cur bidResponse.Currency = "USD" //we just support USD for resp var errors []error diff --git a/adapters/adview/adviewtest/exemplary/banner-app-format.json b/adapters/adview/adviewtest/exemplary/banner-app-format.json index 49956cdc519..a9ab496841f 100644 --- a/adapters/adview/adviewtest/exemplary/banner-app-format.json +++ b/adapters/adview/adviewtest/exemplary/banner-app-format.json @@ -134,6 +134,7 @@ ], "expectedBidResponses": [ { + "currency": "USD", "bids": [ { "bid": { diff --git a/adapters/adview/adviewtest/exemplary/banner-app.json b/adapters/adview/adviewtest/exemplary/banner-app.json index e8697229f4a..65a13bb81ec 100644 --- a/adapters/adview/adviewtest/exemplary/banner-app.json +++ b/adapters/adview/adviewtest/exemplary/banner-app.json @@ -124,6 +124,7 @@ ], "expectedBidResponses": [ { + "currency": "USD", "bids": [ { "bid": { diff --git a/adapters/adview/adviewtest/exemplary/native-app.json b/adapters/adview/adviewtest/exemplary/native-app.json index df776a36d30..206612835eb 100644 --- a/adapters/adview/adviewtest/exemplary/native-app.json +++ b/adapters/adview/adviewtest/exemplary/native-app.json @@ -122,6 +122,7 @@ ], "expectedBidResponses": [ { + "currency": "USD", "bids":[ { "bid": { diff --git a/adapters/adview/adviewtest/exemplary/video-app.json b/adapters/adview/adviewtest/exemplary/video-app.json index 2136a8f7f33..dc60d8eeff4 100644 --- a/adapters/adview/adviewtest/exemplary/video-app.json +++ b/adapters/adview/adviewtest/exemplary/video-app.json @@ -133,6 +133,7 @@ ], "expectedBidResponses": [ { + "currency": "USD", "bids":[ { "bid": { From 9c9c4792aa301526c57101af25aae07647a797eb Mon Sep 17 00:00:00 2001 From: wildcat0601 Date: Thu, 4 Nov 2021 15:14:30 +0800 Subject: [PATCH 12/15] (1)add currency convert of request process. (2)test script re-fix. --- adapters/adview/adview.go | 17 +++++++++++++++++ .../adviewtest/exemplary/banner-app-format.json | 1 + .../adview/adviewtest/exemplary/banner-app.json | 1 + .../adview/adviewtest/exemplary/native-app.json | 1 + .../adview/adviewtest/exemplary/video-app.json | 1 + .../adviewtest/supplemental/bad-request.json | 1 + .../adviewtest/supplemental/empty-response.json | 1 + .../adviewtest/supplemental/nobid-response.json | 1 + .../adviewtest/supplemental/server-error.json | 1 + .../supplemental/unparsable-response.json | 1 + 10 files changed, 26 insertions(+) diff --git a/adapters/adview/adview.go b/adapters/adview/adview.go index 69d78c9d8ae..e987298139f 100644 --- a/adapters/adview/adview.go +++ b/adapters/adview/adview.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" "net/http" + "strings" "text/template" "github.com/mxmCherry/openrtb/v15/openrtb2" @@ -58,6 +59,22 @@ func (a *adapter) MakeRequests(request *openrtb2.BidRequest, requestInfo *adapte } } + // Check if imp comes with bid floor amount defined in a foreign currency + if imp.BidFloor > 0 && imp.BidFloorCur != "" && strings.ToUpper(imp.BidFloorCur) != "USD" { + // Convert to US dollars + convertedValue, err := requestInfo.ConvertCurrency(imp.BidFloor, imp.BidFloorCur, "USD") + if err != nil { + return nil, []error{err} + } + // Update after conversion. All imp elements inside request.Imp are shallow copies + // therefore, their non-pointer values are not shared memory and are safe to modify. + imp.BidFloorCur = "USD" + imp.BidFloor = convertedValue + } + + // Set the CUR of bid to USD after converting all floors + request.Cur = []string{"USD"} + url, err := a.buildEndpointURL(&advImpExt) if err != nil { return nil, []error{err} diff --git a/adapters/adview/adviewtest/exemplary/banner-app-format.json b/adapters/adview/adviewtest/exemplary/banner-app-format.json index a9ab496841f..0ab4951511e 100644 --- a/adapters/adview/adviewtest/exemplary/banner-app-format.json +++ b/adapters/adview/adviewtest/exemplary/banner-app-format.json @@ -50,6 +50,7 @@ "uri": "https://bid.adview.com/agent/thirdAdxService/accountid01", "body": { "id": "some-request-id", + "cur": ["USD"], "device": { "ua": "test-user-agent", "ip": "123.123.123.123", diff --git a/adapters/adview/adviewtest/exemplary/banner-app.json b/adapters/adview/adviewtest/exemplary/banner-app.json index 65a13bb81ec..6aad1e8dc05 100644 --- a/adapters/adview/adviewtest/exemplary/banner-app.json +++ b/adapters/adview/adviewtest/exemplary/banner-app.json @@ -46,6 +46,7 @@ "uri": "https://bid.adview.com/agent/thirdAdxService/accountid01", "body": { "id": "some-request-id", + "cur": ["USD"], "device": { "ua": "test-user-agent", "ip": "123.123.123.123", diff --git a/adapters/adview/adviewtest/exemplary/native-app.json b/adapters/adview/adviewtest/exemplary/native-app.json index 206612835eb..804494e5ff5 100644 --- a/adapters/adview/adviewtest/exemplary/native-app.json +++ b/adapters/adview/adviewtest/exemplary/native-app.json @@ -46,6 +46,7 @@ "uri": "https://bid.adview.com/agent/thirdAdxService/accountid01", "body": { "id": "some-request-id", + "cur": ["USD"], "device": { "ua": "test-user-agent", "ip": "123.123.123.123", diff --git a/adapters/adview/adviewtest/exemplary/video-app.json b/adapters/adview/adviewtest/exemplary/video-app.json index dc60d8eeff4..57c9b85598b 100644 --- a/adapters/adview/adviewtest/exemplary/video-app.json +++ b/adapters/adview/adviewtest/exemplary/video-app.json @@ -51,6 +51,7 @@ "uri": "https://bid.adview.com/agent/thirdAdxService/accountid01", "body": { "id": "some-request-id", + "cur": ["USD"], "device": { "ua": "test-user-agent", "ip": "123.123.123.123", diff --git a/adapters/adview/adviewtest/supplemental/bad-request.json b/adapters/adview/adviewtest/supplemental/bad-request.json index 131e6d830a2..0f10fe79062 100644 --- a/adapters/adview/adviewtest/supplemental/bad-request.json +++ b/adapters/adview/adviewtest/supplemental/bad-request.json @@ -20,6 +20,7 @@ "uri": "https://bid.adview.com/agent/thirdAdxService/accountid01", "body": { "id": "test-request-id", + "cur": ["USD"], "imp": [{ "ext": { "bidder": { diff --git a/adapters/adview/adviewtest/supplemental/empty-response.json b/adapters/adview/adviewtest/supplemental/empty-response.json index 5bd86bc99a1..c080b18d4bb 100644 --- a/adapters/adview/adviewtest/supplemental/empty-response.json +++ b/adapters/adview/adviewtest/supplemental/empty-response.json @@ -20,6 +20,7 @@ "uri": "https://bid.adview.com/agent/thirdAdxService/accountid01", "body": { "id": "test-request-id", + "cur": ["USD"], "imp": [{ "ext": { "bidder": { diff --git a/adapters/adview/adviewtest/supplemental/nobid-response.json b/adapters/adview/adviewtest/supplemental/nobid-response.json index f2c8864d4b1..9e9ab678a22 100644 --- a/adapters/adview/adviewtest/supplemental/nobid-response.json +++ b/adapters/adview/adviewtest/supplemental/nobid-response.json @@ -20,6 +20,7 @@ "uri": "https://bid.adview.com/agent/thirdAdxService/accountid01", "body": { "id": "test-request-id", + "cur": ["USD"], "imp": [{ "ext": { "bidder": { diff --git a/adapters/adview/adviewtest/supplemental/server-error.json b/adapters/adview/adviewtest/supplemental/server-error.json index 7894be1b70a..de3bc9d3721 100644 --- a/adapters/adview/adviewtest/supplemental/server-error.json +++ b/adapters/adview/adviewtest/supplemental/server-error.json @@ -20,6 +20,7 @@ "uri": "https://bid.adview.com/agent/thirdAdxService/accountid01", "body": { "id": "test-request-id", + "cur": ["USD"], "imp": [{ "ext": { "bidder": { diff --git a/adapters/adview/adviewtest/supplemental/unparsable-response.json b/adapters/adview/adviewtest/supplemental/unparsable-response.json index cef70ba8771..18bc2e0f4ed 100644 --- a/adapters/adview/adviewtest/supplemental/unparsable-response.json +++ b/adapters/adview/adviewtest/supplemental/unparsable-response.json @@ -20,6 +20,7 @@ "uri": "https://bid.adview.com/agent/thirdAdxService/accountid01", "body": { "id": "test-request-id", + "cur": ["USD"], "imp": [{ "ext": { "bidder": { From 26e317dc88bb1a0808b24057fae6431c46bf795a Mon Sep 17 00:00:00 2001 From: wildcat0601 Date: Tue, 9 Nov 2021 10:04:31 +0800 Subject: [PATCH 13/15] add currency test case. --- .../supplemental/currency_rate_not_found.json | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 adapters/adview/adviewtest/supplemental/currency_rate_not_found.json diff --git a/adapters/adview/adviewtest/supplemental/currency_rate_not_found.json b/adapters/adview/adviewtest/supplemental/currency_rate_not_found.json new file mode 100644 index 00000000000..61d1558cfe4 --- /dev/null +++ b/adapters/adview/adviewtest/supplemental/currency_rate_not_found.json @@ -0,0 +1,44 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 300, + "h": 250 + } + ] + }, + "bidfloor": 1.00, + "bidfloorcur": "JPY", + "ext":{ + "bidder": { + "placementId": "posid00001", + "accountId": "accountid01" + } + } + } + ], + "ext": { + "prebid": { + "currency": { + "rates": { + "MXN": { + "USD": 0.05 + } + }, + "usepbsrates": false + } + } + } + }, + "expectedMakeRequestsErrors": [ + { + "value": "Currency conversion rate not found: 'JPY' => 'USD'", + "comparison": "literal" + } + ] +} From 9a26bcc789a4b13b8b7b0d4befb4f70edc340320 Mon Sep 17 00:00:00 2001 From: wildcat0601 Date: Tue, 9 Nov 2021 11:28:10 +0800 Subject: [PATCH 14/15] just removed case. --- .../supplemental/currency_rate_not_found.json | 44 ------------------- 1 file changed, 44 deletions(-) delete mode 100644 adapters/adview/adviewtest/supplemental/currency_rate_not_found.json diff --git a/adapters/adview/adviewtest/supplemental/currency_rate_not_found.json b/adapters/adview/adviewtest/supplemental/currency_rate_not_found.json deleted file mode 100644 index 61d1558cfe4..00000000000 --- a/adapters/adview/adviewtest/supplemental/currency_rate_not_found.json +++ /dev/null @@ -1,44 +0,0 @@ -{ - "mockBidRequest": { - "id": "test-request-id", - "imp": [ - { - "id": "test-imp-id", - "banner": { - "format": [ - { - "w": 300, - "h": 250 - } - ] - }, - "bidfloor": 1.00, - "bidfloorcur": "JPY", - "ext":{ - "bidder": { - "placementId": "posid00001", - "accountId": "accountid01" - } - } - } - ], - "ext": { - "prebid": { - "currency": { - "rates": { - "MXN": { - "USD": 0.05 - } - }, - "usepbsrates": false - } - } - } - }, - "expectedMakeRequestsErrors": [ - { - "value": "Currency conversion rate not found: 'JPY' => 'USD'", - "comparison": "literal" - } - ] -} From e985bcc1f195149a27ecf7452ca8b2de76f73ca6 Mon Sep 17 00:00:00 2001 From: wildcat0601 Date: Fri, 19 Nov 2021 16:05:06 +0800 Subject: [PATCH 15/15] add currency test script for new currency convert commit. --- .../supplemental/currency_rate_not_found.json | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 adapters/adview/adviewtest/supplemental/currency_rate_not_found.json diff --git a/adapters/adview/adviewtest/supplemental/currency_rate_not_found.json b/adapters/adview/adviewtest/supplemental/currency_rate_not_found.json new file mode 100644 index 00000000000..61d1558cfe4 --- /dev/null +++ b/adapters/adview/adviewtest/supplemental/currency_rate_not_found.json @@ -0,0 +1,44 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 300, + "h": 250 + } + ] + }, + "bidfloor": 1.00, + "bidfloorcur": "JPY", + "ext":{ + "bidder": { + "placementId": "posid00001", + "accountId": "accountid01" + } + } + } + ], + "ext": { + "prebid": { + "currency": { + "rates": { + "MXN": { + "USD": 0.05 + } + }, + "usepbsrates": false + } + } + } + }, + "expectedMakeRequestsErrors": [ + { + "value": "Currency conversion rate not found: 'JPY' => 'USD'", + "comparison": "literal" + } + ] +}