From 2cfc2014aa278eb98329fb6b2677bf4b9dd70677 Mon Sep 17 00:00:00 2001 From: Valentin Petrovych Date: Wed, 15 Nov 2023 14:14:41 +0100 Subject: [PATCH 1/2] fix: prebid native ad #715 --- .../org/prebid/mobile/PrebidNativeAd.java | 33 ++++++++----------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/PrebidNativeAd.java b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/PrebidNativeAd.java index a14a92d96..d88ecde7d 100644 --- a/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/PrebidNativeAd.java +++ b/PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/PrebidNativeAd.java @@ -295,14 +295,7 @@ public boolean registerView(View view, final PrebidNativeAdEventListener listene return false; } - ArrayList combinedImpTrackers = new ArrayList<>(); - if (imp_trackers != null) { - combinedImpTrackers.addAll(imp_trackers); - } - if (impEvent != null) { - combinedImpTrackers.add(impEvent); - } - createImpressionTrackers(view, combinedImpTrackers); + createImpressionTrackers(view); registeredView = new WeakReference<>(view); @@ -340,14 +333,8 @@ public boolean registerView(View container, List clickableViews, final Pre if (visibilityDetector == null) { return false; } - ArrayList combinedImpTrackers = new ArrayList<>(); - if (imp_trackers != null) { - combinedImpTrackers.addAll(imp_trackers); - } - if (impEvent != null) { - combinedImpTrackers.add(impEvent); - } - createImpressionTrackers(container, combinedImpTrackers); + + createImpressionTrackers(container); registeredView = new WeakReference<>(container); @@ -365,9 +352,17 @@ public boolean registerView(View container, List clickableViews, final Pre return false; } - private void createImpressionTrackers(View view, ArrayList trackers) { - impressionTrackers = new ArrayList<>(imp_trackers.size()); - for (String url : trackers) { + private void createImpressionTrackers(View view) { + ArrayList combinedImpTrackers = new ArrayList<>(); + if (imp_trackers != null) { + combinedImpTrackers.addAll(imp_trackers); + } + if (impEvent != null) { + combinedImpTrackers.add(impEvent); + } + + impressionTrackers = new ArrayList<>(); + for (String url : combinedImpTrackers) { ImpressionTracker impressionTracker = ImpressionTracker.create(url, visibilityDetector, view.getContext(), new ImpressionTrackerListener() { @Override public void onImpressionTrackerFired() { From a94b7e0c1ec5a154c54c9e13c4a1c1e5424da617 Mon Sep 17 00:00:00 2001 From: Valentin Petrovych Date: Wed, 15 Nov 2023 14:15:01 +0100 Subject: [PATCH 2/2] test: prebid native ad #715 --- .../org/prebid/mobile/PrebidNativeAdTest.java | 155 ++++++++++-------- .../resources/PrebidNativeAdTest/Full.json | 62 +++++++ .../PrebidNativeAdTest/WithoutTrackers.json | 58 +++++++ 3 files changed, 206 insertions(+), 69 deletions(-) create mode 100644 PrebidMobile/PrebidMobile-core/src/test/resources/PrebidNativeAdTest/Full.json create mode 100644 PrebidMobile/PrebidMobile-core/src/test/resources/PrebidNativeAdTest/WithoutTrackers.json diff --git a/PrebidMobile/PrebidMobile-core/src/test/java/org/prebid/mobile/PrebidNativeAdTest.java b/PrebidMobile/PrebidMobile-core/src/test/java/org/prebid/mobile/PrebidNativeAdTest.java index e60b4bf0b..7f2475834 100644 --- a/PrebidMobile/PrebidMobile-core/src/test/java/org/prebid/mobile/PrebidNativeAdTest.java +++ b/PrebidMobile/PrebidMobile-core/src/test/java/org/prebid/mobile/PrebidNativeAdTest.java @@ -1,21 +1,71 @@ package org.prebid.mobile; +import static org.hamcrest.Matchers.hasItem; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import android.app.Application; +import android.content.Context; +import android.view.View; + import org.junit.Test; import org.junit.runner.RunWith; +import org.prebid.mobile.reflection.Reflection; +import org.prebid.mobile.test.utils.ResourceUtils; import org.robolectric.RobolectricTestRunner; +import java.io.IOException; import java.util.ArrayList; - -import static org.hamcrest.Matchers.hasItem; -import static org.junit.Assert.*; +import java.util.List; @RunWith(RobolectricTestRunner.class) public class PrebidNativeAdTest { @Test - public void testNativeAdParser() { - String cacheId = CacheManager.save(getResponse()); - PrebidNativeAd nativeAd = PrebidNativeAd.create(cacheId); + public void registerView_withAllTrackers() { + PrebidNativeAd nativeAd = nativeAdFromFile("PrebidNativeAdTest/Full.json"); + + assertEquals("https://prebid.qa.openx.net//event?t=win&b=5f6bec03-a3ae-4084-b2ae-dedfb0ac01ff&a=b4eb1475-4e3d-4186-97b7-25b6a6cf8618&bidder=openx&ts=1643899069308", nativeAd.getWinEvent()); + assertEquals("https://prebid.qa.openx.net//event?t=imp&b=5f6bec03-a3ae-4084-b2ae-dedfb0ac01ff&a=b4eb1475-4e3d-4186-97b7-25b6a6cf8618&bidder=openx&ts=1643899069308", nativeAd.getImpEvent()); + + ArrayList admImpressionTrackers = reflectAdmImpressionTrackers(nativeAd); + assertNotNull(admImpressionTrackers); + assertEquals(1, admImpressionTrackers.size()); + assertThat(admImpressionTrackers, hasItem("https://s3-us-west-2.amazonaws.com/omsdk-files/compliance-js/omid-validation-verification-script-v1.js")); + + + nativeAd.registerView(createViewMock(), mock(List.class), mock(PrebidNativeAdEventListener.class)); + + + ArrayList trackerObjects = reflectImpressionTrackerObjects(nativeAd); + assertEquals(2, trackerObjects.size()); + assertEquals("https://s3-us-west-2.amazonaws.com/omsdk-files/compliance-js/omid-validation-verification-script-v1.js", reflectImpressionTrackerUrl(trackerObjects.get(0))); + assertEquals("https://prebid.qa.openx.net//event?t=imp&b=5f6bec03-a3ae-4084-b2ae-dedfb0ac01ff&a=b4eb1475-4e3d-4186-97b7-25b6a6cf8618&bidder=openx&ts=1643899069308", reflectImpressionTrackerUrl(trackerObjects.get(1))); + } + + @Test + public void registerView_withoutTrackers() { + PrebidNativeAd nativeAd = nativeAdFromFile("PrebidNativeAdTest/WithoutTrackers.json"); + + assertNull(nativeAd.getWinEvent()); + assertNull(nativeAd.getImpEvent()); + assertNull(reflectAdmImpressionTrackers(nativeAd)); + + + nativeAd.registerView(createViewMock(), mock(List.class), mock(PrebidNativeAdEventListener.class)); + + + ArrayList trackerObjects = reflectImpressionTrackerObjects(nativeAd); + assertEquals(0, trackerObjects.size()); + } + + @Test + public void nativeAdParser() { + PrebidNativeAd nativeAd = nativeAdFromFile("PrebidNativeAdTest/Full.json"); assertNotNull(nativeAd); @@ -56,69 +106,36 @@ public void testNativeAdParser() { } } - private String getResponse() { - return "{\n" + - " \"id\": \"5f6bec03-a3ae-4084-b2ae-dedfb0ac01ff\",\n" + - " \"impid\": \"PrebidMobile\",\n" + - " \"price\": 0.11259999999999999,\n" + - " \"adm\": \"{\\\"assets\\\":[{\\\"required\\\":1,\\\"data\\\":{\\\"value\\\":\\\"Sample value 2\\\"}},{\\\"required\\\":1,\\\"data\\\":{\\\"type\\\":500,\\\"value\\\":\\\"Sample value\\\"}},{\\\"required\\\":1,\\\"img\\\":{\\\"type\\\":500,\\\"url\\\":\\\"https://test.com/test.png\\\"}},{\\\"required\\\":1,\\\"img\\\":{\\\"url\\\":\\\"https://test2.com/test.png\\\"}},\n{\\\"required\\\":1,\\\"title\\\":{\\\"text\\\":\\\"OpenX (Title)\\\"}},{\\\"required\\\":1,\\\"img\\\":{\\\"type\\\":1,\\\"url\\\":\\\"https:\\/\\/www.saashub.com\\/images\\/app\\/service_logos\\/5\\/1df363c9a850\\/large.png?1525414023\\\"}},{\\\"required\\\":1,\\\"img\\\":{\\\"type\\\":3,\\\"url\\\":\\\"https:\\/\\/ssl-i.cdn.openx.com\\/mobile\\/demo-creatives\\/mobile-demo-banner-640x100.png\\\"}},{\\\"required\\\":1,\\\"data\\\":{\\\"type\\\":1,\\\"value\\\":\\\"OpenX (Brand)\\\"}},{\\\"required\\\":1,\\\"data\\\":{\\\"type\\\":2,\\\"value\\\":\\\"Learn all about this awesome story of someone using out OpenX SDK.\\\"}},{\\\"required\\\":1,\\\"data\\\":{\\\"type\\\":12,\\\"value\\\":\\\"Click here to visit our site!\\\"}}],\\\"link\\\":{\\\"url\\\":\\\"https:\\/\\/www.openx.com\\/\\\"},\\\"eventtrackers\\\":[{\\\"event\\\":555,\\\"method\\\":2,\\\"url\\\":\\\"https:\\/\\/s3-us-west-2.amazonaws.com\\/omsdk-files\\/compliance-js\\/omid-validation-verification-script-v1.js\\\",\\\"ext\\\":{\\\"vendorKey\\\":\\\"iabtechlab.com-omid\\\",\\\"verification_parameters\\\":\\\"iabtechlab-Openx\\\"}}]}\",\n" + - " \"adid\": \"test-ad-id-12345\",\n" + - " \"adomain\": [\n" + - " \"openx.com\"\n" + - " ],\n" + - " \"crid\": \"test-creative-id-1\",\n" + - " \"w\": 300,\n" + - " \"h\": 250,\n" + - " \"ext\": {\n" + - " \"ad_ox_cats\": [\n" + - " 2\n" + - " ],\n" + - " \"agency_id\": \"agency_10\",\n" + - " \"brand_id\": \"brand_10\",\n" + - " \"buyer_id\": \"buyer_10\",\n" + - " \"matching_ad_id\": {\n" + - " \"campaign_id\": 1,\n" + - " \"creative_id\": 3,\n" + - " \"placement_id\": 2\n" + - " },\n" + - " \"next_highest_bid_price\": 0.099,\n" + - " \"prebid\": {\n" + - " \"cache\": {\n" + - " \"key\": \"\",\n" + - " \"url\": \"\",\n" + - " \"bids\": {\n" + - " \"url\": \"prebid.qa.openx.net\\/cache?uuid=feb0b9c0-7064-4dd4-8607-bef8a41f7a2c\",\n" + - " \"cacheId\": \"feb0b9c0-7064-4dd4-8607-bef8a41f7a2c\"\n" + - " }\n" + - " },\n" + - " \"targeting\": {\n" + - " \"hb_bidder\": \"openx\",\n" + - " \"hb_bidder_openx\": \"openx\",\n" + - " \"hb_cache_host\": \"prebid.qa.openx.net\",\n" + - " \"hb_cache_host_openx\": \"prebid.qa.openx.net\",\n" + - " \"hb_cache_id\": \"feb0b9c0-7064-4dd4-8607-bef8a41f7a2c\",\n" + - " \"hb_cache_id_openx\": \"feb0b9c0-7064-4dd4-8607-bef8a41f7a2c\",\n" + - " \"hb_cache_path\": \"\\/cache\",\n" + - " \"hb_cache_path_openx\": \"\\/cache\",\n" + - " \"hb_env\": \"mobile-app\",\n" + - " \"hb_env_openx\": \"mobile-app\",\n" + - " \"hb_pb\": \"0.10\",\n" + - " \"hb_pb_openx\": \"0.10\",\n" + - " \"hb_size\": \"300x250\",\n" + - " \"hb_size_openx\": \"300x250\"\n" + - " },\n" + - " \"type\": \"banner\",\n" + - " \"video\": {\n" + - " \"duration\": 0,\n" + - " \"primary_category\": \"\"\n" + - " },\n" + - " \"events\": {\n" + - " \"win\": \"https:\\/\\/prebid.qa.openx.net\\/\\/event?t=win&b=5f6bec03-a3ae-4084-b2ae-dedfb0ac01ff&a=b4eb1475-4e3d-4186-97b7-25b6a6cf8618&bidder=openx&ts=1643899069308\",\n" + - " \"imp\": \"https:\\/\\/prebid.qa.openx.net\\/\\/event?t=imp&b=5f6bec03-a3ae-4084-b2ae-dedfb0ac01ff&a=b4eb1475-4e3d-4186-97b7-25b6a6cf8618&bidder=openx&ts=1643899069308\"\n" + - " }\n" + - " }\n" + - " }\n" + - "}"; + + private PrebidNativeAd nativeAdFromFile(String path) { + try { + String resource = ResourceUtils.convertResourceToString(path); + String cacheId = CacheManager.save(resource); + return PrebidNativeAd.create(cacheId); + } catch (IOException e) { + throw new NullPointerException(e.getMessage()); + } + } + + private View createViewMock() { + Context contextMock = mock(Context.class); + when(contextMock.getApplicationContext()).thenReturn(mock(Application.class)); + + View mainMock = mock(View.class); + when(mainMock.getContext()).thenReturn(contextMock); + return mainMock; + } + + private ArrayList reflectAdmImpressionTrackers(PrebidNativeAd ad) { + return Reflection.getFieldOf(ad, "imp_trackers"); + } + + private ArrayList reflectImpressionTrackerObjects(PrebidNativeAd ad) { + return Reflection.getFieldOf(ad, "impressionTrackers"); + } + + private String reflectImpressionTrackerUrl(ImpressionTracker tracker) { + return Reflection.getFieldOf(tracker, "url"); } } diff --git a/PrebidMobile/PrebidMobile-core/src/test/resources/PrebidNativeAdTest/Full.json b/PrebidMobile/PrebidMobile-core/src/test/resources/PrebidNativeAdTest/Full.json new file mode 100644 index 000000000..15668b5ae --- /dev/null +++ b/PrebidMobile/PrebidMobile-core/src/test/resources/PrebidNativeAdTest/Full.json @@ -0,0 +1,62 @@ +{ + "id": "5f6bec03-a3ae-4084-b2ae-dedfb0ac01ff", + "impid": "PrebidMobile", + "price": 0.11259999999999999, + "adm": "{\"assets\":[{\"required\":1,\"data\":{\"value\":\"Sample value 2\"}},{\"required\":1,\"data\":{\"type\":500,\"value\":\"Sample value\"}},{\"required\":1,\"img\":{\"type\":500,\"url\":\"https://test.com/test.png\"}},{\"required\":1,\"img\":{\"url\":\"https://test2.com/test.png\"}},{\"required\":1,\"title\":{\"text\":\"OpenX (Title)\"}},{\"required\":1,\"img\":{\"type\":1,\"url\":\"https:\/\/www.saashub.com\/images\/app\/service_logos\/5\/1df363c9a850\/large.png?1525414023\"}},{\"required\":1,\"img\":{\"type\":3,\"url\":\"https:\/\/ssl-i.cdn.openx.com\/mobile\/demo-creatives\/mobile-demo-banner-640x100.png\"}},{\"required\":1,\"data\":{\"type\":1,\"value\":\"OpenX (Brand)\"}},{\"required\":1,\"data\":{\"type\":2,\"value\":\"Learn all about this awesome story of someone using out OpenX SDK.\"}},{\"required\":1,\"data\":{\"type\":12,\"value\":\"Click here to visit our site!\"}}],\"link\":{\"url\":\"https:\/\/www.openx.com\/\"},\"eventtrackers\":[{\"event\":555,\"method\":2,\"url\":\"https:\/\/s3-us-west-2.amazonaws.com\/omsdk-files\/compliance-js\/omid-validation-verification-script-v1.js\",\"ext\":{\"vendorKey\":\"iabtechlab.com-omid\",\"verification_parameters\":\"iabtechlab-Openx\"}}]}", + "adid": "test-ad-id-12345", + "adomain": [ + "openx.com" + ], + "crid": "test-creative-id-1", + "w": 300, + "h": 250, + "ext": { + "ad_ox_cats": [ + 2 + ], + "agency_id": "agency_10", + "brand_id": "brand_10", + "buyer_id": "buyer_10", + "matching_ad_id": { + "campaign_id": 1, + "creative_id": 3, + "placement_id": 2 + }, + "next_highest_bid_price": 0.099, + "prebid": { + "cache": { + "key": "", + "url": "", + "bids": { + "url": "prebid.qa.openx.net\/cache?uuid=feb0b9c0-7064-4dd4-8607-bef8a41f7a2c", + "cacheId": "feb0b9c0-7064-4dd4-8607-bef8a41f7a2c" + } + }, + "targeting": { + "hb_bidder": "openx", + "hb_bidder_openx": "openx", + "hb_cache_host": "prebid.qa.openx.net", + "hb_cache_host_openx": "prebid.qa.openx.net", + "hb_cache_id": "feb0b9c0-7064-4dd4-8607-bef8a41f7a2c", + "hb_cache_id_openx": "feb0b9c0-7064-4dd4-8607-bef8a41f7a2c", + "hb_cache_path": "\/cache", + "hb_cache_path_openx": "\/cache", + "hb_env": "mobile-app", + "hb_env_openx": "mobile-app", + "hb_pb": "0.10", + "hb_pb_openx": "0.10", + "hb_size": "300x250", + "hb_size_openx": "300x250" + }, + "type": "banner", + "video": { + "duration": 0, + "primary_category": "" + }, + "events": { + "win": "https:\/\/prebid.qa.openx.net\/\/event?t=win&b=5f6bec03-a3ae-4084-b2ae-dedfb0ac01ff&a=b4eb1475-4e3d-4186-97b7-25b6a6cf8618&bidder=openx&ts=1643899069308", + "imp": "https:\/\/prebid.qa.openx.net\/\/event?t=imp&b=5f6bec03-a3ae-4084-b2ae-dedfb0ac01ff&a=b4eb1475-4e3d-4186-97b7-25b6a6cf8618&bidder=openx&ts=1643899069308" + } + } + } +} \ No newline at end of file diff --git a/PrebidMobile/PrebidMobile-core/src/test/resources/PrebidNativeAdTest/WithoutTrackers.json b/PrebidMobile/PrebidMobile-core/src/test/resources/PrebidNativeAdTest/WithoutTrackers.json new file mode 100644 index 000000000..232d4eb59 --- /dev/null +++ b/PrebidMobile/PrebidMobile-core/src/test/resources/PrebidNativeAdTest/WithoutTrackers.json @@ -0,0 +1,58 @@ +{ + "id": "5f6bec03-a3ae-4084-b2ae-dedfb0ac01ff", + "impid": "PrebidMobile", + "price": 0.11259999999999999, + "adm": "{\"assets\":[{\"required\":1,\"data\":{\"value\":\"Sample value 2\"}},{\"required\":1,\"data\":{\"type\":500,\"value\":\"Sample value\"}},{\"required\":1,\"img\":{\"type\":500,\"url\":\"https://test.com/test.png\"}},{\"required\":1,\"img\":{\"url\":\"https://test2.com/test.png\"}},{\"required\":1,\"title\":{\"text\":\"OpenX (Title)\"}},{\"required\":1,\"img\":{\"type\":1,\"url\":\"https:\/\/www.saashub.com\/images\/app\/service_logos\/5\/1df363c9a850\/large.png?1525414023\"}},{\"required\":1,\"img\":{\"type\":3,\"url\":\"https:\/\/ssl-i.cdn.openx.com\/mobile\/demo-creatives\/mobile-demo-banner-640x100.png\"}},{\"required\":1,\"data\":{\"type\":1,\"value\":\"OpenX (Brand)\"}},{\"required\":1,\"data\":{\"type\":2,\"value\":\"Learn all about this awesome story of someone using out OpenX SDK.\"}},{\"required\":1,\"data\":{\"type\":12,\"value\":\"Click here to visit our site!\"}}],\"link\":{\"url\":\"https:\/\/www.openx.com\/\"}}", + "adid": "test-ad-id-12345", + "adomain": [ + "openx.com" + ], + "crid": "test-creative-id-1", + "w": 300, + "h": 250, + "ext": { + "ad_ox_cats": [ + 2 + ], + "agency_id": "agency_10", + "brand_id": "brand_10", + "buyer_id": "buyer_10", + "matching_ad_id": { + "campaign_id": 1, + "creative_id": 3, + "placement_id": 2 + }, + "next_highest_bid_price": 0.099, + "prebid": { + "cache": { + "key": "", + "url": "", + "bids": { + "url": "prebid.qa.openx.net\/cache?uuid=feb0b9c0-7064-4dd4-8607-bef8a41f7a2c", + "cacheId": "feb0b9c0-7064-4dd4-8607-bef8a41f7a2c" + } + }, + "targeting": { + "hb_bidder": "openx", + "hb_bidder_openx": "openx", + "hb_cache_host": "prebid.qa.openx.net", + "hb_cache_host_openx": "prebid.qa.openx.net", + "hb_cache_id": "feb0b9c0-7064-4dd4-8607-bef8a41f7a2c", + "hb_cache_id_openx": "feb0b9c0-7064-4dd4-8607-bef8a41f7a2c", + "hb_cache_path": "\/cache", + "hb_cache_path_openx": "\/cache", + "hb_env": "mobile-app", + "hb_env_openx": "mobile-app", + "hb_pb": "0.10", + "hb_pb_openx": "0.10", + "hb_size": "300x250", + "hb_size_openx": "300x250" + }, + "type": "banner", + "video": { + "duration": 0, + "primary_category": "" + } + } + } +} \ No newline at end of file