Upstream version 11.40.277.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / media_galleries / fileapi / itunes_file_util_unittest.cc
1 // Copyright 2013 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 <set>
6 #include <string>
7 #include <vector>
8
9 #include "base/bind.h"
10 #include "base/bind_helpers.h"
11 #include "base/files/file_util.h"
12 #include "base/files/scoped_temp_dir.h"
13 #include "base/run_loop.h"
14 #include "base/synchronization/waitable_event.h"
15 #include "base/time/time.h"
16 #include "chrome/browser/media_galleries/fileapi/itunes_data_provider.h"
17 #include "chrome/browser/media_galleries/fileapi/itunes_file_util.h"
18 #include "chrome/browser/media_galleries/fileapi/media_file_system_backend.h"
19 #include "chrome/browser/media_galleries/fileapi/media_path_filter.h"
20 #include "chrome/browser/media_galleries/imported_media_gallery_registry.h"
21 #include "content/public/browser/browser_thread.h"
22 #include "content/public/test/mock_special_storage_policy.h"
23 #include "content/public/test/test_browser_thread.h"
24 #include "content/public/test/test_file_system_options.h"
25 #include "storage/browser/fileapi/async_file_util.h"
26 #include "storage/browser/fileapi/external_mount_points.h"
27 #include "storage/browser/fileapi/file_system_context.h"
28 #include "storage/browser/fileapi/file_system_operation_context.h"
29 #include "storage/browser/fileapi/file_system_operation_runner.h"
30 #include "testing/gtest/include/gtest/gtest.h"
31
32 using storage::FileSystemOperationContext;
33 using storage::FileSystemOperation;
34 using storage::FileSystemURL;
35
36 namespace itunes {
37
38 namespace {
39
40 void ReadDirectoryTestHelperCallback(
41     base::RunLoop* run_loop,
42     FileSystemOperation::FileEntryList* contents,
43     bool* completed, base::File::Error error,
44     const FileSystemOperation::FileEntryList& file_list,
45     bool has_more) {
46   DCHECK(!*completed);
47   *completed = (!has_more && error == base::File::FILE_OK);
48   *contents = file_list;
49   run_loop->Quit();
50 }
51
52 void ReadDirectoryTestHelper(storage::FileSystemOperationRunner* runner,
53                              const FileSystemURL& url,
54                              FileSystemOperation::FileEntryList* contents,
55                              bool* completed) {
56   DCHECK(contents);
57   DCHECK(completed);
58   base::RunLoop run_loop;
59   runner->ReadDirectory(
60       url, base::Bind(&ReadDirectoryTestHelperCallback, &run_loop, contents,
61                       completed));
62   run_loop.Run();
63 }
64
65 }  // namespace
66
67 class TestITunesDataProvider : public ITunesDataProvider {
68  public:
69   explicit TestITunesDataProvider(const base::FilePath& fake_library_path)
70      : ITunesDataProvider(fake_library_path) {
71     EXPECT_TRUE(fake_auto_add_dir_.CreateUniqueTempDir());
72   }
73
74   ~TestITunesDataProvider() override {}
75
76   void RefreshData(const ReadyCallback& ready_callback) override {
77     ready_callback.Run(true /* success */);
78   }
79
80   const base::FilePath& auto_add_path() const override {
81     return fake_auto_add_dir_.path();
82   }
83
84   void SetProvideAutoAddDir(bool provide_auto_add_dir) {
85     if (provide_auto_add_dir) {
86       if (!fake_auto_add_dir_.IsValid())
87         ASSERT_TRUE(fake_auto_add_dir_.CreateUniqueTempDir());
88     } else {
89       ASSERT_TRUE(fake_auto_add_dir_.Delete());
90     }
91   }
92
93  private:
94   base::ScopedTempDir fake_auto_add_dir_;
95 };
96
97 class TestITunesFileUtil : public ITunesFileUtil {
98  public:
99   explicit TestITunesFileUtil(MediaPathFilter* media_path_filter,
100                               ITunesDataProvider* data_provider)
101       : ITunesFileUtil(media_path_filter),
102         data_provider_(data_provider) {
103   }
104   ~TestITunesFileUtil() override {}
105
106  private:
107   ITunesDataProvider* GetDataProvider() override { return data_provider_; }
108
109   ITunesDataProvider* data_provider_;
110 };
111
112 class TestMediaFileSystemBackend : public MediaFileSystemBackend {
113  public:
114   TestMediaFileSystemBackend(const base::FilePath& profile_path,
115                              ITunesFileUtil* itunes_file_util)
116       : MediaFileSystemBackend(
117             profile_path,
118             MediaFileSystemBackend::MediaTaskRunner().get()),
119         test_file_util_(itunes_file_util) {}
120
121   storage::AsyncFileUtil* GetAsyncFileUtil(
122       storage::FileSystemType type) override {
123     if (type != storage::kFileSystemTypeItunes)
124       return NULL;
125
126     return test_file_util_.get();
127   }
128
129  private:
130   scoped_ptr<storage::AsyncFileUtil> test_file_util_;
131 };
132
133 class ItunesFileUtilTest : public testing::Test {
134  public:
135   ItunesFileUtilTest()
136       : io_thread_(content::BrowserThread::IO, &message_loop_) {
137   }
138   virtual ~ItunesFileUtilTest() {}
139
140   void SetUpDataProvider() {
141     ASSERT_TRUE(fake_library_dir_.CreateUniqueTempDir());
142     ASSERT_EQ(
143         0,
144         base::WriteFile(
145             fake_library_dir_.path().AppendASCII(kITunesLibraryXML),
146             NULL,
147             0));
148
149     itunes_data_provider_.reset(
150         new TestITunesDataProvider(fake_library_dir_.path()));
151   }
152
153   virtual void SetUp() override {
154     ASSERT_TRUE(profile_dir_.CreateUniqueTempDir());
155     ImportedMediaGalleryRegistry::GetInstance()->Initialize();
156
157     scoped_refptr<storage::SpecialStoragePolicy> storage_policy =
158         new content::MockSpecialStoragePolicy();
159
160     // Initialize fake ItunesDataProvider on media task runner thread.
161     MediaFileSystemBackend::MediaTaskRunner()->PostTask(
162         FROM_HERE,
163         base::Bind(&ItunesFileUtilTest::SetUpDataProvider,
164                    base::Unretained(this)));
165     base::WaitableEvent event(true, false /* initially_signalled */);
166     MediaFileSystemBackend::MediaTaskRunner()->PostTask(
167         FROM_HERE,
168         base::Bind(&base::WaitableEvent::Signal, base::Unretained(&event)));
169     event.Wait();
170
171     media_path_filter_.reset(new MediaPathFilter());
172     ScopedVector<storage::FileSystemBackend> additional_providers;
173     additional_providers.push_back(new TestMediaFileSystemBackend(
174         profile_dir_.path(),
175         new TestITunesFileUtil(media_path_filter_.get(),
176                                itunes_data_provider_.get())));
177
178     file_system_context_ = new storage::FileSystemContext(
179         base::MessageLoopProxy::current().get(),
180         base::MessageLoopProxy::current().get(),
181         storage::ExternalMountPoints::CreateRefCounted().get(),
182         storage_policy.get(),
183         NULL,
184         additional_providers.Pass(),
185         std::vector<storage::URLRequestAutoMountHandler>(),
186         profile_dir_.path(),
187         content::CreateAllowFileAccessOptions());
188   }
189
190  protected:
191   void TestNonexistentFolder(const std::string& path_append) {
192     FileSystemOperation::FileEntryList contents;
193     FileSystemURL url = CreateURL(path_append);
194     bool completed = false;
195     ReadDirectoryTestHelper(operation_runner(), url, &contents, &completed);
196
197     ASSERT_FALSE(completed);
198   }
199
200   FileSystemURL CreateURL(const std::string& path) const {
201     base::FilePath virtual_path =
202         ImportedMediaGalleryRegistry::GetInstance()->ImportedRoot();
203     virtual_path = virtual_path.AppendASCII("itunes");
204     virtual_path = virtual_path.AppendASCII(path);
205     return file_system_context_->CreateCrackedFileSystemURL(
206         GURL("http://www.example.com"),
207         storage::kFileSystemTypeItunes,
208         virtual_path);
209   }
210
211   storage::FileSystemOperationRunner* operation_runner() const {
212     return file_system_context_->operation_runner();
213   }
214
215   scoped_refptr<storage::FileSystemContext> file_system_context() const {
216     return file_system_context_;
217   }
218
219   TestITunesDataProvider* data_provider() const {
220     return itunes_data_provider_.get();
221   }
222
223  private:
224   base::MessageLoop message_loop_;
225   content::TestBrowserThread io_thread_;
226
227   base::ScopedTempDir profile_dir_;
228   base::ScopedTempDir fake_library_dir_;
229
230   scoped_refptr<storage::FileSystemContext> file_system_context_;
231   scoped_ptr<MediaPathFilter> media_path_filter_;
232   scoped_ptr<TestITunesDataProvider> itunes_data_provider_;
233
234   DISALLOW_COPY_AND_ASSIGN(ItunesFileUtilTest);
235 };
236
237 TEST_F(ItunesFileUtilTest, RootContents) {
238   FileSystemOperation::FileEntryList contents;
239   FileSystemURL url = CreateURL("");
240   bool completed = false;
241   ReadDirectoryTestHelper(operation_runner(), url, &contents, &completed);
242
243   ASSERT_TRUE(completed);
244   ASSERT_EQ(2u, contents.size());
245
246   EXPECT_FALSE(contents.front().is_directory);
247   EXPECT_TRUE(contents.back().is_directory);
248
249   EXPECT_EQ(base::FilePath::FromUTF8Unsafe(kITunesLibraryXML).value(),
250             contents.front().name);
251   EXPECT_EQ(base::FilePath::FromUTF8Unsafe(kITunesMediaDir).value(),
252             contents.back().name);
253 }
254
255 TEST_F(ItunesFileUtilTest, ItunesMediaDirectoryContentsNoAutoAdd) {
256   data_provider()->SetProvideAutoAddDir(false);
257
258   FileSystemOperation::FileEntryList contents;
259   FileSystemURL url = CreateURL(kITunesMediaDir);
260   bool completed = false;
261   ReadDirectoryTestHelper(operation_runner(), url, &contents, &completed);
262
263   ASSERT_TRUE(completed);
264   ASSERT_EQ(1u, contents.size());
265
266   EXPECT_TRUE(contents.front().is_directory);
267   EXPECT_EQ(base::FilePath::FromUTF8Unsafe(kITunesMusicDir).value(),
268             contents.back().name);
269 }
270
271 TEST_F(ItunesFileUtilTest, ItunesMediaDirectoryContentsAutoAdd) {
272   data_provider()->SetProvideAutoAddDir(true);
273
274   FileSystemOperation::FileEntryList contents;
275   FileSystemURL url = CreateURL(kITunesMediaDir);
276   bool completed = false;
277   ReadDirectoryTestHelper(operation_runner(), url, &contents, &completed);
278
279   ASSERT_TRUE(completed);
280   ASSERT_EQ(2u, contents.size());
281
282   EXPECT_TRUE(contents.front().is_directory);
283   EXPECT_TRUE(contents.back().is_directory);
284
285   EXPECT_EQ(base::FilePath::FromUTF8Unsafe(kITunesAutoAddDir).value(),
286             contents.front().name);
287   EXPECT_EQ(base::FilePath::FromUTF8Unsafe(kITunesMusicDir).value(),
288             contents.back().name);
289 }
290
291 TEST_F(ItunesFileUtilTest, ItunesAutoAddDirEnumerate) {
292   data_provider()->SetProvideAutoAddDir(true);
293   ASSERT_EQ(0, base::WriteFile(
294       data_provider()->auto_add_path().AppendASCII("baz.ogg"), NULL, 0));
295
296   FileSystemOperation::FileEntryList contents;
297   FileSystemURL url = CreateURL(
298       std::string(kITunesMediaDir) + "/" + kITunesAutoAddDir);
299   bool completed = false;
300
301   ReadDirectoryTestHelper(operation_runner(), url, &contents, &completed);
302   ASSERT_TRUE(completed);
303   ASSERT_EQ(1u, contents.size());
304   EXPECT_FALSE(contents.front().is_directory);
305   EXPECT_EQ(base::FilePath().AppendASCII("baz.ogg").value(),
306             contents.front().name);
307 }
308
309 TEST_F(ItunesFileUtilTest, ItunesAutoAddDirEnumerateNested) {
310   data_provider()->SetProvideAutoAddDir(true);
311   base::FilePath nested_dir =
312       data_provider()->auto_add_path().AppendASCII("foo").AppendASCII("bar");
313   ASSERT_TRUE(base::CreateDirectory(nested_dir));
314   ASSERT_EQ(0,
315             base::WriteFile(nested_dir.AppendASCII("baz.ogg"), NULL, 0));
316
317   FileSystemOperation::FileEntryList contents;
318   FileSystemURL url = CreateURL(
319       std::string(kITunesMediaDir) + "/" + kITunesAutoAddDir);
320   bool completed = false;
321
322   ReadDirectoryTestHelper(operation_runner(), url, &contents, &completed);
323   ASSERT_TRUE(completed);
324   ASSERT_EQ(1u, contents.size());
325   EXPECT_TRUE(contents.front().is_directory);
326   EXPECT_EQ(base::FilePath().AppendASCII("foo").value(), contents.front().name);
327
328   contents.clear();
329   url = CreateURL(
330       std::string(kITunesMediaDir) + "/" + kITunesAutoAddDir + "/foo");
331   completed = false;
332   ReadDirectoryTestHelper(operation_runner(), url, &contents, &completed);
333   ASSERT_TRUE(completed);
334   ASSERT_EQ(1u, contents.size());
335   EXPECT_TRUE(contents.front().is_directory);
336   EXPECT_EQ(base::FilePath().AppendASCII("bar").value(), contents.front().name);
337
338   contents.clear();
339   url = CreateURL(
340       std::string(kITunesMediaDir) + "/" + kITunesAutoAddDir + "/foo/bar");
341   completed = false;
342   ReadDirectoryTestHelper(operation_runner(), url, &contents, &completed);
343   ASSERT_TRUE(completed);
344   ASSERT_EQ(1u, contents.size());
345   EXPECT_FALSE(contents.front().is_directory);
346   EXPECT_EQ(base::FilePath().AppendASCII("baz.ogg").value(),
347             contents.front().name);
348 }
349
350 }  // namespace itunes