[tox] envlist = {cover,lint}-posix,mypy skipsdist = true [base] pytest = python -m pytest {posargs} # Paths are listed on one line because tox seems to have inconsistent # behavior with substitutions that contain line continuations, see # https://github.com/tox-dev/tox/issues/2069 for more info. mypy_strict_source_paths = certbot-ci/src certbot-dns-cloudflare/src certbot-dns-digitalocean/src certbot-dns-dnsimple/src certbot-dns-dnsmadeeasy/src certbot-dns-gehirn/src certbot-dns-google/src certbot-dns-linode/src certbot-dns-luadns/src certbot-dns-nsone/src certbot-dns-ovh/src certbot-dns-rfc2136/src certbot-dns-route53/src certbot-dns-sakuracloud/src mypy_no_strict_source_paths = acme/src certbot/src certbot-apache/src certbot-compatibility-test/src certbot-nginx/src source_paths = {[base]mypy_strict_source_paths} {[base]mypy_no_strict_source_paths} [testenv] platform = posix: ^(?!.*win32).*$ setenv = PYTEST_ADDOPTS = {env:PYTEST_ADDOPTS:--numprocesses auto} PYTHONHASHSEED = 0 # The default install command is python -I -m pip install {opts} {packages} install_command = python -I {toxinidir}/tools/pip_install.py {opts} {packages} deps = -e acme[test] -e certbot -e certbot[test] -e certbot-apache -e certbot-dns-cloudflare -e certbot-dns-digitalocean -e certbot-dns-dnsimple -e certbot-dns-dnsmadeeasy -e certbot-dns-gehirn -e certbot-dns-google -e certbot-dns-linode -e certbot-dns-luadns -e certbot-dns-nsone -e certbot-dns-ovh -e certbot-dns-rfc2136 -e certbot-dns-route53 -e certbot-dns-sakuracloud -e certbot-nginx allowlist_externals = echo false # This and the next few testenvs are a workaround for # https://github.com/tox-dev/tox/issues/2858. commands = echo "Unrecognized environment name {envname}" false [testenv:py{,-posix}] commands = {[base]pytest} acme certbot certbot-dns-cloudflare certbot-dns-digitalocean certbot-dns-dnsimple certbot-dns-dnsmadeeasy certbot-dns-gehirn certbot-dns-google certbot-dns-linode certbot-dns-luadns certbot-dns-nsone certbot-dns-ovh certbot-dns-rfc2136 certbot-dns-route53 certbot-dns-sakuracloud [testenv:py3{,10,11,12,13,14}] commands = {[testenv:py]commands} [testenv:py3.{10,11,12,13,14}] commands = {[testenv:py]commands} [testenv:oldest] # Setting basepython allows the tests to fail fast if that version of Python # isn't available instead of potentially trying to use a newer version of # Python which is unlikely to work. # # This version should be kept in sync with the one declared in # tools/pinning/oldest/pyproject.toml. basepython = python3.10 setenv = {[testenv:py]setenv} CERTBOT_OLDEST=1 commands = {[testenv:py]commands} [testenv:cover] coverage_report = python -m coverage report common_coverage_report_commands = {[testenv:cover]coverage_report} --fail-under 99 --include certbot-dns-cloudflare/* {[testenv:cover]coverage_report} --fail-under 99 --include certbot-dns-digitalocean/* {[testenv:cover]coverage_report} --fail-under 99 --include certbot-dns-dnsimple/* {[testenv:cover]coverage_report} --fail-under 99 --include certbot-dns-dnsmadeeasy/* {[testenv:cover]coverage_report} --fail-under 99 --include certbot-dns-gehirn/* {[testenv:cover]coverage_report} --fail-under 99 --include certbot-dns-google/* {[testenv:cover]coverage_report} --fail-under 100 --include certbot-dns-linode/* {[testenv:cover]coverage_report} --fail-under 99 --include certbot-dns-luadns/* {[testenv:cover]coverage_report} --fail-under 99 --include certbot-dns-nsone/* {[testenv:cover]coverage_report} --fail-under 98 --include certbot-dns-ovh/* {[testenv:cover]coverage_report} --fail-under 99 --include certbot-dns-rfc2136/* {[testenv:cover]coverage_report} --fail-under 94 --include certbot-dns-route53/* {[testenv:cover]coverage_report} --fail-under 99 --include certbot-dns-sakuracloud/* commands = {[testenv:py]commands} --cov --cov-report= {[testenv:cover]coverage_report} --fail-under 100 --include acme/* {[testenv:cover]coverage_report} --fail-under 96 --include certbot/* {[testenv:cover]common_coverage_report_commands} # Another workaround for https://github.com/tox-dev/tox/issues/2858 in tox v4. [testenv:cover-posix] commands = {[testenv:cover]commands} [testenv:lint{,-posix}] commands = python -m pylint --reports=n --rcfile=.pylintrc {[base]source_paths} ruff check [testenv:mypy] deps = {[testenv]deps} -e certbot-ci commands = mypy {[base]mypy_no_strict_source_paths} mypy {[base]mypy_strict_source_paths} --strict [testenv:isolated-acme] description = Tests acme without any Certbot components installed deps = -e acme[test] commands = {[base]pytest} acme [testenv:isolated-certbot] description = Tests Certbot without any additional plugins installed commands = {[base]pytest} certbot deps = {[testenv:isolated-acme]deps} -e certbot[test] [testenv:isolated-{apache,cloudflare,digitalocean,dnsimple,dnsmadeeasy,gehirn,google,linode,luadns,nsone,ovh,rfc2136,route53,sakuracloud,nginx}] description = Tests the plugin without installing any other plugins deps = {[testenv:isolated-certbot]deps} apache: -e certbot-apache cloudflare: -e certbot-dns-cloudflare digitalocean: -e certbot-dns-digitalocean dnsimple: -e certbot-dns-dnsimple dnsmadeeasy: -e certbot-dns-dnsmadeeasy gehirn: -e certbot-dns-gehirn google: -e certbot-dns-google linode: -e certbot-dns-linode luadns: -e certbot-dns-luadns nsone: -e certbot-dns-nsone ovh: -e certbot-dns-ovh rfc2136: -e certbot-dns-rfc2136 route53: -e certbot-dns-route53 sakuracloud: -e certbot-dns-sakuracloud nginx: -e certbot-nginx commands = apache: {[base]pytest} certbot/src/certbot/_internal/tests/plugins/apache cloudflare: {[base]pytest} certbot-dns-cloudflare digitalocean: {[base]pytest} certbot-dns-digitalocean dnsimple: {[base]pytest} certbot-dns-dnsimple dnsmadeeasy: {[base]pytest} certbot-dns-dnsmadeeasy gehirn: {[base]pytest} certbot-dns-gehirn google: {[base]pytest} certbot-dns-google linode: {[base]pytest} certbot-dns-linode luadns: {[base]pytest} certbot-dns-luadns nsone: {[base]pytest} certbot-dns-nsone ovh: {[base]pytest} certbot-dns-ovh rfc2136: {[base]pytest} certbot-dns-rfc2136 route53: {[base]pytest} certbot-dns-route53 sakuracloud: {[base]pytest} certbot-dns-sakuracloud nginx: {[base]pytest} certbot/src/certbot/_internal/tests/plugins/nginx [testenv:apacheconftest] deps = -e acme -e certbot -e certbot-apache commands = {toxinidir}/certbot/src/certbot/_internal/tests/plugins/apache/apache-conf-files/apache-conf-test --debian-modules passenv = SERVER allowlist_externals = {toxinidir}/certbot/src/certbot/_internal/tests/plugins/apache/apache-conf-files/apache-conf-test [testenv:apacheconftest-external-with-pebble] description = Run apacheconftest with pebble and Certbot outside of the tox virtual environment. deps = -e certbot-ci allowlist_externals = {toxinidir}/certbot/src/certbot/_internal/tests/plugins/apache/apache-conf-files/apache-conf-test-pebble.py commands = {toxinidir}/certbot/src/certbot/_internal/tests/plugins/apache/apache-conf-files/apache-conf-test-pebble.py --debian-modules [testenv:apacheconftest-with-pebble] deps = {[testenv:apacheconftest]deps} {[testenv:apacheconftest-external-with-pebble]deps} allowlist_externals = {toxinidir}/certbot/src/certbot/_internal/tests/plugins/apache/apache-conf-files/apache-conf-test-pebble.py commands = {[testenv:apacheconftest-external-with-pebble]commands} [testenv:nginxroundtrip] deps = -e acme -e certbot -e certbot-apache -e certbot-nginx commands = python certbot-compatibility-test/nginx/roundtrip.py certbot-compatibility-test/nginx/nginx-roundtrip-testdata [testenv:modification] deps = commands = python {toxinidir}/tests/modification-check.py [testenv:apache_compat] deps = commands = docker build -t certbot-compatibility-test -f certbot-compatibility-test/Dockerfile . docker build -t apache-compat -f certbot-compatibility-test/Dockerfile-apache . docker run --rm -t apache-compat -c apache.tar.gz -vvvv allowlist_externals = docker passenv = DOCKER_* [testenv:nginx_compat] deps = commands = docker build -t certbot-compatibility-test -f certbot-compatibility-test/Dockerfile . docker build -t nginx-compat -f certbot-compatibility-test/Dockerfile-nginx . docker run --rm -t nginx-compat -c nginx.tar.gz -vv -aie allowlist_externals = docker passenv = DOCKER_* [testenv:integration] deps = -e acme -e certbot -e certbot-nginx -e certbot-ci commands = {[base]pytest} certbot-ci/src/certbot_integration_tests \ --cov=acme --cov=certbot --cov=certbot_nginx --cov-report= \ --cov-config=certbot-ci/src/certbot_integration_tests/.coveragerc coverage report --include 'certbot/*' --show-missing --fail-under=71 passenv = DOCKER_* [testenv:integration-certbot] deps = -e acme -e certbot -e certbot-ci commands = {[base]pytest} certbot-ci/src/certbot_integration_tests/certbot_tests \ --cov=acme --cov=certbot --cov-report= \ --cov-config=certbot-ci/src/certbot_integration_tests/.coveragerc coverage report --include 'certbot/*' --show-missing --fail-under=62 [testenv:integration-dns-rfc2136] deps = -e acme -e certbot -e certbot-dns-rfc2136 -e certbot-ci commands = {[base]pytest} certbot-ci/src/certbot_integration_tests/rfc2136_tests \ --dns-server=bind \ --numprocesses=1 \ --cov=acme --cov=certbot --cov=certbot_dns_rfc2136 --cov-report= \ --cov-config=certbot-ci/src/certbot_integration_tests/.coveragerc coverage report --include 'certbot/*' --show-missing --fail-under=45 coverage report --include 'certbot-dns-rfc2136/*' --show-missing --fail-under=86 [testenv:integration-external] description = Run integration tests with Certbot outside of the tox virtual environment. deps = -e certbot-ci commands = {[base]pytest} certbot-ci/src/certbot_integration_tests passenv = DOCKER_* [testenv:integration-certbot-oldest] deps = -e acme -e certbot -e certbot-ci basepython = {[testenv:oldest]basepython} commands = {[base]pytest} certbot-ci/src/certbot_integration_tests/certbot_tests passenv = DOCKER_* setenv = {[testenv:oldest]setenv} [testenv:integration-nginx-oldest] deps = -e acme -e certbot -e certbot-nginx -e certbot-ci basepython = {[testenv:oldest]basepython} commands = {[base]pytest} certbot-ci/src/certbot_integration_tests/nginx_tests passenv = DOCKER_* setenv = {[testenv:oldest]setenv} [testenv:test-farm-apache2] passenv = AWS_* setenv = AWS_DEFAULT_REGION=us-east-1 changedir = letstest deps = -e {toxinidir}/letstest commands = {toxinidir}/tools/retry.sh letstest targets/targets.yaml {env:AWS_EC2_PEM_FILE} SET_BY_ENV scripts/test_apache2.sh --repo {toxinidir} allowlist_externals = {toxinidir}/tools/retry.sh [testenv:validate-changelog] deps = towncrier # we set --version here so towncrier doesn't try to guess the certbot version which requires certbot # to be installed commands = towncrier build --draft --version 99.99.0