| Index: chrome/browser/media_galleries/media_folder_finder_unittest.cc | 
| =================================================================== | 
| --- chrome/browser/media_galleries/media_folder_finder_unittest.cc	(revision 0) | 
| +++ chrome/browser/media_galleries/media_folder_finder_unittest.cc	(revision 0) | 
| @@ -0,0 +1,274 @@ | 
| +// Copyright 2014 The Chromium Authors. All rights reserved. | 
| +// Use of this source code is governed by a BSD-style license that can be | 
| +// found in the LICENSE file. | 
| + | 
| +#include "chrome/browser/media_galleries/media_folder_finder.h" | 
| + | 
| +#include <set> | 
| +#include <string> | 
| + | 
| +#include "base/bind.h" | 
| +#include "base/file_util.h" | 
| +#include "base/files/scoped_temp_dir.h" | 
| +#include "base/run_loop.h" | 
| +#include "base/strings/stringprintf.h" | 
| +#include "chrome/browser/media_galleries/media_scan_types.h" | 
| +#include "content/public/browser/browser_thread.h" | 
| +#include "content/public/test/test_browser_thread_bundle.h" | 
| + | 
| + | 
| +class MediaFolderFinderTest : public testing::Test { | 
| + public: | 
| +  MediaFolderFinderTest() { | 
| +  } | 
| + | 
| +  virtual ~MediaFolderFinderTest() { | 
| +  } | 
| + | 
| +  virtual void SetUp() OVERRIDE { | 
| +    ASSERT_TRUE(fake_dir_.CreateUniqueTempDir()); | 
| +  } | 
| + | 
| +  virtual void TearDown() OVERRIDE { | 
| +    ASSERT_EQ(NULL, media_folder_finder_.get()); | 
| +  } | 
| + | 
| + protected: | 
| +  void CreateMediaFolderFinder( | 
| +      const std::vector<base::FilePath> roots, | 
| +      bool expected_success, | 
| +      const MediaFolderFinder::MediaFolderFinderResults& expected_results) { | 
| +    EXPECT_EQ(NULL, media_folder_finder_.get()); | 
| +    received_results_ = false; | 
| +    expected_success_ = expected_success; | 
| +    expected_results_ = expected_results; | 
| +    media_folder_finder_.reset( | 
| +        new MediaFolderFinder(roots, | 
| +                              base::Bind(&MediaFolderFinderTest::OnGotResults, | 
| +                                         base::Unretained(this)))); | 
| +  } | 
| + | 
| +  void StartScan() { | 
| +    media_folder_finder_->StartScan(); | 
| +  } | 
| + | 
| +  void DeleteMediaFolderFinder() { | 
| +    EXPECT_TRUE(media_folder_finder_.get() != NULL); | 
| +    media_folder_finder_.reset(); | 
| +  } | 
| + | 
| +  bool received_results() const { | 
| +    return received_results_; | 
| +  } | 
| + | 
| +  const base::FilePath& fake_dir() { | 
| +    return fake_dir_.path(); | 
| +  } | 
| + | 
| +  void CreateTestDir(const base::FilePath& parent_dir) { | 
| +    ASSERT_TRUE(fake_dir().IsParent(parent_dir)); | 
| +    ASSERT_TRUE(base::CreateDirectory(parent_dir)); | 
| +  } | 
| + | 
| +  void CreateTestFile(const base::FilePath& parent_dir, | 
| +                      MediaGalleryScanFileType type, | 
| +                      size_t count, | 
| +                      bool big, | 
| +                      MediaFolderFinder::MediaFolderFinderResults* results) { | 
| +    CreateTestDir(parent_dir); | 
| + | 
| +    std::string extension; | 
| +    size_t filesize; | 
| +    MediaGalleryScanResult& result = (*results)[parent_dir]; | 
| +    switch (type) { | 
| +      case MEDIA_GALLERY_SCAN_FILE_TYPE_IMAGE: | 
| +        extension = "jpg"; | 
| +        filesize = 10; | 
| +        result.image_count += count; | 
| +        break; | 
| +      case MEDIA_GALLERY_SCAN_FILE_TYPE_AUDIO: | 
| +        extension = "wav"; | 
| +        filesize = 20; | 
| +        result.audio_count += count; | 
| +        break; | 
| +      case MEDIA_GALLERY_SCAN_FILE_TYPE_VIDEO: | 
| +        extension = "avi"; | 
| +        filesize = 30; | 
| +        result.video_count += count; | 
| +        break; | 
| +      case MEDIA_GALLERY_SCAN_FILE_TYPE_UNKNOWN: | 
| +        extension = "txt"; | 
| +        filesize = 10; | 
| +        if (IsEmptyScanResult(result)) | 
| +          results->erase(parent_dir); | 
| +        break; | 
| +      default: | 
| +        NOTREACHED(); | 
| +        return; | 
| +    } | 
| +    if (big) | 
| +      filesize *= 100000; | 
| + | 
| +    for (size_t i = 0; i < count; ++i) { | 
| +      base::FilePath test_file(parent_dir.AppendASCII("dummy." + extension)); | 
| +      int uniquifier = | 
| +          file_util::GetUniquePathNumber(test_file, | 
| +                                         base::FilePath::StringType()); | 
| +      if (uniquifier > 0) { | 
| +        test_file = test_file.InsertBeforeExtensionASCII( | 
| +            base::StringPrintf(" (%d)", uniquifier)); | 
| +        filesize += uniquifier; | 
| +      } | 
| + | 
| +      std::string dummy_data; | 
| +      dummy_data.resize(filesize); | 
| + | 
| +      int bytes_written = | 
| +          file_util::WriteFile(test_file, dummy_data.c_str(), filesize); | 
| +      ASSERT_GE(bytes_written, 0); | 
| +      ASSERT_EQ(filesize, static_cast<size_t>(bytes_written)); | 
| +    } | 
| +  } | 
| + | 
| +  void RunLoop() { | 
| +    base::RunLoop().RunUntilIdle(); | 
| +    content::BrowserThread::GetBlockingPool()->FlushForTesting(); | 
| +  } | 
| + | 
| +  void RunLoopUntilReceivedCallback() { | 
| +    while (!received_results()) | 
| +      RunLoop(); | 
| +  } | 
| + | 
| + private: | 
| +  void OnGotResults( | 
| +      bool success, | 
| +      const MediaFolderFinder::MediaFolderFinderResults& results) { | 
| +    received_results_ = true; | 
| +    EXPECT_EQ(expected_success_, success); | 
| +    std::set<base::FilePath> expected_keys = | 
| +        GetKeysFromResults(expected_results_); | 
| +    ASSERT_EQ(expected_keys, GetKeysFromResults(results)); | 
| +    for (MediaFolderFinder::MediaFolderFinderResults::const_iterator it = | 
| +             results.begin(); | 
| +         it != results.end(); ++it) { | 
| +      const base::FilePath& folder = it->first; | 
| +      const MediaGalleryScanResult& expected = it->second; | 
| +      const MediaGalleryScanResult& actual = results.find(folder)->second; | 
| +      EXPECT_EQ(expected.image_count, actual.image_count) | 
| +          << " Image count for " << folder.value(); | 
| +      EXPECT_EQ(expected.audio_count, actual.audio_count) | 
| +          << " Audio count for " << folder.value(); | 
| +      EXPECT_EQ(expected.video_count, actual.video_count) | 
| +          << " Video count for " << folder.value(); | 
| +    } | 
| +  } | 
| + | 
| +  std::set<base::FilePath> GetKeysFromResults( | 
| +      const MediaFolderFinder::MediaFolderFinderResults& results) { | 
| +    std::set<base::FilePath> keys; | 
| +    for (MediaFolderFinder::MediaFolderFinderResults::const_iterator it = | 
| +             results.begin(); | 
| +         it != results.end(); ++it) { | 
| +      keys.insert(it->first); | 
| +    } | 
| +    return keys; | 
| +  } | 
| + | 
| +  content::TestBrowserThreadBundle thread_bundle_; | 
| + | 
| +  base::ScopedTempDir fake_dir_; | 
| + | 
| +  scoped_ptr<MediaFolderFinder> media_folder_finder_; | 
| + | 
| +  bool expected_success_; | 
| +  MediaFolderFinder::MediaFolderFinderResults expected_results_; | 
| +  bool received_results_; | 
| + | 
| +  DISALLOW_COPY_AND_ASSIGN(MediaFolderFinderTest); | 
| +}; | 
| + | 
| +TEST_F(MediaFolderFinderTest, NoScan) { | 
| +  MediaFolderFinder::MediaFolderFinderResults expected_results; | 
| +  std::vector<base::FilePath> folders; | 
| +  folders.push_back(fake_dir()); | 
| +  CreateMediaFolderFinder(folders, false, expected_results); | 
| +  DeleteMediaFolderFinder(); | 
| +  EXPECT_TRUE(received_results()); | 
| +} | 
| + | 
| +TEST_F(MediaFolderFinderTest, ScanAndCancel) { | 
| +  MediaFolderFinder::MediaFolderFinderResults expected_results; | 
| +  std::vector<base::FilePath> folders; | 
| +  folders.push_back(fake_dir()); | 
| +  CreateMediaFolderFinder(folders, false, expected_results); | 
| +  StartScan(); | 
| +  RunLoop(); | 
| +  DeleteMediaFolderFinder(); | 
| +  EXPECT_TRUE(received_results()); | 
| +} | 
| + | 
| +TEST_F(MediaFolderFinderTest, ScanNothing) { | 
| +  MediaFolderFinder::MediaFolderFinderResults expected_results; | 
| +  std::vector<base::FilePath> folders; | 
| +  CreateMediaFolderFinder(folders, true, expected_results); | 
| +  StartScan(); | 
| +  RunLoopUntilReceivedCallback(); | 
| +  DeleteMediaFolderFinder(); | 
| +} | 
| + | 
| +TEST_F(MediaFolderFinderTest, EmptyScan) { | 
| +  MediaFolderFinder::MediaFolderFinderResults expected_results; | 
| +  std::vector<base::FilePath> folders; | 
| +  folders.push_back(fake_dir()); | 
| +  CreateMediaFolderFinder(folders, true, expected_results); | 
| +  StartScan(); | 
| +  RunLoopUntilReceivedCallback(); | 
| +  DeleteMediaFolderFinder(); | 
| +} | 
| + | 
| +TEST_F(MediaFolderFinderTest, ScanMediaFiles) { | 
| +  MediaFolderFinder::MediaFolderFinderResults expected_results; | 
| +  std::vector<base::FilePath> folders; | 
| +  folders.push_back(fake_dir()); | 
| + | 
| +  base::FilePath dir1 = fake_dir().AppendASCII("dir1"); | 
| +  base::FilePath dir2 = fake_dir().AppendASCII("dir2"); | 
| +  base::FilePath dir2_3 = dir2.AppendASCII("dir2_3"); | 
| +  base::FilePath dir2_4 = dir2.AppendASCII("dir2_4"); | 
| +  base::FilePath dir2_4_5 = dir2_4.AppendASCII("dir2_4_5"); | 
| +  base::FilePath dir2_4_empty = dir2_4.AppendASCII("dir2_4_empty"); | 
| +  base::FilePath dir_empty = fake_dir().AppendASCII("dir_empty"); | 
| + | 
| +  CreateTestFile(dir1, MEDIA_GALLERY_SCAN_FILE_TYPE_IMAGE, 2, true, | 
| +                 &expected_results); | 
| +  CreateTestFile(dir1, MEDIA_GALLERY_SCAN_FILE_TYPE_IMAGE, 1, false, | 
| +                 &expected_results); | 
| +  CreateTestFile(dir1, MEDIA_GALLERY_SCAN_FILE_TYPE_UNKNOWN, 1, false, | 
| +                 &expected_results); | 
| +  CreateTestFile(dir2_3, MEDIA_GALLERY_SCAN_FILE_TYPE_AUDIO, 4, true, | 
| +                 &expected_results); | 
| +  CreateTestFile(dir2_3, MEDIA_GALLERY_SCAN_FILE_TYPE_AUDIO, 3, false, | 
| +                 &expected_results); | 
| +  CreateTestFile(dir2_4, MEDIA_GALLERY_SCAN_FILE_TYPE_UNKNOWN, 5, false, | 
| +                 &expected_results); | 
| +  CreateTestFile(dir2_4_5, MEDIA_GALLERY_SCAN_FILE_TYPE_IMAGE, 2, true, | 
| +                 &expected_results); | 
| +  CreateTestFile(dir2_4_5, MEDIA_GALLERY_SCAN_FILE_TYPE_AUDIO, 4, true, | 
| +                 &expected_results); | 
| +  CreateTestFile(dir2_4_5, MEDIA_GALLERY_SCAN_FILE_TYPE_VIDEO, 1, true, | 
| +                 &expected_results); | 
| +  CreateTestFile(dir2_4_5, MEDIA_GALLERY_SCAN_FILE_TYPE_IMAGE, 5, false, | 
| +                 &expected_results); | 
| +  CreateTestFile(dir2_4_5, MEDIA_GALLERY_SCAN_FILE_TYPE_VIDEO, 3, false, | 
| +                 &expected_results); | 
| +  CreateTestFile(dir2_4_5, MEDIA_GALLERY_SCAN_FILE_TYPE_UNKNOWN, 3, true, | 
| +                 &expected_results); | 
| +  CreateTestDir(dir2_4_empty); | 
| +  CreateTestDir(dir_empty); | 
| + | 
| +  CreateMediaFolderFinder(folders, true, expected_results); | 
| +  StartScan(); | 
| +  RunLoopUntilReceivedCallback(); | 
| +  DeleteMediaFolderFinder(); | 
| +} | 
|  | 
| Property changes on: chrome/browser/media_galleries/media_folder_finder_unittest.cc | 
| ___________________________________________________________________ | 
| Added: svn:eol-style | 
| + LF | 
|  | 
|  |