Skip to content

Commit b9af14f

Browse files
authored
Merge pull request #716 from prebid/feature/native_trackers_crash
Native trackers crash fix
2 parents 7529fdb + a94b7e0 commit b9af14f

File tree

4 files changed

+220
-88
lines changed

4 files changed

+220
-88
lines changed

PrebidMobile/PrebidMobile-core/src/main/java/org/prebid/mobile/PrebidNativeAd.java

Lines changed: 14 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -295,14 +295,7 @@ public boolean registerView(View view, final PrebidNativeAdEventListener listene
295295
return false;
296296
}
297297

298-
ArrayList<String> combinedImpTrackers = new ArrayList<>();
299-
if (imp_trackers != null) {
300-
combinedImpTrackers.addAll(imp_trackers);
301-
}
302-
if (impEvent != null) {
303-
combinedImpTrackers.add(impEvent);
304-
}
305-
createImpressionTrackers(view, combinedImpTrackers);
298+
createImpressionTrackers(view);
306299

307300
registeredView = new WeakReference<>(view);
308301

@@ -340,14 +333,8 @@ public boolean registerView(View container, List<View> clickableViews, final Pre
340333
if (visibilityDetector == null) {
341334
return false;
342335
}
343-
ArrayList<String> combinedImpTrackers = new ArrayList<>();
344-
if (imp_trackers != null) {
345-
combinedImpTrackers.addAll(imp_trackers);
346-
}
347-
if (impEvent != null) {
348-
combinedImpTrackers.add(impEvent);
349-
}
350-
createImpressionTrackers(container, combinedImpTrackers);
336+
337+
createImpressionTrackers(container);
351338

352339
registeredView = new WeakReference<>(container);
353340

@@ -365,9 +352,17 @@ public boolean registerView(View container, List<View> clickableViews, final Pre
365352
return false;
366353
}
367354

368-
private void createImpressionTrackers(View view, ArrayList<String> trackers) {
369-
impressionTrackers = new ArrayList<>(imp_trackers.size());
370-
for (String url : trackers) {
355+
private void createImpressionTrackers(View view) {
356+
ArrayList<String> combinedImpTrackers = new ArrayList<>();
357+
if (imp_trackers != null) {
358+
combinedImpTrackers.addAll(imp_trackers);
359+
}
360+
if (impEvent != null) {
361+
combinedImpTrackers.add(impEvent);
362+
}
363+
364+
impressionTrackers = new ArrayList<>();
365+
for (String url : combinedImpTrackers) {
371366
ImpressionTracker impressionTracker = ImpressionTracker.create(url, visibilityDetector, view.getContext(), new ImpressionTrackerListener() {
372367
@Override
373368
public void onImpressionTrackerFired() {
Lines changed: 86 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,71 @@
11
package org.prebid.mobile;
22

3+
import static org.hamcrest.Matchers.hasItem;
4+
import static org.junit.Assert.assertEquals;
5+
import static org.junit.Assert.assertNotNull;
6+
import static org.junit.Assert.assertNull;
7+
import static org.junit.Assert.assertThat;
8+
import static org.mockito.Mockito.mock;
9+
import static org.mockito.Mockito.when;
10+
11+
import android.app.Application;
12+
import android.content.Context;
13+
import android.view.View;
14+
315
import org.junit.Test;
416
import org.junit.runner.RunWith;
17+
import org.prebid.mobile.reflection.Reflection;
18+
import org.prebid.mobile.test.utils.ResourceUtils;
519
import org.robolectric.RobolectricTestRunner;
620

21+
import java.io.IOException;
722
import java.util.ArrayList;
8-
9-
import static org.hamcrest.Matchers.hasItem;
10-
import static org.junit.Assert.*;
23+
import java.util.List;
1124

1225
@RunWith(RobolectricTestRunner.class)
1326
public class PrebidNativeAdTest {
1427

1528
@Test
16-
public void testNativeAdParser() {
17-
String cacheId = CacheManager.save(getResponse());
18-
PrebidNativeAd nativeAd = PrebidNativeAd.create(cacheId);
29+
public void registerView_withAllTrackers() {
30+
PrebidNativeAd nativeAd = nativeAdFromFile("PrebidNativeAdTest/Full.json");
31+
32+
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());
33+
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());
34+
35+
ArrayList<String> admImpressionTrackers = reflectAdmImpressionTrackers(nativeAd);
36+
assertNotNull(admImpressionTrackers);
37+
assertEquals(1, admImpressionTrackers.size());
38+
assertThat(admImpressionTrackers, hasItem("https://s3-us-west-2.amazonaws.com/omsdk-files/compliance-js/omid-validation-verification-script-v1.js"));
39+
40+
41+
nativeAd.registerView(createViewMock(), mock(List.class), mock(PrebidNativeAdEventListener.class));
42+
43+
44+
ArrayList<ImpressionTracker> trackerObjects = reflectImpressionTrackerObjects(nativeAd);
45+
assertEquals(2, trackerObjects.size());
46+
assertEquals("https://s3-us-west-2.amazonaws.com/omsdk-files/compliance-js/omid-validation-verification-script-v1.js", reflectImpressionTrackerUrl(trackerObjects.get(0)));
47+
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)));
48+
}
49+
50+
@Test
51+
public void registerView_withoutTrackers() {
52+
PrebidNativeAd nativeAd = nativeAdFromFile("PrebidNativeAdTest/WithoutTrackers.json");
53+
54+
assertNull(nativeAd.getWinEvent());
55+
assertNull(nativeAd.getImpEvent());
56+
assertNull(reflectAdmImpressionTrackers(nativeAd));
57+
58+
59+
nativeAd.registerView(createViewMock(), mock(List.class), mock(PrebidNativeAdEventListener.class));
60+
61+
62+
ArrayList<ImpressionTracker> trackerObjects = reflectImpressionTrackerObjects(nativeAd);
63+
assertEquals(0, trackerObjects.size());
64+
}
65+
66+
@Test
67+
public void nativeAdParser() {
68+
PrebidNativeAd nativeAd = nativeAdFromFile("PrebidNativeAdTest/Full.json");
1969

2070
assertNotNull(nativeAd);
2171

@@ -56,69 +106,36 @@ public void testNativeAdParser() {
56106
}
57107
}
58108

59-
private String getResponse() {
60-
return "{\n" +
61-
" \"id\": \"5f6bec03-a3ae-4084-b2ae-dedfb0ac01ff\",\n" +
62-
" \"impid\": \"PrebidMobile\",\n" +
63-
" \"price\": 0.11259999999999999,\n" +
64-
" \"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" +
65-
" \"adid\": \"test-ad-id-12345\",\n" +
66-
" \"adomain\": [\n" +
67-
" \"openx.com\"\n" +
68-
" ],\n" +
69-
" \"crid\": \"test-creative-id-1\",\n" +
70-
" \"w\": 300,\n" +
71-
" \"h\": 250,\n" +
72-
" \"ext\": {\n" +
73-
" \"ad_ox_cats\": [\n" +
74-
" 2\n" +
75-
" ],\n" +
76-
" \"agency_id\": \"agency_10\",\n" +
77-
" \"brand_id\": \"brand_10\",\n" +
78-
" \"buyer_id\": \"buyer_10\",\n" +
79-
" \"matching_ad_id\": {\n" +
80-
" \"campaign_id\": 1,\n" +
81-
" \"creative_id\": 3,\n" +
82-
" \"placement_id\": 2\n" +
83-
" },\n" +
84-
" \"next_highest_bid_price\": 0.099,\n" +
85-
" \"prebid\": {\n" +
86-
" \"cache\": {\n" +
87-
" \"key\": \"\",\n" +
88-
" \"url\": \"\",\n" +
89-
" \"bids\": {\n" +
90-
" \"url\": \"prebid.qa.openx.net\\/cache?uuid=feb0b9c0-7064-4dd4-8607-bef8a41f7a2c\",\n" +
91-
" \"cacheId\": \"feb0b9c0-7064-4dd4-8607-bef8a41f7a2c\"\n" +
92-
" }\n" +
93-
" },\n" +
94-
" \"targeting\": {\n" +
95-
" \"hb_bidder\": \"openx\",\n" +
96-
" \"hb_bidder_openx\": \"openx\",\n" +
97-
" \"hb_cache_host\": \"prebid.qa.openx.net\",\n" +
98-
" \"hb_cache_host_openx\": \"prebid.qa.openx.net\",\n" +
99-
" \"hb_cache_id\": \"feb0b9c0-7064-4dd4-8607-bef8a41f7a2c\",\n" +
100-
" \"hb_cache_id_openx\": \"feb0b9c0-7064-4dd4-8607-bef8a41f7a2c\",\n" +
101-
" \"hb_cache_path\": \"\\/cache\",\n" +
102-
" \"hb_cache_path_openx\": \"\\/cache\",\n" +
103-
" \"hb_env\": \"mobile-app\",\n" +
104-
" \"hb_env_openx\": \"mobile-app\",\n" +
105-
" \"hb_pb\": \"0.10\",\n" +
106-
" \"hb_pb_openx\": \"0.10\",\n" +
107-
" \"hb_size\": \"300x250\",\n" +
108-
" \"hb_size_openx\": \"300x250\"\n" +
109-
" },\n" +
110-
" \"type\": \"banner\",\n" +
111-
" \"video\": {\n" +
112-
" \"duration\": 0,\n" +
113-
" \"primary_category\": \"\"\n" +
114-
" },\n" +
115-
" \"events\": {\n" +
116-
" \"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" +
117-
" \"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" +
118-
" }\n" +
119-
" }\n" +
120-
" }\n" +
121-
"}";
109+
110+
private PrebidNativeAd nativeAdFromFile(String path) {
111+
try {
112+
String resource = ResourceUtils.convertResourceToString(path);
113+
String cacheId = CacheManager.save(resource);
114+
return PrebidNativeAd.create(cacheId);
115+
} catch (IOException e) {
116+
throw new NullPointerException(e.getMessage());
117+
}
118+
}
119+
120+
private View createViewMock() {
121+
Context contextMock = mock(Context.class);
122+
when(contextMock.getApplicationContext()).thenReturn(mock(Application.class));
123+
124+
View mainMock = mock(View.class);
125+
when(mainMock.getContext()).thenReturn(contextMock);
126+
return mainMock;
127+
}
128+
129+
private ArrayList<String> reflectAdmImpressionTrackers(PrebidNativeAd ad) {
130+
return Reflection.getFieldOf(ad, "imp_trackers");
131+
}
132+
133+
private ArrayList<ImpressionTracker> reflectImpressionTrackerObjects(PrebidNativeAd ad) {
134+
return Reflection.getFieldOf(ad, "impressionTrackers");
135+
}
136+
137+
private String reflectImpressionTrackerUrl(ImpressionTracker tracker) {
138+
return Reflection.getFieldOf(tracker, "url");
122139
}
123140

124141
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
{
2+
"id": "5f6bec03-a3ae-4084-b2ae-dedfb0ac01ff",
3+
"impid": "PrebidMobile",
4+
"price": 0.11259999999999999,
5+
"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\"}}]}",
6+
"adid": "test-ad-id-12345",
7+
"adomain": [
8+
"openx.com"
9+
],
10+
"crid": "test-creative-id-1",
11+
"w": 300,
12+
"h": 250,
13+
"ext": {
14+
"ad_ox_cats": [
15+
2
16+
],
17+
"agency_id": "agency_10",
18+
"brand_id": "brand_10",
19+
"buyer_id": "buyer_10",
20+
"matching_ad_id": {
21+
"campaign_id": 1,
22+
"creative_id": 3,
23+
"placement_id": 2
24+
},
25+
"next_highest_bid_price": 0.099,
26+
"prebid": {
27+
"cache": {
28+
"key": "",
29+
"url": "",
30+
"bids": {
31+
"url": "prebid.qa.openx.net\/cache?uuid=feb0b9c0-7064-4dd4-8607-bef8a41f7a2c",
32+
"cacheId": "feb0b9c0-7064-4dd4-8607-bef8a41f7a2c"
33+
}
34+
},
35+
"targeting": {
36+
"hb_bidder": "openx",
37+
"hb_bidder_openx": "openx",
38+
"hb_cache_host": "prebid.qa.openx.net",
39+
"hb_cache_host_openx": "prebid.qa.openx.net",
40+
"hb_cache_id": "feb0b9c0-7064-4dd4-8607-bef8a41f7a2c",
41+
"hb_cache_id_openx": "feb0b9c0-7064-4dd4-8607-bef8a41f7a2c",
42+
"hb_cache_path": "\/cache",
43+
"hb_cache_path_openx": "\/cache",
44+
"hb_env": "mobile-app",
45+
"hb_env_openx": "mobile-app",
46+
"hb_pb": "0.10",
47+
"hb_pb_openx": "0.10",
48+
"hb_size": "300x250",
49+
"hb_size_openx": "300x250"
50+
},
51+
"type": "banner",
52+
"video": {
53+
"duration": 0,
54+
"primary_category": ""
55+
},
56+
"events": {
57+
"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",
58+
"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"
59+
}
60+
}
61+
}
62+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
{
2+
"id": "5f6bec03-a3ae-4084-b2ae-dedfb0ac01ff",
3+
"impid": "PrebidMobile",
4+
"price": 0.11259999999999999,
5+
"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\/\"}}",
6+
"adid": "test-ad-id-12345",
7+
"adomain": [
8+
"openx.com"
9+
],
10+
"crid": "test-creative-id-1",
11+
"w": 300,
12+
"h": 250,
13+
"ext": {
14+
"ad_ox_cats": [
15+
2
16+
],
17+
"agency_id": "agency_10",
18+
"brand_id": "brand_10",
19+
"buyer_id": "buyer_10",
20+
"matching_ad_id": {
21+
"campaign_id": 1,
22+
"creative_id": 3,
23+
"placement_id": 2
24+
},
25+
"next_highest_bid_price": 0.099,
26+
"prebid": {
27+
"cache": {
28+
"key": "",
29+
"url": "",
30+
"bids": {
31+
"url": "prebid.qa.openx.net\/cache?uuid=feb0b9c0-7064-4dd4-8607-bef8a41f7a2c",
32+
"cacheId": "feb0b9c0-7064-4dd4-8607-bef8a41f7a2c"
33+
}
34+
},
35+
"targeting": {
36+
"hb_bidder": "openx",
37+
"hb_bidder_openx": "openx",
38+
"hb_cache_host": "prebid.qa.openx.net",
39+
"hb_cache_host_openx": "prebid.qa.openx.net",
40+
"hb_cache_id": "feb0b9c0-7064-4dd4-8607-bef8a41f7a2c",
41+
"hb_cache_id_openx": "feb0b9c0-7064-4dd4-8607-bef8a41f7a2c",
42+
"hb_cache_path": "\/cache",
43+
"hb_cache_path_openx": "\/cache",
44+
"hb_env": "mobile-app",
45+
"hb_env_openx": "mobile-app",
46+
"hb_pb": "0.10",
47+
"hb_pb_openx": "0.10",
48+
"hb_size": "300x250",
49+
"hb_size_openx": "300x250"
50+
},
51+
"type": "banner",
52+
"video": {
53+
"duration": 0,
54+
"primary_category": ""
55+
}
56+
}
57+
}
58+
}

0 commit comments

Comments
 (0)