1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file.
4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/bind.h"
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/command_line.h"
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/files/file_path.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h"
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/files/scoped_temp_dir.h"
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/memory/scoped_ptr.h"
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/run_loop.h"
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/test/scoped_path_override.h"
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/extensions/test_extension_system.h"
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/media_galleries/gallery_watch_manager.h"
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/media_galleries/gallery_watch_manager_observer.h"
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/media_galleries/media_galleries_preferences.h"
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/media_galleries/media_galleries_preferences_factory.h"
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/media_galleries/media_galleries_test_util.h"
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/test/base/testing_profile.h"
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/storage_monitor/test_storage_monitor.h"
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/test/test_browser_thread_bundle.h"
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/browser/extension_system.h"
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/common/extension.h"
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/common/permissions/media_galleries_permission.h"
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "testing/gtest/include/gtest/gtest.h"
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_CHROMEOS)
286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/scoped_test_user_manager.h"
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/settings/cros_settings.h"
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/settings/device_settings_service.h"
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace component_updater {
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace {
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ConfirmWatch(base::RunLoop* loop, const std::string& error) {
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(error.empty());
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  loop->Quit();
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ExpectWatchError(base::RunLoop* loop,
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                      const std::string& expected_error,
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                      const std::string& error) {
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(expected_error, error);
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  loop->Quit();
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass GalleryWatchManagerTest : public GalleryWatchManagerObserver,
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                public testing::Test {
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public:
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  GalleryWatchManagerTest()
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP),
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        profile_(new TestingProfile()),
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        gallery_prefs_(NULL),
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        expect_gallery_changed_(false),
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        expect_gallery_watch_dropped_(false),
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        pending_loop_(NULL) {}
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual ~GalleryWatchManagerTest() {}
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void SetUp() OVERRIDE {
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ASSERT_TRUE(storage_monitor::TestStorageMonitor::CreateAndInstall());
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    extensions::TestExtensionSystem* extension_system(
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        static_cast<extensions::TestExtensionSystem*>(
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            extensions::ExtensionSystem::Get(profile_.get())));
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    extension_system->CreateExtensionService(
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        base::CommandLine::ForCurrentProcess(), base::FilePath(), false);
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    gallery_prefs_ =
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        MediaGalleriesPreferencesFactory::GetForProfile(profile_.get());
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    base::RunLoop loop;
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    gallery_prefs_->EnsureInitialized(loop.QuitClosure());
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    loop.Run();
78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    std::vector<std::string> read_permissions;
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    read_permissions.push_back(
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        extensions::MediaGalleriesPermission::kReadPermission);
82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    extension_ = AddMediaGalleriesApp("read", read_permissions, profile_.get());
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    manager_.reset(new GalleryWatchManager);
85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    manager_->AddObserver(profile_.get(), this);
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void TearDown() OVERRIDE {
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    manager_->RemoveObserver(profile_.get());
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    manager_.reset();
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    storage_monitor::TestStorageMonitor::Destroy();
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch protected:
95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Create the specified path, and add it to preferences as a gallery.
96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MediaGalleryPrefId AddGallery(const base::FilePath& path) {
97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    MediaGalleryPrefInfo gallery_info;
98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_FALSE(gallery_prefs_->LookUpGalleryByPath(path, &gallery_info));
99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    MediaGalleryPrefId id =
100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        gallery_prefs_->AddGallery(gallery_info.device_id,
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   gallery_info.path,
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   MediaGalleryPrefInfo::kUserAdded,
103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   gallery_info.volume_label,
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   gallery_info.vendor_name,
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   gallery_info.model_name,
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   gallery_info.total_size_in_bytes,
107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   gallery_info.last_attach_time,
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   0,
109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   0,
110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                   0);
111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_NE(kInvalidMediaGalleryPrefId, id);
112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_TRUE(gallery_prefs_->SetGalleryPermissionForExtension(
114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        *extension_, id, true));
115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return id;
116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  TestingProfile* profile() { return profile_.get(); }
119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  GalleryWatchManager* manager() { return manager_.get(); }
121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  extensions::Extension* extension() { return extension_.get(); }
123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MediaGalleriesPreferences* gallery_prefs() { return gallery_prefs_; }
125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool GalleryWatchesSupported() {
127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return base::FilePathWatcher::RecursiveWatchAvailable();
128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void AddAndConfirmWatch(MediaGalleryPrefId gallery_id) {
131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    base::RunLoop loop;
132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    manager()->AddWatch(profile(),
133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                        extension(),
134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                        gallery_id,
135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                        base::Bind(&ConfirmWatch, base::Unretained(&loop)));
136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    loop.Run();
137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void ExpectGalleryChanged(base::RunLoop* loop) {
140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    expect_gallery_changed_ = true;
141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    pending_loop_ = loop;
142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void ExpectGalleryWatchDropped(base::RunLoop* loop) {
145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    expect_gallery_watch_dropped_ = true;
146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    pending_loop_ = loop;
147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private:
150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // GalleryWatchManagerObserver implementation.
151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void OnGalleryChanged(const std::string& extension_id,
152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                MediaGalleryPrefId gallery_id) OVERRIDE {
153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_TRUE(expect_gallery_changed_);
154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    pending_loop_->Quit();
155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  virtual void OnGalleryWatchDropped(const std::string& extension_id,
158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     MediaGalleryPrefId gallery_id) OVERRIDE {
159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_TRUE(expect_gallery_watch_dropped_);
160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    pending_loop_->Quit();
161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<GalleryWatchManager> manager_;
164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Needed for extension service & friends to work.
166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  content::TestBrowserThreadBundle thread_bundle_;
167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_refptr<extensions::Extension> extension_;
169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EnsureMediaDirectoriesExists mock_gallery_locations_;
171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(OS_CHROMEOS)
173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  chromeos::ScopedTestDeviceSettingsService test_device_settings_service_;
174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  chromeos::ScopedTestCrosSettings test_cros_settings_;
175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  chromeos::ScopedTestUserManager test_user_manager_;
176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif
177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  storage_monitor::TestStorageMonitor monitor_;
179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  scoped_ptr<TestingProfile> profile_;
180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MediaGalleriesPreferences* gallery_prefs_;
181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool expect_gallery_changed_;
183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool expect_gallery_watch_dropped_;
184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::RunLoop* pending_loop_;
185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(GalleryWatchManagerTest);
187116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch};
188116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
189116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(GalleryWatchManagerTest, Basic) {
190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::ScopedTempDir temp_dir;
191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MediaGalleryPrefId id = AddGallery(temp_dir.path());
193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::RunLoop loop;
195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (GalleryWatchesSupported()) {
196116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    manager()->AddWatch(profile(),
197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                        extension(),
198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                        id,
199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                        base::Bind(&ConfirmWatch, base::Unretained(&loop)));
200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  } else {
201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    manager()->AddWatch(
202116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        profile(),
203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        extension(),
204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        id,
205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        base::Bind(&ExpectWatchError,
206116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                   base::Unretained(&loop),
207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                   GalleryWatchManager::kCouldNotWatchGalleryError));
208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  loop.Run();
210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
212116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(GalleryWatchManagerTest, AddAndRemoveTwoWatches) {
213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!GalleryWatchesSupported())
214116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
215116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
216116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(manager()->GetWatchSet(profile(), extension()->id()).empty());
217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::ScopedTempDir temp1;
219116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(temp1.CreateUniqueTempDir());
220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MediaGalleryPrefId id1 = AddGallery(temp1.path());
221116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
222116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::ScopedTempDir temp2;
223116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(temp2.CreateUniqueTempDir());
224116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MediaGalleryPrefId id2 = AddGallery(temp2.path());
225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Add first watch and test it was added correctly.
227116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  AddAndConfirmWatch(id1);
228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MediaGalleryPrefIdSet set1 =
229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      manager()->GetWatchSet(profile(), extension()->id());
230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(1u, set1.size());
231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(ContainsKey(set1, id1));
232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Test that the second watch was added correctly too.
234116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  AddAndConfirmWatch(id2);
235116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MediaGalleryPrefIdSet set2 =
236116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      manager()->GetWatchSet(profile(), extension()->id());
237116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(2u, set2.size());
238116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(ContainsKey(set2, id1));
239116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(ContainsKey(set2, id2));
240116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
241116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Remove first watch and test that the second is still in there.
242116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  manager()->RemoveWatch(profile(), extension()->id(), id1);
243116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MediaGalleryPrefIdSet set3 =
244116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      manager()->GetWatchSet(profile(), extension()->id());
245116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(1u, set3.size());
246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(ContainsKey(set3, id2));
247116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
248116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Try removing the first watch again and test that it has no effect.
249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  manager()->RemoveWatch(profile(), extension()->id(), id1);
250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(1u, manager()->GetWatchSet(profile(), extension()->id()).size());
251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Remove the second watch and test that the new watch set is empty.
253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  manager()->RemoveWatch(profile(), extension()->id(), id2);
254116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(manager()->GetWatchSet(profile(), extension()->id()).empty());
255116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
256116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
257116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(GalleryWatchManagerTest, RemoveAllWatches) {
258116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!GalleryWatchesSupported())
259116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
260116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
261116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::ScopedTempDir temp1;
262116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(temp1.CreateUniqueTempDir());
263116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MediaGalleryPrefId id1 = AddGallery(temp1.path());
264116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
265116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::ScopedTempDir temp2;
266116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(temp2.CreateUniqueTempDir());
267116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MediaGalleryPrefId id2 = AddGallery(temp2.path());
268116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
269116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Add watches.
270116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  AddAndConfirmWatch(id1);
271116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  AddAndConfirmWatch(id2);
272116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
273116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(2u, manager()->GetWatchSet(profile(), extension()->id()).size());
274116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
275116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // RemoveAllWatches using a different extension ID and verify watches remain.
276116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  manager()->RemoveAllWatches(profile(), "OtherExtensionId");
277116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_EQ(2u, manager()->GetWatchSet(profile(), extension()->id()).size());
278116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
279116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // RemoveAllWatches using the correct extension ID and verify watches gone.
280116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
281116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  manager()->RemoveAllWatches(profile(), extension()->id());
282116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(manager()->GetWatchSet(profile(), extension()->id()).empty());
283116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
284116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
285116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(GalleryWatchManagerTest, DropWatchOnGalleryRemoved) {
286116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!GalleryWatchesSupported())
287116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
288116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
289116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::ScopedTempDir temp_dir;
290116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
291116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MediaGalleryPrefId id = AddGallery(temp_dir.path());
292116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  AddAndConfirmWatch(id);
293116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
294116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::RunLoop success_loop;
295116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ExpectGalleryWatchDropped(&success_loop);
296116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  gallery_prefs()->EraseGalleryById(id);
297116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  success_loop.Run();
298116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
299116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
300116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(GalleryWatchManagerTest, DropWatchOnGalleryPermissionRevoked) {
301116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!GalleryWatchesSupported())
302116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
303116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
304116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::ScopedTempDir temp_dir;
305116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
306116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MediaGalleryPrefId id = AddGallery(temp_dir.path());
307116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  AddAndConfirmWatch(id);
308116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
309116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::RunLoop success_loop;
310116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ExpectGalleryWatchDropped(&success_loop);
311116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  gallery_prefs()->SetGalleryPermissionForExtension(*extension(), id, false);
312116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  success_loop.Run();
313116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
314116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
315116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(GalleryWatchManagerTest, TestWatchOperation) {
316116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!GalleryWatchesSupported())
317116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
318116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
319116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::ScopedTempDir temp_dir;
320116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
321116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MediaGalleryPrefId id = AddGallery(temp_dir.path());
322116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  AddAndConfirmWatch(id);
323116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
324116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::RunLoop success_loop;
325116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ExpectGalleryChanged(&success_loop);
326116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ASSERT_EQ(
327116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      4, base::WriteFile(temp_dir.path().AppendASCII("fake file"), "blah", 4));
328116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  success_loop.Run();
329116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
330116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
331116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace component_updater
332