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