| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <string> | 5 #include <string> |
| 6 #include <vector> | 6 #include <vector> |
| 7 | 7 |
| 8 #include "base/files/file.h" | 8 #include "base/files/file.h" |
| 9 #include "base/files/file_path.h" | 9 #include "base/files/file_path.h" |
| 10 #include "base/files/scoped_temp_dir.h" | 10 #include "base/files/scoped_temp_dir.h" |
| 11 #include "base/memory/scoped_ptr.h" | 11 #include "base/memory/scoped_ptr.h" |
| 12 #include "base/memory/weak_ptr.h" | 12 #include "base/memory/weak_ptr.h" |
| 13 #include "base/platform_file.h" | 13 #include "base/platform_file.h" |
| 14 #include "base/run_loop.h" |
| 15 #include "chrome/browser/chromeos/file_system_provider/fake_provided_file_system
.h" |
| 14 #include "chrome/browser/chromeos/file_system_provider/fileapi/provider_async_fi
le_util.h" | 16 #include "chrome/browser/chromeos/file_system_provider/fileapi/provider_async_fi
le_util.h" |
| 15 #include "chrome/browser/chromeos/file_system_provider/mount_path_util.h" | 17 #include "chrome/browser/chromeos/file_system_provider/service.h" |
| 18 #include "chrome/browser/chromeos/file_system_provider/service_factory.h" |
| 19 #include "chrome/test/base/testing_browser_process.h" |
| 16 #include "chrome/test/base/testing_profile.h" | 20 #include "chrome/test/base/testing_profile.h" |
| 21 #include "chrome/test/base/testing_profile_manager.h" |
| 17 #include "content/public/test/test_browser_thread_bundle.h" | 22 #include "content/public/test/test_browser_thread_bundle.h" |
| 18 #include "content/public/test/test_file_system_context.h" | 23 #include "content/public/test/test_file_system_context.h" |
| 24 #include "extensions/browser/extension_registry.h" |
| 19 #include "testing/gtest/include/gtest/gtest.h" | 25 #include "testing/gtest/include/gtest/gtest.h" |
| 20 #include "webkit/browser/fileapi/async_file_util.h" | 26 #include "webkit/browser/fileapi/async_file_util.h" |
| 21 #include "webkit/browser/fileapi/external_mount_points.h" | 27 #include "webkit/browser/fileapi/external_mount_points.h" |
| 22 #include "webkit/browser/fileapi/file_system_context.h" | 28 #include "webkit/browser/fileapi/file_system_context.h" |
| 23 #include "webkit/browser/fileapi/file_system_url.h" | 29 #include "webkit/browser/fileapi/file_system_url.h" |
| 24 #include "webkit/common/blob/shareable_file_reference.h" | 30 #include "webkit/common/blob/shareable_file_reference.h" |
| 25 | 31 |
| 26 namespace chromeos { | 32 namespace chromeos { |
| 27 namespace file_system_provider { | 33 namespace file_system_provider { |
| 28 namespace { | 34 namespace { |
| 29 | 35 |
| 30 const char kExtensionId[] = "mbflcebpggnecokmikipoihdbecnjfoj"; | 36 const char kExtensionId[] = "mbflcebpggnecokmikipoihdbecnjfoj"; |
| 31 const int kFileSystemId = 1; | |
| 32 | 37 |
| 33 // Logs callbacks invocations on the tested operations. | 38 // Logs callbacks invocations on the tested operations. |
| 34 // TODO(mtomasz): Store and verify more arguments, once the operations return | 39 // TODO(mtomasz): Store and verify more arguments, once the operations return |
| 35 // anything else than just an error. | 40 // anything else than just an error. |
| 36 class EventLogger { | 41 class EventLogger { |
| 37 public: | 42 public: |
| 38 EventLogger() : weak_ptr_factory_(this) {} | 43 EventLogger() : weak_ptr_factory_(this) {} |
| 39 virtual ~EventLogger() {} | 44 virtual ~EventLogger() {} |
| 40 | 45 |
| 41 void OnStatus(base::File::Error error) { | 46 void OnStatus(base::File::Error error) { |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 79 | 84 |
| 80 base::File::Error* error() { return error_.get(); } | 85 base::File::Error* error() { return error_.get(); } |
| 81 | 86 |
| 82 private: | 87 private: |
| 83 scoped_ptr<base::File::Error> error_; | 88 scoped_ptr<base::File::Error> error_; |
| 84 base::WeakPtrFactory<EventLogger> weak_ptr_factory_; | 89 base::WeakPtrFactory<EventLogger> weak_ptr_factory_; |
| 85 | 90 |
| 86 DISALLOW_COPY_AND_ASSIGN(EventLogger); | 91 DISALLOW_COPY_AND_ASSIGN(EventLogger); |
| 87 }; | 92 }; |
| 88 | 93 |
| 89 // Registers an external mount point, and removes it once the object gets out | |
| 90 // of scope. To ensure that creating the mount point succeeded, call is_valid(). | |
| 91 class ScopedExternalMountPoint { | |
| 92 public: | |
| 93 ScopedExternalMountPoint(const std::string& mount_point_name, | |
| 94 const base::FilePath& mount_path, | |
| 95 fileapi::FileSystemType type) | |
| 96 : mount_point_name_(mount_point_name) { | |
| 97 fileapi::ExternalMountPoints* const mount_points = | |
| 98 fileapi::ExternalMountPoints::GetSystemInstance(); | |
| 99 DCHECK(mount_points); | |
| 100 is_valid_ = | |
| 101 mount_points->RegisterFileSystem(mount_point_name, | |
| 102 fileapi::kFileSystemTypeProvided, | |
| 103 fileapi::FileSystemMountOption(), | |
| 104 mount_path); | |
| 105 } | |
| 106 | |
| 107 virtual ~ScopedExternalMountPoint() { | |
| 108 if (!is_valid_) | |
| 109 return; | |
| 110 | |
| 111 // If successfully registered in the constructor, then unregister. | |
| 112 fileapi::ExternalMountPoints* const mount_points = | |
| 113 fileapi::ExternalMountPoints::GetSystemInstance(); | |
| 114 DCHECK(mount_points); | |
| 115 mount_points->RevokeFileSystem(mount_point_name_); | |
| 116 } | |
| 117 | |
| 118 bool is_valid() { return is_valid_; } | |
| 119 | |
| 120 private: | |
| 121 const std::string mount_point_name_; | |
| 122 bool is_valid_; | |
| 123 }; | |
| 124 | |
| 125 // Creates a cracked FileSystemURL for tests. | 94 // Creates a cracked FileSystemURL for tests. |
| 126 fileapi::FileSystemURL CreateFileSystemURL(const std::string& mount_point_name, | 95 fileapi::FileSystemURL CreateFileSystemURL(const std::string& mount_point_name, |
| 127 const base::FilePath& file_path) { | 96 const base::FilePath& file_path) { |
| 128 const std::string origin = std::string("chrome-extension://") + kExtensionId; | 97 const std::string origin = std::string("chrome-extension://") + kExtensionId; |
| 129 const fileapi::ExternalMountPoints* const mount_points = | 98 const fileapi::ExternalMountPoints* const mount_points = |
| 130 fileapi::ExternalMountPoints::GetSystemInstance(); | 99 fileapi::ExternalMountPoints::GetSystemInstance(); |
| 131 return mount_points->CreateCrackedFileSystemURL( | 100 return mount_points->CreateCrackedFileSystemURL( |
| 132 GURL(origin), | 101 GURL(origin), |
| 133 fileapi::kFileSystemTypeExternal, | 102 fileapi::kFileSystemTypeExternal, |
| 134 base::FilePath::FromUTF8Unsafe(mount_point_name).Append(file_path)); | 103 base::FilePath::FromUTF8Unsafe(mount_point_name).Append(file_path)); |
| 135 } | 104 } |
| 136 | 105 |
| 106 // Creates a Service instance. Used to be able to destroy the service in |
| 107 // TearDown(). |
| 108 KeyedService* CreateService(content::BrowserContext* context) { |
| 109 return new Service(Profile::FromBrowserContext(context), |
| 110 extensions::ExtensionRegistry::Get(context)); |
| 111 } |
| 112 |
| 137 } // namespace | 113 } // namespace |
| 138 | 114 |
| 139 // Tests in this file are very lightweight and just test integration between | 115 // Tests in this file are very lightweight and just test integration between |
| 140 // AsyncFileUtil and ProvideFileSystemInterface. Currently it tests if not | 116 // AsyncFileUtil and ProvideFileSystemInterface. Currently it tests if not |
| 141 // implemented operations return a correct error code. For not allowed | 117 // implemented operations return a correct error code. For not allowed |
| 142 // operations it is FILE_ERROR_SECURITY, and for not implemented the error is | 118 // operations it is FILE_ERROR_SECURITY, and for not implemented the error is |
| 143 // FILE_ERROR_NOT_FOUND. | 119 // FILE_ERROR_NOT_FOUND. |
| 144 class FileSystemProviderProviderAsyncFileUtilTest : public testing::Test { | 120 class FileSystemProviderProviderAsyncFileUtilTest : public testing::Test { |
| 145 protected: | 121 protected: |
| 146 FileSystemProviderProviderAsyncFileUtilTest() {} | 122 FileSystemProviderProviderAsyncFileUtilTest() {} |
| 147 virtual ~FileSystemProviderProviderAsyncFileUtilTest() {} | 123 virtual ~FileSystemProviderProviderAsyncFileUtilTest() {} |
| 148 | 124 |
| 149 virtual void SetUp() OVERRIDE { | 125 virtual void SetUp() OVERRIDE { |
| 150 ASSERT_TRUE(data_dir_.CreateUniqueTempDir()); | 126 ASSERT_TRUE(data_dir_.CreateUniqueTempDir()); |
| 151 profile_.reset(new TestingProfile); | 127 profile_manager_.reset( |
| 128 new TestingProfileManager(TestingBrowserProcess::GetGlobal())); |
| 129 ASSERT_TRUE(profile_manager_->SetUp()); |
| 130 profile_ = profile_manager_->CreateTestingProfile("testing-profile"); |
| 152 async_file_util_.reset(new internal::ProviderAsyncFileUtil); | 131 async_file_util_.reset(new internal::ProviderAsyncFileUtil); |
| 153 const base::FilePath mount_path = | 132 |
| 154 util::GetMountPath(profile_.get(), kExtensionId, kFileSystemId); | |
| 155 file_system_context_ = | 133 file_system_context_ = |
| 156 content::CreateFileSystemContextForTesting(NULL, data_dir_.path()); | 134 content::CreateFileSystemContextForTesting(NULL, data_dir_.path()); |
| 157 | 135 |
| 158 const std::string mount_point_name = mount_path.BaseName().AsUTF8Unsafe(); | 136 ServiceFactory::GetInstance()->SetTestingFactory(profile_, &CreateService); |
| 159 mount_point_.reset(new ScopedExternalMountPoint( | 137 Service* service = Service::Get(profile_); // Owned by its factory. |
| 160 mount_point_name, mount_path, fileapi::kFileSystemTypeProvided)); | 138 service->SetFileSystemFactoryForTests( |
| 161 ASSERT_TRUE(mount_point_->is_valid()); | 139 base::Bind(&FakeProvidedFileSystem::Create)); |
| 140 |
| 141 const int file_system_id = |
| 142 service->MountFileSystem(kExtensionId, "testing-file-system"); |
| 143 ASSERT_LT(0, file_system_id); |
| 144 const ProvidedFileSystemInfo& file_system_info = |
| 145 service->GetProvidedFileSystem(kExtensionId, file_system_id) |
| 146 ->GetFileSystemInfo(); |
| 147 const std::string mount_point_name = |
| 148 file_system_info.mount_path().BaseName().AsUTF8Unsafe(); |
| 162 | 149 |
| 163 file_url_ = CreateFileSystemURL( | 150 file_url_ = CreateFileSystemURL( |
| 164 mount_point_name, base::FilePath::FromUTF8Unsafe("hello/world.txt")); | 151 mount_point_name, base::FilePath::FromUTF8Unsafe("hello/world.txt")); |
| 165 ASSERT_TRUE(file_url_.is_valid()); | 152 ASSERT_TRUE(file_url_.is_valid()); |
| 166 directory_url_ = CreateFileSystemURL( | 153 directory_url_ = CreateFileSystemURL( |
| 167 mount_point_name, base::FilePath::FromUTF8Unsafe("hello")); | 154 mount_point_name, base::FilePath::FromUTF8Unsafe("hello")); |
| 168 ASSERT_TRUE(directory_url_.is_valid()); | 155 ASSERT_TRUE(directory_url_.is_valid()); |
| 169 root_url_ = CreateFileSystemURL(mount_point_name, base::FilePath()); | 156 root_url_ = CreateFileSystemURL(mount_point_name, base::FilePath()); |
| 170 ASSERT_TRUE(root_url_.is_valid()); | 157 ASSERT_TRUE(root_url_.is_valid()); |
| 171 } | 158 } |
| 172 | 159 |
| 160 virtual void TearDown() OVERRIDE { |
| 161 // Setting the testing factory to NULL will destroy the created service |
| 162 // associated with the testing profile. |
| 163 ServiceFactory::GetInstance()->SetTestingFactory(profile_, NULL); |
| 164 } |
| 165 |
| 173 scoped_ptr<fileapi::FileSystemOperationContext> CreateOperationContext() { | 166 scoped_ptr<fileapi::FileSystemOperationContext> CreateOperationContext() { |
| 174 return make_scoped_ptr( | 167 return make_scoped_ptr( |
| 175 new fileapi::FileSystemOperationContext(file_system_context_.get())); | 168 new fileapi::FileSystemOperationContext(file_system_context_.get())); |
| 176 } | 169 } |
| 177 | 170 |
| 178 content::TestBrowserThreadBundle thread_bundle_; | 171 content::TestBrowserThreadBundle thread_bundle_; |
| 179 base::ScopedTempDir data_dir_; | 172 base::ScopedTempDir data_dir_; |
| 180 scoped_ptr<TestingProfile> profile_; | 173 scoped_ptr<TestingProfileManager> profile_manager_; |
| 174 TestingProfile* profile_; // Owned by TestingProfileManager. |
| 181 scoped_ptr<fileapi::AsyncFileUtil> async_file_util_; | 175 scoped_ptr<fileapi::AsyncFileUtil> async_file_util_; |
| 182 scoped_refptr<fileapi::FileSystemContext> file_system_context_; | 176 scoped_refptr<fileapi::FileSystemContext> file_system_context_; |
| 183 scoped_ptr<ScopedExternalMountPoint> mount_point_; | |
| 184 fileapi::FileSystemURL file_url_; | 177 fileapi::FileSystemURL file_url_; |
| 185 fileapi::FileSystemURL directory_url_; | 178 fileapi::FileSystemURL directory_url_; |
| 186 fileapi::FileSystemURL root_url_; | 179 fileapi::FileSystemURL root_url_; |
| 187 }; | 180 }; |
| 188 | 181 |
| 189 TEST_F(FileSystemProviderProviderAsyncFileUtilTest, CreateOrOpen_Create) { | 182 TEST_F(FileSystemProviderProviderAsyncFileUtilTest, CreateOrOpen_Create) { |
| 190 EventLogger logger; | 183 EventLogger logger; |
| 191 | 184 |
| 192 async_file_util_->CreateOrOpen( | 185 async_file_util_->CreateOrOpen( |
| 193 CreateOperationContext(), | 186 CreateOperationContext(), |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 276 | 269 |
| 277 ASSERT_TRUE(logger.error()); | 270 ASSERT_TRUE(logger.error()); |
| 278 EXPECT_EQ(base::File::FILE_ERROR_SECURITY, *logger.error()); | 271 EXPECT_EQ(base::File::FILE_ERROR_SECURITY, *logger.error()); |
| 279 } | 272 } |
| 280 | 273 |
| 281 TEST_F(FileSystemProviderProviderAsyncFileUtilTest, GetFileInfo) { | 274 TEST_F(FileSystemProviderProviderAsyncFileUtilTest, GetFileInfo) { |
| 282 EventLogger logger; | 275 EventLogger logger; |
| 283 | 276 |
| 284 async_file_util_->GetFileInfo( | 277 async_file_util_->GetFileInfo( |
| 285 CreateOperationContext(), | 278 CreateOperationContext(), |
| 286 file_url_, | 279 root_url_, |
| 287 base::Bind(&EventLogger::OnGetFileInfo, logger.GetWeakPtr())); | 280 base::Bind(&EventLogger::OnGetFileInfo, logger.GetWeakPtr())); |
| 281 base::RunLoop().RunUntilIdle(); |
| 288 | 282 |
| 289 ASSERT_TRUE(logger.error()); | 283 ASSERT_TRUE(logger.error()); |
| 290 EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND, *logger.error()); | 284 EXPECT_EQ(base::File::FILE_OK, *logger.error()); |
| 291 } | 285 } |
| 292 | 286 |
| 293 TEST_F(FileSystemProviderProviderAsyncFileUtilTest, ReadDirectory) { | 287 TEST_F(FileSystemProviderProviderAsyncFileUtilTest, ReadDirectory) { |
| 294 EventLogger logger; | 288 EventLogger logger; |
| 295 | 289 |
| 296 async_file_util_->ReadDirectory( | 290 async_file_util_->ReadDirectory( |
| 297 CreateOperationContext(), | 291 CreateOperationContext(), |
| 298 root_url_, | 292 root_url_, |
| 299 base::Bind(&EventLogger::OnReadDirectory, logger.GetWeakPtr())); | 293 base::Bind(&EventLogger::OnReadDirectory, logger.GetWeakPtr())); |
| 300 | 294 |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 414 CreateOperationContext(), | 408 CreateOperationContext(), |
| 415 file_url_, | 409 file_url_, |
| 416 base::Bind(&EventLogger::OnCreateSnapshotFile, logger.GetWeakPtr())); | 410 base::Bind(&EventLogger::OnCreateSnapshotFile, logger.GetWeakPtr())); |
| 417 | 411 |
| 418 ASSERT_TRUE(logger.error()); | 412 ASSERT_TRUE(logger.error()); |
| 419 EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND, *logger.error()); | 413 EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND, *logger.error()); |
| 420 } | 414 } |
| 421 | 415 |
| 422 } // namespace file_system_provider | 416 } // namespace file_system_provider |
| 423 } // namespace chromeos | 417 } // namespace chromeos |
| OLD | NEW |