1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "base/strings/string_number_conversions.h" 6#include "base/strings/utf_string_conversions.h" 7#include "chrome/browser/media_galleries/media_galleries_dialog_controller_mock.h" 8#include "chrome/browser/storage_monitor/storage_info.h" 9#include "chrome/browser/ui/gtk/extensions/media_galleries_dialog_gtk.h" 10#include "chrome/common/extensions/extension_test_util.h" 11#include "extensions/common/extension.h" 12#include "testing/gtest/include/gtest/gtest.h" 13 14using ::testing::_; 15using ::testing::NiceMock; 16using ::testing::Return; 17using ::testing::ReturnPointee; 18using ::testing::ReturnRef; 19 20namespace { 21 22MediaGalleryPrefInfo MakePrefInfoForTesting(MediaGalleryPrefId id) { 23 MediaGalleryPrefInfo gallery; 24 gallery.pref_id = id; 25 gallery.device_id = StorageInfo::MakeDeviceId(StorageInfo::FIXED_MASS_STORAGE, 26 base::Int64ToString(id)); 27 gallery.display_name = ASCIIToUTF16("Display Name"); 28 return gallery; 29} 30 31} // namespace 32 33class MediaGalleriesDialogTest : public testing::Test { 34 public: 35 MediaGalleriesDialogTest() {} 36 virtual ~MediaGalleriesDialogTest() {} 37 virtual void SetUp() OVERRIDE { 38 dummy_extension_ = extension_test_util::CreateExtensionWithID("dummy"); 39 } 40 virtual void TearDown() OVERRIDE { 41 dummy_extension_ = NULL; 42 } 43 44 const extensions::Extension& dummy_extension() const { 45 return *dummy_extension_; 46 } 47 48 private: 49 scoped_refptr<extensions::Extension> dummy_extension_; 50 51 DISALLOW_COPY_AND_ASSIGN(MediaGalleriesDialogTest); 52}; 53 54// Tests that checkboxes are initialized according to the contents of 55// permissions in the registry. 56TEST_F(MediaGalleriesDialogTest, InitializeCheckboxes) { 57 // TODO(gbillock): Get rid of this mock; make something specialized. 58 NiceMock<MediaGalleriesDialogControllerMock> controller(dummy_extension()); 59 60 MediaGalleriesDialogController::GalleryPermissionsVector attached_permissions; 61 attached_permissions.push_back( 62 MediaGalleriesDialogController::GalleryPermission( 63 MakePrefInfoForTesting(1), true)); 64 attached_permissions.push_back( 65 MediaGalleriesDialogController::GalleryPermission( 66 MakePrefInfoForTesting(2), false)); 67 EXPECT_CALL(controller, AttachedPermissions()). 68 WillRepeatedly(Return(attached_permissions)); 69 70 MediaGalleriesDialogController::GalleryPermissionsVector 71 unattached_permissions; 72 EXPECT_CALL(controller, UnattachedPermissions()). 73 WillRepeatedly(Return(unattached_permissions)); 74 75 MediaGalleriesDialogGtk dialog(&controller); 76 EXPECT_EQ(2U, dialog.checkbox_map_.size()); 77 78 GtkWidget* checkbox1 = dialog.checkbox_map_[1]; 79 ASSERT_TRUE(GTK_IS_TOGGLE_BUTTON(checkbox1)); 80 EXPECT_TRUE(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbox1))); 81 82 GtkWidget* checkbox2 = dialog.checkbox_map_[2]; 83 ASSERT_TRUE(GTK_IS_TOGGLE_BUTTON(checkbox2)); 84 EXPECT_FALSE(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbox2))); 85} 86 87// Tests that toggling checkboxes updates the controller. 88TEST_F(MediaGalleriesDialogTest, ToggleCheckboxes) { 89 NiceMock<MediaGalleriesDialogControllerMock> controller(dummy_extension()); 90 91 MediaGalleriesDialogController::GalleryPermissionsVector attached_permissions; 92 attached_permissions.push_back( 93 MediaGalleriesDialogController::GalleryPermission( 94 MakePrefInfoForTesting(1), true)); 95 EXPECT_CALL(controller, AttachedPermissions()). 96 WillRepeatedly(Return(attached_permissions)); 97 98 MediaGalleriesDialogController::GalleryPermissionsVector 99 unattached_permissions; 100 EXPECT_CALL(controller, UnattachedPermissions()). 101 WillRepeatedly(Return(unattached_permissions)); 102 103 MediaGalleriesDialogGtk dialog(&controller); 104 EXPECT_EQ(1U, dialog.checkbox_map_.size()); 105 GtkWidget* checkbox = 106 dialog.checkbox_map_[1]; 107 ASSERT_TRUE(GTK_IS_TOGGLE_BUTTON(checkbox)); 108 EXPECT_TRUE(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkbox))); 109 110 EXPECT_CALL(controller, DidToggleGalleryId(1, false)); 111 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbox), FALSE); 112 113 EXPECT_CALL(controller, DidToggleGalleryId(1, true)); 114 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(checkbox), TRUE); 115} 116 117// Tests that UpdateGallery will add a new checkbox, but only if it refers to 118// a gallery that the dialog hasn't seen before. 119TEST_F(MediaGalleriesDialogTest, UpdateAdds) { 120 NiceMock<MediaGalleriesDialogControllerMock> controller(dummy_extension()); 121 122 MediaGalleriesDialogController::GalleryPermissionsVector attached_permissions; 123 EXPECT_CALL(controller, AttachedPermissions()). 124 WillRepeatedly(ReturnPointee(&attached_permissions)); 125 126 MediaGalleriesDialogController::GalleryPermissionsVector 127 unattached_permissions; 128 EXPECT_CALL(controller, UnattachedPermissions()). 129 WillRepeatedly(Return(unattached_permissions)); 130 131 MediaGalleriesDialogGtk dialog(&controller); 132 133 EXPECT_TRUE(dialog.checkbox_map_.empty()); 134 135 MediaGalleryPrefInfo gallery1 = MakePrefInfoForTesting(1); 136 attached_permissions.push_back( 137 MediaGalleriesDialogController::GalleryPermission(gallery1, true)); 138 dialog.UpdateGalleries(); 139 EXPECT_EQ(1U, dialog.checkbox_map_.size()); 140 141 MediaGalleryPrefInfo gallery2 = MakePrefInfoForTesting(2); 142 attached_permissions.push_back( 143 MediaGalleriesDialogController::GalleryPermission(gallery2, true)); 144 dialog.UpdateGalleries(); 145 EXPECT_EQ(2U, dialog.checkbox_map_.size()); 146 147 attached_permissions.push_back( 148 MediaGalleriesDialogController::GalleryPermission(gallery2, false)); 149 dialog.UpdateGalleries(); 150 EXPECT_EQ(2U, dialog.checkbox_map_.size()); 151} 152 153TEST_F(MediaGalleriesDialogTest, ForgetDeletes) { 154 NiceMock<MediaGalleriesDialogControllerMock> controller(dummy_extension()); 155 156 MediaGalleriesDialogController::GalleryPermissionsVector attached_permissions; 157 EXPECT_CALL(controller, AttachedPermissions()). 158 WillRepeatedly(ReturnPointee(&attached_permissions)); 159 160 MediaGalleriesDialogController::GalleryPermissionsVector 161 unattached_permissions; 162 EXPECT_CALL(controller, UnattachedPermissions()). 163 WillRepeatedly(Return(unattached_permissions)); 164 165 MediaGalleriesDialogGtk dialog(&controller); 166 167 EXPECT_TRUE(dialog.checkbox_map_.empty()); 168 169 MediaGalleryPrefInfo gallery1 = MakePrefInfoForTesting(1); 170 attached_permissions.push_back( 171 MediaGalleriesDialogController::GalleryPermission(gallery1, true)); 172 dialog.UpdateGalleries(); 173 EXPECT_EQ(1U, dialog.checkbox_map_.size()); 174 175 MediaGalleryPrefInfo gallery2 = MakePrefInfoForTesting(2); 176 attached_permissions.push_back( 177 MediaGalleriesDialogController::GalleryPermission(gallery2, true)); 178 dialog.UpdateGalleries(); 179 EXPECT_EQ(2U, dialog.checkbox_map_.size()); 180 181 attached_permissions.pop_back(); 182 dialog.UpdateGalleries(); 183 EXPECT_EQ(1U, dialog.checkbox_map_.size()); 184} 185