1#!/usr/bin/env python3 2# Copyright 2018 The Chromium Authors 3# Use of this source code is governed by a BSD-style license that can be 4# found in the LICENSE file. 5"""Usage: run_with_dummy_home.py <command> 6 7Helper for running a test with a dummy $HOME, populated with just enough for 8tests to run and pass. Useful for isolating tests from the real $HOME, which 9can contain config files that negatively affect test performance. 10""" 11 12import os 13import shutil 14import subprocess 15import sys 16import tempfile 17 18 19def _set_up_dummy_home(original_home, dummy_home): 20 """Sets up a dummy $HOME that Chromium tests can run in. 21 22 Files are copied, while directories are symlinked. 23 """ 24 for filename in ['.Xauthority']: 25 original_path = os.path.join(original_home, filename) 26 if not os.path.exists(original_path): 27 continue 28 shutil.copyfile(original_path, os.path.join(dummy_home, filename)) 29 30 # Prevent fontconfig etc. from reconstructing the cache and symlink rr 31 # trace directory. 32 for dirpath in [['.cache'], ['.local', 'share', 'rr'], ['.vpython'], 33 ['.vpython_cipd_cache'], ['.vpython-root']]: 34 original_path = os.path.join(original_home, *dirpath) 35 if not os.path.exists(original_path): 36 continue 37 dummy_parent_path = os.path.join(dummy_home, *dirpath[:-1]) 38 if not os.path.isdir(dummy_parent_path): 39 os.makedirs(dummy_parent_path) 40 os.symlink(original_path, os.path.join(dummy_home, *dirpath)) 41 42 43def main(): 44 try: 45 dummy_home = tempfile.mkdtemp() 46 print('Creating dummy home in %s' % dummy_home) 47 48 original_home = os.environ['HOME'] 49 os.environ['HOME'] = dummy_home 50 _set_up_dummy_home(original_home, dummy_home) 51 52 return subprocess.call(sys.argv[1:]) 53 finally: 54 shutil.rmtree(dummy_home) 55 56 57if __name__ == '__main__': 58 sys.exit(main()) 59