Mac: Fix flaky ResourceRequestHandlerTest failures

The AbortAfterCreated and AbortBeforeBrowse tests were flaking due to a race
between request handling and browser close. The tests would fail if the request
handling completed first.
This commit is contained in:
Marshall Greenblatt 2021-06-09 17:11:30 -04:00
parent 3c0a4410ad
commit 5a622c22b5

View File

@ -801,7 +801,7 @@ class BasicResponseTest : public TestHandler {
VerifyState(kOnResourceLoadComplete, request, response); VerifyState(kOnResourceLoadComplete, request, response);
if (unhandled_ || IsIncomplete() || IsAborted()) { if (unhandled_ || IsIncomplete() || (IsAborted() && status == UR_FAILED)) {
EXPECT_EQ(UR_FAILED, status); EXPECT_EQ(UR_FAILED, status);
EXPECT_EQ(0, received_content_length); EXPECT_EQ(0, received_content_length);
} else { } else {
@ -945,43 +945,40 @@ class BasicResponseTest : public TestHandler {
} }
} else if (IsAborted()) { } else if (IsAborted()) {
EXPECT_EQ(1, on_before_browse_ct_); EXPECT_EQ(1, on_before_browse_ct_);
if (custom_scheme_) { // The callbacks executed may vary based on timing.
EXPECT_EQ(0, get_resource_request_handler_ct_); EXPECT_NEAR(0, get_resource_request_handler_ct_, 1);
EXPECT_EQ(0, get_cookie_access_filter_ct_); EXPECT_NEAR(0, get_cookie_access_filter_ct_, 1);
} else { EXPECT_NEAR(0, on_before_resource_load_ct_, 1);
// The callbacks executed for standard schemes may vary based on timing. EXPECT_NEAR(0, get_resource_handler_ct_, 1);
} EXPECT_NEAR(0, get_resource_response_filter_ct_, 1);
EXPECT_EQ(0, on_before_resource_load_ct_); EXPECT_NEAR(0, on_resource_response_ct_, 1);
EXPECT_EQ(0, get_resource_handler_ct_);
EXPECT_EQ(0, on_resource_redirect_ct_); EXPECT_EQ(0, on_resource_redirect_ct_);
EXPECT_EQ(0, get_resource_response_filter_ct_);
EXPECT_EQ(0, on_resource_response_ct_);
} else { } else {
NOTREACHED(); NOTREACHED();
} }
EXPECT_EQ(resource_handler_created_ct_, resource_handler_destroyed_ct_);
if (IsAborted()) { if (IsAborted()) {
if (IsChromeRuntimeEnabled()) { // The callbacks executed may vary based on timing.
// Using the Chrome runtime OnResourceLoadComplete may be called with EXPECT_NEAR(0, on_load_end_ct_, 1);
// UR_FAILED. EXPECT_NEAR(resource_handler_created_ct_, resource_handler_destroyed_ct_,
EXPECT_NEAR(0, on_resource_load_complete_ct_, 1); 1);
} else { EXPECT_NEAR(0, on_resource_load_complete_ct_, 1);
EXPECT_EQ(0, on_resource_load_complete_ct_);
}
} else { } else {
EXPECT_EQ(resource_handler_created_ct_, resource_handler_destroyed_ct_);
EXPECT_EQ(1, on_resource_load_complete_ct_); EXPECT_EQ(1, on_resource_load_complete_ct_);
} }
if (IsIncomplete() || IsAborted()) { if (IsIncomplete()) {
EXPECT_EQ(0, on_load_end_ct_); EXPECT_EQ(0, on_load_end_ct_);
} else { } else if (!IsAborted()) {
EXPECT_EQ(1, on_load_end_ct_); EXPECT_EQ(1, on_load_end_ct_);
} }
if (custom_scheme_ && unhandled_ && !(IsIncomplete() || IsAborted())) { if (custom_scheme_ && unhandled_ && !(IsIncomplete() || IsAborted())) {
EXPECT_EQ(1, on_protocol_execution_ct_); EXPECT_EQ(1, on_protocol_execution_ct_);
} else if (IsAborted()) {
// The callbacks executed may vary based on timing.
EXPECT_NEAR(0, on_protocol_execution_ct_, 1);
} else { } else {
EXPECT_EQ(0, on_protocol_execution_ct_); EXPECT_EQ(0, on_protocol_execution_ct_);
} }
@ -1263,6 +1260,8 @@ class BasicResponseTest : public TestHandler {
void VerifyOKResponse(Callback callback, void VerifyOKResponse(Callback callback,
CefRefPtr<CefResponse> response) const { CefRefPtr<CefResponse> response) const {
const auto error_code = response->GetError();
// True for the first response in cases where we're redirecting/restarting // True for the first response in cases where we're redirecting/restarting
// from inside OnResourceResponse (e.g. the first response always succeeds). // from inside OnResourceResponse (e.g. the first response always succeeds).
const bool override_unhandled = unhandled_ && const bool override_unhandled = unhandled_ &&
@ -1275,14 +1274,12 @@ class BasicResponseTest : public TestHandler {
const bool incomplete_unhandled = const bool incomplete_unhandled =
(mode_ == INCOMPLETE_BEFORE_RESOURCE_LOAD || (mode_ == INCOMPLETE_BEFORE_RESOURCE_LOAD ||
mode_ == INCOMPLETE_REQUEST_HANDLER_OPEN || mode_ == INCOMPLETE_REQUEST_HANDLER_OPEN ||
(IsAborted() && !custom_scheme_)); (IsAborted() && !custom_scheme_ && error_code != ERR_NONE));
if ((unhandled_ && !override_unhandled) || incomplete_unhandled) { if ((unhandled_ && !override_unhandled) || incomplete_unhandled) {
if (incomplete_unhandled) { EXPECT_TRUE(ERR_ABORTED == error_code ||
EXPECT_EQ(ERR_ABORTED, response->GetError()) << callback; ERR_UNKNOWN_URL_SCHEME == error_code)
} else { << callback << error_code;
EXPECT_EQ(ERR_UNKNOWN_URL_SCHEME, response->GetError()) << callback;
}
EXPECT_EQ(0, response->GetStatus()) << callback; EXPECT_EQ(0, response->GetStatus()) << callback;
EXPECT_STREQ("", response->GetStatusText().ToString().c_str()) EXPECT_STREQ("", response->GetStatusText().ToString().c_str())
<< callback; << callback;
@ -1291,7 +1288,8 @@ class BasicResponseTest : public TestHandler {
EXPECT_STREQ("", response->GetCharset().ToString().c_str()) << callback; EXPECT_STREQ("", response->GetCharset().ToString().c_str()) << callback;
} else { } else {
if ((mode_ == INCOMPLETE_REQUEST_HANDLER_READ || IsAborted()) && if ((mode_ == INCOMPLETE_REQUEST_HANDLER_READ || IsAborted()) &&
callback == kOnResourceLoadComplete) { callback == kOnResourceLoadComplete &&
response->GetError() != ERR_NONE) {
// We got a response, but we also got aborted. // We got a response, but we also got aborted.
EXPECT_EQ(ERR_ABORTED, response->GetError()) << callback; EXPECT_EQ(ERR_ABORTED, response->GetError()) << callback;
} else { } else {