Repository: prebid/prebid-server
Pull request #3680 (2024-05-13 07:42:13)

Yeahmobi: Fix video bug
fix yeahmobi video bug

github-actions[bot]: ## Code coverage summary 
Note: 
- Prebid team doesn't anticipate tests covering code paths that might result in marshal and unmarshal errors 
- Coverage summary encompasses all commits leading up to the latest one, 4cec2670133c9943202744990a7c8ab68ebac9e4 
#### yeahmobi 
Refer [here](https://htmlpreview.github.io/?https://github.com/prebid/prebid-server/coverage-preview/.github/preview/9059105916_1715586181/yeahmobi.html) for heat map coverage report 
``` 
github.com/prebid/prebid-server/v2/adapters/yeahmobi/yeahmobi.go:29:	Builder		100.0%
github.com/prebid/prebid-server/v2/adapters/yeahmobi/yeahmobi.go:41:	MakeRequests	100.0%
github.com/prebid/prebid-server/v2/adapters/yeahmobi/yeahmobi.go:52:	makeRequest	78.6%
github.com/prebid/prebid-server/v2/adapters/yeahmobi/yeahmobi.go:83:	transform	93.8%
github.com/prebid/prebid-server/v2/adapters/yeahmobi/yeahmobi.go:111:	getYeahmobiExt	100.0%
github.com/prebid/prebid-server/v2/adapters/yeahmobi/yeahmobi.go:134:	getEndpoint	100.0%
github.com/prebid/prebid-server/v2/adapters/yeahmobi/yeahmobi.go:139:	MakeBids	72.0%
github.com/prebid/prebid-server/v2/adapters/yeahmobi/yeahmobi.go:185:	getBidType	100.0%
total:									(statements)	88.0%

 ``` 

github-actions[bot]: ## Code coverage summary 
Note: 
- Prebid team doesn't anticipate tests covering code paths that might result in marshal and unmarshal errors 
- Coverage summary encompasses all commits leading up to the latest one, 3cbbc7fac86c4006babdc6f8a711d55956924260 
#### yeahmobi 
Refer [here](https://htmlpreview.github.io/?https://github.com/prebid/prebid-server/coverage-preview/.github/preview/9188333630_1716368169/yeahmobi.html) for heat map coverage report 
``` 
github.com/prebid/prebid-server/v2/adapters/yeahmobi/yeahmobi.go:29:	Builder		100.0%
github.com/prebid/prebid-server/v2/adapters/yeahmobi/yeahmobi.go:41:	MakeRequests	100.0%
github.com/prebid/prebid-server/v2/adapters/yeahmobi/yeahmobi.go:52:	makeRequest	78.6%
github.com/prebid/prebid-server/v2/adapters/yeahmobi/yeahmobi.go:83:	transform	93.8%
github.com/prebid/prebid-server/v2/adapters/yeahmobi/yeahmobi.go:111:	getYeahmobiExt	100.0%
github.com/prebid/prebid-server/v2/adapters/yeahmobi/yeahmobi.go:134:	getEndpoint	100.0%
github.com/prebid/prebid-server/v2/adapters/yeahmobi/yeahmobi.go:139:	MakeBids	96.0%
github.com/prebid/prebid-server/v2/adapters/yeahmobi/yeahmobi.go:185:	getBidType	100.0%
total:									(statements)	94.6%

 ``` 


Patch:
diff --git a/README.md b/README.md
index c5b0e003..20cccf8a 100644
--- a/README.md
+++ b/README.md
@@ -105,3 +105,9 @@ We welcome everyone to contribute to this project by implementing a specificatio
 
 ### Bug Fix
 Bug reports may be submitted by [opening a new issue](https://github.com/prebid/prebid-server/issues/new/choose) and describing the error in detail with the steps to reproduce and example data. A member of the core development team will validate the bug and discuss next steps. You're encouraged to open an exploratory draft pull request to either demonstrate the bug by adding a test or offering a potential fix.
+The quickest way to start developing Prebid Server in a reproducible environment isolated from your host OS
+is by using Visual Studio Code with [Remote Container Setup](devcontainer.md).
+
+## Learning Materials
+
+To understand more about how Prebid Server in Go works and quickly spins up sample instances, refer to the `sample` folder which describes various structured and integrated examples. The examples are designed to run on any platform that supports `docker` container.
diff --git a/adapters/pubmatic/pubmatic.go b/adapters/pubmatic/pubmatic.go
index da6092d8..9c5799ee 100644
--- a/adapters/pubmatic/pubmatic.go
+++ b/adapters/pubmatic/pubmatic.go
@@ -48,6 +48,7 @@ type ExtImpBidderPubmatic struct {
 	adapters.ExtImpBidder
 	Data json.RawMessage `json:"data,omitempty"`
 	AE   int             `json:"ae,omitempty"`
+	GpId string          `json:"gpid,omitempty"`
 }
 
 type ExtAdServer struct {
@@ -78,6 +79,7 @@ const (
 	AdServerGAM        = "gam"
 	AdServerKey        = "adserver"
 	PBAdslotKey        = "pbadslot"
+	gpIdKey            = "gpid"
 )
 
 func (a *PubmaticAdapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) {
@@ -319,6 +321,10 @@ func parseImpressionObject(imp *openrtb2.Imp, extractWrapperExtFromImp, extractP
 		extMap[ae] = bidderExt.AE
 	}
 
+	if bidderExt.GpId != "" {
+		extMap[gpIdKey] = bidderExt.GpId
+	}
+
 	imp.Ext = nil
 	if len(extMap) > 0 {
 		ext, err := json.Marshal(extMap)
diff --git a/adapters/rubicon/rubicon.go b/adapters/rubicon/rubicon.go
index a12d2fc7..6e515b11 100644
--- a/adapters/rubicon/rubicon.go
+++ b/adapters/rubicon/rubicon.go
@@ -331,14 +331,9 @@ func (a *RubiconAdapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *ada
 			}
 
 			userExtRP := rubiconUserExt{RP: rubiconUserExtRP{Target: target}}
-			userBuyerUID := userCopy.BuyerUID
 
 			if len(userCopy.EIDs) > 0 {
 				userExtRP.Eids = userCopy.EIDs
-
-				if userBuyerUID == "" {
-					userBuyerUID = extractUserBuyerUID(userExtRP.Eids)
-				}
 			}
 
 			if userCopy.Consent != "" {
@@ -354,7 +349,6 @@ func (a *RubiconAdapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *ada
 			userCopy.Geo = nil
 			userCopy.Yob = 0
 			userCopy.Gender = ""
-			userCopy.BuyerUID = userBuyerUID
 			userCopy.EIDs = nil
 
 			rubiconRequest.User = &userCopy
@@ -914,20 +908,6 @@ func contains(s []int, e int) bool {
 	return false
 }
 
-func extractUserBuyerUID(eids []openrtb2.EID) string {
-	for _, eid := range eids {
-		if eid.Source != "rubiconproject.com" {
-			continue
-		}
-
-		for _, uid := range eid.UIDs {
-			return uid.ID
-		}
-	}
-
-	return ""
-}
-
 func isVideo(imp openrtb2.Imp) bool {
 	video := imp.Video
 	if video != nil {
diff --git a/adapters/unruly/unruly.go b/adapters/unruly/unruly.go
index cdea14d3..97fc2b64 100644
--- a/adapters/unruly/unruly.go
+++ b/adapters/unruly/unruly.go
@@ -113,7 +113,7 @@ func (a *adapter) MakeBids(internalRequest *openrtb2.BidRequest, externalRequest
 		}}
 	}
 
-	bidResponse := adapters.NewBidderResponseWithBidsCapacity(5)
+	bidResponse := adapters.NewBidderResponseWithBidsCapacity(len(internalRequest.Imp))
 
 	var errs []error
 	for _, sb := range bidResp.SeatBid {
diff --git a/adapters/yeahmobi/yeahmobi.go b/adapters/yeahmobi/yeahmobi.go
index 6d351d85..b533e76b 100644
--- a/adapters/yeahmobi/yeahmobi.go
+++ b/adapters/yeahmobi/yeahmobi.go
@@ -18,6 +18,12 @@ import (
 type adapter struct {
 	EndpointTemplate *template.Template
 }
+type yeahmobiBidExt struct {
+	VideoCreativeInfo *yeahmobiBidExtVideo `json:"video,omitempty"`
+}
+type yeahmobiBidExtVideo struct {
+	Duration *int `json:"duration,omitempty"`
+}
 
 // Builder builds a new instance of the Yeahmobi adapter for the given bidder with the given config.
 func Builder(bidderName openrtb_ext.BidderName, config config.Adapter, server config.Server) (adapters.Bidder, error) {
@@ -134,34 +140,42 @@ func (a *adapter) MakeBids(internalRequest *openrtb2.BidRequest, externalRequest
 	if response.StatusCode == http.StatusNoContent {
 		return nil, nil
 	}
-
 	if response.StatusCode == http.StatusBadRequest {
 		return nil, []error{&errortypes.BadInput{
 			Message: fmt.Sprintf("Unexpected status code: %d.", response.StatusCode),
 		}}
 	}
-
 	if response.StatusCode != http.StatusOK {
 		return nil, []error{&errortypes.BadServerResponse{
 			Message: fmt.Sprintf("Unexpected status code: %d.", response.StatusCode),
 		}}
 	}
-
 	var bidResp openrtb2.BidResponse
-
 	if err := json.Unmarshal(response.Body, &bidResp); err != nil {
 		return nil, []error{err}
 	}
-
 	bidResponse := adapters.NewBidderResponseWithBidsCapacity(1)
-
 	for _, sb := range bidResp.SeatBid {
 		for i := range sb.Bid {
 			var mediaType = getBidType(sb.Bid[i].ImpID, internalRequest.Imp)
-			bidResponse.Bids = append(bidResponse.Bids, &adapters.TypedBid{
-				Bid:     &sb.Bid[i],
-				BidType: mediaType,
-			})
+			bid := sb.Bid[i]
+			typedBid := &adapters.TypedBid{
+				Bid:      &bid,
+				BidType:  mediaType,
+				BidVideo: &openrtb_ext.ExtBidPrebidVideo{},
+			}
+			if bid.Ext != nil {
+				var bidExt *yeahmobiBidExt
+				err := json.Unmarshal(bid.Ext, &bidExt)
+				if err != nil {
+					return nil, []error{fmt.Errorf("bid.ext json unmarshal error")}
+				} else if bidExt != nil {
+					if bidExt.VideoCreativeInfo != nil && bidExt.VideoCreativeInfo.Duration != nil {
+						typedBid.BidVideo.Duration = *bidExt.VideoCreativeInfo.Duration
+					}
+				}
+			}
+			bidResponse.Bids = append(bidResponse.Bids, typedBid)
 		}
 	}
 	return bidResponse, nil
diff --git a/sample/001_banner/app.yaml b/sample/001_banner/app.yaml
new file mode 100644
index 00000000..a314e77e
--- /dev/null
+++ b/sample/001_banner/app.yaml
@@ -0,0 +1,20 @@
+port: 8000 # main auction server port
+admin_port: 6060 # admin server listening port
+
+external_url: localhost # host url of all 2 servers above
+status_response: "ok" # default response string for /status endpoint
+
+gdpr:
+  default_value: "0" # disable gdpr, explicitly specifying a default value is a requirement in prebid server config
+
+# set up stored request storage using local file system
+stored_requests:
+  filesystem: 
+    enabled: true
+    directorypath: ./stored_requests/data/by_id
+
+# set up stored response storage using local file system
+stored_responses:
+  filesystem:
+    enabled: true
+    directorypath: ./stored_responses/data/by_id
\ No newline at end of file
diff --git a/sample/001_banner/pbjs.html b/sample/001_banner/pbjs.html
new file mode 100644
index 00000000..b02ba95b
--- /dev/null
+++ b/sample/001_banner/pbjs.html
@@ -0,0 +1,121 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <style>
+        div.adslot {
+            border-color: red;
+            border-style: solid;
+            width: 300px;
+            height: 600px;
+        }
+        p.description {
+            border-style: solid;
+        }
+    </style>
+    <script src="//cdn.jsdelivr.net/npm/prebid.js@latest/dist/not-for-prod/prebid.js"></script>
+    <script>
+
+        var sizes = [
+            [300, 250],
+            [300, 600]
+        ];
+
+        // use the cool "Prebid Less" feature https://docs.prebid.org/dev-docs/adunit-reference.html#stored-imp
+        var adUnits = [
+            {
+                code: 'test-div-1',
+                mediaTypes: {
+                    banner: {
+                        sizes: sizes
+                    }
+                },
+	        bids: [{
+	            module: "pbsBidAdapter",
+	            ortb2Imp: {
+		      ext: { prebid: { storedrequest: { id: 'test-imp-id' }}}
+                    }
+                }]
+            }
+        ]
+
+        function renderAllAdUnits() {
+            var winners = pbjs.getHighestCpmBids();
+            for (var i = 0; i < winners.length; i++) {
+                renderOne(winners[i]);
+            }
+        }
+
+        // create an iframe in the div and write the winning ad into it
+        function renderOne(winningBid) {
+            if (winningBid && winningBid.adId) {
+                var div = document.getElementById(winningBid.adUnitCode);
+                if (div) {
+                    const iframe = document.createElement('iframe');
+                    iframe.scrolling = 'no';
+                    iframe.frameBorder = '0';
+                    iframe.marginHeight = '0';
+                    iframe.marginHeight = '0';
+                    iframe.name = `prebid_ads_iframe_${winningBid.adUnitCode}`;
+                    iframe.title = '3rd party ad content';
+                    iframe.sandbox.add(
+                        'allow-forms',
+                        'allow-popups',
+                        'allow-popups-to-escape-sandbox',
+                        'allow-same-origin',
+                        'allow-scripts',
+                        'allow-top-navigation-by-user-activation'
+                    );
+                    iframe.setAttribute('aria-label', 'Advertisment');
+                    iframe.style.setProperty('border', '0');
+                    iframe.style.setProperty('margin', '0');
+                    iframe.style.setProperty('overflow', 'hidden');
+                    div.appendChild(iframe);
+                    const iframeDoc = iframe.contentWindow.document;
+                    pbjs.renderAd(iframeDoc, winningBid.adId);
+                }
+            }
+        }
+
+    </script>
+    <script>
+        var pbjs = pbjs || {};
+        pbjs.que = pbjs.que || [];
+
+        pbjs.que.push(function () {
+            pbjs.setConfig({
+                s2sConfig: [{
+                    accountId: '1',
+                    adapter: "prebidServer",
+                    enabled: true,
+                    endpoint: {
+                        noP1Consent: "http://localhost:8000/openrtb2/auction",
+                        p1Consent: 'http://localhost:8000/openrtb2/auction',
+                    },
+                    timeout: 1000,
+                    debug: true,
+                    allowUnknownBidderCodes: true
+                }],
+            })
+
+            pbjs.addAdUnits(adUnits);
+            pbjs.requestBids({
+                bidsBackHandler: renderAllAdUnits
+            })
+        });
+    </script>
+
+</head>
+
+<body>
+    <h1>001_banner</h1>
+    <p class="description">
+        This demo uses Prebid.js to interact with Prebid Server to fill the ad slot <strong>test-div-1</strong>
+        The auction request to Prebid Server uses a stored request, which in turn links to a stored response.</br>
+        Look for the <strong>/auction</strong> request in your browser's developer tool to inspect the request
+        and response.
+    </p>
+    <h2>&#8595I am ad unit test-div-1 &#8595</h2>
+        <div id="test-div-1">
+        </div>
+</body>
+</html>
diff --git a/sample/001_banner/stored_request.json b/sample/001_banner/stored_request.json
new file mode 100644
index 00000000..59e13ae8
--- /dev/null
+++ b/sample/001_banner/stored_request.json
@@ -0,0 +1,28 @@
+{
+    "id": "test-imp-id",
+    "banner": {
+        "format": [
+            {
+                "w": 300,
+                "h": 250
+            },
+            {
+                "w": 300,
+                "h": 600
+            }
+        ]
+    },
+    "ext": {
+        "prebid": {
+            "bidder": {
+                "pubmatic": {
+                    "publisherId": "111111",
+                    "adSlot": "test"
+                }
+            },
+            "storedbidresponse": [
+               { "bidder": "pubmatic", "id": "test-bid-id" }
+            ]
+        }
+    }
+}
diff --git a/sample/001_banner/stored_response.json b/sample/001_banner/stored_response.json
new file mode 100644
index 00000000..033d9928
--- /dev/null
+++ b/sample/001_banner/stored_response.json
@@ -0,0 +1,46 @@
+{
+    "id": "test-auction-id",
+    "seatbid": [
+        {
+            "bid": [
+                {
+                    "id": "test-bid-id",
+                    "impid": "test-div-1",
+                    "price": 1,
+                    "adm": "<img src =\"http://files.prebid.org/creatives/prebid300x250.png\" />",
+                    "adomain": [
+                        "www.addomain.com"
+                    ],
+                    "iurl": "http://localhost11",
+                    "crid": "creative111",
+                    "w": 300,
+                    "h": 250,
+                    "mtype": 1,
+                    "ext": {
+                        "bidtype": 0,
+                        "dspid": 6,
+                        "origbidcpm": 1,
+                        "origbidcur": "USD",
+                        "prebid": {
+                            "meta": {
+                                "adaptercode": "pubmatic"
+                            },
+                            "targeting": {
+                                "hb_bidder": "pubmatic",
+                                "hb_pb": "1.00",
+                                "hb_size": "300x250"
+                            },
+                            "type": "banner",
+                            "video": {
+                                "duration": 0,
+                                "primary_category": ""
+                            }
+                        }
+                    }
+                }
+            ],
+            "seat": "pubmatic"
+        }
+    ],
+    "cur": "USD"
+}
diff --git a/sample/README.md b/sample/README.md
new file mode 100644
index 00000000..6b0109aa
--- /dev/null
+++ b/sample/README.md
@@ -0,0 +1,65 @@
+# Sample
+
+The Sample describes several demos of quickly spinning up different Prebid Server instances with various preset configurations. These samples are intended for audiences with little knowledge about Prebid Server and plan to play around with it locally and see how it works.
+
+# Installation
+
+In the Sample, we use `docker` and `docker-compose` to instantiate examples; with docker providing a unified setup and interface,  you can spin up a demo server instance locally with only one command without knowing all the complexities.
+The docker image used in `docker-compose.yml` is the `Dockerfile` residing in the root level of the repository. 
+
+## Option 1 - Standard Docker Engine
+Install `docker` and `docker-compose` via the [official docker page](https://docs.docker.com/compose/install/#scenario-one-install-docker-desktop). If you cannot use the official docker engine due to restrictions of its license, see the option below about using Podman instead of Docker. 
+
+## Option 2 - Podman
+From MacOS, you can use [podman](https://podman.io/) with these additional steps:
+
+```sh
+$ brew install podman docker-compose
+$ podman machine init
+$ podman machine set --rootful
+$ podman machine start
+```
+
+# Examples
+
+## Common File & Structures
+All required files for each example are stored in a folder that follows the name pattern <number>_<name>. The `<number>` suggests its order and `<name`>` describes its title.
+
+The following files will be present for every example and are exclusively catered to that example.
+1. `app.yaml` - the prebid server app config.
+2. `pbjs.html` - the HTML file with `Prebid JS` integration and communicates with the Prebid Server. It also provides a detailed explanation of the example.
+3. `*.json` - additional files required to support the example. e.g. stored request and stored response.
+
+## Common steps 
+
+```sh
+#1 - To get to the sample folder if you are on the root repository directory.
+$ cd sample 
+
+#2a - This command builds a new image, you should execute this command whenever the repository source code changes.
+$ docker-compose build
+
+#2b - Optionally you could run `docker-compose build --no-cache` if you want to build an completely new image without using cache but results in slower time to build it.
+$ docker-compose build --no-cache
+
+#3a - Spin up a corresponding sample in a container - see Steps for details 
+$ docker-compose up <number>_<name>
+
+#3b - Optionally you could use `--force-recreate` flag if you want to recreate the container every time you spin up the container.
+$ docker-compose up <number>_<name> --force-recreate
+```
+
+### Detailed Steps
+1. To prevent `app.yaml` from being overwritten by other config files. Ensure that `pbs.yaml` or `pbs.json` config file **MUST NOT** be present in the root directory of the repository.
+
+2. Bring up an instance by running `docker-compose up <number>_<name>` in the `sample` folder.
+
+3. Wait patiently until you see ` Admin server starting on: :6060` and `Main server starting on: :8000` in the command line output. This marks the Prebid Server instance finishing its initialization and is ready to serve the auction traffic.
+
+4. you can copy the URL `http://localhost:8000/status` and paste it into your browser. You should see `ok` in the response which is another way to tell the Prebid Server that the main auction server is up and running.
+
+5. Open a new tab in your browser and turn on the console UI. If you are using Chrome, you can right-click on the page and click `inspect`. Once the console UI is on, click on the `Network` tab to inspect the traffic later.
+
+6. Copy the URL `http://localhost:8000/static/pbjs.html?pbjs_debug=true` into your browser. It starts the example immediately with debugging information from `Prebid JS`, and you can inspect the request and response between `Prebid JS` and `Prebid Server`.
+
+7. After playing with the example, type `docker-compose down`. This is to shut down the existing Sample so you can start the next one you want to select.
diff --git a/sample/docker-compose.yml b/sample/docker-compose.yml
new file mode 100644
index 00000000..49b615c1
--- /dev/null
+++ b/sample/docker-compose.yml
@@ -0,0 +1,20 @@
+version: "3.9"
+services:
+  001_banner:
+    platform: linux/amd64
+    build:
+      context: ../
+      dockerfile: Dockerfile
+      args:
+        - TEST=false
+    image: pbs-sample
+    container_name: 001_banner
+    privileged: true
+    ports:
+      - "8000:8000"
+      - "6060:6060"
+    volumes:
+      - ../sample/001_banner/app.yaml:/usr/local/bin/pbs.yaml
+      - ../sample/001_banner/pbjs.html:/usr/local/bin/static/pbjs.html
+      - ../sample/001_banner/stored_request.json:/usr/local/bin/stored_requests/data/by_id/stored_imps/test-imp-id.json
+      - ../sample/001_banner/stored_response.json:/usr/local/bin/stored_responses/data/by_id/stored_responses/test-bid-id.json
\ No newline at end of file
diff --git a/static/bidder-info/cpmstar.yaml b/static/bidder-info/cpmstar.yaml
index 7c54ba53..94a91e5a 100644
--- a/static/bidder-info/cpmstar.yaml
+++ b/static/bidder-info/cpmstar.yaml
@@ -11,6 +11,9 @@ capabilities:
       - banner
       - video
 userSync:
+  iframe:
+    url: "https://server.cpmstar.com/usersync.aspx?ifr=1&gdpr={{.GDPR}}&consent={{.GDPRConsent}}&us_privacy={{.USPrivacy}}&redirect={{.RedirectURL}}"
+    userMacro: "$UID"
   redirect:
     url: "https://server.cpmstar.com/usersync.aspx?gdpr={{.GDPR}}&consent={{.GDPRConsent}}&us_privacy={{.USPrivacy}}&redirect={{.RedirectURL}}"
-    userMacro: "$UID"
+    userMacro: "$UID"    
\ No newline at end of file
diff --git a/static/bidder-info/jdpmedia.yaml b/static/bidder-info/jdpmedia.yaml
new file mode 100644
index 00000000..8139dd4f
--- /dev/null
+++ b/static/bidder-info/jdpmedia.yaml
@@ -0,0 +1,5 @@
+endpoint: "http://jdpmedia-prebid.smart-hub.io/pbserver/?seat={{.AccountID}}&token={{.SourceId}}"
+aliasOf: "smarthub"
+userSync:
+  supports:
+    - redirect
\ No newline at end of file
diff --git a/static/bidder-info/mabidder.yaml b/static/bidder-info/mabidder.yaml
index 3f03fd87..b66e9a8b 100644
--- a/static/bidder-info/mabidder.yaml
+++ b/static/bidder-info/mabidder.yaml
@@ -8,4 +8,7 @@ capabilities:
       - banner
   site:
     mediaTypes:
-      - banner
\ No newline at end of file
+      - banner
+# This bidder does not operate globally. Please consider setting "disabled: true" outside of the following regions:
+geoscope:
+  - CAN
\ No newline at end of file


Test patch:
diff --git a/adapters/pubmatic/pubmatictest/supplemental/impExtData.json b/adapters/pubmatic/pubmatictest/supplemental/impExt.json
similarity index 97%
rename from adapters/pubmatic/pubmatictest/supplemental/impExtData.json
rename to adapters/pubmatic/pubmatictest/supplemental/impExt.json
index 17bb47fe..368dd2fa 100644
--- a/adapters/pubmatic/pubmatictest/supplemental/impExtData.json
+++ b/adapters/pubmatic/pubmatictest/supplemental/impExt.json
@@ -32,7 +32,8 @@
                             "rugby",
                             "cricket"
                         ]
-                    }
+                    },
+                    "gpid":"/1111/home"
                 }
             }
         ],
@@ -68,7 +69,8 @@
                             },
                             "ext": {
                                 "dfp_ad_unit_code": "/1111/home",
-                                "key_val": "k1=v1|k2=v2|sport=rugby,cricket"
+                                "key_val": "k1=v1|k2=v2|sport=rugby,cricket",
+                                "gpid":"/1111/home"
                             }
                         }
                     ],
diff --git a/adapters/yeahmobi/yeahmobitest/exemplary/simple-video.json b/adapters/yeahmobi/yeahmobitest/exemplary/simple-video.json
index cda8ebe4..af07de8f 100644
--- a/adapters/yeahmobi/yeahmobitest/exemplary/simple-video.json
+++ b/adapters/yeahmobi/yeahmobitest/exemplary/simple-video.json
@@ -20,7 +20,6 @@
       }
     ]
   },
-
   "httpCalls": [
     {
       "expectedRequest": {
@@ -29,7 +28,7 @@
           "id": "test-request-id",
           "imp": [
             {
-              "id":"test-imp-id",
+              "id": "test-imp-id",
               "video": {
                 "w": 300,
                 "h": 250,
@@ -46,7 +45,9 @@
             }
           ]
         },
-        "impIDs":["test-imp-id"]
+        "impIDs": [
+          "test-imp-id"
+        ]
       },
       "mockResponse": {
         "status": 200,
@@ -55,13 +56,20 @@
           "seatbid": [
             {
               "seat": "ttx",
-              "bid": [{
-                "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800",
-                "impid": "test-imp-id",
-                "price": 1.2,
-                "adm": "some-ads",
-                "crid": "crid_testid"
-              }]
+              "bid": [
+                {
+                  "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800",
+                  "impid": "test-imp-id",
+                  "price": 1.2,
+                  "adm": "some-ads",
+                  "crid": "crid_testid",
+                  "ext": {
+                    "video": {
+                      "duration": 300
+                    }
+                  }
+                }
+              ]
             }
           ],
           "cur": "USD"
@@ -69,7 +77,6 @@
       }
     }
   ],
-
   "expectedBidResponses": [
     {
       "currency": "USD",
@@ -80,9 +87,17 @@
             "impid": "test-imp-id",
             "price": 1.2,
             "adm": "some-ads",
-            "crid": "crid_testid"
+            "crid": "crid_testid",
+            "ext": {
+              "video": {
+                "duration": 300
+              }
+            }
           },
-          "type": "video"
+          "type": "video",
+          "video": {
+            "duration": 300
+          }
         }
       ]
     }