service_unittest.cc revision c5cede9ae108bb15f6b7a8aea21c7e1fefa2834c
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
3// found in the LICENSE file.
4
5#include <string>
6#include <vector>
7
8#include "base/files/file.h"
9#include "base/memory/scoped_ptr.h"
10#include "chrome/browser/chromeos/file_system_provider/observer.h"
11#include "chrome/browser/chromeos/file_system_provider/provided_file_system.h"
12#include "chrome/browser/chromeos/file_system_provider/service.h"
13#include "chrome/browser/chromeos/login/fake_user_manager.h"
14#include "chrome/test/base/testing_profile.h"
15#include "content/public/test/test_browser_thread_bundle.h"
16#include "testing/gtest/include/gtest/gtest.h"
17#include "webkit/browser/fileapi/external_mount_points.h"
18
19namespace chromeos {
20namespace file_system_provider {
21namespace {
22
23const char kExtensionId[] = "mbflcebpggnecokmikipoihdbecnjfoj";
24const char kFileSystemName[] = "Camera Pictures";
25
26// Utility observer, logging events from file_system_provider::Service.
27class LoggingObserver : public Observer {
28 public:
29  class Event {
30   public:
31    Event(const ProvidedFileSystem& file_system, base::File::Error error)
32        : file_system_(file_system), error_(error) {}
33    ~Event() {}
34
35    const ProvidedFileSystem& file_system() { return file_system_; }
36    base::File::Error error() { return error_; }
37
38   private:
39    ProvidedFileSystem file_system_;
40    base::File::Error error_;
41  };
42
43  LoggingObserver() {}
44  virtual ~LoggingObserver() {}
45
46  // file_system_provider::Observer overrides.
47  virtual void OnProvidedFileSystemMount(const ProvidedFileSystem& file_system,
48                                         base::File::Error error) OVERRIDE {
49    mounts.push_back(Event(file_system, error));
50  }
51
52  virtual void OnProvidedFileSystemUnmount(
53      const ProvidedFileSystem& file_system,
54      base::File::Error error) OVERRIDE {
55    unmounts.push_back(Event(file_system, error));
56  }
57
58  std::vector<Event> mounts;
59  std::vector<Event> unmounts;
60};
61
62}  // namespace
63
64class FileSystemProviderServiceTest : public testing::Test {
65 protected:
66  FileSystemProviderServiceTest() {}
67  virtual ~FileSystemProviderServiceTest() {}
68
69  virtual void SetUp() OVERRIDE {
70    user_manager_ = new FakeUserManager();
71    user_manager_enabler_.reset(new ScopedUserManagerEnabler(user_manager_));
72    profile_.reset(new TestingProfile);
73    user_manager_->AddUser(profile_->GetProfileName());
74    file_system_provider_service_.reset(new Service(profile_.get()));
75  }
76
77  virtual void TearDown() {
78    fileapi::ExternalMountPoints::GetSystemInstance()->RevokeAllFileSystems();
79  }
80
81  content::TestBrowserThreadBundle thread_bundle_;
82  scoped_ptr<TestingProfile> profile_;
83  scoped_ptr<ScopedUserManagerEnabler> user_manager_enabler_;
84  FakeUserManager* user_manager_;
85  scoped_ptr<Service> file_system_provider_service_;
86};
87
88TEST_F(FileSystemProviderServiceTest, MountFileSystem) {
89  LoggingObserver observer;
90  file_system_provider_service_->AddObserver(&observer);
91
92  int file_system_id = file_system_provider_service_->MountFileSystem(
93      kExtensionId, kFileSystemName);
94
95  EXPECT_LT(0, file_system_id);
96  ASSERT_EQ(1u, observer.mounts.size());
97  EXPECT_EQ(kExtensionId, observer.mounts[0].file_system().extension_id());
98  EXPECT_EQ(1, observer.mounts[0].file_system().file_system_id());
99  EXPECT_EQ("/provided/mbflcebpggnecokmikipoihdbecnjfoj-1-testing_profile-hash",
100            observer.mounts[0].file_system().mount_path().AsUTF8Unsafe());
101  EXPECT_EQ(kFileSystemName,
102            observer.mounts[0].file_system().file_system_name());
103  EXPECT_EQ(base::File::FILE_OK, observer.mounts[0].error());
104  ASSERT_EQ(0u, observer.unmounts.size());
105
106  std::vector<ProvidedFileSystem> provided_file_systems =
107      file_system_provider_service_->GetMountedFileSystems();
108  ASSERT_EQ(1u, provided_file_systems.size());
109
110  file_system_provider_service_->RemoveObserver(&observer);
111}
112
113TEST_F(FileSystemProviderServiceTest, MountFileSystem_UniqueIds) {
114  LoggingObserver observer;
115  file_system_provider_service_->AddObserver(&observer);
116
117  int file_system_first_id = file_system_provider_service_->MountFileSystem(
118      kExtensionId, kFileSystemName);
119  EXPECT_LT(0, file_system_first_id);
120
121  int file_system_second_id = file_system_provider_service_->MountFileSystem(
122      kExtensionId, kFileSystemName);
123  EXPECT_LT(0, file_system_second_id);
124
125  EXPECT_NE(file_system_first_id, file_system_second_id);
126  ASSERT_EQ(2u, observer.mounts.size());
127  EXPECT_EQ(base::File::FILE_OK, observer.mounts[0].error());
128  EXPECT_EQ(base::File::FILE_OK, observer.mounts[1].error());
129
130  std::vector<ProvidedFileSystem> provided_file_systems =
131      file_system_provider_service_->GetMountedFileSystems();
132  ASSERT_EQ(2u, provided_file_systems.size());
133
134  file_system_provider_service_->RemoveObserver(&observer);
135}
136
137TEST_F(FileSystemProviderServiceTest, MountFileSystem_StressTest) {
138  LoggingObserver observer;
139  file_system_provider_service_->AddObserver(&observer);
140
141  const size_t kMaxFileSystems = 16;
142  for (size_t i = 0; i < kMaxFileSystems; ++i) {
143    int file_system_id = file_system_provider_service_->MountFileSystem(
144        kExtensionId, kFileSystemName);
145    EXPECT_LT(0, file_system_id);
146  }
147  ASSERT_EQ(kMaxFileSystems, observer.mounts.size());
148
149  // The next file system is out of limit, and registering it should fail.
150  int file_system_id = file_system_provider_service_->MountFileSystem(
151      kExtensionId, kFileSystemName);
152  EXPECT_EQ(0, file_system_id);
153
154  ASSERT_EQ(kMaxFileSystems + 1, observer.mounts.size());
155  EXPECT_EQ(base::File::FILE_ERROR_TOO_MANY_OPENED,
156            observer.mounts[kMaxFileSystems].error());
157  ASSERT_EQ(kMaxFileSystems,
158            file_system_provider_service_->GetMountedFileSystems().size());
159
160  std::vector<ProvidedFileSystem> provided_file_systems =
161      file_system_provider_service_->GetMountedFileSystems();
162  ASSERT_EQ(kMaxFileSystems, provided_file_systems.size());
163
164  file_system_provider_service_->RemoveObserver(&observer);
165}
166
167TEST_F(FileSystemProviderServiceTest, UnmountFileSystem) {
168  LoggingObserver observer;
169  file_system_provider_service_->AddObserver(&observer);
170
171  int file_system_id = file_system_provider_service_->MountFileSystem(
172      kExtensionId, kFileSystemName);
173  EXPECT_LT(0, file_system_id);
174  ASSERT_EQ(1u, observer.mounts.size());
175
176  const bool result = file_system_provider_service_->UnmountFileSystem(
177      kExtensionId, file_system_id);
178  EXPECT_TRUE(result);
179  ASSERT_EQ(1u, observer.unmounts.size());
180  EXPECT_EQ(base::File::FILE_OK, observer.unmounts[0].error());
181
182  EXPECT_EQ(kExtensionId, observer.unmounts[0].file_system().extension_id());
183  EXPECT_EQ(1, observer.unmounts[0].file_system().file_system_id());
184  EXPECT_EQ("/provided/mbflcebpggnecokmikipoihdbecnjfoj-1-testing_profile-hash",
185            observer.unmounts[0].file_system().mount_path().AsUTF8Unsafe());
186  EXPECT_EQ(kFileSystemName,
187            observer.unmounts[0].file_system().file_system_name());
188
189  std::vector<ProvidedFileSystem> provided_file_systems =
190      file_system_provider_service_->GetMountedFileSystems();
191  ASSERT_EQ(0u, provided_file_systems.size());
192
193  file_system_provider_service_->RemoveObserver(&observer);
194}
195
196TEST_F(FileSystemProviderServiceTest, UnmountFileSystem_WrongExtensionId) {
197  LoggingObserver observer;
198  file_system_provider_service_->AddObserver(&observer);
199
200  const std::string kWrongExtensionId = "helloworldhelloworldhelloworldhe";
201
202  int file_system_id = file_system_provider_service_->MountFileSystem(
203      kExtensionId, kFileSystemName);
204  EXPECT_LT(0, file_system_id);
205  ASSERT_EQ(1u, observer.mounts.size());
206  ASSERT_EQ(1u, file_system_provider_service_->GetMountedFileSystems().size());
207
208  const bool result = file_system_provider_service_->UnmountFileSystem(
209      kWrongExtensionId, file_system_id);
210  EXPECT_FALSE(result);
211  ASSERT_EQ(1u, observer.unmounts.size());
212  EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND, observer.unmounts[0].error());
213  ASSERT_EQ(1u, file_system_provider_service_->GetMountedFileSystems().size());
214
215  std::vector<ProvidedFileSystem> provided_file_systems =
216      file_system_provider_service_->GetMountedFileSystems();
217  ASSERT_EQ(1u, provided_file_systems.size());
218
219  file_system_provider_service_->RemoveObserver(&observer);
220}
221
222}  // namespace file_system_provider
223}  // namespace chromeos
224