| Index: trunk/src/content/browser/loader/resource_loader_unittest.cc
|
| ===================================================================
|
| --- trunk/src/content/browser/loader/resource_loader_unittest.cc (revision 256703)
|
| +++ trunk/src/content/browser/loader/resource_loader_unittest.cc (working copy)
|
| @@ -4,34 +4,22 @@
|
|
|
| #include "content/browser/loader/resource_loader.h"
|
|
|
| -#include "base/file_util.h"
|
| -#include "base/files/file.h"
|
| -#include "base/message_loop/message_loop_proxy.h"
|
| -#include "base/platform_file.h"
|
| #include "base/run_loop.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/public/browser/resource_request_info.h"
|
| -#include "content/public/common/resource_response.h"
|
| #include "content/public/test/mock_resource_context.h"
|
| #include "content/public/test/test_browser_thread_bundle.h"
|
| #include "content/test/test_content_browser_client.h"
|
| #include "ipc/ipc_message.h"
|
| -#include "net/base/mock_file_stream.h"
|
| #include "net/base/request_priority.h"
|
| #include "net/cert/x509_certificate.h"
|
| #include "net/ssl/client_cert_store.h"
|
| #include "net/ssl/ssl_cert_request_info.h"
|
| #include "net/url_request/url_request.h"
|
| -#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 "testing/gtest/include/gtest/gtest.h"
|
| -#include "webkit/common/blob/shareable_file_reference.h"
|
|
|
| -using webkit_blob::ShareableFileReference;
|
| -
|
| namespace content {
|
| namespace {
|
|
|
| @@ -81,34 +69,16 @@
|
| // initialize ResourceLoader.
|
| class ResourceHandlerStub : public ResourceHandler {
|
| public:
|
| - explicit ResourceHandlerStub(net::URLRequest* request)
|
| - : ResourceHandler(request),
|
| - defer_request_on_will_start_(false),
|
| - received_response_completed_(false),
|
| - total_bytes_downloaded_(0) {
|
| - }
|
| + ResourceHandlerStub()
|
| + : ResourceHandler(NULL), defer_request_on_will_start_(false) {}
|
|
|
| void set_defer_request_on_will_start(bool defer_request_on_will_start) {
|
| defer_request_on_will_start_ = defer_request_on_will_start;
|
| }
|
|
|
| - const GURL& start_url() const { return start_url_; }
|
| - ResourceResponse* response() const { return response_.get(); }
|
| - bool received_response_completed() const {
|
| - return received_response_completed_;
|
| - }
|
| - const net::URLRequestStatus& status() const { return status_; }
|
| - int total_bytes_downloaded() const { return total_bytes_downloaded_; }
|
| -
|
| - void Resume() {
|
| - controller()->Resume();
|
| - }
|
| -
|
| - // ResourceHandler implementation:
|
| virtual bool OnUploadProgress(int request_id,
|
| uint64 position,
|
| uint64 size) OVERRIDE {
|
| - NOTREACHED();
|
| return true;
|
| }
|
|
|
| @@ -116,23 +86,18 @@
|
| const GURL& url,
|
| ResourceResponse* response,
|
| bool* defer) OVERRIDE {
|
| - NOTREACHED();
|
| return true;
|
| }
|
|
|
| virtual bool OnResponseStarted(int request_id,
|
| ResourceResponse* response,
|
| bool* defer) OVERRIDE {
|
| - EXPECT_FALSE(response_);
|
| - response_ = response;
|
| return true;
|
| }
|
|
|
| virtual bool OnWillStart(int request_id,
|
| const GURL& url,
|
| bool* defer) OVERRIDE {
|
| - EXPECT_TRUE(start_url_.is_empty());
|
| - start_url_ = url;
|
| *defer = defer_request_on_will_start_;
|
| return true;
|
| }
|
| @@ -147,40 +112,26 @@
|
| scoped_refptr<net::IOBuffer>* buf,
|
| int* buf_size,
|
| int min_size) OVERRIDE {
|
| - NOTREACHED();
|
| - return false;
|
| + return true;
|
| }
|
|
|
| virtual bool OnReadCompleted(int request_id,
|
| int bytes_read,
|
| bool* defer) OVERRIDE {
|
| - NOTREACHED();
|
| - return false;
|
| + return true;
|
| }
|
|
|
| virtual void OnResponseCompleted(int request_id,
|
| const net::URLRequestStatus& status,
|
| const std::string& security_info,
|
| bool* defer) OVERRIDE {
|
| - // TODO(davidben): This DCHECK currently fires everywhere. Fix the places in
|
| - // ResourceLoader where OnResponseCompleted is signaled twice.
|
| - // DCHECK(!received_response_completed_);
|
| - received_response_completed_ = true;
|
| - status_ = status;
|
| }
|
|
|
| virtual void OnDataDownloaded(int request_id,
|
| - int bytes_downloaded) OVERRIDE {
|
| - total_bytes_downloaded_ += bytes_downloaded;
|
| - }
|
| + int bytes_downloaded) OVERRIDE {}
|
|
|
| private:
|
| bool defer_request_on_will_start_;
|
| - GURL start_url_;
|
| - scoped_refptr<ResourceResponse> response_;
|
| - bool received_response_completed_;
|
| - net::URLRequestStatus status_;
|
| - int total_bytes_downloaded_;
|
| };
|
|
|
| // Test browser client that captures calls to SelectClientCertificates and
|
| @@ -229,16 +180,6 @@
|
| scoped_ptr<net::ClientCertStore> dummy_cert_store_;
|
| };
|
|
|
| -// Fails to create a temporary file with the given error.
|
| -void CreateTemporaryError(
|
| - base::File::Error error,
|
| - const CreateTemporaryFileStreamCallback& callback) {
|
| - base::MessageLoop::current()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback, error, base::Passed(scoped_ptr<net::FileStream>()),
|
| - scoped_refptr<ShareableFileReference>()));
|
| -}
|
| -
|
| } // namespace
|
|
|
| class ResourceLoaderTest : public testing::Test,
|
| @@ -246,34 +187,15 @@
|
| protected:
|
| ResourceLoaderTest()
|
| : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP),
|
| - resource_context_(&test_url_request_context_),
|
| - raw_ptr_resource_handler_(NULL),
|
| - raw_ptr_to_request_(NULL) {
|
| - job_factory_.SetProtocolHandler(
|
| - "test", net::URLRequestTestJob::CreateProtocolHandler());
|
| - test_url_request_context_.set_job_factory(&job_factory_);
|
| + resource_context_(&test_url_request_context_) {
|
| }
|
|
|
| - GURL test_url() const {
|
| - return net::URLRequestTestJob::test_url_1();
|
| - }
|
| -
|
| - std::string test_data() const {
|
| - return net::URLRequestTestJob::test_data_1();
|
| - }
|
| -
|
| - virtual scoped_ptr<ResourceHandler> WrapResourceHandler(
|
| - scoped_ptr<ResourceHandlerStub> leaf_handler,
|
| - net::URLRequest* request) {
|
| - return leaf_handler.PassAs<ResourceHandler>();
|
| - }
|
| -
|
| virtual void SetUp() OVERRIDE {
|
| const int kRenderProcessId = 1;
|
| const int kRenderViewId = 2;
|
|
|
| scoped_ptr<net::URLRequest> request(
|
| - new net::URLRequest(test_url(),
|
| + new net::URLRequest(GURL("dummy"),
|
| net::DEFAULT_PRIORITY,
|
| NULL,
|
| resource_context_.GetRequestContext()));
|
| @@ -285,13 +207,10 @@
|
| kRenderViewId,
|
| MSG_ROUTING_NONE,
|
| false);
|
| - scoped_ptr<ResourceHandlerStub> resource_handler(
|
| - new ResourceHandlerStub(request.get()));
|
| + scoped_ptr<ResourceHandlerStub> resource_handler(new ResourceHandlerStub());
|
| raw_ptr_resource_handler_ = resource_handler.get();
|
| loader_.reset(new ResourceLoader(
|
| - request.Pass(),
|
| - WrapResourceHandler(resource_handler.Pass(), raw_ptr_to_request_),
|
| - this));
|
| + request.Pass(), resource_handler.PassAs<ResourceHandler>(), this));
|
| }
|
|
|
| // ResourceLoaderDelegate:
|
| @@ -312,7 +231,6 @@
|
|
|
| content::TestBrowserThreadBundle thread_bundle_;
|
|
|
| - net::URLRequestJobFactoryImpl job_factory_;
|
| net::TestURLRequestContext test_url_request_context_;
|
| ResourceContextStub resource_context_;
|
|
|
| @@ -404,259 +322,4 @@
|
| static_cast<ResourceController*>(loader_.get())->Resume();
|
| }
|
|
|
| -class ResourceLoaderRedirectToFileTest : public ResourceLoaderTest {
|
| - public:
|
| - ResourceLoaderRedirectToFileTest()
|
| - : file_stream_(NULL),
|
| - redirect_to_file_resource_handler_(NULL) {
|
| - }
|
| -
|
| - 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_;
|
| - }
|
| -
|
| - void ReleaseLoader() {
|
| - file_stream_ = NULL;
|
| - deletable_file_ = NULL;
|
| - loader_.reset();
|
| - }
|
| -
|
| - virtual scoped_ptr<ResourceHandler> WrapResourceHandler(
|
| - scoped_ptr<ResourceHandlerStub> leaf_handler,
|
| - net::URLRequest* request) OVERRIDE {
|
| - // Make a temporary file.
|
| - CHECK(base::CreateTemporaryFile(&temp_path_));
|
| - base::PlatformFile platform_file =
|
| - base::CreatePlatformFile(temp_path_,
|
| - base::PLATFORM_FILE_WRITE |
|
| - base::PLATFORM_FILE_TEMPORARY |
|
| - base::PLATFORM_FILE_CREATE_ALWAYS |
|
| - base::PLATFORM_FILE_ASYNC,
|
| - NULL, NULL);
|
| - CHECK_NE(base::kInvalidPlatformFileValue, platform_file);
|
| -
|
| - // Create mock file streams and a ShareableFileReference.
|
| - scoped_ptr<net::testing::MockFileStream> file_stream(
|
| - new net::testing::MockFileStream(
|
| - platform_file,
|
| - base::PLATFORM_FILE_WRITE | base::PLATFORM_FILE_ASYNC,
|
| - NULL, base::MessageLoopProxy::current()));
|
| - file_stream_ = file_stream.get();
|
| - deletable_file_ = ShareableFileReference::GetOrCreate(
|
| - temp_path_,
|
| - ShareableFileReference::DELETE_ON_FINAL_RELEASE,
|
| - BrowserThread::GetMessageLoopProxyForThread(
|
| - BrowserThread::FILE).get());
|
| -
|
| - // Inject them into the handler.
|
| - scoped_ptr<RedirectToFileResourceHandler> handler(
|
| - new RedirectToFileResourceHandler(
|
| - leaf_handler.PassAs<ResourceHandler>(), request));
|
| - redirect_to_file_resource_handler_ = handler.get();
|
| - handler->SetCreateTemporaryFileStreamFunctionForTesting(
|
| - base::Bind(&ResourceLoaderRedirectToFileTest::PostCallback,
|
| - base::Unretained(this),
|
| - base::Passed(file_stream.PassAs<net::FileStream>())));
|
| - return handler.PassAs<ResourceHandler>();
|
| - }
|
| -
|
| - private:
|
| - void PostCallback(
|
| - scoped_ptr<net::FileStream> file_stream,
|
| - const CreateTemporaryFileStreamCallback& callback) {
|
| - base::MessageLoop::current()->PostTask(
|
| - FROM_HERE,
|
| - base::Bind(callback, base::File::FILE_OK,
|
| - base::Passed(&file_stream), 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();
|
| - base::RunLoop().RunUntilIdle();
|
| -
|
| - // Check that the handler forwarded all information to the downstream handler.
|
| - EXPECT_EQ(temp_path(),
|
| - raw_ptr_resource_handler_->response()->head.download_file_path);
|
| - EXPECT_EQ(test_url(), raw_ptr_resource_handler_->start_url());
|
| - EXPECT_TRUE(raw_ptr_resource_handler_->received_response_completed());
|
| - EXPECT_EQ(net::URLRequestStatus::SUCCESS,
|
| - raw_ptr_resource_handler_->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);
|
| -
|
| - // Release the loader and the saved reference to file. The file should be gone
|
| - // now.
|
| - ReleaseLoader();
|
| - base::RunLoop().RunUntilIdle();
|
| - EXPECT_FALSE(base::PathExists(temp_path()));
|
| -}
|
| -
|
| -// 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();
|
| - base::RunLoop().RunUntilIdle();
|
| -
|
| - // To downstream, the request was canceled.
|
| - EXPECT_TRUE(raw_ptr_resource_handler_->received_response_completed());
|
| - EXPECT_EQ(net::URLRequestStatus::CANCELED,
|
| - raw_ptr_resource_handler_->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();
|
| - base::RunLoop().RunUntilIdle();
|
| -
|
| - // To downstream, the request was canceled sometime after it started, but
|
| - // before any data was written.
|
| - EXPECT_EQ(temp_path(),
|
| - raw_ptr_resource_handler_->response()->head.download_file_path);
|
| - EXPECT_EQ(test_url(), raw_ptr_resource_handler_->start_url());
|
| - EXPECT_TRUE(raw_ptr_resource_handler_->received_response_completed());
|
| - EXPECT_EQ(net::URLRequestStatus::CANCELED,
|
| - raw_ptr_resource_handler_->status().status());
|
| - EXPECT_EQ(0, raw_ptr_resource_handler_->total_bytes_downloaded());
|
| -
|
| - // Release the loader. The file should be gone now.
|
| - ReleaseLoader();
|
| - base::RunLoop().RunUntilIdle();
|
| - EXPECT_FALSE(base::PathExists(temp_path()));
|
| -}
|
| -
|
| -// 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();
|
| - base::RunLoop().RunUntilIdle();
|
| -
|
| - // To downstream, the request was canceled sometime after it started, but
|
| - // before any data was written.
|
| - EXPECT_EQ(temp_path(),
|
| - raw_ptr_resource_handler_->response()->head.download_file_path);
|
| - EXPECT_EQ(test_url(), raw_ptr_resource_handler_->start_url());
|
| - EXPECT_TRUE(raw_ptr_resource_handler_->received_response_completed());
|
| - EXPECT_EQ(net::URLRequestStatus::CANCELED,
|
| - raw_ptr_resource_handler_->status().status());
|
| - EXPECT_EQ(0, raw_ptr_resource_handler_->total_bytes_downloaded());
|
| -
|
| - // Release the loader. The file should be gone now.
|
| - ReleaseLoader();
|
| - base::RunLoop().RunUntilIdle();
|
| - EXPECT_FALSE(base::PathExists(temp_path()));
|
| -}
|
| -
|
| -// 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_->response()->head.download_file_path);
|
| - EXPECT_EQ(test_url(), raw_ptr_resource_handler_->start_url());
|
| - EXPECT_FALSE(raw_ptr_resource_handler_->received_response_completed());
|
| - EXPECT_EQ(0, raw_ptr_resource_handler_->total_bytes_downloaded());
|
| -
|
| - // Now, release the floodgates.
|
| - file_stream()->ReleaseCallbacks();
|
| - base::RunLoop().RunUntilIdle();
|
| -
|
| - // Although the URLRequest was successful, the leaf handler sees a failure
|
| - // because the write never completed.
|
| - EXPECT_TRUE(raw_ptr_resource_handler_->received_response_completed());
|
| - EXPECT_EQ(net::URLRequestStatus::CANCELED,
|
| - raw_ptr_resource_handler_->status().status());
|
| -
|
| - // Release the loader. The file should be gone now.
|
| - ReleaseLoader();
|
| - base::RunLoop().RunUntilIdle();
|
| - EXPECT_FALSE(base::PathExists(temp_path()));
|
| -}
|
| -
|
| -// Tests that a RedirectToFileResourceHandler behaves properly when the
|
| -// downstream handler defers OnWillStart.
|
| -TEST_F(ResourceLoaderRedirectToFileTest, DownstreamDeferStart) {
|
| - // Defer OnWillStart.
|
| - raw_ptr_resource_handler_->set_defer_request_on_will_start(true);
|
| -
|
| - // Run as far as we'll go.
|
| - loader_->StartRequest();
|
| - base::RunLoop().RunUntilIdle();
|
| -
|
| - // The request should have stopped at OnWillStart.
|
| - EXPECT_EQ(test_url(), raw_ptr_resource_handler_->start_url());
|
| - EXPECT_FALSE(raw_ptr_resource_handler_->response());
|
| - EXPECT_FALSE(raw_ptr_resource_handler_->received_response_completed());
|
| - EXPECT_EQ(0, raw_ptr_resource_handler_->total_bytes_downloaded());
|
| -
|
| - // Now resume the request. Now we complete.
|
| - raw_ptr_resource_handler_->Resume();
|
| - base::RunLoop().RunUntilIdle();
|
| -
|
| - // Check that the handler forwarded all information to the downstream handler.
|
| - EXPECT_EQ(temp_path(),
|
| - raw_ptr_resource_handler_->response()->head.download_file_path);
|
| - EXPECT_EQ(test_url(), raw_ptr_resource_handler_->start_url());
|
| - EXPECT_TRUE(raw_ptr_resource_handler_->received_response_completed());
|
| - EXPECT_EQ(net::URLRequestStatus::SUCCESS,
|
| - raw_ptr_resource_handler_->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);
|
| -
|
| - // Release the loader. The file should be gone now.
|
| - ReleaseLoader();
|
| - base::RunLoop().RunUntilIdle();
|
| - EXPECT_FALSE(base::PathExists(temp_path()));
|
| -}
|
| -
|
| } // namespace content
|
|
|