Home | History | Annotate | Download | only in settings
      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 <map>
      6 #include <string>
      7 
      8 #include "base/bind.h"
      9 #include "base/memory/scoped_ptr.h"
     10 #include "base/memory/weak_ptr.h"
     11 #include "base/message_loop/message_loop.h"
     12 #include "base/stl_util.h"
     13 #include "base/values.h"
     14 #include "chrome/browser/chromeos/policy/proto/chrome_device_policy.pb.h"
     15 #include "chrome/browser/chromeos/settings/cros_settings.h"
     16 #include "chrome/browser/chromeos/settings/device_settings_service.h"
     17 #include "chrome/browser/chromeos/settings/device_settings_test_helper.h"
     18 #include "chrome/test/base/scoped_testing_local_state.h"
     19 #include "chrome/test/base/testing_browser_process.h"
     20 #include "chromeos/settings/cros_settings_names.h"
     21 #include "components/policy/core/common/cloud/cloud_policy_constants.h"
     22 #include "content/public/test/test_browser_thread.h"
     23 #include "policy/proto/device_management_backend.pb.h"
     24 #include "testing/gtest/include/gtest/gtest.h"
     25 
     26 namespace em = enterprise_management;
     27 
     28 namespace chromeos {
     29 
     30 class CrosSettingsTest : public testing::Test {
     31  protected:
     32   CrosSettingsTest()
     33       : ui_thread_(content::BrowserThread::UI, &message_loop_),
     34         local_state_(TestingBrowserProcess::GetGlobal()),
     35         settings_(DeviceSettingsService::Get()),
     36         weak_factory_(this) {}
     37 
     38   virtual ~CrosSettingsTest() {}
     39 
     40   virtual void TearDown() OVERRIDE {
     41     ASSERT_TRUE(expected_props_.empty());
     42     STLDeleteValues(&expected_props_);
     43     expected_props_.clear();
     44   }
     45 
     46   void FetchPref(const std::string& pref) {
     47     DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
     48     if (expected_props_.find(pref) == expected_props_.end())
     49       return;
     50 
     51     if (CrosSettingsProvider::TRUSTED ==
     52             settings_.PrepareTrustedValues(
     53                 base::Bind(&CrosSettingsTest::FetchPref,
     54                            weak_factory_.GetWeakPtr(), pref))) {
     55       scoped_ptr<base::Value> expected_value(
     56           expected_props_.find(pref)->second);
     57       const base::Value* pref_value = settings_.GetPref(pref);
     58       if (expected_value.get()) {
     59         ASSERT_TRUE(pref_value);
     60         ASSERT_TRUE(expected_value->Equals(pref_value));
     61       } else {
     62         ASSERT_FALSE(pref_value);
     63       }
     64       expected_props_.erase(pref);
     65     }
     66   }
     67 
     68   void SetPref(const std::string& pref_name, const base::Value* value) {
     69     DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
     70     settings_.Set(pref_name, *value);
     71   }
     72 
     73   void AddExpectation(const std::string& pref_name, base::Value* value) {
     74     base::Value*& entry = expected_props_[pref_name];
     75     delete entry;
     76     entry = value;
     77   }
     78 
     79   void PrepareEmptyPolicy(em::PolicyData* policy) {
     80     // Prepare some policy blob.
     81     em::PolicyFetchResponse response;
     82     em::ChromeDeviceSettingsProto pol;
     83     policy->set_policy_type(policy::dm_protocol::kChromeDevicePolicyType);
     84     policy->set_username("me@owner");
     85     policy->set_policy_value(pol.SerializeAsString());
     86     // Wipe the signed settings store.
     87     response.set_policy_data(policy->SerializeAsString());
     88     response.set_policy_data_signature("false");
     89   }
     90 
     91   static bool IsWhitelisted(CrosSettings* cs, const std::string& username) {
     92     return cs->FindEmailInList(kAccountsPrefUsers, username, NULL);
     93   }
     94 
     95   base::MessageLoopForUI message_loop_;
     96   content::TestBrowserThread ui_thread_;
     97 
     98   ScopedTestingLocalState local_state_;
     99   ScopedDeviceSettingsTestHelper device_settings_test_helper_;
    100   CrosSettings settings_;
    101 
    102   base::WeakPtrFactory<CrosSettingsTest> weak_factory_;
    103 
    104   std::map<std::string, base::Value*> expected_props_;
    105 };
    106 
    107 TEST_F(CrosSettingsTest, SetPref) {
    108   // Change to something that is not the default.
    109   AddExpectation(kAccountsPrefAllowGuest,
    110                  base::Value::CreateBooleanValue(false));
    111   SetPref(kAccountsPrefAllowGuest, expected_props_[kAccountsPrefAllowGuest]);
    112   FetchPref(kAccountsPrefAllowGuest);
    113   ASSERT_TRUE(expected_props_.empty());
    114 }
    115 
    116 TEST_F(CrosSettingsTest, GetPref) {
    117   // We didn't change the default so look for it.
    118   AddExpectation(kAccountsPrefAllowGuest,
    119                  base::Value::CreateBooleanValue(true));
    120   FetchPref(kAccountsPrefAllowGuest);
    121 }
    122 
    123 TEST_F(CrosSettingsTest, SetWhitelist) {
    124   // Setting the whitelist should also switch the value of
    125   // kAccountsPrefAllowNewUser to false.
    126   base::ListValue whitelist;
    127   whitelist.Append(new base::StringValue("me@owner"));
    128   AddExpectation(kAccountsPrefAllowNewUser,
    129                  base::Value::CreateBooleanValue(false));
    130   AddExpectation(kAccountsPrefUsers, whitelist.DeepCopy());
    131   SetPref(kAccountsPrefUsers, &whitelist);
    132   FetchPref(kAccountsPrefAllowNewUser);
    133   FetchPref(kAccountsPrefUsers);
    134 }
    135 
    136 TEST_F(CrosSettingsTest, SetWhitelistWithListOps) {
    137   base::ListValue* whitelist = new base::ListValue();
    138   base::StringValue hacky_user("h@xxor");
    139   whitelist->Append(hacky_user.DeepCopy());
    140   AddExpectation(kAccountsPrefAllowNewUser,
    141                  base::Value::CreateBooleanValue(false));
    142   AddExpectation(kAccountsPrefUsers, whitelist);
    143   // Add some user to the whitelist.
    144   settings_.AppendToList(kAccountsPrefUsers, &hacky_user);
    145   FetchPref(kAccountsPrefAllowNewUser);
    146   FetchPref(kAccountsPrefUsers);
    147 }
    148 
    149 TEST_F(CrosSettingsTest, SetWhitelistWithListOps2) {
    150   base::ListValue whitelist;
    151   base::StringValue hacky_user("h@xxor");
    152   base::StringValue lamy_user("l@mer");
    153   whitelist.Append(hacky_user.DeepCopy());
    154   base::ListValue* expected_list = whitelist.DeepCopy();
    155   whitelist.Append(lamy_user.DeepCopy());
    156   AddExpectation(kAccountsPrefAllowNewUser,
    157                  base::Value::CreateBooleanValue(false));
    158   AddExpectation(kAccountsPrefUsers, whitelist.DeepCopy());
    159   SetPref(kAccountsPrefUsers, &whitelist);
    160   FetchPref(kAccountsPrefAllowNewUser);
    161   FetchPref(kAccountsPrefUsers);
    162   ASSERT_TRUE(expected_props_.empty());
    163   // Now try to remove one element from that list.
    164   AddExpectation(kAccountsPrefUsers, expected_list);
    165   settings_.RemoveFromList(kAccountsPrefUsers, &lamy_user);
    166   FetchPref(kAccountsPrefAllowNewUser);
    167   FetchPref(kAccountsPrefUsers);
    168 }
    169 
    170 TEST_F(CrosSettingsTest, SetEmptyWhitelist) {
    171   // Setting the whitelist empty should switch the value of
    172   // kAccountsPrefAllowNewUser to true.
    173   base::ListValue whitelist;
    174   AddExpectation(kAccountsPrefAllowNewUser,
    175                  base::Value::CreateBooleanValue(true));
    176   SetPref(kAccountsPrefUsers, &whitelist);
    177   FetchPref(kAccountsPrefAllowNewUser);
    178   FetchPref(kAccountsPrefUsers);
    179 }
    180 
    181 TEST_F(CrosSettingsTest, SetEmptyWhitelistAndNoNewUsers) {
    182   // Setting the whitelist empty and disallowing new users should result in no
    183   // new users allowed.
    184   base::ListValue whitelist;
    185   base::FundamentalValue disallow_new(false);
    186   AddExpectation(kAccountsPrefUsers, whitelist.DeepCopy());
    187   AddExpectation(kAccountsPrefAllowNewUser,
    188                  base::Value::CreateBooleanValue(false));
    189   SetPref(kAccountsPrefUsers, &whitelist);
    190   SetPref(kAccountsPrefAllowNewUser, &disallow_new);
    191   FetchPref(kAccountsPrefAllowNewUser);
    192   FetchPref(kAccountsPrefUsers);
    193 }
    194 
    195 TEST_F(CrosSettingsTest, SetWhitelistAndNoNewUsers) {
    196   // Setting the whitelist should allow us to set kAccountsPrefAllowNewUser to
    197   // false (which is the implicit value too).
    198   base::ListValue whitelist;
    199   whitelist.Append(new base::StringValue("me@owner"));
    200   AddExpectation(kAccountsPrefUsers, whitelist.DeepCopy());
    201   AddExpectation(kAccountsPrefAllowNewUser,
    202                  base::Value::CreateBooleanValue(false));
    203   SetPref(kAccountsPrefUsers, &whitelist);
    204   SetPref(kAccountsPrefAllowNewUser,
    205           expected_props_[kAccountsPrefAllowNewUser]);
    206   FetchPref(kAccountsPrefAllowNewUser);
    207   FetchPref(kAccountsPrefUsers);
    208 }
    209 
    210 TEST_F(CrosSettingsTest, SetAllowNewUsers) {
    211   // Setting kAccountsPrefAllowNewUser to true with no whitelist should be ok.
    212   AddExpectation(kAccountsPrefAllowNewUser,
    213                  base::Value::CreateBooleanValue(true));
    214   SetPref(kAccountsPrefAllowNewUser,
    215           expected_props_[kAccountsPrefAllowNewUser]);
    216   FetchPref(kAccountsPrefAllowNewUser);
    217 }
    218 
    219 TEST_F(CrosSettingsTest, SetEphemeralUsersEnabled) {
    220   base::FundamentalValue ephemeral_users_enabled(true);
    221   AddExpectation(kAccountsPrefEphemeralUsersEnabled,
    222                  base::Value::CreateBooleanValue(true));
    223   SetPref(kAccountsPrefEphemeralUsersEnabled, &ephemeral_users_enabled);
    224   FetchPref(kAccountsPrefEphemeralUsersEnabled);
    225 }
    226 
    227 TEST_F(CrosSettingsTest, FindEmailInList) {
    228   base::ListValue list;
    229   list.Append(new base::StringValue("user (at) example.com"));
    230   list.Append(new base::StringValue("nodomain"));
    231   list.Append(new base::StringValue("with.dots (at) gmail.com"));
    232   list.Append(new base::StringValue("Upper (at) example.com"));
    233 
    234   CrosSettings* cs = &settings_;
    235   cs->Set(kAccountsPrefUsers, list);
    236 
    237   EXPECT_TRUE(IsWhitelisted(cs, "user (at) example.com"));
    238   EXPECT_FALSE(IsWhitelisted(cs, "us.er (at) example.com"));
    239   EXPECT_TRUE(IsWhitelisted(cs, "USER (at) example.com"));
    240   EXPECT_FALSE(IsWhitelisted(cs, "user"));
    241 
    242   EXPECT_TRUE(IsWhitelisted(cs, "nodomain"));
    243   EXPECT_TRUE(IsWhitelisted(cs, "nodomain (at) gmail.com"));
    244   EXPECT_TRUE(IsWhitelisted(cs, "no.domain (at) gmail.com"));
    245   EXPECT_TRUE(IsWhitelisted(cs, "NO.DOMAIN"));
    246 
    247   EXPECT_TRUE(IsWhitelisted(cs, "with.dots (at) gmail.com"));
    248   EXPECT_TRUE(IsWhitelisted(cs, "withdots (at) gmail.com"));
    249   EXPECT_TRUE(IsWhitelisted(cs, "WITH.DOTS (at) gmail.com"));
    250   EXPECT_TRUE(IsWhitelisted(cs, "WITHDOTS"));
    251 
    252   EXPECT_TRUE(IsWhitelisted(cs, "Upper (at) example.com"));
    253   EXPECT_FALSE(IsWhitelisted(cs, "U.pper (at) example.com"));
    254   EXPECT_FALSE(IsWhitelisted(cs, "Upper"));
    255   EXPECT_TRUE(IsWhitelisted(cs, "upper (at) example.com"));
    256 }
    257 
    258 TEST_F(CrosSettingsTest, FindEmailInListWildcard) {
    259   base::ListValue list;
    260   list.Append(new base::StringValue("user (at) example.com"));
    261   list.Append(new base::StringValue("*@example.com"));
    262 
    263   CrosSettings* cs = &settings_;
    264   cs->Set(kAccountsPrefUsers, list);
    265 
    266   bool wildcard_match = false;
    267   EXPECT_TRUE(cs->FindEmailInList(
    268       kAccountsPrefUsers, "test (at) example.com", &wildcard_match));
    269   EXPECT_TRUE(wildcard_match);
    270   EXPECT_TRUE(cs->FindEmailInList(
    271       kAccountsPrefUsers, "user (at) example.com", &wildcard_match));
    272   EXPECT_FALSE(wildcard_match);
    273   EXPECT_TRUE(cs->FindEmailInList(
    274       kAccountsPrefUsers, "*@example.com", &wildcard_match));
    275   EXPECT_TRUE(wildcard_match);
    276 }
    277 
    278 }  // namespace chromeos
    279