Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 <string.h> | 5 #include <string.h> |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 #include <string> | 8 #include <string> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| 11 #include "base/files/file_path.h" | 11 #include "base/files/file_path.h" |
| 12 #include "base/memory/ptr_util.h" | 12 #include "base/memory/ptr_util.h" |
| 13 #include "base/run_loop.h" | 13 #include "base/run_loop.h" |
| 14 #include "chrome/browser/chromeos/arc/fileapi/arc_documents_provider_root.h" | 14 #include "chrome/browser/chromeos/arc/fileapi/arc_documents_provider_root.h" |
| 15 #include "chrome/browser/chromeos/arc/fileapi/arc_documents_provider_util.h" | 15 #include "chrome/browser/chromeos/arc/fileapi/arc_documents_provider_util.h" |
| 16 #include "chrome/browser/chromeos/arc/fileapi/arc_file_system_operation_runner.h " | |
| 16 #include "components/arc/arc_bridge_service.h" | 17 #include "components/arc/arc_bridge_service.h" |
| 17 #include "components/arc/arc_service_manager.h" | 18 #include "components/arc/arc_service_manager.h" |
| 18 #include "components/arc/file_system/test/fake_arc_file_system_operation_runner. h" | 19 #include "components/arc/test/fake_file_system_instance.h" |
| 19 #include "content/public/test/test_browser_thread_bundle.h" | 20 #include "content/public/test/test_browser_thread_bundle.h" |
| 20 #include "storage/common/fileapi/directory_entry.h" | 21 #include "storage/common/fileapi/directory_entry.h" |
| 21 #include "testing/gtest/include/gtest/gtest.h" | 22 #include "testing/gtest/include/gtest/gtest.h" |
| 22 #include "url/gurl.h" | 23 #include "url/gurl.h" |
| 23 | 24 |
| 24 using storage::DirectoryEntry; | 25 using storage::DirectoryEntry; |
| 26 using DocumentSpec = arc::FakeFileSystemInstance::DocumentSpec; | |
| 25 using EntryList = storage::AsyncFileUtil::EntryList; | 27 using EntryList = storage::AsyncFileUtil::EntryList; |
| 26 | 28 |
| 27 namespace arc { | 29 namespace arc { |
| 28 | 30 |
| 29 namespace { | 31 namespace { |
| 30 | 32 |
| 31 struct DocumentSpec { | |
| 32 const char* document_id; | |
| 33 const char* display_name; | |
| 34 const char* mime_type; | |
| 35 int64_t size; | |
| 36 uint64_t last_modified; | |
| 37 }; | |
| 38 | |
| 39 // Fake file system hierarchy: | 33 // Fake file system hierarchy: |
| 40 // | 34 // |
| 41 // <path> <type> <ID> | 35 // <path> <type> <ID> |
| 42 // (root)/ dir root-id | 36 // (root)/ dir root-id |
| 43 // dir/ dir dir-id | 37 // dir/ dir dir-id |
| 44 // photo.jpg image/jpeg photo-id | 38 // photo.jpg image/jpeg photo-id |
| 45 // music.bin audio/mp3 music-id | 39 // music.bin audio/mp3 music-id |
| 46 // dups/ dir dups-id | 40 // dups/ dir dups-id |
| 47 // dup.mp4 video/mp4 dup1-id | 41 // dup.mp4 video/mp4 dup1-id |
| 48 // dup.mp4 video/mp4 dup2-id | 42 // dup.mp4 video/mp4 dup2-id |
| 49 // dup.mp4 video/mp4 dup3-id | 43 // dup.mp4 video/mp4 dup3-id |
| 50 // dup.mp4 video/mp4 dup4-id | 44 // dup.mp4 video/mp4 dup4-id |
| 51 constexpr char kAuthority[] = "org.chromium.test"; | 45 constexpr char kAuthority[] = "org.chromium.test"; |
| 52 // NOTE: ArcDocumentsProviderRoot::GetFileInfo() returns hard-coded info | 46 // NOTE: ArcDocumentsProviderRoot::GetFileInfo() returns hard-coded info |
| 53 // for root documents. | 47 // for root documents. |
| 54 constexpr DocumentSpec kRootSpec = {"root-id", nullptr /* not used */, | 48 constexpr DocumentSpec kRootSpec(kAuthority, |
| 55 kAndroidDirectoryMimeType, -1, 0}; | 49 "root-id", |
| 56 constexpr DocumentSpec kDirSpec = {"dir-id", "dir", kAndroidDirectoryMimeType, | 50 nullptr, |
| 57 -1, 22}; | 51 "", |
| 58 constexpr DocumentSpec kPhotoSpec = {"photo-id", "photo.jpg", "image/jpeg", 3, | 52 kAndroidDirectoryMimeType, |
| 59 33}; | 53 -1, |
| 60 constexpr DocumentSpec kMusicSpec = {"music-id", "music.bin", "audio/mp3", 4, | 54 0); |
| 61 44}; | 55 constexpr DocumentSpec kDirSpec(kAuthority, |
| 62 constexpr DocumentSpec kDupsSpec = {"dups-id", "dups", | 56 "dir-id", |
| 63 kAndroidDirectoryMimeType, -1, 55}; | 57 kRootSpec.document_id, |
| 64 constexpr DocumentSpec kDup1Spec = {"dup1-id", "dup.mp4", "video/mp4", 6, 66}; | 58 "dir", |
| 65 constexpr DocumentSpec kDup2Spec = {"dup2-id", "dup.mp4", "video/mp4", 7, 77}; | 59 kAndroidDirectoryMimeType, |
| 66 constexpr DocumentSpec kDup3Spec = {"dup3-id", "dup.mp4", "video/mp4", 8, 88}; | 60 -1, |
| 67 constexpr DocumentSpec kDup4Spec = {"dup4-id", "dup.mp4", "video/mp4", 9, 99}; | 61 22); |
| 62 constexpr DocumentSpec kPhotoSpec(kAuthority, | |
| 63 "photo-id", | |
| 64 kDirSpec.document_id, | |
| 65 "photo.jpg", | |
| 66 "image/jpeg", | |
| 67 3, | |
| 68 33); | |
| 69 constexpr DocumentSpec kMusicSpec(kAuthority, | |
| 70 "music-id", | |
| 71 kDirSpec.document_id, | |
| 72 "music.bin", | |
| 73 "audio/mp3", | |
| 74 4, | |
| 75 44); | |
| 76 constexpr DocumentSpec kDupsSpec(kAuthority, | |
| 77 "dups-id", | |
| 78 kRootSpec.document_id, | |
| 79 "dups", | |
| 80 kAndroidDirectoryMimeType, | |
| 81 -1, | |
| 82 55); | |
| 83 constexpr DocumentSpec kDup1Spec(kAuthority, | |
| 84 "dup1-id", | |
| 85 kDupsSpec.document_id, | |
| 86 "dup.mp4", | |
| 87 "video/mp4", | |
| 88 6, | |
| 89 66); | |
| 90 constexpr DocumentSpec kDup2Spec(kAuthority, | |
| 91 "dup2-id", | |
| 92 kDupsSpec.document_id, | |
| 93 "dup.mp4", | |
| 94 "video/mp4", | |
| 95 7, | |
| 96 77); | |
| 97 constexpr DocumentSpec kDup3Spec(kAuthority, | |
| 98 "dup3-id", | |
| 99 kDupsSpec.document_id, | |
| 100 "dup.mp4", | |
| 101 "video/mp4", | |
| 102 8, | |
| 103 88); | |
| 104 constexpr DocumentSpec kDup4Spec(kAuthority, | |
| 105 "dup4-id", | |
| 106 kDupsSpec.document_id, | |
| 107 "dup.mp4", | |
| 108 "video/mp4", | |
| 109 9, | |
| 110 99); | |
| 111 | |
| 112 // The order is intentionally shuffled. | |
| 68 constexpr DocumentSpec kAllSpecs[] = {kRootSpec, kDirSpec, kPhotoSpec, | 113 constexpr DocumentSpec kAllSpecs[] = {kRootSpec, kDirSpec, kPhotoSpec, |
| 69 kMusicSpec, kDupsSpec, kDup1Spec, | 114 kMusicSpec, kDupsSpec, kDup2Spec, |
|
hidehiko
2017/01/26 07:24:20
Could you sort, at least kDupNSpec where N is numb
Shuhei Takahashi
2017/01/27 09:55:10
It's intentional as commented. I'll further add co
hidehiko
2017/01/27 15:50:00
Oh, got it. Thank you for explanation and adding t
| |
| 70 kDup2Spec, kDup3Spec, kDup4Spec}; | 115 kDup1Spec, kDup4Spec, kDup3Spec}; |
| 71 | |
| 72 mojom::DocumentPtr MakeDocument(const DocumentSpec& spec) { | |
| 73 mojom::DocumentPtr document = mojom::Document::New(); | |
| 74 document->document_id = spec.document_id; | |
| 75 document->display_name = spec.display_name; | |
| 76 document->mime_type = spec.mime_type; | |
| 77 document->size = spec.size; | |
| 78 document->last_modified = spec.last_modified; | |
| 79 return document; | |
| 80 } | |
| 81 | |
| 82 // TODO(crbug.com/683049): Use a generic FakeArcFileSystemOperationRunner. | |
| 83 class ArcFileSystemOperationRunnerForTest | |
| 84 : public FakeArcFileSystemOperationRunner { | |
| 85 public: | |
| 86 explicit ArcFileSystemOperationRunnerForTest(ArcBridgeService* bridge_service) | |
| 87 : FakeArcFileSystemOperationRunner(bridge_service) {} | |
| 88 ~ArcFileSystemOperationRunnerForTest() override = default; | |
| 89 | |
| 90 void GetChildDocuments(const std::string& authority, | |
| 91 const std::string& document_id, | |
| 92 const GetChildDocumentsCallback& callback) override { | |
| 93 EXPECT_EQ(kAuthority, authority); | |
| 94 base::Optional<std::vector<mojom::DocumentPtr>> result; | |
| 95 if (document_id == kRootSpec.document_id) { | |
| 96 result.emplace(); | |
| 97 result.value().emplace_back(MakeDocument(kDirSpec)); | |
| 98 result.value().emplace_back(MakeDocument(kDupsSpec)); | |
| 99 } else if (document_id == kDirSpec.document_id) { | |
| 100 result.emplace(); | |
| 101 result.value().emplace_back(MakeDocument(kPhotoSpec)); | |
| 102 result.value().emplace_back(MakeDocument(kMusicSpec)); | |
| 103 } else if (document_id == kDupsSpec.document_id) { | |
| 104 result.emplace(); | |
| 105 // The order is intentionally shuffled. | |
| 106 result.value().emplace_back(MakeDocument(kDup2Spec)); | |
| 107 result.value().emplace_back(MakeDocument(kDup1Spec)); | |
| 108 result.value().emplace_back(MakeDocument(kDup4Spec)); | |
| 109 result.value().emplace_back(MakeDocument(kDup3Spec)); | |
| 110 } | |
| 111 callback.Run(std::move(result)); | |
| 112 } | |
| 113 | |
| 114 void GetDocument(const std::string& authority, | |
| 115 const std::string& document_id, | |
| 116 const GetDocumentCallback& callback) override { | |
| 117 EXPECT_EQ(kAuthority, authority); | |
| 118 mojom::DocumentPtr result; | |
| 119 for (const auto& spec : kAllSpecs) { | |
| 120 if (document_id == spec.document_id) { | |
| 121 result = MakeDocument(spec); | |
| 122 break; | |
| 123 } | |
| 124 } | |
| 125 callback.Run(std::move(result)); | |
| 126 } | |
| 127 }; | |
| 128 | 116 |
| 129 void ExpectMatchesSpec(const base::File::Info& info, const DocumentSpec& spec) { | 117 void ExpectMatchesSpec(const base::File::Info& info, const DocumentSpec& spec) { |
| 130 EXPECT_EQ(spec.size, info.size); | 118 EXPECT_EQ(spec.size, info.size); |
| 131 if (strcmp(spec.mime_type, kAndroidDirectoryMimeType) == 0) { | 119 if (strcmp(spec.mime_type, kAndroidDirectoryMimeType) == 0) { |
| 132 EXPECT_TRUE(info.is_directory); | 120 EXPECT_TRUE(info.is_directory); |
| 133 } else { | 121 } else { |
| 134 EXPECT_FALSE(info.is_directory); | 122 EXPECT_FALSE(info.is_directory); |
| 135 } | 123 } |
| 136 EXPECT_FALSE(info.is_symbolic_link); | 124 EXPECT_FALSE(info.is_symbolic_link); |
| 137 EXPECT_EQ(spec.last_modified, | 125 EXPECT_EQ(spec.last_modified, |
| 138 static_cast<uint64_t>(info.last_modified.ToJavaTime())); | 126 static_cast<uint64_t>(info.last_modified.ToJavaTime())); |
| 139 EXPECT_EQ(spec.last_modified, | 127 EXPECT_EQ(spec.last_modified, |
| 140 static_cast<uint64_t>(info.last_accessed.ToJavaTime())); | 128 static_cast<uint64_t>(info.last_accessed.ToJavaTime())); |
| 141 EXPECT_EQ(spec.last_modified, | 129 EXPECT_EQ(spec.last_modified, |
| 142 static_cast<uint64_t>(info.creation_time.ToJavaTime())); | 130 static_cast<uint64_t>(info.creation_time.ToJavaTime())); |
| 143 } | 131 } |
| 144 | 132 |
| 145 class ArcDocumentsProviderRootTest : public testing::Test { | 133 class ArcDocumentsProviderRootTest : public testing::Test { |
| 146 public: | 134 public: |
| 147 ArcDocumentsProviderRootTest() | 135 ArcDocumentsProviderRootTest() = default; |
| 148 : arc_service_manager_(base::MakeUnique<ArcServiceManager>(nullptr)), | 136 ~ArcDocumentsProviderRootTest() override = default; |
| 149 root_( | 137 |
| 150 base::MakeUnique<ArcDocumentsProviderRoot>(kAuthority, | 138 void SetUp() override { |
| 151 kRootSpec.document_id)) { | 139 for (auto spec : kAllSpecs) { |
| 140 fake_file_system_.AddDocument(spec); | |
| 141 } | |
| 142 | |
| 143 arc_service_manager_ = base::MakeUnique<ArcServiceManager>(nullptr); | |
| 152 arc_service_manager_->AddService( | 144 arc_service_manager_->AddService( |
| 153 base::MakeUnique<ArcFileSystemOperationRunnerForTest>( | 145 base::WrapUnique(ArcFileSystemOperationRunner::CreateForTesting( |
| 154 arc_service_manager_->arc_bridge_service())); | 146 arc_service_manager_->arc_bridge_service()))); |
| 147 arc_service_manager_->arc_bridge_service()->file_system()->SetInstance( | |
| 148 &fake_file_system_); | |
| 149 | |
| 150 root_ = base::MakeUnique<ArcDocumentsProviderRoot>(kAuthority, | |
| 151 kRootSpec.document_id); | |
| 155 } | 152 } |
| 156 | 153 |
| 157 ~ArcDocumentsProviderRootTest() override = default; | |
| 158 | |
| 159 protected: | 154 protected: |
| 160 content::TestBrowserThreadBundle thread_bundle_; | 155 content::TestBrowserThreadBundle thread_bundle_; |
| 156 FakeFileSystemInstance fake_file_system_; | |
| 161 std::unique_ptr<ArcServiceManager> arc_service_manager_; | 157 std::unique_ptr<ArcServiceManager> arc_service_manager_; |
| 162 std::unique_ptr<ArcDocumentsProviderRoot> root_; | 158 std::unique_ptr<ArcDocumentsProviderRoot> root_; |
| 163 | 159 |
| 164 private: | 160 private: |
| 165 DISALLOW_COPY_AND_ASSIGN(ArcDocumentsProviderRootTest); | 161 DISALLOW_COPY_AND_ASSIGN(ArcDocumentsProviderRootTest); |
| 166 }; | 162 }; |
| 167 | 163 |
| 168 } // namespace | 164 } // namespace |
| 169 | 165 |
| 170 TEST_F(ArcDocumentsProviderRootTest, GetFileInfo) { | 166 TEST_F(ArcDocumentsProviderRootTest, GetFileInfo) { |
| (...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 368 [](base::RunLoop* run_loop, const GURL& url) { | 364 [](base::RunLoop* run_loop, const GURL& url) { |
| 369 EXPECT_EQ(GURL("content://org.chromium.test/document/dup3-id"), | 365 EXPECT_EQ(GURL("content://org.chromium.test/document/dup3-id"), |
| 370 url); | 366 url); |
| 371 run_loop->Quit(); | 367 run_loop->Quit(); |
| 372 }, | 368 }, |
| 373 &run_loop)); | 369 &run_loop)); |
| 374 run_loop.Run(); | 370 run_loop.Run(); |
| 375 } | 371 } |
| 376 | 372 |
| 377 } // namespace arc | 373 } // namespace arc |
| OLD | NEW |