1 // Copyright 2013 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/command_line.h" 6 #include "base/prefs/pref_service.h" 7 #include "base/run_loop.h" 8 #include "chrome/browser/extensions/activity_log/activity_log.h" 9 #include "chrome/browser/extensions/api/activity_log_private/activity_log_private_api.h" 10 #include "chrome/browser/extensions/extension_service.h" 11 #include "chrome/browser/extensions/test_extension_system.h" 12 #include "chrome/common/chrome_switches.h" 13 #include "chrome/common/pref_names.h" 14 #include "chrome/test/base/chrome_render_view_host_test_harness.h" 15 #include "chrome/test/base/testing_profile.h" 16 #include "extensions/browser/uninstall_reason.h" 17 #include "extensions/common/extension_builder.h" 18 19 #if defined OS_CHROMEOS 20 #include "chrome/browser/chromeos/login/users/scoped_test_user_manager.h" 21 #include "chrome/browser/chromeos/settings/cros_settings.h" 22 #include "chrome/browser/chromeos/settings/device_settings_service.h" 23 #endif 24 25 namespace extensions { 26 27 const char* kExtensionID = "abjoigjokfeibfhiahiijggogladbmfm"; 28 29 class ActivityLogEnabledTest : public ChromeRenderViewHostTestHarness { 30 protected: 31 virtual void SetUp() OVERRIDE { 32 ChromeRenderViewHostTestHarness::SetUp(); 33 #if defined OS_CHROMEOS 34 test_user_manager_.reset(new chromeos::ScopedTestUserManager()); 35 #endif 36 } 37 38 virtual void TearDown() OVERRIDE { 39 #if defined OS_CHROMEOS 40 test_user_manager_.reset(); 41 #endif 42 ChromeRenderViewHostTestHarness::TearDown(); 43 } 44 45 #if defined OS_CHROMEOS 46 chromeos::ScopedTestDeviceSettingsService test_device_settings_service_; 47 chromeos::ScopedTestCrosSettings test_cros_settings_; 48 scoped_ptr<chromeos::ScopedTestUserManager> test_user_manager_; 49 #endif 50 }; 51 52 TEST_F(ActivityLogEnabledTest, NoSwitch) { 53 scoped_ptr<TestingProfile> profile( 54 static_cast<TestingProfile*>(CreateBrowserContext())); 55 EXPECT_FALSE( 56 profile->GetPrefs()->GetInteger(prefs::kWatchdogExtensionActive)); 57 58 ActivityLog* activity_log = ActivityLog::GetInstance(profile.get()); 59 60 EXPECT_EQ(0, 61 profile->GetPrefs()->GetInteger(prefs::kWatchdogExtensionActive)); 62 EXPECT_FALSE(activity_log->IsDatabaseEnabled()); 63 EXPECT_FALSE(activity_log->IsWatchdogAppActive()); 64 } 65 66 TEST_F(ActivityLogEnabledTest, CommandLineSwitch) { 67 scoped_ptr<TestingProfile> profile1( 68 static_cast<TestingProfile*>(CreateBrowserContext())); 69 scoped_ptr<TestingProfile> profile2( 70 static_cast<TestingProfile*>(CreateBrowserContext())); 71 72 CommandLine command_line(CommandLine::NO_PROGRAM); 73 CommandLine saved_cmdline_ = *CommandLine::ForCurrentProcess(); 74 CommandLine::ForCurrentProcess()->AppendSwitch( 75 switches::kEnableExtensionActivityLogging); 76 ActivityLog* activity_log1 = ActivityLog::GetInstance(profile1.get()); 77 *CommandLine::ForCurrentProcess() = saved_cmdline_; 78 ActivityLog* activity_log2 = ActivityLog::GetInstance(profile2.get()); 79 80 EXPECT_EQ(0, 81 profile1->GetPrefs()->GetInteger(prefs::kWatchdogExtensionActive)); 82 EXPECT_EQ(0, 83 profile2->GetPrefs()->GetInteger(prefs::kWatchdogExtensionActive)); 84 EXPECT_TRUE(activity_log1->IsDatabaseEnabled()); 85 EXPECT_FALSE(activity_log2->IsDatabaseEnabled()); 86 EXPECT_FALSE(activity_log1->IsWatchdogAppActive()); 87 EXPECT_FALSE(activity_log2->IsWatchdogAppActive()); 88 } 89 90 TEST_F(ActivityLogEnabledTest, PrefSwitch) { 91 scoped_ptr<TestingProfile> profile1( 92 static_cast<TestingProfile*>(CreateBrowserContext())); 93 scoped_ptr<TestingProfile> profile2( 94 static_cast<TestingProfile*>(CreateBrowserContext())); 95 scoped_ptr<TestingProfile> profile3( 96 static_cast<TestingProfile*>(CreateBrowserContext())); 97 98 EXPECT_EQ(0, 99 profile1->GetPrefs()->GetInteger(prefs::kWatchdogExtensionActive)); 100 EXPECT_EQ(0, 101 profile2->GetPrefs()->GetInteger(prefs::kWatchdogExtensionActive)); 102 EXPECT_EQ(0, 103 profile3->GetPrefs()->GetInteger(prefs::kWatchdogExtensionActive)); 104 105 profile1->GetPrefs()->SetInteger(prefs::kWatchdogExtensionActive, 1); 106 profile3->GetPrefs()->SetInteger(prefs::kWatchdogExtensionActive, 2); 107 ActivityLog* activity_log1 = ActivityLog::GetInstance(profile1.get()); 108 ActivityLog* activity_log2 = ActivityLog::GetInstance(profile2.get()); 109 ActivityLog* activity_log3 = ActivityLog::GetInstance(profile3.get()); 110 111 EXPECT_EQ(1, 112 profile1->GetPrefs()->GetInteger(prefs::kWatchdogExtensionActive)); 113 EXPECT_EQ(0, 114 profile2->GetPrefs()->GetInteger(prefs::kWatchdogExtensionActive)); 115 EXPECT_EQ(2, 116 profile3->GetPrefs()->GetInteger(prefs::kWatchdogExtensionActive)); 117 EXPECT_TRUE(activity_log1->IsWatchdogAppActive()); 118 EXPECT_FALSE(activity_log2->IsWatchdogAppActive()); 119 EXPECT_TRUE(activity_log3->IsWatchdogAppActive()); 120 EXPECT_TRUE(activity_log1->IsDatabaseEnabled()); 121 EXPECT_FALSE(activity_log2->IsDatabaseEnabled()); 122 EXPECT_TRUE(activity_log3->IsDatabaseEnabled()); 123 } 124 125 TEST_F(ActivityLogEnabledTest, WatchdogSwitch) { 126 CommandLine command_line(CommandLine::NO_PROGRAM); 127 scoped_ptr<TestingProfile> profile1( 128 static_cast<TestingProfile*>(CreateBrowserContext())); 129 scoped_ptr<TestingProfile> profile2( 130 static_cast<TestingProfile*>(CreateBrowserContext())); 131 // Extension service is destroyed by the profile. 132 ExtensionService* extension_service1 = 133 static_cast<TestExtensionSystem*>( 134 ExtensionSystem::Get(profile1.get()))->CreateExtensionService( 135 &command_line, base::FilePath(), false); 136 static_cast<TestExtensionSystem*>( 137 ExtensionSystem::Get(profile1.get()))->SetReady(); 138 139 ActivityLog* activity_log1 = ActivityLog::GetInstance(profile1.get()); 140 ActivityLog* activity_log2 = ActivityLog::GetInstance(profile2.get()); 141 142 // Allow Activity Log to install extension tracker. 143 base::RunLoop().RunUntilIdle(); 144 145 EXPECT_EQ(0, 146 profile1->GetPrefs()->GetInteger(prefs::kWatchdogExtensionActive)); 147 EXPECT_EQ(0, 148 profile2->GetPrefs()->GetInteger(prefs::kWatchdogExtensionActive)); 149 150 scoped_refptr<Extension> extension = 151 ExtensionBuilder() 152 .SetManifest(DictionaryBuilder() 153 .Set("name", "Watchdog Extension ") 154 .Set("version", "1.0.0") 155 .Set("manifest_version", 2)) 156 .SetID(kExtensionID) 157 .Build(); 158 extension_service1->AddExtension(extension.get()); 159 160 EXPECT_EQ(1, 161 profile1->GetPrefs()->GetInteger(prefs::kWatchdogExtensionActive)); 162 EXPECT_EQ(0, 163 profile2->GetPrefs()->GetInteger(prefs::kWatchdogExtensionActive)); 164 EXPECT_TRUE(activity_log1->IsWatchdogAppActive()); 165 EXPECT_FALSE(activity_log2->IsWatchdogAppActive()); 166 EXPECT_TRUE(activity_log1->IsDatabaseEnabled()); 167 EXPECT_FALSE(activity_log2->IsDatabaseEnabled()); 168 169 extension_service1->DisableExtension(kExtensionID, 170 Extension::DISABLE_USER_ACTION); 171 172 EXPECT_EQ(0, 173 profile1->GetPrefs()->GetInteger(prefs::kWatchdogExtensionActive)); 174 EXPECT_EQ(0, 175 profile2->GetPrefs()->GetInteger(prefs::kWatchdogExtensionActive)); 176 EXPECT_FALSE(activity_log1->IsWatchdogAppActive()); 177 EXPECT_FALSE(activity_log2->IsWatchdogAppActive()); 178 EXPECT_FALSE(activity_log1->IsDatabaseEnabled()); 179 EXPECT_FALSE(activity_log2->IsDatabaseEnabled()); 180 181 extension_service1->EnableExtension(kExtensionID); 182 183 EXPECT_EQ(1, 184 profile1->GetPrefs()->GetInteger(prefs::kWatchdogExtensionActive)); 185 EXPECT_EQ(0, 186 profile2->GetPrefs()->GetInteger(prefs::kWatchdogExtensionActive)); 187 EXPECT_TRUE(activity_log1->IsWatchdogAppActive()); 188 EXPECT_FALSE(activity_log2->IsWatchdogAppActive()); 189 EXPECT_TRUE(activity_log1->IsDatabaseEnabled()); 190 EXPECT_FALSE(activity_log2->IsDatabaseEnabled()); 191 192 extension_service1->UninstallExtension( 193 kExtensionID, 194 extensions::UNINSTALL_REASON_FOR_TESTING, 195 base::Bind(&base::DoNothing), 196 NULL); 197 198 EXPECT_EQ(0, 199 profile1->GetPrefs()->GetInteger(prefs::kWatchdogExtensionActive)); 200 EXPECT_EQ(0, 201 profile2->GetPrefs()->GetInteger(prefs::kWatchdogExtensionActive)); 202 EXPECT_FALSE(activity_log1->IsWatchdogAppActive()); 203 EXPECT_FALSE(activity_log2->IsWatchdogAppActive()); 204 EXPECT_FALSE(activity_log1->IsDatabaseEnabled()); 205 EXPECT_FALSE(activity_log2->IsDatabaseEnabled()); 206 207 scoped_refptr<Extension> extension2 = 208 ExtensionBuilder() 209 .SetManifest(DictionaryBuilder() 210 .Set("name", "Watchdog Extension ") 211 .Set("version", "1.0.0") 212 .Set("manifest_version", 2)) 213 .SetID("fpofdchlamddhnajleknffcbmnjfahpg") 214 .Build(); 215 extension_service1->AddExtension(extension.get()); 216 extension_service1->AddExtension(extension2.get()); 217 EXPECT_EQ(2, 218 profile1->GetPrefs()->GetInteger(prefs::kWatchdogExtensionActive)); 219 EXPECT_TRUE(activity_log1->IsDatabaseEnabled()); 220 extension_service1->DisableExtension(kExtensionID, 221 Extension::DISABLE_USER_ACTION); 222 extension_service1->DisableExtension("fpofdchlamddhnajleknffcbmnjfahpg", 223 Extension::DISABLE_USER_ACTION); 224 EXPECT_EQ(0, 225 profile1->GetPrefs()->GetInteger(prefs::kWatchdogExtensionActive)); 226 EXPECT_FALSE(activity_log1->IsDatabaseEnabled()); 227 } 228 229 TEST_F(ActivityLogEnabledTest, AppAndCommandLine) { 230 // Set the command line switch. 231 CommandLine command_line(CommandLine::NO_PROGRAM); 232 CommandLine saved_cmdline_ = *CommandLine::ForCurrentProcess(); 233 CommandLine::ForCurrentProcess()->AppendSwitch( 234 switches::kEnableExtensionActivityLogging); 235 236 scoped_ptr<TestingProfile> profile( 237 static_cast<TestingProfile*>(CreateBrowserContext())); 238 // Extension service is destroyed by the profile. 239 ExtensionService* extension_service = 240 static_cast<TestExtensionSystem*>( 241 ExtensionSystem::Get(profile.get()))->CreateExtensionService( 242 &command_line, base::FilePath(), false); 243 static_cast<TestExtensionSystem*>( 244 ExtensionSystem::Get(profile.get()))->SetReady(); 245 246 ActivityLog* activity_log = ActivityLog::GetInstance(profile.get()); 247 // Allow Activity Log to install extension tracker. 248 base::RunLoop().RunUntilIdle(); 249 250 EXPECT_TRUE(activity_log->IsDatabaseEnabled()); 251 EXPECT_EQ(0, 252 profile->GetPrefs()->GetInteger(prefs::kWatchdogExtensionActive)); 253 EXPECT_FALSE(activity_log->IsWatchdogAppActive()); 254 255 // Enable the extension. 256 scoped_refptr<Extension> extension = 257 ExtensionBuilder() 258 .SetManifest(DictionaryBuilder() 259 .Set("name", "Watchdog Extension ") 260 .Set("version", "1.0.0") 261 .Set("manifest_version", 2)) 262 .SetID(kExtensionID) 263 .Build(); 264 extension_service->AddExtension(extension.get()); 265 266 EXPECT_TRUE(activity_log->IsDatabaseEnabled()); 267 EXPECT_EQ(1, 268 profile->GetPrefs()->GetInteger(prefs::kWatchdogExtensionActive)); 269 EXPECT_TRUE(activity_log->IsWatchdogAppActive()); 270 271 extension_service->UninstallExtension( 272 kExtensionID, 273 extensions::UNINSTALL_REASON_FOR_TESTING, 274 base::Bind(&base::DoNothing), 275 NULL); 276 277 EXPECT_TRUE(activity_log->IsDatabaseEnabled()); 278 EXPECT_EQ(0, 279 profile->GetPrefs()->GetInteger(prefs::kWatchdogExtensionActive)); 280 EXPECT_FALSE(activity_log->IsWatchdogAppActive()); 281 282 // Cleanup. 283 *CommandLine::ForCurrentProcess() = saved_cmdline_; 284 } 285 286 } // namespace extensions 287