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