forked from OSchip/llvm-project
[LLDB] On Windows, fix tests
This patch fixes a few issues seen when running `ninja check-lldb` in a Release build with VS2017: - Some binaries couldn't be found (such as lldb-vscode.exe), because .exe wasn't appended to the file name. - Many tests used to fail since our installed locale is in French - the OS error messages are not emitted in English. - Our codepage being Windows-1252, python failed to decode some error messages with accentuations. Differential Revision: https://reviews.llvm.org/D88975
This commit is contained in:
parent
b9225543e8
commit
79809f58b0
|
@ -3,6 +3,8 @@ from __future__ import absolute_import
|
|||
# System modules
|
||||
from distutils.version import LooseVersion
|
||||
from functools import wraps
|
||||
import ctypes
|
||||
import locale
|
||||
import os
|
||||
import platform
|
||||
import re
|
||||
|
@ -592,6 +594,17 @@ def skipIfWindows(func):
|
|||
"""Decorate the item to skip tests that should be skipped on Windows."""
|
||||
return skipIfPlatform(["windows"])(func)
|
||||
|
||||
def skipIfWindowsAndNonEnglish(func):
|
||||
"""Decorate the item to skip tests that should be skipped on non-English locales on Windows."""
|
||||
def is_Windows_NonEnglish(self):
|
||||
if lldbplatformutil.getPlatform() != "windows":
|
||||
return None
|
||||
kernel = ctypes.windll.kernel32
|
||||
if locale.windows_locale[ kernel.GetUserDefaultUILanguage() ] == "en_US":
|
||||
return None
|
||||
return "skipping non-English Windows locale"
|
||||
return skipTestIfFn(is_Windows_NonEnglish)(func)
|
||||
|
||||
def skipUnlessWindows(func):
|
||||
"""Decorate the item to skip tests that should be skipped on any non-Windows platform."""
|
||||
return skipUnlessPlatform(["windows"])(func)
|
||||
|
|
|
@ -52,6 +52,9 @@ def is_exe(fpath):
|
|||
"""Returns true if fpath is an executable."""
|
||||
if fpath == None:
|
||||
return False
|
||||
if sys.platform == 'win32':
|
||||
if not fpath.endswith(".exe"):
|
||||
fpath += ".exe"
|
||||
return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
|
||||
|
||||
|
||||
|
|
|
@ -12,4 +12,4 @@ class BuildError(Exception):
|
|||
@staticmethod
|
||||
def format_build_error(command, command_output):
|
||||
return "Error when building test subject.\n\nBuild Command:\n{}\n\nBuild Command Output:\n{}".format(
|
||||
command, command_output.decode("utf-8"))
|
||||
command, command_output.decode("utf-8", errors='ignore'))
|
||||
|
|
|
@ -350,6 +350,7 @@ class targetCommandTestCase(TestBase):
|
|||
self.expect("target create a b", error=True,
|
||||
substrs=["'target create' takes exactly one executable path"])
|
||||
|
||||
@skipIfWindowsAndNonEnglish
|
||||
@no_debug_info_test
|
||||
def test_target_create_nonexistent_core_file(self):
|
||||
self.expect("target create -c doesntexist", error=True,
|
||||
|
@ -365,6 +366,7 @@ class targetCommandTestCase(TestBase):
|
|||
self.expect("target create -c '" + tf.name + "'", error=True,
|
||||
substrs=["Cannot open '", "': Permission denied"])
|
||||
|
||||
@skipIfWindowsAndNonEnglish
|
||||
@no_debug_info_test
|
||||
def test_target_create_nonexistent_sym_file(self):
|
||||
self.expect("target create -s doesntexist doesntexisteither", error=True,
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
#include "gtest/gtest.h"
|
||||
|
||||
#ifdef _WIN32
|
||||
#include <winerror.h>
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
using namespace lldb_private;
|
||||
|
@ -71,14 +71,26 @@ TEST(StatusTest, ErrorWin32) {
|
|||
EXPECT_FALSE(success.ToError());
|
||||
EXPECT_TRUE(success.Success());
|
||||
|
||||
WCHAR name[128]{};
|
||||
ULONG nameLen = llvm::array_lengthof(name);
|
||||
ULONG langs = 0;
|
||||
GetUserPreferredUILanguages(MUI_LANGUAGE_NAME, &langs,
|
||||
reinterpret_cast<PZZWSTR>(&name), &nameLen);
|
||||
// Skip the following tests on non-English, non-US, locales because the
|
||||
// formatted messages will be different.
|
||||
bool skip = wcscmp(L"en-US", name) != 0;
|
||||
|
||||
auto s = Status(ERROR_ACCESS_DENIED, ErrorType::eErrorTypeWin32);
|
||||
EXPECT_TRUE(s.Fail());
|
||||
EXPECT_STREQ("Access is denied. ", s.AsCString());
|
||||
if (!skip)
|
||||
EXPECT_STREQ("Access is denied. ", s.AsCString());
|
||||
|
||||
s.SetError(ERROR_IPSEC_IKE_TIMED_OUT, ErrorType::eErrorTypeWin32);
|
||||
EXPECT_STREQ("Negotiation timed out ", s.AsCString());
|
||||
if (!skip)
|
||||
EXPECT_STREQ("Negotiation timed out ", s.AsCString());
|
||||
|
||||
s.SetError(16000, ErrorType::eErrorTypeWin32);
|
||||
EXPECT_STREQ("unknown error", s.AsCString());
|
||||
if (!skip)
|
||||
EXPECT_STREQ("unknown error", s.AsCString());
|
||||
}
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue