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