# Tox (https://tox.readthedocs.io/) is a tool for running tests in
# multiple virtualenvs. To use it, "pip install tox" and then run
# "tox" from this directory.

[tox]
skipsdist = true
envlist = {py3-cover,lint,mypy}-{win,posix}

[base]
# pip installs the requested packages in editable mode
pip_install = python {toxinidir}/tools/pip_install_editable.py
# pip installs the requested packages in editable mode and runs unit tests on
# them. Each package is installed and tested in the order they are provided
# before the script moves on to the next package. All dependencies are pinned
# to a specific version for increased stability for developers.
install_and_test = python {toxinidir}/tools/install_and_test.py
# Packages 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.
dns_packages = 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
win_all_packages = acme[test] certbot[test] {[base]dns_packages} certbot-nginx
all_packages = {[base]win_all_packages} certbot-apache
source_paths = acme/acme certbot/certbot certbot-apache/certbot_apache certbot-ci/certbot_integration_tests certbot-ci/snap_integration_tests certbot-ci/windows_installer_integration_tests certbot-compatibility-test/certbot_compatibility_test certbot-dns-cloudflare/certbot_dns_cloudflare certbot-dns-digitalocean/certbot_dns_digitalocean certbot-dns-dnsimple/certbot_dns_dnsimple certbot-dns-dnsmadeeasy/certbot_dns_dnsmadeeasy certbot-dns-gehirn/certbot_dns_gehirn certbot-dns-google/certbot_dns_google certbot-dns-linode/certbot_dns_linode certbot-dns-luadns/certbot_dns_luadns certbot-dns-nsone/certbot_dns_nsone certbot-dns-ovh/certbot_dns_ovh certbot-dns-rfc2136/certbot_dns_rfc2136 certbot-dns-route53/certbot_dns_route53 certbot-dns-sakuracloud/certbot_dns_sakuracloud certbot-nginx/certbot_nginx tests/lock_test.py

[testenv]
passenv =
    CERTBOT_NO_PIN
platform =
    win: win32
    posix: ^(?!.*win32).*$
commands_pre = python {toxinidir}/tools/pipstrap.py
commands =
    !cover-win: {[base]install_and_test} {[base]win_all_packages}
    !cover-!win: {[base]install_and_test} {[base]all_packages}
    !cover: python tests/lock_test.py

    cover-win: {[base]pip_install} {[base]win_all_packages}
    cover-!win: {[base]pip_install} {[base]all_packages} certbot-apache[dev]
    cover: python tox.cover.py
# We always recreate the virtual environment to avoid problems like
# https://github.com/certbot/certbot/issues/7745.
recreate = true
setenv =
    PYTEST_ADDOPTS = {env:PYTEST_ADDOPTS:--numprocesses auto}
    PYTHONHASHSEED = 0

[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.7
commands =
    {[testenv]commands}
setenv =
    {[testenv]setenv}
    CERTBOT_OLDEST=1

[testenv:acme-oldest]
basepython =
    {[testenv:oldest]basepython}
commands =
    {[base]install_and_test} acme[test]
setenv =
    {[testenv:oldest]setenv}

[testenv:apache-oldest]
basepython =
    {[testenv:oldest]basepython}
commands =
    {[base]pip_install} acme[test] certbot[test] certbot-apache
    pytest certbot-apache
setenv =
    {[testenv:oldest]setenv}

[testenv:apache-v2-oldest]
basepython =
    {[testenv:oldest]basepython}
commands =
    {[base]pip_install} acme[test] certbot[test] certbot-apache[dev]
    pytest certbot-apache
setenv =
    {[testenv:oldest]setenv}

[testenv:certbot-oldest]
basepython =
    {[testenv:oldest]basepython}
commands =
    {[base]pip_install} acme[test] certbot[test]
    pytest certbot
setenv =
    {[testenv:oldest]setenv}

[testenv:dns-oldest]
basepython =
    {[testenv:oldest]basepython}
commands =
    {[base]pip_install} acme[test] certbot[test] {[base]dns_packages}
    pytest {[base]dns_packages}
setenv =
    {[testenv:oldest]setenv}

[testenv:nginx-oldest]
basepython =
    {[testenv:oldest]basepython}
commands =
    {[base]pip_install} acme[test] certbot[test] certbot-nginx
    pytest certbot-nginx
    python tests/lock_test.py
setenv =
    {[testenv:oldest]setenv}

[testenv:lint{,-win,-posix}]
basepython = python3
# separating into multiple invocations disables cross package
# duplicate code checking; if one of the commands fails, others will
# continue, but tox return code will reflect previous error
commands =
    win: {[base]pip_install} {[base]win_all_packages}
    !win: {[base]pip_install} {[base]all_packages}
    python -m pylint --reports=n --rcfile=.pylintrc {[base]source_paths}

[testenv:mypy{,-win,-posix}]
basepython = python3
commands =
    win: {[base]pip_install} {[base]win_all_packages}
    !win: {[base]pip_install} {[base]all_packages} certbot-ci
    mypy {[base]source_paths}

[testenv:apacheconftest]
commands =
    {[base]pip_install} acme certbot certbot-apache
    {toxinidir}/certbot-apache/tests/apache-conf-files/apache-conf-test --debian-modules
passenv =
    SERVER

[testenv:apacheconftest-external-with-pebble]
# Run apacheconftest with pebble and Certbot outside of tox's virtual
# environment.
commands =
    {[base]pip_install} certbot-ci
    {toxinidir}/certbot-apache/tests/apache-conf-files/apache-conf-test-pebble.py --debian-modules

[testenv:apacheconftest-with-pebble]
commands =
    {[base]pip_install} acme certbot certbot-apache
    {[testenv:apacheconftest-external-with-pebble]commands}

[testenv:nginxroundtrip]
commands =
    {[base]pip_install} acme certbot certbot-apache certbot-nginx
    python certbot-compatibility-test/nginx/roundtrip.py certbot-compatibility-test/nginx/nginx-roundtrip-testdata

[testenv:modification]
commands =
    python {toxinidir}/tests/modification-check.py

[testenv:apache_compat]
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
whitelist_externals =
    docker
passenv =
    DOCKER_*

[testenv:nginx_compat]
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
whitelist_externals =
    docker
passenv =
    DOCKER_*

[testenv:docker_dev]
# tests the Dockerfile-dev file to ensure development with it works
# as expected
commands =
    docker-compose run --rm --service-ports development bash -c 'tox -e lint'
whitelist_externals =
    docker-compose
passenv = DOCKER_*

[testenv:integration]
commands =
    {[base]pip_install} acme certbot certbot-nginx certbot-ci
    pytest certbot-ci/certbot_integration_tests \
        --acme-server={env:ACME_SERVER:pebble} \
        --cov=acme --cov=certbot --cov=certbot_nginx --cov-report= \
        --cov-config=certbot-ci/certbot_integration_tests/.coveragerc
    coverage report --include 'certbot/*' --show-missing --fail-under=65
    coverage report --include 'certbot-nginx/*' --show-missing --fail-under=74
passenv = DOCKER_*

[testenv:integration-certbot]
commands =
    {[base]pip_install} acme certbot certbot-ci
    pytest certbot-ci/certbot_integration_tests/certbot_tests \
        --acme-server={env:ACME_SERVER:pebble} \
        --cov=acme --cov=certbot --cov-report= \
        --cov-config=certbot-ci/certbot_integration_tests/.coveragerc
    coverage report --include 'certbot/*' --show-missing --fail-under=62

[testenv:integration-dns-rfc2136]
commands =
    {[base]pip_install} acme certbot certbot-dns-rfc2136 certbot-ci
    pytest certbot-ci/certbot_integration_tests/rfc2136_tests \
        --acme-server=pebble --dns-server=bind \
        --numprocesses=1 \
        --cov=acme --cov=certbot --cov=certbot_dns_rfc2136 --cov-report= \
        --cov-config=certbot-ci/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]
# Run integration tests with Certbot outside of tox's virtual environment.
commands =
    {[base]pip_install} certbot-ci
    pytest certbot-ci/certbot_integration_tests \
        --acme-server={env:ACME_SERVER:pebble}
passenv = DOCKER_*

[testenv:integration-certbot-oldest]
basepython =
    {[testenv:oldest]basepython}
commands =
    {[base]pip_install} acme certbot certbot-ci
    pytest certbot-ci/certbot_integration_tests/certbot_tests \
        --acme-server={env:ACME_SERVER:pebble}
passenv = DOCKER_*
setenv = {[testenv:oldest]setenv}

[testenv:integration-nginx-oldest]
basepython =
    {[testenv:oldest]basepython}
commands =
    {[base]pip_install} acme certbot certbot-nginx certbot-ci
    pytest certbot-ci/certbot_integration_tests/nginx_tests \
        --acme-server={env:ACME_SERVER:pebble}
passenv = DOCKER_*
setenv = {[testenv:oldest]setenv}

[testenv:test-farm-tests-base]
changedir = letstest
# The package to install is in the current working directory because of the
# value of changedir.
commands = {[base]pip_install} .
passenv =
    AWS_*
setenv = AWS_DEFAULT_REGION=us-east-1

[testenv:test-farm-apache2]
changedir = {[testenv:test-farm-tests-base]changedir}
commands =
    {[testenv:test-farm-tests-base]commands}
    {toxinidir}/tools/retry.sh letstest targets/targets.yaml {env:AWS_EC2_PEM_FILE} SET_BY_ENV scripts/test_apache2.sh --repo {toxinidir}
passenv = {[testenv:test-farm-tests-base]passenv}
setenv = {[testenv:test-farm-tests-base]setenv}
