]> granicus.if.org Git - llvm/commitdiff
[lit] Port googletest lit tests to Windows
authorReid Kleckner <rnk@google.com>
Fri, 28 Jul 2017 01:05:55 +0000 (01:05 +0000)
committerReid Kleckner <rnk@google.com>
Fri, 28 Jul 2017 01:05:55 +0000 (01:05 +0000)
Summary:
The technique of directly calling subprocess.Popen on a python script
doesn't work on Windows. The executable path of the command must refer
to a valid win32 executable.

Instead, rename all the python scripts masquerading as gtest executables
to have .py extensions, so we can easily detect then and call the python
executable for them. Do this on Linux as well as Windows for
consistency.

The test suite directory names also come out in lower-case on Windows.
We can consider removing that in a later patch. This change just updates
the FileCheck lines to match on Windows.

Fixes PR33933

Reviewers: modocache, mgorny

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D35909

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@309347 91177308-0d34-0410-b5e6-96231b3b80d8

utils/lit/lit/formats/googletest.py
utils/lit/tests/Inputs/googletest-format/DummySubDir/OneTest.py [moved from utils/lit/tests/Inputs/googletest-format/DummySubDir/OneTest with 100% similarity, mode: 0644]
utils/lit/tests/Inputs/googletest-timeout/DummySubDir/OneTest.py [moved from utils/lit/tests/Inputs/googletest-timeout/DummySubDir/OneTest with 100% similarity, mode: 0644]
utils/lit/tests/Inputs/googletest-upstream-format/DummySubDir/OneTest.py [moved from utils/lit/tests/Inputs/googletest-upstream-format/DummySubDir/OneTest with 100% similarity, mode: 0644]
utils/lit/tests/googletest-format.py
utils/lit/tests/googletest-timeout.py
utils/lit/tests/googletest-upstream-format.py

index 9c55e71d23302c7dea5f894cc7c39db0249f6d14..6696fabc4f5e73c0340ec17d13da2f0083846727 100644 (file)
@@ -13,11 +13,14 @@ kIsWindows = sys.platform in ['win32', 'cygwin']
 class GoogleTest(TestFormat):
     def __init__(self, test_sub_dirs, test_suffix):
         self.test_sub_dirs = os.path.normcase(str(test_sub_dirs)).split(';')
-        self.test_suffix = str(test_suffix)
 
         # On Windows, assume tests will also end in '.exe'.
+        exe_suffix = str(test_suffix)
         if kIsWindows:
-            self.test_suffix += '.exe'
+            exe_suffix += '.exe'
+
+        # Also check for .py files for testing purposes.
+        self.test_suffixes = {exe_suffix, test_suffix + '.py'}
 
     def getGTestTests(self, path, litConfig, localConfig):
         """getGTestTests(path) - [name]
@@ -29,8 +32,10 @@ class GoogleTest(TestFormat):
           litConfig: LitConfig instance
           localConfig: TestingConfig instance"""
 
+        list_test_cmd = self.maybeAddPythonToCmd([path, '--gtest_list_tests'])
+
         try:
-            output = subprocess.check_output([path, '--gtest_list_tests'],
+            output = subprocess.check_output(list_test_cmd,
                                              env=localConfig.environment)
         except subprocess.CalledProcessError as exc:
             litConfig.warning(
@@ -82,7 +87,7 @@ class GoogleTest(TestFormat):
             if not os.path.isdir(dir_path):
                 continue
             for fn in lit.util.listdir_files(dir_path,
-                                             suffixes={self.test_suffix}):
+                                             suffixes=self.test_suffixes):
                 # Discover the tests in this executable.
                 execpath = os.path.join(source_path, subdir, fn)
                 testnames = self.getGTestTests(execpath, litConfig, localConfig)
@@ -100,6 +105,7 @@ class GoogleTest(TestFormat):
             testName = namePrefix + '/' + testName
 
         cmd = [testPath, '--gtest_filter=' + testName]
+        cmd = self.maybeAddPythonToCmd(cmd)
         if litConfig.useValgrind:
             cmd = litConfig.valgrindArgs + cmd
 
@@ -126,3 +132,14 @@ class GoogleTest(TestFormat):
             return lit.Test.UNRESOLVED, msg
 
         return lit.Test.PASS,''
+
+    def maybeAddPythonToCmd(self, cmd):
+        """Insert the python exe into the command if cmd[0] ends in .py
+
+        We cannot rely on the system to interpret shebang lines for us on
+        Windows, so add the python executable to the command if this is a .py
+        script.
+        """
+        if cmd[0].endswith('.py'):
+            return [sys.executable] + cmd
+        return cmd
index a8e96d9695a12455959dbe2c1351bf5a4d56296c..be25c66e92b9926322f6368d7df64cf93316ccbd 100644 (file)
@@ -1,22 +1,19 @@
 # Check the various features of the GoogleTest format.
 #
-# PR33933
-# XFAIL: windows
-#
 # RUN: not %{lit} -j 1 -v %{inputs}/googletest-format > %t.out
 # RUN: FileCheck < %t.out %s
 #
 # END.
 
 # CHECK: -- Testing:
-# CHECK: PASS: googletest-format :: DummySubDir/OneTest/FirstTest.subTestA
-# CHECK: FAIL: googletest-format :: DummySubDir/OneTest/FirstTest.subTestB
-# CHECK-NEXT: *** TEST 'googletest-format :: DummySubDir/OneTest/FirstTest.subTestB' FAILED ***
+# CHECK: PASS: googletest-format :: {{[Dd]ummy[Ss]ub[Dd]ir}}/OneTest.py/FirstTest.subTestA
+# CHECK: FAIL: googletest-format :: {{[Dd]ummy[Ss]ub[Dd]ir}}/OneTest.py/FirstTest.subTestB
+# CHECK-NEXT: *** TEST 'googletest-format :: {{[Dd]ummy[Ss]ub[Dd]ir}}/OneTest.py/FirstTest.subTestB' FAILED ***
 # CHECK-NEXT: I am subTest B, I FAIL
 # CHECK-NEXT: And I have two lines of output
 # CHECK: ***
-# CHECK: PASS: googletest-format :: DummySubDir/OneTest/ParameterizedTest/0.subTest
-# CHECK: PASS: googletest-format :: DummySubDir/OneTest/ParameterizedTest/1.subTest
+# CHECK: PASS: googletest-format :: {{[Dd]ummy[Ss]ub[Dd]ir}}/OneTest.py/ParameterizedTest/0.subTest
+# CHECK: PASS: googletest-format :: {{[Dd]ummy[Ss]ub[Dd]ir}}/OneTest.py/ParameterizedTest/1.subTest
 # CHECK: Failing Tests (1)
 # CHECK: Expected Passes    : 3
 # CHECK: Unexpected Failures: 1
index 7d5721ea3d1cf3945a9674b729bd09aa99383d9d..8b7d10fc1f0365cbad95c1aa19064d53d51ea8a2 100644 (file)
@@ -1,8 +1,5 @@
 # REQUIRES: python-psutil
 
-# PR33934
-# XFAIL: windows
-
 # Check that the per test timeout is enforced when running GTest tests.
 #
 # RUN: not %{lit} -j 1 -v %{inputs}/googletest-timeout --timeout=1 > %t.cmd.out
@@ -16,9 +13,9 @@
 # RUN: FileCheck < %t.cfgset.out %s
 
 # CHECK: -- Testing:
-# CHECK: PASS: googletest-timeout :: DummySubDir/OneTest/FirstTest.subTestA
-# CHECK: TIMEOUT: googletest-timeout :: DummySubDir/OneTest/FirstTest.subTestB
-# CHECK: TIMEOUT: googletest-timeout :: DummySubDir/OneTest/FirstTest.subTestC
+# CHECK: PASS: googletest-timeout :: {{[Dd]ummy[Ss]ub[Dd]ir}}/OneTest.py/FirstTest.subTestA
+# CHECK: TIMEOUT: googletest-timeout :: {{[Dd]ummy[Ss]ub[Dd]ir}}/OneTest.py/FirstTest.subTestB
+# CHECK: TIMEOUT: googletest-timeout :: {{[Dd]ummy[Ss]ub[Dd]ir}}/OneTest.py/FirstTest.subTestC
 # CHECK: Expected Passes    : 1
 # CHECK: Individual Timeouts: 2
 
index 425b528aaeb09cbf6de388986fa29f95cc2804a0..938740d80e7ba005aa5170e55f8b4ab7cdb70be1 100644 (file)
@@ -1,23 +1,20 @@
 # Check the various features of the GoogleTest format.
 #
-# PR33935
-# XFAIL: windows
-#
 # RUN: not %{lit} -j 1 -v %{inputs}/googletest-upstream-format > %t.out
 # RUN: FileCheck < %t.out %s
 #
 # END.
 
 # CHECK: -- Testing:
-# CHECK: PASS: googletest-upstream-format :: DummySubDir/OneTest/FirstTest.subTestA
-# CHECK: FAIL: googletest-upstream-format :: DummySubDir/OneTest/FirstTest.subTestB
-# CHECK-NEXT: *** TEST 'googletest-upstream-format :: DummySubDir/OneTest/FirstTest.subTestB' FAILED ***
+# CHECK: PASS: googletest-upstream-format :: {{[Dd]ummy[Ss]ub[Dd]ir}}/OneTest.py/FirstTest.subTestA
+# CHECK: FAIL: googletest-upstream-format :: {{[Dd]ummy[Ss]ub[Dd]ir}}/OneTest.py/FirstTest.subTestB
+# CHECK-NEXT: *** TEST 'googletest-upstream-format :: {{[Dd]ummy[Ss]ub[Dd]ir}}/OneTest.py/FirstTest.subTestB' FAILED ***
 # CHECK-NEXT: Running main() from gtest_main.cc
 # CHECK-NEXT: I am subTest B, I FAIL
 # CHECK-NEXT: And I have two lines of output
 # CHECK: ***
-# CHECK: PASS: googletest-upstream-format :: DummySubDir/OneTest/ParameterizedTest/0.subTest
-# CHECK: PASS: googletest-upstream-format :: DummySubDir/OneTest/ParameterizedTest/1.subTest
+# CHECK: PASS: googletest-upstream-format :: {{[Dd]ummy[Ss]ub[Dd]ir}}/OneTest.py/ParameterizedTest/0.subTest
+# CHECK: PASS: googletest-upstream-format :: {{[Dd]ummy[Ss]ub[Dd]ir}}/OneTest.py/ParameterizedTest/1.subTest
 # CHECK: Failing Tests (1)
 # CHECK: Expected Passes    : 3
 # CHECK: Unexpected Failures: 1