Home | History | Annotate | Download | only in media_galleries
      1 // Copyright (c) 2012 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 // MediaGalleriesPreferences unit tests.
      6 
      7 #include "chrome/browser/media_galleries/media_galleries_preferences.h"
      8 
      9 #include <string>
     10 #include <vector>
     11 
     12 #include "base/command_line.h"
     13 #include "base/memory/ref_counted.h"
     14 #include "base/memory/scoped_ptr.h"
     15 #include "base/path_service.h"
     16 #include "base/prefs/scoped_user_pref_update.h"
     17 #include "base/run_loop.h"
     18 #include "base/strings/utf_string_conversions.h"
     19 #include "base/values.h"
     20 #include "chrome/browser/extensions/test_extension_system.h"
     21 #include "chrome/browser/media_galleries/media_file_system_registry.h"
     22 #include "chrome/browser/media_galleries/media_galleries_test_util.h"
     23 #include "chrome/common/chrome_paths.h"
     24 #include "chrome/common/pref_names.h"
     25 #include "chrome/grit/generated_resources.h"
     26 #include "chrome/test/base/testing_profile.h"
     27 #include "components/storage_monitor/media_storage_util.h"
     28 #include "components/storage_monitor/storage_monitor.h"
     29 #include "components/storage_monitor/test_storage_monitor.h"
     30 #include "content/public/test/test_browser_thread_bundle.h"
     31 #include "extensions/browser/extension_system.h"
     32 #include "extensions/common/extension.h"
     33 #include "extensions/common/manifest_handlers/background_info.h"
     34 #include "extensions/common/permissions/media_galleries_permission.h"
     35 #include "sync/api/string_ordinal.h"
     36 #include "testing/gtest/include/gtest/gtest.h"
     37 #include "ui/base/l10n/l10n_util.h"
     38 
     39 #if defined(OS_CHROMEOS)
     40 #include "chrome/browser/chromeos/login/users/scoped_test_user_manager.h"
     41 #include "chrome/browser/chromeos/settings/cros_settings.h"
     42 #include "chrome/browser/chromeos/settings/device_settings_service.h"
     43 #endif
     44 
     45 using base::ASCIIToUTF16;
     46 using storage_monitor::MediaStorageUtil;
     47 using storage_monitor::StorageInfo;
     48 using storage_monitor::TestStorageMonitor;
     49 
     50 namespace {
     51 
     52 class MockGalleryChangeObserver
     53     : public MediaGalleriesPreferences::GalleryChangeObserver {
     54  public:
     55   explicit MockGalleryChangeObserver(MediaGalleriesPreferences* pref)
     56       : pref_(pref),
     57         notifications_(0) {}
     58   virtual ~MockGalleryChangeObserver() {}
     59 
     60   int notifications() const { return notifications_;}
     61 
     62  private:
     63   // MediaGalleriesPreferences::GalleryChangeObserver implementation.
     64   virtual void OnPermissionAdded(MediaGalleriesPreferences* pref,
     65                                  const std::string& extension_id,
     66                                  MediaGalleryPrefId pref_id) OVERRIDE {
     67     EXPECT_EQ(pref_, pref);
     68     ++notifications_;
     69   }
     70 
     71   virtual void OnPermissionRemoved(MediaGalleriesPreferences* pref,
     72                                    const std::string& extension_id,
     73                                    MediaGalleryPrefId pref_id) OVERRIDE {
     74     EXPECT_EQ(pref_, pref);
     75     ++notifications_;
     76   }
     77 
     78   virtual void OnGalleryAdded(MediaGalleriesPreferences* pref,
     79                               MediaGalleryPrefId pref_id) OVERRIDE {
     80     EXPECT_EQ(pref_, pref);
     81     ++notifications_;
     82   }
     83 
     84   virtual void OnGalleryRemoved(MediaGalleriesPreferences* pref,
     85                                 MediaGalleryPrefId pref_id) OVERRIDE {
     86     EXPECT_EQ(pref_, pref);
     87     ++notifications_;
     88   }
     89 
     90   virtual void OnGalleryInfoUpdated(MediaGalleriesPreferences* pref,
     91                                     MediaGalleryPrefId pref_id) OVERRIDE {
     92     EXPECT_EQ(pref_, pref);
     93     ++notifications_;
     94   }
     95 
     96   MediaGalleriesPreferences* pref_;
     97   int notifications_;
     98 
     99   DISALLOW_COPY_AND_ASSIGN(MockGalleryChangeObserver);
    100 };
    101 
    102 }  // namespace
    103 
    104 class MediaGalleriesPreferencesTest : public testing::Test {
    105  public:
    106   typedef std::map<std::string /*device id*/, MediaGalleryPrefIdSet>
    107       DeviceIdPrefIdsMap;
    108 
    109   MediaGalleriesPreferencesTest()
    110       : profile_(new TestingProfile()),
    111         default_galleries_count_(0) {
    112   }
    113 
    114   virtual ~MediaGalleriesPreferencesTest() {
    115   }
    116 
    117   virtual void SetUp() OVERRIDE {
    118     ASSERT_TRUE(TestStorageMonitor::CreateAndInstall());
    119 
    120     extensions::TestExtensionSystem* extension_system(
    121         static_cast<extensions::TestExtensionSystem*>(
    122             extensions::ExtensionSystem::Get(profile_.get())));
    123     extension_system->CreateExtensionService(
    124         CommandLine::ForCurrentProcess(), base::FilePath(), false);
    125 
    126     ReinitPrefsAndExpectations();
    127 
    128     const MediaGalleriesPrefInfoMap& known_galleries =
    129         gallery_prefs_->known_galleries();
    130     if (!known_galleries.empty()) {
    131       ASSERT_EQ(3U, known_galleries.size());
    132     }
    133 
    134     std::vector<std::string> all_permissions;
    135     all_permissions.push_back(
    136         extensions::MediaGalleriesPermission::kReadPermission);
    137     all_permissions.push_back(
    138         extensions::MediaGalleriesPermission::kAllAutoDetectedPermission);
    139     std::vector<std::string> read_permissions;
    140     read_permissions.push_back(
    141         extensions::MediaGalleriesPermission::kReadPermission);
    142 
    143     all_permission_extension =
    144         AddMediaGalleriesApp("all", all_permissions, profile_.get());
    145     regular_permission_extension =
    146         AddMediaGalleriesApp("regular", read_permissions, profile_.get());
    147     no_permissions_extension =
    148         AddMediaGalleriesApp("no", read_permissions, profile_.get());
    149   }
    150 
    151   virtual void TearDown() OVERRIDE {
    152     Verify();
    153     TestStorageMonitor::Destroy();
    154   }
    155 
    156   void ChangeMediaPathOverrides() {
    157     mock_gallery_locations_.ChangeMediaPathOverrides();
    158   }
    159 
    160   void ReinitPrefsAndExpectations() {
    161     gallery_prefs_.reset(new MediaGalleriesPreferences(profile_.get()));
    162     base::RunLoop loop;
    163     gallery_prefs_->EnsureInitialized(loop.QuitClosure());
    164     loop.Run();
    165 
    166     // Load the default galleries into the expectations.
    167     const MediaGalleriesPrefInfoMap& known_galleries =
    168         gallery_prefs_->known_galleries();
    169     if (!known_galleries.empty()) {
    170       default_galleries_count_ = 3;
    171       MediaGalleriesPrefInfoMap::const_iterator it;
    172       for (it = known_galleries.begin(); it != known_galleries.end(); ++it) {
    173         expected_galleries_[it->first] = it->second;
    174         if (it->second.type == MediaGalleryPrefInfo::kAutoDetected)
    175           expected_galleries_for_all.insert(it->first);
    176       }
    177     }
    178   }
    179 
    180   void RemovePersistedDefaultGalleryValues() {
    181     PrefService* prefs = profile_->GetPrefs();
    182     scoped_ptr<ListPrefUpdate> update(new ListPrefUpdate(
    183         prefs, prefs::kMediaGalleriesRememberedGalleries));
    184     base::ListValue* list = update->Get();
    185 
    186     for (base::ListValue::iterator iter = list->begin();
    187          iter != list->end();
    188          ++iter) {
    189       base::DictionaryValue* dict;
    190 
    191       if ((*iter)->GetAsDictionary(&dict)) {
    192         // Setting the prefs version to 2 which is the version before
    193         // default_gallery_type was added.
    194         dict->SetInteger(kMediaGalleriesPrefsVersionKey, 2);
    195         dict->Remove(kMediaGalleriesDefaultGalleryTypeKey, NULL);
    196       }
    197     }
    198     update.reset();
    199   }
    200 
    201   void Verify() {
    202     const MediaGalleriesPrefInfoMap& known_galleries =
    203         gallery_prefs_->known_galleries();
    204     EXPECT_EQ(expected_galleries_.size(), known_galleries.size());
    205     for (MediaGalleriesPrefInfoMap::const_iterator it = known_galleries.begin();
    206          it != known_galleries.end();
    207          ++it) {
    208       VerifyGalleryInfo(it->second, it->first);
    209       if (it->second.type != MediaGalleryPrefInfo::kAutoDetected &&
    210           it->second.type != MediaGalleryPrefInfo::kBlackListed) {
    211         if (!ContainsKey(expected_galleries_for_all, it->first) &&
    212             !ContainsKey(expected_galleries_for_regular, it->first)) {
    213           EXPECT_FALSE(gallery_prefs_->NonAutoGalleryHasPermission(it->first));
    214         } else {
    215           EXPECT_TRUE(gallery_prefs_->NonAutoGalleryHasPermission(it->first));
    216         }
    217       }
    218     }
    219 
    220     for (DeviceIdPrefIdsMap::const_iterator it = expected_device_map.begin();
    221          it != expected_device_map.end();
    222          ++it) {
    223       MediaGalleryPrefIdSet actual_id_set =
    224           gallery_prefs_->LookUpGalleriesByDeviceId(it->first);
    225       EXPECT_EQ(it->second, actual_id_set);
    226     }
    227 
    228     std::set<MediaGalleryPrefId> galleries_for_all =
    229         gallery_prefs_->GalleriesForExtension(*all_permission_extension.get());
    230     EXPECT_EQ(expected_galleries_for_all, galleries_for_all);
    231 
    232     std::set<MediaGalleryPrefId> galleries_for_regular =
    233         gallery_prefs_->GalleriesForExtension(
    234             *regular_permission_extension.get());
    235     EXPECT_EQ(expected_galleries_for_regular, galleries_for_regular);
    236 
    237     std::set<MediaGalleryPrefId> galleries_for_no =
    238         gallery_prefs_->GalleriesForExtension(*no_permissions_extension.get());
    239     EXPECT_EQ(0U, galleries_for_no.size());
    240   }
    241 
    242   void VerifyGalleryInfo(const MediaGalleryPrefInfo& actual,
    243                          MediaGalleryPrefId expected_id) const {
    244     MediaGalleriesPrefInfoMap::const_iterator in_expectation =
    245       expected_galleries_.find(expected_id);
    246     ASSERT_FALSE(in_expectation == expected_galleries_.end())  << expected_id;
    247     EXPECT_EQ(in_expectation->second.pref_id, actual.pref_id);
    248     EXPECT_EQ(in_expectation->second.display_name, actual.display_name);
    249     EXPECT_EQ(in_expectation->second.device_id, actual.device_id);
    250     EXPECT_EQ(in_expectation->second.path.value(), actual.path.value());
    251     EXPECT_EQ(in_expectation->second.type, actual.type);
    252     EXPECT_EQ(in_expectation->second.audio_count, actual.audio_count);
    253     EXPECT_EQ(in_expectation->second.image_count, actual.image_count);
    254     EXPECT_EQ(in_expectation->second.video_count, actual.video_count);
    255     EXPECT_EQ(
    256         in_expectation->second.default_gallery_type,
    257         actual.default_gallery_type);
    258   }
    259 
    260   MediaGalleriesPreferences* gallery_prefs() {
    261     return gallery_prefs_.get();
    262   }
    263 
    264   uint64 default_galleries_count() {
    265     return default_galleries_count_;
    266   }
    267 
    268   void AddGalleryExpectation(MediaGalleryPrefId id, base::string16 display_name,
    269                              std::string device_id,
    270                              base::FilePath relative_path,
    271                              MediaGalleryPrefInfo::Type type) {
    272     expected_galleries_[id].pref_id = id;
    273     expected_galleries_[id].display_name = display_name;
    274     expected_galleries_[id].device_id = device_id;
    275     expected_galleries_[id].path = relative_path.NormalizePathSeparators();
    276     expected_galleries_[id].type = type;
    277 
    278     if (type == MediaGalleryPrefInfo::kAutoDetected)
    279       expected_galleries_for_all.insert(id);
    280 
    281     expected_device_map[device_id].insert(id);
    282   }
    283 
    284   void AddScanResultExpectation(MediaGalleryPrefId id,
    285                                 base::string16 display_name,
    286                                 std::string device_id,
    287                                 base::FilePath relative_path,
    288                                 int audio_count,
    289                                 int image_count,
    290                                 int video_count) {
    291     AddGalleryExpectation(id, display_name, device_id, relative_path,
    292                           MediaGalleryPrefInfo::kScanResult);
    293     expected_galleries_[id].audio_count = audio_count;
    294     expected_galleries_[id].image_count = image_count;
    295     expected_galleries_[id].video_count = video_count;
    296   }
    297 
    298   MediaGalleryPrefId AddGalleryWithNameV0(const std::string& device_id,
    299                                           const base::string16& display_name,
    300                                           const base::FilePath& relative_path,
    301                                           bool user_added) {
    302     MediaGalleryPrefInfo::Type type =
    303         user_added ? MediaGalleryPrefInfo::kUserAdded
    304                    : MediaGalleryPrefInfo::kAutoDetected;
    305     return gallery_prefs()->AddOrUpdateGalleryInternal(
    306         device_id, display_name, relative_path, type,
    307         base::string16(), base::string16(), base::string16(), 0, base::Time(),
    308         false, 0, 0, 0, 0, MediaGalleryPrefInfo::kNotDefault);
    309   }
    310 
    311   MediaGalleryPrefId AddGalleryWithNameV1(const std::string& device_id,
    312                                           const base::string16& display_name,
    313                                           const base::FilePath& relative_path,
    314                                           bool user_added) {
    315     MediaGalleryPrefInfo::Type type =
    316         user_added ? MediaGalleryPrefInfo::kUserAdded
    317                    : MediaGalleryPrefInfo::kAutoDetected;
    318     return gallery_prefs()->AddOrUpdateGalleryInternal(
    319         device_id, display_name, relative_path, type,
    320         base::string16(), base::string16(), base::string16(), 0, base::Time(),
    321         false, 0, 0, 0, 1, MediaGalleryPrefInfo::kNotDefault);
    322   }
    323 
    324   MediaGalleryPrefId AddGalleryWithNameV2(const std::string& device_id,
    325                                           const base::string16& display_name,
    326                                           const base::FilePath& relative_path,
    327                                           MediaGalleryPrefInfo::Type type) {
    328     return gallery_prefs()->AddOrUpdateGalleryInternal(
    329         device_id, display_name, relative_path, type,
    330         base::string16(), base::string16(), base::string16(), 0, base::Time(),
    331         false, 0, 0, 0, 2, MediaGalleryPrefInfo::kNotDefault);
    332   }
    333 
    334   MediaGalleryPrefId AddFixedGalleryWithExepectation(
    335       const std::string& path_name, const std::string& name,
    336       MediaGalleryPrefInfo::Type type) {
    337     base::FilePath path = MakeMediaGalleriesTestingPath(path_name);
    338     StorageInfo info;
    339     base::FilePath relative_path;
    340     MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
    341     base::string16 gallery_name = base::ASCIIToUTF16(name);
    342     MediaGalleryPrefId id = AddGalleryWithNameV2(info.device_id(), gallery_name,
    343                                                 relative_path, type);
    344     AddGalleryExpectation(id, gallery_name, info.device_id(), relative_path,
    345                           type);
    346     Verify();
    347     return id;
    348   }
    349 
    350   bool UpdateDeviceIDForSingletonType(const std::string& device_id) {
    351     return gallery_prefs()->UpdateDeviceIDForSingletonType(device_id);
    352   }
    353 
    354   scoped_refptr<extensions::Extension> all_permission_extension;
    355   scoped_refptr<extensions::Extension> regular_permission_extension;
    356   scoped_refptr<extensions::Extension> no_permissions_extension;
    357 
    358   std::set<MediaGalleryPrefId> expected_galleries_for_all;
    359   std::set<MediaGalleryPrefId> expected_galleries_for_regular;
    360 
    361   DeviceIdPrefIdsMap expected_device_map;
    362 
    363   MediaGalleriesPrefInfoMap expected_galleries_;
    364 
    365  private:
    366   // Needed for extension service & friends to work.
    367   content::TestBrowserThreadBundle thread_bundle_;
    368 
    369   EnsureMediaDirectoriesExists mock_gallery_locations_;
    370 
    371 #if defined(OS_CHROMEOS)
    372   chromeos::ScopedTestDeviceSettingsService test_device_settings_service_;
    373   chromeos::ScopedTestCrosSettings test_cros_settings_;
    374   chromeos::ScopedTestUserManager test_user_manager_;
    375 #endif
    376 
    377   TestStorageMonitor monitor_;
    378   scoped_ptr<TestingProfile> profile_;
    379   scoped_ptr<MediaGalleriesPreferences> gallery_prefs_;
    380 
    381   uint64 default_galleries_count_;
    382 
    383   DISALLOW_COPY_AND_ASSIGN(MediaGalleriesPreferencesTest);
    384 };
    385 
    386 TEST_F(MediaGalleriesPreferencesTest, GalleryManagement) {
    387   MediaGalleryPrefId auto_id, user_added_id, scan_id, id;
    388   base::FilePath path;
    389   base::FilePath relative_path;
    390   Verify();
    391 
    392   // Add a new auto detected gallery.
    393   path = MakeMediaGalleriesTestingPath("new_auto");
    394   StorageInfo info;
    395   MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
    396   base::string16 gallery_name = base::ASCIIToUTF16("NewAutoGallery");
    397   id = AddGalleryWithNameV2(info.device_id(), gallery_name, relative_path,
    398                             MediaGalleryPrefInfo::kAutoDetected);
    399   EXPECT_EQ(default_galleries_count() + 1UL, id);
    400   auto_id = id;
    401   AddGalleryExpectation(id, gallery_name, info.device_id(), relative_path,
    402                         MediaGalleryPrefInfo::kAutoDetected);
    403   Verify();
    404 
    405   // Add it as other types, nothing should happen.
    406   id = AddGalleryWithNameV2(info.device_id(), gallery_name, relative_path,
    407                             MediaGalleryPrefInfo::kUserAdded);
    408   EXPECT_EQ(auto_id, id);
    409   Verify();
    410   id = AddGalleryWithNameV2(info.device_id(), gallery_name, relative_path,
    411                             MediaGalleryPrefInfo::kAutoDetected);
    412   EXPECT_EQ(auto_id, id);
    413   Verify();
    414   id = AddGalleryWithNameV2(info.device_id(), gallery_name, relative_path,
    415                             MediaGalleryPrefInfo::kScanResult);
    416   EXPECT_EQ(auto_id, id);
    417 
    418   // Add a new user added gallery.
    419   path = MakeMediaGalleriesTestingPath("new_user");
    420   MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
    421   gallery_name = base::ASCIIToUTF16("NewUserGallery");
    422   id = AddGalleryWithNameV2(info.device_id(), gallery_name, relative_path,
    423                             MediaGalleryPrefInfo::kUserAdded);
    424   EXPECT_EQ(default_galleries_count() + 2UL, id);
    425   user_added_id = id;
    426   const std::string user_added_device_id = info.device_id();
    427   AddGalleryExpectation(id, gallery_name, info.device_id(), relative_path,
    428                         MediaGalleryPrefInfo::kUserAdded);
    429   Verify();
    430 
    431   // Add it as other types, nothing should happen.
    432   id = AddGalleryWithNameV2(info.device_id(), gallery_name, relative_path,
    433                             MediaGalleryPrefInfo::kUserAdded);
    434   EXPECT_EQ(user_added_id, id);
    435   Verify();
    436   id = AddGalleryWithNameV2(info.device_id(), gallery_name, relative_path,
    437                             MediaGalleryPrefInfo::kAutoDetected);
    438   EXPECT_EQ(user_added_id, id);
    439   Verify();
    440   id = AddGalleryWithNameV2(info.device_id(), gallery_name, relative_path,
    441                             MediaGalleryPrefInfo::kScanResult);
    442   EXPECT_EQ(user_added_id, id);
    443   Verify();
    444 
    445   // Add a new scan result gallery.
    446   path = MakeMediaGalleriesTestingPath("new_scan");
    447   MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
    448   gallery_name = base::ASCIIToUTF16("NewScanGallery");
    449   id = AddGalleryWithNameV2(info.device_id(), gallery_name, relative_path,
    450                             MediaGalleryPrefInfo::kScanResult);
    451   EXPECT_EQ(default_galleries_count() + 3UL, id);
    452   scan_id = id;
    453   AddGalleryExpectation(id, gallery_name, info.device_id(), relative_path,
    454                         MediaGalleryPrefInfo::kScanResult);
    455   Verify();
    456 
    457   // Add it as other types, nothing should happen.
    458   id = AddGalleryWithNameV2(info.device_id(), gallery_name, relative_path,
    459                             MediaGalleryPrefInfo::kUserAdded);
    460   EXPECT_EQ(scan_id, id);
    461   Verify();
    462   id = AddGalleryWithNameV2(info.device_id(), gallery_name, relative_path,
    463                             MediaGalleryPrefInfo::kAutoDetected);
    464   EXPECT_EQ(scan_id, id);
    465   Verify();
    466   id = AddGalleryWithNameV2(info.device_id(), gallery_name, relative_path,
    467                             MediaGalleryPrefInfo::kScanResult);
    468   EXPECT_EQ(scan_id, id);
    469   Verify();
    470 
    471   // Lookup some galleries.
    472   EXPECT_TRUE(gallery_prefs()->LookUpGalleryByPath(
    473       MakeMediaGalleriesTestingPath("new_auto"), NULL));
    474   EXPECT_TRUE(gallery_prefs()->LookUpGalleryByPath(
    475       MakeMediaGalleriesTestingPath("new_user"), NULL));
    476   EXPECT_TRUE(gallery_prefs()->LookUpGalleryByPath(
    477       MakeMediaGalleriesTestingPath("new_scan"), NULL));
    478   EXPECT_FALSE(gallery_prefs()->LookUpGalleryByPath(
    479       MakeMediaGalleriesTestingPath("other"), NULL));
    480 
    481   // Check that we always get the gallery info.
    482   MediaGalleryPrefInfo gallery_info;
    483   EXPECT_TRUE(gallery_prefs()->LookUpGalleryByPath(
    484       MakeMediaGalleriesTestingPath("new_auto"), &gallery_info));
    485   VerifyGalleryInfo(gallery_info, auto_id);
    486   EXPECT_FALSE(gallery_info.volume_metadata_valid);
    487   EXPECT_TRUE(gallery_prefs()->LookUpGalleryByPath(
    488       MakeMediaGalleriesTestingPath("new_user"), &gallery_info));
    489   VerifyGalleryInfo(gallery_info, user_added_id);
    490   EXPECT_FALSE(gallery_info.volume_metadata_valid);
    491   EXPECT_TRUE(gallery_prefs()->LookUpGalleryByPath(
    492       MakeMediaGalleriesTestingPath("new_scan"), &gallery_info));
    493   VerifyGalleryInfo(gallery_info, scan_id);
    494   EXPECT_FALSE(gallery_info.volume_metadata_valid);
    495 
    496   path = MakeMediaGalleriesTestingPath("other");
    497   EXPECT_FALSE(gallery_prefs()->LookUpGalleryByPath(path, &gallery_info));
    498   EXPECT_EQ(kInvalidMediaGalleryPrefId, gallery_info.pref_id);
    499 
    500   StorageInfo other_info;
    501   MediaStorageUtil::GetDeviceInfoFromPath(path, &other_info, &relative_path);
    502   EXPECT_EQ(other_info.device_id(), gallery_info.device_id);
    503   EXPECT_EQ(relative_path.value(), gallery_info.path.value());
    504 
    505   // Remove an auto added gallery (i.e. make it blacklisted).
    506   gallery_prefs()->ForgetGalleryById(auto_id);
    507   expected_galleries_[auto_id].type = MediaGalleryPrefInfo::kBlackListed;
    508   expected_galleries_for_all.erase(auto_id);
    509   Verify();
    510 
    511   // Remove a scan result (i.e. make it blacklisted).
    512   gallery_prefs()->ForgetGalleryById(scan_id);
    513   expected_galleries_[scan_id].type = MediaGalleryPrefInfo::kRemovedScan;
    514   Verify();
    515 
    516   // Remove a user added gallery and it should go away.
    517   gallery_prefs()->ForgetGalleryById(user_added_id);
    518   expected_galleries_.erase(user_added_id);
    519   expected_device_map[user_added_device_id].erase(user_added_id);
    520   Verify();
    521 }
    522 
    523 TEST_F(MediaGalleriesPreferencesTest, ForgetAndErase) {
    524   MediaGalleryPrefId user_erase =
    525       AddFixedGalleryWithExepectation("user_erase", "UserErase",
    526                                       MediaGalleryPrefInfo::kUserAdded);
    527   EXPECT_EQ(default_galleries_count() + 1UL, user_erase);
    528   MediaGalleryPrefId user_forget =
    529       AddFixedGalleryWithExepectation("user_forget", "UserForget",
    530                                       MediaGalleryPrefInfo::kUserAdded);
    531   EXPECT_EQ(default_galleries_count() + 2UL, user_forget);
    532 
    533   MediaGalleryPrefId auto_erase =
    534       AddFixedGalleryWithExepectation("auto_erase", "AutoErase",
    535                                       MediaGalleryPrefInfo::kAutoDetected);
    536   EXPECT_EQ(default_galleries_count() + 3UL, auto_erase);
    537   MediaGalleryPrefId auto_forget =
    538       AddFixedGalleryWithExepectation("auto_forget", "AutoForget",
    539                                       MediaGalleryPrefInfo::kAutoDetected);
    540   EXPECT_EQ(default_galleries_count() + 4UL, auto_forget);
    541 
    542   MediaGalleryPrefId scan_erase =
    543       AddFixedGalleryWithExepectation("scan_erase", "ScanErase",
    544                                       MediaGalleryPrefInfo::kScanResult);
    545   EXPECT_EQ(default_galleries_count() + 5UL, scan_erase);
    546   MediaGalleryPrefId scan_forget =
    547       AddFixedGalleryWithExepectation("scan_forget", "ScanForget",
    548                                       MediaGalleryPrefInfo::kScanResult);
    549   EXPECT_EQ(default_galleries_count() + 6UL, scan_forget);
    550 
    551   Verify();
    552   std::string device_id;
    553 
    554   gallery_prefs()->ForgetGalleryById(user_forget);
    555   device_id = expected_galleries_[user_forget].device_id;
    556   expected_galleries_.erase(user_forget);
    557   expected_device_map[device_id].erase(user_forget);
    558   Verify();
    559 
    560   gallery_prefs()->ForgetGalleryById(auto_forget);
    561   expected_galleries_[auto_forget].type = MediaGalleryPrefInfo::kBlackListed;
    562   expected_galleries_for_all.erase(auto_forget);
    563   Verify();
    564 
    565   gallery_prefs()->ForgetGalleryById(scan_forget);
    566   expected_galleries_[scan_forget].type = MediaGalleryPrefInfo::kRemovedScan;
    567   Verify();
    568 
    569   gallery_prefs()->EraseGalleryById(user_erase);
    570   device_id = expected_galleries_[user_erase].device_id;
    571   expected_galleries_.erase(user_erase);
    572   expected_device_map[device_id].erase(user_erase);
    573   Verify();
    574 
    575   gallery_prefs()->EraseGalleryById(auto_erase);
    576   device_id = expected_galleries_[auto_erase].device_id;
    577   expected_galleries_.erase(auto_erase);
    578   expected_device_map[device_id].erase(auto_erase);
    579   expected_galleries_for_all.erase(auto_erase);
    580   Verify();
    581 
    582   gallery_prefs()->EraseGalleryById(scan_erase);
    583   device_id = expected_galleries_[scan_erase].device_id;
    584   expected_galleries_.erase(scan_erase);
    585   expected_device_map[device_id].erase(scan_erase);
    586   Verify();
    587 
    588   // Also erase the previously forgetten ones to check erasing blacklisted ones.
    589   gallery_prefs()->EraseGalleryById(auto_forget);
    590   device_id = expected_galleries_[auto_forget].device_id;
    591   expected_galleries_.erase(auto_forget);
    592   expected_device_map[device_id].erase(auto_forget);
    593   Verify();
    594 
    595   gallery_prefs()->EraseGalleryById(scan_forget);
    596   device_id = expected_galleries_[scan_forget].device_id;
    597   expected_galleries_.erase(scan_forget);
    598   expected_device_map[device_id].erase(scan_forget);
    599   Verify();
    600 }
    601 
    602 TEST_F(MediaGalleriesPreferencesTest, AddGalleryWithVolumeMetadata) {
    603   MediaGalleryPrefId id;
    604   StorageInfo info;
    605   base::FilePath path;
    606   base::FilePath relative_path;
    607   base::Time now = base::Time::Now();
    608   Verify();
    609 
    610   // Add a new auto detected gallery.
    611   path = MakeMediaGalleriesTestingPath("new_auto");
    612   MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
    613   id = gallery_prefs()->AddGallery(info.device_id(), relative_path,
    614                                    MediaGalleryPrefInfo::kAutoDetected,
    615                                    ASCIIToUTF16("volume label"),
    616                                    ASCIIToUTF16("vendor name"),
    617                                    ASCIIToUTF16("model name"),
    618                                    1000000ULL, now, 0, 0, 0);
    619   EXPECT_EQ(default_galleries_count() + 1UL, id);
    620   AddGalleryExpectation(id, base::string16(), info.device_id(), relative_path,
    621                         MediaGalleryPrefInfo::kAutoDetected);
    622   Verify();
    623 
    624   MediaGalleryPrefInfo gallery_info;
    625   EXPECT_TRUE(gallery_prefs()->LookUpGalleryByPath(
    626       MakeMediaGalleriesTestingPath("new_auto"), &gallery_info));
    627   EXPECT_TRUE(gallery_info.volume_metadata_valid);
    628   EXPECT_EQ(ASCIIToUTF16("volume label"), gallery_info.volume_label);
    629   EXPECT_EQ(ASCIIToUTF16("vendor name"), gallery_info.vendor_name);
    630   EXPECT_EQ(ASCIIToUTF16("model name"), gallery_info.model_name);
    631   EXPECT_EQ(1000000ULL, gallery_info.total_size_in_bytes);
    632   // Note: we put the microseconds time into a double, so there'll
    633   // be some possible rounding errors. If it's less than 100, we don't
    634   // care.
    635   EXPECT_LE(std::abs(now.ToInternalValue() -
    636                      gallery_info.last_attach_time.ToInternalValue()),
    637             100);
    638 }
    639 
    640 TEST_F(MediaGalleriesPreferencesTest, ReplaceGalleryWithVolumeMetadata) {
    641   MediaGalleryPrefId id, metadata_id;
    642   base::FilePath path;
    643   StorageInfo info;
    644   base::FilePath relative_path;
    645   base::Time now = base::Time::Now();
    646   Verify();
    647 
    648   // Add an auto detected gallery in the prefs version 0 format.
    649   path = MakeMediaGalleriesTestingPath("new_auto");
    650   MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
    651   base::string16 gallery_name = base::ASCIIToUTF16("NewAutoGallery");
    652   id = AddGalleryWithNameV0(info.device_id(), gallery_name, relative_path,
    653                             false /*auto*/);
    654   EXPECT_EQ(default_galleries_count() + 1UL, id);
    655   AddGalleryExpectation(id, gallery_name, info.device_id(), relative_path,
    656                         MediaGalleryPrefInfo::kAutoDetected);
    657   Verify();
    658 
    659   metadata_id = gallery_prefs()->AddGallery(info.device_id(),
    660                                             relative_path,
    661                                             MediaGalleryPrefInfo::kAutoDetected,
    662                                             ASCIIToUTF16("volume label"),
    663                                             ASCIIToUTF16("vendor name"),
    664                                             ASCIIToUTF16("model name"),
    665                                             1000000ULL, now, 0, 0, 0);
    666   EXPECT_EQ(id, metadata_id);
    667   AddGalleryExpectation(id, base::string16(), info.device_id(), relative_path,
    668                         MediaGalleryPrefInfo::kAutoDetected);
    669 
    670   // Make sure the display_name is set to empty now, as the metadata
    671   // upgrade should set the manual override name empty.
    672   Verify();
    673 }
    674 
    675 // Whenever an "AutoDetected" gallery is removed, it is moved to a black listed
    676 // state.  When the gallery is added again, the black listed state is updated
    677 // back to the "AutoDetected" type.
    678 TEST_F(MediaGalleriesPreferencesTest, AutoAddedBlackListing) {
    679   MediaGalleryPrefId auto_id, id;
    680   base::FilePath path;
    681   StorageInfo info;
    682   base::FilePath relative_path;
    683   Verify();
    684 
    685   // Add a new auto detect gallery to test with.
    686   path = MakeMediaGalleriesTestingPath("new_auto");
    687   MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
    688   base::string16 gallery_name = base::ASCIIToUTF16("NewAutoGallery");
    689   id = AddGalleryWithNameV1(info.device_id(), gallery_name,
    690                             relative_path, false /*auto*/);
    691   EXPECT_EQ(default_galleries_count() + 1UL, id);
    692   auto_id = id;
    693   AddGalleryExpectation(id, gallery_name, info.device_id(), relative_path,
    694                         MediaGalleryPrefInfo::kAutoDetected);
    695   Verify();
    696 
    697   // Remove an auto added gallery (i.e. make it blacklisted).
    698   gallery_prefs()->ForgetGalleryById(auto_id);
    699   expected_galleries_[auto_id].type = MediaGalleryPrefInfo::kBlackListed;
    700   expected_galleries_for_all.erase(auto_id);
    701   Verify();
    702 
    703   // Try adding the gallery again automatically and it should be a no-op.
    704   id = AddGalleryWithNameV1(info.device_id(), gallery_name, relative_path,
    705                             false /*auto*/);
    706   EXPECT_EQ(auto_id, id);
    707   Verify();
    708 
    709   // Add the gallery again as a user action.
    710   id = gallery_prefs()->AddGalleryByPath(path,
    711                                          MediaGalleryPrefInfo::kUserAdded);
    712   EXPECT_EQ(auto_id, id);
    713   AddGalleryExpectation(id, gallery_name, info.device_id(), relative_path,
    714                         MediaGalleryPrefInfo::kAutoDetected);
    715   Verify();
    716 }
    717 
    718 // Whenever a "ScanResult" gallery is removed, it is moved to a black listed
    719 // state.  When the gallery is added again, the black listed state is updated
    720 // back to the "ScanResult" type.
    721 TEST_F(MediaGalleriesPreferencesTest, ScanResultBlackListing) {
    722   MediaGalleryPrefId scan_id, id;
    723   base::FilePath path;
    724   StorageInfo info;
    725   base::FilePath relative_path;
    726   Verify();
    727 
    728   // Add a new scan result gallery to test with.
    729   path = MakeMediaGalleriesTestingPath("new_scan");
    730   MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
    731   base::string16 gallery_name = base::ASCIIToUTF16("NewScanGallery");
    732   id = AddGalleryWithNameV2(info.device_id(), gallery_name, relative_path,
    733                             MediaGalleryPrefInfo::kScanResult);
    734   EXPECT_EQ(default_galleries_count() + 1UL, id);
    735   scan_id = id;
    736   AddGalleryExpectation(id, gallery_name, info.device_id(), relative_path,
    737                         MediaGalleryPrefInfo::kScanResult);
    738   Verify();
    739 
    740   // Remove a scan result gallery (i.e. make it blacklisted).
    741   gallery_prefs()->ForgetGalleryById(scan_id);
    742   expected_galleries_[scan_id].type = MediaGalleryPrefInfo::kRemovedScan;
    743   expected_galleries_for_all.erase(scan_id);
    744   Verify();
    745 
    746   // Try adding the gallery again as a scan result it should be a no-op.
    747   id = AddGalleryWithNameV2(info.device_id(), gallery_name, relative_path,
    748                             MediaGalleryPrefInfo::kScanResult);
    749   EXPECT_EQ(scan_id, id);
    750   Verify();
    751 
    752   // Add the gallery again as a user action.
    753   id = gallery_prefs()->AddGalleryByPath(path,
    754                                          MediaGalleryPrefInfo::kUserAdded);
    755   EXPECT_EQ(scan_id, id);
    756   AddGalleryExpectation(id, gallery_name, info.device_id(), relative_path,
    757                         MediaGalleryPrefInfo::kUserAdded);
    758   Verify();
    759 }
    760 
    761 TEST_F(MediaGalleriesPreferencesTest, UpdateGalleryNameV2) {
    762   // Add a new auto detect gallery to test with.
    763   base::FilePath path = MakeMediaGalleriesTestingPath("new_auto");
    764   StorageInfo info;
    765   base::FilePath relative_path;
    766   MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
    767   base::string16 gallery_name = base::ASCIIToUTF16("NewAutoGallery");
    768   MediaGalleryPrefId id =
    769       AddGalleryWithNameV2(info.device_id(), gallery_name, relative_path,
    770                            MediaGalleryPrefInfo::kAutoDetected);
    771   AddGalleryExpectation(id, gallery_name, info.device_id(), relative_path,
    772                         MediaGalleryPrefInfo::kAutoDetected);
    773   Verify();
    774 
    775   // Won't override the name -- don't change any expectation.
    776   gallery_name = base::string16();
    777   AddGalleryWithNameV2(info.device_id(), gallery_name, relative_path,
    778                        MediaGalleryPrefInfo::kAutoDetected);
    779   Verify();
    780 
    781   gallery_name = base::ASCIIToUTF16("NewName");
    782   id = AddGalleryWithNameV2(info.device_id(), gallery_name, relative_path,
    783                             MediaGalleryPrefInfo::kAutoDetected);
    784   // Note: will really just update the existing expectation.
    785   AddGalleryExpectation(id, gallery_name, info.device_id(), relative_path,
    786                         MediaGalleryPrefInfo::kAutoDetected);
    787   Verify();
    788 }
    789 
    790 TEST_F(MediaGalleriesPreferencesTest, GalleryPermissions) {
    791   MediaGalleryPrefId auto_id, user_added_id, to_blacklist_id, scan_id,
    792                      to_scan_remove_id, id;
    793   base::FilePath path;
    794   StorageInfo info;
    795   base::FilePath relative_path;
    796   Verify();
    797 
    798   // Add some galleries to test with.
    799   path = MakeMediaGalleriesTestingPath("new_user");
    800   MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
    801   base::string16 gallery_name = base::ASCIIToUTF16("NewUserGallery");
    802   id = AddGalleryWithNameV1(info.device_id(), gallery_name, relative_path,
    803                             true /*user*/);
    804   EXPECT_EQ(default_galleries_count() + 1UL, id);
    805   user_added_id = id;
    806   AddGalleryExpectation(id, gallery_name, info.device_id(), relative_path,
    807                         MediaGalleryPrefInfo::kUserAdded);
    808   Verify();
    809 
    810   path = MakeMediaGalleriesTestingPath("new_auto");
    811   MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
    812   gallery_name = base::ASCIIToUTF16("NewAutoGallery");
    813   id = AddGalleryWithNameV1(info.device_id(), gallery_name, relative_path,
    814                             false /*auto*/);
    815   EXPECT_EQ(default_galleries_count() + 2UL, id);
    816   auto_id = id;
    817   AddGalleryExpectation(id, gallery_name, info.device_id(), relative_path,
    818                         MediaGalleryPrefInfo::kAutoDetected);
    819   Verify();
    820 
    821   path = MakeMediaGalleriesTestingPath("to_blacklist");
    822   MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
    823   gallery_name = base::ASCIIToUTF16("ToBlacklistGallery");
    824   id = AddGalleryWithNameV1(info.device_id(), gallery_name, relative_path,
    825                             false /*auto*/);
    826   EXPECT_EQ(default_galleries_count() + 3UL, id);
    827   to_blacklist_id = id;
    828   AddGalleryExpectation(id, gallery_name, info.device_id(), relative_path,
    829                         MediaGalleryPrefInfo::kAutoDetected);
    830   Verify();
    831 
    832   path = MakeMediaGalleriesTestingPath("new_scan");
    833   MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
    834   gallery_name = base::ASCIIToUTF16("NewScanGallery");
    835   id = AddGalleryWithNameV2(info.device_id(), gallery_name, relative_path,
    836                             MediaGalleryPrefInfo::kScanResult);
    837   EXPECT_EQ(default_galleries_count() + 4UL, id);
    838   scan_id = id;
    839   AddGalleryExpectation(id, gallery_name, info.device_id(), relative_path,
    840                         MediaGalleryPrefInfo::kScanResult);
    841   Verify();
    842 
    843   path = MakeMediaGalleriesTestingPath("to_scan_remove");
    844   MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
    845   gallery_name = base::ASCIIToUTF16("ToScanRemoveGallery");
    846   id = AddGalleryWithNameV2(info.device_id(), gallery_name, relative_path,
    847                             MediaGalleryPrefInfo::kScanResult);
    848   EXPECT_EQ(default_galleries_count() + 5UL, id);
    849   to_scan_remove_id = id;
    850   AddGalleryExpectation(id, gallery_name, info.device_id(), relative_path,
    851                         MediaGalleryPrefInfo::kScanResult);
    852   Verify();
    853 
    854   // Remove permission for all galleries from the all-permission extension.
    855   gallery_prefs()->SetGalleryPermissionForExtension(
    856       *all_permission_extension.get(), auto_id, false);
    857   expected_galleries_for_all.erase(auto_id);
    858   Verify();
    859 
    860   gallery_prefs()->SetGalleryPermissionForExtension(
    861       *all_permission_extension.get(), user_added_id, false);
    862   expected_galleries_for_all.erase(user_added_id);
    863   Verify();
    864 
    865   gallery_prefs()->SetGalleryPermissionForExtension(
    866       *all_permission_extension.get(), to_blacklist_id, false);
    867   expected_galleries_for_all.erase(to_blacklist_id);
    868   Verify();
    869 
    870   gallery_prefs()->SetGalleryPermissionForExtension(
    871       *all_permission_extension.get(), scan_id, false);
    872   expected_galleries_for_all.erase(scan_id);
    873   Verify();
    874 
    875   gallery_prefs()->SetGalleryPermissionForExtension(
    876       *all_permission_extension.get(), to_scan_remove_id, false);
    877   expected_galleries_for_all.erase(to_scan_remove_id);
    878   Verify();
    879 
    880   // Add permission back for all galleries to the all-permission extension.
    881   gallery_prefs()->SetGalleryPermissionForExtension(
    882       *all_permission_extension.get(), auto_id, true);
    883   expected_galleries_for_all.insert(auto_id);
    884   Verify();
    885 
    886   gallery_prefs()->SetGalleryPermissionForExtension(
    887       *all_permission_extension.get(), user_added_id, true);
    888   expected_galleries_for_all.insert(user_added_id);
    889   Verify();
    890 
    891   gallery_prefs()->SetGalleryPermissionForExtension(
    892       *all_permission_extension.get(), to_blacklist_id, true);
    893   expected_galleries_for_all.insert(to_blacklist_id);
    894   Verify();
    895 
    896   gallery_prefs()->SetGalleryPermissionForExtension(
    897       *all_permission_extension.get(), scan_id, true);
    898   expected_galleries_for_all.insert(scan_id);
    899   Verify();
    900 
    901   gallery_prefs()->SetGalleryPermissionForExtension(
    902       *all_permission_extension.get(), to_scan_remove_id, true);
    903   expected_galleries_for_all.insert(to_scan_remove_id);
    904   Verify();
    905 
    906   // Add permission for all galleries to the regular permission extension.
    907   gallery_prefs()->SetGalleryPermissionForExtension(
    908       *regular_permission_extension.get(), auto_id, true);
    909   expected_galleries_for_regular.insert(auto_id);
    910   Verify();
    911 
    912   gallery_prefs()->SetGalleryPermissionForExtension(
    913       *regular_permission_extension.get(), user_added_id, true);
    914   expected_galleries_for_regular.insert(user_added_id);
    915   Verify();
    916 
    917   gallery_prefs()->SetGalleryPermissionForExtension(
    918       *regular_permission_extension.get(), to_blacklist_id, true);
    919   expected_galleries_for_regular.insert(to_blacklist_id);
    920   Verify();
    921 
    922   gallery_prefs()->SetGalleryPermissionForExtension(
    923       *regular_permission_extension.get(), scan_id, true);
    924   expected_galleries_for_regular.insert(scan_id);
    925   Verify();
    926 
    927   gallery_prefs()->SetGalleryPermissionForExtension(
    928       *regular_permission_extension.get(), to_scan_remove_id, true);
    929   expected_galleries_for_regular.insert(to_scan_remove_id);
    930   Verify();
    931 
    932   // Blacklist the to be black listed gallery
    933   gallery_prefs()->ForgetGalleryById(to_blacklist_id);
    934   expected_galleries_[to_blacklist_id].type =
    935       MediaGalleryPrefInfo::kBlackListed;
    936   expected_galleries_for_all.erase(to_blacklist_id);
    937   expected_galleries_for_regular.erase(to_blacklist_id);
    938   Verify();
    939 
    940   gallery_prefs()->ForgetGalleryById(to_scan_remove_id);
    941   expected_galleries_[to_scan_remove_id].type =
    942       MediaGalleryPrefInfo::kRemovedScan;
    943   expected_galleries_for_all.erase(to_scan_remove_id);
    944   expected_galleries_for_regular.erase(to_scan_remove_id);
    945   Verify();
    946 
    947   // Remove permission for all galleries to the regular permission extension.
    948   gallery_prefs()->SetGalleryPermissionForExtension(
    949       *regular_permission_extension.get(), auto_id, false);
    950   expected_galleries_for_regular.erase(auto_id);
    951   Verify();
    952 
    953   gallery_prefs()->SetGalleryPermissionForExtension(
    954       *regular_permission_extension.get(), user_added_id, false);
    955   expected_galleries_for_regular.erase(user_added_id);
    956   Verify();
    957 
    958   gallery_prefs()->SetGalleryPermissionForExtension(
    959       *regular_permission_extension.get(), scan_id, false);
    960   expected_galleries_for_regular.erase(scan_id);
    961   Verify();
    962 
    963   // Add permission for an invalid gallery id.
    964   gallery_prefs()->SetGalleryPermissionForExtension(
    965       *regular_permission_extension.get(), 9999L, true);
    966   Verify();
    967 }
    968 
    969 // What an existing gallery is added again, update the gallery information if
    970 // needed.
    971 TEST_F(MediaGalleriesPreferencesTest, UpdateGalleryDetails) {
    972   MediaGalleryPrefId auto_id, id;
    973   base::FilePath path;
    974   StorageInfo info;
    975   base::FilePath relative_path;
    976   Verify();
    977 
    978   // Add a new auto detect gallery to test with.
    979   path = MakeMediaGalleriesTestingPath("new_auto");
    980   MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
    981   base::string16 gallery_name = base::ASCIIToUTF16("NewAutoGallery");
    982   id = AddGalleryWithNameV1(info.device_id(), gallery_name,
    983                             relative_path, false /*auto*/);
    984   EXPECT_EQ(default_galleries_count() + 1UL, id);
    985   auto_id = id;
    986   AddGalleryExpectation(id, gallery_name, info.device_id(), relative_path,
    987                         MediaGalleryPrefInfo::kAutoDetected);
    988   Verify();
    989 
    990   // Update the device name and add the gallery again.
    991   gallery_name = base::ASCIIToUTF16("AutoGallery2");
    992   id = AddGalleryWithNameV1(info.device_id(), gallery_name, relative_path,
    993                             false /*auto*/);
    994   EXPECT_EQ(auto_id, id);
    995   AddGalleryExpectation(id, gallery_name, info.device_id(), relative_path,
    996                         MediaGalleryPrefInfo::kAutoDetected);
    997   Verify();
    998 }
    999 
   1000 TEST_F(MediaGalleriesPreferencesTest, MultipleGalleriesPerDevices) {
   1001   base::FilePath path;
   1002   StorageInfo info;
   1003   base::FilePath relative_path;
   1004   Verify();
   1005 
   1006   // Add a regular gallery
   1007   path = MakeMediaGalleriesTestingPath("new_user");
   1008   MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
   1009   base::string16 gallery_name = base::ASCIIToUTF16("NewUserGallery");
   1010   MediaGalleryPrefId user_added_id =
   1011       AddGalleryWithNameV1(info.device_id(), gallery_name, relative_path,
   1012                            true /*user*/);
   1013   EXPECT_EQ(default_galleries_count() + 1UL, user_added_id);
   1014   AddGalleryExpectation(user_added_id, gallery_name, info.device_id(),
   1015                         relative_path, MediaGalleryPrefInfo::kUserAdded);
   1016   Verify();
   1017 
   1018   // Find it by device id and fail to find something related.
   1019   MediaGalleryPrefIdSet pref_id_set;
   1020   pref_id_set = gallery_prefs()->LookUpGalleriesByDeviceId(info.device_id());
   1021   EXPECT_EQ(1U, pref_id_set.size());
   1022   EXPECT_TRUE(pref_id_set.find(user_added_id) != pref_id_set.end());
   1023 
   1024   MediaStorageUtil::GetDeviceInfoFromPath(
   1025       MakeMediaGalleriesTestingPath("new_user/foo"), &info, &relative_path);
   1026   pref_id_set = gallery_prefs()->LookUpGalleriesByDeviceId(info.device_id());
   1027   EXPECT_EQ(0U, pref_id_set.size());
   1028 
   1029   // Add some galleries on the same device.
   1030   relative_path = base::FilePath(FILE_PATH_LITERAL("path1/on/device1"));
   1031   gallery_name = base::ASCIIToUTF16("Device1Path1");
   1032   std::string device_id = "path:device1";
   1033   MediaGalleryPrefId dev1_path1_id = AddGalleryWithNameV1(
   1034       device_id, gallery_name, relative_path, true /*user*/);
   1035   EXPECT_EQ(default_galleries_count() + 2UL, dev1_path1_id);
   1036   AddGalleryExpectation(dev1_path1_id, gallery_name, device_id, relative_path,
   1037                         MediaGalleryPrefInfo::kUserAdded);
   1038   Verify();
   1039 
   1040   relative_path = base::FilePath(FILE_PATH_LITERAL("path2/on/device1"));
   1041   gallery_name = base::ASCIIToUTF16("Device1Path2");
   1042   MediaGalleryPrefId dev1_path2_id = AddGalleryWithNameV1(
   1043       device_id, gallery_name, relative_path, true /*user*/);
   1044   EXPECT_EQ(default_galleries_count() + 3UL, dev1_path2_id);
   1045   AddGalleryExpectation(dev1_path2_id, gallery_name, device_id, relative_path,
   1046                         MediaGalleryPrefInfo::kUserAdded);
   1047   Verify();
   1048 
   1049   relative_path = base::FilePath(FILE_PATH_LITERAL("path1/on/device2"));
   1050   gallery_name = base::ASCIIToUTF16("Device2Path1");
   1051   device_id = "path:device2";
   1052   MediaGalleryPrefId dev2_path1_id = AddGalleryWithNameV1(
   1053       device_id, gallery_name, relative_path, true /*user*/);
   1054   EXPECT_EQ(default_galleries_count() + 4UL, dev2_path1_id);
   1055   AddGalleryExpectation(dev2_path1_id, gallery_name, device_id, relative_path,
   1056                         MediaGalleryPrefInfo::kUserAdded);
   1057   Verify();
   1058 
   1059   relative_path = base::FilePath(FILE_PATH_LITERAL("path2/on/device2"));
   1060   gallery_name = base::ASCIIToUTF16("Device2Path2");
   1061   MediaGalleryPrefId dev2_path2_id = AddGalleryWithNameV1(
   1062       device_id, gallery_name, relative_path, true /*user*/);
   1063   EXPECT_EQ(default_galleries_count() + 5UL, dev2_path2_id);
   1064   AddGalleryExpectation(dev2_path2_id, gallery_name, device_id, relative_path,
   1065                         MediaGalleryPrefInfo::kUserAdded);
   1066   Verify();
   1067 
   1068   // Check that adding one of them again works as expected.
   1069   MediaGalleryPrefId id = AddGalleryWithNameV1(
   1070       device_id, gallery_name, relative_path, true /*user*/);
   1071   EXPECT_EQ(dev2_path2_id, id);
   1072   Verify();
   1073 }
   1074 
   1075 TEST_F(MediaGalleriesPreferencesTest, GalleryChangeObserver) {
   1076   // Start with one observer.
   1077   MockGalleryChangeObserver observer1(gallery_prefs());
   1078   gallery_prefs()->AddGalleryChangeObserver(&observer1);
   1079 
   1080   // Add a new auto detected gallery.
   1081   base::FilePath path = MakeMediaGalleriesTestingPath("new_auto");
   1082   StorageInfo info;
   1083   base::FilePath relative_path;
   1084   MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
   1085   base::string16 gallery_name = base::ASCIIToUTF16("NewAutoGallery");
   1086   MediaGalleryPrefId auto_id = AddGalleryWithNameV1(
   1087       info.device_id(), gallery_name, relative_path, false /*auto*/);
   1088   EXPECT_EQ(default_galleries_count() + 1UL, auto_id);
   1089   AddGalleryExpectation(auto_id, gallery_name, info.device_id(),
   1090                         relative_path, MediaGalleryPrefInfo::kAutoDetected);
   1091   EXPECT_EQ(1, observer1.notifications());
   1092 
   1093   // Add a second observer.
   1094   MockGalleryChangeObserver observer2(gallery_prefs());
   1095   gallery_prefs()->AddGalleryChangeObserver(&observer2);
   1096 
   1097   // Add a new user added gallery.
   1098   path = MakeMediaGalleriesTestingPath("new_user");
   1099   MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
   1100   gallery_name = base::ASCIIToUTF16("NewUserGallery");
   1101   MediaGalleryPrefId user_added_id =
   1102       AddGalleryWithNameV1(info.device_id(), gallery_name, relative_path,
   1103                            true /*user*/);
   1104   AddGalleryExpectation(user_added_id, gallery_name, info.device_id(),
   1105                         relative_path, MediaGalleryPrefInfo::kUserAdded);
   1106   EXPECT_EQ(default_galleries_count() + 2UL, user_added_id);
   1107   EXPECT_EQ(2, observer1.notifications());
   1108   EXPECT_EQ(1, observer2.notifications());
   1109 
   1110   // Remove the first observer.
   1111   gallery_prefs()->RemoveGalleryChangeObserver(&observer1);
   1112 
   1113   // Remove an auto added gallery (i.e. make it blacklisted).
   1114   gallery_prefs()->ForgetGalleryById(auto_id);
   1115   expected_galleries_[auto_id].type = MediaGalleryPrefInfo::kBlackListed;
   1116   expected_galleries_for_all.erase(auto_id);
   1117 
   1118   EXPECT_EQ(2, observer1.notifications());
   1119   EXPECT_EQ(2, observer2.notifications());
   1120 
   1121   // Remove a user added gallery and it should go away.
   1122   gallery_prefs()->ForgetGalleryById(user_added_id);
   1123   expected_galleries_.erase(user_added_id);
   1124   expected_device_map[info.device_id()].erase(user_added_id);
   1125 
   1126   EXPECT_EQ(2, observer1.notifications());
   1127   EXPECT_EQ(3, observer2.notifications());
   1128 }
   1129 
   1130 TEST_F(MediaGalleriesPreferencesTest, UpdateSingletonDeviceIdType) {
   1131   MediaGalleryPrefId id;
   1132   base::FilePath path;
   1133   Verify();
   1134 
   1135   // Add a new auto detect gallery to test with.
   1136   path = MakeMediaGalleriesTestingPath("new_auto");
   1137   base::string16 gallery_name = base::ASCIIToUTF16("NewAutoGallery");
   1138   std::string device_id = StorageInfo::MakeDeviceId(StorageInfo::ITUNES,
   1139                                                     path.AsUTF8Unsafe());
   1140   id = AddGalleryWithNameV2(device_id, gallery_name, base::FilePath(),
   1141                             MediaGalleryPrefInfo::kAutoDetected);
   1142   EXPECT_EQ(default_galleries_count() + 1UL, id);
   1143   AddGalleryExpectation(id, gallery_name, device_id, base::FilePath(),
   1144                         MediaGalleryPrefInfo::kAutoDetected);
   1145   Verify();
   1146 
   1147   // Update the device id.
   1148   MockGalleryChangeObserver observer(gallery_prefs());
   1149   gallery_prefs()->AddGalleryChangeObserver(&observer);
   1150 
   1151   path = MakeMediaGalleriesTestingPath("updated_path");
   1152   std::string updated_device_id =
   1153       StorageInfo::MakeDeviceId(StorageInfo::ITUNES, path.AsUTF8Unsafe());
   1154   EXPECT_TRUE(UpdateDeviceIDForSingletonType(updated_device_id));
   1155   AddGalleryExpectation(id, gallery_name, updated_device_id, base::FilePath(),
   1156                         MediaGalleryPrefInfo::kAutoDetected);
   1157   expected_device_map[device_id].erase(id);
   1158   expected_device_map[updated_device_id].insert(id);
   1159   Verify();
   1160   EXPECT_EQ(1, observer.notifications());
   1161 
   1162   // No gallery for type.
   1163   std::string new_device_id =
   1164       StorageInfo::MakeDeviceId(StorageInfo::PICASA, path.AsUTF8Unsafe());
   1165   EXPECT_FALSE(UpdateDeviceIDForSingletonType(new_device_id));
   1166 }
   1167 
   1168 TEST_F(MediaGalleriesPreferencesTest, LookupImportedGalleryByPath) {
   1169   MediaGalleryPrefId id;
   1170   base::FilePath path;
   1171   Verify();
   1172 
   1173   // iTunes device path points to an XML file in the library directory.
   1174   path = MakeMediaGalleriesTestingPath("new_auto").AppendASCII("library.xml");
   1175   base::string16 gallery_name = base::ASCIIToUTF16("NewAutoGallery");
   1176   std::string device_id = StorageInfo::MakeDeviceId(StorageInfo::ITUNES,
   1177                                                     path.AsUTF8Unsafe());
   1178   id = AddGalleryWithNameV2(device_id, gallery_name, base::FilePath(),
   1179                             MediaGalleryPrefInfo::kAutoDetected);
   1180   EXPECT_EQ(default_galleries_count() + 1UL, id);
   1181   AddGalleryExpectation(id, gallery_name, device_id, base::FilePath(),
   1182                         MediaGalleryPrefInfo::kAutoDetected);
   1183   Verify();
   1184 
   1185   // Verify we can look up the imported gallery by its path.
   1186   MediaGalleryPrefInfo gallery_info;
   1187   EXPECT_TRUE(gallery_prefs()->LookUpGalleryByPath(path.DirName(),
   1188                                                    &gallery_info));
   1189   EXPECT_EQ(id, gallery_info.pref_id);
   1190 }
   1191 
   1192 TEST_F(MediaGalleriesPreferencesTest, ScanResults) {
   1193   MediaGalleryPrefId id;
   1194   base::FilePath path;
   1195   StorageInfo info;
   1196   base::FilePath relative_path;
   1197   base::Time now = base::Time::Now();
   1198   Verify();
   1199 
   1200   // Add a new scan result gallery to test with.
   1201   path = MakeMediaGalleriesTestingPath("new_scan");
   1202   MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
   1203   id = gallery_prefs()->AddGallery(info.device_id(), relative_path,
   1204                                    MediaGalleryPrefInfo::kScanResult,
   1205                                    ASCIIToUTF16("volume label"),
   1206                                    ASCIIToUTF16("vendor name"),
   1207                                    ASCIIToUTF16("model name"),
   1208                                    1000000ULL, now, 1, 2, 3);
   1209   EXPECT_EQ(default_galleries_count() + 1UL, id);
   1210   AddScanResultExpectation(id, base::string16(), info.device_id(),
   1211                            relative_path, 1, 2, 3);
   1212   Verify();
   1213 
   1214   // Update the found media count.
   1215   id = gallery_prefs()->AddGallery(info.device_id(), relative_path,
   1216                                    MediaGalleryPrefInfo::kScanResult,
   1217                                    ASCIIToUTF16("volume label"),
   1218                                    ASCIIToUTF16("vendor name"),
   1219                                    ASCIIToUTF16("model name"),
   1220                                    1000000ULL, now, 4, 5, 6);
   1221   EXPECT_EQ(default_galleries_count() + 1UL, id);
   1222   AddScanResultExpectation(id, base::string16(), info.device_id(),
   1223                            relative_path, 4, 5, 6);
   1224   Verify();
   1225 
   1226   // Remove a scan result (i.e. make it blacklisted).
   1227   gallery_prefs()->ForgetGalleryById(id);
   1228   expected_galleries_[id].type = MediaGalleryPrefInfo::kRemovedScan;
   1229   expected_galleries_[id].audio_count = 0;
   1230   expected_galleries_[id].image_count = 0;
   1231   expected_galleries_[id].video_count = 0;
   1232   Verify();
   1233 
   1234   // Try adding the gallery again as a scan result it should be a no-op.
   1235   id = gallery_prefs()->AddGallery(info.device_id(), relative_path,
   1236                                    MediaGalleryPrefInfo::kScanResult,
   1237                                    ASCIIToUTF16("volume label"),
   1238                                    ASCIIToUTF16("vendor name"),
   1239                                    ASCIIToUTF16("model name"),
   1240                                    1000000ULL, now, 7, 8, 9);
   1241   EXPECT_EQ(default_galleries_count() + 1UL, id);
   1242   Verify();
   1243 
   1244   // Add the gallery again as a user action.
   1245   id = gallery_prefs()->AddGalleryByPath(path,
   1246                                          MediaGalleryPrefInfo::kUserAdded);
   1247   EXPECT_EQ(default_galleries_count() + 1UL, id);
   1248   AddGalleryExpectation(id, base::string16(), info.device_id(), relative_path,
   1249                         MediaGalleryPrefInfo::kUserAdded);
   1250   Verify();
   1251 }
   1252 
   1253 TEST(MediaGalleriesPrefInfoTest, NameGeneration) {
   1254   ASSERT_TRUE(TestStorageMonitor::CreateAndInstall());
   1255 
   1256   MediaGalleryPrefInfo info;
   1257   info.pref_id = 1;
   1258   info.display_name = ASCIIToUTF16("override");
   1259   info.device_id = StorageInfo::MakeDeviceId(
   1260       StorageInfo::REMOVABLE_MASS_STORAGE_WITH_DCIM, "unique");
   1261 
   1262   EXPECT_EQ(ASCIIToUTF16("override"), info.GetGalleryDisplayName());
   1263 
   1264   info.display_name = ASCIIToUTF16("o2");
   1265   EXPECT_EQ(ASCIIToUTF16("o2"), info.GetGalleryDisplayName());
   1266 
   1267   EXPECT_EQ(l10n_util::GetStringUTF16(
   1268                 IDS_MEDIA_GALLERIES_DIALOG_DEVICE_NOT_ATTACHED),
   1269             info.GetGalleryAdditionalDetails());
   1270 
   1271   info.last_attach_time = base::Time::Now();
   1272   EXPECT_NE(l10n_util::GetStringUTF16(
   1273                 IDS_MEDIA_GALLERIES_DIALOG_DEVICE_NOT_ATTACHED),
   1274             info.GetGalleryAdditionalDetails());
   1275   EXPECT_NE(l10n_util::GetStringUTF16(
   1276                 IDS_MEDIA_GALLERIES_DIALOG_DEVICE_ATTACHED),
   1277             info.GetGalleryAdditionalDetails());
   1278 
   1279   info.volume_label = ASCIIToUTF16("vol");
   1280   info.vendor_name = ASCIIToUTF16("vendor");
   1281   info.model_name = ASCIIToUTF16("model");
   1282   EXPECT_EQ(ASCIIToUTF16("o2"), info.GetGalleryDisplayName());
   1283 
   1284   info.display_name = base::string16();
   1285   EXPECT_EQ(ASCIIToUTF16("vol"), info.GetGalleryDisplayName());
   1286   info.volume_label = base::string16();
   1287   EXPECT_EQ(ASCIIToUTF16("vendor, model"), info.GetGalleryDisplayName());
   1288 
   1289   info.device_id = StorageInfo::MakeDeviceId(
   1290       StorageInfo::FIXED_MASS_STORAGE, "unique");
   1291   EXPECT_EQ(base::FilePath(FILE_PATH_LITERAL("unique")).AsUTF8Unsafe(),
   1292             base::UTF16ToUTF8(info.GetGalleryTooltip()));
   1293 
   1294   TestStorageMonitor::Destroy();
   1295 }
   1296 
   1297 TEST_F(MediaGalleriesPreferencesTest, SetsDefaultGalleryTypeField) {
   1298   // Tests that default galleries (Music, Pictures, Video) have the correct
   1299   // default_gallery field set.
   1300 
   1301   // No default galleries exist on CrOS so this test isn't relevant there.
   1302 #if defined(OS_CHROMEOS)
   1303   return;
   1304 #endif
   1305 
   1306   base::FilePath music_path;
   1307   base::FilePath pictures_path;
   1308   base::FilePath videos_path;
   1309   bool got_music_path = PathService::Get(chrome::DIR_USER_MUSIC, &music_path);
   1310   bool got_pictures_path =
   1311       PathService::Get(chrome::DIR_USER_PICTURES, &pictures_path);
   1312   bool got_videos_path =
   1313       PathService::Get(chrome::DIR_USER_VIDEOS, &videos_path);
   1314 
   1315   int num_default_galleries = 0;
   1316 
   1317   const MediaGalleriesPrefInfoMap& known_galleries =
   1318       gallery_prefs()->known_galleries();
   1319   for (MediaGalleriesPrefInfoMap::const_iterator it =
   1320            known_galleries.begin();
   1321        it != known_galleries.end();
   1322        ++it) {
   1323     if (it->second.type != MediaGalleryPrefInfo::kAutoDetected)
   1324       continue;
   1325 
   1326     std::string unique_id;
   1327     if (!StorageInfo::CrackDeviceId(it->second.device_id, NULL, &unique_id))
   1328       continue;
   1329 
   1330     if (got_music_path && unique_id == music_path.AsUTF8Unsafe()) {
   1331       EXPECT_EQ(MediaGalleryPrefInfo::DefaultGalleryType::kMusicDefault,
   1332                 it->second.default_gallery_type);
   1333       num_default_galleries++;
   1334     } else if (got_pictures_path && unique_id == pictures_path.AsUTF8Unsafe()) {
   1335       EXPECT_EQ(MediaGalleryPrefInfo::DefaultGalleryType::kPicturesDefault,
   1336                 it->second.default_gallery_type);
   1337       num_default_galleries++;
   1338     } else if (got_videos_path && unique_id == videos_path.AsUTF8Unsafe()) {
   1339       EXPECT_EQ(MediaGalleryPrefInfo::DefaultGalleryType::kVideosDefault,
   1340                 it->second.default_gallery_type);
   1341       num_default_galleries++;
   1342     } else {
   1343       EXPECT_EQ(MediaGalleryPrefInfo::DefaultGalleryType::kNotDefault,
   1344                 it->second.default_gallery_type);
   1345     }
   1346   }
   1347 
   1348   EXPECT_EQ(3, num_default_galleries);
   1349 }
   1350 
   1351 TEST_F(MediaGalleriesPreferencesTest, UpdatesDefaultGalleryType) {
   1352   // Tests that if the path of a default gallery changed since last init,
   1353   // then when the MediaGalleriesPreferences is initialized, it will
   1354   // rewrite the device ID in prefs to include the new path.
   1355 
   1356   // No default galleries exist on CrOS so this test isn't relevant there.
   1357 #if defined(OS_CHROMEOS)
   1358   return;
   1359 #endif
   1360 
   1361   base::FilePath old_music_path;
   1362   base::FilePath old_pictures_path;
   1363   base::FilePath old_videos_path;
   1364   bool got_old_music_path =
   1365       PathService::Get(chrome::DIR_USER_MUSIC, &old_music_path);
   1366   bool got_old_pictures_path =
   1367       PathService::Get(chrome::DIR_USER_PICTURES, &old_pictures_path);
   1368   bool got_old_videos_path =
   1369       PathService::Get(chrome::DIR_USER_VIDEOS, &old_videos_path);
   1370 
   1371   bool found_music = false;
   1372   bool found_pictures = false;
   1373   bool found_videos = false;
   1374 
   1375   const MediaGalleriesPrefInfoMap& old_known_galleries =
   1376       gallery_prefs()->known_galleries();
   1377   for (MediaGalleriesPrefInfoMap::const_iterator it =
   1378            old_known_galleries.begin();
   1379        it != old_known_galleries.end();
   1380        ++it) {
   1381     if (it->second.type == MediaGalleryPrefInfo::kAutoDetected) {
   1382       std::string unique_id;
   1383       if (!StorageInfo::CrackDeviceId(it->second.device_id, NULL, &unique_id))
   1384         continue;
   1385 
   1386       if (got_old_music_path &&
   1387           it->second.default_gallery_type ==
   1388           MediaGalleryPrefInfo::DefaultGalleryType::kMusicDefault) {
   1389         EXPECT_EQ(old_music_path.AsUTF8Unsafe(), unique_id);
   1390         found_music = true;
   1391       } else if (got_old_pictures_path &&
   1392                  it->second.default_gallery_type ==
   1393                  MediaGalleryPrefInfo::DefaultGalleryType::kPicturesDefault) {
   1394         EXPECT_EQ(old_pictures_path.AsUTF8Unsafe(), unique_id);
   1395         found_pictures = true;
   1396       } else if (got_old_videos_path &&
   1397                  it->second.default_gallery_type ==
   1398                  MediaGalleryPrefInfo::DefaultGalleryType::kVideosDefault) {
   1399         EXPECT_EQ(old_videos_path.AsUTF8Unsafe(), unique_id);
   1400         found_videos = true;
   1401       }
   1402     }
   1403   }
   1404 
   1405   EXPECT_TRUE(found_music);
   1406   EXPECT_TRUE(found_pictures);
   1407   EXPECT_TRUE(found_videos);
   1408 
   1409   ChangeMediaPathOverrides();
   1410   ReinitPrefsAndExpectations();
   1411 
   1412   base::FilePath new_music_path;
   1413   base::FilePath new_pictures_path;
   1414   base::FilePath new_videos_path;
   1415   bool got_new_music_path =
   1416       PathService::Get(chrome::DIR_USER_MUSIC, &new_music_path);
   1417   bool got_new_pictures_path =
   1418       PathService::Get(chrome::DIR_USER_PICTURES, &new_pictures_path);
   1419   bool got_new_videos_path =
   1420       PathService::Get(chrome::DIR_USER_VIDEOS, &new_videos_path);
   1421 
   1422   EXPECT_NE(new_music_path, old_music_path);
   1423   EXPECT_NE(new_pictures_path, old_pictures_path);
   1424   EXPECT_NE(new_videos_path, old_videos_path);
   1425 
   1426   found_music = false;
   1427   found_pictures = false;
   1428   found_videos = false;
   1429 
   1430   const MediaGalleriesPrefInfoMap& known_galleries =
   1431       gallery_prefs()->known_galleries();
   1432   for (MediaGalleriesPrefInfoMap::const_iterator it = known_galleries.begin();
   1433        it != known_galleries.end();
   1434        ++it) {
   1435     if (it->second.type == MediaGalleryPrefInfo::kAutoDetected) {
   1436       std::string unique_id;
   1437       if (!StorageInfo::CrackDeviceId(it->second.device_id, NULL, &unique_id))
   1438         continue;
   1439 
   1440       if (got_new_music_path &&
   1441           it->second.default_gallery_type ==
   1442           MediaGalleryPrefInfo::DefaultGalleryType::kMusicDefault) {
   1443         EXPECT_EQ(new_music_path.AsUTF8Unsafe(), unique_id);
   1444         found_music = true;
   1445       } else if (got_new_pictures_path &&
   1446                  it->second.default_gallery_type ==
   1447                  MediaGalleryPrefInfo::DefaultGalleryType::kPicturesDefault) {
   1448         EXPECT_EQ(new_pictures_path.AsUTF8Unsafe(), unique_id);
   1449         found_pictures = true;
   1450       } else if (got_new_videos_path &&
   1451                  it->second.default_gallery_type ==
   1452                  MediaGalleryPrefInfo::DefaultGalleryType::kVideosDefault) {
   1453         EXPECT_EQ(new_videos_path.AsUTF8Unsafe(), unique_id);
   1454         found_videos = true;
   1455       }
   1456     }
   1457   }
   1458 
   1459   EXPECT_TRUE(found_music);
   1460   EXPECT_TRUE(found_pictures);
   1461   EXPECT_TRUE(found_videos);
   1462 }
   1463 
   1464 TEST_F(MediaGalleriesPreferencesTest, UpdateAddsDefaultGalleryTypeIfMissing) {
   1465   // Tests that if no default_gallery_type was specified for an existing prefs
   1466   // info object corresponding to a particular gallery, then when the
   1467   // MediaGalleriesPreferences is initialized, it assigns the proper one.
   1468 
   1469   // No default galleries exist on CrOS so this test isn't relevant there.
   1470 #if defined(OS_CHROMEOS)
   1471   return;
   1472 #endif
   1473 
   1474   // Add a new user added gallery.
   1475   AddFixedGalleryWithExepectation("user_added", "UserAdded",
   1476                                   MediaGalleryPrefInfo::kUserAdded);
   1477 
   1478   // Remove the "default_gallery_type" field completely from the persisted data
   1479   // for the prefs info object. This simulates the case where a user updated
   1480   // Chrome from a version without that field to one with it.
   1481   RemovePersistedDefaultGalleryValues();
   1482 
   1483   // Reinitializing the MediaGalleriesPreferences should populate the
   1484   // default_gallery_type field with the correct value for each gallery.
   1485   ReinitPrefsAndExpectations();
   1486 
   1487   base::FilePath music_path;
   1488   base::FilePath pictures_path;
   1489   base::FilePath videos_path;
   1490   bool got_music_path = PathService::Get(chrome::DIR_USER_MUSIC, &music_path);
   1491   bool got_pictures_path =
   1492       PathService::Get(chrome::DIR_USER_PICTURES, &pictures_path);
   1493   bool got_videos_path =
   1494       PathService::Get(chrome::DIR_USER_VIDEOS, &videos_path);
   1495 
   1496   bool found_music = false;
   1497   bool found_pictures = false;
   1498   bool found_videos = false;
   1499   bool found_user_added = false;
   1500 
   1501   const MediaGalleriesPrefInfoMap& known_galleries =
   1502       gallery_prefs()->known_galleries();
   1503   for (MediaGalleriesPrefInfoMap::const_iterator it = known_galleries.begin();
   1504        it != known_galleries.end();
   1505        ++it) {
   1506     std::string unique_id;
   1507     if (!StorageInfo::CrackDeviceId(it->second.device_id, NULL, &unique_id))
   1508       continue;
   1509 
   1510     if (got_music_path &&
   1511         it->second.default_gallery_type ==
   1512         MediaGalleryPrefInfo::DefaultGalleryType::kMusicDefault) {
   1513       EXPECT_EQ(music_path.AsUTF8Unsafe(), unique_id);
   1514       found_music = true;
   1515     } else if (got_pictures_path &&
   1516                it->second.default_gallery_type ==
   1517                MediaGalleryPrefInfo::DefaultGalleryType::kPicturesDefault) {
   1518       EXPECT_EQ(pictures_path.AsUTF8Unsafe(), unique_id);
   1519       found_pictures = true;
   1520     } else if (got_videos_path &&
   1521                it->second.default_gallery_type ==
   1522                MediaGalleryPrefInfo::DefaultGalleryType::kVideosDefault) {
   1523       EXPECT_EQ(videos_path.AsUTF8Unsafe(), unique_id);
   1524       found_videos = true;
   1525     } else if (it->second.default_gallery_type ==
   1526                MediaGalleryPrefInfo::DefaultGalleryType::kNotDefault) {
   1527       found_user_added = true;
   1528     }
   1529   }
   1530 
   1531   EXPECT_TRUE(found_music);
   1532   EXPECT_TRUE(found_pictures);
   1533   EXPECT_TRUE(found_videos);
   1534   EXPECT_TRUE(found_user_added);
   1535 }
   1536