15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/bind.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/command_line.h"
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/files/file_path.h"
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/weak_ptr.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/run_loop.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/string16.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/time/time.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/extensions/test_extension_system.h"
1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/media_galleries/media_galleries_dialog_controller_test_util.h"
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/media_galleries/media_galleries_preferences.h"
1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/browser/media_galleries/media_galleries_scan_result_controller.h"
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/media_galleries/media_galleries_test_util.h"
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/storage_monitor/test_storage_monitor.h"
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/public/test/test_browser_thread_bundle.h"
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h"
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/common/extension.h"
24effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "extensions/common/permissions/media_galleries_permission.h"
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_CHROMEOS)
286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "chrome/browser/chromeos/login/users/scoped_test_user_manager.h"
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h"
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/settings/device_settings_service.h"
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class MediaGalleriesScanResultControllerTest : public testing::Test {
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  MediaGalleriesScanResultControllerTest()
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : dialog_(NULL),
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        dialog_update_count_at_destruction_(0),
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        controller_(NULL),
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        profile_(new TestingProfile()),
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        weak_factory_(this) {
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  virtual ~MediaGalleriesScanResultControllerTest() {
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FALSE(controller_);
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FALSE(dialog_);
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(storage_monitor::TestStorageMonitor::CreateAndInstall());
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    extensions::TestExtensionSystem* extension_system(
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        static_cast<extensions::TestExtensionSystem*>(
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            extensions::ExtensionSystem::Get(profile_.get())));
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    extension_system->CreateExtensionService(
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        CommandLine::ForCurrentProcess(), base::FilePath(), false);
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    gallery_prefs_.reset(new MediaGalleriesPreferences(profile_.get()));
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::RunLoop loop;
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    gallery_prefs_->EnsureInitialized(loop.QuitClosure());
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    loop.Run();
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    std::vector<std::string> read_permissions;
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    read_permissions.push_back(
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        extensions::MediaGalleriesPermission::kReadPermission);
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    extension_ = AddMediaGalleriesApp("read", read_permissions, profile_.get());
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
69a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    storage_monitor::TestStorageMonitor::Destroy();
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void StartDialog() {
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_FALSE(controller_);
7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    controller_ = new MediaGalleriesScanResultController(
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        *extension_.get(),
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        gallery_prefs_.get(),
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::Bind(
7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)            &MediaGalleriesScanResultControllerTest::CreateMockDialog,
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            base::Unretained(this)),
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::Bind(
8146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)            &MediaGalleriesScanResultControllerTest::OnControllerDone,
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            base::Unretained(this)));
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  size_t GetFirstSectionSize() const {
8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return controller()->GetSectionEntries(0).size();
8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
8946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  MediaGalleriesScanResultController* controller() const {
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return controller_;
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  MockMediaGalleriesDialog* dialog() {
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return dialog_;
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int dialog_update_count_at_destruction() {
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FALSE(dialog_);
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return dialog_update_count_at_destruction_;
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  extensions::Extension* extension() {
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return extension_.get();
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MediaGalleriesPreferences* gallery_prefs() {
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return gallery_prefs_.get();
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MediaGalleryPrefId AddGallery(const std::string& path,
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                MediaGalleryPrefInfo::Type type,
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                int audio_count, int image_count,
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                int video_count) {
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    MediaGalleryPrefInfo gallery_info;
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    gallery_prefs_->LookUpGalleryByPath(MakeMediaGalleriesTestingPath(path),
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        &gallery_info);
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return gallery_prefs_->AddGallery(
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        gallery_info.device_id,
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        gallery_info.path,
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        type,
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        gallery_info.volume_label,
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        gallery_info.vendor_name,
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        gallery_info.model_name,
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        gallery_info.total_size_in_bytes,
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        gallery_info.last_attach_time,
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        audio_count, image_count, video_count);
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MediaGalleryPrefId AddScanResult(const std::string& path, int audio_count,
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   int image_count, int video_count) {
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return AddGallery(path, MediaGalleryPrefInfo::kScanResult, audio_count,
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      image_count, video_count);
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
13646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  MediaGalleriesDialog* CreateMockDialog(
13746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      MediaGalleriesDialogController* controller) {
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FALSE(dialog_);
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    dialog_update_count_at_destruction_ = 0;
14046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    dialog_ = new MockMediaGalleriesDialog(base::Bind(
14146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        &MediaGalleriesScanResultControllerTest::OnDialogDestroyed,
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        weak_factory_.GetWeakPtr()));
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return dialog_;
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnDialogDestroyed(int update_count) {
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(dialog_);
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    dialog_update_count_at_destruction_ = update_count;
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    dialog_ = NULL;
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnControllerDone() {
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    controller_ = NULL;
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Needed for extension service & friends to work.
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  content::TestBrowserThreadBundle thread_bundle_;
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The dialog is owned by the controller, but this pointer should only be
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // valid while the dialog is live within the controller.
16146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  MockMediaGalleriesDialog* dialog_;
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int dialog_update_count_at_destruction_;
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The controller owns itself.
16546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  MediaGalleriesScanResultController* controller_;
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_refptr<extensions::Extension> extension_;
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EnsureMediaDirectoriesExists mock_gallery_locations_;
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined OS_CHROMEOS
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  chromeos::ScopedTestDeviceSettingsService test_device_settings_service_;
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  chromeos::ScopedTestCrosSettings test_cros_settings_;
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  chromeos::ScopedTestUserManager test_user_manager_;
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  storage_monitor::TestStorageMonitor monitor_;
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<TestingProfile> profile_;
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<MediaGalleriesPreferences> gallery_prefs_;
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
18146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  base::WeakPtrFactory<MediaGalleriesScanResultControllerTest> weak_factory_;
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
18346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MediaGalleriesScanResultControllerTest);
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
18646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(MediaGalleriesScanResultControllerTest, EmptyDialog) {
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  StartDialog();
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(controller());
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(dialog());
19046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(0U, GetFirstSectionSize());
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  controller()->DialogFinished(true);
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(controller());
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(dialog());
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, dialog_update_count_at_destruction());
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
19846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(MediaGalleriesScanResultControllerTest, AddScanResults) {
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Start with two scan results.
2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MediaGalleryPrefId scan_id = AddScanResult("scan_id", 1, 0, 0);
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MediaGalleryPrefId auto_id =
2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      AddGallery("auto_id", MediaGalleryPrefInfo::kAutoDetected, 2, 0, 0);
2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0U, gallery_prefs()->GalleriesForExtension(*extension()).size());
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Show the dialog, but cancel it.
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  StartDialog();
20746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(2U, GetFirstSectionSize());
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  controller()->DialogFinished(false);
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0U, gallery_prefs()->GalleriesForExtension(*extension()).size());
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Show the dialog, unselect both and accept it.
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  StartDialog();
21346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(2U, GetFirstSectionSize());
21446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  controller()->DidToggleEntry(scan_id, false);
21546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  controller()->DidToggleEntry(auto_id, false);
2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  controller()->DialogFinished(true);
2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0U, gallery_prefs()->GalleriesForExtension(*extension()).size());
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Show the dialog, leave one selected and accept it.
2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  StartDialog();
22146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(2U, GetFirstSectionSize());
22246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  controller()->DidToggleEntry(scan_id, false);
2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  controller()->DialogFinished(true);
2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MediaGalleryPrefIdSet permitted =
2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      gallery_prefs()->GalleriesForExtension(*extension());
2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(1U, permitted.size());
2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(auto_id, *permitted.begin());
2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Show the dialog, toggle the remaining entry twice and then accept it.
2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  StartDialog();
23146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(1U, GetFirstSectionSize());
23246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  controller()->DidToggleEntry(scan_id, false);
23346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  controller()->DidToggleEntry(scan_id, true);
2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  controller()->DialogFinished(true);
2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(2U, gallery_prefs()->GalleriesForExtension(*extension()).size());
2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
23846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(MediaGalleriesScanResultControllerTest, Blacklisted) {
2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Start with two scan results.
2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MediaGalleryPrefId scan_id = AddScanResult("scan_id", 1, 0, 0);
2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MediaGalleryPrefId auto_id =
2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      AddGallery("auto_id", MediaGalleryPrefInfo::kAutoDetected, 2, 0, 0);
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0U, gallery_prefs()->GalleriesForExtension(*extension()).size());
2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Show the dialog, but cancel it.
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  StartDialog();
24746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(2U, GetFirstSectionSize());
2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  controller()->DialogFinished(false);
2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0U, gallery_prefs()->GalleriesForExtension(*extension()).size());
2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Blacklist one and try again.
2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gallery_prefs()->ForgetGalleryById(scan_id);
2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  StartDialog();
25446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(1U, GetFirstSectionSize());
2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  controller()->DialogFinished(false);
2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Adding it as a user gallery should change its type.
2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AddGallery("scan_id", MediaGalleryPrefInfo::kUserAdded, 1, 0, 0);
2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  StartDialog();
26046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(2U, GetFirstSectionSize());
2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Blacklisting the other while the dialog is open should remove it.
2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gallery_prefs()->ForgetGalleryById(auto_id);
26446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(1U, GetFirstSectionSize());
2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  controller()->DialogFinished(false);
2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0U, gallery_prefs()->GalleriesForExtension(*extension()).size());
2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, dialog_update_count_at_destruction());
2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
27046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(MediaGalleriesScanResultControllerTest, PrefUpdates) {
2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MediaGalleryPrefId selected = AddScanResult("selected", 1, 0, 0);
2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MediaGalleryPrefId unselected = AddScanResult("unselected", 1, 0, 0);
2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MediaGalleryPrefId selected_add_permission =
2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      AddScanResult("selected_add_permission", 1, 0, 0);
2755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MediaGalleryPrefId unselected_add_permission =
2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      AddScanResult("unselected_add_permission", 1, 0, 0);
2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MediaGalleryPrefId selected_removed =
2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      AddScanResult("selected_removed", 1, 0, 0);
2795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MediaGalleryPrefId unselected_removed =
2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      AddScanResult("unselected_removed", 1, 0, 0);
2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MediaGalleryPrefId selected_update =
2825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      AddScanResult("selected_update", 1, 0, 0);
2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MediaGalleryPrefId unselected_update =
2845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      AddScanResult("unselected_update", 1, 0, 0);
2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gallery_prefs()->AddGalleryByPath(MakeMediaGalleriesTestingPath("user"),
2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                    MediaGalleryPrefInfo::kUserAdded);
2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gallery_prefs()->AddGalleryByPath(
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      MakeMediaGalleriesTestingPath("auto_detected"),
2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      MediaGalleryPrefInfo::kAutoDetected);
2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MediaGalleryPrefId blacklisted = gallery_prefs()->AddGalleryByPath(
2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      MakeMediaGalleriesTestingPath("blacklisted"),
2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      MediaGalleryPrefInfo::kAutoDetected);
2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gallery_prefs()->ForgetGalleryById(blacklisted);
2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0U, gallery_prefs()->GalleriesForExtension(*extension()).size());
2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  StartDialog();
29846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(8U, GetFirstSectionSize());
29946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  controller()->DidToggleEntry(unselected, false);
30046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  controller()->DidToggleEntry(unselected_add_permission, false);
30146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  controller()->DidToggleEntry(unselected_removed, false);
30246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  controller()->DidToggleEntry(unselected_update, false);
3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0, dialog()->update_count());
30446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(8U, GetFirstSectionSize());
3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Add permission.
3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gallery_prefs()->SetGalleryPermissionForExtension(*extension(),
3085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                    unselected_add_permission,
3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                    true);
3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, dialog()->update_count());
31146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(7U, GetFirstSectionSize());
3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gallery_prefs()->SetGalleryPermissionForExtension(*extension(),
3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                    selected_add_permission,
3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                    true);
3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(2, dialog()->update_count());
31646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(6U, GetFirstSectionSize());
3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Blacklist scan results.
3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gallery_prefs()->ForgetGalleryById(unselected_removed);
3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(3, dialog()->update_count());
32146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(5U, GetFirstSectionSize());
3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gallery_prefs()->ForgetGalleryById(selected_removed);
3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(4, dialog()->update_count());
32446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(4U, GetFirstSectionSize());
3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Update names.
3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const MediaGalleryPrefInfo& unselected_update_info =
3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      gallery_prefs()->known_galleries().find(unselected_update)->second;
3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gallery_prefs()->AddGallery(
3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      unselected_update_info.device_id, base::FilePath(),
3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      MediaGalleryPrefInfo::kScanResult,
3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::ASCIIToUTF16("Updated & Unselected"),
3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::string16(), base::string16(), 0, base::Time(), 1, 0, 0);
3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(5, dialog()->update_count());
33546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(4U, GetFirstSectionSize());
3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const MediaGalleryPrefInfo& selected_update_info =
3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      gallery_prefs()->known_galleries().find(selected_update)->second;
3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gallery_prefs()->AddGallery(
3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      selected_update_info.device_id, base::FilePath(),
3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      MediaGalleryPrefInfo::kScanResult,
3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::ASCIIToUTF16("Updated & Selected"),
3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::string16(), base::string16(), 0, base::Time(), 1, 0, 0);
3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(6, dialog()->update_count());
34446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(4U, GetFirstSectionSize());
3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
34646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  MediaGalleriesDialogController::Entries results =
34746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      controller()->GetSectionEntries(0);
3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(selected, results[0].pref_info.pref_id);
3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(results[0].selected);
3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(selected_update, results[1].pref_info.pref_id);
3515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(results[1].selected);
3525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::ASCIIToUTF16("Updated & Selected"),
3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            results[1].pref_info.volume_label);
3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(unselected, results[2].pref_info.pref_id);
3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(results[2].selected);
3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(unselected_update, results[3].pref_info.pref_id);
3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(results[3].selected);
3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::ASCIIToUTF16("Updated & Unselected"),
3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            results[3].pref_info.volume_label);
3605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  controller()->DialogFinished(true);
3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(4U, gallery_prefs()->GalleriesForExtension(*extension()).size());
3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  StartDialog();
36446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(2U, GetFirstSectionSize());
3655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  controller()->DialogFinished(false);
3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
3675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
36846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(MediaGalleriesScanResultControllerTest, ForgetGallery) {
3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Start with two scan results.
3705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MediaGalleryPrefId scan1 = AddScanResult("scan1", 1, 0, 0);
3715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MediaGalleryPrefId scan2 = AddScanResult("scan2", 2, 0, 0);
3725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0U, gallery_prefs()->GalleriesForExtension(*extension()).size());
3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Remove one and then cancel.
3755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  StartDialog();
37646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(2U, GetFirstSectionSize());
37746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  controller()->DidForgetEntry(scan1);
3785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  controller()->DialogFinished(false);
3795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0U, gallery_prefs()->GalleriesForExtension(*extension()).size());
3805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Remove one and then have it blacklisted from prefs.
3825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  StartDialog();
38346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(2U, GetFirstSectionSize());
38446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  controller()->DidForgetEntry(scan1);
3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, dialog()->update_count());
38646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  controller()->DidToggleEntry(scan2, false);  // Uncheck the second.
3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gallery_prefs()->ForgetGalleryById(scan1);
3885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  controller()->DialogFinished(true);
3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0U, gallery_prefs()->GalleriesForExtension(*extension()).size());
3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(2, dialog_update_count_at_destruction());
3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Remove the other.
3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  StartDialog();
39446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(1U, GetFirstSectionSize());
39546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  controller()->DidForgetEntry(scan2);
3965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  controller()->DialogFinished(true);
3975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(0U, gallery_prefs()->GalleriesForExtension(*extension()).size());
3985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Check that nothing shows up.
4005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  StartDialog();
40146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(0U, GetFirstSectionSize());
4025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  controller()->DialogFinished(false);
4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
40546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(MediaGalleriesScanResultControllerTest, SortOrder) {
4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Intentionally out of order numerically and alphabetically.
4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MediaGalleryPrefId third = AddScanResult("third", 2, 2, 2);
4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MediaGalleryPrefId second =
4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      AddGallery("second", MediaGalleryPrefInfo::kAutoDetected, 9, 0, 0);
4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MediaGalleryPrefId first = AddScanResult("first", 8, 2, 3);
4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MediaGalleryPrefId fifth = AddScanResult("abb", 3, 0, 0);
4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MediaGalleryPrefId fourth = AddScanResult("aaa", 3, 0, 0);
4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  StartDialog();
41546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  MediaGalleriesDialogController::Entries results =
41646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      controller()->GetSectionEntries(0);
4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_EQ(5U, results.size());
4185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(first, results[0].pref_info.pref_id);
4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(second, results[1].pref_info.pref_id);
4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(third, results[2].pref_info.pref_id);
4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(fourth, results[3].pref_info.pref_id);
4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(fifth, results[4].pref_info.pref_id);
4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  controller()->DialogFinished(false);
4245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
425