Chromium Code Reviews| Index: chrome/installer/util/shell_util_unittest.cc |
| diff --git a/chrome/installer/util/shell_util_unittest.cc b/chrome/installer/util/shell_util_unittest.cc |
| index 1d51b3ca731b15b90ee32684c57902e07999c15e..77dd6c3b49462c37ae4c8c25f43a3d86a4f67bde 100644 |
| --- a/chrome/installer/util/shell_util_unittest.cc |
| +++ b/chrome/installer/util/shell_util_unittest.cc |
| @@ -27,6 +27,8 @@ |
| namespace { |
| const wchar_t kManganeseExe[] = L"manganese.exe"; |
| +const wchar_t kIronExe[] = L"iron.exe"; |
| +const wchar_t kOtherIco[] = L"other.ico"; |
| // TODO(huangs): Separate this into generic shortcut tests and Chrome-specific |
| // tests. Specifically, we should not overly rely on getting shortcut properties |
| @@ -47,6 +49,12 @@ class ShellUtilShortcutTest : public testing::Test { |
| manganese_exe_ = temp_dir_.path().Append(kManganeseExe); |
| EXPECT_EQ(0, file_util::WriteFile(manganese_exe_, "", 0)); |
| + iron_exe_ = temp_dir_.path().Append(kIronExe); |
| + EXPECT_EQ(0, file_util::WriteFile(iron_exe_, "", 0)); |
| + |
| + other_ico_ = temp_dir_.path().Append(kOtherIco); |
| + EXPECT_EQ(0, file_util::WriteFile(other_ico_, "", 0)); |
| + |
| ASSERT_TRUE(fake_user_desktop_.CreateUniqueTempDir()); |
| ASSERT_TRUE(fake_common_desktop_.CreateUniqueTempDir()); |
| ASSERT_TRUE(fake_user_quick_launch_.CreateUniqueTempDir()); |
| @@ -77,16 +85,14 @@ class ShellUtilShortcutTest : public testing::Test { |
| test_properties_.set_target(chrome_exe_); |
| test_properties_.set_arguments(L"--test --chrome"); |
| test_properties_.set_description(L"Makes polar bears dance."); |
| - test_properties_.set_icon(icon_path, 0); |
| + test_properties_.set_icon(icon_path, 7); |
| test_properties_.set_app_id(L"Polar.Bear"); |
| test_properties_.set_dual_mode(true); |
| } |
| - // Validates that the shortcut at |location| matches |properties| (and |
| - // implicit default properties) for |dist|. |
| - // Note: This method doesn't verify the |pin_to_taskbar| property as it |
| - // implies real (non-mocked) state which is flaky to test. |
| - void ValidateChromeShortcut( |
| + // Returns the expected path of a test shortcut. Returns an empty FilePath on |
| + // failure. |
| + base::FilePath GetExpectedShortcutPath( |
| ShellUtil::ShortcutLocation location, |
| BrowserDistribution* dist, |
| const ShellUtil::ShortcutProperties& properties) { |
| @@ -110,18 +116,26 @@ class ShellUtilShortcutTest : public testing::Test { |
| break; |
| default: |
| ADD_FAILURE() << "Unknown location"; |
| - return; |
| + return base::FilePath(); |
| } |
| - string16 shortcut_name; |
| - if (properties.has_shortcut_name()) { |
| - shortcut_name = properties.shortcut_name; |
| - } else { |
| - shortcut_name = |
| - dist_->GetShortcutName(BrowserDistribution::SHORTCUT_CHROME); |
| - } |
| + string16 shortcut_name = properties.has_shortcut_name() ? |
| + properties.shortcut_name : |
| + dist_->GetShortcutName(BrowserDistribution::SHORTCUT_CHROME); |
| shortcut_name.append(installer::kLnkExt); |
| - expected_path = expected_path.Append(shortcut_name); |
| + return expected_path.Append(shortcut_name); |
| + } |
| + |
| + // Validates that the shortcut at |location| matches |properties| (and |
| + // implicit default properties) for |dist|. |
| + // Note: This method doesn't verify the |pin_to_taskbar| property as it |
| + // implies real (non-mocked) state which is flaky to test. |
| + void ValidateChromeShortcut( |
| + ShellUtil::ShortcutLocation location, |
| + BrowserDistribution* dist, |
| + const ShellUtil::ShortcutProperties& properties) { |
| + base::FilePath expected_path( |
| + GetExpectedShortcutPath(location, dist, properties)); |
| base::win::ShortcutProperties expected_properties; |
| if (properties.has_target()) { |
| @@ -143,7 +157,7 @@ class ShellUtilShortcutTest : public testing::Test { |
| expected_properties.set_description(dist->GetAppDescription()); |
| if (properties.has_icon()) { |
| - expected_properties.set_icon(properties.icon, 0); |
| + expected_properties.set_icon(properties.icon, properties.icon_index); |
| } else { |
| int icon_index = dist->GetIconIndex(BrowserDistribution::SHORTCUT_CHROME); |
| expected_properties.set_icon(chrome_exe_, icon_index); |
| @@ -186,6 +200,8 @@ class ShellUtilShortcutTest : public testing::Test { |
| base::FilePath chrome_exe_; |
| base::FilePath manganese_exe_; |
| + base::FilePath iron_exe_; |
| + base::FilePath other_ico_; |
| }; |
| } // namespace |
| @@ -368,11 +384,8 @@ TEST_F(ShellUtilShortcutTest, RemoveChromeShortcut) { |
| ASSERT_TRUE(ShellUtil::CreateOrUpdateShortcut( |
| ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, test_properties_, |
| ShellUtil::SHELL_SHORTCUT_CREATE_ALWAYS)); |
| - |
| - string16 shortcut_name( |
| - dist_->GetShortcutName(BrowserDistribution::SHORTCUT_CHROME) + |
| - installer::kLnkExt); |
| - base::FilePath shortcut_path(fake_user_desktop_.path().Append(shortcut_name)); |
| + base::FilePath shortcut_path = GetExpectedShortcutPath( |
| + ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, test_properties_); |
| ASSERT_TRUE(base::PathExists(shortcut_path)); |
| ASSERT_TRUE(ShellUtil::RemoveShortcuts( |
| @@ -387,12 +400,8 @@ TEST_F(ShellUtilShortcutTest, RemoveSystemLevelChromeShortcut) { |
| ASSERT_TRUE(ShellUtil::CreateOrUpdateShortcut( |
| ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, test_properties_, |
| ShellUtil::SHELL_SHORTCUT_CREATE_ALWAYS)); |
| - |
| - string16 shortcut_name( |
| - dist_->GetShortcutName(BrowserDistribution::SHORTCUT_CHROME) + |
| - installer::kLnkExt); |
| - base::FilePath shortcut_path( |
| - fake_common_desktop_.path().Append(shortcut_name)); |
| + base::FilePath shortcut_path = GetExpectedShortcutPath( |
| + ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, test_properties_); |
| ASSERT_TRUE(base::PathExists(shortcut_path)); |
| ASSERT_TRUE(ShellUtil::RemoveShortcuts( |
| @@ -403,55 +412,60 @@ TEST_F(ShellUtilShortcutTest, RemoveSystemLevelChromeShortcut) { |
| } |
| TEST_F(ShellUtilShortcutTest, RemoveMultipleChromeShortcuts) { |
| - const wchar_t kShortcutName1[] = L"Chrome 1"; |
| - const wchar_t kShortcutName2[] = L"Chrome 2"; |
| - |
| - test_properties_.set_shortcut_name(kShortcutName1); |
| + // Shortcut 1: targets "chrome.exe"; no arguments. |
| + test_properties_.set_shortcut_name(L"Chrome 1"); |
| + test_properties_.set_arguments(L""); |
| ASSERT_TRUE(ShellUtil::CreateOrUpdateShortcut( |
| ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, test_properties_, |
| ShellUtil::SHELL_SHORTCUT_CREATE_ALWAYS)); |
| - string16 shortcut1_name( |
| - string16(kShortcutName1).append(installer::kLnkExt)); |
| - base::FilePath shortcut1_path( |
| - fake_user_desktop_.path().Append(shortcut1_name)); |
| + base::FilePath shortcut1_path = GetExpectedShortcutPath( |
| + ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, test_properties_); |
| ASSERT_TRUE(base::PathExists(shortcut1_path)); |
| - test_properties_.set_shortcut_name(kShortcutName2); |
| + // Shortcut 2: targets "chrome.exe"; has arguments; icon set to "other.ico". |
| + test_properties_.set_shortcut_name(L"Chrome 2"); |
| test_properties_.set_arguments(L"--profile-directory=\"Profile 2\""); |
| + test_properties_.set_icon(other_ico_, 0); |
| ASSERT_TRUE(ShellUtil::CreateOrUpdateShortcut( |
| ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, test_properties_, |
| ShellUtil::SHELL_SHORTCUT_CREATE_ALWAYS)); |
| - string16 shortcut2_name(string16(kShortcutName2).append(installer::kLnkExt)); |
| - base::FilePath shortcut2_path( |
| - fake_user_desktop_.path().Append(shortcut2_name)); |
| + base::FilePath shortcut2_path = GetExpectedShortcutPath( |
| + ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, test_properties_); |
| ASSERT_TRUE(base::PathExists(shortcut2_path)); |
| + // Shortcut 3: targets "iron.exe"; has arguments; icon set to "chrome.exe". |
| + test_properties_.set_shortcut_name(L"Iron 3"); |
| + test_properties_.set_target(iron_exe_); |
| + test_properties_.set_icon(chrome_exe_, 3); |
| + ASSERT_TRUE(ShellUtil::CreateOrUpdateShortcut( |
| + ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, test_properties_, |
| + ShellUtil::SHELL_SHORTCUT_CREATE_ALWAYS)); |
| + base::FilePath shortcut3_path = GetExpectedShortcutPath( |
| + ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, test_properties_); |
| + ASSERT_TRUE(base::PathExists(shortcut3_path)); |
| + |
| + // Remove shortcuts that target "chrome.exe". |
| ASSERT_TRUE(ShellUtil::RemoveShortcuts( |
| ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, ShellUtil::CURRENT_USER, |
| chrome_exe_)); |
| ASSERT_FALSE(base::PathExists(shortcut1_path)); |
| ASSERT_FALSE(base::PathExists(shortcut2_path)); |
| + ASSERT_TRUE(base::PathExists(shortcut3_path)); |
| ASSERT_TRUE(base::PathExists(shortcut1_path.DirName())); |
| } |
| -TEST_F(ShellUtilShortcutTest, UpdateChromeShortcutsWithArgs) { |
| +TEST_F(ShellUtilShortcutTest, RetargetShortcutsWithArgs) { |
| ASSERT_TRUE(ShellUtil::CreateOrUpdateShortcut( |
| ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, test_properties_, |
| ShellUtil::SHELL_SHORTCUT_CREATE_ALWAYS)); |
| + ASSERT_TRUE(base::PathExists(GetExpectedShortcutPath( |
| + ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, test_properties_))); |
| - string16 shortcut_name( |
| - dist_->GetShortcutName(BrowserDistribution::SHORTCUT_CHROME) + |
| - installer::kLnkExt); |
| - base::FilePath shortcut_path(fake_user_desktop_.path().Append(shortcut_name)); |
| - ASSERT_TRUE(base::PathExists(shortcut_path)); |
| - |
| - base::FilePath new_exe = temp_dir_.path().Append(kManganeseExe); |
| - ShellUtil::ShortcutProperties updated_properties(ShellUtil::CURRENT_USER); |
| - updated_properties.set_target(new_exe); |
| - // |updated_properties| has arguments. |
| - ASSERT_TRUE(ShellUtil::UpdateShortcutsWithArgs( |
| + base::FilePath new_exe = manganese_exe_; |
| + // Relies on the fact that |test_properties_| has non-empty arguments. |
| + ASSERT_TRUE(ShellUtil::RetargetShortcutsWithArgs( |
| ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, ShellUtil::CURRENT_USER, |
| - chrome_exe_, updated_properties)); |
| + chrome_exe_, new_exe)); |
| ShellUtil::ShortcutProperties expected_properties(test_properties_); |
| expected_properties.set_target(new_exe); |
| @@ -459,26 +473,19 @@ TEST_F(ShellUtilShortcutTest, UpdateChromeShortcutsWithArgs) { |
| expected_properties); |
| } |
| -TEST_F(ShellUtilShortcutTest, UpdateSystemLevelChromeShortcutsWithArgs) { |
| +TEST_F(ShellUtilShortcutTest, RetargetSystemLevelChromeShortcutsWithArgs) { |
| test_properties_.level = ShellUtil::SYSTEM_LEVEL; |
| ASSERT_TRUE(ShellUtil::CreateOrUpdateShortcut( |
| ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, test_properties_, |
| ShellUtil::SHELL_SHORTCUT_CREATE_ALWAYS)); |
| + ASSERT_TRUE(base::PathExists(GetExpectedShortcutPath( |
| + ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, test_properties_))); |
| - string16 shortcut_name( |
| - dist_->GetShortcutName(BrowserDistribution::SHORTCUT_CHROME) + |
| - installer::kLnkExt); |
| - base::FilePath shortcut_path( |
| - fake_common_desktop_.path().Append(shortcut_name)); |
| - ASSERT_TRUE(base::PathExists(shortcut_path)); |
| - |
| - base::FilePath new_exe = temp_dir_.path().Append(kManganeseExe); |
| - ShellUtil::ShortcutProperties updated_properties(ShellUtil::CURRENT_USER); |
| - updated_properties.set_target(new_exe); |
| - // |updated_properties| has arguments. |
| - ASSERT_TRUE(ShellUtil::UpdateShortcutsWithArgs( |
| + base::FilePath new_exe = manganese_exe_; |
| + // Relies on the fact that |test_properties_| has non-empty arguments. |
| + ASSERT_TRUE(ShellUtil::RetargetShortcutsWithArgs( |
| ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, ShellUtil::SYSTEM_LEVEL, |
| - chrome_exe_, updated_properties)); |
| + chrome_exe_, new_exe)); |
| ShellUtil::ShortcutProperties expected_properties(test_properties_); |
| expected_properties.set_target(new_exe); |
| @@ -486,52 +493,101 @@ TEST_F(ShellUtilShortcutTest, UpdateSystemLevelChromeShortcutsWithArgs) { |
| expected_properties); |
| } |
| -TEST_F(ShellUtilShortcutTest, UpdateMultipleChromeShortcutsWithArgs) { |
| - const wchar_t kShortcutName1[] = L"Chrome 1"; |
| - const wchar_t kShortcutName2[] = L"Chrome 2"; |
| - |
| - // Setup shortcut 1, which has empty arguments. |
| - test_properties_.set_shortcut_name(kShortcutName1); |
| +TEST_F(ShellUtilShortcutTest, RetargetChromeShortcutsWithArgsEmpty) { |
| + // Shortcut 1: targets "chrome.exe"; no arguments. |
| + test_properties_.set_shortcut_name(L"Chrome 1"); |
| test_properties_.set_arguments(L""); |
| ASSERT_TRUE(ShellUtil::CreateOrUpdateShortcut( |
| ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, test_properties_, |
| ShellUtil::SHELL_SHORTCUT_CREATE_ALWAYS)); |
| - string16 shortcut1_name(string16(kShortcutName1).append(installer::kLnkExt)); |
| - base::FilePath shortcut1_path( |
| - fake_user_desktop_.path().Append(shortcut1_name)); |
| + ASSERT_TRUE(base::PathExists(GetExpectedShortcutPath( |
| + ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, test_properties_))); |
| ShellUtil::ShortcutProperties expected_properties1(test_properties_); |
| - // Setup shortcut 2, which has non-empty arguments. |
| - string16 shortcut2_args = L"--profile-directory=\"Profile 2\""; |
| - test_properties_.set_shortcut_name(kShortcutName2); |
| - test_properties_.set_arguments(shortcut2_args); |
| + // Shortcut 2: targets "chrome.exe"; has arguments. |
| + test_properties_.set_shortcut_name(L"Chrome 2"); |
| + test_properties_.set_arguments(L"--profile-directory=\"Profile 2\""); |
| ASSERT_TRUE(ShellUtil::CreateOrUpdateShortcut( |
| ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, test_properties_, |
| ShellUtil::SHELL_SHORTCUT_CREATE_ALWAYS)); |
| - string16 shortcut2_name(string16(kShortcutName2).append(installer::kLnkExt)); |
| - base::FilePath shortcut2_path( |
| - fake_user_desktop_.path().Append(shortcut2_name)); |
| - ASSERT_TRUE(base::PathExists(shortcut2_path)); |
| + ASSERT_TRUE(base::PathExists(GetExpectedShortcutPath( |
| + ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, test_properties_))); |
| ShellUtil::ShortcutProperties expected_properties2(test_properties_); |
| - // Update shortcuts: target "manganese.exe" instead of "chrome.exe". |
| - base::FilePath new_exe = temp_dir_.path().Append(kManganeseExe); |
| - ShellUtil::ShortcutProperties updated_properties(ShellUtil::CURRENT_USER); |
| - updated_properties.set_target(new_exe); |
| + // Retarget shortcuts: replace "chrome.exe" with "manganese.exe". Only |
| + // shortcuts with non-empty arguments (i.e., shortcut 2) gets updated. |
| + base::FilePath new_exe = manganese_exe_; |
| + ASSERT_TRUE(ShellUtil::RetargetShortcutsWithArgs( |
| + ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, ShellUtil::CURRENT_USER, |
| + chrome_exe_, new_exe)); |
| + |
| + // Verify shortcut 1: no change. |
| + ValidateChromeShortcut(ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, |
| + expected_properties1); |
| + |
| + // Verify shortcut 2: target => "manganese.exe". |
| + expected_properties2.set_target(new_exe); |
| + ValidateChromeShortcut(ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, |
| + expected_properties2); |
| +} |
| + |
| +TEST_F(ShellUtilShortcutTest, RetargetChromeShortcutsWithArgsIcon) { |
| + const int kTest1IconIndex = 3; |
|
gab
2014/01/03 21:01:13
nit: name these kTestIconIndexX instead of kTestXI
huangs
2014/01/03 22:30:38
Done.
|
| + const int kTest2IconIndex = 5; |
| + const int kTest3IconIndex = 8; |
| + |
| + // Shortcut 1: targets "chrome.exe"; icon same as target. |
| + test_properties_.set_shortcut_name(L"Chrome 1"); |
| + test_properties_.set_icon(test_properties_.target, kTest1IconIndex); |
| + ASSERT_TRUE(ShellUtil::CreateOrUpdateShortcut( |
| + ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, test_properties_, |
| + ShellUtil::SHELL_SHORTCUT_CREATE_ALWAYS)); |
| + ASSERT_TRUE(base::PathExists(GetExpectedShortcutPath( |
| + ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, test_properties_))); |
| + ShellUtil::ShortcutProperties expected_properties1(test_properties_); |
| + |
| + // Shortcut 2: targets "chrome.exe"; icon set to "other.ico". |
| + test_properties_.set_shortcut_name(L"Chrome 2"); |
| + test_properties_.set_icon(other_ico_, kTest2IconIndex); |
| + ASSERT_TRUE(ShellUtil::CreateOrUpdateShortcut( |
| + ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, test_properties_, |
| + ShellUtil::SHELL_SHORTCUT_CREATE_ALWAYS)); |
| + ASSERT_TRUE(base::PathExists(GetExpectedShortcutPath( |
| + ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, test_properties_))); |
| + ShellUtil::ShortcutProperties expected_properties2(test_properties_); |
| - // Only changing shrotcuts that have non-empty arguments, i.e., shortcut 2. |
| - ASSERT_TRUE(ShellUtil::UpdateShortcutsWithArgs( |
| + // Shortcut 3: targets "iron.exe"; icon set to "chrome.exe". |
| + test_properties_.set_target(iron_exe_); |
| + test_properties_.set_shortcut_name(L"Iron 3"); |
| + test_properties_.set_icon(chrome_exe_, kTest3IconIndex); |
| + ASSERT_TRUE(ShellUtil::CreateOrUpdateShortcut( |
| + ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, test_properties_, |
| + ShellUtil::SHELL_SHORTCUT_CREATE_ALWAYS)); |
| + ASSERT_TRUE(base::PathExists(GetExpectedShortcutPath( |
| + ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, test_properties_))); |
| + ShellUtil::ShortcutProperties expected_properties3(test_properties_); |
| + |
| + // Retarget shortcuts: replace "chrome.exe" with "manganese.exe". |
| + // Relies on the fact that |test_properties_| has non-empty arguments. |
| + base::FilePath new_exe = manganese_exe_; |
| + ASSERT_TRUE(ShellUtil::RetargetShortcutsWithArgs( |
| ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, ShellUtil::CURRENT_USER, |
| - chrome_exe_, updated_properties)); |
| - // Verify shortcut 1. |
| - // |expected_properties1| was unchanged and still targets "chrome.exe", since |
| - // it has empty target, yet we passed |require_args| = true. |
| + chrome_exe_, new_exe)); |
| + |
| + // Verify shortcut 1: target & icon => "manganese.exe", kept same icon index. |
| + expected_properties1.set_target(new_exe); |
| + expected_properties1.set_icon(new_exe, kTest1IconIndex); |
| ValidateChromeShortcut(ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, |
| expected_properties1); |
| - // Verify shortcut 2. |
| + |
| + // Verify shortcut 2: target => "manganese.exe", kept icon. |
| expected_properties2.set_target(new_exe); |
| ValidateChromeShortcut(ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, |
| expected_properties2); |
| + |
| + // Verify shortcut 3: no change, since target doesn't match. |
| + ValidateChromeShortcut(ShellUtil::SHORTCUT_LOCATION_DESKTOP, dist_, |
| + expected_properties3); |
| } |
| TEST_F(ShellUtilShortcutTest, CreateMultipleStartMenuShortcutsAndRemoveFolder) { |