Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2405)

Unified Diff: content/browser/loader/resource_loader_unittest.cc

Issue 2654893002: Add unit tests for RedirectToFileResourceHandler. (Closed)
Patch Set: Revise Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/loader/resource_loader_unittest.cc
diff --git a/content/browser/loader/resource_loader_unittest.cc b/content/browser/loader/resource_loader_unittest.cc
index 96bbb27482d735ad39251f65a92b00e87151e9f1..9f3d17f64807ae8908c023fbb586e3cf584dfe73 100644
--- a/content/browser/loader/resource_loader_unittest.cc
+++ b/content/browser/loader/resource_loader_unittest.cc
@@ -12,8 +12,6 @@
#include <utility>
#include <vector>
-#include "base/files/file.h"
-#include "base/files/file_util.h"
#include "base/location.h"
#include "base/macros.h"
#include "base/memory/ptr_util.h"
@@ -22,7 +20,6 @@
#include "base/single_thread_task_runner.h"
#include "base/threading/thread_task_runner_handle.h"
#include "content/browser/browser_thread_impl.h"
-#include "content/browser/loader/redirect_to_file_resource_handler.h"
#include "content/browser/loader/resource_loader_delegate.h"
#include "content/browser/loader/test_resource_handler.h"
#include "content/public/browser/client_certificate_delegate.h"
@@ -39,7 +36,6 @@
#include "ipc/ipc_message.h"
#include "net/base/chunked_upload_data_stream.h"
#include "net/base/io_buffer.h"
-#include "net/base/mock_file_stream.h"
#include "net/base/net_errors.h"
#include "net/base/request_priority.h"
#include "net/base/upload_bytes_element_reader.h"
@@ -60,11 +56,8 @@
#include "net/url_request/url_request_job_factory_impl.h"
#include "net/url_request/url_request_test_job.h"
#include "net/url_request/url_request_test_util.h"
-#include "storage/browser/blob/shareable_file_reference.h"
#include "testing/gtest/include/gtest/gtest.h"
-using storage::ShareableFileReference;
-
namespace content {
namespace {
@@ -349,16 +342,6 @@ class NonChunkedUploadDataStream : public net::UploadDataStream {
DISALLOW_COPY_AND_ASSIGN(NonChunkedUploadDataStream);
};
-// Fails to create a temporary file with the given error.
-void CreateTemporaryError(
- base::File::Error error,
- const CreateTemporaryFileStreamCallback& callback) {
- base::ThreadTaskRunnerHandle::Get()->PostTask(
- FROM_HERE,
- base::Bind(callback, error,
- base::Passed(std::unique_ptr<net::FileStream>()), nullptr));
-}
-
} // namespace
class ResourceLoaderTest : public testing::Test,
@@ -1441,232 +1424,6 @@ TEST_F(ResourceLoaderTest, ResumeCanceledRequest) {
static_cast<ResourceController*>(loader_.get())->Resume();
}
-class ResourceLoaderRedirectToFileTest : public ResourceLoaderTest {
- public:
- ResourceLoaderRedirectToFileTest()
- : file_stream_(NULL),
- redirect_to_file_resource_handler_(NULL) {
- }
-
- ~ResourceLoaderRedirectToFileTest() override {
- // Releasing the loader should result in destroying the file asynchronously.
- file_stream_ = nullptr;
- deletable_file_ = nullptr;
- loader_.reset();
-
- // Wait for the task to delete the file to run, and make sure the file is
- // cleaned up.
- base::RunLoop().RunUntilIdle();
- EXPECT_FALSE(base::PathExists(temp_path()));
- }
-
- base::FilePath temp_path() const { return temp_path_; }
- ShareableFileReference* deletable_file() const {
- return deletable_file_.get();
- }
- net::testing::MockFileStream* file_stream() const { return file_stream_; }
- RedirectToFileResourceHandler* redirect_to_file_resource_handler() const {
- return redirect_to_file_resource_handler_;
- }
-
- std::unique_ptr<ResourceHandler> WrapResourceHandler(
- std::unique_ptr<TestResourceHandler> leaf_handler,
- net::URLRequest* request) override {
- leaf_handler->set_expect_on_data_downloaded(true);
-
- // Make a temporary file.
- CHECK(base::CreateTemporaryFile(&temp_path_));
- int flags = base::File::FLAG_WRITE | base::File::FLAG_TEMPORARY |
- base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_ASYNC;
- base::File file(temp_path_, flags);
- CHECK(file.IsValid());
-
- // Create mock file streams and a ShareableFileReference.
- std::unique_ptr<net::testing::MockFileStream> file_stream(
- new net::testing::MockFileStream(std::move(file),
- base::ThreadTaskRunnerHandle::Get()));
- file_stream_ = file_stream.get();
- deletable_file_ = ShareableFileReference::GetOrCreate(
- temp_path_, ShareableFileReference::DELETE_ON_FINAL_RELEASE,
- BrowserThread::GetTaskRunnerForThread(BrowserThread::FILE).get());
-
- // Inject them into the handler.
- std::unique_ptr<RedirectToFileResourceHandler> handler(
- new RedirectToFileResourceHandler(std::move(leaf_handler), request));
- redirect_to_file_resource_handler_ = handler.get();
- handler->SetCreateTemporaryFileStreamFunctionForTesting(
- base::Bind(&ResourceLoaderRedirectToFileTest::PostCallback,
- base::Unretained(this),
- base::Passed(&file_stream)));
- return std::move(handler);
- }
-
- private:
- void PostCallback(std::unique_ptr<net::FileStream> file_stream,
- const CreateTemporaryFileStreamCallback& callback) {
- base::ThreadTaskRunnerHandle::Get()->PostTask(
- FROM_HERE,
- base::Bind(callback, base::File::FILE_OK, base::Passed(&file_stream),
- base::RetainedRef(deletable_file_)));
- }
-
- base::FilePath temp_path_;
- scoped_refptr<ShareableFileReference> deletable_file_;
- // These are owned by the ResourceLoader.
- net::testing::MockFileStream* file_stream_;
- RedirectToFileResourceHandler* redirect_to_file_resource_handler_;
-};
-
-// Tests that a RedirectToFileResourceHandler works and forwards everything
-// downstream.
-TEST_F(ResourceLoaderRedirectToFileTest, Basic) {
- // Run it to completion.
- loader_->StartRequest();
- raw_ptr_resource_handler_->WaitUntilResponseComplete();
-
- // Check that the handler forwarded all information to the downstream handler.
- EXPECT_EQ(
- temp_path(),
- raw_ptr_resource_handler_->resource_response()->head.download_file_path);
- EXPECT_EQ(test_redirect_url(), raw_ptr_resource_handler_->start_url());
- EXPECT_EQ(net::URLRequestStatus::SUCCESS,
- raw_ptr_resource_handler_->final_status().status());
- EXPECT_EQ(test_data().size(), static_cast<size_t>(
- raw_ptr_resource_handler_->total_bytes_downloaded()));
-
- // Check that the data was written to the file.
- std::string contents;
- ASSERT_TRUE(base::ReadFileToString(temp_path(), &contents));
- EXPECT_EQ(test_data(), contents);
-}
-
-// Tests that RedirectToFileResourceHandler handles errors in creating the
-// temporary file.
-TEST_F(ResourceLoaderRedirectToFileTest, CreateTemporaryError) {
- // Swap out the create temporary function.
- redirect_to_file_resource_handler()->
- SetCreateTemporaryFileStreamFunctionForTesting(
- base::Bind(&CreateTemporaryError, base::File::FILE_ERROR_FAILED));
-
- // Run it to completion.
- loader_->StartRequest();
- raw_ptr_resource_handler_->WaitUntilResponseComplete();
-
- // To downstream, the request was canceled.
- EXPECT_EQ(net::URLRequestStatus::CANCELED,
- raw_ptr_resource_handler_->final_status().status());
- EXPECT_EQ(0, raw_ptr_resource_handler_->total_bytes_downloaded());
-}
-
-// Tests that RedirectToFileResourceHandler handles synchronous write errors.
-TEST_F(ResourceLoaderRedirectToFileTest, WriteError) {
- file_stream()->set_forced_error(net::ERR_FAILED);
-
- // Run it to completion.
- loader_->StartRequest();
- raw_ptr_resource_handler_->WaitUntilResponseComplete();
-
- // To downstream, the request was canceled sometime after it started, but
- // before any data was written.
- EXPECT_EQ(
- temp_path(),
- raw_ptr_resource_handler_->resource_response()->head.download_file_path);
- EXPECT_EQ(test_redirect_url(), raw_ptr_resource_handler_->start_url());
- EXPECT_EQ(net::URLRequestStatus::CANCELED,
- raw_ptr_resource_handler_->final_status().status());
- EXPECT_EQ(0, raw_ptr_resource_handler_->total_bytes_downloaded());
-}
-
-// Tests that RedirectToFileResourceHandler handles asynchronous write errors.
-TEST_F(ResourceLoaderRedirectToFileTest, WriteErrorAsync) {
- file_stream()->set_forced_error_async(net::ERR_FAILED);
-
- // Run it to completion.
- loader_->StartRequest();
- raw_ptr_resource_handler_->WaitUntilResponseComplete();
-
- // To downstream, the request was canceled sometime after it started, but
- // before any data was written.
- EXPECT_EQ(
- temp_path(),
- raw_ptr_resource_handler_->resource_response()->head.download_file_path);
- EXPECT_EQ(test_redirect_url(), raw_ptr_resource_handler_->start_url());
- EXPECT_EQ(net::URLRequestStatus::CANCELED,
- raw_ptr_resource_handler_->final_status().status());
- EXPECT_EQ(0, raw_ptr_resource_handler_->total_bytes_downloaded());
-}
-
-// Tests that RedirectToFileHandler defers completion if there are outstanding
-// writes and accounts for errors which occur in that time.
-TEST_F(ResourceLoaderRedirectToFileTest, DeferCompletion) {
- // Program the MockFileStream to error asynchronously, but throttle the
- // callback.
- file_stream()->set_forced_error_async(net::ERR_FAILED);
- file_stream()->ThrottleCallbacks();
-
- // Run it as far as it will go.
- loader_->StartRequest();
- base::RunLoop().RunUntilIdle();
-
- // At this point, the request should have completed.
- EXPECT_EQ(net::URLRequestStatus::SUCCESS,
- raw_ptr_to_request_->status().status());
-
- // However, the resource loader stack is stuck somewhere after receiving the
- // response.
- EXPECT_EQ(
- temp_path(),
- raw_ptr_resource_handler_->resource_response()->head.download_file_path);
- EXPECT_EQ(test_redirect_url(), raw_ptr_resource_handler_->start_url());
- EXPECT_EQ(0, raw_ptr_resource_handler_->on_response_completed_called());
- EXPECT_EQ(0, raw_ptr_resource_handler_->total_bytes_downloaded());
-
- // Now, release the floodgates.
- file_stream()->ReleaseCallbacks();
- raw_ptr_resource_handler_->WaitUntilResponseComplete();
-
- // Although the URLRequest was successful, the leaf handler sees a failure
- // because the write never completed.
- EXPECT_EQ(net::URLRequestStatus::CANCELED,
- raw_ptr_resource_handler_->final_status().status());
-}
-
-// Tests that a RedirectToFileResourceHandler behaves properly when the
-// downstream handler defers OnWillStart.
-TEST_F(ResourceLoaderRedirectToFileTest, DownstreamDeferStart) {
- // Defer OnWillStart.
- raw_ptr_resource_handler_->set_defer_on_will_start(true);
-
- // Run as far as we'll go.
- loader_->StartRequest();
- raw_ptr_resource_handler_->WaitUntilDeferred();
-
- // The request should have stopped at OnWillStart.
- EXPECT_EQ(test_redirect_url(), raw_ptr_resource_handler_->start_url());
- EXPECT_FALSE(raw_ptr_resource_handler_->resource_response());
- EXPECT_EQ(0, raw_ptr_resource_handler_->on_response_completed_called());
- EXPECT_EQ(0, raw_ptr_resource_handler_->total_bytes_downloaded());
-
- // Now resume the request. Now we complete.
- raw_ptr_resource_handler_->Resume();
- raw_ptr_resource_handler_->WaitUntilResponseComplete();
-
- // Check that the handler forwarded all information to the downstream handler.
- EXPECT_EQ(
- temp_path(),
- raw_ptr_resource_handler_->resource_response()->head.download_file_path);
- EXPECT_EQ(test_redirect_url(), raw_ptr_resource_handler_->start_url());
- EXPECT_EQ(net::URLRequestStatus::SUCCESS,
- raw_ptr_resource_handler_->final_status().status());
- EXPECT_EQ(test_data().size(), static_cast<size_t>(
- raw_ptr_resource_handler_->total_bytes_downloaded()));
-
- // Check that the data was written to the file.
- std::string contents;
- ASSERT_TRUE(base::ReadFileToString(temp_path(), &contents));
- EXPECT_EQ(test_data(), contents);
-}
-
class EffectiveConnectionTypeResourceLoaderTest : public ResourceLoaderTest {
public:
void VerifyEffectiveConnectionType(
« no previous file with comments | « content/browser/loader/redirect_to_file_resource_handler_unittest.cc ('k') | content/browser/loader/test_resource_handler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698