@@ -322,10 +322,12 @@ public void setUp() {
322322
323323 given (privacyEnforcementService .mask (any (), argThat (MapUtils ::isNotEmpty ), any ()))
324324 .willAnswer (inv ->
325- Future .succeededFuture (((Map <String , User >) inv .getArgument (1 )).entrySet ().stream ()
325+ Future .succeededFuture (((Map <String , Pair <User , Device >>) inv .getArgument (1 )).entrySet ()
326+ .stream ()
326327 .map (bidderAndUser -> BidderPrivacyResult .builder ()
327328 .requestBidder (bidderAndUser .getKey ())
328- .user (bidderAndUser .getValue ())
329+ .user (bidderAndUser .getValue ().getLeft ())
330+ .device (bidderAndUser .getValue ().getRight ())
329331 .build ())
330332 .toList ()));
331333
@@ -2691,12 +2693,12 @@ public void shouldUseConcreteOverGeneralSiteWithExtPrebidBidderConfigIgnoringCas
26912693
26922694 final ObjectNode siteWithPage = mapper .valueToTree (Site .builder ().page ("testPage" ).build ());
26932695 final ExtBidderConfig extBidderConfig = ExtBidderConfig .of (
2694- ExtBidderConfigOrtb .of (siteWithPage , null , null , null ));
2696+ ExtBidderConfigOrtb .of (siteWithPage , null , null , null , null ));
26952697 final ExtRequestPrebidBidderConfig concreteFpdConfig = ExtRequestPrebidBidderConfig .of (
26962698 singletonList ("SoMeBiDdEr" ), extBidderConfig );
26972699 final ObjectNode siteWithDomain = mapper .valueToTree (Site .builder ().domain ("notUsed" ).build ());
26982700 final ExtBidderConfig allExtBidderConfig = ExtBidderConfig .of (
2699- ExtBidderConfigOrtb .of (siteWithDomain , null , null , null ));
2701+ ExtBidderConfigOrtb .of (siteWithDomain , null , null , null , null ));
27002702 final ExtRequestPrebidBidderConfig allFpdConfig = ExtRequestPrebidBidderConfig .of (singletonList ("*" ),
27012703 allExtBidderConfig );
27022704
@@ -2738,12 +2740,12 @@ public void shouldUseConcreteOverGeneralDoohWithExtPrebidBidderConfig() {
27382740
27392741 final ObjectNode doohWithVenueType = mapper .valueToTree (Dooh .builder ().venuetype (List .of ("venuetype" )).build ());
27402742 final ExtBidderConfig extBidderConfig = ExtBidderConfig .of (
2741- ExtBidderConfigOrtb .of (null , null , doohWithVenueType , null ));
2743+ ExtBidderConfigOrtb .of (null , null , doohWithVenueType , null , null ));
27422744 final ExtRequestPrebidBidderConfig concreteFpdConfig = ExtRequestPrebidBidderConfig .of (
27432745 singletonList ("someBidder" ), extBidderConfig );
27442746 final ObjectNode doohWithDomain = mapper .valueToTree (Dooh .builder ().domain ("notUsed" ).build ());
27452747 final ExtBidderConfig allExtBidderConfig = ExtBidderConfig .of (
2746- ExtBidderConfigOrtb .of (null , null , doohWithDomain , null ));
2748+ ExtBidderConfigOrtb .of (null , null , doohWithDomain , null , null ));
27472749 final ExtRequestPrebidBidderConfig allFpdConfig = ExtRequestPrebidBidderConfig .of (
27482750 singletonList ("*" ),
27492751 allExtBidderConfig );
@@ -2787,15 +2789,15 @@ public void shouldUseConcreteOverGeneralAppWithExtPrebidBidderConfigIgnoringCase
27872789 final Publisher publisherWithId = Publisher .builder ().id ("testId" ).build ();
27882790 final ObjectNode appWithPublisherId = mapper .valueToTree (App .builder ().publisher (publisherWithId ).build ());
27892791 final ExtBidderConfig extBidderConfig = ExtBidderConfig .of (
2790- ExtBidderConfigOrtb .of (null , appWithPublisherId , null , null ));
2792+ ExtBidderConfigOrtb .of (null , appWithPublisherId , null , null , null ));
27912793 final ExtRequestPrebidBidderConfig concreteFpdConfig = ExtRequestPrebidBidderConfig .of (
27922794 singletonList ("SoMeBiDdEr" ), extBidderConfig );
27932795
27942796 final Publisher publisherWithIdAndDomain = Publisher .builder ().id ("notUsed" ).domain ("notUsed" ).build ();
27952797 final ObjectNode appWithUpdatedPublisher = mapper .valueToTree (
27962798 App .builder ().publisher (publisherWithIdAndDomain ).build ());
27972799 final ExtBidderConfig allExtBidderConfig = ExtBidderConfig .of (
2798- ExtBidderConfigOrtb .of (null , appWithUpdatedPublisher , null , null ));
2800+ ExtBidderConfigOrtb .of (null , appWithUpdatedPublisher , null , null , null ));
27992801 final ExtRequestPrebidBidderConfig allFpdConfig = ExtRequestPrebidBidderConfig .of (singletonList ("*" ),
28002802 allExtBidderConfig );
28012803
@@ -2834,13 +2836,13 @@ public void shouldUseConcreteOverGeneralUserWithExtPrebidBidderConfig() {
28342836 givenBidder ("someBidder" , bidder , givenEmptySeatBid ());
28352837 final ObjectNode bidderConfigUser = mapper .valueToTree (User .builder ().id ("userFromConfig" ).build ());
28362838 final ExtBidderConfig extBidderConfig = ExtBidderConfig .of (
2837- ExtBidderConfigOrtb .of (null , null , null , bidderConfigUser ));
2839+ ExtBidderConfigOrtb .of (null , null , null , bidderConfigUser , null ));
28382840 final ExtRequestPrebidBidderConfig concreteFpdConfig = ExtRequestPrebidBidderConfig .of (
28392841 singletonList ("SomMeBiDdEr" ), extBidderConfig );
28402842
28412843 final ObjectNode emptyUser = mapper .valueToTree (User .builder ().build ());
28422844 final ExtBidderConfig allExtBidderConfig = ExtBidderConfig .of (
2843- ExtBidderConfigOrtb .of (null , null , null , emptyUser ));
2845+ ExtBidderConfigOrtb .of (null , null , null , emptyUser , null ));
28442846 final ExtRequestPrebidBidderConfig allFpdConfig = ExtRequestPrebidBidderConfig .of (singletonList ("*" ),
28452847 allExtBidderConfig );
28462848 final User requestUser = User .builder ().id ("erased" ).buyeruid ("testBuyerId" ).build ();
@@ -2870,6 +2872,44 @@ public void shouldUseConcreteOverGeneralUserWithExtPrebidBidderConfig() {
28702872 .containsOnly (mergedUser );
28712873 }
28722874
2875+ @ Test
2876+ public void shouldUseBidderSpecificDeviceDataInBidderRequest () {
2877+ // given
2878+ final Bidder <?> bidder = mock (Bidder .class );
2879+ givenBidder ("someBidder" , bidder , givenEmptySeatBid ());
2880+
2881+ final ObjectNode deviceWithMakeAndModel = mapper .valueToTree (
2882+ Device .builder ().make ("TestMake_001" ).model ("TestModel_001" ).build ());
2883+ final ExtBidderConfig extBidderConfig = ExtBidderConfig .of (
2884+ ExtBidderConfigOrtb .of (null , null , null , null , deviceWithMakeAndModel ));
2885+ final ExtRequestPrebidBidderConfig concreteFpdConfig = ExtRequestPrebidBidderConfig .of (
2886+ singletonList ("someBidder" ), extBidderConfig );
2887+ final Device requestDevice = Device .builder ().build ();
2888+ final ExtRequestPrebid extRequestPrebid = ExtRequestPrebid .builder ()
2889+ .bidderconfig (singletonList (concreteFpdConfig ))
2890+ .build ();
2891+ final BidRequest bidRequest = givenBidRequest (givenSingleImp (singletonMap ("someBidder" , 1 )),
2892+ builder -> builder .device (requestDevice ).ext (ExtRequest .of (extRequestPrebid )));
2893+ final Device mergedDevice = Device .builder ()
2894+ .make ("TestMake_001" ).model ("TestModel_001" ).build ();
2895+
2896+ given (fpdResolver .resolveDevice (any (), any ())).willReturn (mergedDevice );
2897+
2898+ // when
2899+ target .holdAuction (givenRequestContext (bidRequest ));
2900+
2901+ // then
2902+ final ArgumentCaptor <BidderRequest > bidderRequestCaptor = ArgumentCaptor .forClass (BidderRequest .class );
2903+ verify (httpBidderRequester )
2904+ .requestBids (any (), bidderRequestCaptor .capture (), any (), any (), any (), any (), anyBoolean ());
2905+ final List <BidderRequest > capturedBidRequests = bidderRequestCaptor .getAllValues ();
2906+
2907+ assertThat (capturedBidRequests )
2908+ .extracting (BidderRequest ::getBidRequest )
2909+ .extracting (BidRequest ::getDevice )
2910+ .containsOnly (mergedDevice );
2911+ }
2912+
28732913 @ Test
28742914 public void shouldAddBuyeridToUserFromRequest () {
28752915 // given
0 commit comments