xref: /aosp_15_r20/external/cronet/testing/run_with_dummy_home.py (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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