Chromium Code Reviews| Index: chrome/installer/util/installer_state_unittest.cc |
| =================================================================== |
| --- chrome/installer/util/installer_state_unittest.cc (revision 71802) |
| +++ chrome/installer/util/installer_state_unittest.cc (working copy) |
| @@ -1,4 +1,4 @@ |
| -// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
| +// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| @@ -7,64 +7,55 @@ |
| #include <fstream> |
| #include "base/base_paths.h" |
| +#include "base/command_line.h" |
| #include "base/file_util.h" |
| #include "base/path_service.h" |
| #include "base/process_util.h" |
| #include "base/string_util.h" |
| +#include "base/utf_string_conversions.h" |
| #include "base/version.h" |
| +#include "base/win/registry.h" |
| +#include "base/win/scoped_handle.h" |
| +#include "chrome/installer/util/google_update_constants.h" |
| #include "chrome/installer/util/helper.h" |
| -#include "chrome/installer/util/package.h" |
| -#include "chrome/installer/util/package_properties.h" |
| +#include "chrome/installer/util/installation_state.h" |
| +#include "chrome/installer/util/installer_state.h" |
| +#include "chrome/installer/util/master_preferences.h" |
| +#include "chrome/installer/util/product_unittest.h" |
| #include "chrome/installer/util/work_item.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| -using installer::ChromePackageProperties; |
| -using installer::Package; |
| +class InstallerStateTest : public TestWithTempDirAndDeleteTempOverrideKeys { |
| + protected: |
| +}; |
| -namespace { |
| - class SetupHelperTest : public testing::Test { |
| - protected: |
| - virtual void SetUp() { |
| - // Name a subdirectory of the user temp directory. |
| - ASSERT_TRUE(PathService::Get(base::DIR_TEMP, &test_dir_)); |
| - test_dir_ = test_dir_.AppendASCII("SetupHelperTest"); |
| +// An installer state on which we can tweak the target path. |
| +class MockInstallerState : public installer::InstallerState { |
| + public: |
| + MockInstallerState() : InstallerState() { } |
| + void set_target_path(const FilePath& target_path) { |
| + target_path_ = target_path; |
| + } |
| +}; |
| - // Create a fresh, empty copy of this test directory. |
| - file_util::Delete(test_dir_, true); |
| - file_util::CreateDirectoryW(test_dir_); |
| - ASSERT_TRUE(file_util::PathExists(test_dir_)); |
| - } |
| +// Simple function to dump some text into a new file. |
| +void CreateTextFile(const std::wstring& filename, |
| + const std::wstring& contents) { |
| + std::ofstream file; |
| + file.open(filename.c_str()); |
| + ASSERT_TRUE(file.is_open()); |
| + file << contents; |
| + file.close(); |
| +} |
| - virtual void TearDown() { |
| - logging::CloseLogFile(); |
| - // Clean up test directory |
| - ASSERT_TRUE(file_util::Delete(test_dir_, true)); |
| - ASSERT_FALSE(file_util::PathExists(test_dir_)); |
| - } |
| +wchar_t text_content_1[] = L"delete me"; |
| +wchar_t text_content_2[] = L"delete me as well"; |
| - // the path to temporary directory used to contain the test operations |
| - FilePath test_dir_; |
| - }; |
| - |
| - // Simple function to dump some text into a new file. |
| - void CreateTextFile(const std::wstring& filename, |
| - const std::wstring& contents) { |
| - std::ofstream file; |
| - file.open(filename.c_str()); |
| - ASSERT_TRUE(file.is_open()); |
| - file << contents; |
| - file.close(); |
| - } |
| - |
| - wchar_t text_content_1[] = L"delete me"; |
| - wchar_t text_content_2[] = L"delete me as well"; |
| -}; |
| - |
| // Delete version directories. Everything lower than the given version |
| // should be deleted. |
| -TEST_F(SetupHelperTest, Delete) { |
| +TEST_F(InstallerStateTest, Delete) { |
| // Create a Chrome dir |
| - FilePath chrome_dir(test_dir_); |
| + FilePath chrome_dir(test_dir_.path()); |
| chrome_dir = chrome_dir.AppendASCII("chrome"); |
| file_util::CreateDirectory(chrome_dir); |
| ASSERT_TRUE(file_util::PathExists(chrome_dir)); |
| @@ -109,11 +100,17 @@ |
| CreateTextFile(chrome_dll_4.value(), text_content_1); |
| ASSERT_TRUE(file_util::PathExists(chrome_dll_4)); |
|
robertshield
2011/01/21 19:37:47
This setup code above looks like it should be in t
grt (UTC plus 2)
2011/01/24 16:07:02
Adding TODO to clean this up since it pre-dates th
|
| + CommandLine cmd_line = CommandLine::FromString(L"setup.exe"); |
| + installer::MasterPreferences prefs(cmd_line); |
| + installer::InstallationState machine_state; |
| + machine_state.Initialize(); |
| + MockInstallerState installer_state; |
| + installer_state.Initialize(cmd_line, prefs, machine_state); |
| + installer_state.set_target_path(chrome_dir); |
| + EXPECT_TRUE(installer_state.FindProduct(BrowserDistribution::CHROME_BROWSER) |
| + != NULL); |
|
robertshield
2011/01/21 19:37:47
Add expectations that CHROME_FRAME is not present?
grt (UTC plus 2)
2011/01/24 16:07:02
That would be testing something unrelated to what
|
| scoped_ptr<Version> latest_version(Version::GetVersionFromString("1.0.4.0")); |
| - ChromePackageProperties properties; |
| - scoped_refptr<Package> package(new Package(false, true, chrome_dir, |
| - &properties)); |
| - package->RemoveOldVersionDirectories(*latest_version.get()); |
| + installer_state.RemoveOldVersionDirectories(*latest_version.get()); |
| // old versions should be gone |
| EXPECT_FALSE(file_util::PathExists(chrome_dir_1)); |
| @@ -124,9 +121,9 @@ |
| } |
| // Delete older version directories, keeping the one in used intact. |
| -TEST_F(SetupHelperTest, DeleteInUsed) { |
| +TEST_F(InstallerStateTest, DeleteInUsed) { |
| // Create a Chrome dir |
| - FilePath chrome_dir(test_dir_); |
| + FilePath chrome_dir(test_dir_.path()); |
| chrome_dir = chrome_dir.AppendASCII("chrome"); |
| file_util::CreateDirectory(chrome_dir); |
| ASSERT_TRUE(file_util::PathExists(chrome_dir)); |
| @@ -185,11 +182,17 @@ |
| CreateTextFile(chrome_dll_4.value(), text_content_1); |
| ASSERT_TRUE(file_util::PathExists(chrome_dll_4)); |
| + CommandLine cmd_line = CommandLine::FromString(L"setup.exe"); |
| + installer::MasterPreferences prefs(cmd_line); |
| + installer::InstallationState machine_state; |
| + machine_state.Initialize(); |
| + MockInstallerState installer_state; |
| + installer_state.Initialize(cmd_line, prefs, machine_state); |
| + installer_state.set_target_path(chrome_dir); |
| + EXPECT_TRUE(installer_state.FindProduct(BrowserDistribution::CHROME_BROWSER) |
| + != NULL); |
|
robertshield
2011/01/21 19:37:47
This looks copy/pasted. Stick it in a method?
grt (UTC plus 2)
2011/01/24 16:07:02
Done.
|
| scoped_ptr<Version> latest_version(Version::GetVersionFromString("1.0.4.0")); |
| - ChromePackageProperties properties; |
| - scoped_refptr<Package> install_path(new Package(false, true, chrome_dir, |
| - &properties)); |
| - install_path->RemoveOldVersionDirectories(*latest_version.get()); |
| + installer_state.RemoveOldVersionDirectories(*latest_version.get()); |
| // old versions not in used should be gone |
| EXPECT_FALSE(file_util::PathExists(chrome_dir_1)); |
| @@ -202,3 +205,122 @@ |
| // the latest version should stay |
| EXPECT_TRUE(file_util::PathExists(chrome_dll_4)); |
| } |
| + |
| +// Tests a few basic things of the Package class. Makes sure that the path |
| +// operations are correct |
| +TEST_F(InstallerStateTest, Basic) { |
| + const bool multi_install = false; |
| + const bool system_level = true; |
| + CommandLine cmd_line = CommandLine::FromString( |
| + std::wstring(L"setup.exe") + |
| + (multi_install ? L" --multi-install --chrome" : L"") + |
| + (system_level ? L" --system-level" : L"")); |
| + installer::MasterPreferences prefs(cmd_line); |
| + installer::InstallationState machine_state; |
| + machine_state.Initialize(); |
| + MockInstallerState installer_state; |
| + installer_state.Initialize(cmd_line, prefs, machine_state); |
| + installer_state.set_target_path(test_dir_.path()); |
| + EXPECT_EQ(test_dir_.path().value(), installer_state.target_path().value()); |
| + EXPECT_EQ(1U, installer_state.products().size()); |
| + |
| + const char kOldVersion[] = "1.2.3.4"; |
| + const char kNewVersion[] = "2.3.4.5"; |
| + |
| + scoped_ptr<Version> new_version(Version::GetVersionFromString(kNewVersion)); |
| + scoped_ptr<Version> old_version(Version::GetVersionFromString(kOldVersion)); |
| + ASSERT_TRUE(new_version.get() != NULL); |
| + ASSERT_TRUE(old_version.get() != NULL); |
| + |
| + FilePath installer_dir( |
| + installer_state.GetInstallerDirectory(*new_version.get())); |
| + EXPECT_FALSE(installer_dir.empty()); |
| + |
| + FilePath new_version_dir(installer_state.target_path().Append( |
| + UTF8ToWide(new_version->GetString()))); |
| + FilePath old_version_dir(installer_state.target_path().Append( |
| + UTF8ToWide(old_version->GetString()))); |
| + |
| + EXPECT_FALSE(file_util::PathExists(new_version_dir)); |
| + EXPECT_FALSE(file_util::PathExists(old_version_dir)); |
| + |
| + EXPECT_FALSE(file_util::PathExists(installer_dir)); |
| + file_util::CreateDirectory(installer_dir); |
| + EXPECT_TRUE(file_util::PathExists(new_version_dir)); |
| + |
| + file_util::CreateDirectory(old_version_dir); |
| + EXPECT_TRUE(file_util::PathExists(old_version_dir)); |
| + |
| + // Create a fake chrome.dll key file in the old version directory. This |
| + // should prevent the old version directory from getting deleted. |
| + FilePath old_chrome_dll(old_version_dir.Append(installer::kChromeDll)); |
| + EXPECT_FALSE(file_util::PathExists(old_chrome_dll)); |
| + |
| + // Hold on to the file exclusively to prevent the directory from |
| + // being deleted. |
| + base::win::ScopedHandle file( |
| + ::CreateFile(old_chrome_dll.value().c_str(), GENERIC_READ, |
| + 0, NULL, OPEN_ALWAYS, 0, NULL)); |
| + EXPECT_TRUE(file.IsValid()); |
| + EXPECT_TRUE(file_util::PathExists(old_chrome_dll)); |
| + |
| + installer_state.RemoveOldVersionDirectories(*new_version.get()); |
| + // The old directory should still exist. |
| + EXPECT_TRUE(file_util::PathExists(old_version_dir)); |
| + EXPECT_TRUE(file_util::PathExists(new_version_dir)); |
| + |
| + // Now close the file handle to make it possible to delete our key file. |
| + file.Close(); |
| + |
| + installer_state.RemoveOldVersionDirectories(*new_version.get()); |
| + // The new directory should still exist. |
| + EXPECT_TRUE(file_util::PathExists(new_version_dir)); |
| + |
| + // Now, the old directory and key file should be gone. |
| + EXPECT_FALSE(file_util::PathExists(old_chrome_dll)); |
| + EXPECT_FALSE(file_util::PathExists(old_version_dir)); |
| +} |
| + |
| +TEST_F(InstallerStateTest, WithProduct) { |
| + const bool multi_install = false; |
| + const bool system_level = true; |
| + CommandLine cmd_line = CommandLine::FromString( |
| + std::wstring(L"setup.exe") + |
| + (multi_install ? L" --multi-install --chrome" : L"") + |
| + (system_level ? L" --system-level" : L"")); |
| + installer::MasterPreferences prefs(cmd_line); |
| + installer::InstallationState machine_state; |
| + machine_state.Initialize(); |
| + MockInstallerState installer_state; |
| + installer_state.Initialize(cmd_line, prefs, machine_state); |
| + installer_state.set_target_path(test_dir_.path()); |
| + EXPECT_EQ(1U, installer_state.products().size()); |
| + EXPECT_EQ(system_level, installer_state.system_install()); |
| + |
| + const char kCurrentVersion[] = "1.2.3.4"; |
| + scoped_ptr<Version> current_version( |
| + Version::GetVersionFromString(kCurrentVersion)); |
| + |
| + HKEY root = system_level ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; |
| + EXPECT_EQ(root, installer_state.root_key()); |
| + { |
| + TempRegKeyOverride override(root, L"root_pit"); |
| + BrowserDistribution* dist = BrowserDistribution::GetSpecificDistribution( |
| + BrowserDistribution::CHROME_BROWSER); |
| + base::win::RegKey chrome_key(root, dist->GetVersionKey().c_str(), |
| + KEY_ALL_ACCESS); |
| + EXPECT_TRUE(chrome_key.Valid()); |
| + if (chrome_key.Valid()) { |
| + chrome_key.WriteValue(google_update::kRegVersionField, |
| + UTF8ToWide(current_version->GetString()).c_str()); |
| + machine_state.Initialize(); |
| + // TODO(tommi): Also test for when there exists a new_chrome.exe. |
| + scoped_ptr<Version> found_version(installer_state.GetCurrentVersion( |
| + machine_state)); |
| + EXPECT_TRUE(found_version.get() != NULL); |
| + if (found_version.get()) { |
| + EXPECT_TRUE(current_version->Equals(*found_version)); |
| + } |
| + } |
| + } |
| +} |