1 // Copyright (c) 2006-2008 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 5 #include <windows.h> 6 7 #include "testing/gtest/include/gtest/gtest.h" 8 #include "base/registry.h" 9 #include "base/string_util.h" 10 #include "base/win_util.h" 11 12 // The test is somewhat silly, because the Vista bots some have UAC enabled 13 // and some have it disabled. At least we check that it does not crash. 14 TEST(BaseWinUtilTest, TestIsUACEnabled) { 15 if (win_util::GetWinVersion() >= win_util::WINVERSION_VISTA) { 16 win_util::UserAccountControlIsEnabled(); 17 } else { 18 EXPECT_TRUE(win_util::UserAccountControlIsEnabled()); 19 } 20 } 21 22 TEST(BaseWinUtilTest, TestGetUserSidString) { 23 std::wstring user_sid; 24 EXPECT_TRUE(win_util::GetUserSidString(&user_sid)); 25 EXPECT_TRUE(!user_sid.empty()); 26 } 27 28 TEST(BaseWinUtilTest, TestGetNonClientMetrics) { 29 NONCLIENTMETRICS metrics = {0}; 30 win_util::GetNonClientMetrics(&metrics); 31 EXPECT_TRUE(metrics.cbSize > 0); 32 EXPECT_TRUE(metrics.iScrollWidth > 0); 33 EXPECT_TRUE(metrics.iScrollHeight > 0); 34 } 35 36 namespace { 37 38 // Saves the current thread's locale ID when initialized, and restores it when 39 // the instance is going out of scope. 40 class ThreadLocaleSaver { 41 public: 42 ThreadLocaleSaver() : original_locale_id_(GetThreadLocale()) {} 43 ~ThreadLocaleSaver() { SetThreadLocale(original_locale_id_); } 44 45 private: 46 LCID original_locale_id_; 47 48 DISALLOW_COPY_AND_ASSIGN(ThreadLocaleSaver); 49 }; 50 51 } // namespace 52 53 TEST(BaseWinUtilTest, FormatMessage) { 54 // Because we cannot write tests of every language, we only test the message 55 // of en-US locale. Here, we change the current locale temporarily. 56 ThreadLocaleSaver thread_locale_saver; 57 WORD language_id = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US); 58 LCID locale_id = MAKELCID(language_id, SORT_DEFAULT); 59 ASSERT_TRUE(SetThreadLocale(locale_id)); 60 61 const int kAccessDeniedErrorCode = 5; 62 SetLastError(kAccessDeniedErrorCode); 63 ASSERT_EQ(GetLastError(), kAccessDeniedErrorCode); 64 std::wstring value; 65 TrimWhitespace(win_util::FormatLastWin32Error(), TRIM_ALL, &value); 66 EXPECT_EQ(std::wstring(L"Access is denied."), value); 67 68 // Manually call the OS function 69 wchar_t * string_buffer = NULL; 70 unsigned string_length = 71 ::FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | 72 FORMAT_MESSAGE_FROM_SYSTEM | 73 FORMAT_MESSAGE_IGNORE_INSERTS, NULL, 74 kAccessDeniedErrorCode, 0, 75 reinterpret_cast<wchar_t *>(&string_buffer), 0, NULL); 76 77 // Verify the call succeeded 78 ASSERT_TRUE(string_length); 79 ASSERT_TRUE(string_buffer); 80 81 // Verify the string is the same by different calls 82 EXPECT_EQ(win_util::FormatLastWin32Error(), std::wstring(string_buffer)); 83 EXPECT_EQ(win_util::FormatMessage(kAccessDeniedErrorCode), 84 std::wstring(string_buffer)); 85 86 // Done with the buffer allocated by ::FormatMessage() 87 LocalFree(string_buffer); 88 } 89