tests: Make tests aware of meson test wrapper
authorDylan Baker <dylan.c.baker@intel.com>
Thu, 14 May 2020 22:36:36 +0000 (15:36 -0700)
committerMarge Bot <eric+marge@anholt.net>
Wed, 20 May 2020 17:57:15 +0000 (17:57 +0000)
Meson 0.55.0 will set the MESON_EXE_WRAPPER environment variable to the
joined version of that wrapper if it is needed. Our tests that take
compiled targets as arguments can use that information to run cross
built binaries, or if there isn't a wrapper and we get an ENOEXEC, we
can skip the tests gracefully.

We try to use mesonlib.split_args, which handles windows arguments
better than python's builtin shlex module, but fall back to that if the
meson module isn't available for some reason.

Cc: 20.0 20.1 <mesa-stable@lists.freedesktop.org>
Reviewed-by: Eric Engestrom <eric@engestrom.ch>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5103>

src/compiler/glsl/glcpp/tests/glcpp_test.py
src/compiler/glsl/tests/optimization_test.py
src/compiler/glsl/tests/warnings_test.py

index b024300522fbea9334a7a00836240cca6f5f9cc1..c11a7c2105b450b730081fc1240b1c1b99ce9dda 100644 (file)
 from __future__ import print_function
 import argparse
 import difflib
+import errno
 import io
 import os
 import subprocess
 import sys
 import tempfile
 
+# The meson version handles windows paths better, but if it's not available
+# fall back to shlex
+try:
+    from meson.mesonlib import split_args
+except ImportError:
+    from shlex import split as split_args
+
 
 def arg_parser():
     parser = argparse.ArgumentParser()
@@ -61,7 +69,7 @@ def test_output(glcpp, filename, expfile, nl_format='\n'):
 
     with open(filename, 'rb') as f:
         proc = subprocess.Popen(
-            [glcpp] + extra_args,
+            glcpp + extra_args,
             stdout=subprocess.PIPE,
             stderr=subprocess.STDOUT,
             stdin=subprocess.PIPE)
@@ -85,7 +93,7 @@ def _valgrind(glcpp, filename):
         os.close(fd)
         with open(filename, 'rb') as f:
             proc = subprocess.Popen(
-                ['valgrind', '--error-exitcode=31', '--log-file', tmpfile, glcpp] + extra_args,
+                ['valgrind', '--error-exitcode=31', '--log-file', tmpfile] + glcpp + extra_args,
                 stdout=subprocess.PIPE,
                 stderr=subprocess.STDOUT,
                 stdin=subprocess.PIPE)
@@ -216,17 +224,30 @@ def test_valgrind(args):
 def main():
     args = arg_parser()
 
+    wrapper = os.environ.get('MESON_EXE_WRAPPER')
+    if wrapper is not None:
+        args.glcpp = split_args(wrapper) + [args.glcpp]
+    else:
+        args.glcpp = [args.glcpp]
+
     success = True
-    if args.unix:
-        success = success and test_unix(args)
-    if args.windows:
-        success = success and test_windows(args)
-    if args.oldmac:
-        success = success and test_oldmac(args)
-    if args.bizarro:
-        success = success and test_bizarro(args)
-    if args.valgrind:
-        success = success and test_valgrind(args)
+    try:
+        if args.unix:
+            success = success and test_unix(args)
+        if args.windows:
+            success = success and test_windows(args)
+        if args.oldmac:
+            success = success and test_oldmac(args)
+        if args.bizarro:
+            success = success and test_bizarro(args)
+        if args.valgrind:
+            success = success and test_valgrind(args)
+    except OSError as e:
+        if e.errno == errno.ENOEXEC:
+            print('Skipping due to inability to run host binaries.',
+                  file=sys.stderr)
+            sys.exit(77)
+        raise
 
     exit(0 if success else 1)
 
index a02dcd31a05c43de4bcebbe645f790287da3dbc9..a413370a5e7aff6d2401bc635088225faab14234 100644 (file)
@@ -32,6 +32,13 @@ import sys
 import sexps
 import lower_jump_cases
 
+# The meson version handles windows paths better, but if it's not available
+# fall back to shlex
+try:
+    from meson.mesonlib import split_args
+except ImportError:
+    from shlex import split as split_args
+
 
 def arg_parser():
     parser = argparse.ArgumentParser()
@@ -58,10 +65,10 @@ def compare(actual, expected):
 
 def get_test_runner(runner):
     """Wrap the test runner in the exe wrapper if necessary."""
-    wrapper =  os.environ.get('MESON_EXE_WRAPPER', None)
+    wrapper = os.environ.get('MESON_EXE_WRAPPER', None)
     if wrapper is None:
         return [runner]
-    return [wrapper, runner]
+    return split_args(wrapper) + [runner]
 
 
 def main():
@@ -109,7 +116,6 @@ if __name__ == '__main__':
         main()
     except OSError as e:
         if e.errno == errno.ENOEXEC:
-            print('Skipping due to lack of exe_wrapper.', file=sys.stderr)
+            print('Skipping due to inability to run host binaries', file=sys.stderr)
             sys.exit(77)
-        else:
-            raise
+        raise
index 6cd3fbf294f8ee98492b5a2cf848de5684326b88..e587bc9ba2d72531cdba204a0685c5febd86cd01 100644 (file)
@@ -26,6 +26,13 @@ import os
 import subprocess
 import sys
 
+# The meson version handles windows paths better, but if it's not available
+# fall back to shlex
+try:
+    from meson.mesonlib import split_args
+except ImportError:
+    from shlex import split as split_args
+
 
 def arg_parser():
     parser = argparse.ArgumentParser()
@@ -42,10 +49,10 @@ def arg_parser():
 
 def get_test_runner(runner):
     """Wrap the test runner in the exe wrapper if necessary."""
-    wrapper =  os.environ.get('MESON_EXE_WRAPPER', None)
+    wrapper = os.environ.get('MESON_EXE_WRAPPER', None)
     if wrapper is None:
         return [runner]
-    return [wrapper, runner]
+    return split_args(wrapper) + [runner]
 
 
 def main():
@@ -86,7 +93,6 @@ if __name__ == '__main__':
         main()
     except OSError as e:
         if e.errno == errno.ENOEXEC:
-            print('Skipping due to lack of exe_wrapper.', file=sys.stderr)
+            print('Skipping due to inability to run host binaries', file=sys.stderr)
             sys.exit(77)
-        else:
-            raise
+        raise