#!/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.

# TODO(brendanhiggins@google.com): The below is needed to make gcc-6 the default
# gcc in this image. gcc-6 is needed because gcov currently does not work with
# UML on gcc-7+. See:
# https://patchwork.ozlabs.org/project/linux-um/patch/20190718012136.GA135592@google.com/
rm /usr/bin/gcc
rm /usr/bin/g++
rm /usr/bin/gcov

ln -s /usr/bin/gcc-6 /usr/bin/cc
ln -s /usr/bin/gcc-6 /usr/bin/gcc
ln -s /usr/bin/c++-6 /usr/bin/c++
ln -s /usr/bin/g++-6 /usr/bin/g++
ln -s /usr/bin/gcov-6 /usr/bin/gcov

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

KUNIT_VERSION_ARGS=""

# 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
  KUNIT_VERSION_ARGS="--build_dir=."
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 $KUNIT_VERSION_ARGS > "$ARTIFACTS/kunit.log" 2>&1
KUNIT_EXIT_CODE=$?

# Generate an HTML coverage report using LCOV
# TODO(brendanhiggins@google.com): Prow no longer seems to provide a full git
# repo, so we cannot use git trivially to measure incremental coverage. Not sure
# if this is a setting we can change or if we can get the information in some
# other way.
LCOV_FILTER=0

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 "============================="
  echo "This is likely *not* an issue with your patch. See artifacts/kunit_test.log under Artifacts for more details."
  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"
  if [[ $LCOV_FILTER -eq 1 ]]; then
    echo "Incremental line coverage: $(/incremental_coverage coverage.info)%"
  fi
fi

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

exit $KUNIT_EXIT_CODE
