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