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