| Index: chrome/installer/setup/update_active_setup_version_work_item_unittest.cc
|
| diff --git a/chrome/installer/setup/update_active_setup_version_work_item_unittest.cc b/chrome/installer/setup/update_active_setup_version_work_item_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..bf3ca46e6ce7cc6ac6b028931e3e99dbb9542644
|
| --- /dev/null
|
| +++ b/chrome/installer/setup/update_active_setup_version_work_item_unittest.cc
|
| @@ -0,0 +1,153 @@
|
| +// Copyright 2015 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.
|
| +
|
| +#include "chrome/installer/setup/update_active_setup_version_work_item.h"
|
| +
|
| +#include <windows.h>
|
| +
|
| +#include <ostream>
|
| +
|
| +#include "base/macros.h"
|
| +#include "base/strings/string16.h"
|
| +#include "base/test/test_reg_util_win.h"
|
| +#include "base/win/registry.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +using testing::ValuesIn;
|
| +
|
| +namespace {
|
| +
|
| +const HKEY kActiveSetupRoot = HKEY_LOCAL_MACHINE;
|
| +const base::char16 kActiveSetupPath[] = L"Active Setup\\test";
|
| +
|
| +struct UpdateActiveSetupVersionWorkItemTestCase {
|
| + // The initial value to be set in the registry prior to executing the
|
| + // UpdateActiveSetupVersionWorkItem. No value will be set if this null.
|
| + const wchar_t* initial_value;
|
| +
|
| + // Whether to ask the UpdateActiveSetupVersionWorkItem to bump the OS_UPGRADES
|
| + // component of the Active Setup version.
|
| + bool bump_os_upgrades_component;
|
| +
|
| + // The expected value after executing the UpdateActiveSetupVersionWorkItem.
|
| + const wchar_t* expected_result;
|
| +} const kUpdateActiveSetupVersionWorkItemTestCases[] = {
|
| + // Initial install.
|
| + {nullptr, false, L"43,0,0,0"},
|
| + // No-op update.
|
| + {L"43.0.0.0", false, L"43,0,0,0"},
|
| + // Update only major component.
|
| + {L"24,1,2,3", false, L"43,1,2,3"},
|
| + // Reset from bogus value.
|
| + {L"zzz", false, L"43,0,0,0"},
|
| + // Reset from invalid version (too few components).
|
| + {L"1,2", false, L"43,0,0,0"},
|
| + // Reset from invalid version (too many components).
|
| + {L"43,1,2,3,10", false, L"43,0,0,0"},
|
| + // Reset from empty string.
|
| + {L"", false, L"43,0,0,0"},
|
| +
|
| + // Same tests with an OS_UPGRADES component bump.
|
| + {nullptr, true, L"43,0,1,0"},
|
| + {L"43.0.0.0", true, L"43,0,1,0"},
|
| + {L"24,1,2,3", true, L"43,1,3,3"},
|
| + {L"zzz", true, L"43,0,1,0"},
|
| + {L"1,2", true, L"43,0,1,0"},
|
| + {L"43,1,2,3,10", true, L"43,0,1,0"},
|
| + {L"", true, L"43,0,1,0"},
|
| + // Bumping a negative OS upgrade component should result in it being
|
| + // reset and subsequently bumped to 1 as usual.
|
| + {L"43,11,-123,33", true, L"43,11,1,33"},
|
| +};
|
| +
|
| +// Implements PrintTo in order for gtest to be able to print the problematic
|
| +// UpdateActiveSetupVersionWorkItemTestCase on failure.
|
| +void PrintTo(const UpdateActiveSetupVersionWorkItemTestCase& test_case,
|
| + ::std::ostream* os) {
|
| + *os << "Initial value: "
|
| + << (test_case.initial_value ? test_case.initial_value : L"(empty)")
|
| + << ", bump_os_upgrades_component: "
|
| + << test_case.bump_os_upgrades_component
|
| + << ", expected result: " << test_case.expected_result;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +class UpdateActiveSetupVersionWorkItemTest
|
| + : public testing::TestWithParam<UpdateActiveSetupVersionWorkItemTestCase> {
|
| + public:
|
| + UpdateActiveSetupVersionWorkItemTest() {}
|
| +
|
| + void SetUp() override {
|
| + registry_override_manager_.OverrideRegistry(kActiveSetupRoot);
|
| + }
|
| +
|
| + private:
|
| + registry_util::RegistryOverrideManager registry_override_manager_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(UpdateActiveSetupVersionWorkItemTest);
|
| +};
|
| +
|
| +TEST_P(UpdateActiveSetupVersionWorkItemTest, Execute) {
|
| + // Get the parametrized |test_case| which defines 5 steps:
|
| + // 1) Maybe set an initial Active Setup version in the registry according to
|
| + // |test_case.initial_value|.
|
| + // 2) Declare the work to be done by the UpdateActiveSetupVersionWorkItem
|
| + // based on |test_case.bump_os_upgrades_component|.
|
| + // 3) Unconditionally execute the Active Setup work items.
|
| + // 4) Verify that the updated Active Setup version is as expected by
|
| + // |test_case.expected_result|.
|
| + // 5) Rollback and verify that |test_case.initial_value| is back.
|
| + const UpdateActiveSetupVersionWorkItemTestCase& test_case = GetParam();
|
| +
|
| + base::win::RegKey test_key;
|
| +
|
| + ASSERT_EQ(ERROR_FILE_NOT_FOUND,
|
| + test_key.Open(kActiveSetupRoot, kActiveSetupPath, KEY_READ));
|
| +
|
| + UpdateActiveSetupVersionWorkItem active_setup_work_item(
|
| + kActiveSetupPath, test_case.bump_os_upgrades_component
|
| + ? UpdateActiveSetupVersionWorkItem::
|
| + UPDATE_AND_BUMP_OS_UPGRADES_COMPONENT
|
| + : UpdateActiveSetupVersionWorkItem::UPDATE);
|
| +
|
| + // Create the key and set the |initial_value| *after* the WorkItem to confirm
|
| + // that all of the work is done when executing the item, not when creating it.
|
| + ASSERT_EQ(ERROR_SUCCESS,
|
| + test_key.Create(kActiveSetupRoot, kActiveSetupPath, KEY_SET_VALUE));
|
| + if (test_case.initial_value) {
|
| + ASSERT_EQ(ERROR_SUCCESS,
|
| + test_key.WriteValue(L"Version", test_case.initial_value));
|
| + }
|
| +
|
| + EXPECT_TRUE(active_setup_work_item.Do());
|
| +
|
| + {
|
| + base::string16 version_out;
|
| + EXPECT_EQ(ERROR_SUCCESS, test_key.Open(kActiveSetupRoot, kActiveSetupPath,
|
| + KEY_QUERY_VALUE));
|
| + EXPECT_EQ(ERROR_SUCCESS, test_key.ReadValue(L"Version", &version_out));
|
| + EXPECT_EQ(test_case.expected_result, version_out);
|
| + }
|
| +
|
| + active_setup_work_item.Rollback();
|
| +
|
| + {
|
| + EXPECT_EQ(ERROR_SUCCESS, test_key.Open(kActiveSetupRoot, kActiveSetupPath,
|
| + KEY_QUERY_VALUE));
|
| +
|
| + base::string16 version_out;
|
| + LONG read_result = test_key.ReadValue(L"Version", &version_out);
|
| + if (test_case.initial_value) {
|
| + EXPECT_EQ(ERROR_SUCCESS, read_result);
|
| + EXPECT_EQ(test_case.initial_value, version_out);
|
| + } else {
|
| + EXPECT_EQ(ERROR_FILE_NOT_FOUND, read_result);
|
| + }
|
| + }
|
| +}
|
| +
|
| +INSTANTIATE_TEST_CASE_P(UpdateActiveSetupVersionWorkItemTestInstance,
|
| + UpdateActiveSetupVersionWorkItemTest,
|
| + ValuesIn(kUpdateActiveSetupVersionWorkItemTestCases));
|
|
|