[libcxx-commits] [libcxx] ff09135 - [libc++] Execute tests from the Lit execution root instead of the test tree

Nico Weber via libcxx-commits libcxx-commits at lists.llvm.org
Wed Apr 1 19:19:34 PDT 2020


Did you check if this slows down test execution at all? Creating a temp dir
per test sounds potentially slow.

On Wed, Apr 1, 2020 at 10:17 PM Louis Dionne via libcxx-commits <
libcxx-commits at lists.llvm.org> wrote:

>
> Author: Louis Dionne
> Date: 2020-04-01T22:17:03-04:00
> New Revision: ff09135fc2b7a9696f87a8a8e89be2ef777895d3
>
> URL:
> https://github.com/llvm/llvm-project/commit/ff09135fc2b7a9696f87a8a8e89be2ef777895d3
> DIFF:
> https://github.com/llvm/llvm-project/commit/ff09135fc2b7a9696f87a8a8e89be2ef777895d3.diff
>
> LOG: [libc++] Execute tests from the Lit execution root instead of the
> test tree
>
> Instead of executing tests from within the libc++ test suite, we execute
> them from the Lit execution directory. However, since some tests have
> file dependencies, we must copy those dependencies to the execution
> directory where they are executed.
>
> This has the major benefit that if a test modifies a file (whether it
> is wanted or not), other tests will not see those modifications. This
> is good because current tests assume that input data is never modified,
> however this could be an incorrect assumption if some test does not
> behave properly.
>
> Added:
>
>
> Modified:
>     libcxx/utils/libcxx/test/config.py
>     libcxx/utils/libcxx/test/executor.py
>     libcxx/utils/libcxx/test/format.py
>     libcxx/utils/run.py
>
> Removed:
>
>
>
>
> ################################################################################
> diff  --git a/libcxx/utils/libcxx/test/config.py
> b/libcxx/utils/libcxx/test/config.py
> index 3e983e1b4d4a..20d0a796a3af 100644
> --- a/libcxx/utils/libcxx/test/config.py
> +++ b/libcxx/utils/libcxx/test/config.py
> @@ -1050,7 +1050,6 @@ def configure_substitutions(self):
>              exec_args.append('--host {}'.format(self.executor.user_prefix
> + self.executor.host))
>              executor = os.path.join(self.libcxx_src_root, 'utils',
> 'ssh.py')
>          else:
> -            exec_args.append('--working_directory "%S"')
>              executor = os.path.join(self.libcxx_src_root, 'utils',
> 'run.py')
>          sub.append(('%{exec}', '{} {} {} --
> '.format(pipes.quote(sys.executable),
>
> pipes.quote(executor),
>
> diff  --git a/libcxx/utils/libcxx/test/executor.py
> b/libcxx/utils/libcxx/test/executor.py
> index b555b1f03df9..c34310cdd2e2 100644
> --- a/libcxx/utils/libcxx/test/executor.py
> +++ b/libcxx/utils/libcxx/test/executor.py
> @@ -10,6 +10,7 @@
>  import os
>  import posixpath
>  import ntpath
> +import shutil
>
>  from libcxx.test import tracing
>  from libcxx.util import executeCommand
> @@ -61,6 +62,12 @@ def run(self, exe_path, cmd=None, work_dir='.',
> file_deps=None, env=None):
>          if env:
>              env = self.merge_environments(os.environ, env)
>
> +        for dep in file_deps:
> +            if os.path.isdir(dep):
> +                shutil.copytree(dep, os.path.join(work_dir,
> os.path.basename(dep)), symlinks=True)
> +            else:
> +                shutil.copy2(dep, work_dir)
> +
>          out, err, rc = executeCommand(cmd, cwd=work_dir, env=env)
>          return (cmd, out, err, rc)
>
>
> diff  --git a/libcxx/utils/libcxx/test/format.py
> b/libcxx/utils/libcxx/test/format.py
> index a026c4f1ba02..1bc85f24976a 100644
> --- a/libcxx/utils/libcxx/test/format.py
> +++ b/libcxx/utils/libcxx/test/format.py
> @@ -9,6 +9,8 @@
>  import copy
>  import errno
>  import os
> +import shutil
> +import tempfile
>  import time
>  import random
>
> @@ -209,16 +211,21 @@ def _evaluate_pass_test(self, test, tmpBase,
> lit_config,
>                  report += "Compilation failed unexpectedly!"
>                  return lit.Test.Result(lit.Test.FAIL, report)
>              # Run the test
> -            local_cwd = os.path.dirname(source_path)
>              env = None
>              if self.exec_env:
>                  env = self.exec_env
>
>              max_retry = test.allowed_retries + 1
>              for retry_count in range(max_retry):
> -                cmd, out, err, rc = self.executor.run(exec_path,
> [exec_path],
> -                                                      local_cwd,
> data_files,
> -                                                      env)
> +                # Create a temporary directory just for that test and run
> the
> +                # test in that directory
> +                try:
> +                    execDirTmp = tempfile.mkdtemp(dir=execDir)
> +                    cmd, out, err, rc = self.executor.run(exec_path,
> [exec_path],
> +                                                          execDirTmp,
> data_files,
> +                                                          env)
> +                finally:
> +                    shutil.rmtree(execDirTmp)
>                  report = "Compiled With: '%s'\n" % ' '.join(compile_cmd)
>                  report += libcxx.util.makeReport(cmd, out, err, rc)
>                  if rc == 0:
>
> diff  --git a/libcxx/utils/run.py b/libcxx/utils/run.py
> index 6a89a2b9388a..7de82c78dbfa 100644
> --- a/libcxx/utils/run.py
> +++ b/libcxx/utils/run.py
> @@ -14,14 +14,15 @@
>
>  import argparse
>  import os
> +import shutil
>  import subprocess
>  import sys
> +import tempfile
>
>
>  def main():
>      parser = argparse.ArgumentParser()
>      parser.add_argument('--codesign_identity', type=str, required=False)
> -    parser.add_argument('--working_directory', type=str, required=True)
>      parser.add_argument('--dependencies', type=str, nargs='*',
> required=True)
>      parser.add_argument('--env', type=str, nargs='*', required=True)
>      (args, remaining) = parser.parse_known_args(sys.argv[1:])
> @@ -42,14 +43,23 @@ def main():
>      # Extract environment variables into a dictionary
>      env = {k : v  for (k, v) in map(lambda s: s.split('=', 1), args.env)}
>
> -    # Ensure the file dependencies exist
> -    for file in args.dependencies:
> -        if not os.path.exists(file):
> -            sys.stderr.write('Missing file {} marked as a dependency of a
> test'.format(file))
> -            exit(1)
> +    try:
> +        tmpDir = tempfile.mkdtemp()
>
> -    # Run the executable with the given environment in the given working
> directory
> -    return subprocess.call(' '.join(remaining),
> cwd=args.working_directory, env=env, shell=True)
> +        # Ensure the file dependencies exist and copy them to a temporary
> directory.
> +        for dep in args.dependencies:
> +            if not os.path.exists(dep):
> +                sys.stderr.write('Missing file or directory "{}" marked
> as a dependency of a test'.format(dep))
> +                exit(1)
> +            if os.path.isdir(dep):
> +                shutil.copytree(dep, os.path.join(tmpDir,
> os.path.basename(dep)), symlinks=True)
> +            else:
> +                shutil.copy2(dep, tmpDir)
> +
> +        # Run the executable with the given environment in the temporary
> directory.
> +        return subprocess.call(' '.join(remaining), cwd=tmpDir, env=env,
> shell=True)
> +    finally:
> +        shutil.rmtree(tmpDir)
>
>  if __name__ == '__main__':
>      exit(main())
>
>
>
> _______________________________________________
> libcxx-commits mailing list
> libcxx-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/libcxx-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/libcxx-commits/attachments/20200401/e8672c7c/attachment-0001.html>


More information about the libcxx-commits mailing list