From 9557d1b253988ec1a4c67ece8a1401a654a243cc Mon Sep 17 00:00:00 2001 From: Tomas Kopecek Date: Sep 08 2020 14:20:29 +0000 Subject: PR#2386: Run tests in virtualenvs using tox Merges #2386 https://pagure.io/koji/pull-request/2386 Fixes #2391 https://pagure.io/koji/issue/2391 --- diff --git a/.flake8 b/.flake8 index 2051214..b555855 100644 --- a/.flake8 +++ b/.flake8 @@ -15,7 +15,8 @@ exclude = __pycache__, tests, docs, - ./koji-*/* + ./koji-*/*, + .tox filename = *.py, diff --git a/.gitignore b/.gitignore index 19649a3..05b13b6 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,4 @@ docs/build/ .vagrant .gitreview devtools/*.conf +.tox diff --git a/Makefile b/Makefile index 24b830d..992446a 100644 --- a/Makefile +++ b/Makefile @@ -79,20 +79,11 @@ test: test2 test3 @echo "All tests are finished for python 2&3" test2: - coverage2 erase - PYTHONPATH=.:plugins/builder/.:plugins/cli/.:cli/.:www/lib coverage2 run \ - --source . -m nose tests/test_builder tests/test_cli tests/test_lib \ - tests/test_plugins/test*builder.py tests/test_plugins/test*cli.py - coverage2 report - coverage2 html + tox -e py2 @echo Full coverage report at file://${CURDIR}/htmlcov/py2/index.html test3: - coverage3 erase --rcfile .coveragerc3 - PYTHONPATH=hub/.:plugins/hub/.:plugins/builder/.:plugins/cli/.:cli/.:www/lib coverage3 run \ - --rcfile .coveragerc3 --source . -m nose - coverage3 report --rcfile .coveragerc3 - coverage3 html --rcfile .coveragerc3 + tox -e py3 @echo Full coverage report at file://${CURDIR}/htmlcov/py3/index.html test-tarball: @@ -136,7 +127,7 @@ pypi-upload: twine upload dist/* flake8: - flake8 + tox -e flake8 tag:: git tag -a $(TAG) diff --git a/devtools/containers/README.md b/devtools/containers/README.md new file mode 100644 index 0000000..65cb771 --- /dev/null +++ b/devtools/containers/README.md @@ -0,0 +1,23 @@ +Dockerfiles for development +=========================== + +To facilitate in development - specifically, running tests, two Dockerfiles are +provided: + +* [`./centos/Dockerfile`](./centos/Dockerfile) CentOS 6, for testing with python2.6 +* [`./fedora/Dockerfile`](./fedora/Dockerfile) Fedora 32, for testing with python3.8 + +To use them, taking fedora as an example: + + docker build -t koji_test_fedora:latest --no-cache ./devtools/containers/fedora + docker run --rm -v $PWD:/koji --name koji_test koji_test_fedora:latest bash -c "cd /koji && tox -e flake8,py3" + +Or CentOS as an example: + + docker build -t koji_test_centos:latest --no-cache ./devtools/containers/centos + docker run --rm -v $PWD:/koji --name koji_test koji_test_centos:latest bash -c "cd /koji && tox -e py2" + +When running with Podman and SELinux enabled, use the "--security-opt +label=disable" option: + + podman run --rm -v $PWD:/koji --security-opt label=disable --name koji_test koji_test_fedora:latest bash -c "cd /koji && ls -l /koji && tox -e flake8,py3" diff --git a/devtools/containers/centos/Dockerfile b/devtools/containers/centos/Dockerfile new file mode 100644 index 0000000..55c2e01 --- /dev/null +++ b/devtools/containers/centos/Dockerfile @@ -0,0 +1,28 @@ +FROM centos:6 +RUN \ + yum install -y \ + gcc \ + git \ + make \ + krb5-devel \ + libffi-devel \ + openssl-devel \ + pyOpenSSL \ + python-cheetah \ + python-devel \ + python-requests \ + redhat-rpm-config \ + rpm-build \ + rpm-python \ + yum-utils && \ + yum install -y epel-release && \ + yum install -y \ + python-flake8 \ + python-multilib \ + python-pip \ + python-psycopg2 \ + python-qpid-proton \ + python-requests-kerberos \ + yumdownloader && \ + pip install -U 'pip==9.0.1' && \ + pip install -U tox diff --git a/devtools/containers/fedora/Dockerfile b/devtools/containers/fedora/Dockerfile new file mode 100644 index 0000000..6c7fccc --- /dev/null +++ b/devtools/containers/fedora/Dockerfile @@ -0,0 +1,22 @@ +FROM fedora:32 +RUN \ + dnf install -y \ + 'dnf-command(download)' \ + gcc \ + git \ + glib2-devel \ + glibc-langpack-en \ + krb5-devel \ + libffi-devel \ + libxml2-devel \ + make \ + openssl-devel \ + python3-devel \ + python3-pip \ + python3-rpm \ + python3-tox \ + redhat-rpm-config \ + rpm-build \ + rpm-devel \ + sqlite-devel \ + yum-utils diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..83107c7 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,7 @@ +-e . +Cheetah;python_version < '3.0' +Cheetah3;python_version >= '3.0' +psycopg2-binary;python_version >= '3.0' +python-multilib +python-qpid-proton +rpm-py-installer diff --git a/test-requirements.txt b/test-requirements.txt index 7cba63d..1a8a17c 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -1,6 +1,9 @@ +-e . flake8 flake8-import-order mock<=2.0.0 -requests-mock +requests-mock;python_version >= '2.7' +requests-mock<1.5.0;python_version < '2.7' coverage nose +unittest2;python_version < '3.0' diff --git a/tox.ini b/tox.ini new file mode 100644 index 0000000..c188442 --- /dev/null +++ b/tox.ini @@ -0,0 +1,75 @@ +[tox] +envlist = flake8,py2,py3 + +[testenv:flake8] +deps = + flake8 +# On EL6, pip would get us a flake8 that doesn't work with python2.6. The next +# two lines let us use an RPM-based version from EPEL if it is installed +sitepackages = true +whitelist_externals = flake8 +# These two lines just speed things up by avoiding unnecessary setup +skip_install=true +usedevelop=true +commands = + flake8 + +[testenv] +deps = + -r{toxinidir}/requirements.txt + -r{toxinidir}/test-requirements.txt +# We need to access python-rpm, at least, and potentially more on EL6 +sitepackages = true +# Tell the rpm-py-installer package to download binaries instead of building +# from source +setenv = + RPM_PY_INSTALL_BIN=true +# If rpm's python bindings are missing, don't continue +# Also, because coverage might be installed system-wide and it serves as our +# entry point, let's make sure it's installed in the virtualenv. +commands_pre = + {envbindir}/python -c "import rpm" + pip install -I coverage + +[testenv:py3] +setenv = + {[testenv]setenv} + PYTHONPATH=hub/.:plugins/hub/.:plugins/builder/.:plugins/cli/.:cli/.:www/lib +commands_pre = + {[testenv]commands_pre} + {envbindir}/coverage3 erase --rcfile .coveragerc3 +commands = + {envbindir}/coverage3 run --rcfile .coveragerc3 --source . -m nose + {envbindir}/coverage3 report --rcfile .coveragerc3 + {envbindir}/coverage3 html -d {toxinidir}/htmlcov/py3 --rcfile .coveragerc3 + +[testenv:py2] +setenv = + {[testenv]setenv} + PYTHONPATH=.:plugins/builder/.:plugins/cli/.:cli/.:www/lib + PYTHONHASHSEED=0 +commands_pre = + {[testenv]commands_pre} + {envbindir}/coverage2 erase +commands = + {envbindir}/coverage2 run --source . -m nose \ + tests/test_builder tests/test_cli \ + tests/test_plugins/test_runroot_builder.py \ + tests/test_plugins/test_save_failed_tree_builder.py \ + tests/test_plugins/test_runroot_cli.py \ + tests/test_plugins/test_save_failed_tree_cli.py + {envbindir}/coverage2 report + {envbindir}/coverage2 html -d {toxinidir}/htmlcov/py2 + +# This is identical to the py2 testenv, but without attempting to install +# dependencies from requirements.txt. In practice this will mean RPM-based +# dependencies must be installed. +[testenv:py2-rpmdeps] +deps = + -r{toxinidir}/test-requirements.txt +setenv = + {[testenv:py2]setenv} +commands_pre = + {[testenv:py2]commands_pre} +commands = + {[testenv:py2]commands}