#!/bin/bash

# autopkgtest check: Build a trivial project that uses the
# find_package(IncludeChecker) macro, and verify that the resulting test binary
# behaves as expected.
# (C) 2016 Canonical Ltd.
# Author: Pete Woods <pete.woods@canonical.com>

set -euo pipefail
IFS=$'\n\t'

tempdir=$(mktemp --tmpdir="${AUTOPKGTEST_TMP:-/tmp}" -d)
trap "rm -rf $tempdir" 0 INT QUIT ABRT PIPE TERM

srcdir="$(pwd)/examples/includechecker-demo"
bindir="${tempdir}/build"
installdir="${tempdir}/install"

test_include_checker() {
  expected="$1"
  shift
  message="$1"
  shift
  rm -rf "${bindir}"
  mkdir -p "${bindir}"
  echo "========================================================="
  echo "Running build with cmake arguments: $@"

  (
    cd "${bindir}"
    cmake $@ -DCMAKE_INSTALL_PREFIX="${installdir}" "${srcdir}"
    make
    set +e
    make test
    retval=$?
    set -e

    if [ ${retval} -ne ${expected} ]; then
      echo "Failed: Unexpected exit value ${retval}, expected ${expected}"
      return 1
    fi

    if [ "${message}" != "" ]; then
      echo "Checking for log message: ${message}"
      set +e
      grep -q "${message}" "Testing/Temporary/LastTest.log"
      retval=$?
      set -e
      if [ ${retval} -ne 0 ]; then
        echo "Failed: log message not found"
        return 1
      fi
    fi

    echo "Success"
  )
}

# Disable all checks
test_include_checker 0 "" -DINCLUDE_CHECK_FORBIDDEN='' -DINCLUDE_CHECK_ALLOWED='' -DINCLUDE_CHECK_IGNORE=''

# Bad header should fail
test_include_checker 2 "demolib/bad/bad-header.h" -DINCLUDE_CHECK_FORBIDDEN='glib.h' -DINCLUDE_CHECK_ALLOWED='' -DINCLUDE_CHECK_IGNORE='internal'

# Internal header should fail
test_include_checker 2 "demolib/internal/bar.h" -DINCLUDE_CHECK_FORBIDDEN='glib.h' -DINCLUDE_CHECK_ALLOWED='bad/bad-header.h:glib.h' -DINCLUDE_CHECK_IGNORE=''

# Full checks with exclusions
test_include_checker 0 "" -DINCLUDE_CHECK_FORBIDDEN='glib.h' -DINCLUDE_CHECK_ALLOWED='bad/bad-header.h:glib.h' -DINCLUDE_CHECK_IGNORE='internal'

