about summary refs log tree commit diff homepage
path: root/scripts/build/run-tests.sh
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/build/run-tests.sh')
-rwxr-xr-xscripts/build/run-tests.sh153
1 files changed, 153 insertions, 0 deletions
diff --git a/scripts/build/run-tests.sh b/scripts/build/run-tests.sh
new file mode 100755
index 00000000..f39dcad8
--- /dev/null
+++ b/scripts/build/run-tests.sh
@@ -0,0 +1,153 @@
+#!/bin/bash
+set -e
+set -u
+DIR="$(cd "$(dirname "$0")" && pwd)"
+
+
+coverage_setup() {
+  local build_dir="$1"
+  # Zero coverage for any file, e.g. previous tests
+  lcov -q --directory "${build_dir}" --no-external --zerocounters
+  # Create a baseline by capturing any file used for compilation, no execution yet
+  lcov -q --rc lcov_branch_coverage=1 --directory "${build_dir}" --base-directory="${KLEE_SRC}" --no-external --capture --initial --output-file coverage_base.info
+  lcov -q --rc lcov_branch_coverage=1 --remove coverage_base.info 'test/*' --output-file coverage_base.info
+  lcov -q --rc lcov_branch_coverage=1 --remove coverage_base.info 'unittests/*' --output-file coverage_base.info
+}
+
+coverage_update() {
+  tags="$2"
+  codecov_suffix=(${tags// /})
+  build_dir="$1"
+  # Create report
+  # (NOTE: "--rc lcov_branch_coverage=1" needs to be added in all calls, otherwise branch coverage gets dropped)
+  lcov -q --rc lcov_branch_coverage=1 --directory "${build_dir}" --base-directory="${KLEE_SRC}" --no-external --capture --output-file coverage.info
+  # Exclude uninteresting coverage goals (LLVM, googletest, and KLEE system and unit tests)
+  lcov -q --rc lcov_branch_coverage=1 --remove coverage.info 'test/*' --output-file coverage.info
+  lcov -q --rc lcov_branch_coverage=1 --remove coverage.info 'unittests/*' --output-file coverage.info
+  # Combine baseline and measured coverage
+  lcov -q --rc lcov_branch_coverage=1 -a coverage_base.info -a coverage.info -o coverage_all.info."${codecov_suffix}"
+  # Debug info
+  lcov -q --rc lcov_branch_coverage=1 --list coverage_all.info."${codecov_suffix}"
+}
+
+run_tests() {
+  build_dir="$1"
+  KLEE_SRC="$(cd "${DIR}"/../../ && pwd)"
+
+  # TODO change to pinpoint specific directory
+  cd "${build_dir}"
+
+  ###############################################################################
+  # Unit tests
+  ###############################################################################
+  # Prepare coverage information if COVERAGE is set
+  if [ "${COVERAGE}" -eq 1 ]; then
+    coverage_setup "${build_dir}"
+  fi
+  make unittests
+  
+  # Generate and upload coverage if COVERAGE is set
+  if [ "${COVERAGE}" -eq 1 ]; then
+    coverage_update "${build_dir}" "unittests"
+  fi
+
+  ###############################################################################
+  # lit tests
+  ###############################################################################
+  if [ "${COVERAGE}" -eq 1 ]; then
+    coverage_setup "${build_dir}"
+  fi
+  make systemtests || return 1
+  
+  # If metaSMT is the only solver, then rerun lit tests with non-default metaSMT backends
+  if [ "X${SOLVERS}" == "XmetaSMT" ]; then
+    available_metasmt_backends="btor stp z3 yices2 cvc4"
+    for backend in $available_metasmt_backends; do
+      if [ "X${METASMT_DEFAULT}" != "X$backend" ]; then
+        if [ "$backend" == "cvc4" ]; then
+          for num in {1..5}; do sleep 120; echo 'Keep Travis alive'; done &
+        fi
+        lit -v --param klee_opts=-metasmt-backend="$backend" --param kleaver_opts=-metasmt-backend="$backend" test/
+      fi
+    done
+  fi
+  
+  # Generate and upload coverage if COVERAGE is set
+  if [ "${COVERAGE}" -eq 1 ]; then
+    coverage_update "${build_dir}" "systemtests"
+  fi
+}
+
+
+
+function upload_coverage() {
+  file="$1"
+  tags="$2"
+  cd /home/klee/klee_src
+  bash <(curl -s https://codecov.io/bash) -X gcov -R /tmp/klee_src/ -y .codecov.yml -f /home/klee/klee_build/coverage_all.info."${file}" -F "$tags"
+}
+
+function run_docker() {
+ docker_arguments=(docker run -u root --cap-add SYS_PTRACE -ti)
+ script_arguments=("--debug" '"/tmp/klee_build"*')
+ if [[ "${COVERAGE}" -eq 1 ]]; then
+   script_arguments+=("--coverage")
+ fi
+ 
+ if [[ "${UPLOAD_COVERAGE}" -eq 1 ]]; then
+   docker_arguments+=($(bash <(curl -s https://codecov.io/env)))
+   script_arguments+=("--upload-coverage")
+ fi
+
+ # Run the image that was build last with extended capabilities to allow tracing tests
+ "${docker_arguments[@]}" "$(docker images -q | head -n 1)" /bin/bash -i -c "ulimit -s 16384; source /home/klee/.bashrc; export; /tmp/klee_src/scripts/build/run-tests.sh ${script_arguments[*]}"
+}
+
+main() {
+  local NAME
+  NAME=$(basename "${0}")
+  local RUN_DOCKER=0
+  local COVERAGE=0
+  local UPLOAD_COVERAGE=0
+  local directory=""
+
+  for i in "$@" ;do
+  case $i in
+    --debug)
+      set -x
+    ;;
+    --run-docker)
+    RUN_DOCKER=1
+    ;;
+    --coverage)
+    COVERAGE=1
+    ;;
+    --upload-coverage)
+    UPLOAD_COVERAGE=1
+    ;;
+    -*)
+      echo "${NAME}: unknown argument: $i"
+      exit 1
+    ;;
+    *)
+    directory="${i}"
+    ;;
+  esac
+  done
+
+
+  if [[ "${RUN_DOCKER}" -eq 1 ]]; then
+    run_docker "${COVERAGE}"
+    return 0
+  fi
+
+  run_tests "${directory}"
+  
+  # FIXME Enable separated coverage tags again
+  if [[ "${UPLOAD_COVERAGE}" -eq 1 ]]; then
+    upload_coverage systemtests systemtests_unittests
+    upload_coverage unittests systemtests_unittests
+  fi
+ }
+
+main "$@"
\ No newline at end of file