| OLD | NEW |
| (Empty) | |
| 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 "chrome/browser/media_galleries/media_folder_finder.h" |
| 6 |
| 7 #include <set> |
| 8 #include <string> |
| 9 |
| 10 #include "base/bind.h" |
| 11 #include "base/file_util.h" |
| 12 #include "base/files/scoped_temp_dir.h" |
| 13 #include "base/run_loop.h" |
| 14 #include "base/strings/stringprintf.h" |
| 15 #include "chrome/browser/media_galleries/media_scan_types.h" |
| 16 #include "content/public/browser/browser_thread.h" |
| 17 #include "content/public/test/test_browser_thread_bundle.h" |
| 18 |
| 19 |
| 20 class MediaFolderFinderTest : public testing::Test { |
| 21 public: |
| 22 MediaFolderFinderTest() { |
| 23 } |
| 24 |
| 25 virtual ~MediaFolderFinderTest() { |
| 26 } |
| 27 |
| 28 virtual void SetUp() OVERRIDE { |
| 29 ASSERT_TRUE(fake_dir_.CreateUniqueTempDir()); |
| 30 } |
| 31 |
| 32 virtual void TearDown() OVERRIDE { |
| 33 ASSERT_EQ(NULL, media_folder_finder_.get()); |
| 34 } |
| 35 |
| 36 protected: |
| 37 void CreateMediaFolderFinder( |
| 38 const std::vector<base::FilePath> roots, |
| 39 bool expected_success, |
| 40 const MediaFolderFinder::MediaFolderFinderResults& expected_results) { |
| 41 EXPECT_EQ(NULL, media_folder_finder_.get()); |
| 42 received_results_ = false; |
| 43 expected_success_ = expected_success; |
| 44 expected_results_ = expected_results; |
| 45 media_folder_finder_.reset( |
| 46 new MediaFolderFinder(roots, |
| 47 base::Bind(&MediaFolderFinderTest::OnGotResults, |
| 48 base::Unretained(this)))); |
| 49 } |
| 50 |
| 51 void StartScan() { |
| 52 media_folder_finder_->StartScan(); |
| 53 } |
| 54 |
| 55 void DeleteMediaFolderFinder() { |
| 56 EXPECT_TRUE(media_folder_finder_.get() != NULL); |
| 57 media_folder_finder_.reset(); |
| 58 } |
| 59 |
| 60 bool received_results() const { |
| 61 return received_results_; |
| 62 } |
| 63 |
| 64 const base::FilePath& fake_dir() { |
| 65 return fake_dir_.path(); |
| 66 } |
| 67 |
| 68 void CreateTestDir(const base::FilePath& parent_dir) { |
| 69 ASSERT_TRUE(fake_dir().IsParent(parent_dir)); |
| 70 ASSERT_TRUE(base::CreateDirectory(parent_dir)); |
| 71 } |
| 72 |
| 73 void CreateTestFile(const base::FilePath& parent_dir, |
| 74 MediaGalleryScanFileType type, |
| 75 size_t count, |
| 76 bool big, |
| 77 MediaFolderFinder::MediaFolderFinderResults* results) { |
| 78 CreateTestDir(parent_dir); |
| 79 |
| 80 std::string extension; |
| 81 size_t filesize; |
| 82 MediaGalleryScanResult& result = (*results)[parent_dir]; |
| 83 switch (type) { |
| 84 case MEDIA_GALLERY_SCAN_FILE_TYPE_IMAGE: |
| 85 extension = "jpg"; |
| 86 filesize = 10; |
| 87 result.image_count += count; |
| 88 break; |
| 89 case MEDIA_GALLERY_SCAN_FILE_TYPE_AUDIO: |
| 90 extension = "wav"; |
| 91 filesize = 20; |
| 92 result.audio_count += count; |
| 93 break; |
| 94 case MEDIA_GALLERY_SCAN_FILE_TYPE_VIDEO: |
| 95 extension = "avi"; |
| 96 filesize = 30; |
| 97 result.video_count += count; |
| 98 break; |
| 99 case MEDIA_GALLERY_SCAN_FILE_TYPE_UNKNOWN: |
| 100 extension = "txt"; |
| 101 filesize = 10; |
| 102 if (IsEmptyScanResult(result)) |
| 103 results->erase(parent_dir); |
| 104 break; |
| 105 default: |
| 106 NOTREACHED(); |
| 107 return; |
| 108 } |
| 109 if (big) |
| 110 filesize *= 100000; |
| 111 |
| 112 for (size_t i = 0; i < count; ++i) { |
| 113 base::FilePath test_file(parent_dir.AppendASCII("dummy." + extension)); |
| 114 int uniquifier = |
| 115 file_util::GetUniquePathNumber(test_file, |
| 116 base::FilePath::StringType()); |
| 117 if (uniquifier > 0) { |
| 118 test_file = test_file.InsertBeforeExtensionASCII( |
| 119 base::StringPrintf(" (%d)", uniquifier)); |
| 120 filesize += uniquifier; |
| 121 } |
| 122 |
| 123 std::string dummy_data; |
| 124 dummy_data.resize(filesize); |
| 125 |
| 126 int bytes_written = |
| 127 file_util::WriteFile(test_file, dummy_data.c_str(), filesize); |
| 128 ASSERT_GE(bytes_written, 0); |
| 129 ASSERT_EQ(filesize, static_cast<size_t>(bytes_written)); |
| 130 } |
| 131 } |
| 132 |
| 133 void RunLoop() { |
| 134 base::RunLoop().RunUntilIdle(); |
| 135 content::BrowserThread::GetBlockingPool()->FlushForTesting(); |
| 136 } |
| 137 |
| 138 void RunLoopUntilReceivedCallback() { |
| 139 while (!received_results()) |
| 140 RunLoop(); |
| 141 } |
| 142 |
| 143 private: |
| 144 void OnGotResults( |
| 145 bool success, |
| 146 const MediaFolderFinder::MediaFolderFinderResults& results) { |
| 147 received_results_ = true; |
| 148 EXPECT_EQ(expected_success_, success); |
| 149 std::set<base::FilePath> expected_keys = |
| 150 GetKeysFromResults(expected_results_); |
| 151 ASSERT_EQ(expected_keys, GetKeysFromResults(results)); |
| 152 for (MediaFolderFinder::MediaFolderFinderResults::const_iterator it = |
| 153 results.begin(); |
| 154 it != results.end(); ++it) { |
| 155 const base::FilePath& folder = it->first; |
| 156 const MediaGalleryScanResult& expected = it->second; |
| 157 const MediaGalleryScanResult& actual = results.find(folder)->second; |
| 158 EXPECT_EQ(expected.image_count, actual.image_count) |
| 159 << " Image count for " << folder.value(); |
| 160 EXPECT_EQ(expected.audio_count, actual.audio_count) |
| 161 << " Audio count for " << folder.value(); |
| 162 EXPECT_EQ(expected.video_count, actual.video_count) |
| 163 << " Video count for " << folder.value(); |
| 164 } |
| 165 } |
| 166 |
| 167 std::set<base::FilePath> GetKeysFromResults( |
| 168 const MediaFolderFinder::MediaFolderFinderResults& results) { |
| 169 std::set<base::FilePath> keys; |
| 170 for (MediaFolderFinder::MediaFolderFinderResults::const_iterator it = |
| 171 results.begin(); |
| 172 it != results.end(); ++it) { |
| 173 keys.insert(it->first); |
| 174 } |
| 175 return keys; |
| 176 } |
| 177 |
| 178 content::TestBrowserThreadBundle thread_bundle_; |
| 179 |
| 180 base::ScopedTempDir fake_dir_; |
| 181 |
| 182 scoped_ptr<MediaFolderFinder> media_folder_finder_; |
| 183 |
| 184 bool expected_success_; |
| 185 MediaFolderFinder::MediaFolderFinderResults expected_results_; |
| 186 bool received_results_; |
| 187 |
| 188 DISALLOW_COPY_AND_ASSIGN(MediaFolderFinderTest); |
| 189 }; |
| 190 |
| 191 TEST_F(MediaFolderFinderTest, NoScan) { |
| 192 MediaFolderFinder::MediaFolderFinderResults expected_results; |
| 193 std::vector<base::FilePath> folders; |
| 194 folders.push_back(fake_dir()); |
| 195 CreateMediaFolderFinder(folders, false, expected_results); |
| 196 DeleteMediaFolderFinder(); |
| 197 EXPECT_TRUE(received_results()); |
| 198 } |
| 199 |
| 200 TEST_F(MediaFolderFinderTest, ScanAndCancel) { |
| 201 MediaFolderFinder::MediaFolderFinderResults expected_results; |
| 202 std::vector<base::FilePath> folders; |
| 203 folders.push_back(fake_dir()); |
| 204 CreateMediaFolderFinder(folders, false, expected_results); |
| 205 StartScan(); |
| 206 RunLoop(); |
| 207 DeleteMediaFolderFinder(); |
| 208 EXPECT_TRUE(received_results()); |
| 209 } |
| 210 |
| 211 TEST_F(MediaFolderFinderTest, ScanNothing) { |
| 212 MediaFolderFinder::MediaFolderFinderResults expected_results; |
| 213 std::vector<base::FilePath> folders; |
| 214 CreateMediaFolderFinder(folders, true, expected_results); |
| 215 StartScan(); |
| 216 RunLoopUntilReceivedCallback(); |
| 217 DeleteMediaFolderFinder(); |
| 218 } |
| 219 |
| 220 TEST_F(MediaFolderFinderTest, EmptyScan) { |
| 221 MediaFolderFinder::MediaFolderFinderResults expected_results; |
| 222 std::vector<base::FilePath> folders; |
| 223 folders.push_back(fake_dir()); |
| 224 CreateMediaFolderFinder(folders, true, expected_results); |
| 225 StartScan(); |
| 226 RunLoopUntilReceivedCallback(); |
| 227 DeleteMediaFolderFinder(); |
| 228 } |
| 229 |
| 230 TEST_F(MediaFolderFinderTest, ScanMediaFiles) { |
| 231 MediaFolderFinder::MediaFolderFinderResults expected_results; |
| 232 std::vector<base::FilePath> folders; |
| 233 folders.push_back(fake_dir()); |
| 234 |
| 235 base::FilePath dir1 = fake_dir().AppendASCII("dir1"); |
| 236 base::FilePath dir2 = fake_dir().AppendASCII("dir2"); |
| 237 base::FilePath dir2_3 = dir2.AppendASCII("dir2_3"); |
| 238 base::FilePath dir2_4 = dir2.AppendASCII("dir2_4"); |
| 239 base::FilePath dir2_4_5 = dir2_4.AppendASCII("dir2_4_5"); |
| 240 base::FilePath dir2_4_empty = dir2_4.AppendASCII("dir2_4_empty"); |
| 241 base::FilePath dir_empty = fake_dir().AppendASCII("dir_empty"); |
| 242 |
| 243 CreateTestFile(dir1, MEDIA_GALLERY_SCAN_FILE_TYPE_IMAGE, 2, true, |
| 244 &expected_results); |
| 245 CreateTestFile(dir1, MEDIA_GALLERY_SCAN_FILE_TYPE_IMAGE, 1, false, |
| 246 &expected_results); |
| 247 CreateTestFile(dir1, MEDIA_GALLERY_SCAN_FILE_TYPE_UNKNOWN, 1, false, |
| 248 &expected_results); |
| 249 CreateTestFile(dir2_3, MEDIA_GALLERY_SCAN_FILE_TYPE_AUDIO, 4, true, |
| 250 &expected_results); |
| 251 CreateTestFile(dir2_3, MEDIA_GALLERY_SCAN_FILE_TYPE_AUDIO, 3, false, |
| 252 &expected_results); |
| 253 CreateTestFile(dir2_4, MEDIA_GALLERY_SCAN_FILE_TYPE_UNKNOWN, 5, false, |
| 254 &expected_results); |
| 255 CreateTestFile(dir2_4_5, MEDIA_GALLERY_SCAN_FILE_TYPE_IMAGE, 2, true, |
| 256 &expected_results); |
| 257 CreateTestFile(dir2_4_5, MEDIA_GALLERY_SCAN_FILE_TYPE_AUDIO, 4, true, |
| 258 &expected_results); |
| 259 CreateTestFile(dir2_4_5, MEDIA_GALLERY_SCAN_FILE_TYPE_VIDEO, 1, true, |
| 260 &expected_results); |
| 261 CreateTestFile(dir2_4_5, MEDIA_GALLERY_SCAN_FILE_TYPE_IMAGE, 5, false, |
| 262 &expected_results); |
| 263 CreateTestFile(dir2_4_5, MEDIA_GALLERY_SCAN_FILE_TYPE_VIDEO, 3, false, |
| 264 &expected_results); |
| 265 CreateTestFile(dir2_4_5, MEDIA_GALLERY_SCAN_FILE_TYPE_UNKNOWN, 3, true, |
| 266 &expected_results); |
| 267 CreateTestDir(dir2_4_empty); |
| 268 CreateTestDir(dir_empty); |
| 269 |
| 270 CreateMediaFolderFinder(folders, true, expected_results); |
| 271 StartScan(); |
| 272 RunLoopUntilReceivedCallback(); |
| 273 DeleteMediaFolderFinder(); |
| 274 } |
| OLD | NEW |