# Tox (http://tox.testrun.org/) is a tool for running tests
# in multiple virtualenvs. This configuration file will run the
# test suite on all supported python versions. To use it, "pip install tox"
# and then run "tox" from this directory.

[pytest]
twisted = 1

[tox]
envlist = {py27,pypy27}{-coverage,}
minversion = 2.4

[testenv]
passenv = TAHOE_LAFS_* PIP_* SUBUNITREPORTER_* USERPROFILE HOMEDRIVE HOMEPATH
# Get "certifi" to avoid bug #2913. Basically if a `setup_requires=...` causes
# a package to be installed (with setuptools) then it'll fail on certain
# platforms (travis's OX-X 10.12, Slackware 14.2) because PyPI's TLS
# requirements (TLS >= 1.2) are incompatible with the old TLS clients
# available to those systems.  Installing it ahead of time (with pip) avoids
# this problem.
deps =
     # Pin all of these versions for the same reason you ever want to pin
     # anything: to prevent new releases with regressions from introducing
     # spurious failures into CI runs for whatever development work is
     # happening at the time.  The versions selected here are just the current
     # versions at the time.  Bumping them to keep up with future releases is
     # fine as long as those releases are known to actually work.
     pip==19.1.1
     setuptools==41.0.1
     wheel==0.33.4
     subunitreporter==19.3.2
     # As an exception, we don't pin certifi because it contains CA
     # certificates which necessarily change over time.  Pinning this is
     # guaranteed to cause things to break eventually as old certificates
     # expire and as new ones are used in the wild that aren't present in
     # whatever version we pin.  Hopefully there won't be functionality
     # regressions in new releases of this package that cause us the kind of
     # suffering we're trying to avoid with the above pins.
     certifi

# We add usedevelop=False because testing against a true installation gives
# more useful results.
usedevelop = False
# We use extras=test to get things like "mock" that are required for our unit
# tests.
extras = test
commands =
         tahoe --version
         trial {env:TAHOE_LAFS_TRIAL_ARGS:--rterrors} {posargs:allmydata}

[testenv:integration]
setenv =
         COVERAGE_PROCESS_START=.coveragerc
commands =
	 # NOTE: 'run with "py.test --keep-tempdir -s -v integration/" to debug failures'
	 py.test --coverage -v {posargs:integration}
         coverage combine
         coverage report

[testenv:coverage]
# coverage (with --branch) takes about 65% longer to run
commands =
	 # As an aid to debugging, dump all of the Python packages and their
	 # versions that are installed in the test environment.  This is
	 # particularly useful to get from CI runs - though hopefully the
	 # version pinning we do limits the variability of this output
	 # somewhat.
         pip freeze
         tahoe --version
         coverage run --branch -m twisted.trial {env:TAHOE_LAFS_TRIAL_ARGS:--rterrors --reporter=timing} {posargs:allmydata}
         coverage combine
         coverage xml

[testenv:codechecks]
whitelist_externals =
         /bin/mv
commands =
         flake8 src static misc setup.py
         python misc/coding_tools/check-umids.py src
         python misc/coding_tools/check-debugging.py
         python misc/coding_tools/find-trailing-spaces.py -r src static misc setup.py
         python misc/coding_tools/check-miscaptures.py

	 # If towncrier.check fails, you forgot to add a towncrier news
	 # fragment explaining the change in this branch.  Create one at
	 # `newsfragments/<ticket>.<change type>` with some text for the news
	 # file.  See pyproject.toml for legal <change type> values.
	 python -m towncrier.check --pyproject towncrier.pyproject.toml

[testenv:draftnews]
passenv = TAHOE_LAFS_* PIP_* SUBUNITREPORTER_* USERPROFILE HOMEDRIVE HOMEPATH
# see comment in [testenv] about "certifi"
whitelist_externals = mv
deps =
     certifi
     towncrier >= 19.2
commands =
         # With pip >= 10 the existence of pyproject.toml (which we are
         # required to have to configure towncrier) triggers a "build
         # isolation" mode which prevents anything from working.  Avoid
         # triggering that pip behavior by keeping the towncrier configuration
         # somewhere else and only bringing it in when it's actually needed
         # (after pip is done).
         #
         # Some discussion is available at
         # https://github.com/pypa/pip/issues/5696
	 #
	 # towncrier post 19.2 (unreleased as of this writing) adds a --config
	 # option that can be used instead of this file shuffling.
         mv towncrier.pyproject.toml pyproject.toml

         # towncrier 19.2 + works with python2.7
         python -m towncrier --draft

         # put it back
         mv pyproject.toml towncrier.pyproject.toml

[testenv:news]
passenv = TAHOE_LAFS_* PIP_* SUBUNITREPORTER_* USERPROFILE HOMEDRIVE HOMEPATH
# see comment in [testenv] about "certifi"
whitelist_externals = mv
deps =
     certifi
     towncrier >= 19.2
commands =
         # With pip >= 10 the existence of pyproject.toml (which we are
         # required to have to configure towncrier) triggers a "build
         # isolation" mode which prevents anything from working.  Avoid
         # triggering that pip behavior by keeping the towncrier configuration
         # somewhere else and only bringing it in when it's actually needed
         # (after pip is done).
         #
         # Some discussion is available at
         # https://github.com/pypa/pip/issues/5696
	 #
	 # towncrier post 19.2 (unreleased as of this writing) adds a --config
	 # option that can be used instead of this file shuffling.
         mv towncrier.pyproject.toml pyproject.toml

         # towncrier 19.2 + works with python2.7
         python -m towncrier --yes

         # put it back
         mv pyproject.toml towncrier.pyproject.toml

         # commit the changes
         git commit -m "update NEWS.txt for release"

[testenv:deprecations]
setenv =
         PYTHONWARNINGS=default::DeprecationWarning
commands =
         python misc/build_helpers/run-deprecations.py --package allmydata --warnings={env:TAHOE_LAFS_WARNINGS_LOG:_trial_temp/deprecation-warnings.log} trial {env:TAHOE_LAFS_TRIAL_ARGS:--rterrors} {posargs:allmydata}

[testenv:upcoming-deprecations]
setenv =
         PYTHONWARNINGS=default::DeprecationWarning
deps =
     # Take the base deps as well!
     {[testenv]deps}
     git+https://github.com/warner/foolscap
commands =
         flogtool --version
         python misc/build_helpers/run-deprecations.py --package allmydata --warnings={env:TAHOE_LAFS_WARNINGS_LOG:_trial_temp/deprecation-warnings.log} trial {env:TAHOE_LAFS_TRIAL_ARGS:--rterrors} {posargs:allmydata}

[testenv:checkmemory]
commands =
         rm -rf _test_memory
         python src/allmydata/test/check_memory.py upload
         python src/allmydata/test/check_memory.py upload-self
         python src/allmydata/test/check_memory.py upload-POST
         python src/allmydata/test/check_memory.py download
         python src/allmydata/test/check_memory.py download-GET
         python src/allmydata/test/check_memory.py download-GET-slow
         python src/allmydata/test/check_memory.py receive

# Use 'tox -e docs' to check formatting and cross-references in docs .rst
# files. The published docs are built by code run over at readthedocs.org,
# which does not use this target (but does something similar).
#
# If you have "sphinx" installed in your virtualenv, you can just do "make -C
# docs html", or "cd docs; make html".
#
# You can also open docs/_build/html/index.html to see the rendered docs in
# your web browser.

[testenv:docs]
# we pin docutils because of https://sourceforge.net/p/docutils/bugs/301/
# which asserts when it reads links to .svg files (e.g. about.rst)
deps =
     sphinx
     docutils==0.12
# normal install is not needed for docs, and slows things down
skip_install = True
commands =
         sphinx-build -b html -d {toxinidir}/docs/_build/doctrees {toxinidir}/docs {toxinidir}/docs/_build/html

[testenv:pyinstaller]
# We override this to pass --no-use-pep517 because pyinstaller (3.4, at least)
# is broken when this feature is enabled.
install_command = python -m pip install --no-use-pep517 {opts} {packages}
extras =
deps =
    {[testenv]deps}
    packaging
    pyinstaller
# Setting PYTHONHASHSEED to a known value assists with reproducible builds.
# See https://pyinstaller.readthedocs.io/en/stable/advanced-topics.html#creating-a-reproducible-build
setenv=PYTHONHASHSEED=1
commands=
    pip freeze
    pyinstaller -y --clean pyinstaller.spec

[testenv:tarballs]
deps =
commands =
         python setup.py update_version
         python setup.py sdist --formats=bztar,gztar,zip bdist_wheel