|  | // Copyright (c) 2010 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 "base/win/win_util.h" | 
|  |  | 
|  | #include "base/files/file_path.h" | 
|  | #include "base/macros.h" | 
|  | #include "base/scoped_native_library.h" | 
|  | #include "base/stl_util.h" | 
|  | #include "base/win/win_client_metrics.h" | 
|  | #include "testing/gtest/include/gtest/gtest.h" | 
|  |  | 
|  | namespace base { | 
|  | namespace win { | 
|  |  | 
|  | namespace { | 
|  |  | 
|  | // Saves the current thread's locale ID when initialized, and restores it when | 
|  | // the instance is going out of scope. | 
|  | class ThreadLocaleSaver { | 
|  | public: | 
|  | ThreadLocaleSaver() : original_locale_id_(GetThreadLocale()) {} | 
|  | ~ThreadLocaleSaver() { SetThreadLocale(original_locale_id_); } | 
|  |  | 
|  | private: | 
|  | LCID original_locale_id_; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(ThreadLocaleSaver); | 
|  | }; | 
|  |  | 
|  | }  // namespace | 
|  |  | 
|  | // The test is somewhat silly, because some bots some have UAC enabled and some | 
|  | // have it disabled. At least we check that it does not crash. | 
|  | TEST(BaseWinUtilTest, TestIsUACEnabled) { | 
|  | UserAccountControlIsEnabled(); | 
|  | } | 
|  |  | 
|  | TEST(BaseWinUtilTest, TestGetUserSidString) { | 
|  | std::wstring user_sid; | 
|  | EXPECT_TRUE(GetUserSidString(&user_sid)); | 
|  | EXPECT_TRUE(!user_sid.empty()); | 
|  | } | 
|  |  | 
|  | TEST(BaseWinUtilTest, TestGetNonClientMetrics) { | 
|  | NONCLIENTMETRICS_XP metrics = {0}; | 
|  | GetNonClientMetrics(&metrics); | 
|  | EXPECT_GT(metrics.cbSize, 0u); | 
|  | EXPECT_GT(metrics.iScrollWidth, 0); | 
|  | EXPECT_GT(metrics.iScrollHeight, 0); | 
|  | } | 
|  |  | 
|  | TEST(BaseWinUtilTest, TestGetLoadedModulesSnapshot) { | 
|  | std::vector<HMODULE> snapshot; | 
|  |  | 
|  | ASSERT_TRUE(GetLoadedModulesSnapshot(::GetCurrentProcess(), &snapshot)); | 
|  | size_t original_snapshot_size = snapshot.size(); | 
|  | ASSERT_GT(original_snapshot_size, 0u); | 
|  | snapshot.clear(); | 
|  |  | 
|  | // Load in a new module. Pick msvidc32.dll as it is present from WinXP to | 
|  | // Win10 and yet rarely used. | 
|  | const wchar_t dll_name[] = L"msvidc32.dll"; | 
|  | ASSERT_EQ(NULL, ::GetModuleHandle(dll_name)); | 
|  |  | 
|  | base::ScopedNativeLibrary new_dll((base::FilePath(dll_name))); | 
|  | ASSERT_NE(static_cast<HMODULE>(NULL), new_dll.get()); | 
|  | ASSERT_TRUE(GetLoadedModulesSnapshot(::GetCurrentProcess(), &snapshot)); | 
|  | ASSERT_GT(snapshot.size(), original_snapshot_size); | 
|  | ASSERT_TRUE(base::ContainsValue(snapshot, new_dll.get())); | 
|  | } | 
|  |  | 
|  | TEST(BaseWinUtilTest, TestUint32ToInvalidHandle) { | 
|  | // Ensure that INVALID_HANDLE_VALUE is preserved when going to a 32-bit value | 
|  | // and back on 64-bit platforms. | 
|  | uint32_t invalid_handle = base::win::HandleToUint32(INVALID_HANDLE_VALUE); | 
|  | EXPECT_EQ(INVALID_HANDLE_VALUE, base::win::Uint32ToHandle(invalid_handle)); | 
|  | } | 
|  |  | 
|  | }  // namespace win | 
|  | }  // namespace base |