Index: testing/unit_test.cc |
diff --git a/testing/unit_test.cc b/testing/unit_test.cc |
deleted file mode 100644 |
index 96ae11c3b98788412399e83d0b1baccad22f62a5..0000000000000000000000000000000000000000 |
--- a/testing/unit_test.cc |
+++ /dev/null |
@@ -1,371 +0,0 @@ |
-// Copyright 2007-2010 Google Inc. |
-// |
-// Licensed under the Apache License, Version 2.0 (the "License"); |
-// you may not use this file except in compliance with the License. |
-// You may obtain a copy of the License at |
-// |
-// http://www.apache.org/licenses/LICENSE-2.0 |
-// |
-// Unless required by applicable law or agreed to in writing, software |
-// distributed under the License is distributed on an "AS IS" BASIS, |
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-// See the License for the specific language governing permissions and |
-// limitations under the License. |
-// ======================================================================== |
- |
-#include "testing/unit_test.h" |
-#include "omaha/base/app_util.h" |
-#include "omaha/base/constants.h" |
-#include "omaha/base/path.h" |
-#include "omaha/base/process.h" |
-#include "omaha/base/reg_key.h" |
-#include "omaha/base/scoped_any.h" |
-#include "omaha/base/system.h" |
-#include "omaha/base/utils.h" |
-#include "omaha/base/user_info.h" |
-#include "omaha/base/vistautil.h" |
-#include "omaha/common/command_line.h" |
-#include "omaha/common/command_line_builder.h" |
-#include "omaha/common/const_goopdate.h" |
- |
-namespace omaha { |
- |
-namespace { |
- |
-static bool is_buildsystem = false; |
-static TCHAR psexec_dir[MAX_PATH] = {0}; |
- |
-// Returns whether all unit tests should be run. |
-bool ShouldRunAllTests() { |
- if (is_buildsystem) { |
- return true; |
- } |
- |
- EXPECT_FALSE(IsEnvironmentVariableSet(_T("OMAHA_RUN_ALL_TESTS"))) |
- << _T("Use OMAHA_TEST_RUN_ALL instead of OMAHA_RUN_ALL_TESTS."); |
- |
- return IsEnvironmentVariableSet(_T("OMAHA_TEST_RUN_ALL")); |
-} |
- |
-} // namespace |
- |
-bool IsEnvironmentVariableSet(const TCHAR* name) { |
- ASSERT1(name); |
- TCHAR var[100] = {0}; |
- DWORD res = ::GetEnvironmentVariable(name, var, arraysize(var)); |
- if (0 == res) { |
- ASSERT1(ERROR_ENVVAR_NOT_FOUND == ::GetLastError()); |
- return false; |
- } else { |
- return true; |
- } |
-} |
- |
-bool IsTestRunByLocalSystem() { |
- return user_info::IsRunningAsSystem(); |
-} |
- |
-CString GetLocalAppDataPath() { |
- CString expected_local_app_data_path; |
- EXPECT_SUCCEEDED(GetFolderPath(CSIDL_LOCAL_APPDATA | CSIDL_FLAG_DONT_VERIFY, |
- &expected_local_app_data_path)); |
- expected_local_app_data_path.Append(_T("\\")); |
- return expected_local_app_data_path; |
-} |
- |
-CString GetGoogleUserPath() { |
- return GetLocalAppDataPath() + SHORT_COMPANY_NAME + _T("\\"); |
-} |
- |
-// TODO(omaha): make GetGoogleUpdateUserPath and GetGoogleUpdateMachinePath |
-// consistent. They should end with \ or not. |
-CString GetGoogleUpdateUserPath() { |
- return GetGoogleUserPath() + PRODUCT_NAME + _T("\\"); |
-} |
- |
-CString GetGoogleUpdateMachinePath() { |
- CString program_files; |
- GetFolderPath(CSIDL_PROGRAM_FILES, &program_files); |
- return program_files + _T("\\") + SHORT_COMPANY_NAME |
- + _T("\\") + PRODUCT_NAME; |
-} |
- |
-DWORD GetDwordValue(const CString& full_key_name, const CString& value_name) { |
- DWORD value = 0; |
- EXPECT_SUCCEEDED(RegKey::GetValue(full_key_name, value_name, &value)); |
- return value; |
-} |
- |
-CString GetSzValue(const CString& full_key_name, const CString& value_name) { |
- CString value; |
- EXPECT_SUCCEEDED(RegKey::GetValue(full_key_name, value_name, &value)); |
- return value; |
-} |
- |
-GUID StringToGuid(const CString& str) { |
- GUID guid(GUID_NULL); |
- VERIFY(SUCCEEDED(StringToGuidSafe(str, &guid)), (_T("guid '%s'"), str)); |
- return guid; |
-} |
- |
-void OverrideRegistryHives(const CString& hive_override_key_name) { |
- OverrideSpecifiedRegistryHives(hive_override_key_name, true, true); |
-} |
- |
-void OverrideSpecifiedRegistryHives(const CString& hive_override_key_name, |
- bool override_hklm, |
- bool override_hkcu) { |
- // Override the destinations of HKLM and HKCU to use a special location |
- // for the unit tests so that we don't disturb the actual Omaha state. |
- RegKey machine_key; |
- RegKey user_key; |
- ASSERT_SUCCEEDED(machine_key.Create(hive_override_key_name + MACHINE_KEY)); |
- ASSERT_SUCCEEDED(user_key.Create(hive_override_key_name + USER_KEY)); |
- if (override_hklm) { |
- ASSERT_SUCCEEDED(::RegOverridePredefKey(HKEY_LOCAL_MACHINE, |
- machine_key.Key())); |
- } |
- if (override_hkcu) { |
- ASSERT_SUCCEEDED(::RegOverridePredefKey(HKEY_CURRENT_USER, |
- user_key.Key())); |
- } |
-} |
- |
-// When tests execute programs (i.e. with ShellExecute or indirectly), Windows |
-// looks at kMyComputerSecurityZoneKeyPathL:kMiscSecurityZonesValueName |
-// to see if it should run the program. |
-// Normally, these reads are not redirected to the override key even though |
-// it seems like they should be. In this case, the execution succeeds. |
-// In certain cases, the reads are redirected and the program execution |
-// fails due to permission denied errors. |
-// This has been observed when XmlUtilsTest::LoadSave() is run before such |
-// tests. Specifically, the my_xmldoc->load() call in LoadXMLFromFile() |
-// appears to somehow cause the redirection to occur. |
-// |
-// See http://support.microsoft.com/kb/182569 for information on security |
-// zones. |
-void OverrideRegistryHivesWithExecutionPermissions( |
- const CString& hive_override_key_name) { |
- OverrideRegistryHives(hive_override_key_name); |
- |
- const TCHAR kMyComputerSecurityZoneKeyPath[] = |
- _T("HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\") |
- _T("Internet Settings\\Zones\\0"); |
- const TCHAR kMiscSecurityZonesValueName[] = _T("1806"); |
- const DWORD kPermitAction = 0; |
- |
- RegKey my_computer_zone_key; |
- ASSERT_SUCCEEDED(my_computer_zone_key.Create( |
- kMyComputerSecurityZoneKeyPath)); |
- ASSERT_SUCCEEDED(my_computer_zone_key.SetValue(kMiscSecurityZonesValueName, |
- kPermitAction)); |
-} |
- |
-void RestoreRegistryHives() { |
- ASSERT_SUCCEEDED(::RegOverridePredefKey(HKEY_LOCAL_MACHINE, NULL)); |
- ASSERT_SUCCEEDED(::RegOverridePredefKey(HKEY_CURRENT_USER, NULL)); |
-} |
- |
-void SetPsexecDir(const CString& dir) { |
- _tcscpy_s(psexec_dir, arraysize(psexec_dir), dir.GetString()); |
-} |
- |
-CString GetPsexecDir() { |
- EXPECT_TRUE(_tcsnlen(psexec_dir, arraysize(psexec_dir))); |
- return psexec_dir; |
-} |
- |
-// Must be called after SetPsexecDir(). |
-// Does not wait for the EULA accepting process to complete. |
-bool AcceptPsexecEula() { |
- CString psexec_dir = GetPsexecDir(); |
- if (psexec_dir.IsEmpty()) { |
- return false; |
- } |
- |
- CString psexec_path = ConcatenatePath(psexec_dir, _T("psexec.exe")); |
- return SUCCEEDED(System::StartProcessWithArgs(psexec_path, |
- _T("/accepteula"))); |
-} |
- |
-void SetIsBuildSystem() { |
- is_buildsystem = true; |
-} |
- |
-bool IsBuildSystem() { |
- return is_buildsystem; |
-} |
- |
-void SetBuildSystemTestSource() { |
- EXPECT_SUCCEEDED(RegKey::SetValue(MACHINE_REG_UPDATE_DEV, |
- kRegValueTestSource, |
- _T("buildsystem"))); |
-} |
- |
-bool ShouldRunLargeTest() { |
- if (ShouldRunAllTests()) { |
- return true; |
- } |
- |
- if (IsEnvironmentVariableSet(_T("OMAHA_TEST_RUN_LARGE"))) { |
- return true; |
- } else { |
- std::wcout << _T("\tThis large test did not run because neither ") |
- _T("'OMAHA_TEST_RUN_LARGE' or 'OMAHA_TEST_RUN_ALL' is set ") |
- _T("in the environment.") << std::endl; |
- return false; |
- } |
-} |
- |
-bool ShouldRunEnormousTest() { |
- if (ShouldRunAllTests()) { |
- return true; |
- } |
- |
- std::wcout << _T("\tThis large test did not run because ") |
- _T("'OMAHA_TEST_RUN_ALL' is not set in the environment.") |
- << std::endl; |
- return false; |
-} |
- |
-void TerminateAllProcessesByName(const TCHAR* process_name) { |
- std::vector<uint32> process_pids; |
- ASSERT_SUCCEEDED(Process::FindProcesses(0, // No flags. |
- process_name, |
- true, |
- &process_pids)); |
- |
- for (size_t i = 0; i < process_pids.size(); ++i) { |
- scoped_process process(::OpenProcess(PROCESS_TERMINATE, |
- FALSE, |
- process_pids[i])); |
- EXPECT_TRUE(process); |
- EXPECT_TRUE(::TerminateProcess(get(process), static_cast<uint32>(-3))); |
- } |
-} |
- |
-void TerminateAllGoogleUpdateProcesses() { |
- TerminateAllProcessesByName(kOmahaShellFileName); |
- TerminateAllProcessesByName(kCrashHandlerFileName); |
-} |
- |
-// The exit code of psexec is the pid it started when -d is used. |
-// Wait for psexec to exit, get the exit code, and use it to get a handle |
-// to the GoogleUpdate.exe instance. |
-void LaunchProcessAsSystem(const CString& launch_cmd, HANDLE* process) { |
- ASSERT_TRUE(process); |
- |
- CString app_launcher = ConcatenatePath(GetPsexecDir(), _T("psexec.exe")); |
- CString cmd_line_args; |
- cmd_line_args.Format(_T("-s -d %s"), launch_cmd); |
- |
- PROCESS_INFORMATION pi = {0}; |
- EXPECT_SUCCEEDED(System::StartProcessWithArgsAndInfo(app_launcher, |
- cmd_line_args, |
- &pi)); |
- ::CloseHandle(pi.hThread); |
- scoped_handle started_process(pi.hProcess); |
- ASSERT_TRUE(started_process); |
- |
- DWORD google_update_pid = 0; |
- EXPECT_EQ(WAIT_OBJECT_0, ::WaitForSingleObject(get(started_process), 30000)); |
- EXPECT_TRUE(::GetExitCodeProcess(get(started_process), &google_update_pid)); |
- DWORD desired_access = |
- PROCESS_QUERY_INFORMATION | SYNCHRONIZE | PROCESS_TERMINATE; |
- *process = ::OpenProcess(desired_access, false, google_update_pid); |
- DWORD last_error(::GetLastError()); |
- |
- // psexec sometimes returns errors instead of PIDs and there is no way to |
- // tell the difference. We see ERROR_SERVICE_MARKED_FOR_DELETE (1072) |
- // intermittently on the build server, but do not expect any other errors. |
- EXPECT_TRUE(*process || |
- ERROR_SERVICE_MARKED_FOR_DELETE == google_update_pid) << |
- _T("::OpenProcess failed in a case where psexec did not return ") |
- _T("ERROR_SERVICE_MARKED_FOR_DELETE.") << _T(" The error was ") |
- << last_error << _T("."); |
-} |
- |
-void LaunchProcess(const CString& exe_path, |
- const CString& args, |
- bool as_system, |
- HANDLE* process) { |
- ASSERT_TRUE(process); |
- *process = NULL; |
- |
- CString launch_cmd = exe_path; |
- EnclosePath(&launch_cmd); |
- launch_cmd += args.IsEmpty() ? _T("") : _T(" ") + args; |
- |
- if (as_system) { |
- // Retry the process launch if the process handle is invalid. Hopefully this |
- // is robust against intermittent ERROR_SERVICE_MARKED_FOR_DELETE errors. |
- for (int tries = 0; tries < 10 && !*process; ++tries) { |
- LaunchProcessAsSystem(launch_cmd, process); |
- if (!*process) { |
- ::Sleep(1000); |
- } |
- } |
- } else { |
- PROCESS_INFORMATION pi = {0}; |
- EXPECT_SUCCEEDED(System::StartProcess(NULL, launch_cmd.GetBuffer(), &pi)); |
- ::CloseHandle(pi.hThread); |
- *process = pi.hProcess; |
- } |
- |
- ASSERT_TRUE(*process); |
-} |
- |
-void RegistryProtectedTest::SetUp() { |
- RegKey::DeleteKey(hive_override_key_name_, true); |
- OverrideRegistryHives(hive_override_key_name_); |
-} |
- |
-void RegistryProtectedTest::TearDown() { |
- RestoreRegistryHives(); |
- ASSERT_SUCCEEDED(RegKey::DeleteKey(hive_override_key_name_, true)); |
-} |
- |
-CString GetUniqueTempDirectoryName() { |
- CString guid; |
- EXPECT_HRESULT_SUCCEEDED(GetGuid(&guid)); |
- return ConcatenatePath(app_util::GetTempDir(), guid); |
-} |
- |
-void RunAsAdmin(const CString& exe_path, const CString& cmd_line) { |
- if (vista_util::IsUserAdmin()) { |
- EXPECT_SUCCEEDED(RegisterOrUnregisterExe(exe_path, cmd_line)); |
- return; |
- } |
- |
- // Elevate for medium integrity users on Vista and above. |
- DWORD exit_code(S_OK); |
- EXPECT_SUCCEEDED(vista_util::RunElevated(exe_path, |
- cmd_line, |
- SW_SHOWNORMAL, |
- &exit_code)); |
- EXPECT_SUCCEEDED(exit_code); |
-} |
- |
-void RegisterOrUnregisterGoopdateLocalServer(bool reg) { |
- CString server_path = ConcatenatePath(GetGoogleUpdateMachinePath(), |
- kOmahaShellFileName); |
- EnclosePath(&server_path); |
- |
- CommandLineBuilder builder(reg ? COMMANDLINE_MODE_REGSERVER : |
- COMMANDLINE_MODE_UNREGSERVER); |
- CString cmd_line = builder.GetCommandLineArgs(); |
- RunAsAdmin(server_path, cmd_line); |
-} |
- |
-void RegisterOrUnregisterGoopdateService(bool reg) { |
- CString service_path = ConcatenatePath(GetGoogleUpdateMachinePath(), |
- kServiceFileName); |
- EnclosePath(&service_path); |
- |
- CommandLineBuilder builder(reg ? COMMANDLINE_MODE_SERVICE_REGISTER : |
- COMMANDLINE_MODE_SERVICE_UNREGISTER); |
- CString cmd_line = builder.GetCommandLineArgs(); |
- RunAsAdmin(service_path, cmd_line); |
-} |
- |
-} // namespace omaha |