aboutsummaryrefslogtreecommitdiffstats
path: root/tests/ci
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ci')
-rw-r--r--tests/ci/cover.awk25
-rw-r--r--tests/ci/cover.sh92
-rw-r--r--tests/ci/pip_license.py80
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()