Index: base/utils_unittest.cc |
diff --git a/base/utils_unittest.cc b/base/utils_unittest.cc |
deleted file mode 100644 |
index 582a490fdf727776a20d27d20adcdb6772c633f8..0000000000000000000000000000000000000000 |
--- a/base/utils_unittest.cc |
+++ /dev/null |
@@ -1,749 +0,0 @@ |
-// Copyright 2003-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 <ATLComTime.h> |
-#include <atltypes.h> |
-#include <atlwin.h> |
-#include <map> |
-#include <vector> |
-#include "omaha/base/app_util.h" |
-#include "omaha/base/atl_regexp.h" |
-#include "omaha/base/constants.h" |
-#include "omaha/base/dynamic_link_kernel32.h" |
-#include "omaha/base/file.h" |
-#include "omaha/base/module_utils.h" |
-#include "omaha/base/path.h" |
-#include "omaha/base/shell.h" |
-#include "omaha/base/string.h" |
-#include "omaha/base/time.h" |
-#include "omaha/base/user_info.h" |
-#include "omaha/base/utils.h" |
-#include "omaha/base/scoped_any.h" |
-#include "omaha/base/system_info.h" |
-#include "omaha/base/vistautil.h" |
-#include "omaha/testing/unit_test.h" |
- |
-namespace omaha { |
- |
-// Make sure that the time functions work. |
-TEST(UtilsTest, Time) { |
- // TODO(omaha): - add a test from string to time and back again. |
- // Further test the time converters. |
- time64 now = GetCurrent100NSTime(); |
- ASSERT_TRUE(StringToTime(TimeToString(now)) == now); |
- |
- // Test GetTimeCategory. |
- ASSERT_EQ(PAST, |
- GetTimeCategory(static_cast<time64>(0))); |
- ASSERT_EQ(PRESENT, |
- GetTimeCategory(static_cast<time64>(now))); |
- ASSERT_EQ(PRESENT, |
- GetTimeCategory(static_cast<time64>(now - kDaysTo100ns))); |
- ASSERT_EQ(PRESENT, |
- GetTimeCategory(static_cast<time64>(now - 365 * kDaysTo100ns))); |
- // A little bit in the future is also considered present. |
- ASSERT_EQ(PRESENT, |
- GetTimeCategory(static_cast<time64>(now + kDaysTo100ns))); |
- ASSERT_EQ(PRESENT, |
- GetTimeCategory(static_cast<time64>( |
- now - 30 * 365 * kDaysTo100ns))); |
- ASSERT_EQ(PAST, |
- GetTimeCategory(static_cast<time64>( |
- now - 50 * 365 * kDaysTo100ns))); |
- ASSERT_EQ(FUTURE, |
- GetTimeCategory(static_cast<time64>(now + kDaysTo100ns * 6))); |
- ASSERT_EQ(FUTURE, |
- GetTimeCategory(static_cast<time64>(now + 365 * kDaysTo100ns))); |
- |
- // Test IsValidTime. |
- ASSERT_FALSE(IsValidTime(static_cast<time64>(0))); |
- ASSERT_TRUE(IsValidTime(static_cast<time64>(now))); |
- ASSERT_TRUE(IsValidTime(static_cast<time64>(now - 365 * kDaysTo100ns))); |
- ASSERT_TRUE(IsValidTime(static_cast<time64>(now - 10 * 365 * kDaysTo100ns))); |
- ASSERT_TRUE(IsValidTime(static_cast<time64>(now + kDaysTo100ns))); |
- ASSERT_FALSE(IsValidTime(static_cast<time64>(now - 50 * 365 * kDaysTo100ns))); |
- ASSERT_FALSE(IsValidTime(static_cast<time64>(now + 50 * 365 * kDaysTo100ns))); |
- ASSERT_FALSE(IsValidTime(static_cast<time64>(now + kDaysTo100ns * 6))); |
-} |
- |
-TEST(UtilsTest, GetFolderPath_Success) { |
- CString path; |
- EXPECT_SUCCEEDED(GetFolderPath(CSIDL_PROGRAM_FILES, &path)); |
- BOOL isWow64 = FALSE; |
- EXPECT_SUCCEEDED(Kernel32::IsWow64Process(GetCurrentProcess(), &isWow64)); |
- CString expected_path = isWow64 ? |
- _T("C:\\Program Files (x86)") : _T("C:\\Program Files"); |
- EXPECT_STREQ(expected_path, path); |
-} |
- |
-TEST(UtilsTest, GetFolderPath_Errors) { |
- CString path; |
- EXPECT_EQ(E_INVALIDARG, GetFolderPath(0x7fff, &path)); |
- EXPECT_TRUE(path.IsEmpty()); |
- EXPECT_EQ(E_INVALIDARG, GetFolderPath(CSIDL_PROGRAM_FILES, NULL)); |
-} |
- |
-TEST(UtilsTest, CallEntryPoint0) { |
- HRESULT hr(E_FAIL); |
- ASSERT_FAILED(CallEntryPoint0(L"random-nonsense.dll", "foobar", &hr)); |
-} |
- |
-TEST(UtilsTest, ReadEntireFile) { |
- TCHAR directory[MAX_PATH] = {0}; |
- ASSERT_TRUE(GetModuleDirectory(NULL, directory)); |
- CString file_name; |
- file_name.Format(_T("%s\\unittest_support\\declaration.txt"), directory); |
- |
- std::vector<byte> buffer; |
- ASSERT_FAILED(ReadEntireFile(L"C:\\F00Bar\\ImaginaryFile", 0, &buffer)); |
- |
- ASSERT_SUCCEEDED(ReadEntireFile(file_name, 0, &buffer)); |
- ASSERT_EQ(9405, buffer.size()); |
- buffer.resize(0); |
- ASSERT_FAILED(ReadEntireFile(L"C:\\WINDOWS\\Greenstone.bmp", 1000, &buffer)); |
-} |
- |
-// TODO(omaha): Need a test for WriteEntireFile |
-// TEST(UtilsTest, WriteEntireFile) { |
-// } |
- |
-TEST(UtilsTest, RegSplitKeyvalueName) { |
- CString key_name, value_name; |
- ASSERT_SUCCEEDED(RegSplitKeyvalueName(CString(L"HKLM\\Foo\\"), |
- &key_name, |
- &value_name)); |
- ASSERT_STREQ(key_name, L"HKLM\\Foo"); |
- ASSERT_TRUE(value_name.IsEmpty()); |
- |
- ASSERT_SUCCEEDED(RegSplitKeyvalueName(CString(L"HKLM\\Foo\\(default)"), |
- &key_name, |
- &value_name)); |
- ASSERT_STREQ(key_name, L"HKLM\\Foo"); |
- ASSERT_TRUE(value_name.IsEmpty()); |
- |
- ASSERT_SUCCEEDED(RegSplitKeyvalueName(CString(L"HKLM\\Foo\\Bar"), |
- &key_name, |
- &value_name)); |
- ASSERT_STREQ(key_name, L"HKLM\\Foo"); |
- ASSERT_STREQ(value_name, L"Bar"); |
-} |
- |
-TEST(UtilsTest, ExpandEnvLikeStrings) { |
- std::map<CString, CString> mapping; |
- ASSERT_SUCCEEDED(Shell::GetSpecialFolderKeywordsMapping(&mapping)); |
- |
- CString out; |
- ASSERT_SUCCEEDED(ExpandEnvLikeStrings( |
- L"Foo%WINDOWS%Bar%SYSTEM%Zebra%WINDOWS%%SYSTEM%", mapping, &out)); |
- |
- // This should work, but CmpHelperSTRCASEEQ is not overloaded for wchars. |
- // ASSERT_STRCASEEQ(out, L"FooC:\\WINDOWSBarC:\\WINDOWS\\system32Zebra" |
- // L"C:\\WINDOWSC:\\WINDOWS\\system32"); |
- ASSERT_EQ(out.CompareNoCase(L"FooC:\\WINDOWSBarC:\\WINDOWS\\system32Zebra" |
- L"C:\\WINDOWSC:\\WINDOWS\\system32"), |
- 0); |
- ASSERT_FAILED(ExpandEnvLikeStrings(L"Foo%WINDOWS%%BAR%Zebra", mapping, &out)); |
-} |
- |
-TEST(UtilsTest, GetCurrentProcessHandle) { |
- scoped_process proc; |
- ASSERT_SUCCEEDED(GetCurrentProcessHandle(address(proc))); |
- ASSERT_TRUE(valid(proc)); |
-} |
- |
-TEST(UtilsTest, DuplicateTokenIntoCurrentProcess) { |
- CAccessToken process_token; |
- EXPECT_TRUE(process_token.GetProcessToken(TOKEN_ALL_ACCESS)); |
- |
- CAccessToken duplicated_token; |
- EXPECT_SUCCEEDED(DuplicateTokenIntoCurrentProcess(::GetCurrentProcess(), |
- process_token.GetHandle(), |
- &duplicated_token)); |
- |
- CSid process_sid; |
- EXPECT_TRUE(process_token.GetUser(&process_sid)); |
- |
- CSid duplicated_sid; |
- EXPECT_TRUE(duplicated_token.GetUser(&duplicated_sid)); |
- |
- EXPECT_STREQ(process_sid.Sid(), duplicated_sid.Sid()); |
-} |
- |
-TEST(UtilsTest, IsGuid) { |
- EXPECT_FALSE(IsGuid(NULL)); |
- EXPECT_FALSE(IsGuid(_T(""))); |
- EXPECT_FALSE(IsGuid(_T("{}"))); |
- EXPECT_FALSE(IsGuid(_T("a"))); |
- EXPECT_FALSE(IsGuid(_T("CA3045BFA6B14fb8A0EFA615CEFE452C"))); |
- |
- // Missing {} |
- EXPECT_FALSE(IsGuid(_T("CA3045BF-A6B1-4fb8-A0EF-A615CEFE452C"))); |
- |
- // Invalid char X |
- EXPECT_FALSE(IsGuid(_T("{XA3045BF-A6B1-4fb8-A0EF-A615CEFE452C}"))); |
- |
- // Invalid binary char 0x200 |
- EXPECT_FALSE(IsGuid(_T("{\0x200a3045bf-a6b1-4fb8-a0ef-a615cefe452c}"))); |
- |
- // Missing - |
- EXPECT_FALSE(IsGuid(_T("{CA3045BFA6B14fb8A0EFA615CEFE452C}"))); |
- |
- // Double quotes |
- EXPECT_FALSE(IsGuid(_T("\"{ca3045bf-a6b1-4fb8-a0ef-a615cefe452c}\""))); |
- |
- EXPECT_TRUE(IsGuid(_T("{00000000-0000-0000-0000-000000000000}"))); |
- EXPECT_TRUE(IsGuid(_T("{CA3045BF-A6B1-4fb8-A0EF-A615CEFE452C}"))); |
- EXPECT_TRUE(IsGuid(_T("{ca3045bf-a6b1-4fb8-a0ef-a615cefe452c}"))); |
-} |
- |
-// GUIDs cannot be compared in GTest because there is no << operator. Therefore, |
-// we must treat them as strings. All these tests rely on GuidToString working. |
-#define EXPECT_GUID_EQ(expected, actual) \ |
- EXPECT_STREQ(GuidToString(expected), GuidToString(actual)) |
- |
-TEST(UtilsTest, StringToGuidSafe_InvalidString) { |
- GUID guid = {0}; |
- |
- EXPECT_EQ(E_INVALIDARG, StringToGuidSafe(_T(""), &guid)); |
- EXPECT_EQ(E_INVALIDARG, StringToGuidSafe(_T("{}"), &guid)); |
- EXPECT_EQ(E_INVALIDARG, StringToGuidSafe(_T("a"), &guid)); |
- EXPECT_EQ(E_INVALIDARG, |
- StringToGuidSafe(_T("CA3045BFA6B14fb8A0EFA615CEFE452C"), &guid)); |
- |
- // Missing {} |
- EXPECT_EQ(E_INVALIDARG, |
- StringToGuidSafe(_T("CA3045BF-A6B1-4fb8-A0EF-A615CEFE452C"), &guid)); |
- |
- // Invalid char X |
- EXPECT_EQ(CO_E_IIDSTRING, |
- StringToGuidSafe(_T("{XA3045BF-A6B1-4fb8-A0EF-A615CEFE452C}"), &guid)); |
- |
- // Invalid binary char 0x200 |
- EXPECT_EQ(E_INVALIDARG, |
- StringToGuidSafe(_T("{\0x200a3045bf-a6b1-4fb8-a0ef-a615cefe452c}"), |
- &guid)); |
- |
- // Missing - |
- EXPECT_EQ(E_INVALIDARG, |
- StringToGuidSafe(_T("{CA3045BFA6B14fb8A0EFA615CEFE452C}"), &guid)); |
- |
- // Double quotes |
- EXPECT_EQ(E_INVALIDARG, |
- StringToGuidSafe(_T("\"{ca3045bf-a6b1-4fb8-a0ef-a615cefe452c}\""), |
- &guid)); |
-} |
- |
-TEST(UtilsTest, StringToGuidSafe_ValidString) { |
- const GUID kExpectedGuid = {0xCA3045BF, 0xA6B1, 0x4FB8, |
- {0xA0, 0xEF, 0xA6, 0x15, 0xCE, 0xFE, 0x45, 0x2C}}; |
- GUID guid = kExpectedGuid; |
- |
- EXPECT_SUCCEEDED( |
- StringToGuidSafe(_T("{00000000-0000-0000-0000-000000000000}"), &guid)); |
- EXPECT_GUID_EQ(GUID_NULL, guid); |
- |
- guid = GUID_NULL; |
- EXPECT_SUCCEEDED( |
- StringToGuidSafe(_T("{CA3045BF-A6B1-4fb8-A0EF-A615CEFE452C}"), &guid)); |
- EXPECT_GUID_EQ(kExpectedGuid, guid); |
- |
- guid = GUID_NULL; |
- EXPECT_SUCCEEDED( |
- StringToGuidSafe(_T("{ca3045bf-a6b1-4fb8-a0ef-a615cefe452c}"), &guid)); |
- EXPECT_GUID_EQ(kExpectedGuid, guid); |
-} |
- |
-TEST(UtilsTest, VersionFromString_ValidVersion) { |
- EXPECT_EQ(MAKEDLLVERULL(42, 1, 21, 12345), |
- VersionFromString(_T("42.1.21.12345"))); |
-} |
- |
-TEST(UtilsTest, VersionFromString_VersionZero) { |
- EXPECT_EQ(0, VersionFromString(_T("0.0.0.0"))); |
-} |
- |
-TEST(UtilsTest, VersionFromString_VersionUpperLimits) { |
- EXPECT_EQ(MAKEDLLVERULL(0xffff, 0xffff, 0xffff, 0xffff), |
- VersionFromString(_T("65535.65535.65535.65535"))); |
- EXPECT_EQ(0, VersionFromString(_T("65536.65536.65536.65536"))); |
- EXPECT_EQ(0, VersionFromString(_T("1.2.65536.65536"))); |
-} |
- |
-TEST(UtilsTest, VersionFromString_IntegerOverflow) { |
- EXPECT_EQ(0, VersionFromString(_T("1.2.3.4294967296"))); |
-} |
- |
-TEST(UtilsTest, VersionFromString_NegativeVersion) { |
- EXPECT_EQ(0, VersionFromString(_T("1.2.3.-22"))); |
-} |
- |
-TEST(UtilsTest, VersionFromString_TooFewElements) { |
- EXPECT_EQ(0, VersionFromString(_T("1.1.1"))); |
-} |
- |
-TEST(UtilsTest, VersionFromString_ExtraPeriod) { |
- EXPECT_EQ(0, VersionFromString(_T("1.1.2.3."))); |
-} |
- |
-TEST(UtilsTest, VersionFromString_TooManyElements) { |
- EXPECT_EQ(0, VersionFromString(_T("1.1.2.3.4"))); |
-} |
- |
-TEST(UtilsTest, VersionFromString_Char) { |
- EXPECT_EQ(0, VersionFromString(_T("1.B.3.4"))); |
- EXPECT_EQ(0, VersionFromString(_T("1.2.3.B"))); |
- EXPECT_EQ(0, VersionFromString(_T("1.2.3.9B"))); |
-} |
- |
-TEST(UtilsTest, StringFromVersion_ValidVersion) { |
- EXPECT_STREQ(_T("42.1.21.12345"), |
- StringFromVersion(MAKEDLLVERULL(42, 1, 21, 12345))); |
-} |
- |
-TEST(UtilsTest, StringFromVersion_VersionZero) { |
- EXPECT_STREQ(_T("0.0.0.0"), StringFromVersion(0)); |
-} |
- |
-TEST(UtilsTest, StringFromVersion_VersionUpperLimits) { |
- EXPECT_STREQ( |
- _T("65535.65535.65535.65535"), |
- StringFromVersion(MAKEDLLVERULL(0xffff, 0xffff, 0xffff, 0xffff))); |
-} |
- |
-TEST(UtilsTest, IsLocalSystemSid) { |
- EXPECT_TRUE(IsLocalSystemSid(kLocalSystemSid)); |
- EXPECT_TRUE(IsLocalSystemSid(_T("S-1-5-18"))); |
- EXPECT_TRUE(IsLocalSystemSid(_T("s-1-5-18"))); |
- |
- EXPECT_FALSE(IsLocalSystemSid(_T(""))); |
- EXPECT_FALSE(IsLocalSystemSid(_T("S-1-5-17"))); |
-} |
- |
-// There is a very small probability the test could fail. |
-TEST(UtilsTest, GenRandom) { |
- int random_int = 0; |
- EXPECT_TRUE(GenRandom(&random_int, sizeof(random_int))); |
- EXPECT_NE(random_int, 0); |
- |
- int another_random_int = 0; |
- EXPECT_TRUE(GenRandom(&another_random_int, sizeof(another_random_int))); |
- EXPECT_NE(another_random_int, 0); |
- |
- EXPECT_NE(random_int, another_random_int); |
-} |
- |
-// Counts instances of the class. |
-class Counter { |
- public: |
- Counter() { |
- ++instance_count_; |
- } |
- ~Counter() { |
- --instance_count_; |
- } |
- static int instance_count() { return instance_count_; } |
- private: |
- static int instance_count_; |
- DISALLOW_EVIL_CONSTRUCTORS(Counter); |
-}; |
- |
-int Counter::instance_count_ = 0; |
- |
-// Checks if the functor is actually calling the destructor of the type. |
-TEST(UtilsTest, DeleteFun) { |
- EXPECT_EQ(Counter::instance_count(), 0); |
- Counter* counter = new Counter; |
- EXPECT_EQ(Counter::instance_count(), 1); |
- DeleteFun().operator()(counter); |
- EXPECT_EQ(Counter::instance_count(), 0); |
- |
- // Checks if the template can be instantiated for some common built in types. |
- int* pointer_int = NULL; |
- DeleteFun().operator()(pointer_int); |
- |
- const char* pointer_char = NULL; |
- DeleteFun().operator()(pointer_char); |
-} |
- |
-TEST(UtilsTest, IsUserLoggedOn) { |
- bool is_logged_on(false); |
- ASSERT_HRESULT_SUCCEEDED(IsUserLoggedOn(&is_logged_on)); |
- ASSERT_TRUE(is_logged_on); |
-} |
- |
-TEST(UtilsTest, IsClickOnceDisabled) { |
- EXPECT_FALSE(IsClickOnceDisabled()); |
-} |
- |
-TEST(UtilsTest, ConfigureRunAtStartup) { |
- const TCHAR kRunKeyPath[] = |
- _T("HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run"); |
- |
- RegKey::DeleteKey(kRegistryHiveOverrideRoot, true); |
- OverrideRegistryHives(kRegistryHiveOverrideRoot); |
- |
- EXPECT_FALSE(RegKey::HasKey(kRunKeyPath)); |
- |
- EXPECT_EQ(HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), |
- ConfigureRunAtStartup(USER_KEY_NAME, _T("FooApp"), |
- _T("\"foo.exe\""), false)); |
- EXPECT_FALSE(RegKey::HasKey(kRunKeyPath)); |
- |
- EXPECT_SUCCEEDED(ConfigureRunAtStartup(USER_KEY_NAME, _T("FooApp"), |
- _T("\"C:\\foo.exe\" /x"), true)); |
- CString value; |
- EXPECT_SUCCEEDED(RegKey::GetValue(kRunKeyPath, _T("FooApp"), &value)); |
- EXPECT_STREQ(_T("\"C:\\foo.exe\" /x"), value); |
- |
- EXPECT_SUCCEEDED(ConfigureRunAtStartup(USER_KEY_NAME, _T("FooApp"), |
- _T("\"foo.exe\""), false)); |
- EXPECT_FALSE(RegKey::HasValue(kRunKeyPath, _T("FooApp"))); |
- EXPECT_TRUE(RegKey::HasKey(kRunKeyPath)); |
- |
- RestoreRegistryHives(); |
- EXPECT_SUCCEEDED(RegKey::DeleteKey(kRegistryHiveOverrideRoot, true)); |
-} |
- |
-TEST(UtilsTest, ValidPath) { |
- CString cmd_line = |
- _T("\"C:\\Program Files\\Internet Explorer\\iexplore.exe\" -nohome"); |
- CString exe_path; |
- EXPECT_SUCCEEDED(GetExePathFromCommandLine(cmd_line, &exe_path)); |
- EXPECT_STREQ(_T("C:\\Program Files\\Internet Explorer\\iexplore.exe"), |
- exe_path); |
-} |
- |
-TEST(UtilsTest, InvalidPath) { |
- CString cmd_line = _T(""); |
- CString exe_path; |
- EXPECT_FAILED(GetExePathFromCommandLine(cmd_line, &exe_path)); |
- EXPECT_TRUE(exe_path.IsEmpty()); |
-} |
- |
-TEST(UtilsTest, PinModuleIntoProcess) { |
- const TCHAR module_name[] = _T("icmp.dll"); |
- const void* kNullModule = NULL; |
- |
- // The module should not be loaded at this time. |
- EXPECT_EQ(kNullModule, ::GetModuleHandle(module_name)); |
- |
- // Loads and unloads the module. |
- { |
- scoped_library module(::LoadLibrary(module_name)); |
- EXPECT_TRUE(module); |
- EXPECT_NE(kNullModule, ::GetModuleHandle(module_name)); |
- } |
- EXPECT_EQ(kNullModule, ::GetModuleHandle(module_name)); |
- |
- // Loads, pins, and unloads the module. |
- { |
- scoped_library module(::LoadLibrary(module_name)); |
- EXPECT_TRUE(module); |
- EXPECT_NE(kNullModule, ::GetModuleHandle(module_name)); |
- PinModuleIntoProcess(module_name); |
- } |
- EXPECT_NE(kNullModule, ::GetModuleHandle(module_name)); |
-} |
- |
-// Assumes Windows is installed on the C: drive. |
-TEST(UtilsTest, GetEnvironmentVariableAsString) { |
- EXPECT_STREQ(_T("C:"), GetEnvironmentVariableAsString(_T("SystemDrive"))); |
- EXPECT_STREQ(_T("Windows_NT"), GetEnvironmentVariableAsString(_T("OS"))); |
- EXPECT_STREQ(_T(""), GetEnvironmentVariableAsString(_T("FOO"))); |
-} |
- |
-TEST(UtilsTest, IsWindowsInstalling_Normal) { |
- EXPECT_FALSE(IsWindowsInstalling()); |
-} |
- |
-TEST(UtilsTest, IsWindowsInstalling_Installing_Vista_InvalidValues) { |
- if (!vista_util::IsVistaOrLater()) { |
- return; |
- } |
- |
- RegKey::DeleteKey(kRegistryHiveOverrideRoot, true); |
- OverrideRegistryHives(kRegistryHiveOverrideRoot); |
- |
- EXPECT_SUCCEEDED(RegKey::SetValue( |
- _T("HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Setup\\State"), |
- _T("ImageState"), |
- _T(""))); |
- EXPECT_FALSE(IsWindowsInstalling()); |
- |
- EXPECT_SUCCEEDED(RegKey::SetValue( |
- _T("HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Setup\\State"), |
- _T("ImageState"), |
- _T("foo"))); |
- EXPECT_FALSE(IsWindowsInstalling()); |
- |
- EXPECT_SUCCEEDED(RegKey::SetValue( |
- _T("HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Setup\\State"), |
- _T("ImageState"), |
- static_cast<DWORD>(1))); |
- ExpectAsserts expect_asserts; // RegKey asserts because value type is wrong. |
- EXPECT_FALSE(IsWindowsInstalling()); |
- |
- RestoreRegistryHives(); |
- EXPECT_SUCCEEDED(RegKey::DeleteKey(kRegistryHiveOverrideRoot, true)); |
-} |
- |
-TEST(UtilsTest, IsWindowsInstalling_Installing_Vista_ValidStates) { |
- if (!vista_util::IsVistaOrLater()) { |
- return; |
- } |
- |
- RegKey::DeleteKey(kRegistryHiveOverrideRoot, true); |
- OverrideRegistryHives(kRegistryHiveOverrideRoot); |
- |
- // These states return false in the original implementation. |
- EXPECT_SUCCEEDED(RegKey::SetValue( |
- _T("HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Setup\\State"), |
- _T("ImageState"), |
- _T("IMAGE_STATE_COMPLETE"))); |
- EXPECT_FALSE(IsWindowsInstalling()); |
- |
- EXPECT_SUCCEEDED(RegKey::SetValue( |
- _T("HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Setup\\State"), |
- _T("ImageState"), |
- _T("IMAGE_STATE_GENERALIZE_RESEAL_TO_OOBE"))); |
- EXPECT_FALSE(IsWindowsInstalling()); |
- |
- EXPECT_SUCCEEDED(RegKey::SetValue( |
- _T("HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Setup\\State"), |
- _T("ImageState"), |
- _T("IMAGE_STATE_SPECIALIZE_RESEAL_TO_OOBE"))); |
- EXPECT_FALSE(IsWindowsInstalling()); |
- |
- // These states are specified in the original implementation. |
- EXPECT_SUCCEEDED(RegKey::SetValue( |
- _T("HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Setup\\State"), |
- _T("ImageState"), |
- _T("IMAGE_STATE_UNDEPLOYABLE"))); |
- EXPECT_TRUE(IsWindowsInstalling()); |
- |
- EXPECT_SUCCEEDED(RegKey::SetValue( |
- _T("HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Setup\\State"), |
- _T("ImageState"), |
- _T("IMAGE_STATE_GENERALIZE_RESEAL_TO_AUDIT"))); |
- EXPECT_TRUE(IsWindowsInstalling()); |
- |
- EXPECT_SUCCEEDED(RegKey::SetValue( |
- _T("HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Setup\\State"), |
- _T("ImageState"), |
- _T("IMAGE_STATE_SPECIALIZE_RESEAL_TO_AUDIT"))); |
- EXPECT_TRUE(IsWindowsInstalling()); |
- |
- RestoreRegistryHives(); |
- EXPECT_SUCCEEDED(RegKey::DeleteKey(kRegistryHiveOverrideRoot, true)); |
-} |
- |
-TEST(UtilsTest, AddAllowedAce) { |
- CString test_file_path = ConcatenatePath( |
- app_util::GetCurrentModuleDirectory(), _T("TestAddAllowedAce.exe")); |
- EXPECT_SUCCEEDED(File::Remove(test_file_path)); |
- |
- EXPECT_SUCCEEDED(File::Copy( |
- ConcatenatePath(app_util::GetCurrentModuleDirectory(), |
- _T("GoogleUpdate.exe")), |
- test_file_path, |
- false)); |
- |
- CDacl dacl; |
- EXPECT_TRUE(AtlGetDacl(test_file_path, SE_FILE_OBJECT, &dacl)); |
- const int original_ace_count = dacl.GetAceCount(); |
- |
- EXPECT_SUCCEEDED(AddAllowedAce(test_file_path, |
- SE_FILE_OBJECT, |
- Sids::Dialup(), |
- FILE_GENERIC_READ, |
- 0)); |
- |
- dacl.SetEmpty(); |
- EXPECT_TRUE(AtlGetDacl(test_file_path, SE_FILE_OBJECT, &dacl)); |
- EXPECT_EQ(original_ace_count + 1, dacl.GetAceCount()); |
- |
- // Add the same access. No ACE is added. |
- EXPECT_SUCCEEDED(AddAllowedAce(test_file_path, |
- SE_FILE_OBJECT, |
- Sids::Dialup(), |
- FILE_GENERIC_READ, |
- 0)); |
- dacl.SetEmpty(); |
- EXPECT_TRUE(AtlGetDacl(test_file_path, SE_FILE_OBJECT, &dacl)); |
- EXPECT_EQ(original_ace_count + 1, dacl.GetAceCount()); |
- |
- // Add a subset of the existing access. No ACE is added. |
- EXPECT_EQ(FILE_READ_ATTRIBUTES, FILE_GENERIC_READ & FILE_READ_ATTRIBUTES); |
- EXPECT_SUCCEEDED(AddAllowedAce(test_file_path, |
- SE_FILE_OBJECT, |
- Sids::Dialup(), |
- FILE_READ_ATTRIBUTES, |
- 0)); |
- dacl.SetEmpty(); |
- EXPECT_TRUE(AtlGetDacl(test_file_path, SE_FILE_OBJECT, &dacl)); |
- EXPECT_EQ(original_ace_count + 1, dacl.GetAceCount()); |
- |
- // Add more access. An ACE is added. |
- EXPECT_SUCCEEDED(AddAllowedAce(test_file_path, |
- SE_FILE_OBJECT, |
- Sids::Dialup(), |
- FILE_ALL_ACCESS, |
- 0)); |
- dacl.SetEmpty(); |
- EXPECT_TRUE(AtlGetDacl(test_file_path, SE_FILE_OBJECT, &dacl)); |
- EXPECT_EQ(original_ace_count + 2, dacl.GetAceCount()); |
- |
- // TODO(omaha): An assert occurs because the ACE flags are being used on a |
- // file object. Add a new test to use a registry key. |
- ExpectAsserts expect_asserts; |
- |
- // Different ACE flags. An ACE is added. |
- const BYTE kTestAce = CONTAINER_INHERIT_ACE | OBJECT_INHERIT_ACE; |
- const BYTE kTestAceSubset = CONTAINER_INHERIT_ACE; |
- EXPECT_SUCCEEDED(AddAllowedAce(test_file_path, |
- SE_FILE_OBJECT, |
- Sids::Dialup(), |
- FILE_ALL_ACCESS, |
- kTestAce)); |
- dacl.SetEmpty(); |
- EXPECT_TRUE(AtlGetDacl(test_file_path, SE_FILE_OBJECT, &dacl)); |
- EXPECT_EQ(original_ace_count + 3, dacl.GetAceCount()); |
- |
- // Subset of existing ACE flags. An ACE is added because flags must be exact. |
- EXPECT_SUCCEEDED(AddAllowedAce(test_file_path, |
- SE_FILE_OBJECT, |
- Sids::Dialup(), |
- FILE_ALL_ACCESS, |
- kTestAceSubset)); |
- dacl.SetEmpty(); |
- EXPECT_TRUE(AtlGetDacl(test_file_path, SE_FILE_OBJECT, &dacl)); |
- EXPECT_EQ(original_ace_count + 4, dacl.GetAceCount()); |
- |
- // Same flags. An ACE should not be added because all values match. |
- // TODO(omaha): This does not work, possibly because the object is a file. |
- // Try the test using a registry key. |
- EXPECT_SUCCEEDED(AddAllowedAce(test_file_path, |
- SE_FILE_OBJECT, |
- Sids::Dialup(), |
- FILE_ALL_ACCESS, |
- kTestAceSubset)); |
- dacl.SetEmpty(); |
- EXPECT_TRUE(AtlGetDacl(test_file_path, SE_FILE_OBJECT, &dacl)); |
- EXPECT_EQ(original_ace_count + 5, dacl.GetAceCount()); |
- |
- EXPECT_SUCCEEDED(File::Remove(test_file_path)); |
-} |
- |
-TEST(UtilsTest, CreateForegroundParentWindowForUAC) { |
- CWindow foreground_parent; |
- foreground_parent.Attach(CreateForegroundParentWindowForUAC()); |
- EXPECT_TRUE(foreground_parent.IsWindow()); |
- EXPECT_TRUE(foreground_parent.IsWindowVisible()); |
- |
- CRect foreground_rect; |
- EXPECT_TRUE(foreground_parent.GetWindowRect(&foreground_rect)); |
- EXPECT_EQ(0, foreground_rect.Width()); |
- EXPECT_EQ(0, foreground_rect.Height()); |
- |
- EXPECT_TRUE((WS_POPUP | WS_VISIBLE) & foreground_parent.GetStyle()); |
- EXPECT_TRUE(WS_EX_TOOLWINDOW & foreground_parent.GetExStyle()); |
- |
- EXPECT_TRUE(foreground_parent.DestroyWindow()); |
-} |
- |
-// Test the atomic exchange of pointer values. |
-TEST(UtilsTest, interlocked_exchange_pointer) { |
- const int i = 10; |
- const int j = 20; |
- |
- const int* volatile pi = &i; |
- const int* pj = &j; |
- |
- const int* old_pi = pi; |
- |
- // pi and pj point to i and j respectively. |
- EXPECT_EQ(10, *pi); |
- EXPECT_EQ(20, *pj); |
- |
- // After the exchange pi<-pj, both pointers point to the same value, in this |
- // case j. |
- int* result = interlocked_exchange_pointer(const_cast<int**>(&pi), pj); |
- EXPECT_EQ(*pj, *pi); |
- EXPECT_EQ(old_pi, result); |
- EXPECT_EQ(10, *old_pi); |
- EXPECT_EQ(20, *pi); |
- |
- // Exchanging a pointer with self is idempotent. |
- old_pi = interlocked_exchange_pointer(const_cast<int**>(&pi), pi); |
- EXPECT_EQ(pi, old_pi); |
- EXPECT_EQ(20, *pi); |
- |
- // Exchanging a pointer with NULL. |
- interlocked_exchange_pointer(const_cast<int**>(&pi), static_cast<int*>(NULL)); |
- EXPECT_EQ(NULL, pi); |
-} |
- |
-TEST(UtilsTest, GetGuid) { |
- CString guid; |
- EXPECT_HRESULT_SUCCEEDED(GetGuid(&guid)); |
- |
- // ATL regexp has many problems including: |
- // * not supporting {n} to repeat a previous item n times. |
- // * not allowing matching on - unless the items around the dash are |
- // enclosed in {}. |
- AtlRE guid_regex(_T("^{\\{{\\h\\h\\h\\h\\h\\h\\h\\h}-{\\h\\h\\h\\h}-{\\h\\h\\h\\h}-{\\h\\h\\h\\h}-{\\h\\h\\h\\h\\h\\h\\h\\h\\h\\h\\h\\h}\\}}$")); // NOLINT |
- |
- CString matched_guid; |
- EXPECT_TRUE(AtlRE::PartialMatch(guid, guid_regex, &matched_guid)); |
- EXPECT_STREQ(guid, matched_guid); |
- |
- // Missing {}. |
- guid = _T("5F5280C6-9674-429b-9FEB-551914EF96B8"); |
- EXPECT_FALSE(AtlRE::PartialMatch(guid, guid_regex)); |
- |
- // Missing -. |
- guid = _T("{5F5280C6.9674-429b-9FEB-551914EF96B8}"); |
- EXPECT_FALSE(AtlRE::PartialMatch(guid, guid_regex)); |
- |
- // Whitespaces. |
- guid = _T(" {5F5280C6.9674-429b-9FEB-551914EF96B8}"); |
- EXPECT_FALSE(AtlRE::PartialMatch(guid, guid_regex)); |
- |
- guid = _T("{5F5280C6.9674-429b-9FEB-551914EF96B8} "); |
- EXPECT_FALSE(AtlRE::PartialMatch(guid, guid_regex)); |
- |
- // Empty string. |
- guid = _T(""); |
- EXPECT_FALSE(AtlRE::PartialMatch(guid, guid_regex)); |
-} |
- |
-TEST(UtilsTest, GetMessageForSystemErrorCode) { |
- CString message = GetMessageForSystemErrorCode(99); |
- EXPECT_TRUE(message.IsEmpty()); |
- |
- message = GetMessageForSystemErrorCode(ERROR_TOO_MANY_SEMAPHORES); |
- EXPECT_FALSE(message.IsEmpty()); |
-} |
- |
-TEST(UtilsTest, CeilingDivide) { |
- EXPECT_EQ(0, CeilingDivide(0, 1)); |
- EXPECT_EQ(1, CeilingDivide(1, 1)); |
- EXPECT_EQ(1, CeilingDivide(1, 2)); |
- EXPECT_EQ(2, CeilingDivide(6, 3)); |
- EXPECT_EQ(4, CeilingDivide(7, 2)); |
-} |
- |
-} // namespace omaha |
- |