From: Daniel Dunbar Date: Tue, 5 Feb 2013 21:03:25 +0000 (+0000) Subject: [tests] Add support for REQUIRES and XFAIL lines in libc++ tests. X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f51f0319bb1d377946ef710895b203e2ef18de2a;p=platform%2Fupstream%2Fllvm.git [tests] Add support for REQUIRES and XFAIL lines in libc++ tests. - We parse up to the first non-empty non-comment (C++ style) line, otherwise the format and semantics match what is used for LLVM/Clang tests. - For now, the only interesting thing to test against is a user supplied target_triple test parameter. llvm-svn: 174440 --- diff --git a/libcxx/test/lit.cfg b/libcxx/test/lit.cfg index 89d8493..30d4416 100644 --- a/libcxx/test/lit.cfg +++ b/libcxx/test/lit.cfg @@ -11,6 +11,26 @@ import subprocess import errno import time +# FIXME: For now, this is cribbed from lit.TestRunner, to avoid introducing a +# dependency there. What we more ideally would like to do is lift the "xfail" +# and "requires" handling to be a core lit framework feature. +def isExpectedFail(test, xfails): + # Check if any of the xfails match an available feature or the target. + for item in xfails: + # If this is the wildcard, it always fails. + if item == '*': + return True + + # If this is an exact match for one of the features, it fails. + if item in test.config.available_features: + return True + + # If this is a part of the target triple, it fails. + if item in test.suite.config.target_triple: + return True + + return False + class LibcxxTestFormat(lit.formats.FileBasedTest): """ Custom test format handler for use with the test format use by libc++. @@ -55,6 +75,52 @@ class LibcxxTestFormat(lit.formats.FileBasedTest): time.sleep(0.1) def _execute(self, test, lit_config): + # Extract test metadata from the test file. + xfails = [] + requires = [] + with open(test.getSourcePath()) as f: + for ln in f: + if 'XFAIL:' in ln: + items = ln[ln.index('XFAIL:') + 6:].split(',') + xfails.extend([s.strip() for s in items]) + elif 'REQUIRES:' in ln: + items = ln[ln.index('REQUIRES:') + 9:].split(',') + requires.extend([s.strip() for s in items]) + elif not ln.startswith("//") and ln.strip(): + # Stop at the first non-empty line that is not a C++ + # comment. + break + + # Check that we have the required features. + # + # FIXME: For now, this is cribbed from lit.TestRunner, to avoid + # introducing a dependency there. What we more ideally would like to do + # is lift the "xfail" and "requires" handling to be a core lit framework + # feature. + missing_required_features = [f for f in requires + if f not in test.config.available_features] + if missing_required_features: + return (lit.Test.UNSUPPORTED, + "Test requires the following features: %s" % ( + ', '.join(missing_required_features),)) + + # Determine if this test is an expected failure. + isXFail = isExpectedFail(test, xfails) + + # Evaluate the test. + result, report = self._evaluate_test(test, lit_config) + + # Convert the test result based on whether this is an expected failure. + if isXFail: + if result != lit.Test.FAIL: + report += "\n\nTest was expected to FAIL, but did not.\n" + result = lit.Test.XPASS + else: + result = lit.Test.XFAIL + + return result, report + + def _evaluate_test(self, test, lit_config): name = test.path_in_suite[-1] source_path = test.getSourcePath() source_dir = os.path.dirname(source_path) @@ -210,4 +276,5 @@ config.test_format = LibcxxTestFormat( ld_flags = ['-nodefaultlibs'] + library_paths + ['-lc++'] + libraries, exec_env = exec_env) -config.target_triple = None +config.target_triple = lit.params.get( + 'target_triple', 'unknown-unknown-unknown')