From efcced236b6e9c50fe7afd87566f81f19d712e0d1ee5749a265cc59e5c7dcf4c Mon Sep 17 00:00:00 2001
From: Jan Matejek <ja+suse@matejcik.cz>
Date: Fri, 7 Apr 2017 17:25:54 +0000
Subject: [PATCH] Accepting request 486540 from
 devel:languages:python:singlespec

- update for singlespec
- improve test runner, drop tox-disable-env-tests.patch
- split off common python-tox-doc subpackage
- update to 2.7.0
  * improve environment information for users
  * add "alwayscopy" config option
  * slightly backwards-incompatible fix for {posargs} substitution
  * add Python 3.6 and 3.7 support
  * more bugfixes, see CHANGELOG for more details

OBS-URL: https://build.opensuse.org/request/show/486540
OBS-URL: https://build.opensuse.org/package/show/devel:languages:python/python-tox?expand=0&rev=31
---
 python-tox.changes          |  13 +
 python-tox.spec             | 104 +++--
 tox-2.3.1.tar.gz            |   3 -
 tox-2.7.0.tar.gz            |   3 +
 tox-disable-env-tests.patch | 881 ------------------------------------
 5 files changed, 75 insertions(+), 929 deletions(-)
 delete mode 100644 tox-2.3.1.tar.gz
 create mode 100644 tox-2.7.0.tar.gz
 delete mode 100644 tox-disable-env-tests.patch

diff --git a/python-tox.changes b/python-tox.changes
index 8fb6b9c..523ab03 100644
--- a/python-tox.changes
+++ b/python-tox.changes
@@ -1,3 +1,16 @@
+-------------------------------------------------------------------
+Fri Apr  7 15:01:37 UTC 2017 - jmatejek@suse.com
+
+- update for singlespec
+- improve test runner, drop tox-disable-env-tests.patch
+- split off common python-tox-doc subpackage
+- update to 2.7.0
+  * improve environment information for users
+  * add "alwayscopy" config option
+  * slightly backwards-incompatible fix for {posargs} substitution
+  * add Python 3.6 and 3.7 support
+  * more bugfixes, see CHANGELOG for more details
+
 -------------------------------------------------------------------
 Mon Feb 20 17:03:57 UTC 2017 - dmueller@suse.com
 
diff --git a/python-tox.spec b/python-tox.spec
index 77b73f5..ae74286 100644
--- a/python-tox.spec
+++ b/python-tox.spec
@@ -16,40 +16,34 @@
 #
 
 
+%{?!python_module:%define python_module() python-%{**} python3-%{**}}
 Name:           python-tox
-Version:        2.3.1
+Version:        2.7.0
 Release:        0
 Summary:        Virtualenv-based automation of test activities
 License:        MIT
 Group:          Development/Languages/Python
 Url:            http://tox.testrun.org/
-Source:         http://pypi.python.org/packages/source/t/tox/tox-%{version}.tar.gz
-# PATCH-FIX-OPENSUSE speilicke@suse.com -- Due to update-alternative usage, some bianries aren't available at build-time
-Patch0:         tox-disable-env-tests.patch
-BuildRequires:  python-devel
-# Documentation requirements:
-BuildRequires:  python-Sphinx
+Source:         https://files.pythonhosted.org/packages/source/t/tox/tox-%{version}.tar.gz
 # Test requirements:
-BuildRequires:  python-pip
-BuildRequires:  python-pluggy >= 0.3.0
-BuildRequires:  python-py >= 1.4.17
-BuildRequires:  python-pytest >= 2.3.5
-BuildRequires:  python-virtualenv >= 1.11.2
+BuildRequires:  %{python_module pip}
+BuildRequires:  %{python_module pluggy >= 0.3.0}
+BuildRequires:  %{python_module py >= 1.4.17}
+BuildRequires:  %{python_module pytest >= 2.3.5}
+BuildRequires:  %{python_module setuptools}
+BuildRequires:  %{python_module virtualenv >= 1.11.2}
+BuildRequires:  python-rpm-macros
+BuildRequires:  python3-Sphinx
 BuildRequires:  unzip
-Provides:       tox = %{version}
 Requires:       python-pluggy >= 0.3.0
 Requires:       python-py >= 1.4.17
 Requires:       python-virtualenv >= 1.11.2
-Requires(post): update-alternatives
+Requires(post):   update-alternatives
 Requires(postun): update-alternatives
+Provides:       tox = %{version}
 BuildRoot:      %{_tmppath}/%{name}-%{version}-build
-%if 0%{?suse_version} && 0%{?suse_version} <= 1110
-%{!?python_sitelib: %global python_sitelib %(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")}
-BuildRequires:  python-argparse
-Requires:       python-argparse
-%else
 BuildArch:      noarch
-%endif
+%python_subpackages
 
 %description
 Tox as is a generic virtualenv management and test command line tool you can
@@ -65,48 +59,68 @@ use for:
   servers, greatly reducing boilerplate and merging
   CI and shell-based testing.
 
+%package -n %{name}-doc
+Summary:        Documentation for tox, a virtualenv-based test automation
+Group:          Development/Languages/Python
+Recommends:     %{python_module tox = %{version}}
+Provides:       %{python_module tox-doc = %{version}}
+
+%description -n %{name}-doc
+Tox as is a generic virtualenv management and test command line tool you can
+use for:
+
+* checking your package installs correctly with different
+  Python versions and interpreters
+
+* running your tests in each of the
+  environments, configuring your test tool of choice
+
+* acting as a frontend to Continuous Integration
+  servers, greatly reducing boilerplate and merging
+  CI and shell-based testing.
+
+This is the HTML documentation for tox package.
+
 %prep
 %setup -q -n tox-%{version}
-%patch0 -p1
-sed -i -e "/^\\[testenv\\]/ a\\sitepackages = True" tox.ini
-sed -i -e "s/tox=tox:cmdline/tox-%{py_ver}=tox:cmdline/" \
-       -e "s/tox-quickstart=tox._quickstart:main/tox-quickstart-%{py_ver}=tox._quickstart:main/" setup.py
 
 %build
-python setup.py build
+%python_build
 cd doc && make html && rm -r _build/html/.buildinfo # Generate HTML documentation
 
 %install
-python setup.py install --prefix=%{_prefix} --root=%{buildroot}
-mkdir -p %{buildroot}%{_sysconfdir}/alternatives
+%python_install
 for B in tox tox-quickstart ; do
-  touch %{buildroot}%{_sysconfdir}/alternatives/$B
-  ln -sf %{_sysconfdir}/alternatives/$B %{buildroot}/%{_bindir}/$B
+    %python_clone -a %{buildroot}%{_bindir}/$B
 done
 
 %check
-PATH=%{buildroot}%{_bindir}:$PATH PYTHONPATH=%{buildroot}%{python_sitelib}/ py.test
+%{python_expand # okay
+$python -m virtualenv env-%{$python_bin_suffix} --system-site-packages
+. env-%{$python_bin_suffix}/bin/activate
+$python setup.py install
+# run test_config separately because it does something to other tests
+$python -m pytest tests/test_config.py
+# skip also cmdline tests, they are slow and mostly broken in our environment
+$python -m pytest tests -k "not test_config and not test_z_cmdline"
+deactivate
+}
 
 %post
-update-alternatives \
-    --install %{_bindir}/tox tox %{_bindir}/tox-%{py_ver} 20 \
-    --slave %{_bindir}/tox-quickstart tox-quickstart %{_bindir}/tox-quickstart-%{py_ver}
+%python_install_alternative tox tox-quickstart
 
 %postun
-if [ $1 -eq 0 ] ; then
-    update-alternatives --remove tox %{_bindir}/tox-%{py_ver}
-fi
+%python_uninstall_alternative tox
 
-%files
+%files %{python_files}
 %defattr(-,root,root,-)
-%doc LICENSE README.rst doc/_build/html
-%{_bindir}/tox
-%{_bindir}/tox-%{py_ver}
-%ghost %{_sysconfdir}/alternatives/tox
-%{_bindir}/tox-quickstart
-%{_bindir}/tox-quickstart-%{py_ver}
-%ghost %{_sysconfdir}/alternatives/tox-quickstart
-%{python_sitelib}/tox-%{version}-py%{py_ver}.egg-info
+%doc LICENSE README.rst CHANGELOG
+%python_alternative %{_bindir}/tox
+%python_alternative %{_bindir}/tox-quickstart
+%{python_sitelib}/tox-%{version}-py%{python_version}.egg-info
 %{python_sitelib}/tox
 
+%files -n %{name}-doc
+%doc LICENSE README.rst doc/_build/html
+
 %changelog
diff --git a/tox-2.3.1.tar.gz b/tox-2.3.1.tar.gz
deleted file mode 100644
index cdc5385..0000000
--- a/tox-2.3.1.tar.gz
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:bf7fcc140863820700d3ccd65b33820ba747b61c5fe4e2b91bb8c64cb21a47ee
-size 106447
diff --git a/tox-2.7.0.tar.gz b/tox-2.7.0.tar.gz
new file mode 100644
index 0000000..12b32ab
--- /dev/null
+++ b/tox-2.7.0.tar.gz
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9c3bdc06fe411d24015e8bbbab9d03dc5243a970154496aac13f9283682435f9
+size 120139
diff --git a/tox-disable-env-tests.patch b/tox-disable-env-tests.patch
deleted file mode 100644
index 138da74..0000000
--- a/tox-disable-env-tests.patch
+++ /dev/null
@@ -1,881 +0,0 @@
-Index: b/tests/test_config.py
-===================================================================
---- a/tests/test_config.py
-+++ b/tests/test_config.py
-@@ -88,26 +88,6 @@ class TestVenvConfig:
-             'dep1==1.5', 'dep2==2.1', 'dep3==3.0', 'dep4==4.0',
-         ]
- 
--    def test_force_dep_with_url(self, initproj):
--        initproj("example123-0.5", filedefs={
--            'tox.ini': '''
--            [tox]
--
--            [testenv]
--            deps=
--                dep1==1.0
--                https://pypi.python.org/xyz/pkg1.tar.gz
--            '''
--        })
--        config = parseconfig(
--            ['--force-dep=dep1==1.5'])
--        assert config.option.force_dep == [
--            'dep1==1.5'
--        ]
--        assert [str(x) for x in config.envconfigs['python'].deps] == [
--            'dep1==1.5', 'https://pypi.python.org/xyz/pkg1.tar.gz'
--        ]
--
-     def test_is_same_dep(self):
-         """
-         Ensure correct parseini._is_same_dep is working with a few samples.
-@@ -1784,84 +1764,6 @@ class TestParseEnv:
-         assert config.envconfigs['hello'].recreate
- 
- 
--class TestCmdInvocation:
--    def test_help(self, cmd):
--        result = cmd.run("tox", "-h")
--        assert not result.ret
--        result.stdout.fnmatch_lines([
--            "*help*",
--        ])
--
--    def test_version(self, cmd):
--        result = cmd.run("tox", "--version")
--        assert not result.ret
--        stdout = result.stdout.str()
--        assert tox.__version__ in stdout
--        assert "imported from" in stdout
--
--    def test_listenvs(self, cmd, initproj):
--        initproj('listenvs', filedefs={
--            'tox.ini': '''
--            [tox]
--            envlist=py26,py27,py33,pypy,docs
--
--            [testenv:notincluded]
--            changedir = whatever
--
--            [testenv:docs]
--            changedir = docs
--            ''',
--        })
--        result = cmd.run("tox", "-l")
--        result.stdout.fnmatch_lines("""
--            *py26*
--            *py27*
--            *py33*
--            *pypy*
--            *docs*
--        """)
--
--    def test_config_specific_ini(self, tmpdir, cmd):
--        ini = tmpdir.ensure("hello.ini")
--        result = cmd.run("tox", "-c", ini, "--showconfig")
--        assert not result.ret
--        result.stdout.fnmatch_lines([
--            "*config-file*hello.ini*",
--        ])
--
--    def test_no_tox_ini(self, cmd, initproj):
--        initproj("noini-0.5", )
--        result = cmd.run("tox")
--        assert result.ret
--        result.stderr.fnmatch_lines([
--            "*ERROR*tox.ini*not*found*",
--        ])
--
--    def test_showconfig_with_force_dep_version(self, cmd, initproj):
--        initproj('force_dep_version', filedefs={
--            'tox.ini': '''
--            [tox]
--
--            [testenv]
--            deps=
--                dep1==2.3
--                dep2
--            ''',
--        })
--        result = cmd.run("tox", "--showconfig")
--        assert result.ret == 0
--        result.stdout.fnmatch_lines([
--            r'*deps*dep1==2.3, dep2*',
--        ])
--        # override dep1 specific version, and force version for dep2
--        result = cmd.run("tox", "--showconfig", "--force-dep=dep1",
--                         "--force-dep=dep2==5.0")
--        assert result.ret == 0
--        result.stdout.fnmatch_lines([
--            r'*deps*dep1, dep2==5.0*',
--        ])
--
--
- @pytest.mark.parametrize("cmdline,envlist", [
-     ("-e py26", ['py26']),
-     ("-e py26,py33", ['py26', 'py33']),
-Index: b/tests/test_z_cmdline.py
-===================================================================
---- a/tests/test_z_cmdline.py
-+++ b/tests/test_z_cmdline.py
-@@ -1,760 +0,0 @@
--import tox
--import py
--import pytest
--from tox._pytestplugin import ReportExpectMock
--try:
--    import json
--except ImportError:
--    import simplejson as json
--
--pytest_plugins = "pytester"
--
--from tox.session import Session
--from tox.config import parseconfig
--
--
--def test_report_protocol(newconfig):
--    config = newconfig([], """
--            [testenv:mypython]
--            deps=xy
--    """)
--
--    class Popen:
--        def __init__(self, *args, **kwargs):
--            pass
--
--        def communicate(self):
--            return "", ""
--
--        def wait(self):
--            pass
--
--    session = Session(config, popen=Popen,
--                      Report=ReportExpectMock)
--    report = session.report
--    report.expect("using")
--    venv = session.getvenv("mypython")
--    action = session.newaction(venv, "update")
--    venv.update(action)
--    report.expect("logpopen")
--
--
--def test__resolve_pkg(tmpdir, mocksession):
--    distshare = tmpdir.join("distshare")
--    spec = distshare.join("pkg123-*")
--    py.test.raises(tox.exception.MissingDirectory,
--                   'mocksession._resolve_pkg(spec)')
--    distshare.ensure(dir=1)
--    py.test.raises(tox.exception.MissingDependency,
--                   'mocksession._resolve_pkg(spec)')
--    distshare.ensure("pkg123-1.3.5.zip")
--    p = distshare.ensure("pkg123-1.4.5.zip")
--
--    mocksession.report.clear()
--    result = mocksession._resolve_pkg(spec)
--    assert result == p
--    mocksession.report.expect("info", "determin*pkg123*")
--    distshare.ensure("pkg123-1.4.7dev.zip")
--    mocksession._clearmocks()
--    result = mocksession._resolve_pkg(spec)
--    mocksession.report.expect("warning", "*1.4.7*")
--    assert result == p
--    mocksession._clearmocks()
--    distshare.ensure("pkg123-1.4.5a1.tar.gz")
--    result = mocksession._resolve_pkg(spec)
--    assert result == p
--
--
--def test__resolve_pkg_doubledash(tmpdir, mocksession):
--    distshare = tmpdir.join("distshare")
--    p = distshare.ensure("pkg-mine-1.3.0.zip")
--    res = mocksession._resolve_pkg(distshare.join("pkg-mine*"))
--    assert res == p
--    distshare.ensure("pkg-mine-1.3.0a1.zip")
--    res = mocksession._resolve_pkg(distshare.join("pkg-mine*"))
--    assert res == p
--
--
--class TestSession:
--    def test_make_sdist(self, initproj):
--        initproj("example123-0.5", filedefs={
--            'tests': {'test_hello.py': "def test_hello(): pass"},
--            'tox.ini': '''
--            '''
--        })
--        config = parseconfig([])
--        session = Session(config)
--        sdist = session.get_installpkg_path()
--        assert sdist.check()
--        assert sdist.ext == ".zip"
--        assert sdist == config.distdir.join(sdist.basename)
--        sdist2 = session.get_installpkg_path()
--        assert sdist2 == sdist
--        sdist.write("hello")
--        assert sdist.stat().size < 10
--        sdist_new = Session(config).get_installpkg_path()
--        assert sdist_new == sdist
--        assert sdist_new.stat().size > 10
--
--    def test_make_sdist_distshare(self, tmpdir, initproj):
--        distshare = tmpdir.join("distshare")
--        initproj("example123-0.6", filedefs={
--            'tests': {'test_hello.py': "def test_hello(): pass"},
--            'tox.ini': '''
--            [tox]
--            distshare=%s
--            ''' % distshare
--        })
--        config = parseconfig([])
--        session = Session(config)
--        sdist = session.get_installpkg_path()
--        assert sdist.check()
--        assert sdist.ext == ".zip"
--        assert sdist == config.distdir.join(sdist.basename)
--        sdist_share = config.distshare.join(sdist.basename)
--        assert sdist_share.check()
--        assert sdist_share.read("rb") == sdist.read("rb"), (sdist_share, sdist)
--
--    def test_log_pcall(self, mocksession):
--        mocksession.config.logdir.ensure(dir=1)
--        assert not mocksession.config.logdir.listdir()
--        action = mocksession.newaction(None, "something")
--        action.popen(["echo", ])
--        match = mocksession.report.getnext("logpopen")
--        assert match[1].outpath.relto(mocksession.config.logdir)
--        assert match[1].shell is False
--
--    def test_summary_status(self, initproj, capfd):
--        initproj("logexample123-0.5", filedefs={
--            'tests': {'test_hello.py': "def test_hello(): pass"},
--            'tox.ini': '''
--            [testenv:hello]
--            [testenv:world]
--            '''
--        })
--        config = parseconfig([])
--        session = Session(config)
--        envs = session.venvlist
--        assert len(envs) == 2
--        env1, env2 = envs
--        env1.status = "FAIL XYZ"
--        assert env1.status
--        env2.status = 0
--        assert not env2.status
--        session._summary()
--        out, err = capfd.readouterr()
--        exp = "%s: FAIL XYZ" % env1.envconfig.envname
--        assert exp in out
--        exp = "%s: commands succeeded" % env2.envconfig.envname
--        assert exp in out
--
--    def test_getvenv(self, initproj, capfd):
--        initproj("logexample123-0.5", filedefs={
--            'tests': {'test_hello.py': "def test_hello(): pass"},
--            'tox.ini': '''
--            [testenv:hello]
--            [testenv:world]
--            '''
--        })
--        config = parseconfig([])
--        session = Session(config)
--        venv1 = session.getvenv("hello")
--        venv2 = session.getvenv("hello")
--        assert venv1 is venv2
--        venv1 = session.getvenv("world")
--        venv2 = session.getvenv("world")
--        assert venv1 is venv2
--        pytest.raises(LookupError, lambda: session.getvenv("qwe"))
--
--
--# not sure we want this option ATM
--def XXX_test_package(cmd, initproj):
--    initproj("myproj-0.6", filedefs={
--        'tests': {'test_hello.py': "def test_hello(): pass"},
--        'MANIFEST.in': """
--            include doc
--            include myproj
--            """,
--        'tox.ini': ''
--    })
--    result = cmd.run("tox", "package")
--    assert not result.ret
--    result.stdout.fnmatch_lines([
--        "*created sdist package at*",
--    ])
--
--
--def test_minversion(cmd, initproj):
--    initproj("interp123-0.5", filedefs={
--        'tests': {'test_hello.py': "def test_hello(): pass"},
--        'tox.ini': '''
--            [tox]
--            minversion = 6.0
--        '''
--    })
--    result = cmd.run("tox", "-v")
--    result.stdout.fnmatch_lines([
--        "*ERROR*tox version is * required is at least 6.0*"
--    ])
--    assert result.ret
--
--
--def test_run_custom_install_command_error(cmd, initproj):
--    initproj("interp123-0.5", filedefs={
--        'tox.ini': '''
--            [testenv]
--            install_command=./tox.ini {opts} {packages}
--        '''
--    })
--    result = cmd.run("tox")
--    result.stdout.fnmatch_lines([
--        "ERROR: invocation failed (errno *), args: ['*/tox.ini*",
--    ])
--    assert result.ret
--
--
--def test_unknown_interpreter_and_env(cmd, initproj):
--    initproj("interp123-0.5", filedefs={
--        'tests': {'test_hello.py': "def test_hello(): pass"},
--        'tox.ini': '''
--            [testenv:python]
--            basepython=xyz_unknown_interpreter
--            [testenv]
--            changedir=tests
--        '''
--    })
--    result = cmd.run("tox")
--    assert result.ret
--    result.stdout.fnmatch_lines([
--        "*ERROR*InterpreterNotFound*xyz_unknown_interpreter*",
--    ])
--
--    result = cmd.run("tox", "-exyz")
--    assert result.ret
--    result.stdout.fnmatch_lines([
--        "*ERROR*unknown*",
--    ])
--
--
--def test_unknown_interpreter(cmd, initproj):
--    initproj("interp123-0.5", filedefs={
--        'tests': {'test_hello.py': "def test_hello(): pass"},
--        'tox.ini': '''
--            [testenv:python]
--            basepython=xyz_unknown_interpreter
--            [testenv]
--            changedir=tests
--        '''
--    })
--    result = cmd.run("tox")
--    assert result.ret
--    result.stdout.fnmatch_lines([
--        "*ERROR*InterpreterNotFound*xyz_unknown_interpreter*",
--    ])
--
--
--def test_skip_platform_mismatch(cmd, initproj):
--    initproj("interp123-0.5", filedefs={
--        'tests': {'test_hello.py': "def test_hello(): pass"},
--        'tox.ini': '''
--            [testenv]
--            changedir=tests
--            platform=x123
--        '''
--    })
--    result = cmd.run("tox")
--    assert not result.ret
--    result.stdout.fnmatch_lines("""
--        SKIPPED*platform mismatch*
--    """)
--
--
--def test_skip_unknown_interpreter(cmd, initproj):
--    initproj("interp123-0.5", filedefs={
--        'tests': {'test_hello.py': "def test_hello(): pass"},
--        'tox.ini': '''
--            [testenv:python]
--            basepython=xyz_unknown_interpreter
--            [testenv]
--            changedir=tests
--        '''
--    })
--    result = cmd.run("tox", "--skip-missing-interpreters")
--    assert not result.ret
--    result.stdout.fnmatch_lines([
--        "*SKIPPED*InterpreterNotFound*xyz_unknown_interpreter*",
--    ])
--
--
--def test_unknown_dep(cmd, initproj):
--    initproj("dep123-0.7", filedefs={
--        'tests': {'test_hello.py': "def test_hello(): pass"},
--        'tox.ini': '''
--            [testenv]
--            deps=qweqwe123
--            changedir=tests
--        '''
--    })
--    result = cmd.run("tox", )
--    assert result.ret
--    result.stdout.fnmatch_lines([
--        "*ERROR*could not install*qweqwe123*",
--    ])
--
--
--def test_venv_special_chars_issue252(cmd, initproj):
--    initproj("pkg123-0.7", filedefs={
--        'tests': {'test_hello.py': "def test_hello(): pass"},
--        'tox.ini': '''
--            [tox]
--            envlist = special&&1
--            [testenv:special&&1]
--            changedir=tests
--        '''
--    })
--    result = cmd.run("tox", )
--    assert result.ret == 0
--    result.stdout.fnmatch_lines([
--        "*installed*pkg123*"
--    ])
--
--
--def test_unknown_environment(cmd, initproj):
--    initproj("env123-0.7", filedefs={
--        'tox.ini': ''
--    })
--    result = cmd.run("tox", "-e", "qpwoei")
--    assert result.ret
--    result.stdout.fnmatch_lines([
--        "*ERROR*unknown*environment*qpwoei*",
--    ])
--
--
--def test_skip_sdist(cmd, initproj):
--    initproj("pkg123-0.7", filedefs={
--        'tests': {'test_hello.py': "def test_hello(): pass"},
--        'setup.py': """
--            syntax error
--        """,
--        'tox.ini': '''
--            [tox]
--            skipsdist=True
--            [testenv]
--            commands=python -c "print('done')"
--        '''
--    })
--    result = cmd.run("tox", )
--    assert result.ret == 0
--
--
--def test_minimal_setup_py_empty(cmd, initproj):
--    initproj("pkg123-0.7", filedefs={
--        'tests': {'test_hello.py': "def test_hello(): pass"},
--        'setup.py': """
--        """,
--        'tox.ini': ''
--
--    })
--    result = cmd.run("tox", )
--    assert result.ret == 1
--    result.stdout.fnmatch_lines([
--        "*ERROR*empty*",
--    ])
--
--
--def test_minimal_setup_py_comment_only(cmd, initproj):
--    initproj("pkg123-0.7", filedefs={
--        'tests': {'test_hello.py': "def test_hello(): pass"},
--        'setup.py': """\n# some comment
--
--        """,
--        'tox.ini': ''
--
--    })
--    result = cmd.run("tox", )
--    assert result.ret == 1
--    result.stdout.fnmatch_lines([
--        "*ERROR*empty*",
--    ])
--
--
--def test_minimal_setup_py_non_functional(cmd, initproj):
--    initproj("pkg123-0.7", filedefs={
--        'tests': {'test_hello.py': "def test_hello(): pass"},
--        'setup.py': """
--        import sys
--
--        """,
--        'tox.ini': ''
--
--    })
--    result = cmd.run("tox", )
--    assert result.ret == 1
--    result.stdout.fnmatch_lines([
--        "*ERROR*check setup.py*",
--    ])
--
--
--def test_sdist_fails(cmd, initproj):
--    initproj("pkg123-0.7", filedefs={
--        'tests': {'test_hello.py': "def test_hello(): pass"},
--        'setup.py': """
--            syntax error
--        """,
--        'tox.ini': '',
--    })
--    result = cmd.run("tox", )
--    assert result.ret
--    result.stdout.fnmatch_lines([
--        "*FAIL*could not package project*",
--    ])
--
--
--def test_package_install_fails(cmd, initproj):
--    initproj("pkg123-0.7", filedefs={
--        'tests': {'test_hello.py': "def test_hello(): pass"},
--        'setup.py': """
--            from setuptools import setup
--            setup(
--                name='pkg123',
--                description='pkg123 project',
--                version='0.7',
--                license='MIT',
--                platforms=['unix', 'win32'],
--                packages=['pkg123',],
--                install_requires=['qweqwe123'],
--                )
--            """,
--        'tox.ini': '',
--    })
--    result = cmd.run("tox", )
--    assert result.ret
--    result.stdout.fnmatch_lines([
--        "*InvocationError*",
--    ])
--
--
--class TestToxRun:
--    @pytest.fixture
--    def example123(self, initproj):
--        initproj("example123-0.5", filedefs={
--            'tests': {
--                'test_hello.py': """
--                    def test_hello(pytestconfig):
--                        pass
--                """,
--            },
--            'tox.ini': '''
--                [testenv]
--                changedir=tests
--                commands= py.test --basetemp={envtmpdir} \
--                                  --junitxml=junit-{envname}.xml
--                deps=pytest
--            '''
--        })
--
--    def test_toxuone_env(self, cmd, example123):
--        result = cmd.run("tox")
--        assert not result.ret
--        result.stdout.fnmatch_lines([
--            "*junit-python.xml*",
--            "*1 passed*",
--        ])
--        result = cmd.run("tox", "-epython", )
--        assert not result.ret
--        result.stdout.fnmatch_lines([
--            "*1 passed*",
--            "*summary*",
--            "*python: commands succeeded"
--        ])
--
--    def test_different_config_cwd(self, cmd, example123, monkeypatch):
--        # see that things work with a different CWD
--        monkeypatch.chdir(cmd.tmpdir)
--        result = cmd.run("tox", "-c", "example123/tox.ini")
--        assert not result.ret
--        result.stdout.fnmatch_lines([
--            "*1 passed*",
--            "*summary*",
--            "*python: commands succeeded"
--        ])
--
--    def test_json(self, cmd, example123):
--        # see that tests can also fail and retcode is correct
--        testfile = py.path.local("tests").join("test_hello.py")
--        assert testfile.check()
--        testfile.write("def test_fail(): assert 0")
--        jsonpath = cmd.tmpdir.join("res.json")
--        result = cmd.run("tox", "--result-json", jsonpath)
--        assert result.ret == 1
--        data = json.load(jsonpath.open("r"))
--        verify_json_report_format(data)
--        result.stdout.fnmatch_lines([
--            "*1 failed*",
--            "*summary*",
--            "*python: *failed*",
--        ])
--
--
--def test_develop(initproj, cmd):
--    initproj("example123", filedefs={'tox.ini': """
--    """})
--    result = cmd.run("tox", "-vv", "--develop")
--    assert not result.ret
--    assert "sdist-make" not in result.stdout.str()
--
--
--def test_usedevelop(initproj, cmd):
--    initproj("example123", filedefs={'tox.ini': """
--            [testenv]
--            usedevelop=True
--    """})
--    result = cmd.run("tox", "-vv")
--    assert not result.ret
--    assert "sdist-make" not in result.stdout.str()
--
--
--def test_usedevelop_mixed(initproj, cmd):
--    initproj("example123", filedefs={'tox.ini': """
--            [testenv:devenv]
--            usedevelop=True
--            [testenv:nondev]
--            usedevelop=False
--    """})
--
--    # running only 'devenv' should not do sdist
--    result = cmd.run("tox", "-vv", "-e", "devenv")
--    assert not result.ret
--    assert "sdist-make" not in result.stdout.str()
--
--    # running all envs should do sdist
--    result = cmd.run("tox", "-vv")
--    assert not result.ret
--    assert "sdist-make" in result.stdout.str()
--
--
--def test_test_usedevelop(cmd, initproj):
--    initproj("example123-0.5", filedefs={
--        'tests': {
--            'test_hello.py': """
--                def test_hello(pytestconfig):
--                    pass
--            """,
--        },
--        'tox.ini': '''
--            [testenv]
--            usedevelop=True
--            changedir=tests
--            commands=
--                py.test --basetemp={envtmpdir} --junitxml=junit-{envname}.xml []
--            deps=pytest
--        '''
--    })
--    result = cmd.run("tox", "-v")
--    assert not result.ret
--    result.stdout.fnmatch_lines([
--        "*junit-python.xml*",
--        "*1 passed*",
--    ])
--    assert "sdist-make" not in result.stdout.str()
--    result = cmd.run("tox", "-epython", )
--    assert not result.ret
--    result.stdout.fnmatch_lines([
--        "*1 passed*",
--        "*summary*",
--        "*python: commands succeeded"
--    ])
--    # see that things work with a different CWD
--    old = cmd.tmpdir.chdir()
--    result = cmd.run("tox", "-c", "example123/tox.ini")
--    assert not result.ret
--    result.stdout.fnmatch_lines([
--        "*1 passed*",
--        "*summary*",
--        "*python: commands succeeded"
--    ])
--    old.chdir()
--    # see that tests can also fail and retcode is correct
--    testfile = py.path.local("tests").join("test_hello.py")
--    assert testfile.check()
--    testfile.write("def test_fail(): assert 0")
--    result = cmd.run("tox", )
--    assert result.ret
--    result.stdout.fnmatch_lines([
--        "*1 failed*",
--        "*summary*",
--        "*python: *failed*",
--    ])
--
--
--def test_test_piphelp(initproj, cmd):
--    initproj("example123", filedefs={'tox.ini': """
--        # content of: tox.ini
--        [testenv]
--        commands=pip -h
--        [testenv:py26]
--        basepython=python
--        [testenv:py27]
--        basepython=python
--    """})
--    result = cmd.run("tox")
--    assert not result.ret
--
--
--def test_notest(initproj, cmd):
--    initproj("example123", filedefs={'tox.ini': """
--        # content of: tox.ini
--        [testenv:py26]
--        basepython=python
--    """})
--    result = cmd.run("tox", "-v", "--notest")
--    assert not result.ret
--    result.stdout.fnmatch_lines([
--        "*summary*",
--        "*py26*skipped tests*",
--    ])
--    result = cmd.run("tox", "-v", "--notest", "-epy26")
--    assert not result.ret
--    result.stdout.fnmatch_lines([
--        "*py26*reusing*",
--    ])
--
--
--def test_PYC(initproj, cmd, monkeypatch):
--    initproj("example123", filedefs={'tox.ini': ''})
--    monkeypatch.setenv("PYTHONDOWNWRITEBYTECODE", 1)
--    result = cmd.run("tox", "-v", "--notest")
--    assert not result.ret
--    result.stdout.fnmatch_lines([
--        "*create*",
--    ])
--
--
--def test_env_VIRTUALENV_PYTHON(initproj, cmd, monkeypatch):
--    initproj("example123", filedefs={'tox.ini': ''})
--    monkeypatch.setenv("VIRTUALENV_PYTHON", '/FOO')
--    result = cmd.run("tox", "-v", "--notest")
--    assert not result.ret, result.stdout.lines
--    result.stdout.fnmatch_lines([
--        "*create*",
--    ])
--
--
--def test_sdistonly(initproj, cmd):
--    initproj("example123", filedefs={'tox.ini': """
--    """})
--    result = cmd.run("tox", "-v", "--sdistonly")
--    assert not result.ret
--    result.stdout.fnmatch_lines([
--        "*sdist-make*setup.py*",
--    ])
--    assert "-mvirtualenv" not in result.stdout.str()
--
--
--def test_separate_sdist_no_sdistfile(cmd, initproj):
--    distshare = cmd.tmpdir.join("distshare")
--    initproj(("pkg123-foo", "0.7"), filedefs={
--        'tox.ini': """
--            [tox]
--            distshare=%s
--        """ % distshare
--    })
--    result = cmd.run("tox", "--sdistonly")
--    assert not result.ret
--    l = distshare.listdir()
--    assert len(l) == 1
--    sdistfile = l[0]
--    assert 'pkg123-foo-0.7.zip' in str(sdistfile)
--
--
--def test_separate_sdist(cmd, initproj):
--    distshare = cmd.tmpdir.join("distshare")
--    initproj("pkg123-0.7", filedefs={
--        'tox.ini': """
--            [tox]
--            distshare=%s
--            sdistsrc={distshare}/pkg123-0.7.zip
--        """ % distshare
--    })
--    result = cmd.run("tox", "--sdistonly")
--    assert not result.ret
--    l = distshare.listdir()
--    assert len(l) == 1
--    sdistfile = l[0]
--    result = cmd.run("tox", "-v", "--notest")
--    assert not result.ret
--    result.stdout.fnmatch_lines([
--        "*inst*%s*" % sdistfile,
--    ])
--
--
--def test_sdist_latest(tmpdir, newconfig):
--    distshare = tmpdir.join("distshare")
--    config = newconfig([], """
--            [tox]
--            distshare=%s
--            sdistsrc={distshare}/pkg123-*
--    """ % distshare)
--    p = distshare.ensure("pkg123-1.4.5.zip")
--    distshare.ensure("pkg123-1.4.5a1.zip")
--    session = Session(config)
--    sdist_path = session.get_installpkg_path()
--    assert sdist_path == p
--
--
--def test_installpkg(tmpdir, newconfig):
--    p = tmpdir.ensure("pkg123-1.0.zip")
--    config = newconfig(["--installpkg=%s" % p], "")
--    session = Session(config)
--    sdist_path = session.get_installpkg_path()
--    assert sdist_path == p
--
--
--@pytest.mark.xfail("sys.platform == 'win32'", reason="test needs better impl")
--def test_envsitepackagesdir(cmd, initproj):
--    initproj("pkg512-0.0.5", filedefs={
--        'tox.ini': """
--        [testenv]
--        commands=
--            python -c "print(r'X:{envsitepackagesdir}')"
--    """})
--    result = cmd.run("tox")
--    assert result.ret == 0
--    result.stdout.fnmatch_lines("""
--        X:*tox*site-packages*
--    """)
--
--
--@pytest.mark.xfail("sys.platform == 'win32'", reason="test needs better impl")
--def test_envsitepackagesdir_skip_missing_issue280(cmd, initproj):
--    initproj("pkg513-0.0.5", filedefs={
--        'tox.ini': """
--        [testenv]
--        basepython=/usr/bin/qwelkjqwle
--        commands=
--            {envsitepackagesdir}
--    """})
--    result = cmd.run("tox", "--skip-missing-interpreters")
--    assert result.ret == 0
--    result.stdout.fnmatch_lines("""
--        SKIPPED:*qwelkj*
--    """)
--
--
--def verify_json_report_format(data, testenvs=True):
--    assert data["reportversion"] == "1"
--    assert data["toxversion"] == tox.__version__
--    if testenvs:
--        for envname, envdata in data["testenvs"].items():
--            for commandtype in ("setup", "test"):
--                if commandtype not in envdata:
--                    continue
--                for command in envdata[commandtype]:
--                    assert command["output"]
--                    assert command["retcode"]
--            if envname != "GLOB":
--                assert isinstance(envdata["installed_packages"], list)
--                pyinfo = envdata["python"]
--                assert isinstance(pyinfo["version_info"], list)
--                assert pyinfo["version"]
--                assert pyinfo["executable"]