Home | History | Annotate | Download | only in prefs
      1 // Copyright (c) 2011 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 <gtest/gtest.h>
      6 
      7 #include "base/command_line.h"
      8 #include "base/memory/ref_counted.h"
      9 #include "base/string_util.h"
     10 #include "base/values.h"
     11 #include "chrome/browser/prefs/command_line_pref_store.h"
     12 #include "chrome/browser/prefs/proxy_config_dictionary.h"
     13 #include "chrome/common/chrome_switches.h"
     14 #include "chrome/common/pref_names.h"
     15 #include "ui/base/ui_base_switches.h"
     16 
     17 namespace {
     18 
     19 class TestCommandLinePrefStore : public CommandLinePrefStore {
     20  public:
     21   explicit TestCommandLinePrefStore(CommandLine* cl)
     22       : CommandLinePrefStore(cl) {}
     23 
     24   bool ProxySwitchesAreValid() {
     25     return ValidateProxySwitches();
     26   }
     27 
     28   void VerifyProxyMode(ProxyPrefs::ProxyMode expected_mode) {
     29     const Value* value = NULL;
     30     ASSERT_EQ(PrefStore::READ_OK, GetValue(prefs::kProxy, &value));
     31     ASSERT_EQ(Value::TYPE_DICTIONARY, value->GetType());
     32     ProxyConfigDictionary dict(static_cast<const DictionaryValue*>(value));
     33     ProxyPrefs::ProxyMode actual_mode;
     34     ASSERT_TRUE(dict.GetMode(&actual_mode));
     35     EXPECT_EQ(expected_mode, actual_mode);
     36   }
     37 };
     38 
     39 const char unknown_bool[] = "unknown_switch";
     40 const char unknown_string[] = "unknown_other_switch";
     41 
     42 }  // namespace
     43 
     44 // Tests a simple string pref on the command line.
     45 TEST(CommandLinePrefStoreTest, SimpleStringPref) {
     46   CommandLine cl(CommandLine::NO_PROGRAM);
     47   cl.AppendSwitchASCII(switches::kLang, "hi-MOM");
     48   scoped_refptr<CommandLinePrefStore> store = new CommandLinePrefStore(&cl);
     49 
     50   const Value* actual = NULL;
     51   EXPECT_EQ(PrefStore::READ_OK,
     52             store->GetValue(prefs::kApplicationLocale, &actual));
     53   std::string result;
     54   EXPECT_TRUE(actual->GetAsString(&result));
     55   EXPECT_EQ("hi-MOM", result);
     56 }
     57 
     58 // Tests a simple boolean pref on the command line.
     59 TEST(CommandLinePrefStoreTest, SimpleBooleanPref) {
     60   CommandLine cl(CommandLine::NO_PROGRAM);
     61   cl.AppendSwitch(switches::kNoProxyServer);
     62   scoped_refptr<TestCommandLinePrefStore> store =
     63       new TestCommandLinePrefStore(&cl);
     64 
     65   store->VerifyProxyMode(ProxyPrefs::MODE_DIRECT);
     66 }
     67 
     68 // Tests a command line with no recognized prefs.
     69 TEST(CommandLinePrefStoreTest, NoPrefs) {
     70   CommandLine cl(CommandLine::NO_PROGRAM);
     71   cl.AppendSwitch(unknown_string);
     72   cl.AppendSwitchASCII(unknown_bool, "a value");
     73   scoped_refptr<CommandLinePrefStore> store = new CommandLinePrefStore(&cl);
     74 
     75   const Value* actual = NULL;
     76   EXPECT_EQ(PrefStore::READ_NO_VALUE, store->GetValue(unknown_bool, &actual));
     77   EXPECT_EQ(PrefStore::READ_NO_VALUE, store->GetValue(unknown_string, &actual));
     78 }
     79 
     80 // Tests a complex command line with multiple known and unknown switches.
     81 TEST(CommandLinePrefStoreTest, MultipleSwitches) {
     82   CommandLine cl(CommandLine::NO_PROGRAM);
     83   cl.AppendSwitch(unknown_string);
     84   cl.AppendSwitchASCII(switches::kProxyServer, "proxy");
     85   cl.AppendSwitchASCII(switches::kProxyBypassList, "list");
     86   cl.AppendSwitchASCII(unknown_bool, "a value");
     87   scoped_refptr<TestCommandLinePrefStore> store =
     88       new TestCommandLinePrefStore(&cl);
     89 
     90   const Value* actual = NULL;
     91   EXPECT_EQ(PrefStore::READ_NO_VALUE, store->GetValue(unknown_bool, &actual));
     92   EXPECT_EQ(PrefStore::READ_NO_VALUE, store->GetValue(unknown_string, &actual));
     93 
     94   store->VerifyProxyMode(ProxyPrefs::MODE_FIXED_SERVERS);
     95 
     96   const Value* value = NULL;
     97   ASSERT_EQ(PrefStore::READ_OK, store->GetValue(prefs::kProxy, &value));
     98   ASSERT_EQ(Value::TYPE_DICTIONARY, value->GetType());
     99   ProxyConfigDictionary dict(static_cast<const DictionaryValue*>(value));
    100 
    101   std::string string_result = "";
    102 
    103   ASSERT_TRUE(dict.GetProxyServer(&string_result));
    104   EXPECT_EQ("proxy", string_result);
    105 
    106   ASSERT_TRUE(dict.GetBypassList(&string_result));
    107   EXPECT_EQ("list", string_result);
    108 }
    109 
    110 // Tests proxy switch validation.
    111 TEST(CommandLinePrefStoreTest, ProxySwitchValidation) {
    112   CommandLine cl(CommandLine::NO_PROGRAM);
    113 
    114   // No switches.
    115   scoped_refptr<TestCommandLinePrefStore> store =
    116       new TestCommandLinePrefStore(&cl);
    117   EXPECT_TRUE(store->ProxySwitchesAreValid());
    118 
    119   // Only no-proxy.
    120   cl.AppendSwitch(switches::kNoProxyServer);
    121   scoped_refptr<TestCommandLinePrefStore> store2 =
    122       new TestCommandLinePrefStore(&cl);
    123   EXPECT_TRUE(store2->ProxySwitchesAreValid());
    124 
    125   // Another proxy switch too.
    126   cl.AppendSwitch(switches::kProxyAutoDetect);
    127   scoped_refptr<TestCommandLinePrefStore> store3 =
    128       new TestCommandLinePrefStore(&cl);
    129   EXPECT_FALSE(store3->ProxySwitchesAreValid());
    130 
    131   // All proxy switches except no-proxy.
    132   CommandLine cl2(CommandLine::NO_PROGRAM);
    133   cl2.AppendSwitch(switches::kProxyAutoDetect);
    134   cl2.AppendSwitchASCII(switches::kProxyServer, "server");
    135   cl2.AppendSwitchASCII(switches::kProxyPacUrl, "url");
    136   cl2.AppendSwitchASCII(switches::kProxyBypassList, "list");
    137   scoped_refptr<TestCommandLinePrefStore> store4 =
    138       new TestCommandLinePrefStore(&cl2);
    139   EXPECT_TRUE(store4->ProxySwitchesAreValid());
    140 }
    141 
    142 TEST(CommandLinePrefStoreTest, ManualProxyModeInference) {
    143   CommandLine cl1(CommandLine::NO_PROGRAM);
    144   cl1.AppendSwitch(unknown_string);
    145   cl1.AppendSwitchASCII(switches::kProxyServer, "proxy");
    146   scoped_refptr<TestCommandLinePrefStore> store1 =
    147       new TestCommandLinePrefStore(&cl1);
    148   store1->VerifyProxyMode(ProxyPrefs::MODE_FIXED_SERVERS);
    149 
    150   CommandLine cl2(CommandLine::NO_PROGRAM);
    151   cl2.AppendSwitchASCII(switches::kProxyPacUrl, "proxy");
    152   scoped_refptr<TestCommandLinePrefStore> store2 =
    153         new TestCommandLinePrefStore(&cl2);
    154   store2->VerifyProxyMode(ProxyPrefs::MODE_PAC_SCRIPT);
    155 
    156   CommandLine cl3(CommandLine::NO_PROGRAM);
    157   cl3.AppendSwitchASCII(switches::kProxyServer, "");
    158   scoped_refptr<TestCommandLinePrefStore> store3 =
    159         new TestCommandLinePrefStore(&cl3);
    160   store3->VerifyProxyMode(ProxyPrefs::MODE_DIRECT);
    161 }
    162