| #!/usr/bin/env python3 |
| # Copyright 2018 The Chromium Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """Usage: run_with_dummy_home.py <command> |
| |
| Helper for running a test with a dummy $HOME, populated with just enough for |
| tests to run and pass. Useful for isolating tests from the real $HOME, which |
| can contain config files that negatively affect test performance. |
| """ |
| |
| import os |
| import shutil |
| import subprocess |
| import sys |
| import tempfile |
| |
| |
| def _set_up_dummy_home(original_home, dummy_home): |
| """Sets up a dummy $HOME that Chromium tests can run in. |
| |
| Files are copied, while directories are symlinked. |
| """ |
| for filename in ['.Xauthority']: |
| original_path = os.path.join(original_home, filename) |
| if not os.path.exists(original_path): |
| continue |
| shutil.copyfile(original_path, os.path.join(dummy_home, filename)) |
| |
| # Prevent fontconfig etc. from reconstructing the cache and symlink rr |
| # trace directory. |
| for dirpath in [['.cache'], ['.local', 'share', 'rr'], ['.vpython'], |
| ['.vpython_cipd_cache'], ['.vpython-root']]: |
| original_path = os.path.join(original_home, *dirpath) |
| if not os.path.exists(original_path): |
| continue |
| dummy_parent_path = os.path.join(dummy_home, *dirpath[:-1]) |
| if not os.path.isdir(dummy_parent_path): |
| os.makedirs(dummy_parent_path) |
| os.symlink(original_path, os.path.join(dummy_home, *dirpath)) |
| |
| |
| def main(): |
| try: |
| dummy_home = tempfile.mkdtemp() |
| print('Creating dummy home in %s' % dummy_home) |
| |
| original_home = os.environ['HOME'] |
| os.environ['HOME'] = dummy_home |
| _set_up_dummy_home(original_home, dummy_home) |
| |
| return subprocess.call(sys.argv[1:]) |
| finally: |
| shutil.rmtree(dummy_home) |
| |
| |
| if __name__ == '__main__': |
| sys.exit(main()) |