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