Home | History | Annotate | Download | only in activity_log
      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