Home | History | Annotate | Download | only in util
      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 // Unit tests for master preferences related methods.
      6 
      7 #include "base/files/file_util.h"
      8 #include "base/memory/scoped_ptr.h"
      9 #include "base/path_service.h"
     10 #include "base/strings/stringprintf.h"
     11 #include "base/values.h"
     12 #include "chrome/common/chrome_paths.h"
     13 #include "chrome/common/pref_names.h"
     14 #include "chrome/installer/util/master_preferences.h"
     15 #include "chrome/installer/util/master_preferences_constants.h"
     16 #include "chrome/installer/util/util_constants.h"
     17 #include "testing/gtest/include/gtest/gtest.h"
     18 
     19 namespace {
     20 class MasterPreferencesTest : public testing::Test {
     21  protected:
     22   virtual void SetUp() {
     23     ASSERT_TRUE(base::CreateTemporaryFile(&prefs_file_));
     24   }
     25 
     26   virtual void TearDown() {
     27     EXPECT_TRUE(base::DeleteFile(prefs_file_, false));
     28   }
     29 
     30   const base::FilePath& prefs_file() const { return prefs_file_; }
     31 
     32  private:
     33   base::FilePath prefs_file_;
     34 };
     35 
     36 // Used to specify an expected value for a set boolean preference variable.
     37 struct ExpectedBooleans {
     38   const char* name;
     39   bool expected_value;
     40 };
     41 
     42 }  // namespace
     43 
     44 TEST_F(MasterPreferencesTest, NoFileToParse) {
     45   EXPECT_TRUE(base::DeleteFile(prefs_file(), false));
     46   installer::MasterPreferences prefs(prefs_file());
     47   EXPECT_FALSE(prefs.read_from_file());
     48 }
     49 
     50 TEST_F(MasterPreferencesTest, ParseDistroParams) {
     51   const char text[] =
     52     "{ \n"
     53     "  \"distribution\": { \n"
     54     "     \"show_welcome_page\": true,\n"
     55     "     \"import_search_engine\": true,\n"
     56     "     \"import_history\": true,\n"
     57     "     \"import_bookmarks\": true,\n"
     58     "     \"import_bookmarks_from_file\": \"c:\\\\foo\",\n"
     59     "     \"import_home_page\": true,\n"
     60     "     \"do_not_create_any_shortcuts\": true,\n"
     61     "     \"do_not_create_desktop_shortcut\": true,\n"
     62     "     \"do_not_create_quick_launch_shortcut\": true,\n"
     63     "     \"do_not_create_taskbar_shortcut\": true,\n"
     64     "     \"do_not_launch_chrome\": true,\n"
     65     "     \"make_chrome_default\": true,\n"
     66     "     \"make_chrome_default_for_user\": true,\n"
     67     "     \"system_level\": true,\n"
     68     "     \"verbose_logging\": true,\n"
     69     "     \"require_eula\": true,\n"
     70     "     \"alternate_shortcut_text\": true,\n"
     71     "     \"chrome_shortcut_icon_index\": 1,\n"
     72     "     \"ping_delay\": 40\n"
     73     "  },\n"
     74     "  \"blah\": {\n"
     75     "     \"import_history\": false\n"
     76     "  }\n"
     77     "} \n";
     78 
     79   EXPECT_TRUE(base::WriteFile(prefs_file(), text, strlen(text)));
     80   installer::MasterPreferences prefs(prefs_file());
     81   EXPECT_TRUE(prefs.read_from_file());
     82 
     83   const char* expected_true[] = {
     84     installer::master_preferences::kDistroImportSearchPref,
     85     installer::master_preferences::kDistroImportHistoryPref,
     86     installer::master_preferences::kDistroImportBookmarksPref,
     87     installer::master_preferences::kDistroImportHomePagePref,
     88     installer::master_preferences::kDoNotCreateAnyShortcuts,
     89     installer::master_preferences::kDoNotCreateDesktopShortcut,
     90     installer::master_preferences::kDoNotCreateQuickLaunchShortcut,
     91     installer::master_preferences::kDoNotCreateTaskbarShortcut,
     92     installer::master_preferences::kDoNotLaunchChrome,
     93     installer::master_preferences::kMakeChromeDefault,
     94     installer::master_preferences::kMakeChromeDefaultForUser,
     95     installer::master_preferences::kSystemLevel,
     96     installer::master_preferences::kVerboseLogging,
     97     installer::master_preferences::kRequireEula,
     98     installer::master_preferences::kAltShortcutText,
     99   };
    100 
    101   for (int i = 0; i < arraysize(expected_true); ++i) {
    102     bool value = false;
    103     EXPECT_TRUE(prefs.GetBool(expected_true[i], &value));
    104     EXPECT_TRUE(value) << expected_true[i];
    105   }
    106 
    107   std::string str_value;
    108   EXPECT_TRUE(prefs.GetString(
    109       installer::master_preferences::kDistroImportBookmarksFromFilePref,
    110       &str_value));
    111   EXPECT_STREQ("c:\\foo", str_value.c_str());
    112 
    113   int icon_index = 0;
    114   EXPECT_TRUE(prefs.GetInt(
    115       installer::master_preferences::kChromeShortcutIconIndex,
    116       &icon_index));
    117   EXPECT_EQ(icon_index, 1);
    118   int ping_delay = 90;
    119   EXPECT_TRUE(prefs.GetInt(installer::master_preferences::kDistroPingDelay,
    120                            &ping_delay));
    121   EXPECT_EQ(ping_delay, 40);
    122 }
    123 
    124 TEST_F(MasterPreferencesTest, ParseMissingDistroParams) {
    125   const char text[] =
    126     "{ \n"
    127     "  \"distribution\": { \n"
    128     "     \"import_search_engine\": true,\n"
    129     "     \"import_bookmarks\": false,\n"
    130     "     \"import_bookmarks_from_file\": \"\",\n"
    131     "     \"do_not_create_desktop_shortcut\": true,\n"
    132     "     \"do_not_create_quick_launch_shortcut\": true,\n"
    133     "     \"do_not_launch_chrome\": true,\n"
    134     "     \"chrome_shortcut_icon_index\": \"bac\"\n"
    135     "  }\n"
    136     "} \n";
    137 
    138   EXPECT_TRUE(base::WriteFile(prefs_file(), text, strlen(text)));
    139   installer::MasterPreferences prefs(prefs_file());
    140   EXPECT_TRUE(prefs.read_from_file());
    141 
    142   ExpectedBooleans expected_bool[] = {
    143     { installer::master_preferences::kDistroImportSearchPref, true },
    144     { installer::master_preferences::kDistroImportBookmarksPref, false },
    145     { installer::master_preferences::kDoNotCreateDesktopShortcut, true },
    146     { installer::master_preferences::kDoNotCreateQuickLaunchShortcut, true },
    147     { installer::master_preferences::kDoNotLaunchChrome, true },
    148   };
    149 
    150   bool value = false;
    151   for (int i = 0; i < arraysize(expected_bool); ++i) {
    152     EXPECT_TRUE(prefs.GetBool(expected_bool[i].name, &value));
    153     EXPECT_EQ(value, expected_bool[i].expected_value) << expected_bool[i].name;
    154   }
    155 
    156   const char* missing_bools[] = {
    157     installer::master_preferences::kDistroImportHomePagePref,
    158     installer::master_preferences::kDoNotRegisterForUpdateLaunch,
    159     installer::master_preferences::kMakeChromeDefault,
    160     installer::master_preferences::kMakeChromeDefaultForUser,
    161   };
    162 
    163   for (int i = 0; i < arraysize(missing_bools); ++i) {
    164     EXPECT_FALSE(prefs.GetBool(missing_bools[i], &value)) << missing_bools[i];
    165   }
    166 
    167   std::string str_value;
    168   EXPECT_FALSE(prefs.GetString(
    169       installer::master_preferences::kDistroImportBookmarksFromFilePref,
    170       &str_value));
    171 
    172   int icon_index = 0;
    173   EXPECT_FALSE(prefs.GetInt(
    174       installer::master_preferences::kChromeShortcutIconIndex,
    175       &icon_index));
    176   EXPECT_EQ(icon_index, 0);
    177 
    178   int ping_delay = 90;
    179   EXPECT_FALSE(prefs.GetInt(
    180       installer::master_preferences::kDistroPingDelay, &ping_delay));
    181   EXPECT_EQ(ping_delay, 90);
    182 }
    183 
    184 TEST_F(MasterPreferencesTest, FirstRunTabs) {
    185   const char text[] =
    186     "{ \n"
    187     "  \"distribution\": { \n"
    188     "     \"something here\": true\n"
    189     "  },\n"
    190     "  \"first_run_tabs\": [\n"
    191     "     \"http://google.com/f1\",\n"
    192     "     \"https://google.com/f2\",\n"
    193     "     \"new_tab_page\"\n"
    194     "  ]\n"
    195     "} \n";
    196 
    197   EXPECT_TRUE(base::WriteFile(prefs_file(), text, strlen(text)));
    198   installer::MasterPreferences prefs(prefs_file());
    199   typedef std::vector<std::string> TabsVector;
    200   TabsVector tabs = prefs.GetFirstRunTabs();
    201   ASSERT_EQ(3, tabs.size());
    202   EXPECT_EQ("http://google.com/f1", tabs[0]);
    203   EXPECT_EQ("https://google.com/f2", tabs[1]);
    204   EXPECT_EQ("new_tab_page", tabs[2]);
    205 }
    206 
    207 // In this test instead of using our synthetic json file, we use an
    208 // actual test case from the extensions unittest. The hope here is that if
    209 // they change something in the manifest this test will break, but in
    210 // general it is expected the extension format to be backwards compatible.
    211 TEST(MasterPrefsExtension, ValidateExtensionJSON) {
    212   base::FilePath prefs_path;
    213   ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &prefs_path));
    214   prefs_path = prefs_path.AppendASCII("extensions")
    215       .AppendASCII("good").AppendASCII("Preferences");
    216 
    217   installer::MasterPreferences prefs(prefs_path);
    218   base::DictionaryValue* extensions = NULL;
    219   EXPECT_TRUE(prefs.GetExtensionsBlock(&extensions));
    220   int location = 0;
    221   EXPECT_TRUE(extensions->GetInteger(
    222       "behllobkkfkfnphdnhnkndlbkcpglgmj.location", &location));
    223   int state = 0;
    224   EXPECT_TRUE(extensions->GetInteger(
    225       "behllobkkfkfnphdnhnkndlbkcpglgmj.state", &state));
    226   std::string path;
    227   EXPECT_TRUE(extensions->GetString(
    228       "behllobkkfkfnphdnhnkndlbkcpglgmj.path", &path));
    229   std::string key;
    230   EXPECT_TRUE(extensions->GetString(
    231       "behllobkkfkfnphdnhnkndlbkcpglgmj.manifest.key", &key));
    232   std::string name;
    233   EXPECT_TRUE(extensions->GetString(
    234       "behllobkkfkfnphdnhnkndlbkcpglgmj.manifest.name", &name));
    235   std::string version;
    236   EXPECT_TRUE(extensions->GetString(
    237       "behllobkkfkfnphdnhnkndlbkcpglgmj.manifest.version", &version));
    238 }
    239 
    240 // Test that we are parsing master preferences correctly.
    241 TEST_F(MasterPreferencesTest, GetInstallPreferencesTest) {
    242   // Create a temporary prefs file.
    243   base::FilePath prefs_file;
    244   ASSERT_TRUE(base::CreateTemporaryFile(&prefs_file));
    245   const char text[] =
    246     "{ \n"
    247     "  \"distribution\": { \n"
    248     "     \"do_not_create_desktop_shortcut\": false,\n"
    249     "     \"do_not_create_quick_launch_shortcut\": false,\n"
    250     "     \"do_not_launch_chrome\": true,\n"
    251     "     \"system_level\": true,\n"
    252     "     \"verbose_logging\": false\n"
    253     "  }\n"
    254     "} \n";
    255   EXPECT_TRUE(base::WriteFile(prefs_file, text, strlen(text)));
    256 
    257   // Make sure command line values override the values in master preferences.
    258   std::wstring cmd_str(
    259       L"setup.exe --installerdata=\"" + prefs_file.value() + L"\"");
    260   cmd_str.append(L" --do-not-launch-chrome");
    261   CommandLine cmd_line = CommandLine::FromString(cmd_str);
    262   installer::MasterPreferences prefs(cmd_line);
    263 
    264   // Check prefs that do not have any equivalent command line option.
    265   ExpectedBooleans expected_bool[] = {
    266     { installer::master_preferences::kDoNotLaunchChrome, true },
    267     { installer::master_preferences::kSystemLevel, true },
    268     { installer::master_preferences::kVerboseLogging, false },
    269   };
    270 
    271   // Now check that prefs got merged correctly.
    272   bool value = false;
    273   for (int i = 0; i < arraysize(expected_bool); ++i) {
    274     EXPECT_TRUE(prefs.GetBool(expected_bool[i].name, &value));
    275     EXPECT_EQ(value, expected_bool[i].expected_value) << expected_bool[i].name;
    276   }
    277 
    278   // Delete temporary prefs file.
    279   EXPECT_TRUE(base::DeleteFile(prefs_file, false));
    280 
    281   // Check that if master prefs doesn't exist, we can still parse the common
    282   // prefs.
    283   cmd_str = L"setup.exe --do-not-launch-chrome";
    284   cmd_line.ParseFromString(cmd_str);
    285   installer::MasterPreferences prefs2(cmd_line);
    286   ExpectedBooleans expected_bool2[] = {
    287     { installer::master_preferences::kDoNotLaunchChrome, true },
    288   };
    289 
    290   for (int i = 0; i < arraysize(expected_bool2); ++i) {
    291     EXPECT_TRUE(prefs2.GetBool(expected_bool2[i].name, &value));
    292     EXPECT_EQ(value, expected_bool2[i].expected_value)
    293         << expected_bool2[i].name;
    294   }
    295 
    296   EXPECT_FALSE(prefs2.GetBool(
    297       installer::master_preferences::kSystemLevel, &value));
    298   EXPECT_FALSE(prefs2.GetBool(
    299       installer::master_preferences::kVerboseLogging, &value));
    300 }
    301 
    302 TEST_F(MasterPreferencesTest, TestDefaultInstallConfig) {
    303   std::wstringstream chrome_cmd;
    304   chrome_cmd << "setup.exe";
    305 
    306   CommandLine chrome_install(CommandLine::FromString(chrome_cmd.str()));
    307 
    308   installer::MasterPreferences pref_chrome(chrome_install);
    309 
    310   EXPECT_FALSE(pref_chrome.is_multi_install());
    311   EXPECT_TRUE(pref_chrome.install_chrome());
    312 }
    313 
    314 TEST_F(MasterPreferencesTest, TestMultiInstallConfig) {
    315   using installer::switches::kMultiInstall;
    316   using installer::switches::kChrome;
    317 
    318   std::wstringstream chrome_cmd, cf_cmd, chrome_cf_cmd;
    319   chrome_cmd << "setup.exe --" << kMultiInstall << " --" << kChrome;
    320 
    321   CommandLine chrome_install(CommandLine::FromString(chrome_cmd.str()));
    322 
    323   installer::MasterPreferences pref_chrome(chrome_install);
    324 
    325   EXPECT_TRUE(pref_chrome.is_multi_install());
    326   EXPECT_TRUE(pref_chrome.install_chrome());
    327 }
    328 
    329 TEST_F(MasterPreferencesTest, EnforceLegacyCreateAllShortcutsFalse) {
    330   static const char kCreateAllShortcutsFalsePrefs[] =
    331       "{"
    332       "  \"distribution\": {"
    333       "     \"create_all_shortcuts\": false"
    334       "  }"
    335       "}";
    336 
    337     installer::MasterPreferences prefs(kCreateAllShortcutsFalsePrefs);
    338 
    339     bool do_not_create_desktop_shortcut = false;
    340     bool do_not_create_quick_launch_shortcut = false;
    341     bool do_not_create_taskbar_shortcut = false;
    342     prefs.GetBool(
    343         installer::master_preferences::kDoNotCreateDesktopShortcut,
    344         &do_not_create_desktop_shortcut);
    345     prefs.GetBool(
    346         installer::master_preferences::kDoNotCreateQuickLaunchShortcut,
    347         &do_not_create_quick_launch_shortcut);
    348     prefs.GetBool(
    349         installer::master_preferences::kDoNotCreateTaskbarShortcut,
    350         &do_not_create_taskbar_shortcut);
    351     // create_all_shortcuts is a legacy preference that should only enforce
    352     // do_not_create_desktop_shortcut and do_not_create_quick_launch_shortcut
    353     // when set to false.
    354     EXPECT_TRUE(do_not_create_desktop_shortcut);
    355     EXPECT_TRUE(do_not_create_quick_launch_shortcut);
    356     EXPECT_FALSE(do_not_create_taskbar_shortcut);
    357 }
    358 
    359 TEST_F(MasterPreferencesTest, DontEnforceLegacyCreateAllShortcutsTrue) {
    360   static const char kCreateAllShortcutsFalsePrefs[] =
    361       "{"
    362       "  \"distribution\": {"
    363       "     \"create_all_shortcuts\": true"
    364       "  }"
    365       "}";
    366 
    367     installer::MasterPreferences prefs(kCreateAllShortcutsFalsePrefs);
    368 
    369     bool do_not_create_desktop_shortcut = false;
    370     bool do_not_create_quick_launch_shortcut = false;
    371     bool do_not_create_taskbar_shortcut = false;
    372     prefs.GetBool(
    373         installer::master_preferences::kDoNotCreateDesktopShortcut,
    374         &do_not_create_desktop_shortcut);
    375     prefs.GetBool(
    376         installer::master_preferences::kDoNotCreateQuickLaunchShortcut,
    377         &do_not_create_quick_launch_shortcut);
    378     prefs.GetBool(
    379         installer::master_preferences::kDoNotCreateTaskbarShortcut,
    380         &do_not_create_taskbar_shortcut);
    381     EXPECT_FALSE(do_not_create_desktop_shortcut);
    382     EXPECT_FALSE(do_not_create_quick_launch_shortcut);
    383     EXPECT_FALSE(do_not_create_taskbar_shortcut);
    384 }
    385 
    386 TEST_F(MasterPreferencesTest, DontEnforceLegacyCreateAllShortcutsNotSpecified) {
    387   static const char kCreateAllShortcutsFalsePrefs[] =
    388       "{"
    389       "  \"distribution\": {"
    390       "     \"some_other_pref\": true"
    391       "  }"
    392       "}";
    393 
    394     installer::MasterPreferences prefs(kCreateAllShortcutsFalsePrefs);
    395 
    396     bool do_not_create_desktop_shortcut = false;
    397     bool do_not_create_quick_launch_shortcut = false;
    398     bool do_not_create_taskbar_shortcut = false;
    399     prefs.GetBool(
    400         installer::master_preferences::kDoNotCreateDesktopShortcut,
    401         &do_not_create_desktop_shortcut);
    402     prefs.GetBool(
    403         installer::master_preferences::kDoNotCreateQuickLaunchShortcut,
    404         &do_not_create_quick_launch_shortcut);
    405     prefs.GetBool(
    406         installer::master_preferences::kDoNotCreateTaskbarShortcut,
    407         &do_not_create_taskbar_shortcut);
    408     EXPECT_FALSE(do_not_create_desktop_shortcut);
    409     EXPECT_FALSE(do_not_create_quick_launch_shortcut);
    410     EXPECT_FALSE(do_not_create_taskbar_shortcut);
    411 }
    412 
    413 TEST_F(MasterPreferencesTest, MigrateOldStartupUrlsPref) {
    414   static const char kOldMasterPrefs[] =
    415       "{ \n"
    416       "  \"distribution\": { \n"
    417       "     \"show_welcome_page\": true,\n"
    418       "     \"import_search_engine\": true,\n"
    419       "     \"import_history\": true,\n"
    420       "     \"import_bookmarks\": true\n"
    421       "  },\n"
    422       "  \"session\": {\n"
    423       "     \"urls_to_restore_on_startup\": [\"http://www.google.com\"]\n"
    424       "  }\n"
    425       "} \n";
    426 
    427   const installer::MasterPreferences prefs(kOldMasterPrefs);
    428   const base::DictionaryValue& master_dictionary =
    429       prefs.master_dictionary();
    430 
    431   const base::ListValue* old_startup_urls_list = NULL;
    432   EXPECT_TRUE(master_dictionary.GetList(prefs::kURLsToRestoreOnStartupOld,
    433                                         &old_startup_urls_list));
    434   EXPECT_TRUE(old_startup_urls_list != NULL);
    435 
    436   // The MasterPreferences dictionary should also conjure up the new setting
    437   // as per EnforceLegacyPreferences.
    438   const base::ListValue* new_startup_urls_list = NULL;
    439   EXPECT_TRUE(master_dictionary.GetList(prefs::kURLsToRestoreOnStartup,
    440                                         &new_startup_urls_list));
    441   EXPECT_TRUE(new_startup_urls_list != NULL);
    442 }
    443 
    444 TEST_F(MasterPreferencesTest, DontMigrateOldStartupUrlsPrefWhenNewExists) {
    445   static const char kOldAndNewMasterPrefs[] =
    446       "{ \n"
    447       "  \"distribution\": { \n"
    448       "     \"show_welcome_page\": true,\n"
    449       "     \"import_search_engine\": true,\n"
    450       "     \"import_history\": true,\n"
    451       "     \"import_bookmarks\": true\n"
    452       "  },\n"
    453       "  \"session\": {\n"
    454       "     \"urls_to_restore_on_startup\": [\"http://www.google.com\"],\n"
    455       "     \"startup_urls\": [\"http://www.example.com\"]\n"
    456       "  }\n"
    457       "} \n";
    458 
    459   const installer::MasterPreferences prefs(kOldAndNewMasterPrefs);
    460   const base::DictionaryValue& master_dictionary =
    461       prefs.master_dictionary();
    462 
    463   const base::ListValue* old_startup_urls_list = NULL;
    464   EXPECT_TRUE(master_dictionary.GetList(prefs::kURLsToRestoreOnStartupOld,
    465                                         &old_startup_urls_list));
    466   ASSERT_TRUE(old_startup_urls_list != NULL);
    467   std::string url_value;
    468   EXPECT_TRUE(old_startup_urls_list->GetString(0, &url_value));
    469   EXPECT_EQ("http://www.google.com", url_value);
    470 
    471   // The MasterPreferences dictionary should also conjure up the new setting
    472   // as per EnforceLegacyPreferences.
    473   const base::ListValue* new_startup_urls_list = NULL;
    474   EXPECT_TRUE(master_dictionary.GetList(prefs::kURLsToRestoreOnStartup,
    475                                         &new_startup_urls_list));
    476   ASSERT_TRUE(new_startup_urls_list != NULL);
    477   std::string new_url_value;
    478   EXPECT_TRUE(new_startup_urls_list->GetString(0, &new_url_value));
    479   EXPECT_EQ("http://www.example.com", new_url_value);
    480 }
    481