#!/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_boolean withdebug "${FLAGS_TRUE}" \
  "Build debug versions of Chromium-OS-specific packages."

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

check_src_test() {
  egrep '^src_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=$( /usr/lib/crosutils/get_package_list chromeos \
                    --board="${FLAGS_board}" |
                      egrep '^chromeos-base' )
fi

BLACK_LIST_FILE="/usr/share/crostestutils/unit_test_black_list.txt"

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

TEST_PACKAGE_LIST=""
for package in ${PACKAGE_LIST}; do
  if grep -xq "${package}" "${BLACK_LIST_FILE}"; 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
      TEST_PACKAGE_LIST="${TEST_PACKAGE_LIST} ${package}"
    else
      NO_UNITTESTS="${NO_UNITTESTS} ${package}"
    fi
  fi
done

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

if [ -n "${TEST_PACKAGE_LIST}" ]; then
  sudo -E PKGDIR="/build/${FLAGS_board}/test-packages" FEATURES="test" \
    ${EMERGE_BOARD_CMD} --nodeps --buildpkgonly ${TEST_PACKAGE_LIST}
fi

info "All unit tests passed."
