# Copyright 2013 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.

"""Setup for linker tests."""

import os
import sys
import types

import test_case
import test_runner

from pylib import constants

sys.path.insert(0,
                os.path.join(constants.DIR_SOURCE_ROOT, 'build', 'util', 'lib',
                             'common'))
import unittest_util

def Setup(options, devices):
  """Creates a list of test cases and a runner factory.

  Returns:
    A tuple of (TestRunnerFactory, tests).
  """
  test_cases = [
      test_case.LinkerLibraryAddressTest,
      test_case.LinkerSharedRelroTest,
      test_case.LinkerRandomizationTest,
      test_case.LinkerLowMemoryThresholdTest ]

  low_memory_modes = [False, True]
  all_tests = [t(is_low_memory=m) for t in test_cases for m in low_memory_modes]

  if options.test_filter:
    all_test_names = [ test.qualified_name for test in all_tests ]
    filtered_test_names = unittest_util.FilterTestNames(all_test_names,
                                                        options.test_filter)
    all_tests = [t for t in all_tests \
                 if t.qualified_name in filtered_test_names]

  def TestRunnerFactory(device, shard_index):
    return test_runner.LinkerTestRunner(
        device, options.tool, options.push_deps,
        options.cleanup_test_files)

  return (TestRunnerFactory, all_tests)
