1effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// found in the LICENSE file.
4effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/file_system_provider/service.h"
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include <string>
8c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include <vector>
9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
10c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "base/files/file.h"
110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "base/memory/ref_counted.h"
12effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/memory/scoped_ptr.h"
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/strings/string_number_conversions.h"
140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/chromeos/file_system_provider/fake_provided_file_system.h"
150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/chromeos/file_system_provider/mount_path_util.h"
16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/chromeos/file_system_provider/observer.h"
170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/chromeos/file_system_provider/provided_file_system_info.h"
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/fake_user_manager.h"
196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/scoped_user_manager_enabler.h"
2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/common/pref_names.h"
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/test/base/testing_browser_process.h"
2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/test/base/testing_pref_service_syncable.h"
23effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/test/base/testing_profile.h"
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/test/base/testing_profile_manager.h"
2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "components/user_prefs/user_prefs.h"
26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/public/test/test_browser_thread_bundle.h"
270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "extensions/browser/extension_registry.h"
280529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "extensions/common/extension.h"
290529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "extensions/common/manifest_constants.h"
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/external_mount_points.h"
31effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
32effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
33effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace chromeos {
34effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace file_system_provider {
35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace {
36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
37effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst char kExtensionId[] = "mbflcebpggnecokmikipoihdbecnjfoj";
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kDisplayName[] = "Camera Pictures";
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// The dot in the file system ID is there in order to check that saving to
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// preferences works correctly. File System ID is used as a key in
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// a base::DictionaryValue, so it has to be stored without path expansion.
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kFileSystemId[] = "camera/pictures/id .!@#$%^&*()_+";
44effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
45effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Utility observer, logging events from file_system_provider::Service.
46effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass LoggingObserver : public Observer {
47effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public:
48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  class Event {
49c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch   public:
500529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    Event(const ProvidedFileSystemInfo& file_system_info,
510529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch          base::File::Error error)
520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        : file_system_info_(file_system_info), error_(error) {}
53c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ~Event() {}
54c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    const ProvidedFileSystemInfo& file_system_info() {
560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      return file_system_info_;
570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    }
58c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    base::File::Error error() { return error_; }
59c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
60c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch   private:
610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    ProvidedFileSystemInfo file_system_info_;
62c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    base::File::Error error_;
63c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  };
64c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
65effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  LoggingObserver() {}
66effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual ~LoggingObserver() {}
67effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
68effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // file_system_provider::Observer overrides.
690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  virtual void OnProvidedFileSystemMount(
700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      const ProvidedFileSystemInfo& file_system_info,
710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      base::File::Error error) OVERRIDE {
720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    mounts.push_back(Event(file_system_info, error));
73effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
74effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
75c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual void OnProvidedFileSystemUnmount(
760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      const ProvidedFileSystemInfo& file_system_info,
77c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      base::File::Error error) OVERRIDE {
780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    unmounts.push_back(Event(file_system_info, error));
79effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
80effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
81c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  std::vector<Event> mounts;
82c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  std::vector<Event> unmounts;
83effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch};
84effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Creates a fake extension with the specified |extension_id|.
860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochscoped_refptr<extensions::Extension> createFakeExtension(
870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    const std::string& extension_id) {
880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  base::DictionaryValue manifest;
890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  std::string error;
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  manifest.SetStringWithoutPathExpansion(extensions::manifest_keys::kVersion,
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                         "1.0.0.0");
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  manifest.SetStringWithoutPathExpansion(extensions::manifest_keys::kName,
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                         "unused");
940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  return extensions::Extension::Create(base::FilePath(),
950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                       extensions::Manifest::UNPACKED,
960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                       manifest,
970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                       extensions::Extension::NO_FLAGS,
980529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                       extension_id,
990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                       &error);
1000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
1010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Stores a provided file system information in preferences.
10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void RememberFakeFileSystem(TestingProfile* profile,
10446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                            const std::string& extension_id,
10546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                            const std::string& file_system_id,
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            const std::string& display_name,
107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                            bool writable) {
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestingPrefServiceSyncable* const pref_service =
109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      profile->GetTestingPrefService();
11046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_TRUE(pref_service);
11146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
11246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  base::DictionaryValue extensions;
113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::DictionaryValue* file_systems = new base::DictionaryValue();
11446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  base::DictionaryValue* file_system = new base::DictionaryValue();
115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  file_system->SetStringWithoutPathExpansion(kPrefKeyFileSystemId,
116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                             kFileSystemId);
117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  file_system->SetStringWithoutPathExpansion(kPrefKeyDisplayName, kDisplayName);
118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  file_system->SetBooleanWithoutPathExpansion(kPrefKeyWritable, writable);
119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  file_systems->SetWithoutPathExpansion(kFileSystemId, file_system);
120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  extensions.SetWithoutPathExpansion(kExtensionId, file_systems);
12146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
12246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  pref_service->Set(prefs::kFileSystemProviderMounted, extensions);
12346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
12446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
125effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}  // namespace
126effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
127effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass FileSystemProviderServiceTest : public testing::Test {
128effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch protected:
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  FileSystemProviderServiceTest() : profile_(NULL) {}
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
131effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual ~FileSystemProviderServiceTest() {}
132effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
133effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual void SetUp() OVERRIDE {
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    profile_manager_.reset(
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        new TestingProfileManager(TestingBrowserProcess::GetGlobal()));
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ASSERT_TRUE(profile_manager_->SetUp());
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    profile_ = profile_manager_->CreateTestingProfile("test-user@example.com");
1380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    user_manager_ = new FakeUserManager();
139effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    user_manager_->AddUser(profile_->GetProfileName());
1400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    user_manager_enabler_.reset(new ScopedUserManagerEnabler(user_manager_));
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    extension_registry_.reset(new extensions::ExtensionRegistry(profile_));
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    service_.reset(new Service(profile_, extension_registry_.get()));
143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    service_->SetFileSystemFactoryForTesting(
1440529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        base::Bind(&FakeProvidedFileSystem::Create));
1450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    extension_ = createFakeExtension(kExtensionId);
146effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
147effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
148effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  content::TestBrowserThreadBundle thread_bundle_;
1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<TestingProfileManager> profile_manager_;
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  TestingProfile* profile_;
151effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  FakeUserManager* user_manager_;
1520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  scoped_ptr<ScopedUserManagerEnabler> user_manager_enabler_;
1530529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  scoped_ptr<extensions::ExtensionRegistry> extension_registry_;
154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<Service> service_;
1550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  scoped_refptr<extensions::Extension> extension_;
156effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch};
157effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
158c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(FileSystemProviderServiceTest, MountFileSystem) {
159effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  LoggingObserver observer;
160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_->AddObserver(&observer);
161effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(service_->MountFileSystem(
163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      kExtensionId, kFileSystemId, kDisplayName, false /* writable */));
164effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
165c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ASSERT_EQ(1u, observer.mounts.size());
1660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(kExtensionId, observer.mounts[0].file_system_info().extension_id());
167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kFileSystemId,
168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            observer.mounts[0].file_system_info().file_system_id());
1690529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  base::FilePath expected_mount_path =
1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      util::GetMountPath(profile_, kExtensionId, kFileSystemId);
1710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(expected_mount_path.AsUTF8Unsafe(),
1720529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch            observer.mounts[0].file_system_info().mount_path().AsUTF8Unsafe());
173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(kDisplayName, observer.mounts[0].file_system_info().display_name());
174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(observer.mounts[0].file_system_info().writable());
175c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(base::File::FILE_OK, observer.mounts[0].error());
176c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ASSERT_EQ(0u, observer.unmounts.size());
177effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  std::vector<ProvidedFileSystemInfo> file_system_info_list =
179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      service_->GetProvidedFileSystemInfoList();
1800529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_EQ(1u, file_system_info_list.size());
181effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_->RemoveObserver(&observer);
183effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
184effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
185116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(FileSystemProviderServiceTest, MountFileSystem_Writable) {
186effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  LoggingObserver observer;
187116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_->AddObserver(&observer);
188116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(service_->MountFileSystem(
190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      kExtensionId, kFileSystemId, kDisplayName, true /* writable */));
191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_EQ(1u, observer.mounts.size());
193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(observer.mounts[0].file_system_info().writable());
194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_EQ(0u, observer.unmounts.size());
195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::vector<ProvidedFileSystemInfo> file_system_info_list =
196116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      service_->GetProvidedFileSystemInfoList();
197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_EQ(1u, file_system_info_list.size());
198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_->RemoveObserver(&observer);
200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
201effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
202116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(FileSystemProviderServiceTest, MountFileSystem_UniqueIds) {
203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  LoggingObserver observer;
204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_->AddObserver(&observer);
205effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
206116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(service_->MountFileSystem(
207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      kExtensionId, kFileSystemId, kDisplayName, false /* writable */));
208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(service_->MountFileSystem(
209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      kExtensionId, kFileSystemId, kDisplayName, false /* writable */));
210effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
211c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ASSERT_EQ(2u, observer.mounts.size());
212c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(base::File::FILE_OK, observer.mounts[0].error());
213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(base::File::FILE_ERROR_EXISTS, observer.mounts[1].error());
214effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  std::vector<ProvidedFileSystemInfo> file_system_info_list =
216116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      service_->GetProvidedFileSystemInfoList();
217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(1u, file_system_info_list.size());
218effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_->RemoveObserver(&observer);
220effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
221effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
222c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(FileSystemProviderServiceTest, MountFileSystem_StressTest) {
223effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  LoggingObserver observer;
224116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_->AddObserver(&observer);
225effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
226effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  const size_t kMaxFileSystems = 16;
227effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  for (size_t i = 0; i < kMaxFileSystems; ++i) {
228cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const std::string file_system_id =
229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        std::string("test-") + base::IntToString(i);
230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_TRUE(service_->MountFileSystem(
231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        kExtensionId, file_system_id, kDisplayName, false /* writable */));
232effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
233c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ASSERT_EQ(kMaxFileSystems, observer.mounts.size());
234effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
235effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // The next file system is out of limit, and registering it should fail.
236116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(service_->MountFileSystem(
237116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      kExtensionId, kFileSystemId, kDisplayName, false /* writable */));
238c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
239c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ASSERT_EQ(kMaxFileSystems + 1, observer.mounts.size());
240c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(base::File::FILE_ERROR_TOO_MANY_OPENED,
241c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            observer.mounts[kMaxFileSystems].error());
242effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  std::vector<ProvidedFileSystemInfo> file_system_info_list =
244116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      service_->GetProvidedFileSystemInfoList();
2450529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_EQ(kMaxFileSystems, file_system_info_list.size());
246effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_->RemoveObserver(&observer);
248effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
249effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
250c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(FileSystemProviderServiceTest, UnmountFileSystem) {
251effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  LoggingObserver observer;
252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_->AddObserver(&observer);
253effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
254116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(service_->MountFileSystem(
255116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      kExtensionId, kFileSystemId, kDisplayName, false /* writable */));
256c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ASSERT_EQ(1u, observer.mounts.size());
257effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
258116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(service_->UnmountFileSystem(
259116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      kExtensionId, kFileSystemId, Service::UNMOUNT_REASON_USER));
260c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ASSERT_EQ(1u, observer.unmounts.size());
261c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(base::File::FILE_OK, observer.unmounts[0].error());
262effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(kExtensionId,
2640529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch            observer.unmounts[0].file_system_info().extension_id());
265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kFileSystemId,
266cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            observer.unmounts[0].file_system_info().file_system_id());
2670529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2680529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  std::vector<ProvidedFileSystemInfo> file_system_info_list =
269116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      service_->GetProvidedFileSystemInfoList();
2700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_EQ(0u, file_system_info_list.size());
2710529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
272116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_->RemoveObserver(&observer);
2730529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
2740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2750529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochTEST_F(FileSystemProviderServiceTest, UnmountFileSystem_OnExtensionUnload) {
2760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  LoggingObserver observer;
277116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_->AddObserver(&observer);
2780529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
279116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(service_->MountFileSystem(
280116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      kExtensionId, kFileSystemId, kDisplayName, false /* writable */));
2810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_EQ(1u, observer.mounts.size());
2820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Directly call the observer's method.
284116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_->OnExtensionUnloaded(
2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      profile_,
2860529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      extension_.get(),
2870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      extensions::UnloadedExtensionInfo::REASON_DISABLE);
2880529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_EQ(1u, observer.unmounts.size());
2900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(base::File::FILE_OK, observer.unmounts[0].error());
2910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
2920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  EXPECT_EQ(kExtensionId,
2930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch            observer.unmounts[0].file_system_info().extension_id());
294cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kFileSystemId,
295cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            observer.unmounts[0].file_system_info().file_system_id());
296effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  std::vector<ProvidedFileSystemInfo> file_system_info_list =
298116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      service_->GetProvidedFileSystemInfoList();
2990529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_EQ(0u, file_system_info_list.size());
300effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
301116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_->RemoveObserver(&observer);
302effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
303effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
304c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(FileSystemProviderServiceTest, UnmountFileSystem_WrongExtensionId) {
305effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  LoggingObserver observer;
306116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_->AddObserver(&observer);
307effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
308effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  const std::string kWrongExtensionId = "helloworldhelloworldhelloworldhe";
309effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
310116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(service_->MountFileSystem(
311116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      kExtensionId, kFileSystemId, kDisplayName, false /* writable */));
312c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ASSERT_EQ(1u, observer.mounts.size());
313116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_EQ(1u, service_->GetProvidedFileSystemInfoList().size());
314effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
315116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_FALSE(service_->UnmountFileSystem(
316116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      kWrongExtensionId, kFileSystemId, Service::UNMOUNT_REASON_USER));
317c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  ASSERT_EQ(1u, observer.unmounts.size());
318c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND, observer.unmounts[0].error());
319116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_EQ(1u, service_->GetProvidedFileSystemInfoList().size());
320effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
3210529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  std::vector<ProvidedFileSystemInfo> file_system_info_list =
322116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      service_->GetProvidedFileSystemInfoList();
3230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  ASSERT_EQ(1u, file_system_info_list.size());
324effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
325116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_->RemoveObserver(&observer);
326effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
327effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
32846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(FileSystemProviderServiceTest, RestoreFileSystem_OnExtensionLoad) {
329116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Create a fake entry in the preferences.
3301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  RememberFakeFileSystem(
3311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      profile_, kExtensionId, kFileSystemId, kDisplayName, true /* writable */);
332116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
333116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Create a new service instance in order to load remembered file systems
334116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // from preferences.
335116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<Service> new_service(
3361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      new Service(profile_, extension_registry_.get()));
33746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  LoggingObserver observer;
338116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  new_service->AddObserver(&observer);
33946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
340116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  new_service->SetFileSystemFactoryForTesting(
341116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      base::Bind(&FakeProvidedFileSystem::Create));
34246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
34346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(0u, observer.mounts.size());
34446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
34546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Directly call the observer's method.
3461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  new_service->OnExtensionLoaded(profile_, extension_.get());
34746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
34846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_EQ(1u, observer.mounts.size());
34946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(base::File::FILE_OK, observer.mounts[0].error());
35046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
35146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(kExtensionId, observer.mounts[0].file_system_info().extension_id());
35246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(kFileSystemId,
35346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)            observer.mounts[0].file_system_info().file_system_id());
354116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(observer.mounts[0].file_system_info().writable());
35546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
35646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  std::vector<ProvidedFileSystemInfo> file_system_info_list =
357116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      new_service->GetProvidedFileSystemInfoList();
35846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_EQ(1u, file_system_info_list.size());
35946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
360116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  new_service->RemoveObserver(&observer);
36146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
36246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
363116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(FileSystemProviderServiceTest, RememberFileSystem_OnMount) {
36446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  LoggingObserver observer;
365116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_->AddObserver(&observer);
36646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
367116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(service_->MountFileSystem(
368116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      kExtensionId, kFileSystemId, kDisplayName, true /* writable */));
36946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_EQ(1u, observer.mounts.size());
37046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
371116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestingPrefServiceSyncable* const pref_service =
372116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      profile_->GetTestingPrefService();
37346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_TRUE(pref_service);
37446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
375116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const base::DictionaryValue* const extensions =
37646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      pref_service->GetDictionary(prefs::kFileSystemProviderMounted);
37746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_TRUE(extensions);
37846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
379116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const base::DictionaryValue* file_systems = NULL;
380116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(extensions->GetDictionaryWithoutPathExpansion(kExtensionId,
381116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                                            &file_systems));
382116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(1u, file_systems->size());
38346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
384116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const base::Value* file_system_value = NULL;
385116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const base::DictionaryValue* file_system = NULL;
386116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(
387116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      file_systems->GetWithoutPathExpansion(kFileSystemId, &file_system_value));
388116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(file_system_value->GetAsDictionary(&file_system));
389116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
390116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::string file_system_id;
391116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(file_system->GetStringWithoutPathExpansion(kPrefKeyFileSystemId,
392116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                                         &file_system_id));
393116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(kFileSystemId, file_system_id);
394116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
395116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::string display_name;
396116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(file_system->GetStringWithoutPathExpansion(kPrefKeyDisplayName,
397116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                                         &display_name));
398116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(kDisplayName, display_name);
399116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
400116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool writable = false;
401116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(
402116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      file_system->GetBooleanWithoutPathExpansion(kPrefKeyWritable, &writable));
403116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(writable);
404116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
405116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_->RemoveObserver(&observer);
40646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
40746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
408116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(FileSystemProviderServiceTest, RememberFileSystem_OnUnmountOnShutdown) {
409116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  LoggingObserver observer;
410116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_->AddObserver(&observer);
41146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
412116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestingPrefServiceSyncable* const pref_service =
413116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      profile_->GetTestingPrefService();
414116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(pref_service);
41546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
416116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  {
417116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_TRUE(service_->MountFileSystem(
418116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        kExtensionId, kFileSystemId, kDisplayName, false /* writable */));
41946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    ASSERT_EQ(1u, observer.mounts.size());
42046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
421116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const base::DictionaryValue* extensions =
422116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        pref_service->GetDictionary(prefs::kFileSystemProviderMounted);
423116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ASSERT_TRUE(extensions);
424116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
425116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const base::DictionaryValue* file_systems = NULL;
426116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ASSERT_TRUE(extensions->GetDictionaryWithoutPathExpansion(kExtensionId,
427116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                                              &file_systems));
428116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_EQ(1u, file_systems->size());
42946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
43046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
431116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  {
432116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_TRUE(service_->UnmountFileSystem(
433116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        kExtensionId, kFileSystemId, Service::UNMOUNT_REASON_SHUTDOWN));
434116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
435116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const base::DictionaryValue* const extensions =
436116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        pref_service->GetDictionary(prefs::kFileSystemProviderMounted);
437116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ASSERT_TRUE(extensions);
438116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
439116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const base::DictionaryValue* file_systems = NULL;
440116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ASSERT_TRUE(extensions->GetDictionaryWithoutPathExpansion(kExtensionId,
441116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                                              &file_systems));
442116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_EQ(1u, file_systems->size());
443116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
444116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
445116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_->RemoveObserver(&observer);
446116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
447116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
448116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(FileSystemProviderServiceTest, RememberFileSystem_OnUnmountByUser) {
449116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  LoggingObserver observer;
450116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_->AddObserver(&observer);
451116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
452116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestingPrefServiceSyncable* const pref_service =
453116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      profile_->GetTestingPrefService();
45446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  ASSERT_TRUE(pref_service);
45546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
456116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  {
457116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_TRUE(service_->MountFileSystem(
458116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        kExtensionId, kFileSystemId, kDisplayName, false /* writable */));
459116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ASSERT_EQ(1u, observer.mounts.size());
46046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
461116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const base::DictionaryValue* extensions =
462116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        pref_service->GetDictionary(prefs::kFileSystemProviderMounted);
463116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ASSERT_TRUE(extensions);
46446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
465116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const base::DictionaryValue* file_systems = NULL;
466116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ASSERT_TRUE(extensions->GetDictionaryWithoutPathExpansion(kExtensionId,
467116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                                              &file_systems));
468116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_EQ(1u, file_systems->size());
469116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
47046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
471116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  {
472116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_TRUE(service_->UnmountFileSystem(
473116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        kExtensionId, kFileSystemId, Service::UNMOUNT_REASON_USER));
474116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
475116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const base::DictionaryValue* const extensions =
476116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        pref_service->GetDictionary(prefs::kFileSystemProviderMounted);
477116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ASSERT_TRUE(extensions);
478116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
479116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const base::DictionaryValue* file_systems = NULL;
480116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_FALSE(extensions->GetDictionaryWithoutPathExpansion(kExtensionId,
481116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                                               &file_systems));
482116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
48346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
484116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  service_->RemoveObserver(&observer);
48546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
48646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
487effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}  // namespace file_system_provider
488effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}  // namespace chromeos
489