#!/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())
