Skip to content

Commit a55ce4d

Browse files
Fix gma flaky tests caused by nofill error (#1363)
* Fix gma flaky tests caused by nofill error * Add LogWarning messages when loadAd returns NoFill.
1 parent cd6c183 commit a55ce4d

File tree

1 file changed

+105
-67
lines changed

1 file changed

+105
-67
lines changed

gma/integration_test/src/integration_test.cc

Lines changed: 105 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ static const std::vector<std::string> kNeighboringContentURLs = {
135135
"test_url1", "test_url2", "test_url3"};
136136

137137
using app_framework::LogDebug;
138+
using app_framework::LogWarning;
138139
using app_framework::ProcessEvents;
139140

140141
using 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

Comments
 (0)