media_galleries_preferences_unittest.cc revision 7d4cd473f85ac64c3747c96c277f9e506a0d2246
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"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/message_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"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/api/string_ordinal.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS)
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/user_manager.h"
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h"
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/settings/device_settings_service.h"
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chrome {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (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.
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnGalleryChanged(MediaGalleriesPreferences* pref,
527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                const std::string& /*extension_id*/,
537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                MediaGalleryPrefId /* pref_id */,
547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                bool /* has_permission */) OVERRIDE {
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(pref_, pref);
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++notifications_;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MediaGalleriesPreferences* pref_;
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int notifications_;
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MockGalleryChangeObserver);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MediaGalleriesPreferencesTest : public testing::Test {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<std::string /*device id*/, MediaGalleryPrefIdSet>
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DeviceIdPrefIdsMap;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MediaGalleriesPreferencesTest()
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : ui_thread_(content::BrowserThread::UI, &loop_),
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        file_thread_(content::BrowserThread::FILE, &loop_),
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        profile_(new TestingProfile()),
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        default_galleries_count_(0) {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MediaGalleriesPreferencesTest() {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // TestExtensionSystem uses DeleteSoon, so we need to delete the profile
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // and then run the message queue to clean up.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    profile_.reset();
8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    base::MessageLoop::current()->RunUntilIdle();
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extensions::TestExtensionSystem* extension_system(
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        static_cast<extensions::TestExtensionSystem*>(
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            extensions::ExtensionSystem::Get(profile_.get())));
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    extension_system->CreateExtensionService(
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        CommandLine::ForCurrentProcess(), base::FilePath(), false);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    gallery_prefs_.reset(new MediaGalleriesPreferences(profile_.get()));
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Load the default galleries into the expectations.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const MediaGalleriesPrefInfoMap& known_galleries =
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        gallery_prefs_->known_galleries();
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (known_galleries.size()) {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ASSERT_EQ(3U, known_galleries.size());
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default_galleries_count_ = 3;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MediaGalleriesPrefInfoMap::const_iterator it;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (it = known_galleries.begin(); it != known_galleries.end(); ++it) {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        expected_galleries_[it->first] = it->second;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (it->second.type == MediaGalleryPrefInfo::kAutoDetected)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          expected_galleries_for_all.insert(it->first);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<std::string> all_permissions;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    all_permissions.push_back("allAutoDetected");
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    all_permissions.push_back("read");
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<std::string> read_permissions;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    read_permissions.push_back("read");
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    all_permission_extension =
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddMediaGalleriesApp("all", all_permissions, profile_.get());
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    regular_permission_extension =
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddMediaGalleriesApp("regular", read_permissions, profile_.get());
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    no_permissions_extension =
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        AddMediaGalleriesApp("no", read_permissions, profile_.get());
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Verify();
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Verify() {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const MediaGalleriesPrefInfoMap& known_galleries =
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        gallery_prefs_->known_galleries();
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected_galleries_.size(), known_galleries.size());
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (MediaGalleriesPrefInfoMap::const_iterator it = known_galleries.begin();
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         it != known_galleries.end();
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         ++it) {
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      VerifyGalleryInfo(it->second, it->first);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (DeviceIdPrefIdsMap::const_iterator it = expected_device_map.begin();
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         it != expected_device_map.end();
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         ++it) {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MediaGalleryPrefIdSet actual_id_set =
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          gallery_prefs_->LookUpGalleriesByDeviceId(it->first);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(it->second, actual_id_set);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::set<MediaGalleryPrefId> galleries_for_all =
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        gallery_prefs_->GalleriesForExtension(*all_permission_extension.get());
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected_galleries_for_all, galleries_for_all);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::set<MediaGalleryPrefId> galleries_for_regular =
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        gallery_prefs_->GalleriesForExtension(
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            *regular_permission_extension.get());
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(expected_galleries_for_regular, galleries_for_regular);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::set<MediaGalleryPrefId> galleries_for_no =
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        gallery_prefs_->GalleriesForExtension(*no_permissions_extension.get());
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(0U, galleries_for_no.size());
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void VerifyGalleryInfo(const MediaGalleryPrefInfo& actual,
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         MediaGalleryPrefId expected_id) const {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MediaGalleriesPrefInfoMap::const_iterator in_expectation =
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      expected_galleries_.find(expected_id);
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ASSERT_FALSE(in_expectation == expected_galleries_.end())  << expected_id;
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(in_expectation->second.pref_id, actual.pref_id);
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(in_expectation->second.display_name, actual.display_name);
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(in_expectation->second.device_id, actual.device_id);
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(in_expectation->second.path.value(), actual.path.value());
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_EQ(in_expectation->second.type, actual.type);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MediaGalleriesPreferences* gallery_prefs() {
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return gallery_prefs_.get();
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint64 default_galleries_count() {
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return default_galleries_count_;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddGalleryExpectation(MediaGalleryPrefId id, string16 display_name,
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             std::string device_id,
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             base::FilePath relative_path,
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             MediaGalleryPrefInfo::Type type) {
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected_galleries_[id].pref_id = id;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected_galleries_[id].display_name = display_name;
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected_galleries_[id].device_id = device_id;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected_galleries_[id].path = relative_path.NormalizePathSeparators();
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected_galleries_[id].type = type;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (type == MediaGalleryPrefInfo::kAutoDetected)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      expected_galleries_for_all.insert(id);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    expected_device_map[device_id].insert(id);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MediaGalleryPrefId AddGalleryWithNameV0(const std::string& device_id,
196868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                          const string16& display_name,
197868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                          const base::FilePath& relative_path,
198868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                          bool user_added) {
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return gallery_prefs()->AddGalleryInternal(
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        device_id, display_name, relative_path, user_added,
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        string16(), string16(), string16(), 0, base::Time(), false, 0);
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MediaGalleryPrefId AddGalleryWithNameV1(const std::string& device_id,
2057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                          const string16& display_name,
2067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                          const base::FilePath& relative_path,
2077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                          bool user_added) {
2087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return gallery_prefs()->AddGalleryInternal(
2097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        device_id, display_name, relative_path, user_added,
2107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        string16(), string16(), string16(), 0, base::Time(), false, 1);
2117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
2127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MediaGalleryPrefId AddGalleryWithNameV2(const std::string& device_id,
2147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                          const string16& display_name,
2157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                          const base::FilePath& relative_path,
2167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                          bool user_added) {
2177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return gallery_prefs()->AddGalleryInternal(
2187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        device_id, display_name, relative_path, user_added,
2197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)        string16(), string16(), string16(), 0, base::Time(), false, 2);
2207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool UpdateDeviceIDForSingletonType(const std::string& device_id) {
2237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return gallery_prefs()->UpdateDeviceIDForSingletonType(device_id);
2247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
2257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<extensions::Extension> all_permission_extension;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<extensions::Extension> regular_permission_extension;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<extensions::Extension> no_permissions_extension;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<MediaGalleryPrefId> expected_galleries_for_all;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<MediaGalleryPrefId> expected_galleries_for_regular;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeviceIdPrefIdsMap expected_device_map;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MediaGalleriesPrefInfoMap expected_galleries_;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Needed for extension service & friends to work.
23990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop loop_;
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread ui_thread_;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::TestBrowserThread file_thread_;
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined OS_CHROMEOS
244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  chromeos::ScopedTestDeviceSettingsService test_device_settings_service_;
245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  chromeos::ScopedTestCrosSettings test_cros_settings_;
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  chromeos::ScopedTestUserManager test_user_manager_;
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  test::TestStorageMonitor monitor_;
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestingProfile> profile_;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<MediaGalleriesPreferences> gallery_prefs_;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint64 default_galleries_count_;
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MediaGalleriesPreferencesTest);
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::FilePath MakePath(std::string dir) {
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return base::FilePath(FILE_PATH_LITERAL("C:\\")).Append(UTF8ToWide(dir));
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_POSIX)
2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return base::FilePath(FILE_PATH_LITERAL("/")).Append(dir);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MediaGalleriesPreferencesTest, GalleryManagement) {
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MediaGalleryPrefId auto_id, user_added_id, id;
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath path;
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath relative_path;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a new auto detected gallery.
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path = MakePath("new_auto");
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StorageInfo info;
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
27890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  info.set_name(ASCIIToUTF16("NewAutoGallery"));
2797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  id = AddGalleryWithNameV1(info.device_id(), info.name(),
2807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                            relative_path, false /*auto*/);
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(default_galleries_count() + 1UL, id);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  auto_id = id;
28390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddGalleryExpectation(id, info.name(), info.device_id(), relative_path,
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        MediaGalleryPrefInfo::kAutoDetected);
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add it again (as user), nothing should happen.
2887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  id = AddGalleryWithNameV1(info.device_id(), info.name(),
2897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                            relative_path, true /*auto*/);
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(auto_id, id);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a new user added gallery.
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path = MakePath("new_user");
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
29690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  info.set_name(ASCIIToUTF16("NewUserGallery"));
2977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  id = AddGalleryWithNameV1(info.device_id(), info.name(),
2987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                            relative_path, true /*user*/);
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(default_galleries_count() + 2UL, id);
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  user_added_id = id;
30190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddGalleryExpectation(id, info.name(), info.device_id(), relative_path,
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        MediaGalleryPrefInfo::kUserAdded);
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Lookup some galleries.
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(gallery_prefs()->LookUpGalleryByPath(MakePath("new_auto"), NULL));
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(gallery_prefs()->LookUpGalleryByPath(MakePath("new_user"), NULL));
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(gallery_prefs()->LookUpGalleryByPath(MakePath("other"), NULL));
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that we always get the gallery info.
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MediaGalleryPrefInfo gallery_info;
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(gallery_prefs()->LookUpGalleryByPath(MakePath("new_auto"),
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   &gallery_info));
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGalleryInfo(gallery_info, auto_id);
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(gallery_info.volume_metadata_valid);
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(gallery_prefs()->LookUpGalleryByPath(MakePath("new_user"),
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   &gallery_info));
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VerifyGalleryInfo(gallery_info, user_added_id);
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_FALSE(gallery_info.volume_metadata_valid);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path = MakePath("other");
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(gallery_prefs()->LookUpGalleryByPath(path, &gallery_info));
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(kInvalidMediaGalleryPrefId, gallery_info.pref_id);
3247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StorageInfo other_info;
32690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MediaStorageUtil::GetDeviceInfoFromPath(path, &other_info, &relative_path);
32790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(other_info.device_id(), gallery_info.device_id);
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(relative_path.value(), gallery_info.path.value());
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove an auto added gallery (i.e. make it blacklisted).
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gallery_prefs()->ForgetGalleryById(auto_id);
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_galleries_[auto_id].type = MediaGalleryPrefInfo::kBlackListed;
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_galleries_for_all.erase(auto_id);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove a user added gallery and it should go away.
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gallery_prefs()->ForgetGalleryById(user_added_id);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_galleries_.erase(user_added_id);
33990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  expected_device_map[info.device_id()].erase(user_added_id);
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Verify();
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(MediaGalleriesPreferencesTest, AddGalleryWithVolumeMetadata) {
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MediaGalleryPrefId id;
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StorageInfo info;
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath path;
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath relative_path;
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Time now = base::Time::Now();
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Verify();
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Add a new auto detected gallery.
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  path = MakePath("new_auto");
35390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
35490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  id = gallery_prefs()->AddGallery(info.device_id(), relative_path,
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   false /*auto*/,
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   ASCIIToUTF16("volume label"),
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   ASCIIToUTF16("vendor name"),
3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   ASCIIToUTF16("model name"),
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   1000000ULL, now);
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(default_galleries_count() + 1UL, id);
36190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddGalleryExpectation(id, string16(), info.device_id(), relative_path,
3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        MediaGalleryPrefInfo::kAutoDetected);
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Verify();
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MediaGalleryPrefInfo gallery_info;
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(gallery_prefs()->LookUpGalleryByPath(MakePath("new_auto"),
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                   &gallery_info));
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_TRUE(gallery_info.volume_metadata_valid);
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("volume label"), gallery_info.volume_label);
3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("vendor name"), gallery_info.vendor_name);
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("model name"), gallery_info.model_name);
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1000000ULL, gallery_info.total_size_in_bytes);
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Note: we put the microseconds time into a double, so there'll
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // be some possible rounding errors. If it's less than 100, we don't
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // care.
3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_LE(abs(now.ToInternalValue() -
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                gallery_info.last_attach_time.ToInternalValue()), 100);
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(MediaGalleriesPreferencesTest, ReplaceGalleryWithVolumeMetadata) {
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MediaGalleryPrefId id, metadata_id;
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath path;
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StorageInfo info;
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath relative_path;
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Time now = base::Time::Now();
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Verify();
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Add an auto detected gallery in the prefs version 0 format.
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  path = MakePath("new_auto");
39090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
39190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  info.set_name(ASCIIToUTF16("NewAutoGallery"));
39290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  id = AddGalleryWithNameV0(info.device_id(), info.name(),
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                            relative_path, false /*auto*/);
3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(default_galleries_count() + 1UL, id);
39590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddGalleryExpectation(id, info.name(), info.device_id(), relative_path,
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        MediaGalleryPrefInfo::kAutoDetected);
3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Verify();
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
39990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  metadata_id = gallery_prefs()->AddGallery(info.device_id(),
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            relative_path,
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            false /*auto*/,
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            ASCIIToUTF16("volume label"),
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            ASCIIToUTF16("vendor name"),
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            ASCIIToUTF16("model name"),
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                            1000000ULL, now);
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(id, metadata_id);
40790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddGalleryExpectation(id, string16(), info.device_id(), relative_path,
4082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        MediaGalleryPrefInfo::kAutoDetected);
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Make sure the display_name is set to empty now, as the metadata
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // upgrade should set the manual override name empty.
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Whenever a gallery is added, its type is either set to "AutoDetected" or
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "UserAdded". When the gallery is removed, user added galleries are actually
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// deleted and the auto detected galleries are moved to black listed state.
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// When the gallery is added again, the black listed state is updated back to
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "AutoDetected" type.
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MediaGalleriesPreferencesTest, UpdateGalleryType) {
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MediaGalleryPrefId auto_id, id;
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath path;
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StorageInfo info;
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath relative_path;
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a new auto detect gallery to test with.
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path = MakePath("new_auto");
43090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
43190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  info.set_name(ASCIIToUTF16("NewAutoGallery"));
4327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  id = AddGalleryWithNameV1(info.device_id(), info.name(),
4337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                            relative_path, false /*auto*/);
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(default_galleries_count() + 1UL, id);
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  auto_id = id;
43690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddGalleryExpectation(id, info.name(), info.device_id(), relative_path,
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        MediaGalleryPrefInfo::kAutoDetected);
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove an auto added gallery (i.e. make it blacklisted).
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gallery_prefs()->ForgetGalleryById(auto_id);
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_galleries_[auto_id].type = MediaGalleryPrefInfo::kBlackListed;
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_galleries_for_all.erase(auto_id);
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Add the gallery again as a user action.
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  id = gallery_prefs()->AddGalleryByPath(path);
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(auto_id, id);
44990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddGalleryExpectation(id, info.name(), info.device_id(), relative_path,
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        MediaGalleryPrefInfo::kAutoDetected);
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Remove an auto added gallery (i.e. make it blacklisted).
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gallery_prefs()->ForgetGalleryById(auto_id);
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_galleries_[auto_id].type = MediaGalleryPrefInfo::kBlackListed;
4562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_galleries_for_all.erase(auto_id);
4572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Verify();
4582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Try adding the gallery again automatically and it should be a no-op.
4607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  id = AddGalleryWithNameV1(info.device_id(), info.name(),
4617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                            relative_path, false /*auto*/);
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(auto_id, id);
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Verify();
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(MediaGalleriesPreferencesTest, UpdateGalleryNameV2) {
4677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Add a new auto detect gallery to test with.
4687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::FilePath path = MakePath("new_auto");
4697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  StorageInfo info;
4707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::FilePath relative_path;
4717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
4727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.set_name(ASCIIToUTF16("NewAutoGallery"));
4737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MediaGalleryPrefId id =
4747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      AddGalleryWithNameV2(info.device_id(), info.name(),
4757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           relative_path, false /*auto*/);
4767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  AddGalleryExpectation(id, info.name(), info.device_id(), relative_path,
4777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        MediaGalleryPrefInfo::kAutoDetected);
4787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  Verify();
4797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Won't override the name -- don't change any expectation.
4817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.set_name(string16());
4827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  AddGalleryWithNameV2(info.device_id(), info.name(), relative_path, false);
4837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  Verify();
4847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.set_name(ASCIIToUTF16("NewName"));
4867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  id = AddGalleryWithNameV2(info.device_id(), info.name(),
4877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                            relative_path, false);
4887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Note: will really just update the existing expectation.
4897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  AddGalleryExpectation(id, info.name(), info.device_id(), relative_path,
4907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        MediaGalleryPrefInfo::kAutoDetected);
4917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  Verify();
4927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
4937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MediaGalleriesPreferencesTest, GalleryPermissions) {
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MediaGalleryPrefId auto_id, user_added_id, to_blacklist_id, id;
4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath path;
4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StorageInfo info;
4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath relative_path;
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add some galleries to test with.
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path = MakePath("new_user");
50390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
50490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  info.set_name(ASCIIToUTF16("NewUserGallery"));
5057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  id = AddGalleryWithNameV1(info.device_id(), info.name(),
5067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                            relative_path, true /*user*/);
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(default_galleries_count() + 1UL, id);
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  user_added_id = id;
50990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddGalleryExpectation(id, info.name(), info.device_id(), relative_path,
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        MediaGalleryPrefInfo::kUserAdded);
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path = MakePath("new_auto");
51490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
51590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  info.set_name(ASCIIToUTF16("NewAutoGallery"));
5167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  id = AddGalleryWithNameV1(info.device_id(), info.name(),
5177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                            relative_path, false /*auto*/);
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(default_galleries_count() + 2UL, id);
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  auto_id = id;
52090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddGalleryExpectation(id, info.name(), info.device_id(), relative_path,
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        MediaGalleryPrefInfo::kAutoDetected);
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path = MakePath("to_blacklist");
52590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
52690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  info.set_name(ASCIIToUTF16("ToBlacklistGallery"));
5277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  id = AddGalleryWithNameV1(info.device_id(), info.name(),
5287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                            relative_path, false /*auto*/);
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(default_galleries_count() + 3UL, id);
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  to_blacklist_id = id;
53190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddGalleryExpectation(id, info.name(), info.device_id(), relative_path,
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        MediaGalleryPrefInfo::kAutoDetected);
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove permission for all galleries from the all-permission extension.
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gallery_prefs()->SetGalleryPermissionForExtension(
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *all_permission_extension.get(), auto_id, false);
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_galleries_for_all.erase(auto_id);
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gallery_prefs()->SetGalleryPermissionForExtension(
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *all_permission_extension.get(), user_added_id, false);
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_galleries_for_all.erase(user_added_id);
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gallery_prefs()->SetGalleryPermissionForExtension(
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *all_permission_extension.get(), to_blacklist_id, false);
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_galleries_for_all.erase(to_blacklist_id);
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add permission back for all galleries to the all-permission extension.
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gallery_prefs()->SetGalleryPermissionForExtension(
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *all_permission_extension.get(), auto_id, true);
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_galleries_for_all.insert(auto_id);
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gallery_prefs()->SetGalleryPermissionForExtension(
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *all_permission_extension.get(), user_added_id, true);
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_galleries_for_all.insert(user_added_id);
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gallery_prefs()->SetGalleryPermissionForExtension(
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *all_permission_extension.get(), to_blacklist_id, true);
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_galleries_for_all.insert(to_blacklist_id);
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add permission for all galleries to the regular permission extension.
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gallery_prefs()->SetGalleryPermissionForExtension(
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *regular_permission_extension.get(), auto_id, true);
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_galleries_for_regular.insert(auto_id);
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gallery_prefs()->SetGalleryPermissionForExtension(
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *regular_permission_extension.get(), user_added_id, true);
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_galleries_for_regular.insert(user_added_id);
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gallery_prefs()->SetGalleryPermissionForExtension(
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *regular_permission_extension.get(), to_blacklist_id, true);
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_galleries_for_regular.insert(to_blacklist_id);
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Blacklist the to be black listed gallery
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gallery_prefs()->ForgetGalleryById(to_blacklist_id);
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_galleries_[to_blacklist_id].type =
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      MediaGalleryPrefInfo::kBlackListed;
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_galleries_for_all.erase(to_blacklist_id);
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_galleries_for_regular.erase(to_blacklist_id);
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove permission for all galleries to the regular permission extension.
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gallery_prefs()->SetGalleryPermissionForExtension(
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *regular_permission_extension.get(), auto_id, false);
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_galleries_for_regular.erase(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, false);
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_galleries_for_regular.erase(user_added_id);
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add permission for an invalid gallery id.
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gallery_prefs()->SetGalleryPermissionForExtension(
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *regular_permission_extension.get(), 9999L, true);
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Whenever a gallery is added, check to see if there is any gallery info exists
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for the added gallery. If so, verify the existing gallery information with
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the new details. If there is a mismatch, update the gallery information
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// accordingly.
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MediaGalleriesPreferencesTest, UpdateGalleryDetails) {
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MediaGalleryPrefId auto_id, id;
6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath path;
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StorageInfo info;
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath relative_path;
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a new auto detect gallery to test with.
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path = MakePath("new_auto");
62190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
62290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  info.set_name(ASCIIToUTF16("NewAutoGallery"));
6237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  id = AddGalleryWithNameV1(info.device_id(), info.name(),
6247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                            relative_path, false /*auto*/);
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(default_galleries_count() + 1UL, id);
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  auto_id = id;
62790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddGalleryExpectation(id, info.name(), info.device_id(), relative_path,
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        MediaGalleryPrefInfo::kAutoDetected);
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update the device name and add the gallery again.
63290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  info.set_name(ASCIIToUTF16("AutoGallery2"));
6337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  id = AddGalleryWithNameV1(info.device_id(), info.name(),
6347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                            relative_path, false /*auto*/);
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(auto_id, id);
63690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddGalleryExpectation(id, info.name(), info.device_id(), relative_path,
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        MediaGalleryPrefInfo::kAutoDetected);
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MediaGalleriesPreferencesTest, MultipleGalleriesPerDevices) {
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath path;
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StorageInfo info;
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath relative_path;
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add a regular gallery
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  path = MakePath("new_user");
64990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
65090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  info.set_name(ASCIIToUTF16("NewUserGallery"));
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MediaGalleryPrefId user_added_id =
6527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      AddGalleryWithNameV1(info.device_id(), info.name(),
6537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           relative_path, true /*user*/);
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(default_galleries_count() + 1UL, user_added_id);
65590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddGalleryExpectation(user_added_id, info.name(), info.device_id(),
6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        relative_path, MediaGalleryPrefInfo::kUserAdded);
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Find it by device id and fail to find something related.
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MediaGalleryPrefIdSet pref_id_set;
66190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  pref_id_set = gallery_prefs()->LookUpGalleriesByDeviceId(info.device_id());
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, pref_id_set.size());
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(pref_id_set.find(user_added_id) != pref_id_set.end());
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MediaStorageUtil::GetDeviceInfoFromPath(MakePath("new_user/foo"), &info,
66690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                          &relative_path);
66790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  pref_id_set = gallery_prefs()->LookUpGalleriesByDeviceId(info.device_id());
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0U, pref_id_set.size());
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add some galleries on the same device.
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  relative_path = base::FilePath(FILE_PATH_LITERAL("path1/on/device1"));
67290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  info.set_name(ASCIIToUTF16("Device1Path1"));
673c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::string device_id = "path:device1";
6747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MediaGalleryPrefId dev1_path1_id = AddGalleryWithNameV1(
67590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      device_id, info.name(), relative_path, true /*user*/);
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(default_galleries_count() + 2UL, dev1_path1_id);
67790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddGalleryExpectation(dev1_path1_id, info.name(), device_id, relative_path,
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        MediaGalleryPrefInfo::kUserAdded);
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  relative_path = base::FilePath(FILE_PATH_LITERAL("path2/on/device1"));
68290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  info.set_name(ASCIIToUTF16("Device1Path2"));
6837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MediaGalleryPrefId dev1_path2_id = AddGalleryWithNameV1(
68490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      device_id, info.name(), relative_path, true /*user*/);
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(default_galleries_count() + 3UL, dev1_path2_id);
68690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddGalleryExpectation(dev1_path2_id, info.name(), device_id, relative_path,
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        MediaGalleryPrefInfo::kUserAdded);
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  relative_path = base::FilePath(FILE_PATH_LITERAL("path1/on/device2"));
69190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  info.set_name(ASCIIToUTF16("Device2Path1"));
692c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  device_id = "path:device2";
6937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MediaGalleryPrefId dev2_path1_id = AddGalleryWithNameV1(
69490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      device_id, info.name(), relative_path, true /*user*/);
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(default_galleries_count() + 4UL, dev2_path1_id);
69690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddGalleryExpectation(dev2_path1_id, info.name(), device_id, relative_path,
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        MediaGalleryPrefInfo::kUserAdded);
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  relative_path = base::FilePath(FILE_PATH_LITERAL("path2/on/device2"));
70190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  info.set_name(ASCIIToUTF16("Device2Path2"));
7027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MediaGalleryPrefId dev2_path2_id = AddGalleryWithNameV1(
70390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      device_id, info.name(), relative_path, true /*user*/);
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(default_galleries_count() + 5UL, dev2_path2_id);
70590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddGalleryExpectation(dev2_path2_id, info.name(), device_id, relative_path,
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        MediaGalleryPrefInfo::kUserAdded);
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that adding one of them again works as expected.
7107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MediaGalleryPrefId id = AddGalleryWithNameV1(
71190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      device_id, info.name(), relative_path, true /*user*/);
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(dev2_path2_id, id);
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Verify();
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(MediaGalleriesPreferencesTest, GalleryChangeObserver) {
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Start with one observer.
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockGalleryChangeObserver observer1(gallery_prefs());
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gallery_prefs()->AddGalleryChangeObserver(&observer1);
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Add a new auto detected gallery.
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath path = MakePath("new_auto");
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StorageInfo info;
7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath relative_path;
72590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
72690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  info.set_name(ASCIIToUTF16("NewAutoGallery"));
7277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MediaGalleryPrefId auto_id = AddGalleryWithNameV1(
7287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      info.device_id(), info.name(), relative_path, false /*auto*/);
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(default_galleries_count() + 1UL, auto_id);
73090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddGalleryExpectation(auto_id, info.name(), info.device_id(),
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        relative_path, MediaGalleryPrefInfo::kAutoDetected);
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, observer1.notifications());
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Add a second observer.
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockGalleryChangeObserver observer2(gallery_prefs());
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gallery_prefs()->AddGalleryChangeObserver(&observer2);
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Add a new user added gallery.
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  path = MakePath("new_user");
74090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
74190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  info.set_name(ASCIIToUTF16("NewUserGallery"));
7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MediaGalleryPrefId user_added_id =
7437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      AddGalleryWithNameV1(info.device_id(), info.name(),
7447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                           relative_path, true /*user*/);
74590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  AddGalleryExpectation(user_added_id, info.name(), info.device_id(),
7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        relative_path, MediaGalleryPrefInfo::kUserAdded);
7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(default_galleries_count() + 2UL, user_added_id);
7482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, observer1.notifications());
7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, observer2.notifications());
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Remove the first observer.
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gallery_prefs()->RemoveGalleryChangeObserver(&observer1);
7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Remove an auto added gallery (i.e. make it blacklisted).
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gallery_prefs()->ForgetGalleryById(auto_id);
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_galleries_[auto_id].type = MediaGalleryPrefInfo::kBlackListed;
7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_galleries_for_all.erase(auto_id);
7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, observer1.notifications());
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, observer2.notifications());
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Remove a user added gallery and it should go away.
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gallery_prefs()->ForgetGalleryById(user_added_id);
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  expected_galleries_.erase(user_added_id);
76590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  expected_device_map[info.device_id()].erase(user_added_id);
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(2, observer1.notifications());
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(3, observer2.notifications());
7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)TEST_F(MediaGalleriesPreferencesTest, UpdateSingletonDeviceIdType) {
7727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MediaGalleryPrefId id;
7737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::FilePath path;
7747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  StorageInfo info;
7757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::FilePath relative_path;
7767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  Verify();
7777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
7787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Add a new auto detect gallery to test with.
7797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  path = MakePath("new_auto");
7807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MediaStorageUtil::GetDeviceInfoFromPath(path, &info, &relative_path);
7817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.set_name(ASCIIToUTF16("NewAutoGallery"));
7827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  info.set_device_id(StorageInfo::MakeDeviceId(StorageInfo::ITUNES,
7837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                               path.AsUTF8Unsafe()));
7847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  id = AddGalleryWithNameV2(info.device_id(), info.name(), relative_path,
7857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                            false /*auto*/);
7867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(default_galleries_count() + 1UL, id);
7877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  AddGalleryExpectation(id, info.name(), info.device_id(), relative_path,
7887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        MediaGalleryPrefInfo::kAutoDetected);
7897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  Verify();
7907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
7917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Update the device id.
7927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  MockGalleryChangeObserver observer(gallery_prefs());
7937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  gallery_prefs()->AddGalleryChangeObserver(&observer);
7947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
7957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  path = MakePath("updated_path");
7967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string updated_device_id =
7977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      StorageInfo::MakeDeviceId(StorageInfo::ITUNES, path.AsUTF8Unsafe());
7987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_TRUE(UpdateDeviceIDForSingletonType(updated_device_id));
7997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  AddGalleryExpectation(id, info.name(), updated_device_id, relative_path,
8007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                        MediaGalleryPrefInfo::kAutoDetected);
8017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  expected_device_map[info.device_id()].erase(id);
8027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  expected_device_map[updated_device_id].insert(id);
8037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  Verify();
8047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ(1, observer.notifications());
8057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // No gallery for type.
8077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::string new_device_id =
8087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      StorageInfo::MakeDeviceId(StorageInfo::PICASA, path.AsUTF8Unsafe());
8097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_FALSE(UpdateDeviceIDForSingletonType(new_device_id));
8107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
8117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chrome
813