OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <set> | 5 #include <set> |
6 #include <string> | 6 #include <string> |
7 | 7 |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/file_util.h" | 9 #include "base/file_util.h" |
10 #include "base/files/scoped_temp_dir.h" | 10 #include "base/files/scoped_temp_dir.h" |
11 #include "base/format_macros.h" | 11 #include "base/format_macros.h" |
12 #include "base/message_loop.h" | 12 #include "base/message_loop.h" |
13 #include "base/stringprintf.h" | 13 #include "base/stringprintf.h" |
14 #include "base/time.h" | 14 #include "base/time.h" |
15 #include "chrome/browser/media_galleries/fileapi/media_file_system_mount_point_p
rovider.h" | 15 #include "chrome/browser/media_galleries/fileapi/media_file_system_mount_point_p
rovider.h" |
16 #include "chrome/browser/media_galleries/fileapi/native_media_file_util.h" | 16 #include "chrome/browser/media_galleries/fileapi/native_media_file_util.h" |
| 17 #include "content/public/test/test_browser_thread.h" |
17 #include "testing/gtest/include/gtest/gtest.h" | 18 #include "testing/gtest/include/gtest/gtest.h" |
18 #include "webkit/browser/fileapi/external_mount_points.h" | 19 #include "webkit/browser/fileapi/external_mount_points.h" |
19 #include "webkit/browser/fileapi/file_system_context.h" | 20 #include "webkit/browser/fileapi/file_system_context.h" |
20 #include "webkit/browser/fileapi/file_system_mount_point_provider.h" | 21 #include "webkit/browser/fileapi/file_system_mount_point_provider.h" |
21 #include "webkit/browser/fileapi/file_system_operation.h" | 22 #include "webkit/browser/fileapi/file_system_operation.h" |
22 #include "webkit/browser/fileapi/file_system_task_runners.h" | 23 #include "webkit/browser/fileapi/file_system_task_runners.h" |
23 #include "webkit/browser/fileapi/file_system_url.h" | 24 #include "webkit/browser/fileapi/file_system_url.h" |
24 #include "webkit/browser/fileapi/isolated_context.h" | 25 #include "webkit/browser/fileapi/isolated_context.h" |
25 #include "webkit/browser/fileapi/mock_file_system_options.h" | 26 #include "webkit/browser/fileapi/mock_file_system_options.h" |
26 #include "webkit/browser/fileapi/native_file_util.h" | 27 #include "webkit/browser/fileapi/native_file_util.h" |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
107 ASSERT_EQ(len, file_util::WriteFile(path, test_cases[i].content, len)); | 108 ASSERT_EQ(len, file_util::WriteFile(path, test_cases[i].content, len)); |
108 } | 109 } |
109 } | 110 } |
110 } | 111 } |
111 | 112 |
112 } // namespace | 113 } // namespace |
113 | 114 |
114 class NativeMediaFileUtilTest : public testing::Test { | 115 class NativeMediaFileUtilTest : public testing::Test { |
115 public: | 116 public: |
116 NativeMediaFileUtilTest() | 117 NativeMediaFileUtilTest() |
117 : file_util_(NULL) { | 118 : io_thread_(content::BrowserThread::IO, &message_loop_) { |
118 } | 119 } |
119 | 120 |
120 virtual void SetUp() { | 121 virtual void SetUp() { |
121 ASSERT_TRUE(data_dir_.CreateUniqueTempDir()); | 122 ASSERT_TRUE(data_dir_.CreateUniqueTempDir()); |
122 ASSERT_TRUE(file_util::CreateDirectory(root_path())); | 123 ASSERT_TRUE(file_util::CreateDirectory(root_path())); |
123 | 124 |
124 scoped_refptr<quota::SpecialStoragePolicy> storage_policy = | 125 scoped_refptr<quota::SpecialStoragePolicy> storage_policy = |
125 new quota::MockSpecialStoragePolicy(); | 126 new quota::MockSpecialStoragePolicy(); |
126 | 127 |
127 ScopedVector<fileapi::FileSystemMountPointProvider> additional_providers; | 128 ScopedVector<fileapi::FileSystemMountPointProvider> additional_providers; |
128 additional_providers.push_back(new MediaFileSystemMountPointProvider( | 129 additional_providers.push_back(new MediaFileSystemMountPointProvider( |
129 data_dir_.path())); | 130 data_dir_.path())); |
130 | 131 |
131 file_system_context_ = | 132 file_system_context_ = |
132 new fileapi::FileSystemContext( | 133 new fileapi::FileSystemContext( |
133 fileapi::FileSystemTaskRunners::CreateMockTaskRunners(), | 134 fileapi::FileSystemTaskRunners::CreateMockTaskRunners(), |
134 fileapi::ExternalMountPoints::CreateRefCounted().get(), | 135 fileapi::ExternalMountPoints::CreateRefCounted().get(), |
135 storage_policy, | 136 storage_policy, |
136 NULL, | 137 NULL, |
137 additional_providers.Pass(), | 138 additional_providers.Pass(), |
138 data_dir_.path(), | 139 data_dir_.path(), |
139 fileapi::CreateAllowFileAccessOptions()); | 140 fileapi::CreateAllowFileAccessOptions()); |
140 | 141 |
141 file_util_ = file_system_context_->GetFileUtil( | |
142 fileapi::kFileSystemTypeNativeMedia); | |
143 | |
144 filesystem_id_ = isolated_context()->RegisterFileSystemForPath( | 142 filesystem_id_ = isolated_context()->RegisterFileSystemForPath( |
145 fileapi::kFileSystemTypeNativeMedia, root_path(), NULL); | 143 fileapi::kFileSystemTypeNativeMedia, root_path(), NULL); |
146 | 144 |
147 isolated_context()->AddReference(filesystem_id_); | 145 isolated_context()->AddReference(filesystem_id_); |
148 } | 146 } |
149 | 147 |
150 virtual void TearDown() { | 148 virtual void TearDown() { |
151 isolated_context()->RemoveReference(filesystem_id_); | 149 isolated_context()->RemoveReference(filesystem_id_); |
152 file_system_context_ = NULL; | 150 file_system_context_ = NULL; |
153 } | 151 } |
(...skipping 18 matching lines...) Expand all Loading... |
172 return data_dir_.path().Append(FPL("Media Directory")); | 170 return data_dir_.path().Append(FPL("Media Directory")); |
173 } | 171 } |
174 | 172 |
175 base::FilePath GetVirtualPath( | 173 base::FilePath GetVirtualPath( |
176 const base::FilePath::CharType* test_case_path) { | 174 const base::FilePath::CharType* test_case_path) { |
177 return base::FilePath::FromUTF8Unsafe(filesystem_id_). | 175 return base::FilePath::FromUTF8Unsafe(filesystem_id_). |
178 Append(FPL("Media Directory")). | 176 Append(FPL("Media Directory")). |
179 Append(base::FilePath(test_case_path)); | 177 Append(base::FilePath(test_case_path)); |
180 } | 178 } |
181 | 179 |
182 fileapi::FileSystemFileUtil* file_util() { | |
183 return file_util_; | |
184 } | |
185 | |
186 GURL origin() { | 180 GURL origin() { |
187 return GURL("http://example.com"); | 181 return GURL("http://example.com"); |
188 } | 182 } |
189 | 183 |
190 fileapi::FileSystemType type() { | 184 fileapi::FileSystemType type() { |
191 return fileapi::kFileSystemTypeNativeMedia; | 185 return fileapi::kFileSystemTypeNativeMedia; |
192 } | 186 } |
193 | 187 |
194 FileSystemOperation* NewOperation(const FileSystemURL& url) { | 188 FileSystemOperation* NewOperation(const FileSystemURL& url) { |
195 return file_system_context_->CreateFileSystemOperation(url, NULL); | 189 return file_system_context_->CreateFileSystemOperation(url, NULL); |
196 } | 190 } |
197 | 191 |
198 private: | 192 private: |
199 base::MessageLoop message_loop_; | 193 base::MessageLoop message_loop_; |
| 194 content::TestBrowserThread io_thread_; |
200 | 195 |
201 base::ScopedTempDir data_dir_; | 196 base::ScopedTempDir data_dir_; |
202 scoped_refptr<fileapi::FileSystemContext> file_system_context_; | 197 scoped_refptr<fileapi::FileSystemContext> file_system_context_; |
203 | 198 |
204 fileapi::FileSystemFileUtil* file_util_; | |
205 std::string filesystem_id_; | 199 std::string filesystem_id_; |
206 | 200 |
207 DISALLOW_COPY_AND_ASSIGN(NativeMediaFileUtilTest); | 201 DISALLOW_COPY_AND_ASSIGN(NativeMediaFileUtilTest); |
208 }; | 202 }; |
209 | 203 |
210 TEST_F(NativeMediaFileUtilTest, DirectoryExistsAndFileExistsFiltering) { | 204 TEST_F(NativeMediaFileUtilTest, DirectoryExistsAndFileExistsFiltering) { |
211 PopulateDirectoryWithTestCases(root_path(), | 205 PopulateDirectoryWithTestCases(root_path(), |
212 kFilteringTestCases, | 206 kFilteringTestCases, |
213 arraysize(kFilteringTestCases)); | 207 arraysize(kFilteringTestCases)); |
214 | 208 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
250 | 244 |
251 for (size_t i = 0; i < arraysize(kFilteringTestCases); ++i) { | 245 for (size_t i = 0; i < arraysize(kFilteringTestCases); ++i) { |
252 base::FilePath::StringType name = | 246 base::FilePath::StringType name = |
253 base::FilePath(kFilteringTestCases[i].path).BaseName().value(); | 247 base::FilePath(kFilteringTestCases[i].path).BaseName().value(); |
254 std::set<base::FilePath::StringType>::const_iterator found = | 248 std::set<base::FilePath::StringType>::const_iterator found = |
255 content.find(name); | 249 content.find(name); |
256 EXPECT_EQ(kFilteringTestCases[i].visible, found != content.end()); | 250 EXPECT_EQ(kFilteringTestCases[i].visible, found != content.end()); |
257 } | 251 } |
258 } | 252 } |
259 | 253 |
260 TEST_F(NativeMediaFileUtilTest, CreateFileAndCreateDirectoryFiltering) { | 254 TEST_F(NativeMediaFileUtilTest, CreateDirectoryFiltering) { |
261 // Run the loop twice. The second loop attempts to create files that are | 255 // Run the loop twice. The second loop attempts to create directories that are |
262 // pre-existing. Though the result should be the same. | 256 // pre-existing. Though the result should be the same. |
263 for (int loop_count = 0; loop_count < 2; ++loop_count) { | 257 for (int loop_count = 0; loop_count < 2; ++loop_count) { |
264 for (size_t i = 0; i < arraysize(kFilteringTestCases); ++i) { | 258 for (size_t i = 0; i < arraysize(kFilteringTestCases); ++i) { |
265 FileSystemURL root_url = CreateURL(FPL("")); | 259 FileSystemURL root_url = CreateURL(FPL("")); |
266 FileSystemOperation* operation = NewOperation(root_url); | 260 FileSystemOperation* operation = NewOperation(root_url); |
267 | 261 |
268 FileSystemURL url = CreateURL(kFilteringTestCases[i].path); | 262 FileSystemURL url = CreateURL(kFilteringTestCases[i].path); |
269 | 263 |
270 std::string test_name = base::StringPrintf( | 264 std::string test_name = base::StringPrintf( |
271 "CreateFileAndCreateDirectoryFiltering run %d, test %" PRIuS, | 265 "CreateFileAndCreateDirectoryFiltering run %d, test %" PRIuS, |
272 loop_count, i); | 266 loop_count, i); |
273 base::PlatformFileError expectation = | 267 base::PlatformFileError expectation = |
274 kFilteringTestCases[i].visible ? | 268 kFilteringTestCases[i].visible ? |
275 base::PLATFORM_FILE_OK : | 269 base::PLATFORM_FILE_OK : |
276 base::PLATFORM_FILE_ERROR_SECURITY; | 270 base::PLATFORM_FILE_ERROR_SECURITY; |
277 if (kFilteringTestCases[i].is_directory) { | 271 if (kFilteringTestCases[i].is_directory) { |
278 operation->CreateDirectory( | 272 operation->CreateDirectory( |
279 url, false, false, | 273 url, false, false, |
280 base::Bind(&ExpectEqHelper, test_name, expectation)); | 274 base::Bind(&ExpectEqHelper, test_name, expectation)); |
281 } else { | |
282 operation->CreateFile( | |
283 url, false, base::Bind(&ExpectEqHelper, test_name, expectation)); | |
284 } | 275 } |
285 base::MessageLoop::current()->RunUntilIdle(); | 276 base::MessageLoop::current()->RunUntilIdle(); |
286 } | 277 } |
287 } | 278 } |
288 } | 279 } |
289 | 280 |
290 TEST_F(NativeMediaFileUtilTest, CopySourceFiltering) { | 281 TEST_F(NativeMediaFileUtilTest, CopySourceFiltering) { |
291 base::FilePath dest_path = root_path().AppendASCII("dest"); | 282 base::FilePath dest_path = root_path().AppendASCII("dest"); |
292 FileSystemURL dest_url = CreateURL(FPL("dest")); | 283 FileSystemURL dest_url = CreateURL(FPL("dest")); |
293 | 284 |
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
523 operation->GetMetadata(url, | 514 operation->GetMetadata(url, |
524 base::Bind(&ExpectMetadataEqHelper, | 515 base::Bind(&ExpectMetadataEqHelper, |
525 test_name, | 516 test_name, |
526 expectation, | 517 expectation, |
527 kFilteringTestCases[i].is_directory)); | 518 kFilteringTestCases[i].is_directory)); |
528 base::MessageLoop::current()->RunUntilIdle(); | 519 base::MessageLoop::current()->RunUntilIdle(); |
529 } | 520 } |
530 } | 521 } |
531 } | 522 } |
532 | 523 |
533 TEST_F(NativeMediaFileUtilTest, RemoveFiltering) { | |
534 // Run the loop twice. The first run has no files. The second run does. | |
535 for (int loop_count = 0; loop_count < 2; ++loop_count) { | |
536 if (loop_count == 1) { | |
537 PopulateDirectoryWithTestCases(root_path(), | |
538 kFilteringTestCases, | |
539 arraysize(kFilteringTestCases)); | |
540 } | |
541 for (size_t i = 0; i < arraysize(kFilteringTestCases); ++i) { | |
542 FileSystemURL root_url = CreateURL(FPL("")); | |
543 FileSystemOperation* operation = NewOperation(root_url); | |
544 | |
545 FileSystemURL url = CreateURL(kFilteringTestCases[i].path); | |
546 | |
547 std::string test_name = base::StringPrintf( | |
548 "RemoveFiltering run %d test %" PRIuS, loop_count, i); | |
549 base::PlatformFileError expectation = base::PLATFORM_FILE_OK; | |
550 if (loop_count == 0 || !kFilteringTestCases[i].visible) { | |
551 // Cannot remove files that do not exist or are not visible. | |
552 expectation = base::PLATFORM_FILE_ERROR_NOT_FOUND; | |
553 } | |
554 operation->Remove( | |
555 url, false, base::Bind(&ExpectEqHelper, test_name, expectation)); | |
556 base::MessageLoop::current()->RunUntilIdle(); | |
557 } | |
558 } | |
559 } | |
560 | |
561 TEST_F(NativeMediaFileUtilTest, TruncateFiltering) { | |
562 // Run the loop twice. The first run has no files. The second run does. | |
563 for (int loop_count = 0; loop_count < 2; ++loop_count) { | |
564 if (loop_count == 1) { | |
565 PopulateDirectoryWithTestCases(root_path(), | |
566 kFilteringTestCases, | |
567 arraysize(kFilteringTestCases)); | |
568 } | |
569 for (size_t i = 0; i < arraysize(kFilteringTestCases); ++i) { | |
570 FileSystemURL root_url = CreateURL(FPL("")); | |
571 FileSystemOperation* operation = NewOperation(root_url); | |
572 | |
573 FileSystemURL url = CreateURL(kFilteringTestCases[i].path); | |
574 | |
575 std::string test_name = base::StringPrintf( | |
576 "TruncateFiltering run %d test %" PRIuS, loop_count, i); | |
577 base::PlatformFileError expectation = base::PLATFORM_FILE_OK; | |
578 if (loop_count == 0 || !kFilteringTestCases[i].visible) { | |
579 // Cannot truncate files that do not exist or are not visible. | |
580 expectation = base::PLATFORM_FILE_ERROR_NOT_FOUND; | |
581 } else if (kFilteringTestCases[i].is_directory) { | |
582 // Cannot truncate directories. | |
583 expectation = base::PLATFORM_FILE_ERROR_ACCESS_DENIED; | |
584 } | |
585 operation->Truncate( | |
586 url, 0, base::Bind(&ExpectEqHelper, test_name, expectation)); | |
587 base::MessageLoop::current()->RunUntilIdle(); | |
588 } | |
589 } | |
590 } | |
591 | |
592 TEST_F(NativeMediaFileUtilTest, TouchFileFiltering) { | |
593 base::Time time = base::Time::Now(); | |
594 | |
595 // Run the loop twice. The first run has no files. The second run does. | |
596 for (int loop_count = 0; loop_count < 2; ++loop_count) { | |
597 if (loop_count == 1) { | |
598 PopulateDirectoryWithTestCases(root_path(), | |
599 kFilteringTestCases, | |
600 arraysize(kFilteringTestCases)); | |
601 } | |
602 for (size_t i = 0; i < arraysize(kFilteringTestCases); ++i) { | |
603 FileSystemURL root_url = CreateURL(FPL("")); | |
604 FileSystemOperation* operation = NewOperation(root_url); | |
605 | |
606 FileSystemURL url = CreateURL(kFilteringTestCases[i].path); | |
607 | |
608 std::string test_name = base::StringPrintf( | |
609 "TouchFileFiltering run %d test %" PRIuS, loop_count, i); | |
610 base::PlatformFileError expectation = base::PLATFORM_FILE_OK; | |
611 if (loop_count == 0 || !kFilteringTestCases[i].visible) { | |
612 // Files do not exists. Touch fails. | |
613 expectation = base::PLATFORM_FILE_ERROR_FAILED; | |
614 } | |
615 operation->TouchFile( | |
616 url, time, time, base::Bind(&ExpectEqHelper, test_name, expectation)); | |
617 base::MessageLoop::current()->RunUntilIdle(); | |
618 } | |
619 } | |
620 } | |
621 | |
622 void CreateSnapshotCallback(base::PlatformFileError* error, | 524 void CreateSnapshotCallback(base::PlatformFileError* error, |
623 base::PlatformFileError result, const base::PlatformFileInfo&, | 525 base::PlatformFileError result, const base::PlatformFileInfo&, |
624 const base::FilePath&, | 526 const base::FilePath&, |
625 const scoped_refptr<webkit_blob::ShareableFileReference>&) { | 527 const scoped_refptr<webkit_blob::ShareableFileReference>&) { |
626 *error = result; | 528 *error = result; |
627 } | 529 } |
628 | 530 |
629 TEST_F(NativeMediaFileUtilTest, CreateSnapshot) { | 531 TEST_F(NativeMediaFileUtilTest, CreateSnapshot) { |
630 PopulateDirectoryWithTestCases(root_path(), | 532 PopulateDirectoryWithTestCases(root_path(), |
631 kFilteringTestCases, | 533 kFilteringTestCases, |
(...skipping 13 matching lines...) Expand all Loading... |
645 expected_error = base::PLATFORM_FILE_ERROR_SECURITY; | 547 expected_error = base::PLATFORM_FILE_ERROR_SECURITY; |
646 error = base::PLATFORM_FILE_ERROR_FAILED; | 548 error = base::PLATFORM_FILE_ERROR_FAILED; |
647 operation->CreateSnapshotFile(url, | 549 operation->CreateSnapshotFile(url, |
648 base::Bind(CreateSnapshotCallback, &error)); | 550 base::Bind(CreateSnapshotCallback, &error)); |
649 base::MessageLoop::current()->RunUntilIdle(); | 551 base::MessageLoop::current()->RunUntilIdle(); |
650 ASSERT_EQ(expected_error, error); | 552 ASSERT_EQ(expected_error, error); |
651 } | 553 } |
652 } | 554 } |
653 | 555 |
654 } // namespace chrome | 556 } // namespace chrome |
OLD | NEW |