#!/bin/bash

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

# This script builds and runs Chromium OS unit tests.  Note that this script
# utilizes the src_test stanza in chromeos-base packages.  These stanzas
# should both build and run the unit tests.

# This script requires that you run build_packages first.

# Special because this can only run inside the chroot.
. "/usr/lib/crosutils/common.sh" 2> /dev/null ||
  (echo "Must run within chroot" && false) ||
  exit 1

# Flags
DEFINE_string board "${DEFAULT_BOARD}" \
  "Target board of which tests were built"
DEFINE_string build_root "${DEFAULT_BUILD_ROOT}" \
  "Root of build output"
DEFINE_boolean fast "${DEFAULT_FAST}" \
  "Call many emerges in parallel."
DEFINE_string package_file "" \
  "File with space-separated list of packages to run unit tests" f
DEFINE_string packages "" \
  "Optional space-separated list of packages to run unit tests" p
DEFINE_string blacklist_packages "" \
  "List of packages to blacklist from unit tests"
DEFINE_boolean withdebug "${FLAGS_TRUE}" \
  "Build debug versions of Chromium-OS-specific packages."
DEFINE_boolean pretend "${FLAGS_FALSE}" \
  "Only show the packages we would test; don't actually test"
DEFINE_boolean installed "${FLAGS_TRUE}" \
  "Only test packages that are already installed"

# List of packages with no unit tests.
NO_UNITTESTS=""

check_src_test() {
  egrep '^(src_test|platform_pkg_test)()' "${1}" > /dev/null
}

# Parse command line and die if unexpected parameters given.
FLAGS_HELP="usage: ${0} [flags]"
FLAGS "${@}" || exit 1
eval set -- "${FLAGS_ARGV}"
check_flags_only_and_allow_null_arg "${@}" && set --

set -e

[ -z "${FLAGS_board}" ] && die "--board required"

EMERGE_CMD="emerge"
EMERGE_BOARD_CMD="emerge-${FLAGS_board}"
if [[ "${FLAGS_fast}" -eq "${FLAGS_TRUE}" ]]; then
  EMERGE_CMD="${GCLIENT_ROOT}/chromite/bin/parallel_emerge"
  EMERGE_BOARD_CMD="${EMERGE_CMD} --board=${FLAGS_board}"
fi

# Create package list from package file and list of packages.
if [ -n "${FLAGS_package_file}" ]; then
  if [ -f "${FLAGS_package_file}" ]; then
    PACKAGE_LIST="$(cat ${FLAGS_package_file})"
  else
    warn "Missing package file."
  fi
fi

[ -n "${FLAGS_packages}" ] && PACKAGE_LIST="${PACKAGE_LIST} ${FLAGS_packages}"

# If we didn't specify packages, find all packages.
if [ -z "${FLAGS_package_file}" -a -z "${FLAGS_packages}" ]; then
  PACKAGE_LIST=$(cros_workon --board "${FLAGS_board}" list --all)

  if [[ ${FLAGS_installed} -eq ${FLAGS_TRUE} ]]; then
    PACKAGE_LIST=$(qlist-${FLAGS_board} -ICe ${PACKAGE_LIST})
  fi
fi

BLACK_LIST_FILE="/usr/share/crostestutils/unit_test_black_list.txt"
BLACK_LIST_PACKAGES="${FLAGS_blacklist_packages}"

if [ "${FLAGS_withdebug}" -eq "${FLAGS_FALSE}" ]; then
  export USE="${USE} -cros-debug"
fi

ALL_PACKAGE_LIST=$(
  jobs=0
  for package in ${PACKAGE_LIST}; do
    (
    if grep -xq "${package}" "${BLACK_LIST_FILE}" || \
       [[ " ${BLACK_LIST_PACKAGES} " =~ " ${package} " ]]; then
      warn "Skipping package ${package} since it is blacklisted."
      continue
    fi
    EBUILD_PATH=$(equery-${FLAGS_board} which ${package} 2>/dev/null) || \
      warn "${package} not found"
    if [[ -n ${EBUILD_PATH} ]]; then
      if check_src_test "${EBUILD_PATH}"; then
        echo "y:${package}"
      else
        echo "n:${package}"
      fi
    fi
    ) &
    if [[ ${jobs} -ge ${NUM_JOBS} ]]; then
      jobs=0
      wait
    else
      : $(( jobs += 1 ))
    fi
  done | sort
  wait
)
TEST_PACKAGE_LIST=$(echo "${ALL_PACKAGE_LIST}" | sed -n '/^y:/s:^..::p')
NO_UNITTESTS=$(echo "${ALL_PACKAGE_LIST}" | sed -n '/^n:/s:^..::p')

if [ -n "${NO_UNITTESTS}" ]; then
  warn "The following packages have no unit tests:"
  warn "${NO_UNITTESTS}"
fi

if [ -n "${TEST_PACKAGE_LIST}" ]; then
  if [[ ${FLAGS_pretend} -eq ${FLAGS_TRUE} ]]; then
    printf '%s\n' ${TEST_PACKAGE_LIST} | sort
    exit 0
  else
    cmd=( sudo -E PKGDIR="/build/${FLAGS_board}/test-packages"
          FEATURES="test" ${EMERGE_BOARD_CMD} --nodeps --buildpkgonly )
    info "Running unit tests with command ${cmd[*]}"
    info "Unit tests will run for the following packages:"
    info ${TEST_PACKAGE_LIST}
    "${cmd[@]}" ${TEST_PACKAGE_LIST}
  fi
fi

info "All unit tests passed."
