@@ -135,6 +135,7 @@ static const std::vector<std::string> kNeighboringContentURLs = {
135135 " test_url1" , " test_url2" , " test_url3" };
136136
137137using app_framework::LogDebug;
138+ using app_framework::LogWarning;
138139using app_framework::ProcessEvents;
139140
140141using firebase_test_framework::FirebaseTest;
@@ -902,36 +903,46 @@ TEST_F(FirebaseGmaTest, TestNativeAdLoad) {
902903 firebase::Future<firebase::gma::AdResult> load_ad_future =
903904 native_ad->LoadAd (kNativeAdUnit , GetAdRequest ());
904905
905- WaitForCompletion (load_ad_future, " LoadAd" );
906- const firebase::gma::AdResult* result_ptr = load_ad_future.result ();
907- ASSERT_NE (result_ptr, nullptr );
908- EXPECT_TRUE (result_ptr->is_successful ());
909- EXPECT_FALSE (result_ptr->response_info ().adapter_responses ().empty ());
910- EXPECT_FALSE (
911- result_ptr->response_info ().mediation_adapter_class_name ().empty ());
912- EXPECT_FALSE (result_ptr->response_info ().response_id ().empty ());
913- EXPECT_FALSE (result_ptr->response_info ().ToString ().empty ());
906+ // Don't fail loadAd, if NoFill occurred.
907+ WaitForCompletionAnyResult (load_ad_future, " LoadAd (ignoring NoFill error)" );
908+ EXPECT_TRUE (load_ad_future.error () == firebase::gma::kAdErrorCodeNone ||
909+ load_ad_future.error () == firebase::gma::kAdErrorCodeNoFill );
910+
911+ if (load_ad_future.error () == firebase::gma::kAdErrorCodeNone ) {
912+ const firebase::gma::AdResult* result_ptr = load_ad_future.result ();
913+ ASSERT_NE (result_ptr, nullptr );
914+ EXPECT_TRUE (result_ptr->is_successful ());
915+ EXPECT_FALSE (result_ptr->response_info ().adapter_responses ().empty ());
916+ EXPECT_FALSE (
917+ result_ptr->response_info ().mediation_adapter_class_name ().empty ());
918+ EXPECT_FALSE (result_ptr->response_info ().response_id ().empty ());
919+ EXPECT_FALSE (result_ptr->response_info ().ToString ().empty ());
920+
921+ // Check image assets.
922+ EXPECT_FALSE (native_ad->icon ().image_uri ().empty ());
923+ EXPECT_GT (native_ad->icon ().scale (), 0 );
924+ EXPECT_FALSE (native_ad->images ().empty ());
925+
926+ // Native ads usually contain only one large image asset.
927+ // Check the validity of the first asset from the vector.
928+ EXPECT_FALSE (native_ad->images ().at (0 ).image_uri ().empty ());
929+ EXPECT_GT (native_ad->images ().at (0 ).scale (), 0 );
930+
931+ // When the NativeAd is loaded, try loading icon image asset.
932+ firebase::Future<firebase::gma::ImageResult> load_image_future =
933+ native_ad->icon ().LoadImage ();
934+ WaitForCompletion (load_image_future, " LoadImage" );
935+ const firebase::gma::ImageResult* img_result_ptr =
936+ load_image_future.result ();
937+ ASSERT_NE (img_result_ptr, nullptr );
938+ EXPECT_TRUE (img_result_ptr->is_successful ());
939+ EXPECT_GT (img_result_ptr->image ().size (), 0 );
940+
941+ load_image_future.Release ();
942+ } else if (load_ad_future.error () == firebase::gma::kAdErrorCodeNoFill ) {
943+ LogWarning (" LoadAd returned NoFill in TestNativeAdLoad" );
944+ }
914945
915- // Check image assets.
916- EXPECT_FALSE (native_ad->icon ().image_uri ().empty ());
917- EXPECT_GT (native_ad->icon ().scale (), 0 );
918- EXPECT_FALSE (native_ad->images ().empty ());
919-
920- // Native ads usually contain only one large image asset.
921- // Check the validity of the first asset from the vector.
922- EXPECT_FALSE (native_ad->images ().at (0 ).image_uri ().empty ());
923- EXPECT_GT (native_ad->images ().at (0 ).scale (), 0 );
924-
925- // When the NativeAd is loaded, try loading icon image asset.
926- firebase::Future<firebase::gma::ImageResult> load_image_future =
927- native_ad->icon ().LoadImage ();
928- WaitForCompletion (load_image_future, " LoadImage" );
929- const firebase::gma::ImageResult* img_result_ptr = load_image_future.result ();
930- ASSERT_NE (img_result_ptr, nullptr );
931- EXPECT_TRUE (img_result_ptr->is_successful ());
932- EXPECT_GT (img_result_ptr->image ().size (), 0 );
933-
934- load_image_future.Release ();
935946 load_ad_future.Release ();
936947 delete native_ad;
937948}
@@ -2062,16 +2073,25 @@ TEST_F(FirebaseGmaTest, TestNativeAdLoadEmptyRequest) {
20622073 firebase::Future<firebase::gma::AdResult> load_ad_future =
20632074 native_ad->LoadAd (kNativeAdUnit , request);
20642075
2065- WaitForCompletion (load_ad_future, " LoadAd" );
2066- const firebase::gma::AdResult* result_ptr = load_ad_future.result ();
2067- ASSERT_NE (result_ptr, nullptr );
2068- EXPECT_TRUE (result_ptr->is_successful ());
2069- EXPECT_FALSE (result_ptr->response_info ().adapter_responses ().empty ());
2070- EXPECT_FALSE (
2071- result_ptr->response_info ().mediation_adapter_class_name ().empty ());
2072- EXPECT_FALSE (result_ptr->response_info ().response_id ().empty ());
2073- EXPECT_FALSE (result_ptr->response_info ().ToString ().empty ());
2076+ // Don't fail loadAd, if NoFill occurred.
2077+ WaitForCompletionAnyResult (load_ad_future, " LoadAd (ignoring NoFill error)" );
2078+ EXPECT_TRUE (load_ad_future.error () == firebase::gma::kAdErrorCodeNone ||
2079+ load_ad_future.error () == firebase::gma::kAdErrorCodeNoFill );
20742080
2081+ if (load_ad_future.error () == firebase::gma::kAdErrorCodeNone ) {
2082+ const firebase::gma::AdResult* result_ptr = load_ad_future.result ();
2083+ ASSERT_NE (result_ptr, nullptr );
2084+ EXPECT_TRUE (result_ptr->is_successful ());
2085+ EXPECT_FALSE (result_ptr->response_info ().adapter_responses ().empty ());
2086+ EXPECT_FALSE (
2087+ result_ptr->response_info ().mediation_adapter_class_name ().empty ());
2088+ EXPECT_FALSE (result_ptr->response_info ().response_id ().empty ());
2089+ EXPECT_FALSE (result_ptr->response_info ().ToString ().empty ());
2090+ } else if (load_ad_future.error () == firebase::gma::kAdErrorCodeNoFill ) {
2091+ LogWarning (" LoadAd returned NoFill in TestNativeAdLoadEmptyRequest" );
2092+ }
2093+
2094+ load_ad_future.Release ();
20752095 delete native_ad;
20762096}
20772097
@@ -2088,32 +2108,41 @@ TEST_F(FirebaseGmaTest, TestNativeRecordImpression) {
20882108 firebase::Future<firebase::gma::AdResult> load_ad_future =
20892109 native_ad->LoadAd (kNativeAdUnit , GetAdRequest ());
20902110
2091- WaitForCompletion (load_ad_future, " LoadAd " );
2092- const firebase::gma::AdResult* result_ptr = load_ad_future. result ( );
2093- ASSERT_NE (result_ptr, nullptr );
2094- EXPECT_TRUE (result_ptr-> is_successful () );
2111+ // Don't fail loadAd, if NoFill occurred.
2112+ WaitForCompletionAnyResult (load_ad_future, " LoadAd (ignoring NoFill error) " );
2113+ EXPECT_TRUE (load_ad_future. error () == firebase::gma:: kAdErrorCodeNone ||
2114+ load_ad_future. error () == firebase::gma:: kAdErrorCodeNoFill );
20952115
2096- load_ad_future.Release ();
2116+ // Proceed verifying the RecordImpression, only when loadAd is successful.
2117+ if (load_ad_future.error () == firebase::gma::kAdErrorCodeNone ) {
2118+ const firebase::gma::AdResult* result_ptr = load_ad_future.result ();
2119+ ASSERT_NE (result_ptr, nullptr );
2120+ EXPECT_TRUE (result_ptr->is_successful ());
20972121
2098- firebase::Variant impression_payload = GetVariantMap ();
2122+ firebase::Variant impression_payload = GetVariantMap ();
20992123
21002124#if defined(ANDROID)
2101- // Android doesn't have a return type for this API.
2102- WaitForCompletion (native_ad->RecordImpression (impression_payload),
2103- " RecordImpression" );
2125+ // Android doesn't have a return type for this API.
2126+ WaitForCompletion (native_ad->RecordImpression (impression_payload),
2127+ " RecordImpression" );
21042128#else // iOS
2105- // Test Ad unit IDs are not allowlisted to record impression and the request
2106- // is expected to be rejected by the server. iOS returns the failure.
2107- WaitForCompletion (native_ad->RecordImpression (impression_payload),
2108- " RecordImpression" ,
2109- firebase::gma::kAdErrorCodeInvalidRequest );
2129+ // Test Ad unit IDs are not allowlisted to record impression and the request
2130+ // is expected to be rejected by the server. iOS returns the failure.
2131+ WaitForCompletion (native_ad->RecordImpression (impression_payload),
2132+ " RecordImpression" ,
2133+ firebase::gma::kAdErrorCodeInvalidRequest );
21102134#endif
21112135
2112- firebase::Variant str_variant = firebase::Variant::FromMutableString (" test" );
2113- WaitForCompletion (native_ad->RecordImpression (str_variant),
2114- " RecordImpression 2" ,
2115- firebase::gma::kAdErrorCodeInvalidArgument );
2136+ firebase::Variant str_variant =
2137+ firebase::Variant::FromMutableString (" test" );
2138+ WaitForCompletion (native_ad->RecordImpression (str_variant),
2139+ " RecordImpression 2" ,
2140+ firebase::gma::kAdErrorCodeInvalidArgument );
2141+ } else if (load_ad_future.error () == firebase::gma::kAdErrorCodeNoFill ) {
2142+ LogWarning (" LoadAd returned NoFill in TestNativeRecordImpression" );
2143+ }
21162144
2145+ load_ad_future.Release ();
21172146 delete native_ad;
21182147}
21192148
@@ -2130,22 +2159,31 @@ TEST_F(FirebaseGmaTest, TestNativePerformClick) {
21302159 firebase::Future<firebase::gma::AdResult> load_ad_future =
21312160 native_ad->LoadAd (kNativeAdUnit , GetAdRequest ());
21322161
2133- WaitForCompletion (load_ad_future, " LoadAd " );
2134- const firebase::gma::AdResult* result_ptr = load_ad_future. result ( );
2135- ASSERT_NE (result_ptr, nullptr );
2136- EXPECT_TRUE (result_ptr-> is_successful () );
2162+ // Don't fail loadAd, if NoFill occurred.
2163+ WaitForCompletionAnyResult (load_ad_future, " LoadAd (ignoring NoFill error) " );
2164+ EXPECT_TRUE (load_ad_future. error () == firebase::gma:: kAdErrorCodeNone ||
2165+ load_ad_future. error () == firebase::gma:: kAdErrorCodeNoFill );
21372166
2138- load_ad_future.Release ();
2167+ // Proceed verifying the PerformClick, only when loadAd is successful.
2168+ if (load_ad_future.error () == firebase::gma::kAdErrorCodeNone ) {
2169+ const firebase::gma::AdResult* result_ptr = load_ad_future.result ();
2170+ ASSERT_NE (result_ptr, nullptr );
2171+ EXPECT_TRUE (result_ptr->is_successful ());
21392172
2140- firebase::Variant click_payload = GetVariantMap ();
2173+ firebase::Variant click_payload = GetVariantMap ();
21412174
2142- // Android and iOS doesn't have a return type for this API.
2143- WaitForCompletion (native_ad->PerformClick (click_payload), " PerformClick" );
2175+ // Android and iOS doesn't have a return type for this API.
2176+ WaitForCompletion (native_ad->PerformClick (click_payload), " PerformClick" );
21442177
2145- firebase::Variant str_variant = firebase::Variant::FromMutableString (" test" );
2146- WaitForCompletion (native_ad->PerformClick (str_variant), " PerformClick 2" ,
2147- firebase::gma::kAdErrorCodeInvalidArgument );
2178+ firebase::Variant str_variant =
2179+ firebase::Variant::FromMutableString (" test" );
2180+ WaitForCompletion (native_ad->PerformClick (str_variant), " PerformClick 2" ,
2181+ firebase::gma::kAdErrorCodeInvalidArgument );
2182+ } else if (load_ad_future.error () == firebase::gma::kAdErrorCodeNoFill ) {
2183+ LogWarning (" LoadAd returned NoFill in TestNativePerformClick" );
2184+ }
21482185
2186+ load_ad_future.Release ();
21492187 delete native_ad;
21502188}
21512189
0 commit comments