| 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 | 
|---|