Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / chromeos / file_system_provider / service_unittest.cc
index 0e848a5..65d972c 100644 (file)
@@ -3,15 +3,22 @@
 // found in the LICENSE file.
 
 #include <string>
+#include <vector>
 
+#include "base/files/file.h"
+#include "base/memory/ref_counted.h"
 #include "base/memory/scoped_ptr.h"
-#include "base/memory/scoped_vector.h"
+#include "chrome/browser/chromeos/file_system_provider/fake_provided_file_system.h"
+#include "chrome/browser/chromeos/file_system_provider/mount_path_util.h"
 #include "chrome/browser/chromeos/file_system_provider/observer.h"
-#include "chrome/browser/chromeos/file_system_provider/provided_file_system.h"
+#include "chrome/browser/chromeos/file_system_provider/provided_file_system_info.h"
 #include "chrome/browser/chromeos/file_system_provider/service.h"
 #include "chrome/browser/chromeos/login/fake_user_manager.h"
 #include "chrome/test/base/testing_profile.h"
 #include "content/public/test/test_browser_thread_bundle.h"
+#include "extensions/browser/extension_registry.h"
+#include "extensions/common/extension.h"
+#include "extensions/common/manifest_constants.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "webkit/browser/fileapi/external_mount_points.h"
 
@@ -25,24 +32,58 @@ const char kFileSystemName[] = "Camera Pictures";
 // Utility observer, logging events from file_system_provider::Service.
 class LoggingObserver : public Observer {
  public:
+  class Event {
+   public:
+    Event(const ProvidedFileSystemInfo& file_system_info,
+          base::File::Error error)
+        : file_system_info_(file_system_info), error_(error) {}
+    ~Event() {}
+
+    const ProvidedFileSystemInfo& file_system_info() {
+      return file_system_info_;
+    }
+    base::File::Error error() { return error_; }
+
+   private:
+    ProvidedFileSystemInfo file_system_info_;
+    base::File::Error error_;
+  };
+
   LoggingObserver() {}
   virtual ~LoggingObserver() {}
 
   // file_system_provider::Observer overrides.
-  virtual void OnProvidedFileSystemRegistered(
-      const ProvidedFileSystem& file_system) OVERRIDE {
-    registered.push_back(new const ProvidedFileSystem(file_system));
+  virtual void OnProvidedFileSystemMount(
+      const ProvidedFileSystemInfo& file_system_info,
+      base::File::Error error) OVERRIDE {
+    mounts.push_back(Event(file_system_info, error));
   }
 
-  virtual void OnProvidedFileSystemUnregistered(
-      const ProvidedFileSystem& file_system) OVERRIDE {
-    unregistered.push_back(new const ProvidedFileSystem(file_system));
+  virtual void OnProvidedFileSystemUnmount(
+      const ProvidedFileSystemInfo& file_system_info,
+      base::File::Error error) OVERRIDE {
+    unmounts.push_back(Event(file_system_info, error));
   }
 
-  ScopedVector<const ProvidedFileSystem> registered;
-  ScopedVector<const ProvidedFileSystem> unregistered;
+  std::vector<Event> mounts;
+  std::vector<Event> unmounts;
 };
 
+// Creates a fake extension with the specified |extension_id|.
+scoped_refptr<extensions::Extension> createFakeExtension(
+    const std::string& extension_id) {
+  base::DictionaryValue manifest;
+  std::string error;
+  manifest.SetString(extensions::manifest_keys::kVersion, "1.0.0.0");
+  manifest.SetString(extensions::manifest_keys::kName, "unused");
+  return extensions::Extension::Create(base::FilePath(),
+                                       extensions::Manifest::UNPACKED,
+                                       manifest,
+                                       extensions::Extension::NO_FLAGS,
+                                       extension_id,
+                                       &error);
+}
+
 }  // namespace
 
 class FileSystemProviderServiceTest : public testing::Test {
@@ -51,140 +92,202 @@ class FileSystemProviderServiceTest : public testing::Test {
   virtual ~FileSystemProviderServiceTest() {}
 
   virtual void SetUp() OVERRIDE {
-    user_manager_ = new FakeUserManager();
-    user_manager_enabler_.reset(new ScopedUserManagerEnabler(user_manager_));
     profile_.reset(new TestingProfile);
+    user_manager_ = new FakeUserManager();
     user_manager_->AddUser(profile_->GetProfileName());
-    file_system_provider_service_.reset(new Service(profile_.get()));
-  }
-
-  virtual void TearDown() {
-    fileapi::ExternalMountPoints::GetSystemInstance()->RevokeAllFileSystems();
+    user_manager_enabler_.reset(new ScopedUserManagerEnabler(user_manager_));
+    extension_registry_.reset(
+        new extensions::ExtensionRegistry(profile_.get()));
+    file_system_provider_service_.reset(
+        new Service(profile_.get(), extension_registry_.get()));
+    file_system_provider_service_->SetFileSystemFactoryForTests(
+        base::Bind(&FakeProvidedFileSystem::Create));
+    extension_ = createFakeExtension(kExtensionId);
   }
 
   content::TestBrowserThreadBundle thread_bundle_;
   scoped_ptr<TestingProfile> profile_;
-  scoped_ptr<ScopedUserManagerEnabler> user_manager_enabler_;
   FakeUserManager* user_manager_;
+  scoped_ptr<ScopedUserManagerEnabler> user_manager_enabler_;
+  scoped_ptr<extensions::ExtensionRegistry> extension_registry_;
   scoped_ptr<Service> file_system_provider_service_;
+  scoped_refptr<extensions::Extension> extension_;
 };
 
-TEST_F(FileSystemProviderServiceTest, RegisterFileSystem) {
+TEST_F(FileSystemProviderServiceTest, MountFileSystem) {
   LoggingObserver observer;
   file_system_provider_service_->AddObserver(&observer);
 
-  int file_system_id = file_system_provider_service_->RegisterFileSystem(
+  int file_system_id = file_system_provider_service_->MountFileSystem(
       kExtensionId, kFileSystemName);
 
   EXPECT_LT(0, file_system_id);
-  ASSERT_EQ(1u, observer.registered.size());
-  EXPECT_EQ(kExtensionId, observer.registered[0]->extension_id());
-  EXPECT_EQ(1, observer.registered[0]->file_system_id());
-  EXPECT_EQ("/provided/mbflcebpggnecokmikipoihdbecnjfoj-1-testing_profile-hash",
-            observer.registered[0]->mount_path().AsUTF8Unsafe());
-  EXPECT_EQ(kFileSystemName, observer.registered[0]->file_system_name());
-  ASSERT_EQ(0u, observer.unregistered.size());
-
-  std::vector<ProvidedFileSystem> provided_file_systems =
-      file_system_provider_service_->GetRegisteredFileSystems();
-  ASSERT_EQ(1u, provided_file_systems.size());
+  ASSERT_EQ(1u, observer.mounts.size());
+  EXPECT_EQ(kExtensionId, observer.mounts[0].file_system_info().extension_id());
+  EXPECT_EQ(1, observer.mounts[0].file_system_info().file_system_id());
+  base::FilePath expected_mount_path =
+      util::GetMountPath(profile_.get(), kExtensionId, file_system_id);
+  EXPECT_EQ(expected_mount_path.AsUTF8Unsafe(),
+            observer.mounts[0].file_system_info().mount_path().AsUTF8Unsafe());
+  EXPECT_EQ(kFileSystemName,
+            observer.mounts[0].file_system_info().file_system_name());
+  EXPECT_EQ(base::File::FILE_OK, observer.mounts[0].error());
+  ASSERT_EQ(0u, observer.unmounts.size());
+
+  std::vector<ProvidedFileSystemInfo> file_system_info_list =
+      file_system_provider_service_->GetProvidedFileSystemInfoList();
+  ASSERT_EQ(1u, file_system_info_list.size());
 
   file_system_provider_service_->RemoveObserver(&observer);
 }
 
-TEST_F(FileSystemProviderServiceTest, RegisterFileSystem_UniqueIds) {
+TEST_F(FileSystemProviderServiceTest, MountFileSystem_UniqueIds) {
   LoggingObserver observer;
   file_system_provider_service_->AddObserver(&observer);
 
-  int file_system_first_id = file_system_provider_service_->RegisterFileSystem(
+  int file_system_first_id = file_system_provider_service_->MountFileSystem(
       kExtensionId, kFileSystemName);
-  ASSERT_LT(0, file_system_first_id);
+  EXPECT_LT(0, file_system_first_id);
 
-  int file_system_second_id = file_system_provider_service_->RegisterFileSystem(
+  int file_system_second_id = file_system_provider_service_->MountFileSystem(
       kExtensionId, kFileSystemName);
-  ASSERT_LT(0, file_system_second_id);
+  EXPECT_LT(0, file_system_second_id);
 
-  ASSERT_NE(file_system_first_id, file_system_second_id);
-  ASSERT_EQ(2u, observer.registered.size());
+  EXPECT_NE(file_system_first_id, file_system_second_id);
+  ASSERT_EQ(2u, observer.mounts.size());
+  EXPECT_EQ(base::File::FILE_OK, observer.mounts[0].error());
+  EXPECT_EQ(base::File::FILE_OK, observer.mounts[1].error());
 
-  std::vector<ProvidedFileSystem> provided_file_systems =
-      file_system_provider_service_->GetRegisteredFileSystems();
-  ASSERT_EQ(2u, provided_file_systems.size());
+  std::vector<ProvidedFileSystemInfo> file_system_info_list =
+      file_system_provider_service_->GetProvidedFileSystemInfoList();
+  ASSERT_EQ(2u, file_system_info_list.size());
 
   file_system_provider_service_->RemoveObserver(&observer);
 }
 
-TEST_F(FileSystemProviderServiceTest, RegisterFileSystem_StressTest) {
+TEST_F(FileSystemProviderServiceTest, MountFileSystem_StressTest) {
   LoggingObserver observer;
   file_system_provider_service_->AddObserver(&observer);
 
   const size_t kMaxFileSystems = 16;
   for (size_t i = 0; i < kMaxFileSystems; ++i) {
-    int file_system_id = file_system_provider_service_->RegisterFileSystem(
+    int file_system_id = file_system_provider_service_->MountFileSystem(
         kExtensionId, kFileSystemName);
-    ASSERT_LT(0, file_system_id);
+    EXPECT_LT(0, file_system_id);
   }
-  ASSERT_EQ(kMaxFileSystems, observer.registered.size());
+  ASSERT_EQ(kMaxFileSystems, observer.mounts.size());
 
   // The next file system is out of limit, and registering it should fail.
-  int file_system_id = file_system_provider_service_->RegisterFileSystem(
+  int file_system_id = file_system_provider_service_->MountFileSystem(
       kExtensionId, kFileSystemName);
-  ASSERT_EQ(0, file_system_id);
-  ASSERT_EQ(kMaxFileSystems, observer.registered.size());
+  EXPECT_EQ(0, file_system_id);
 
-  std::vector<ProvidedFileSystem> provided_file_systems =
-      file_system_provider_service_->GetRegisteredFileSystems();
-  ASSERT_EQ(kMaxFileSystems, provided_file_systems.size());
+  ASSERT_EQ(kMaxFileSystems + 1, observer.mounts.size());
+  EXPECT_EQ(base::File::FILE_ERROR_TOO_MANY_OPENED,
+            observer.mounts[kMaxFileSystems].error());
+
+  std::vector<ProvidedFileSystemInfo> file_system_info_list =
+      file_system_provider_service_->GetProvidedFileSystemInfoList();
+  ASSERT_EQ(kMaxFileSystems, file_system_info_list.size());
 
   file_system_provider_service_->RemoveObserver(&observer);
 }
 
-TEST_F(FileSystemProviderServiceTest, UnregisterFileSystem) {
+TEST_F(FileSystemProviderServiceTest, UnmountFileSystem) {
   LoggingObserver observer;
   file_system_provider_service_->AddObserver(&observer);
 
-  int file_system_id = file_system_provider_service_->RegisterFileSystem(
+  int file_system_id = file_system_provider_service_->MountFileSystem(
       kExtensionId, kFileSystemName);
-  ASSERT_LT(0, file_system_id);
-  ASSERT_EQ(1u, observer.registered.size());
+  EXPECT_LT(0, file_system_id);
+  ASSERT_EQ(1u, observer.mounts.size());
 
-  const bool result = file_system_provider_service_->UnregisterFileSystem(
+  const bool result = file_system_provider_service_->UnmountFileSystem(
       kExtensionId, file_system_id);
-  ASSERT_TRUE(result);
-  ASSERT_EQ(1u, observer.unregistered.size());
+  EXPECT_TRUE(result);
+  ASSERT_EQ(1u, observer.unmounts.size());
+  EXPECT_EQ(base::File::FILE_OK, observer.unmounts[0].error());
+
+  EXPECT_EQ(kExtensionId,
+            observer.unmounts[0].file_system_info().extension_id());
+  EXPECT_EQ(1, observer.unmounts[0].file_system_info().file_system_id());
+  base::FilePath expected_mount_path =
+      util::GetMountPath(profile_.get(), kExtensionId, file_system_id);
+  EXPECT_EQ(
+      expected_mount_path.AsUTF8Unsafe(),
+      observer.unmounts[0].file_system_info().mount_path().AsUTF8Unsafe());
+  EXPECT_EQ(kFileSystemName,
+            observer.unmounts[0].file_system_info().file_system_name());
+
+  std::vector<ProvidedFileSystemInfo> file_system_info_list =
+      file_system_provider_service_->GetProvidedFileSystemInfoList();
+  ASSERT_EQ(0u, file_system_info_list.size());
 
-  EXPECT_EQ(kExtensionId, observer.unregistered[0]->extension_id());
-  EXPECT_EQ(1, observer.unregistered[0]->file_system_id());
-  EXPECT_EQ("/provided/mbflcebpggnecokmikipoihdbecnjfoj-1-testing_profile-hash",
-            observer.unregistered[0]->mount_path().AsUTF8Unsafe());
-  EXPECT_EQ(kFileSystemName, observer.unregistered[0]->file_system_name());
+  file_system_provider_service_->RemoveObserver(&observer);
+}
 
-  std::vector<ProvidedFileSystem> provided_file_systems =
-      file_system_provider_service_->GetRegisteredFileSystems();
-  ASSERT_EQ(0u, provided_file_systems.size());
+TEST_F(FileSystemProviderServiceTest, UnmountFileSystem_OnExtensionUnload) {
+  LoggingObserver observer;
+  file_system_provider_service_->AddObserver(&observer);
+
+  int file_system_id = file_system_provider_service_->MountFileSystem(
+      kExtensionId, kFileSystemName);
+  EXPECT_LT(0, file_system_id);
+  ASSERT_EQ(1u, observer.mounts.size());
+
+  // Directly call the observer's method.
+  file_system_provider_service_->OnExtensionUnloaded(
+      profile_.get(),
+      extension_.get(),
+      extensions::UnloadedExtensionInfo::REASON_DISABLE);
+
+  ASSERT_EQ(1u, observer.unmounts.size());
+  EXPECT_EQ(base::File::FILE_OK, observer.unmounts[0].error());
+
+  EXPECT_EQ(kExtensionId,
+            observer.unmounts[0].file_system_info().extension_id());
+  EXPECT_EQ(1, observer.unmounts[0].file_system_info().file_system_id());
+  base::FilePath expected_mount_path =
+      util::GetMountPath(profile_.get(), kExtensionId, file_system_id);
+  EXPECT_EQ(
+      expected_mount_path.AsUTF8Unsafe(),
+      observer.unmounts[0].file_system_info().mount_path().AsUTF8Unsafe());
+  EXPECT_EQ(kFileSystemName,
+            observer.unmounts[0].file_system_info().file_system_name());
+
+  std::vector<ProvidedFileSystemInfo> file_system_info_list =
+      file_system_provider_service_->GetProvidedFileSystemInfoList();
+  ASSERT_EQ(0u, file_system_info_list.size());
 
   file_system_provider_service_->RemoveObserver(&observer);
 }
 
-TEST_F(FileSystemProviderServiceTest, UnregisterFileSystem_WrongExtensionId) {
+TEST_F(FileSystemProviderServiceTest, UnmountFileSystem_WrongExtensionId) {
   LoggingObserver observer;
   file_system_provider_service_->AddObserver(&observer);
 
   const std::string kWrongExtensionId = "helloworldhelloworldhelloworldhe";
 
-  int file_system_id = file_system_provider_service_->RegisterFileSystem(
+  int file_system_id = file_system_provider_service_->MountFileSystem(
       kExtensionId, kFileSystemName);
-  ASSERT_LT(0, file_system_id);
-  ASSERT_EQ(1u, observer.registered.size());
+  EXPECT_LT(0, file_system_id);
+  ASSERT_EQ(1u, observer.mounts.size());
+  ASSERT_EQ(
+      1u,
+      file_system_provider_service_->GetProvidedFileSystemInfoList().size());
 
-  const bool result = file_system_provider_service_->UnregisterFileSystem(
+  const bool result = file_system_provider_service_->UnmountFileSystem(
       kWrongExtensionId, file_system_id);
-  ASSERT_FALSE(result);
-  ASSERT_EQ(0u, observer.unregistered.size());
-
-  std::vector<ProvidedFileSystem> provided_file_systems =
-      file_system_provider_service_->GetRegisteredFileSystems();
-  ASSERT_EQ(1u, provided_file_systems.size());
+  EXPECT_FALSE(result);
+  ASSERT_EQ(1u, observer.unmounts.size());
+  EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND, observer.unmounts[0].error());
+  ASSERT_EQ(
+      1u,
+      file_system_provider_service_->GetProvidedFileSystemInfoList().size());
+
+  std::vector<ProvidedFileSystemInfo> file_system_info_list =
+      file_system_provider_service_->GetProvidedFileSystemInfoList();
+  ASSERT_EQ(1u, file_system_info_list.size());
 
   file_system_provider_service_->RemoveObserver(&observer);
 }