win_util_unittest.cc 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. // Copyright (c) 2010 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "base/win/win_util.h"
  5. #include <objbase.h>
  6. #include "base/containers/contains.h"
  7. #include "base/files/file_path.h"
  8. #include "base/scoped_native_library.h"
  9. #include "base/strings/string_util.h"
  10. #include "base/win/scoped_co_mem.h"
  11. #include "testing/gtest/include/gtest/gtest.h"
  12. namespace base {
  13. namespace win {
  14. namespace {
  15. // Saves the current thread's locale ID when initialized, and restores it when
  16. // the instance is going out of scope.
  17. class ThreadLocaleSaver {
  18. public:
  19. ThreadLocaleSaver() : original_locale_id_(GetThreadLocale()) {}
  20. ThreadLocaleSaver(const ThreadLocaleSaver&) = delete;
  21. ThreadLocaleSaver& operator=(const ThreadLocaleSaver&) = delete;
  22. ~ThreadLocaleSaver() { SetThreadLocale(original_locale_id_); }
  23. private:
  24. LCID original_locale_id_;
  25. };
  26. } // namespace
  27. // The test is somewhat silly, because some bots some have UAC enabled and some
  28. // have it disabled. At least we check that it does not crash.
  29. TEST(BaseWinUtilTest, TestIsUACEnabled) {
  30. UserAccountControlIsEnabled();
  31. }
  32. TEST(BaseWinUtilTest, TestGetUserSidString) {
  33. std::wstring user_sid;
  34. EXPECT_TRUE(GetUserSidString(&user_sid));
  35. EXPECT_TRUE(!user_sid.empty());
  36. }
  37. TEST(BaseWinUtilTest, TestGetLoadedModulesSnapshot) {
  38. std::vector<HMODULE> snapshot;
  39. ASSERT_TRUE(GetLoadedModulesSnapshot(::GetCurrentProcess(), &snapshot));
  40. size_t original_snapshot_size = snapshot.size();
  41. ASSERT_GT(original_snapshot_size, 0u);
  42. snapshot.clear();
  43. // Load in a new module. Pick zipfldr.dll as it is present from WinXP to
  44. // Win10, including ARM64 Win10, and yet rarely used.
  45. const FilePath::CharType dll_name[] = FILE_PATH_LITERAL("zipfldr.dll");
  46. ASSERT_EQ(nullptr, ::GetModuleHandle(dll_name));
  47. ScopedNativeLibrary new_dll((FilePath(dll_name)));
  48. ASSERT_NE(static_cast<HMODULE>(nullptr), new_dll.get());
  49. ASSERT_TRUE(GetLoadedModulesSnapshot(::GetCurrentProcess(), &snapshot));
  50. ASSERT_GT(snapshot.size(), original_snapshot_size);
  51. ASSERT_TRUE(Contains(snapshot, new_dll.get()));
  52. }
  53. TEST(BaseWinUtilTest, TestUint32ToInvalidHandle) {
  54. // Ensure that INVALID_HANDLE_VALUE is preserved when going to a 32-bit value
  55. // and back on 64-bit platforms.
  56. uint32_t invalid_handle = HandleToUint32(INVALID_HANDLE_VALUE);
  57. EXPECT_EQ(INVALID_HANDLE_VALUE, Uint32ToHandle(invalid_handle));
  58. }
  59. TEST(BaseWinUtilTest, WStringFromGUID) {
  60. const GUID kGuid = {0x7698f759,
  61. 0xf5b0,
  62. 0x4328,
  63. {0x92, 0x38, 0xbd, 0x70, 0x8a, 0x6d, 0xc9, 0x63}};
  64. const base::WStringPiece kGuidStr = L"{7698F759-F5B0-4328-9238-BD708A6DC963}";
  65. auto guid_wstring = WStringFromGUID(kGuid);
  66. EXPECT_EQ(guid_wstring, kGuidStr);
  67. wchar_t guid_wchar[39];
  68. ::StringFromGUID2(kGuid, guid_wchar, std::size(guid_wchar));
  69. EXPECT_STREQ(guid_wstring.c_str(), guid_wchar);
  70. ScopedCoMem<OLECHAR> clsid_string;
  71. ::StringFromCLSID(kGuid, &clsid_string);
  72. EXPECT_STREQ(guid_wstring.c_str(), clsid_string.get());
  73. }
  74. TEST(BaseWinUtilTest, GetWindowObjectName) {
  75. std::wstring created_desktop_name(L"test_desktop");
  76. HDESK desktop_handle =
  77. ::CreateDesktop(created_desktop_name.c_str(), nullptr, nullptr, 0,
  78. DESKTOP_CREATEWINDOW | DESKTOP_READOBJECTS |
  79. READ_CONTROL | WRITE_DAC | WRITE_OWNER,
  80. nullptr);
  81. ASSERT_NE(desktop_handle, nullptr);
  82. EXPECT_EQ(created_desktop_name, GetWindowObjectName(desktop_handle));
  83. ASSERT_TRUE(::CloseDesktop(desktop_handle));
  84. }
  85. TEST(BaseWinUtilTest, IsRunningUnderDesktopName) {
  86. HDESK thread_desktop = ::GetThreadDesktop(::GetCurrentThreadId());
  87. ASSERT_NE(thread_desktop, nullptr);
  88. std::wstring desktop_name = GetWindowObjectName(thread_desktop);
  89. EXPECT_TRUE(IsRunningUnderDesktopName(desktop_name));
  90. EXPECT_TRUE(IsRunningUnderDesktopName(
  91. AsWString(ToLowerASCII(AsStringPiece16(desktop_name)))));
  92. EXPECT_TRUE(IsRunningUnderDesktopName(
  93. AsWString(ToUpperASCII(AsStringPiece16(desktop_name)))));
  94. EXPECT_FALSE(
  95. IsRunningUnderDesktopName(desktop_name + L"_non_existent_desktop_name"));
  96. }
  97. } // namespace win
  98. } // namespace base