[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:
Alexandre Ganea 2020-10-08 11:46:04 -04:00
parent b9225543e8
commit 79809f58b0
5 changed files with 35 additions and 5 deletions

View File

@ -3,6 +3,8 @@ from __future__ import absolute_import
# System modules # System modules
from distutils.version import LooseVersion from distutils.version import LooseVersion
from functools import wraps from functools import wraps
import ctypes
import locale
import os import os
import platform import platform
import re import re
@ -592,6 +594,17 @@ def skipIfWindows(func):
"""Decorate the item to skip tests that should be skipped on Windows.""" """Decorate the item to skip tests that should be skipped on Windows."""
return skipIfPlatform(["windows"])(func) 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): def skipUnlessWindows(func):
"""Decorate the item to skip tests that should be skipped on any non-Windows platform.""" """Decorate the item to skip tests that should be skipped on any non-Windows platform."""
return skipUnlessPlatform(["windows"])(func) return skipUnlessPlatform(["windows"])(func)

View File

@ -52,6 +52,9 @@ def is_exe(fpath):
"""Returns true if fpath is an executable.""" """Returns true if fpath is an executable."""
if fpath == None: if fpath == None:
return False 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) return os.path.isfile(fpath) and os.access(fpath, os.X_OK)

View File

@ -12,4 +12,4 @@ class BuildError(Exception):
@staticmethod @staticmethod
def format_build_error(command, command_output): def format_build_error(command, command_output):
return "Error when building test subject.\n\nBuild Command:\n{}\n\nBuild Command Output:\n{}".format( 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'))

View File

@ -350,6 +350,7 @@ class targetCommandTestCase(TestBase):
self.expect("target create a b", error=True, self.expect("target create a b", error=True,
substrs=["'target create' takes exactly one executable path"]) substrs=["'target create' takes exactly one executable path"])
@skipIfWindowsAndNonEnglish
@no_debug_info_test @no_debug_info_test
def test_target_create_nonexistent_core_file(self): def test_target_create_nonexistent_core_file(self):
self.expect("target create -c doesntexist", error=True, self.expect("target create -c doesntexist", error=True,
@ -365,6 +366,7 @@ class targetCommandTestCase(TestBase):
self.expect("target create -c '" + tf.name + "'", error=True, self.expect("target create -c '" + tf.name + "'", error=True,
substrs=["Cannot open '", "': Permission denied"]) substrs=["Cannot open '", "': Permission denied"])
@skipIfWindowsAndNonEnglish
@no_debug_info_test @no_debug_info_test
def test_target_create_nonexistent_sym_file(self): def test_target_create_nonexistent_sym_file(self):
self.expect("target create -s doesntexist doesntexisteither", error=True, self.expect("target create -s doesntexist doesntexisteither", error=True,

View File

@ -10,7 +10,7 @@
#include "gtest/gtest.h" #include "gtest/gtest.h"
#ifdef _WIN32 #ifdef _WIN32
#include <winerror.h> #include <windows.h>
#endif #endif
using namespace lldb_private; using namespace lldb_private;
@ -71,14 +71,26 @@ TEST(StatusTest, ErrorWin32) {
EXPECT_FALSE(success.ToError()); EXPECT_FALSE(success.ToError());
EXPECT_TRUE(success.Success()); 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); auto s = Status(ERROR_ACCESS_DENIED, ErrorType::eErrorTypeWin32);
EXPECT_TRUE(s.Fail()); 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); 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); s.SetError(16000, ErrorType::eErrorTypeWin32);
EXPECT_STREQ("unknown error", s.AsCString()); if (!skip)
EXPECT_STREQ("unknown error", s.AsCString());
} }
#endif #endif