| Index: chrome/browser/shell_integration_win_unittest.cc
 | 
| diff --git a/chrome/browser/shell_integration_win_unittest.cc b/chrome/browser/shell_integration_win_unittest.cc
 | 
| index 04b600d01aff02218c765fcedda398d4e803cfa6..53ff859a6c54029741999b4089b5215203992228 100644
 | 
| --- a/chrome/browser/shell_integration_win_unittest.cc
 | 
| +++ b/chrome/browser/shell_integration_win_unittest.cc
 | 
| @@ -22,27 +22,91 @@
 | 
|  
 | 
|  namespace {
 | 
|  
 | 
| -class ShellIntegrationWinMigrateShortcutTest : public testing::Test {
 | 
| +class ShortcutTest : public testing::Test {
 | 
|   protected:
 | 
| +  virtual void CreateShortcuts() = 0;
 | 
| +
 | 
|    virtual void SetUp() OVERRIDE {
 | 
|      ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
 | 
|  
 | 
|      // A path to a random target.
 | 
| -    base::FilePath other_target;
 | 
| -    file_util::CreateTemporaryFileInDir(temp_dir_.path(), &other_target);
 | 
| +    file_util::CreateTemporaryFileInDir(temp_dir_.path(), &other_target_);
 | 
|  
 | 
|      // This doesn't need to actually have a base name of "chrome.exe".
 | 
|      file_util::CreateTemporaryFileInDir(temp_dir_.path(), &chrome_exe_);
 | 
| +    file_util::CreateTemporaryFileInDir(temp_dir_.path(), &app_host_exe_);
 | 
|  
 | 
|      chrome_app_id_ =
 | 
|          ShellUtil::GetBrowserModelId(BrowserDistribution::GetDistribution(),
 | 
|                                       true);
 | 
|  
 | 
| +    base::FilePath default_user_data_dir;
 | 
| +    chrome::GetDefaultUserDataDirectory(&default_user_data_dir);
 | 
| +    base::FilePath default_profile_path =
 | 
| +        default_user_data_dir.AppendASCII(chrome::kInitialProfile);
 | 
| +    app_list_app_id_ =
 | 
| +        ShellIntegration::GetAppListAppModelIdForProfile(default_profile_path);
 | 
| +    non_default_profile_ = string16(L"NonDefault");
 | 
| +    non_default_chrome_app_id_ =
 | 
| +        ShellIntegration::GetChromiumModelIdForProfile(
 | 
| +        default_user_data_dir.Append(non_default_profile_));
 | 
| +
 | 
| +    CreateShortcuts();
 | 
| +  }
 | 
| +
 | 
| +  void AddTestShortcut(
 | 
| +      const base::win::ShortcutProperties& shortcut_properties) {
 | 
| +    shortcuts_properties_.push_back(shortcut_properties);
 | 
| +    base::FilePath shortcut_path =
 | 
| +        temp_dir_.path().Append(L"Shortcut " +
 | 
| +                                base::IntToString16(shortcuts_.size()) +
 | 
| +                                installer::kLnkExt);
 | 
| +    shortcuts_.push_back(shortcut_path);
 | 
| +    ASSERT_TRUE(base::win::CreateOrUpdateShortcutLink(
 | 
| +        shortcut_path, shortcut_properties,
 | 
| +        base::win::SHORTCUT_CREATE_ALWAYS));
 | 
| +  }
 | 
| +
 | 
| +  base::win::ScopedCOMInitializer com_initializer_;
 | 
| +
 | 
| +  base::ScopedTempDir temp_dir_;
 | 
| +
 | 
| +  // Test shortcuts.
 | 
| +  std::vector<base::FilePath> shortcuts_;
 | 
| +
 | 
| +  // Initial properties for the test shortcuts.
 | 
| +  std::vector<base::win::ShortcutProperties> shortcuts_properties_;
 | 
| +
 | 
| +  // The path to a fake chrome.exe.
 | 
| +  base::FilePath chrome_exe_;
 | 
| +
 | 
| +  // The path to a fake app_host.exe.
 | 
| +  base::FilePath app_host_exe_;
 | 
| +
 | 
| +  // The path to a random target.
 | 
| +  base::FilePath other_target_;
 | 
| +
 | 
| +  // Chrome's AppUserModelId.
 | 
| +  string16 chrome_app_id_;
 | 
| +
 | 
| +  // A profile that isn't the Default profile.
 | 
| +  string16 non_default_profile_;
 | 
| +
 | 
| +  // Chrome's AppUserModelId for the non-default profile.
 | 
| +  string16 non_default_chrome_app_id_;
 | 
| +
 | 
| +  // The app launcher's app id.
 | 
| +  string16 app_list_app_id_;
 | 
| +};
 | 
| +
 | 
| +class ShellIntegrationWinMigrateShortcutTest : public ShortcutTest {
 | 
| + protected:
 | 
| +  virtual void CreateShortcuts() OVERRIDE {
 | 
|      // A temporary object to pass properties to AddTestShortcut().
 | 
|      base::win::ShortcutProperties temp_properties;
 | 
|  
 | 
|      // Shortcut 0 doesn't point to chrome.exe and thus should never be migrated.
 | 
| -    temp_properties.set_target(other_target);
 | 
| +    temp_properties.set_target(other_target_);
 | 
|      temp_properties.set_app_id(L"Dumbo");
 | 
|      temp_properties.set_dual_mode(false);
 | 
|      ASSERT_NO_FATAL_FAILURE(AddTestShortcut(temp_properties));
 | 
| @@ -89,35 +153,16 @@ class ShellIntegrationWinMigrateShortcutTest : public testing::Test {
 | 
|      base::win::ShortcutProperties no_properties;
 | 
|      no_properties.set_target(chrome_exe_);
 | 
|      ASSERT_NO_FATAL_FAILURE(AddTestShortcut(no_properties));
 | 
| -  }
 | 
|  
 | 
| -  void AddTestShortcut(
 | 
| -      const base::win::ShortcutProperties& shortcut_properties) {
 | 
| -    shortcuts_properties_.push_back(shortcut_properties);
 | 
| -    base::FilePath shortcut_path =
 | 
| -        temp_dir_.path().Append(L"Shortcut " +
 | 
| -                                base::IntToString16(shortcuts_.size()) +
 | 
| -                                installer::kLnkExt);
 | 
| -    shortcuts_.push_back(shortcut_path);
 | 
| -    ASSERT_TRUE(base::win::CreateOrUpdateShortcutLink(
 | 
| -        shortcut_path, shortcut_properties,
 | 
| -        base::win::SHORTCUT_CREATE_ALWAYS));
 | 
| +    // Shortcut 7 has a non-default profile directory and so should get a non-
 | 
| +    // default app id.
 | 
| +    temp_properties.set_target(chrome_exe_);
 | 
| +    temp_properties.set_app_id(L"Dumbo");
 | 
| +    temp_properties.set_arguments(
 | 
| +        string16(L"--profile-directory=") + non_default_profile_);
 | 
| +    temp_properties.set_dual_mode(false);
 | 
| +    ASSERT_NO_FATAL_FAILURE(AddTestShortcut(temp_properties));
 | 
|    }
 | 
| -
 | 
| -  base::win::ScopedCOMInitializer com_initializer_;
 | 
| -  base::ScopedTempDir temp_dir_;
 | 
| -
 | 
| -  // The path to a fake chrome.exe.
 | 
| -  base::FilePath chrome_exe_;
 | 
| -
 | 
| -  // Test shortcuts.
 | 
| -  std::vector<base::FilePath> shortcuts_;
 | 
| -
 | 
| -  // Initial properties for the test shortcuts.
 | 
| -  std::vector<base::win::ShortcutProperties> shortcuts_properties_;
 | 
| -
 | 
| -  // Chrome's AppUserModelId.
 | 
| -  string16 chrome_app_id_;
 | 
|  };
 | 
|  
 | 
|  }  // namespace
 | 
| @@ -127,15 +172,16 @@ TEST_F(ShellIntegrationWinMigrateShortcutTest, DontCheckDualMode) {
 | 
|    if (base::win::GetVersion() < base::win::VERSION_WIN7)
 | 
|      return;
 | 
|  
 | 
| -  EXPECT_EQ(4,
 | 
| +  EXPECT_EQ(5,
 | 
|              ShellIntegration::MigrateShortcutsInPathInternal(
 | 
|                  chrome_exe_, temp_dir_.path(), false));
 | 
|  
 | 
| -  // Only shortcut 1, 4, 5, and 6 should have been migrated.
 | 
| +  // Only shortcut 1, 4, 5, 6 and 7 should have been migrated.
 | 
|    shortcuts_properties_[1].set_app_id(chrome_app_id_);
 | 
|    shortcuts_properties_[4].set_app_id(chrome_app_id_);
 | 
|    shortcuts_properties_[5].set_app_id(chrome_app_id_);
 | 
|    shortcuts_properties_[6].set_app_id(chrome_app_id_);
 | 
| +  shortcuts_properties_[7].set_app_id(non_default_chrome_app_id_);
 | 
|  
 | 
|    for (size_t i = 0; i < shortcuts_.size(); ++i)
 | 
|      base::win::ValidateShortcut(shortcuts_[i], shortcuts_properties_[i]);
 | 
| @@ -146,23 +192,25 @@ TEST_F(ShellIntegrationWinMigrateShortcutTest, CheckDualMode) {
 | 
|    if (base::win::GetVersion() < base::win::VERSION_WIN7)
 | 
|      return;
 | 
|  
 | 
| -  EXPECT_EQ(5,
 | 
| +  EXPECT_EQ(6,
 | 
|              ShellIntegration::MigrateShortcutsInPathInternal(
 | 
|                  chrome_exe_, temp_dir_.path(), true));
 | 
|  
 | 
| -  // Shortcut 1, 4, 5, and 6 should have had both their app_id and dual_mode
 | 
| +  // Shortcut 1, 4, 5, 6 and 7 should have had both their app_id and dual_mode
 | 
|    // properties fixed and shortcut 2 should also have had it's dual_mode
 | 
|    // property fixed.
 | 
|    shortcuts_properties_[1].set_app_id(chrome_app_id_);
 | 
|    shortcuts_properties_[4].set_app_id(chrome_app_id_);
 | 
|    shortcuts_properties_[5].set_app_id(chrome_app_id_);
 | 
|    shortcuts_properties_[6].set_app_id(chrome_app_id_);
 | 
| +  shortcuts_properties_[7].set_app_id(non_default_chrome_app_id_);
 | 
|  
 | 
|    shortcuts_properties_[1].set_dual_mode(true);
 | 
|    shortcuts_properties_[2].set_dual_mode(true);
 | 
|    shortcuts_properties_[4].set_dual_mode(true);
 | 
|    shortcuts_properties_[5].set_dual_mode(true);
 | 
|    shortcuts_properties_[6].set_dual_mode(true);
 | 
| +  shortcuts_properties_[7].set_dual_mode(true);
 | 
|  
 | 
|    for (size_t i = 0; i < shortcuts_.size(); ++i)
 | 
|      base::win::ValidateShortcut(shortcuts_[i], shortcuts_properties_[i]);
 | 
| @@ -222,3 +270,30 @@ TEST(ShellIntegrationWinTest, GetAppListAppModelIdForProfileTest) {
 | 
|    EXPECT_EQ(base_app_id + L".udd.UserDataTest",
 | 
|              ShellIntegration::GetAppListAppModelIdForProfile(profile_path));
 | 
|  }
 | 
| +
 | 
| +// TODO(calamity): remove this test once app_host.exe is removed
 | 
| +class AppHostMigrateShortcutTest : public ShortcutTest {
 | 
| + protected:
 | 
| +  virtual void CreateShortcuts() OVERRIDE {
 | 
| +    base::win::ShortcutProperties temp_properties;
 | 
| +
 | 
| +    // Shortcut 0 points to app_host.exe and should be retargeted to chrome.exe.
 | 
| +    temp_properties.set_target(app_host_exe_);
 | 
| +    temp_properties.set_app_id(L"SomeAppId");
 | 
| +    temp_properties.set_arguments(L"--show-app-list");
 | 
| +    ASSERT_NO_FATAL_FAILURE(AddTestShortcut(temp_properties));
 | 
| +  }
 | 
| +};
 | 
| +
 | 
| +// Test migration when not checking for dual mode.
 | 
| +TEST_F(AppHostMigrateShortcutTest, AppHostExeRetargetsToChromeExe) {
 | 
| +  EXPECT_EQ(1,
 | 
| +            ShellIntegration::MigrateAppHostShortcutsInPathInternal(
 | 
| +                chrome_exe_, app_host_exe_, temp_dir_.path(), false));
 | 
| +
 | 
| +  // app_host.exe should now be chrome.exe
 | 
| +  shortcuts_properties_[0].set_target(chrome_exe_);
 | 
| +
 | 
| +  for (size_t i = 0; i < shortcuts_.size(); ++i)
 | 
| +    base::win::ValidateShortcut(shortcuts_[i], shortcuts_properties_[i]);
 | 
| +}
 | 
| 
 |