Index: content/browser/loader/test_resource_handler.cc |
diff --git a/content/browser/loader/test_resource_handler.cc b/content/browser/loader/test_resource_handler.cc |
index 0ee72ae6744d140e22a9c3cf27a251259851c5b5..f01092c517730ff7056c4c00b661fcdc75995231 100644 |
--- a/content/browser/loader/test_resource_handler.cc |
+++ b/content/browser/loader/test_resource_handler.cc |
@@ -5,14 +5,18 @@ |
#include "content/browser/loader/test_resource_handler.h" |
#include "base/logging.h" |
-#include "net/url_request/url_request_status.h" |
+#include "content/browser/loader/resource_controller.h" |
+#include "content/public/common/resource_response.h" |
#include "testing/gtest/include/gtest/gtest.h" |
namespace content { |
TestResourceHandler::TestResourceHandler(net::URLRequestStatus* request_status, |
std::string* body) |
- : ResourceHandler(nullptr), request_status_(request_status), body_(body) { |
+ : ResourceHandler(nullptr), |
+ request_status_ptr_(request_status), |
+ body_ptr_(body), |
+ deferred_run_loop_(new base::RunLoop()) { |
SetBufferSize(2048); |
} |
@@ -21,68 +25,122 @@ TestResourceHandler::TestResourceHandler() |
TestResourceHandler::~TestResourceHandler() {} |
-void TestResourceHandler::SetController(ResourceController* controller) {} |
+void TestResourceHandler::SetController(ResourceController* controller) { |
+ controller_ = controller; |
+} |
bool TestResourceHandler::OnRequestRedirected( |
const net::RedirectInfo& redirect_info, |
ResourceResponse* response, |
bool* defer) { |
- NOTREACHED() << "Redirects are not supported by the TestResourceHandler."; |
- return false; |
+ EXPECT_FALSE(canceled_); |
+ EXPECT_EQ(1, on_will_start_called_); |
+ EXPECT_EQ(0, on_response_started_called_); |
+ EXPECT_EQ(0, on_response_completed_called_); |
+ ++on_request_redirected_called_; |
+ |
+ if (!on_request_redirected_result_) { |
+ canceled_ = true; |
+ return false; |
+ } |
+ |
+ *defer = defer_on_request_redirected_; |
+ defer_on_request_redirected_ = false; |
+ if (*defer) |
+ deferred_run_loop_->Quit(); |
+ return true; |
} |
bool TestResourceHandler::OnResponseStarted(ResourceResponse* response, |
bool* defer) { |
+ EXPECT_FALSE(canceled_); |
EXPECT_EQ(1, on_will_start_called_); |
EXPECT_EQ(0, on_response_started_called_); |
EXPECT_EQ(0, on_response_completed_called_); |
++on_response_started_called_; |
- if (!on_response_started_result_) |
+ EXPECT_FALSE(resource_response_); |
+ resource_response_ = response; |
+ |
+ if (!on_response_started_result_) { |
+ canceled_ = true; |
return false; |
+ } |
+ |
*defer = defer_on_response_started_; |
defer_on_response_started_ = false; |
+ if (*defer) |
+ deferred_run_loop_->Quit(); |
return true; |
} |
bool TestResourceHandler::OnWillStart(const GURL& url, bool* defer) { |
+ EXPECT_FALSE(canceled_); |
EXPECT_EQ(0, on_response_started_called_); |
EXPECT_EQ(0, on_will_start_called_); |
EXPECT_EQ(0, on_response_completed_called_); |
++on_will_start_called_; |
- if (!on_will_start_result_) |
+ start_url_ = url; |
+ |
+ if (!on_will_start_result_) { |
+ canceled_ = true; |
return false; |
+ } |
*defer = defer_on_will_start_; |
+ if (*defer) |
+ deferred_run_loop_->Quit(); |
return true; |
} |
bool TestResourceHandler::OnWillRead(scoped_refptr<net::IOBuffer>* buf, |
int* buf_size, |
int min_size) { |
+ EXPECT_FALSE(canceled_); |
+ EXPECT_FALSE(expect_on_data_downloaded_); |
EXPECT_EQ(0, on_response_completed_called_); |
++on_will_read_called_; |
*buf = buffer_; |
*buf_size = buffer_size_; |
memset(buffer_->data(), '\0', buffer_size_); |
+ if (!on_will_read_result_) |
+ canceled_ = true; |
return on_will_read_result_; |
} |
bool TestResourceHandler::OnReadCompleted(int bytes_read, bool* defer) { |
+ EXPECT_FALSE(canceled_); |
+ EXPECT_FALSE(expect_on_data_downloaded_); |
EXPECT_EQ(1, on_will_start_called_); |
EXPECT_EQ(1, on_response_started_called_); |
EXPECT_EQ(0, on_response_completed_called_); |
+ EXPECT_EQ(0, on_read_eof_); |
+ |
++on_read_completed_called_; |
+ if (bytes_read == 0) |
+ ++on_read_eof_; |
EXPECT_LE(static_cast<size_t>(bytes_read), buffer_size_); |
- if (body_) |
- body_->append(buffer_->data(), bytes_read); |
- if (!on_read_completed_result_) |
+ if (body_ptr_) |
+ body_ptr_->append(buffer_->data(), bytes_read); |
+ body_.append(buffer_->data(), bytes_read); |
+ |
+ if (!on_read_completed_result_ || |
+ (!on_on_read_eof_result_ && bytes_read == 0)) { |
+ canceled_ = true; |
return false; |
+ } |
+ |
*defer = defer_on_read_completed_; |
defer_on_read_completed_ = false; |
+ if (bytes_read == 0 && defer_on_read_eof_) |
+ *defer = true; |
+ |
+ if (*defer) |
+ deferred_run_loop_->Quit(); |
+ |
return true; |
} |
@@ -90,16 +148,34 @@ void TestResourceHandler::OnResponseCompleted( |
const net::URLRequestStatus& status, |
bool* defer) { |
EXPECT_EQ(0, on_response_completed_called_); |
+ if (status.is_success() && !expect_on_data_downloaded_ && expect_eof_read_) |
+ EXPECT_EQ(1, on_read_eof_); |
+ |
++on_response_completed_called_; |
- if (request_status_) |
- *request_status_ = status; |
+ if (request_status_ptr_) |
+ *request_status_ptr_ = status; |
+ final_status_ = status; |
*defer = defer_on_response_completed_; |
defer_on_response_completed_ = false; |
+ |
+ if (*defer) |
+ deferred_run_loop_->Quit(); |
+ response_complete_run_loop_.Quit(); |
} |
void TestResourceHandler::OnDataDownloaded(int bytes_downloaded) { |
- NOTREACHED() << "Saving to file is not supported by the TestResourceHandler."; |
+ EXPECT_TRUE(expect_on_data_downloaded_); |
+ total_bytes_downloaded_ += bytes_downloaded; |
+} |
+ |
+void TestResourceHandler::Resume() { |
+ controller_->Resume(); |
+} |
+ |
+void TestResourceHandler::CancelWithError(net::Error net_error) { |
+ canceled_ = true; |
+ controller_->CancelWithError(net_error); |
} |
void TestResourceHandler::SetBufferSize(int buffer_size) { |
@@ -108,4 +184,13 @@ void TestResourceHandler::SetBufferSize(int buffer_size) { |
memset(buffer_->data(), '\0', buffer_size); |
} |
+void TestResourceHandler::WaitUntilDeferred() { |
+ deferred_run_loop_->Run(); |
+ deferred_run_loop_.reset(new base::RunLoop()); |
+} |
+ |
+void TestResourceHandler::WaitUntilResponseComplete() { |
+ response_complete_run_loop_.Run(); |
+} |
+ |
} // namespace content |