media_galleries_preferences_unittest.cc revision 1e9bf3e0803691d0a228da41fc608347b6db4340
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MediaGalleriesPreferences unit tests.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/media_galleries/media_galleries_preferences.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/run_loop.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_system.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/test_extension_system.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/media_galleries/media_file_system_registry.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/media_galleries/media_galleries_test_util.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/storage_monitor/media_storage_util.h"
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/storage_monitor/storage_monitor.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/storage_monitor/test_storage_monitor.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/extensions/background_info.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
25ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "content/public/test/test_browser_thread_bundle.h"
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "grit/generated_resources.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/api/string_ordinal.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "ui/base/l10n/l10n_util.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS)
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/user_manager.h"
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h"
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/settings/device_settings_service.h"
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockGalleryChangeObserver
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public MediaGalleriesPreferences::GalleryChangeObserver {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit MockGalleryChangeObserver(MediaGalleriesPreferences* pref)
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : pref_(pref),
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        notifications_(0) {}
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~MockGalleryChangeObserver() {}
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int notifications() const { return notifications_;}
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // MediaGalleriesPreferences::GalleryChangeObserver implementation.
51d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  virtual void OnPermissionAdded(MediaGalleriesPreferences* pref,
52d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                 const std::string& extension_id,
53d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                 MediaGalleryPrefId pref_id) OVERRIDE {
54d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    EXPECT_EQ(pref_, pref);
55d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    ++notifications_;
56d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
57d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
58d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  virtual void OnPermissionRemoved(MediaGalleriesPreferences* pref,
59d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                   const std::string& extension_id,
60d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                   MediaGalleryPrefId pref_id) OVERRIDE {
61d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    EXPECT_EQ(pref_, pref);
62d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    ++notifications_;
63d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
64d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
65d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  virtual void OnGalleryAdded(MediaGalleriesPreferences* pref,
66d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                              MediaGalleryPrefId pref_id) OVERRIDE {
67d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    EXPECT_EQ(pref_, pref);
68d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    ++notifications_;
69d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
70d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
71d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  virtual void OnGalleryRemoved(MediaGalleriesPreferences* pref,
72d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                MediaGalleryPrefId pref_id) OVERRIDE {
73d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    EXPECT_EQ(pref_, pref);
74d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    ++notifications_;
75d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
76d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
77d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  virtual void OnGalleryInfoUpdated(MediaGalleriesPreferences* pref,
78d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                    MediaGalleryPrefId pref_id) OVERRIDE {
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(pref_, pref);
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++notifications_;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MediaGalleriesPreferences* pref_;
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int notifications_;
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MockGalleryChangeObserver);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MediaGalleriesPreferencesTest : public testing::Test {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<std::string /*device id*/, MediaGalleryPrefIdSet>
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DeviceIdPrefIdsMap;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MediaGalleriesPreferencesTest()
97ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch      : profile_(new TestingProfile()),
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default_galleries_count_(0) {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MediaGalleriesPreferencesTest() {
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
105d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    ASSERT_TRUE(TestStorageMonitor::CreateAndInstall());
106558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extensions::TestExtensionSystem* extension_system(
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        static_cast<extensions::TestExtensionSystem*>(
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            extensions::ExtensionSystem::Get(profile_.get())));
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    extension_system->CreateExtensionService(
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CommandLine::ForCurrentProcess(), base::FilePath(), false);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gallery_prefs_.reset(new MediaGalleriesPreferences(profile_.get()));
1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    base::RunLoop loop;
1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    gallery_prefs_->EnsureInitialized(loop.QuitClosure());
1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    loop.Run();
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Load the default galleries into the expectations.
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const MediaGalleriesPrefInfoMap& known_galleries =
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        gallery_prefs_->known_galleries();
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (known_galleries.size()) {
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_EQ(3U, known_galleries.size());
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default_galleries_count_ = 3;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MediaGalleriesPrefInfoMap::const_iterator it;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (it = known_galleries.begin(); it != known_galleries.end(); ++it) {
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        expected_galleries_[it->first] = it->second;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (it->second.type == MediaGalleryPrefInfo::kAutoDetected)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          expected_galleries_for_all.insert(it->first);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<std::string> all_permissions;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    all_permissions.push_back("allAutoDetected");
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    all_permissions.push_back("read");
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<std::string> read_permissions;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    read_permissions.push_back("read");
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    all_permission_extension =
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddMediaGalleriesApp("all", all_permissions, profile_.get());
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    regular_permission_extension =
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddMediaGalleriesApp("regular", read_permissions, profile_.get());
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    no_permissions_extension =
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddMediaGalleriesApp("no", read_permissions, profile_.get());
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Verify();
148d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    TestStorageMonitor::RemoveSingleton();
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Verify() {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const MediaGalleriesPrefInfoMap& known_galleries =
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        gallery_prefs_->known_galleries();
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected_galleries_.size(), known_galleries.size());
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (MediaGalleriesPrefInfoMap::const_iterator it = known_galleries.begin();
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         it != known_galleries.end();
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         ++it) {
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      VerifyGalleryInfo(it->second, it->first);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (DeviceIdPrefIdsMap::const_iterator it = expected_device_map.begin();
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         it != expected_device_map.end();
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         ++it) {
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MediaGalleryPrefIdSet actual_id_set =
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          gallery_prefs_->LookUpGalleriesByDeviceId(it->first);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(it->second, actual_id_set);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::set<MediaGalleryPrefId> galleries_for_all =
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        gallery_prefs_->GalleriesForExtension(*all_permission_extension.get());
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected_galleries_for_all, galleries_for_all);
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::set<MediaGalleryPrefId> galleries_for_regular =
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        gallery_prefs_->GalleriesForExtension(
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            *regular_permission_extension.get());
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected_galleries_for_regular, galleries_for_regular);
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::set<MediaGalleryPrefId> galleries_for_no =
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        gallery_prefs_->GalleriesForExtension(*no_permissions_extension.get());
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0U, galleries_for_no.size());
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void VerifyGalleryInfo(const MediaGalleryPrefInfo& actual,
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         MediaGalleryPrefId expected_id) const {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MediaGalleriesPrefInfoMap::const_iterator in_expectation =
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      expected_galleries_.find(expected_id);
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_FALSE(in_expectation == expected_galleries_.end())  << expected_id;
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(in_expectation->second.pref_id, actual.pref_id);
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(in_expectation->second.display_name, actual.display_name);
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(in_expectation->second.device_id, actual.device_id);
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(in_expectation->second.path.value(), actual.path.value());
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(in_expectation->second.type, actual.type);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MediaGalleriesPreferences* gallery_prefs() {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return gallery_prefs_.get();
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint64 default_galleries_count() {
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return default_galleries_count_;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddGalleryExpectation(MediaGalleryPrefId id, string16 display_name,
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             std::string device_id,
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             base::FilePath relative_path,
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             MediaGalleryPrefInfo::Type type) {
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected_galleries_[id].pref_id = id;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected_galleries_[id].display_name = display_name;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected_galleries_[id].device_id = device_id;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected_galleries_[id].path = relative_path.NormalizePathSeparators();
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected_galleries_[id].type = type;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type == MediaGalleryPrefInfo::kAutoDetected)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      expected_galleries_for_all.insert(id);
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected_device_map[device_id].insert(id);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MediaGalleryPrefId AddGalleryWithNameV0(const std::string& device_id,
220868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                          const string16& display_name,
221868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                          const base::FilePath& relative_path,
222868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                          bool user_added) {
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return gallery_prefs()->AddGalleryInternal(
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        device_id, display_name, relative_path, user_added,
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        string16(), string16(), string16(), 0, base::Time(), false, 0);
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MediaGalleryPrefId AddGalleryWithNameV1(const std::string& device_id,
2297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                          const string16& display_name,
2307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                          const base::FilePath& relative_path,
2317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                          bool user_added) {
2327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return gallery_prefs()->AddGalleryInternal(
2337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        device_id, display_name, relative_path, user_added,
2347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        string16(), string16(), string16(), 0, base::Time(), false, 1);
2357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
2367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MediaGalleryPrefId AddGalleryWithNameV2(const std::string& device_id,
2387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                          const string16& display_name,
2397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                          const base::FilePath& relative_path,
2407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                          bool user_added) {
2417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return gallery_prefs()->AddGalleryInternal(
2427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        device_id, display_name, relative_path, user_added,
2437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        string16(), string16(), string16(), 0, base::Time(), false, 2);
2447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
2457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool UpdateDeviceIDForSingletonType(const std::string& device_id) {
2477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return gallery_prefs()->UpdateDeviceIDForSingletonType(device_id);
2487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
2497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<extensions::Extension> all_permission_extension;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<extensions::Extension> regular_permission_extension;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<extensions::Extension> no_permissions_extension;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<MediaGalleryPrefId> expected_galleries_for_all;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<MediaGalleryPrefId> expected_galleries_for_regular;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeviceIdPrefIdsMap expected_device_map;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MediaGalleriesPrefInfoMap expected_galleries_;
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Needed for extension service & friends to work.
263ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  content::TestBrowserThreadBundle thread_bundle_;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  EnsureMediaDirectoriesExists mock_gallery_locations_;
2661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined OS_CHROMEOS
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  chromeos::ScopedTestDeviceSettingsService test_device_settings_service_;
269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  chromeos::ScopedTestCrosSettings test_cros_settings_;
270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  chromeos::ScopedTestUserManager test_user_manager_;
271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
273d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  TestStorageMonitor monitor_;
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestingProfile> profile_;
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<MediaGalleriesPreferences> gallery_prefs_;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint64 default_galleries_count_;
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MediaGalleriesPreferencesTest);
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath MakePath(std::string dir) {
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return base::FilePath(FILE_PATH_LITERAL("C:\\")).Append(UTF8ToWide(dir));
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_POSIX)
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return base::FilePath(FILE_PATH_LITERAL("/")).Append(dir);
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MediaGalleriesPreferencesTest, GalleryManagement) {
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MediaGalleryPrefId auto_id, user_added_id, id;
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath path;
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath relative_path;
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a new auto detected gallery.
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path = MakePath("new_auto");
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StorageInfo info;
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
30290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  info.set_name(ASCIIToUTF16("NewAutoGallery"));
3037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  id = AddGalleryWithNameV1(info.device_id(), info.name(),
3047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                            relative_path, false /*auto*/);
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(default_galleries_count() + 1UL, id);
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  auto_id = id;
30790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddGalleryExpectation(id, info.name(), info.device_id(), relative_path,
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        MediaGalleryPrefInfo::kAutoDetected);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add it again (as user), nothing should happen.
3127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  id = AddGalleryWithNameV1(info.device_id(), info.name(),
3137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                            relative_path, true /*auto*/);
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(auto_id, id);
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a new user added gallery.
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path = MakePath("new_user");
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
32090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  info.set_name(ASCIIToUTF16("NewUserGallery"));
3217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  id = AddGalleryWithNameV1(info.device_id(), info.name(),
3227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                            relative_path, true /*user*/);
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(default_galleries_count() + 2UL, id);
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  user_added_id = id;
32590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddGalleryExpectation(id, info.name(), info.device_id(), relative_path,
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        MediaGalleryPrefInfo::kUserAdded);
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Lookup some galleries.
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(gallery_prefs()->LookUpGalleryByPath(MakePath("new_auto"), NULL));
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(gallery_prefs()->LookUpGalleryByPath(MakePath("new_user"), NULL));
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(gallery_prefs()->LookUpGalleryByPath(MakePath("other"), NULL));
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that we always get the gallery info.
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MediaGalleryPrefInfo gallery_info;
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(gallery_prefs()->LookUpGalleryByPath(MakePath("new_auto"),
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   &gallery_info));
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGalleryInfo(gallery_info, auto_id);
3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(gallery_info.volume_metadata_valid);
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(gallery_prefs()->LookUpGalleryByPath(MakePath("new_user"),
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   &gallery_info));
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGalleryInfo(gallery_info, user_added_id);
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(gallery_info.volume_metadata_valid);
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path = MakePath("other");
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(gallery_prefs()->LookUpGalleryByPath(path, &gallery_info));
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kInvalidMediaGalleryPrefId, gallery_info.pref_id);
3487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StorageInfo other_info;
35090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MediaStorageUtil::GetDeviceInfoFromPath(path, &other_info, &relative_path);
35190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(other_info.device_id(), gallery_info.device_id);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(relative_path.value(), gallery_info.path.value());
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove an auto added gallery (i.e. make it blacklisted).
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gallery_prefs()->ForgetGalleryById(auto_id);
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_galleries_[auto_id].type = MediaGalleryPrefInfo::kBlackListed;
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_galleries_for_all.erase(auto_id);
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove a user added gallery and it should go away.
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gallery_prefs()->ForgetGalleryById(user_added_id);
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_galleries_.erase(user_added_id);
36390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  expected_device_map[info.device_id()].erase(user_added_id);
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Verify();
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(MediaGalleriesPreferencesTest, AddGalleryWithVolumeMetadata) {
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MediaGalleryPrefId id;
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StorageInfo info;
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath path;
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath relative_path;
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Time now = base::Time::Now();
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Verify();
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Add a new auto detected gallery.
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  path = MakePath("new_auto");
37790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
37890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  id = gallery_prefs()->AddGallery(info.device_id(), relative_path,
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   false /*auto*/,
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   ASCIIToUTF16("volume label"),
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   ASCIIToUTF16("vendor name"),
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   ASCIIToUTF16("model name"),
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   1000000ULL, now);
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(default_galleries_count() + 1UL, id);
38590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddGalleryExpectation(id, string16(), info.device_id(), relative_path,
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        MediaGalleryPrefInfo::kAutoDetected);
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Verify();
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MediaGalleryPrefInfo gallery_info;
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(gallery_prefs()->LookUpGalleryByPath(MakePath("new_auto"),
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                   &gallery_info));
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(gallery_info.volume_metadata_valid);
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("volume label"), gallery_info.volume_label);
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("vendor name"), gallery_info.vendor_name);
3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("model name"), gallery_info.model_name);
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1000000ULL, gallery_info.total_size_in_bytes);
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Note: we put the microseconds time into a double, so there'll
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // be some possible rounding errors. If it's less than 100, we don't
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // care.
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_LE(abs(now.ToInternalValue() -
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                gallery_info.last_attach_time.ToInternalValue()), 100);
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(MediaGalleriesPreferencesTest, ReplaceGalleryWithVolumeMetadata) {
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MediaGalleryPrefId id, metadata_id;
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath path;
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StorageInfo info;
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath relative_path;
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Time now = base::Time::Now();
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Verify();
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Add an auto detected gallery in the prefs version 0 format.
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  path = MakePath("new_auto");
41490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
41590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  info.set_name(ASCIIToUTF16("NewAutoGallery"));
41690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  id = AddGalleryWithNameV0(info.device_id(), info.name(),
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            relative_path, false /*auto*/);
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(default_galleries_count() + 1UL, id);
41990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddGalleryExpectation(id, info.name(), info.device_id(), relative_path,
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        MediaGalleryPrefInfo::kAutoDetected);
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Verify();
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
42390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  metadata_id = gallery_prefs()->AddGallery(info.device_id(),
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            relative_path,
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            false /*auto*/,
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            ASCIIToUTF16("volume label"),
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            ASCIIToUTF16("vendor name"),
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            ASCIIToUTF16("model name"),
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            1000000ULL, now);
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(id, metadata_id);
43190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddGalleryExpectation(id, string16(), info.device_id(), relative_path,
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        MediaGalleryPrefInfo::kAutoDetected);
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Make sure the display_name is set to empty now, as the metadata
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // upgrade should set the manual override name empty.
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Whenever a gallery is added, its type is either set to "AutoDetected" or
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "UserAdded". When the gallery is removed, user added galleries are actually
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// deleted and the auto detected galleries are moved to black listed state.
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// When the gallery is added again, the black listed state is updated back to
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "AutoDetected" type.
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MediaGalleriesPreferencesTest, UpdateGalleryType) {
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MediaGalleryPrefId auto_id, id;
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath path;
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StorageInfo info;
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath relative_path;
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a new auto detect gallery to test with.
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path = MakePath("new_auto");
45490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
45590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  info.set_name(ASCIIToUTF16("NewAutoGallery"));
4567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  id = AddGalleryWithNameV1(info.device_id(), info.name(),
4577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                            relative_path, false /*auto*/);
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(default_galleries_count() + 1UL, id);
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  auto_id = id;
46090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddGalleryExpectation(id, info.name(), info.device_id(), relative_path,
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        MediaGalleryPrefInfo::kAutoDetected);
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove an auto added gallery (i.e. make it blacklisted).
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gallery_prefs()->ForgetGalleryById(auto_id);
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_galleries_[auto_id].type = MediaGalleryPrefInfo::kBlackListed;
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_galleries_for_all.erase(auto_id);
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Add the gallery again as a user action.
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  id = gallery_prefs()->AddGalleryByPath(path);
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(auto_id, id);
47390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddGalleryExpectation(id, info.name(), info.device_id(), relative_path,
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        MediaGalleryPrefInfo::kAutoDetected);
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Remove an auto added gallery (i.e. make it blacklisted).
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gallery_prefs()->ForgetGalleryById(auto_id);
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_galleries_[auto_id].type = MediaGalleryPrefInfo::kBlackListed;
4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_galleries_for_all.erase(auto_id);
4812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Verify();
4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Try adding the gallery again automatically and it should be a no-op.
4847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  id = AddGalleryWithNameV1(info.device_id(), info.name(),
4857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                            relative_path, false /*auto*/);
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(auto_id, id);
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Verify();
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(MediaGalleriesPreferencesTest, UpdateGalleryNameV2) {
4917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Add a new auto detect gallery to test with.
4927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::FilePath path = MakePath("new_auto");
4937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  StorageInfo info;
4947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::FilePath relative_path;
4957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
4967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.set_name(ASCIIToUTF16("NewAutoGallery"));
4977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MediaGalleryPrefId id =
4987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      AddGalleryWithNameV2(info.device_id(), info.name(),
4997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           relative_path, false /*auto*/);
5007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  AddGalleryExpectation(id, info.name(), info.device_id(), relative_path,
5017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        MediaGalleryPrefInfo::kAutoDetected);
5027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  Verify();
5037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Won't override the name -- don't change any expectation.
5057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.set_name(string16());
5067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  AddGalleryWithNameV2(info.device_id(), info.name(), relative_path, false);
5077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  Verify();
5087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.set_name(ASCIIToUTF16("NewName"));
5107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  id = AddGalleryWithNameV2(info.device_id(), info.name(),
5117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                            relative_path, false);
5127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Note: will really just update the existing expectation.
5137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  AddGalleryExpectation(id, info.name(), info.device_id(), relative_path,
5147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        MediaGalleryPrefInfo::kAutoDetected);
5157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  Verify();
5167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
5177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MediaGalleriesPreferencesTest, GalleryPermissions) {
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MediaGalleryPrefId auto_id, user_added_id, to_blacklist_id, id;
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath path;
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StorageInfo info;
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath relative_path;
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add some galleries to test with.
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path = MakePath("new_user");
52790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
52890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  info.set_name(ASCIIToUTF16("NewUserGallery"));
5297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  id = AddGalleryWithNameV1(info.device_id(), info.name(),
5307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                            relative_path, true /*user*/);
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(default_galleries_count() + 1UL, id);
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  user_added_id = id;
53390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddGalleryExpectation(id, info.name(), info.device_id(), relative_path,
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        MediaGalleryPrefInfo::kUserAdded);
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path = MakePath("new_auto");
53890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
53990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  info.set_name(ASCIIToUTF16("NewAutoGallery"));
5407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  id = AddGalleryWithNameV1(info.device_id(), info.name(),
5417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                            relative_path, false /*auto*/);
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(default_galleries_count() + 2UL, id);
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  auto_id = id;
54490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddGalleryExpectation(id, info.name(), info.device_id(), relative_path,
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        MediaGalleryPrefInfo::kAutoDetected);
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path = MakePath("to_blacklist");
54990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
55090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  info.set_name(ASCIIToUTF16("ToBlacklistGallery"));
5517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  id = AddGalleryWithNameV1(info.device_id(), info.name(),
5527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                            relative_path, false /*auto*/);
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(default_galleries_count() + 3UL, id);
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  to_blacklist_id = id;
55590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddGalleryExpectation(id, info.name(), info.device_id(), relative_path,
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        MediaGalleryPrefInfo::kAutoDetected);
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove permission for all galleries from the all-permission extension.
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gallery_prefs()->SetGalleryPermissionForExtension(
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *all_permission_extension.get(), auto_id, false);
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_galleries_for_all.erase(auto_id);
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gallery_prefs()->SetGalleryPermissionForExtension(
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *all_permission_extension.get(), user_added_id, false);
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_galleries_for_all.erase(user_added_id);
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gallery_prefs()->SetGalleryPermissionForExtension(
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *all_permission_extension.get(), to_blacklist_id, false);
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_galleries_for_all.erase(to_blacklist_id);
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add permission back for all galleries to the all-permission extension.
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gallery_prefs()->SetGalleryPermissionForExtension(
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *all_permission_extension.get(), auto_id, true);
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_galleries_for_all.insert(auto_id);
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gallery_prefs()->SetGalleryPermissionForExtension(
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *all_permission_extension.get(), user_added_id, true);
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_galleries_for_all.insert(user_added_id);
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gallery_prefs()->SetGalleryPermissionForExtension(
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *all_permission_extension.get(), to_blacklist_id, true);
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_galleries_for_all.insert(to_blacklist_id);
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add permission for all galleries to the regular permission extension.
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gallery_prefs()->SetGalleryPermissionForExtension(
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *regular_permission_extension.get(), auto_id, true);
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_galleries_for_regular.insert(auto_id);
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gallery_prefs()->SetGalleryPermissionForExtension(
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *regular_permission_extension.get(), user_added_id, true);
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_galleries_for_regular.insert(user_added_id);
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gallery_prefs()->SetGalleryPermissionForExtension(
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *regular_permission_extension.get(), to_blacklist_id, true);
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_galleries_for_regular.insert(to_blacklist_id);
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Blacklist the to be black listed gallery
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gallery_prefs()->ForgetGalleryById(to_blacklist_id);
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_galleries_[to_blacklist_id].type =
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MediaGalleryPrefInfo::kBlackListed;
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_galleries_for_all.erase(to_blacklist_id);
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_galleries_for_regular.erase(to_blacklist_id);
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove permission for all galleries to the regular permission extension.
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gallery_prefs()->SetGalleryPermissionForExtension(
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *regular_permission_extension.get(), auto_id, false);
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_galleries_for_regular.erase(auto_id);
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gallery_prefs()->SetGalleryPermissionForExtension(
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *regular_permission_extension.get(), user_added_id, false);
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_galleries_for_regular.erase(user_added_id);
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add permission for an invalid gallery id.
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gallery_prefs()->SetGalleryPermissionForExtension(
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *regular_permission_extension.get(), 9999L, true);
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Whenever a gallery is added, check to see if there is any gallery info exists
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for the added gallery. If so, verify the existing gallery information with
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the new details. If there is a mismatch, update the gallery information
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// accordingly.
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MediaGalleriesPreferencesTest, UpdateGalleryDetails) {
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MediaGalleryPrefId auto_id, id;
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath path;
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StorageInfo info;
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath relative_path;
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a new auto detect gallery to test with.
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path = MakePath("new_auto");
64590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
64690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  info.set_name(ASCIIToUTF16("NewAutoGallery"));
6477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  id = AddGalleryWithNameV1(info.device_id(), info.name(),
6487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                            relative_path, false /*auto*/);
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(default_galleries_count() + 1UL, id);
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  auto_id = id;
65190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddGalleryExpectation(id, info.name(), info.device_id(), relative_path,
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        MediaGalleryPrefInfo::kAutoDetected);
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update the device name and add the gallery again.
65690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  info.set_name(ASCIIToUTF16("AutoGallery2"));
6577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  id = AddGalleryWithNameV1(info.device_id(), info.name(),
6587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                            relative_path, false /*auto*/);
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(auto_id, id);
66090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddGalleryExpectation(id, info.name(), info.device_id(), relative_path,
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        MediaGalleryPrefInfo::kAutoDetected);
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MediaGalleriesPreferencesTest, MultipleGalleriesPerDevices) {
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath path;
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StorageInfo info;
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath relative_path;
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a regular gallery
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path = MakePath("new_user");
67390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
67490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  info.set_name(ASCIIToUTF16("NewUserGallery"));
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MediaGalleryPrefId user_added_id =
6767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      AddGalleryWithNameV1(info.device_id(), info.name(),
6777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           relative_path, true /*user*/);
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(default_galleries_count() + 1UL, user_added_id);
67990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddGalleryExpectation(user_added_id, info.name(), info.device_id(),
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        relative_path, MediaGalleryPrefInfo::kUserAdded);
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Find it by device id and fail to find something related.
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MediaGalleryPrefIdSet pref_id_set;
68590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  pref_id_set = gallery_prefs()->LookUpGalleriesByDeviceId(info.device_id());
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, pref_id_set.size());
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pref_id_set.find(user_added_id) != pref_id_set.end());
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MediaStorageUtil::GetDeviceInfoFromPath(MakePath("new_user/foo"), &info,
69090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                          &relative_path);
69190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  pref_id_set = gallery_prefs()->LookUpGalleriesByDeviceId(info.device_id());
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, pref_id_set.size());
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add some galleries on the same device.
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  relative_path = base::FilePath(FILE_PATH_LITERAL("path1/on/device1"));
69690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  info.set_name(ASCIIToUTF16("Device1Path1"));
697c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string device_id = "path:device1";
6987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MediaGalleryPrefId dev1_path1_id = AddGalleryWithNameV1(
69990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      device_id, info.name(), relative_path, true /*user*/);
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(default_galleries_count() + 2UL, dev1_path1_id);
70190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddGalleryExpectation(dev1_path1_id, info.name(), device_id, relative_path,
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        MediaGalleryPrefInfo::kUserAdded);
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  relative_path = base::FilePath(FILE_PATH_LITERAL("path2/on/device1"));
70690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  info.set_name(ASCIIToUTF16("Device1Path2"));
7077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MediaGalleryPrefId dev1_path2_id = AddGalleryWithNameV1(
70890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      device_id, info.name(), relative_path, true /*user*/);
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(default_galleries_count() + 3UL, dev1_path2_id);
71090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddGalleryExpectation(dev1_path2_id, info.name(), device_id, relative_path,
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        MediaGalleryPrefInfo::kUserAdded);
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  relative_path = base::FilePath(FILE_PATH_LITERAL("path1/on/device2"));
71590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  info.set_name(ASCIIToUTF16("Device2Path1"));
716c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  device_id = "path:device2";
7177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MediaGalleryPrefId dev2_path1_id = AddGalleryWithNameV1(
71890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      device_id, info.name(), relative_path, true /*user*/);
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(default_galleries_count() + 4UL, dev2_path1_id);
72090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddGalleryExpectation(dev2_path1_id, info.name(), device_id, relative_path,
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        MediaGalleryPrefInfo::kUserAdded);
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  relative_path = base::FilePath(FILE_PATH_LITERAL("path2/on/device2"));
72590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  info.set_name(ASCIIToUTF16("Device2Path2"));
7267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MediaGalleryPrefId dev2_path2_id = AddGalleryWithNameV1(
72790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      device_id, info.name(), relative_path, true /*user*/);
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(default_galleries_count() + 5UL, dev2_path2_id);
72990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddGalleryExpectation(dev2_path2_id, info.name(), device_id, relative_path,
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        MediaGalleryPrefInfo::kUserAdded);
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that adding one of them again works as expected.
7347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MediaGalleryPrefId id = AddGalleryWithNameV1(
73590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      device_id, info.name(), relative_path, true /*user*/);
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(dev2_path2_id, id);
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(MediaGalleriesPreferencesTest, GalleryChangeObserver) {
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start with one observer.
7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockGalleryChangeObserver observer1(gallery_prefs());
7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gallery_prefs()->AddGalleryChangeObserver(&observer1);
7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Add a new auto detected gallery.
7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath path = MakePath("new_auto");
7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StorageInfo info;
7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath relative_path;
74990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
75090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  info.set_name(ASCIIToUTF16("NewAutoGallery"));
7517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MediaGalleryPrefId auto_id = AddGalleryWithNameV1(
7527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      info.device_id(), info.name(), relative_path, false /*auto*/);
7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(default_galleries_count() + 1UL, auto_id);
75490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddGalleryExpectation(auto_id, info.name(), info.device_id(),
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        relative_path, MediaGalleryPrefInfo::kAutoDetected);
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, observer1.notifications());
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Add a second observer.
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockGalleryChangeObserver observer2(gallery_prefs());
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gallery_prefs()->AddGalleryChangeObserver(&observer2);
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Add a new user added gallery.
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  path = MakePath("new_user");
76490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
76590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  info.set_name(ASCIIToUTF16("NewUserGallery"));
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MediaGalleryPrefId user_added_id =
7677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      AddGalleryWithNameV1(info.device_id(), info.name(),
7687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           relative_path, true /*user*/);
76990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddGalleryExpectation(user_added_id, info.name(), info.device_id(),
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        relative_path, MediaGalleryPrefInfo::kUserAdded);
7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(default_galleries_count() + 2UL, user_added_id);
7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, observer1.notifications());
7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, observer2.notifications());
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Remove the first observer.
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gallery_prefs()->RemoveGalleryChangeObserver(&observer1);
7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Remove an auto added gallery (i.e. make it blacklisted).
7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gallery_prefs()->ForgetGalleryById(auto_id);
7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_galleries_[auto_id].type = MediaGalleryPrefInfo::kBlackListed;
7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_galleries_for_all.erase(auto_id);
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, observer1.notifications());
7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, observer2.notifications());
7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Remove a user added gallery and it should go away.
7872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gallery_prefs()->ForgetGalleryById(user_added_id);
7882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_galleries_.erase(user_added_id);
78990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  expected_device_map[info.device_id()].erase(user_added_id);
7902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, observer1.notifications());
7922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3, observer2.notifications());
7932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(MediaGalleriesPreferencesTest, UpdateSingletonDeviceIdType) {
7967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MediaGalleryPrefId id;
7977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::FilePath path;
7987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  StorageInfo info;
7997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::FilePath relative_path;
8007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  Verify();
8017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Add a new auto detect gallery to test with.
8037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  path = MakePath("new_auto");
8047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
8057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.set_name(ASCIIToUTF16("NewAutoGallery"));
8067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.set_device_id(StorageInfo::MakeDeviceId(StorageInfo::ITUNES,
8077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                               path.AsUTF8Unsafe()));
8087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  id = AddGalleryWithNameV2(info.device_id(), info.name(), relative_path,
8097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                            false /*auto*/);
8107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(default_galleries_count() + 1UL, id);
8117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  AddGalleryExpectation(id, info.name(), info.device_id(), relative_path,
8127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        MediaGalleryPrefInfo::kAutoDetected);
8137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  Verify();
8147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Update the device id.
8167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MockGalleryChangeObserver observer(gallery_prefs());
8177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  gallery_prefs()->AddGalleryChangeObserver(&observer);
8187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  path = MakePath("updated_path");
8207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string updated_device_id =
8217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      StorageInfo::MakeDeviceId(StorageInfo::ITUNES, path.AsUTF8Unsafe());
8227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(UpdateDeviceIDForSingletonType(updated_device_id));
8237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  AddGalleryExpectation(id, info.name(), updated_device_id, relative_path,
8247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        MediaGalleryPrefInfo::kAutoDetected);
8257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  expected_device_map[info.device_id()].erase(id);
8267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  expected_device_map[updated_device_id].insert(id);
8277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  Verify();
8287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(1, observer.notifications());
8297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // No gallery for type.
8317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string new_device_id =
8327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      StorageInfo::MakeDeviceId(StorageInfo::PICASA, path.AsUTF8Unsafe());
8337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(UpdateDeviceIDForSingletonType(new_device_id));
8347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
8357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
836eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST(MediaGalleryPrefInfoTest, NameGeneration) {
837d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ASSERT_TRUE(TestStorageMonitor::CreateAndInstall());
838eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
839eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  MediaGalleryPrefInfo info;
840eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  info.pref_id = 1;
841eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  info.display_name = ASCIIToUTF16("override");
842eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  info.device_id = StorageInfo::MakeDeviceId(
843eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      StorageInfo::REMOVABLE_MASS_STORAGE_WITH_DCIM, "unique");
844eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
845eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(ASCIIToUTF16("override"), info.GetGalleryDisplayName());
846eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
847eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  info.display_name = ASCIIToUTF16("o2");
848eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(ASCIIToUTF16("o2"), info.GetGalleryDisplayName());
849eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
850eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(l10n_util::GetStringUTF16(
851eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                IDS_MEDIA_GALLERIES_DIALOG_DEVICE_NOT_ATTACHED),
852eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            info.GetGalleryAdditionalDetails());
853eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
854eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  info.last_attach_time = base::Time::Now();
855eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_NE(l10n_util::GetStringUTF16(
856eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                IDS_MEDIA_GALLERIES_DIALOG_DEVICE_NOT_ATTACHED),
857eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            info.GetGalleryAdditionalDetails());
858eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_NE(l10n_util::GetStringUTF16(
859eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                IDS_MEDIA_GALLERIES_DIALOG_DEVICE_ATTACHED),
860eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            info.GetGalleryAdditionalDetails());
861eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
862eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  info.volume_label = ASCIIToUTF16("vol");
863eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  info.vendor_name = ASCIIToUTF16("vendor");
864eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  info.model_name = ASCIIToUTF16("model");
865eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(ASCIIToUTF16("o2"), info.GetGalleryDisplayName());
866eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
867eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  info.display_name = string16();
868eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(ASCIIToUTF16("vol"), info.GetGalleryDisplayName());
869eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  info.volume_label = string16();
870eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(ASCIIToUTF16("vendor, model"), info.GetGalleryDisplayName());
871eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
872eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  info.device_id = StorageInfo::MakeDeviceId(
873eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      StorageInfo::FIXED_MASS_STORAGE, "unique");
874eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(base::FilePath(FILE_PATH_LITERAL("unique")).AsUTF8Unsafe(),
875eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch            UTF16ToUTF8(info.GetGalleryTooltip()));
8763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
877d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  TestStorageMonitor::RemoveSingleton();
878eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
879