# 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.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.
  """
  if isolate_file_path:
    if os.path.isabs(isolate_file_path):
      isolate_abs_path = isolate_file_path
    else:
      isolate_abs_path = os.path.join(constants.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(constants.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(constants.ISOLATE_DEPS_DIR)
  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()


def PushDataDeps(device, device_dir, test_options):
  valgrind_tools.PushFilesForTool(test_options.tool, device)
  if os.path.exists(constants.ISOLATE_DEPS_DIR):
    device.PushChangedFiles([
        (os.path.join(constants.ISOLATE_DEPS_DIR, p),
         '%s/%s' % (device_dir, p))
        for p in os.listdir(constants.ISOLATE_DEPS_DIR)])
