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 |