# Copyright (c) 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Base script for doing test setup."""

import logging
import os

from pylib import constants
from pylib import valgrind_tools
from pylib.constants import host_paths
from pylib.utils import isolator

def GenerateDepsDirUsingIsolate(suite_name, isolate_file_path,
                                isolate_file_paths, deps_exclusion_list):
  """Generate the dependency dir for the test suite using isolate.

  Args:
    suite_name: Name of the test suite (e.g. base_unittests).
    isolate_file_path: .isolate file path to use. If there is a default .isolate
                       file path for the suite_name, this will override it.
    isolate_file_paths: Dictionary with the default .isolate file paths for
                        the test suites.
    deps_exclusion_list: A list of files that are listed as dependencies in the
                         .isolate files but should not be pushed to the device.
  Returns:
    The Isolator instance used to remap the dependencies, or None.
  """
  if isolate_file_path:
    if os.path.isabs(isolate_file_path):
      isolate_abs_path = isolate_file_path
    else:
      isolate_abs_path = os.path.join(host_paths.DIR_SOURCE_ROOT,
                                      isolate_file_path)
  else:
    isolate_rel_path = isolate_file_paths.get(suite_name)
    if not isolate_rel_path:
      logging.info('Did not find an isolate file for the test suite.')
      return
    isolate_abs_path = os.path.join(host_paths.DIR_SOURCE_ROOT,
                                    isolate_rel_path)

  isolated_abs_path = os.path.join(
      constants.GetOutDirectory(), '%s.isolated' % suite_name)
  assert os.path.exists(isolate_abs_path), 'Cannot find %s' % isolate_abs_path

  i = isolator.Isolator()
  i.Clear()
  i.Remap(isolate_abs_path, isolated_abs_path)
  # We're relying on the fact that timestamps are preserved
  # by the remap command (hardlinked). Otherwise, all the data
  # will be pushed to the device once we move to using time diff
  # instead of md5sum. Perform a sanity check here.
  i.VerifyHardlinks()
  i.PurgeExcluded(deps_exclusion_list)
  i.MoveOutputDeps()
  return i


def PushDataDeps(device, host_dir, device_dir, test_options):
  valgrind_tools.PushFilesForTool(test_options.tool, device)
  if os.path.exists(host_dir):
    device.PushChangedFiles([(host_dir, device_dir)],
                            delete_device_stale=test_options.delete_stale_data)
