diff options
Diffstat (limited to 'tests/ci')
-rw-r--r-- | tests/ci/cover.awk | 25 | ||||
-rw-r--r-- | tests/ci/cover.sh | 92 | ||||
-rw-r--r-- | tests/ci/pip_license.py | 80 |
3 files changed, 171 insertions, 26 deletions
diff --git a/tests/ci/cover.awk b/tests/ci/cover.awk new file mode 100644 index 000000000..e4bb816dc --- /dev/null +++ b/tests/ci/cover.awk @@ -0,0 +1,25 @@ +BEGIN{ + template = "%6s %-75s\n" + printf template, "Delta", "Module Path" +} + +/^-/{ + s = substr($1, 2) + x[s] = $3; +}; + +/^+/{ + s = substr($1, 2) + d = $3 + if (s in x) + d = d - x[s] + y[s" "d] = d +} + +END{ + asorti(y, z1, "@val_num_asc") + for (i=1; i <= length(z1); i++){ + split(z1[i], z2, " ") + printf template, z2[2], z2[1] + } +} diff --git a/tests/ci/cover.sh b/tests/ci/cover.sh index 822ed2ff2..780a85a22 100644 --- a/tests/ci/cover.sh +++ b/tests/ci/cover.sh @@ -1,3 +1,4 @@ +#!/bin/bash ############################################################################## # Copyright 2015: Mirantis Inc. # All Rights Reserved. @@ -17,65 +18,104 @@ # rally/tests/ci/cover.sh ############################################################################## +if [[ -n $COVER_DIR_NAME ]]; then + : +elif [[ -n $_ ]]; then + COVER_DIR_NAME=$( dirname $_ ) +else + COVER_DIR_NAME=$( dirname $0 ) +fi + show_diff () { - head -1 $1 - diff -U 0 $1 $2 | sed 1,2d + diff -U 0 $1 $2 | awk -f $COVER_DIR_NAME/cover.awk } - run_coverage_test() { ALLOWED_EXTRA_MISSING=10 - + # enable debugging + set -x # Stash uncommitted changes, checkout master and save coverage report uncommited=$(git status --porcelain | grep -v "^??") - [[ -n $uncommited ]] && git stash > /dev/null + [[ -n ${uncommited} ]] && git stash > /dev/null git checkout HEAD^ baseline_report=$(mktemp -t yardstick_coverageXXXXXXX) + ls -l .testrepository + # workaround 'db type could not be determined' bug # https://bugs.launchpad.net/testrepository/+bug/1229445 rm -rf .testrepository - find . -type f -name "*.pyc" -delete && python setup.py testr --coverage --slowest --testr-args="$*" - coverage report > $baseline_report - baseline_missing=$(awk 'END { print $3 }' $baseline_report) + find . -type f -name "*.pyc" -delete + + #python setup.py testr --coverage --testr-args="" + python setup.py testr --coverage --slowest --testr-args="$*" + testr failing + coverage report > ${baseline_report} + + # debug awk + tail -1 ${baseline_report} + baseline_missing=$(awk 'END { if (int($3) > 0) print $3 }' ${baseline_report}) + + if [[ -z $baseline_missing ]]; then + echo "Failed to determine baseline missing" + exit 1 + fi # Checkout back and unstash uncommitted changes (if any) git checkout - - [[ -n $uncommited ]] && git stash pop > /dev/null + [[ -n ${uncommited} ]] && git stash pop > /dev/null # Generate and save coverage report current_report=$(mktemp -t yardstick_coverageXXXXXXX) + ls -l .testrepository + # workaround 'db type could not be determined' bug # https://bugs.launchpad.net/testrepository/+bug/1229445 rm -rf .testrepository - find . -type f -name "*.pyc" -delete && python setup.py testr --coverage --slowest --testr-args="$*" - coverage report > $current_report - current_missing=$(awk 'END { print $3 }' $current_report) + find . -type f -name "*.pyc" -delete + + #python setup.py testr --coverage --testr-args="" + python setup.py testr --coverage --slowest --testr-args="$*" + testr failing + coverage report > ${current_report} + + rm -rf cover-$PY_VER + coverage html -d cover-$PY_VER + + # debug awk + tail -1 ${current_report} + current_missing=$(awk 'END { if (int($3) > 0) print $3 }' ${current_report}) + + if [[ -z $current_missing ]]; then + echo "Failed to determine current missing" + exit 1 + fi # Show coverage details - allowed_missing=$((baseline_missing+ALLOWED_EXTRA_MISSING)) + new_missing=$((current_missing - baseline_missing)) - echo "Allowed to introduce missing lines : ${ALLOWED_EXTRA_MISSING}" + echo "Missing lines allowed to introduce : ${ALLOWED_EXTRA_MISSING}" + echo "Missing lines introduced : ${new_missing}" echo "Missing lines in master : ${baseline_missing}" echo "Missing lines in proposed change : ${current_missing}" - if [ $allowed_missing -gt $current_missing ]; + if [[ ${new_missing} -gt ${ALLOWED_EXTRA_MISSING} ]]; then - if [ $baseline_missing -lt $current_missing ]; - then - show_diff $baseline_report $current_report - echo "I believe you can cover all your code with 100% coverage!" - else - echo "Thank you! You are awesome! Keep writing unit tests! :)" - fi - else - show_diff $baseline_report $current_report + show_diff ${baseline_report} ${current_report} echo "Please write more unit tests, we should keep our test coverage :( " - rm $baseline_report $current_report + rm ${baseline_report} ${current_report} exit 1 + + elif [[ ${new_missing} -gt 0 ]]; + then + show_diff ${baseline_report} ${current_report} + echo "I believe you can cover all your code with 100% coverage!" + + else + echo "Thank you! You are awesome! Keep writing unit tests! :)" fi - rm $baseline_report $current_report + rm ${baseline_report} ${current_report} } diff --git a/tests/ci/pip_license.py b/tests/ci/pip_license.py new file mode 100644 index 000000000..e512db7ee --- /dev/null +++ b/tests/ci/pip_license.py @@ -0,0 +1,80 @@ +# Copyright (c) 2017 Intel Corporation +# +# 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 +# +# http://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. + +import pkg_resources +import pip.req +import sys + + +def get_pkg_license(pkg): + """ + Given a package reference (as from requirements.txt), + return license listed in package metadata. + NOTE: This function does no error checking and is for + demonstration purposes only. + + can-pip-or-setuptools-distribute-etc-list-the-license-used-by-each-install + https://stackoverflow.com/a/19086260 + https://stackoverflow.com/users/308066/dkamins + """ + try: + pkgs = pkg_resources.working_set.resolve(pkg, replace_conflicting=True) + # pkgs = pkg_resources.require(pkg) + except pkg_resources.DistributionNotFound as e: + sys.stderr.write("%s\n" % e) + return None + pkg = pkgs[0] + try: + info = pkg.get_metadata_lines('METADATA') + except IOError: + try: + info = pkg.get_metadata_lines('PKG-INFO') + except IOError: + info = [] + licenses = [] + for line in info: + if "License:" in line: + lic = line.split(': ', 1)[1] + if "UNKNOWN" not in lic: + # try this type first + licenses.append(lic) + # break + elif "License ::" in line: + licenses.append(" ".join(line.split(':: ')[1:3])) + return "; ".join(licenses) + +# quick and dirty hack + + +def main(): + + reqs = list(pip.req.parse_requirements("../../requirements.txt", session='hack')) + lines = [] + for req in reqs: + pkg = pkg_resources.parse_requirements([req.name]) + lic = get_pkg_license(pkg) + markers = req.markers + if markers: + mark = "; " + str(req.markers) + else: + mark = "" + line = "{0}{1}\t\t# {2}\n".format(req.req, mark, lic) + sys.stdout.write(line) + lines.append(line) + with open("requirements.txt", "w") as rrr: + rrr.writelines(lines) + + +if __name__ == '__main__': + main() |