diff options
Diffstat (limited to 'chromium/content/browser/fileapi/file_system_url_request_job_unittest.cc')
-rw-r--r-- | chromium/content/browser/fileapi/file_system_url_request_job_unittest.cc | 198 |
1 files changed, 147 insertions, 51 deletions
diff --git a/chromium/content/browser/fileapi/file_system_url_request_job_unittest.cc b/chromium/content/browser/fileapi/file_system_url_request_job_unittest.cc index 7edd26aa656..4f3d0abde39 100644 --- a/chromium/content/browser/fileapi/file_system_url_request_job_unittest.cc +++ b/chromium/content/browser/fileapi/file_system_url_request_job_unittest.cc @@ -11,15 +11,17 @@ #include "base/files/file_path.h" #include "base/files/scoped_temp_dir.h" #include "base/format_macros.h" +#include "base/memory/scoped_vector.h" #include "base/memory/weak_ptr.h" #include "base/message_loop/message_loop.h" #include "base/message_loop/message_loop_proxy.h" -#include "base/platform_file.h" #include "base/rand_util.h" #include "base/run_loop.h" #include "base/strings/string_piece.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" +#include "content/public/test/async_file_test_helper.h" +#include "content/public/test/test_file_system_backend.h" #include "content/public/test/test_file_system_context.h" #include "net/base/load_flags.h" #include "net/base/mime_util.h" @@ -32,12 +34,16 @@ #include "net/url_request/url_request_context.h" #include "net/url_request/url_request_test_util.h" #include "testing/gtest/include/gtest/gtest.h" -#include "webkit/browser/fileapi/async_file_test_helper.h" #include "webkit/browser/fileapi/external_mount_points.h" #include "webkit/browser/fileapi/file_system_context.h" #include "webkit/browser/fileapi/file_system_file_util.h" -namespace fileapi { +using content::AsyncFileTestHelper; +using fileapi::FileSystemContext; +using fileapi::FileSystemURL; +using fileapi::FileSystemURLRequestJob; + +namespace content { namespace { // We always use the TEMPORARY FileSystem in this test. @@ -48,6 +54,64 @@ void FillBuffer(char* buffer, size_t len) { base::RandBytes(buffer, len); } +const char kValidExternalMountPoint[] = "mnt_name"; + +// An auto mounter that will try to mount anything for |storage_domain| = +// "automount", but will only succeed for the mount point "mnt_name". +bool TestAutoMountForURLRequest( + const net::URLRequest* /*url_request*/, + const fileapi::FileSystemURL& filesystem_url, + const std::string& storage_domain, + const base::Callback<void(base::File::Error result)>& callback) { + if (storage_domain != "automount") + return false; + std::vector<base::FilePath::StringType> components; + filesystem_url.path().GetComponents(&components); + std::string mount_point = base::FilePath(components[0]).AsUTF8Unsafe(); + + if (mount_point == kValidExternalMountPoint) { + fileapi::ExternalMountPoints::GetSystemInstance()->RegisterFileSystem( + kValidExternalMountPoint, fileapi::kFileSystemTypeTest, + fileapi::FileSystemMountOption(), base::FilePath()); + callback.Run(base::File::FILE_OK); + } else { + callback.Run(base::File::FILE_ERROR_NOT_FOUND); + } + return true; +} + +class FileSystemURLRequestJobFactory : public net::URLRequestJobFactory { + public: + FileSystemURLRequestJobFactory(const std::string& storage_domain, + FileSystemContext* context) + : storage_domain_(storage_domain), file_system_context_(context) { + } + + virtual net::URLRequestJob* MaybeCreateJobWithProtocolHandler( + const std::string& scheme, + net::URLRequest* request, + net::NetworkDelegate* network_delegate) const OVERRIDE { + return new fileapi::FileSystemURLRequestJob( + request, network_delegate, storage_domain_, file_system_context_); + } + + virtual bool IsHandledProtocol(const std::string& scheme) const OVERRIDE { + return true; + } + + virtual bool IsHandledURL(const GURL& url) const OVERRIDE { + return true; + } + + virtual bool IsSafeRedirectTarget(const GURL& location) const OVERRIDE { + return false; + } + + private: + std::string storage_domain_; + FileSystemContext* file_system_context_; +}; + } // namespace class FileSystemURLRequestJobTest : public testing::Test { @@ -64,31 +128,41 @@ class FileSystemURLRequestJobTest : public testing::Test { CreateFileSystemContextForTesting(NULL, temp_dir_.path()); file_system_context_->OpenFileSystem( - GURL("http://remote/"), kFileSystemTypeTemporary, - OPEN_FILE_SYSTEM_CREATE_IF_NONEXISTENT, + GURL("http://remote/"), fileapi::kFileSystemTypeTemporary, + fileapi::OPEN_FILE_SYSTEM_CREATE_IF_NONEXISTENT, base::Bind(&FileSystemURLRequestJobTest::OnOpenFileSystem, weak_factory_.GetWeakPtr())); base::RunLoop().RunUntilIdle(); - - net::URLRequest::Deprecated::RegisterProtocolFactory( - "filesystem", &FileSystemURLRequestJobFactory); } virtual void TearDown() OVERRIDE { - net::URLRequest::Deprecated::RegisterProtocolFactory("filesystem", NULL); - ClearUnusedJob(); - if (pending_job_.get()) { - pending_job_->Kill(); - pending_job_ = NULL; - } // FileReader posts a task to close the file in destructor. base::RunLoop().RunUntilIdle(); } + void SetUpAutoMountContext() { + base::FilePath mnt_point = temp_dir_.path().AppendASCII("auto_mount_dir"); + ASSERT_TRUE(base::CreateDirectory(mnt_point)); + + ScopedVector<fileapi::FileSystemBackend> additional_providers; + additional_providers.push_back(new TestFileSystemBackend( + base::MessageLoopProxy::current().get(), mnt_point)); + + std::vector<fileapi::URLRequestAutoMountHandler> handlers; + handlers.push_back(base::Bind(&TestAutoMountForURLRequest)); + + file_system_context_ = CreateFileSystemContextWithAutoMountersForTesting( + NULL, additional_providers.Pass(), handlers, temp_dir_.path()); + + ASSERT_EQ(static_cast<int>(sizeof(kTestFileData)) - 1, + base::WriteFile(mnt_point.AppendASCII("foo"), kTestFileData, + sizeof(kTestFileData) - 1)); + } + void OnOpenFileSystem(const GURL& root_url, const std::string& name, - base::PlatformFileError result) { - ASSERT_EQ(base::PLATFORM_FILE_OK, result); + base::File::Error result) { + ASSERT_EQ(base::File::FILE_OK, result); } void TestRequestHelper(const GURL& url, @@ -99,14 +173,15 @@ class FileSystemURLRequestJobTest : public testing::Test { // Make delegate_ exit the MessageLoop when the request is done. delegate_->set_quit_on_complete(true); delegate_->set_quit_on_redirect(true); + + job_factory_.reset(new FileSystemURLRequestJobFactory( + url.GetOrigin().host(), file_system_context)); + empty_context_.set_job_factory(job_factory_.get()); + request_ = empty_context_.CreateRequest( - url, net::DEFAULT_PRIORITY, delegate_.get()); + url, net::DEFAULT_PRIORITY, delegate_.get(), NULL); if (headers) request_->SetExtraRequestHeaders(*headers); - ASSERT_TRUE(!job_); - job_ = new FileSystemURLRequestJob( - request_.get(), NULL, file_system_context); - pending_job_ = job_; request_->Start(); ASSERT_TRUE(request_->is_pending()); // verify that we're starting async @@ -135,9 +210,9 @@ class FileSystemURLRequestJobTest : public testing::Test { void CreateDirectory(const base::StringPiece& dir_name) { FileSystemURL url = file_system_context_->CreateCrackedFileSystemURL( GURL("http://remote"), - kFileSystemTypeTemporary, + fileapi::kFileSystemTypeTemporary, base::FilePath().AppendASCII(dir_name)); - ASSERT_EQ(base::PLATFORM_FILE_OK, AsyncFileTestHelper::CreateDirectory( + ASSERT_EQ(base::File::FILE_OK, AsyncFileTestHelper::CreateDirectory( file_system_context_, url)); } @@ -145,9 +220,9 @@ class FileSystemURLRequestJobTest : public testing::Test { const char* buf, int buf_size) { FileSystemURL url = file_system_context_->CreateCrackedFileSystemURL( GURL("http://remote"), - kFileSystemTypeTemporary, + fileapi::kFileSystemTypeTemporary, base::FilePath().AppendASCII(file_name)); - ASSERT_EQ(base::PLATFORM_FILE_OK, + ASSERT_EQ(base::File::FILE_OK, AsyncFileTestHelper::CreateFileWithData( file_system_context_, url, buf, buf_size)); } @@ -156,43 +231,21 @@ class FileSystemURLRequestJobTest : public testing::Test { return GURL(kFileSystemURLPrefix + path); } - static net::URLRequestJob* FileSystemURLRequestJobFactory( - net::URLRequest* request, - net::NetworkDelegate* network_delegate, - const std::string& scheme) { - DCHECK(job_); - net::URLRequestJob* temp = job_; - job_ = NULL; - return temp; - } - - static void ClearUnusedJob() { - if (job_) { - scoped_refptr<net::URLRequestJob> deleter = job_; - job_ = NULL; - } - } - // Put the message loop at the top, so that it's the last thing deleted. base::MessageLoopForIO message_loop_; base::ScopedTempDir temp_dir_; - scoped_refptr<FileSystemContext> file_system_context_; + scoped_refptr<fileapi::FileSystemContext> file_system_context_; base::WeakPtrFactory<FileSystemURLRequestJobTest> weak_factory_; net::URLRequestContext empty_context_; + scoped_ptr<FileSystemURLRequestJobFactory> job_factory_; // NOTE: order matters, request must die before delegate scoped_ptr<net::TestDelegate> delegate_; scoped_ptr<net::URLRequest> request_; - - scoped_refptr<net::URLRequestJob> pending_job_; - static net::URLRequestJob* job_; }; -// static -net::URLRequestJob* FileSystemURLRequestJobTest::job_ = NULL; - namespace { TEST_F(FileSystemURLRequestJobTest, FileTest) { @@ -255,7 +308,6 @@ TEST_F(FileSystemURLRequestJobTest, FileTestHalfSpecifiedRange) { EXPECT_TRUE(partial_buffer_string == delegate_->data_received()); } - TEST_F(FileSystemURLRequestJobTest, FileTestMultipleRangesNotSupported) { WriteFile("file1.dat", kTestFileData, arraysize(kTestFileData) - 1); net::HttpRequestHeaders headers; @@ -364,5 +416,49 @@ TEST_F(FileSystemURLRequestJobTest, Incognito) { EXPECT_EQ(200, request_->GetResponseCode()); } +TEST_F(FileSystemURLRequestJobTest, AutoMountFileTest) { + SetUpAutoMountContext(); + TestRequest(GURL("filesystem:http://automount/external/mnt_name/foo")); + + ASSERT_FALSE(request_->is_pending()); + EXPECT_EQ(1, delegate_->response_started_count()); + EXPECT_FALSE(delegate_->received_data_before_response()); + EXPECT_EQ(kTestFileData, delegate_->data_received()); + EXPECT_EQ(200, request_->GetResponseCode()); + std::string cache_control; + request_->GetResponseHeaderByName("cache-control", &cache_control); + EXPECT_EQ("no-cache", cache_control); + + ASSERT_TRUE( + fileapi::ExternalMountPoints::GetSystemInstance()->RevokeFileSystem( + kValidExternalMountPoint)); +} + +TEST_F(FileSystemURLRequestJobTest, AutoMountInvalidRoot) { + SetUpAutoMountContext(); + TestRequest(GURL("filesystem:http://automount/external/invalid/foo")); + + ASSERT_FALSE(request_->is_pending()); + EXPECT_TRUE(delegate_->request_failed()); + EXPECT_EQ(net::ERR_FILE_NOT_FOUND, request_->status().error()); + + ASSERT_FALSE( + fileapi::ExternalMountPoints::GetSystemInstance()->RevokeFileSystem( + "invalid")); +} + +TEST_F(FileSystemURLRequestJobTest, AutoMountNoHandler) { + SetUpAutoMountContext(); + TestRequest(GURL("filesystem:http://noauto/external/mnt_name/foo")); + + ASSERT_FALSE(request_->is_pending()); + EXPECT_TRUE(delegate_->request_failed()); + EXPECT_EQ(net::ERR_FILE_NOT_FOUND, request_->status().error()); + + ASSERT_FALSE( + fileapi::ExternalMountPoints::GetSystemInstance()->RevokeFileSystem( + kValidExternalMountPoint)); +} + } // namespace -} // namespace fileapi +} // namespace content |