#!/bin/bash

# Copyright 2018 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.


# Prow may not create artifacts folder in advance.
mkdir -p "$ARTIFACTS"

# KUnit repos based on upstream have a default kunitconfig; we can check for
# that to see if we are running a repo based on upstream or not.
#
# TODO(brendanhiggins): handle the case where .kunitconfig is stored in .kunit/
# when that happens.
if [[ -f ./arch/um/configs/kunit_defconfig ]]; then
  if [[ ! -f .kunitconfig ]]; then
    cp ./arch/um/configs/kunit_defconfig .kunitconfig
  fi
  cp .kunitconfig .config
else
  if [[ ! -f ./kunitconfig ]]; then
    cp /kunitconfig ./kunitconfig
  fi
  cp kunitconfig .config
fi

# Add correct configs to .config to make GCOV flags work
echo -e "CONFIG_DEBUG_KERNEL=y\nCONFIG_DEBUG_INFO=y\nCONFIG_GCOV=y" >> .config

# Run the KUnit tool unit tests
if [[ -f ./tools/testing/kunit/kunit_test.py ]]; then
  python3 ./tools/testing/kunit/kunit_test.py > "$ARTIFACTS/kunit_test.log" 2>&1
else # for upstream version
  python3 ./tools/testing/kunit/kunit_tool_test.py > "$ARTIFACTS/kunit_test.log" 2>&1
fi

KUNIT_TEST_EXIT_CODE=$?

# Build and run kernel, parse output, and send details to output log
python3 ./tools/testing/kunit/kunit.py run > "$ARTIFACTS/kunit.log" 2>&1
KUNIT_EXIT_CODE=$?

# Generate an HTML coverage report using LCOV
# TODO(mariaignacio): Have LCOV_FILTER be default until we can specify the state
LCOV_FILTER=1

if [[ $LCOV_FILTER -eq 1 ]]; then
  # Generate a list of recently modified directories, "-d <dirname> ..."
  # Note: the final `xargs` joins all the lines together.
  DIRNAMES=$(git diff --name-only HEAD~ | xargs dirname | sort -u | sed -e 's/^/-d /' | xargs)

  lcov -t "kunit_presubmit_tests" -o coverage.info -c ${DIRNAMES} --no-recursion \
  > "$ARTIFACTS/lcov.log" 2>&1
else
  lcov -t "kunit_presubmit_tests" -o coverage.info -c -d . > "$ARTIFACTS/lcov.log" 2>&1
fi

genhtml -o "$ARTIFACTS/coverage_html" coverage.info --css-file /lcov/lcov.css > "$ARTIFACTS/genhtml.log" 2>&1
GENHTML_EXIT_CODE=$?

if [[ $GENHTML_EXIT_CODE -eq 0 ]]; then
  # Overwrite the pixel images in coverage_html
  cp /lcov/emerald.png "$ARTIFACTS/coverage_html"
  cp /lcov/ruby.png "$ARTIFACTS/coverage_html"
fi

if [[ $KUNIT_TEST_EXIT_CODE -ne 0 ]]; then
  echo "KUnit Tool Presubmit Failed:"
  echo "============================="
  cat "$ARTIFACTS/kunit_test.log"
  echo "============================="
fi

echo

if [[ $KUNIT_EXIT_CODE -ne 0 ]]; then
  echo "KUnit Presubmit Failed:"
else
  echo "KUnit Presubmit Succeeded:"
fi

echo

if [[ $GENHTML_EXIT_CODE -ne 0 ]]; then
  echo "Coverage Report Generation Failed:"
  echo "============================="
  cat "$ARTIFACTS/lcov.log"
  echo "============================="
  cat "$ARTIFACTS/genhtml.log"
  echo "============================="
else
  awk '/Overall coverage rate:/,EOF' "$ARTIFACTS/genhtml.log"
  echo "Incremental line coverage: $(/incremental_coverage coverage.info)%"
fi

echo "============================="
cat "$ARTIFACTS/kunit.log"
echo "============================="

if [[ $KUNIT_TEST_EXIT_CODE -ne 0 || $KUNIT_EXIT_CODE -ne 0 ]]; then
  exit 1
fi
