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 "chrome/common/importer/firefox_importer_utils.h" 6 7#include "base/file_util.h" 8#include "base/files/scoped_temp_dir.h" 9#include "base/values.h" 10#include "grit/generated_resources.h" 11#include "testing/gtest/include/gtest/gtest.h" 12#include "ui/base/l10n/l10n_util.h" 13 14namespace { 15 16struct GetPrefsJsValueCase { 17 std::string prefs_content; 18 std::string pref_name; 19 std::string pref_value; 20} GetPrefsJsValueCases[] = { 21 // Basic case. Single pref, unquoted value. 22 { "user_pref(\"foo.bar\", 1);", "foo.bar", "1" }, 23 // Value is quoted. Quotes should be stripped. 24 { "user_pref(\"foo.bar\", \"1\");", "foo.bar", "1" }, 25 // Value has parens. 26 { "user_pref(\"foo.bar\", \"Value (detail)\");", 27 "foo.bar", "Value (detail)" }, 28 // Multi-line case. 29 { "user_pref(\"foo.bar\", 1);\n" 30 "user_pref(\"foo.baz\", 2);\n" 31 "user_pref(\"foo.bag\", 3);", 32 "foo.baz", "2" }, 33 // Malformed content. 34 { "user_pref(\"foo.bar\", 1);\n" 35 "user_pref(\"foo.baz\", 2;\n" 36 "user_pref(\"foo.bag\", 3);", 37 "foo.baz", "" }, 38 // Malformed content. 39 { "uesr_pref(\"foo.bar\", 1);", "foo.bar", "" }, 40}; 41 42struct GetFirefoxImporterNameCase { 43 std::string app_ini_content; 44 int resource_id; 45} GetFirefoxImporterNameCases[] = { 46 // Basic case 47 { "[App]\n" 48 "Vendor=Mozilla\n" 49 "Name=iceweasel\n" 50 "Version=10.0.6\n" 51 "BuildID=20120717115048\n" 52 "ID={ec8030f7-c20a-464f-9b0e-13a3a9e97384}", 53 IDS_IMPORT_FROM_ICEWEASEL }, 54 // Whitespace 55 { " \t[App] \n" 56 "Vendor=Mozilla\n" 57 " Name=Firefox\t \r\n" 58 "Version=10.0.6\n", 59 IDS_IMPORT_FROM_FIREFOX }, 60 // No Name setting 61 { "[App]\n" 62 "Vendor=Mozilla\n" 63 "Version=10.0.6\n" 64 "BuildID=20120717115048\n" 65 "ID={ec8030f7-c20a-464f-9b0e-13a3a9e97384}", 66 IDS_IMPORT_FROM_FIREFOX }, 67 // No [App] section 68 { "[Foo]\n" 69 "Vendor=Mozilla\n" 70 "Name=Foo\n", 71 IDS_IMPORT_FROM_FIREFOX }, 72 // Multiple Name settings in different sections 73 { "[Foo]\n" 74 "Vendor=Mozilla\n" 75 "Name=Firefox\n" 76 "[App]\n" 77 "Profile=mozilla/firefox\n" 78 "Name=iceweasel\n" 79 "[Bar]\n" 80 "Name=Bar\n" 81 "ID={ec8030f7-c20a-464f-9b0e-13a3a9e97384}", 82 IDS_IMPORT_FROM_ICEWEASEL }, 83 // Case-insensitivity 84 { "[App]\n" 85 "Vendor=Mozilla\n" 86 "Name=IceWeasel\n" 87 "Version=10.0.6\n", 88 IDS_IMPORT_FROM_ICEWEASEL }, 89 // Empty file 90 { "", IDS_IMPORT_FROM_FIREFOX } 91}; 92 93} // anonymous namespace 94 95TEST(FirefoxImporterUtilsTest, GetPrefsJsValue) { 96 for (size_t i = 0; i < arraysize(GetPrefsJsValueCases); ++i) { 97 EXPECT_EQ( 98 GetPrefsJsValueCases[i].pref_value, 99 GetPrefsJsValue(GetPrefsJsValueCases[i].prefs_content, 100 GetPrefsJsValueCases[i].pref_name)); 101 } 102} 103 104TEST(FirefoxImporterUtilsTest, GetFirefoxImporterName) { 105 base::ScopedTempDir temp_dir; 106 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 107 const base::FilePath app_ini_file( 108 temp_dir.path().AppendASCII("application.ini")); 109 for (size_t i = 0; i < arraysize(GetFirefoxImporterNameCases); ++i) { 110 base::WriteFile(app_ini_file, 111 GetFirefoxImporterNameCases[i].app_ini_content.c_str(), 112 GetFirefoxImporterNameCases[i].app_ini_content.size()); 113 EXPECT_EQ(GetFirefoxImporterName(temp_dir.path()), 114 l10n_util::GetStringUTF16(GetFirefoxImporterNameCases[i].resource_id)); 115 } 116 EXPECT_EQ(l10n_util::GetStringUTF16( 117 IDS_IMPORT_FROM_FIREFOX), 118 GetFirefoxImporterName(base::FilePath( 119 FILE_PATH_LITERAL("/invalid/path")))); 120} 121 122TEST(FirefoxImporterUtilsTest, GetFirefoxProfilePath) { 123 base::DictionaryValue no_profiles; 124 EXPECT_EQ("", 125 GetFirefoxProfilePathFromDictionary(no_profiles).MaybeAsASCII()); 126 127 base::DictionaryValue single_profile; 128 single_profile.SetString("Profile0.Path", "first"); 129 single_profile.SetString("Profile0.IsRelative", "0"); 130 single_profile.SetString("Profile0.Default", "1"); 131 EXPECT_EQ("first", 132 GetFirefoxProfilePathFromDictionary(single_profile).MaybeAsASCII()); 133 134 base::DictionaryValue no_default; 135 no_default.SetString("Profile0.Path", "first"); 136 no_default.SetString("Profile0.IsRelative", "0"); 137 no_default.SetString("Profile1.Path", "second"); 138 no_default.SetString("Profile1.IsRelative", "0"); 139 EXPECT_EQ("first", 140 GetFirefoxProfilePathFromDictionary(no_default).MaybeAsASCII()); 141 142 base::DictionaryValue default_first; 143 default_first.SetString("Profile0.Path", "first"); 144 default_first.SetString("Profile0.IsRelative", "0"); 145 default_first.SetString("Profile0.Default", "1"); 146 default_first.SetString("Profile1.Path", "second"); 147 default_first.SetString("Profile1.IsRelative", "0"); 148 EXPECT_EQ("first", 149 GetFirefoxProfilePathFromDictionary(default_first).MaybeAsASCII()); 150 151 base::DictionaryValue default_second; 152 default_second.SetString("Profile0.Path", "first"); 153 default_second.SetString("Profile0.IsRelative", "0"); 154 default_second.SetString("Profile1.Path", "second"); 155 default_second.SetString("Profile1.IsRelative", "0"); 156 default_second.SetString("Profile1.Default", "1"); 157 EXPECT_EQ("second", 158 GetFirefoxProfilePathFromDictionary(default_second).MaybeAsASCII()); 159} 160