|
1 |
| -// Copyright 2021 Google Inc. All rights reserved. |
| 1 | +// Copyright 2021 Google LLC. All rights reserved. |
2 | 2 | //
|
3 | 3 | // Licensed under the Apache License, Version 2.0 (the "License");
|
4 | 4 | // you may not use this file except in compliance with the License.
|
@@ -66,10 +66,12 @@ const char* kGmaAppID = "ca-app-pub-3940256099942544~1458002511";
|
66 | 66 | const char* kBannerAdUnit = "ca-app-pub-3940256099942544/6300978111";
|
67 | 67 | const char* kInterstitialAdUnit = "ca-app-pub-3940256099942544/1033173712";
|
68 | 68 | const char* kRewardedAdUnit = "ca-app-pub-3940256099942544/5224354917";
|
| 69 | +const char* kNativeAdUnit = "ca-app-pub-3940256099942544/2247696110"; |
69 | 70 | #else
|
70 | 71 | const char* kBannerAdUnit = "ca-app-pub-3940256099942544/2934735716";
|
71 | 72 | const char* kInterstitialAdUnit = "ca-app-pub-3940256099942544/4411468910";
|
72 | 73 | const char* kRewardedAdUnit = "ca-app-pub-3940256099942544/1712485313";
|
| 74 | +const char* kNativeAdUnit = "ca-app-pub-3940256099942544/3986624511"; |
73 | 75 | #endif
|
74 | 76 |
|
75 | 77 | // Used in a test to send an errant ad unit id.
|
@@ -870,6 +872,53 @@ TEST_F(FirebaseGmaTest, TestRewardedAdLoad) {
|
870 | 872 | delete rewarded;
|
871 | 873 | }
|
872 | 874 |
|
| 875 | +TEST_F(FirebaseGmaTest, TestNativeAdLoad) { |
| 876 | + SKIP_TEST_ON_DESKTOP; |
| 877 | + SKIP_TEST_ON_SIMULATOR; |
| 878 | + |
| 879 | + firebase::gma::NativeAd* native_ad = new firebase::gma::NativeAd(); |
| 880 | + |
| 881 | + WaitForCompletion(native_ad->Initialize(app_framework::GetWindowContext()), |
| 882 | + "Initialize"); |
| 883 | + |
| 884 | + // When the NativeAd is initialized, load an ad. |
| 885 | + firebase::Future<firebase::gma::AdResult> load_ad_future = |
| 886 | + native_ad->LoadAd(kNativeAdUnit, GetAdRequest()); |
| 887 | + |
| 888 | + WaitForCompletion(load_ad_future, "LoadAd"); |
| 889 | + const firebase::gma::AdResult* result_ptr = load_ad_future.result(); |
| 890 | + ASSERT_NE(result_ptr, nullptr); |
| 891 | + EXPECT_TRUE(result_ptr->is_successful()); |
| 892 | + EXPECT_FALSE(result_ptr->response_info().adapter_responses().empty()); |
| 893 | + EXPECT_FALSE( |
| 894 | + result_ptr->response_info().mediation_adapter_class_name().empty()); |
| 895 | + EXPECT_FALSE(result_ptr->response_info().response_id().empty()); |
| 896 | + EXPECT_FALSE(result_ptr->response_info().ToString().empty()); |
| 897 | + |
| 898 | + // Check image assets. |
| 899 | + EXPECT_FALSE(native_ad->icon().image_uri().empty()); |
| 900 | + EXPECT_GT(native_ad->icon().scale(), 0); |
| 901 | + EXPECT_FALSE(native_ad->images().empty()); |
| 902 | + |
| 903 | + // Native ads usually contain only one large image asset. |
| 904 | + // Check the validity of the first asset from the vector. |
| 905 | + EXPECT_FALSE(native_ad->images().at(0).image_uri().empty()); |
| 906 | + EXPECT_GT(native_ad->images().at(0).scale(), 0); |
| 907 | + |
| 908 | + // When the NativeAd is loaded, try loading icon image asset. |
| 909 | + firebase::Future<firebase::gma::ImageResult> load_image_future = |
| 910 | + native_ad->icon().LoadImage(); |
| 911 | + WaitForCompletion(load_image_future, "LoadImage"); |
| 912 | + const firebase::gma::ImageResult* img_result_ptr = load_image_future.result(); |
| 913 | + ASSERT_NE(img_result_ptr, nullptr); |
| 914 | + EXPECT_TRUE(img_result_ptr->is_successful()); |
| 915 | + EXPECT_GT(img_result_ptr->image().size(), 0); |
| 916 | + |
| 917 | + load_image_future.Release(); |
| 918 | + load_ad_future.Release(); |
| 919 | + delete native_ad; |
| 920 | +} |
| 921 | + |
873 | 922 | // Interactive test section. These have been placed up front so that the
|
874 | 923 | // tester doesn't get bored waiting for them.
|
875 | 924 | TEST_F(FirebaseGmaUITest, TestAdViewAdOpenedAdClosed) {
|
@@ -1979,6 +2028,129 @@ TEST_F(FirebaseGmaTest, TestRewardedAdErrorBadExtrasClassName) {
|
1979 | 2028 | delete rewarded;
|
1980 | 2029 | }
|
1981 | 2030 |
|
| 2031 | +// Other NativeAd Tests |
| 2032 | + |
| 2033 | +TEST_F(FirebaseGmaTest, TestNativeAdLoadEmptyRequest) { |
| 2034 | + SKIP_TEST_ON_DESKTOP; |
| 2035 | + SKIP_TEST_ON_SIMULATOR; |
| 2036 | + |
| 2037 | + firebase::gma::NativeAd* native_ad = new firebase::gma::NativeAd(); |
| 2038 | + |
| 2039 | + WaitForCompletion(native_ad->Initialize(app_framework::GetWindowContext()), |
| 2040 | + "Initialize"); |
| 2041 | + |
| 2042 | + // When the NativeAd is initialized, load an ad. |
| 2043 | + firebase::gma::AdRequest request; |
| 2044 | + |
| 2045 | + firebase::Future<firebase::gma::AdResult> load_ad_future = |
| 2046 | + native_ad->LoadAd(kNativeAdUnit, request); |
| 2047 | + |
| 2048 | + WaitForCompletion(load_ad_future, "LoadAd"); |
| 2049 | + const firebase::gma::AdResult* result_ptr = load_ad_future.result(); |
| 2050 | + ASSERT_NE(result_ptr, nullptr); |
| 2051 | + EXPECT_TRUE(result_ptr->is_successful()); |
| 2052 | + EXPECT_FALSE(result_ptr->response_info().adapter_responses().empty()); |
| 2053 | + EXPECT_FALSE( |
| 2054 | + result_ptr->response_info().mediation_adapter_class_name().empty()); |
| 2055 | + EXPECT_FALSE(result_ptr->response_info().response_id().empty()); |
| 2056 | + EXPECT_FALSE(result_ptr->response_info().ToString().empty()); |
| 2057 | + |
| 2058 | + delete native_ad; |
| 2059 | +} |
| 2060 | + |
| 2061 | +TEST_F(FirebaseGmaTest, TestNativeAdErrorNotInitialized) { |
| 2062 | + SKIP_TEST_ON_DESKTOP; |
| 2063 | + |
| 2064 | + firebase::gma::NativeAd* native_ad = new firebase::gma::NativeAd(); |
| 2065 | + |
| 2066 | + firebase::gma::AdRequest request = GetAdRequest(); |
| 2067 | + WaitForCompletion(native_ad->LoadAd(kNativeAdUnit, request), "LoadAd", |
| 2068 | + firebase::gma::kAdErrorCodeUninitialized); |
| 2069 | + |
| 2070 | + delete native_ad; |
| 2071 | +} |
| 2072 | + |
| 2073 | +TEST_F(FirebaseGmaTest, TestNativeAdErrorAlreadyInitialized) { |
| 2074 | + SKIP_TEST_ON_DESKTOP; |
| 2075 | + |
| 2076 | + { |
| 2077 | + firebase::gma::NativeAd* native_ad = new firebase::gma::NativeAd(); |
| 2078 | + firebase::Future<void> first_initialize = |
| 2079 | + native_ad->Initialize(app_framework::GetWindowContext()); |
| 2080 | + firebase::Future<void> second_initialize = |
| 2081 | + native_ad->Initialize(app_framework::GetWindowContext()); |
| 2082 | + |
| 2083 | + WaitForCompletion(first_initialize, "First Initialize 1"); |
| 2084 | + WaitForCompletion(second_initialize, "Second Initialize 1", |
| 2085 | + firebase::gma::kAdErrorCodeAlreadyInitialized); |
| 2086 | + |
| 2087 | + first_initialize.Release(); |
| 2088 | + second_initialize.Release(); |
| 2089 | + |
| 2090 | + delete native_ad; |
| 2091 | + } |
| 2092 | + |
| 2093 | + // Reverse the order of the completion waits. |
| 2094 | + { |
| 2095 | + firebase::gma::NativeAd* native_ad = new firebase::gma::NativeAd(); |
| 2096 | + firebase::Future<void> first_initialize = |
| 2097 | + native_ad->Initialize(app_framework::GetWindowContext()); |
| 2098 | + firebase::Future<void> second_initialize = |
| 2099 | + native_ad->Initialize(app_framework::GetWindowContext()); |
| 2100 | + |
| 2101 | + WaitForCompletion(second_initialize, "Second Initialize 1", |
| 2102 | + firebase::gma::kAdErrorCodeAlreadyInitialized); |
| 2103 | + WaitForCompletion(first_initialize, "First Initialize 1"); |
| 2104 | + |
| 2105 | + first_initialize.Release(); |
| 2106 | + second_initialize.Release(); |
| 2107 | + |
| 2108 | + delete native_ad; |
| 2109 | + } |
| 2110 | +} |
| 2111 | + |
| 2112 | +TEST_F(FirebaseGmaTest, TestNativeAdErrorBadAdUnitId) { |
| 2113 | + SKIP_TEST_ON_DESKTOP; |
| 2114 | + |
| 2115 | + firebase::gma::NativeAd* native_ad = new firebase::gma::NativeAd(); |
| 2116 | + WaitForCompletion(native_ad->Initialize(app_framework::GetWindowContext()), |
| 2117 | + "Initialize"); |
| 2118 | + |
| 2119 | + // Load the native ad. |
| 2120 | + firebase::gma::AdRequest request = GetAdRequest(); |
| 2121 | + firebase::Future<firebase::gma::AdResult> load_ad = |
| 2122 | + native_ad->LoadAd(kBadAdUnit, request); |
| 2123 | + WaitForCompletion(load_ad, "LoadAd", |
| 2124 | + firebase::gma::kAdErrorCodeInvalidRequest); |
| 2125 | + |
| 2126 | + const firebase::gma::AdResult* result_ptr = load_ad.result(); |
| 2127 | + ASSERT_NE(result_ptr, nullptr); |
| 2128 | + EXPECT_FALSE(result_ptr->is_successful()); |
| 2129 | + EXPECT_EQ(result_ptr->ad_error().code(), |
| 2130 | + firebase::gma::kAdErrorCodeInvalidRequest); |
| 2131 | + EXPECT_FALSE(result_ptr->ad_error().message().empty()); |
| 2132 | + EXPECT_EQ(result_ptr->ad_error().domain(), kErrorDomain); |
| 2133 | + const firebase::gma::ResponseInfo response_info = |
| 2134 | + result_ptr->ad_error().response_info(); |
| 2135 | + EXPECT_TRUE(response_info.adapter_responses().empty()); |
| 2136 | + delete native_ad; |
| 2137 | +} |
| 2138 | + |
| 2139 | +TEST_F(FirebaseGmaTest, TestNativeAdErrorBadExtrasClassName) { |
| 2140 | + SKIP_TEST_ON_DESKTOP; |
| 2141 | + |
| 2142 | + firebase::gma::NativeAd* native_ad = new firebase::gma::NativeAd(); |
| 2143 | + WaitForCompletion(native_ad->Initialize(app_framework::GetWindowContext()), |
| 2144 | + "Initialize"); |
| 2145 | + |
| 2146 | + // Load the native ad. |
| 2147 | + firebase::gma::AdRequest request = GetAdRequest(); |
| 2148 | + request.add_extra(kAdNetworkExtrasInvalidClassName, "shouldnot", "work"); |
| 2149 | + WaitForCompletion(native_ad->LoadAd(kNativeAdUnit, request), "LoadAd", |
| 2150 | + firebase::gma::kAdErrorCodeAdNetworkClassLoadError); |
| 2151 | + delete native_ad; |
| 2152 | +} |
| 2153 | + |
1982 | 2154 | // Stress tests. These take a while so run them near the end.
|
1983 | 2155 | TEST_F(FirebaseGmaTest, TestAdViewStress) {
|
1984 | 2156 | SKIP_TEST_ON_DESKTOP;
|
|
0 commit comments