#!/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=""

KERNEL_VERSION_REGEX="([0-9]+)\.([0-9]+).*"

if [[ $(make kernelversion) =~ $KERNEL_VERSION_REGEX ]]; then
  MAJOR_VERSION="${BASH_REMATCH[1]}"
  MINOR_VERSION="${BASH_REMATCH[2]}"
  # --build_dir gets set to .kunit by default in v5.7, so we need to set it to
  # the source root directory (.); otherwise, we can ignore it.
  # In fact, we MUST omit --build_dir=. in v5.2 or earlier otherwise Kbuild will
  # complain about an unclean tree:
  # https://github.com/torvalds/linux/commit/25b146c5b8ceecd43c311552d325a4e403c639f2
  if [[ $MAJOR_VERSION -gt 5 || ($MAJOR_VERSION -eq 5 && $MINOR_VERSION -ge 7) ]]; then
    KUNIT_VERSION_ARGS="--build_dir=."
  fi
  echo "Linux kernel version: v${MAJOR_VERSION}.${MINOR_VERSION}"
else
  echo "WARNING: Not able to determine Linux kernel version!!!"
  echo "Presubmit may report erroneous results!"
fi

# 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 $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
