pypa / pip

The Python package installer
https://pip.pypa.io/
MIT License
9.51k stars 3.02k forks source link

Many test failures on master (macOS, Framework Python 3.8) #7806

Open jaraco opened 4 years ago

jaraco commented 4 years ago

Environment

Description

Running the test suite on a clean checkout (tox with TOXENV=python), 16 tests fail consistently.

Expected behavior

Test suite should pass on popular operating systems.

Output

``` pip master $ tox GLOB sdist-make: /Users/jaraco/code/public/pypa/pip/setup.py python inst-nodeps: /Users/jaraco/code/public/pypa/pip/.tox/.tmp/package/1/pip-20.1.dev0.zip python installed: apipkg==1.5,atomicwrites==1.3.0,attrs==19.3.0,cffi==1.14.0,coverage==5.0.3,cryptography==2.8,csv23==0.1.6,execnet==1.7.1,freezegun==0.3.15,mock==4.0.1,more-itertools==8.2.0,pip==20.1.dev0,pluggy==0.13.1,pretend==1.0.9,py==1.8.1,pycparser==2.19,pytest==3.8.2,pytest-cov==2.8.1,pytest-forked==1.1.3,pytest-rerunfailures==6.0,pytest-timeout==1.3.4,pytest-xdist==1.27.0,python-dateutil==2.8.1,PyYAML==5.3,scripttest==1.3,setuptools==41.2.0,six==1.14.0,virtualenv==16.7.10,Werkzeug==0.16.0,wheel==0.34.2 python run-test-pre: PYTHONHASHSEED='1967842165' python run-test-pre: commands[0] | python -c 'import shutil, sys; shutil.rmtree(sys.argv[1], ignore_errors=True)' /Users/jaraco/code/public/pypa/pip/tests/data/common_wheels python run-test-pre: commands[1] | python /Users/jaraco/code/public/pypa/pip/tools/tox_pip.py wheel -w /Users/jaraco/code/public/pypa/pip/tests/data/common_wheels -r /Users/jaraco/code/public/pypa/pip/tools/requirements/tests-common_wheels.txt Collecting setuptools>=40.8.0 Using cached setuptools-45.2.0-py3-none-any.whl (584 kB) Saved ./tests/data/common_wheels/setuptools-45.2.0-py3-none-any.whl Collecting wheel Using cached wheel-0.34.2-py2.py3-none-any.whl (26 kB) Saved ./tests/data/common_wheels/wheel-0.34.2-py2.py3-none-any.whl Skipping setuptools, due to already being wheel. Skipping wheel, due to already being wheel. python run-test: commands[0] | pytest --timeout 300 ========================================================================== test session starts =========================================================================== platform darwin -- Python 3.8.1, pytest-3.8.2, py-1.8.1, pluggy-0.13.1 rootdir: /Users/jaraco/code/public/pypa/pip, inifile: setup.cfg plugins: timeout-1.3.4, rerunfailures-6.0, forked-1.1.3, cov-2.8.1, xdist-1.27.0 timeout: 300.0s timeout method: signal timeout func_only: False collected 1833 items tests/functional/test_broken_stdout.py ... [ 0%] tests/functional/test_check.py .......... [ 0%] tests/functional/test_cli.py ... [ 0%] tests/functional/test_completion.py ..................... [ 2%] tests/functional/test_configuration.py .s... [ 2%] tests/functional/test_debug.py ............. [ 3%] tests/functional/test_download.py ...................................... [ 5%] tests/functional/test_freeze.py .....Fx................. [ 6%] tests/functional/test_hash.py ... [ 6%] tests/functional/test_help.py ....... [ 6%] tests/functional/test_install.py .......................F........................s.............................................................F........ [ 13%] tests/functional/test_install_check.py .. [ 13%] tests/functional/test_install_cleanup.py ......... [ 14%] tests/functional/test_install_compat.py .. [ 14%] tests/functional/test_install_config.py ........ [ 14%] tests/functional/test_install_extras.py ....... [ 14%] tests/functional/test_install_force_reinstall.py .. [ 15%] tests/functional/test_install_index.py .... [ 15%] tests/functional/test_install_reqs.py ........F..........................x... [ 17%] tests/functional/test_install_upgrade.py ................... [ 18%] tests/functional/test_install_user.py .FF.FFFF. [ 18%] tests/functional/test_install_vcs_git.py ........................ [ 20%] tests/functional/test_install_wheel.py .............F................ [ 21%] tests/functional/test_list.py ............................ [ 23%] tests/functional/test_no_color.py s [ 23%] tests/functional/test_pep517.py ............. [ 24%] tests/functional/test_requests.py s [ 24%] tests/functional/test_search.py ...s....... [ 24%] tests/functional/test_show.py .................... [ 25%] tests/functional/test_uninstall.py .............F.F........ [ 27%] tests/functional/test_uninstall_user.py FFF [ 27%] tests/functional/test_vcs_bazaar.py s.. [ 27%] tests/functional/test_vcs_git.py ........... [ 28%] tests/functional/test_vcs_mercurial.py . [ 28%] tests/functional/test_warning.py ....ss [ 28%] tests/functional/test_wheel.py .................... [ 29%] tests/functional/test_yaml.py xx...........x [ 30%] tests/lib/test_lib.py .................... [ 31%] tests/lib/test_wheel.py ................. [ 32%] tests/unit/test_appdirs.py ................. [ 33%] tests/unit/test_base_command.py ............ [ 33%] tests/unit/test_build_env.py ..... [ 34%] tests/unit/test_cache.py ...... [ 34%] tests/unit/test_check.py .. [ 34%] tests/unit/test_cmdoptions.py ........... [ 35%] tests/unit/test_collector.py ...........................................s............s.s................... [ 39%] tests/unit/test_command_install.py ............... [ 40%] tests/unit/test_commands.py .................................. [ 42%] tests/unit/test_compat.py .................. [ 43%] tests/unit/test_configuration.py ...................... [ 44%] tests/unit/test_finder.py ............................... [ 46%] tests/unit/test_format_control.py ......... [ 46%] tests/unit/test_index.py .................................................................................................... [ 52%] tests/unit/test_link.py .................................. [ 53%] tests/unit/test_locations.py .ss [ 54%] tests/unit/test_logging.py ............. [ 54%] tests/unit/test_models.py ..... [ 55%] tests/unit/test_models_wheel.py ................. [ 55%] tests/unit/test_network_auth.py ................... [ 57%] tests/unit/test_network_cache.py ..... [ 57%] tests/unit/test_network_download.py ................... [ 58%] tests/unit/test_network_session.py ............................. [ 59%] tests/unit/test_operations_prepare.py ........... [ 60%] tests/unit/test_options.py ........................................................... [ 63%] tests/unit/test_packaging.py .... [ 63%] tests/unit/test_pep425tags.py ........... [ 64%] tests/unit/test_pep517.py ....... [ 64%] tests/unit/test_req.py .................................................sss....... [ 68%] tests/unit/test_req_file.py ............................................................. [ 71%] tests/unit/test_req_install.py ..... [ 71%] tests/unit/test_req_uninstall.py ............. [ 72%] tests/unit/test_resolution_legacy_resolver.py ....... [ 72%] tests/unit/test_search_scope.py .. [ 72%] tests/unit/test_self_check_outdated.py ................ [ 73%] tests/unit/test_target_python.py ................... [ 74%] tests/unit/test_urls.py .....s........s [ 75%] tests/unit/test_utils.py ......................................................................................................................................... [ 83%] ........... [ 83%] tests/unit/test_utils_distutils_args.py ................. [ 84%] tests/unit/test_utils_filesystem.py ....... [ 85%] tests/unit/test_utils_pkg_resources.py .. [ 85%] tests/unit/test_utils_subprocess.py ......ss............. [ 86%] tests/unit/test_utils_temp_dir.py ..................................... [ 88%] tests/unit/test_utils_unpacking.py ........... [ 88%] tests/unit/test_utils_virtualenv.py ..................... [ 90%] tests/unit/test_utils_wheel.py ............ [ 90%] tests/unit/test_vcs.py s................................................................................................. [ 96%] tests/unit/test_vcs_mercurial.py . [ 96%] tests/unit/test_wheel.py ....................................... [ 98%] tests/unit/test_wheel_builder.py ................................ [100%] ================================================================================ FAILURES ================================================================================ ____________________________________________________________________________ test_freeze_svn _____________________________________________________________________________ script = tmpdir = Path('/private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_freeze_svn0') @need_svn def test_freeze_svn(script, tmpdir): """Test freezing a svn checkout""" > checkout_path = _create_test_package(script, vcs='svn') tests/functional/test_freeze.py:178: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/lib/__init__.py:869: in _create_test_package return _vcs_add(script, version_pkg_path, vcs) tests/lib/__init__.py:771: in _vcs_add repo_url = _create_svn_repo(script, version_pkg_path) tests/lib/__init__.py:875: in _create_svn_repo script.run( tests/lib/__init__.py:591: in run result = super(PipTestEnvironment, self).run(cwd=cwd, *args, **kw) /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/subprocess.py:854: in __init__ self._execute_child(args, executable, preexec_fn, close_fds, _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = , args = ['svnadmin', 'create', 'pip-test-package-repo'], executable = b'svnadmin', preexec_fn = None, close_fds = True pass_fds = (), cwd = Path('/private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_freeze_svn0/workspace/scratch') env = {'GIT_AUTHOR_EMAIL': 'pypa-dev@googlegroups.com', 'GIT_AUTHOR_NAME': 'pip', 'GIT_CONFIG_NOSYSTEM': '1', 'HOME': '/private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_freeze_svn0/home', ...} startupinfo = None, creationflags = 0, shell = False, p2cread = 9, p2cwrite = 12, c2pread = 13, c2pwrite = 14, errread = 15, errwrite = 16, restore_signals = True start_new_session = False def _execute_child(self, args, executable, preexec_fn, close_fds, pass_fds, cwd, env, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, restore_signals, start_new_session): """Execute program (POSIX version)""" if isinstance(args, (str, bytes)): args = [args] elif isinstance(args, os.PathLike): if shell: raise TypeError('path-like args is not allowed when ' 'shell is true') args = [args] else: args = list(args) if shell: # On Android the default shell is at '/system/bin/sh'. unix_shell = ('/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh') args = [unix_shell, "-c"] + args if executable: args[0] = executable if executable is None: executable = args[0] sys.audit("subprocess.Popen", executable, args, cwd, env) if (_USE_POSIX_SPAWN and os.path.dirname(executable) and preexec_fn is None and not close_fds and not pass_fds and cwd is None and (p2cread == -1 or p2cread > 2) and (c2pwrite == -1 or c2pwrite > 2) and (errwrite == -1 or errwrite > 2) and not start_new_session): self._posix_spawn(args, executable, env, restore_signals, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite) return orig_executable = executable # For transferring possible exec failure from child to parent. # Data format: "exception name:hex errno:description" # Pickle is not used; it is complex and involves memory allocation. errpipe_read, errpipe_write = os.pipe() # errpipe_write must not be in the standard io 0, 1, or 2 fd range. low_fds_to_close = [] while errpipe_write < 3: low_fds_to_close.append(errpipe_write) errpipe_write = os.dup(errpipe_write) for low_fd in low_fds_to_close: os.close(low_fd) try: try: # We must avoid complex work that could involve # malloc or free in the child process to avoid # potential deadlocks, thus we do all this here. # and pass it to fork_exec() if env is not None: env_list = [] for k, v in env.items(): k = os.fsencode(k) if b'=' in k: raise ValueError("illegal environment variable name") env_list.append(k + b'=' + os.fsencode(v)) else: env_list = None # Use execv instead of execve. executable = os.fsencode(executable) if os.path.dirname(executable): executable_list = (executable,) else: # This matches the behavior of os._execvpe(). executable_list = tuple( os.path.join(os.fsencode(dir), executable) for dir in os.get_exec_path(env)) fds_to_keep = set(pass_fds) fds_to_keep.add(errpipe_write) self.pid = _posixsubprocess.fork_exec( args, executable_list, close_fds, tuple(sorted(map(int, fds_to_keep))), cwd, env_list, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, errpipe_read, errpipe_write, restore_signals, start_new_session, preexec_fn) self._child_created = True finally: # be sure the FD is closed no matter what os.close(errpipe_write) self._close_pipe_fds(p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite) # Wait for exec to fail or succeed; possibly raising an # exception (limited in size) errpipe_data = bytearray() while True: part = os.read(errpipe_read, 50000) errpipe_data += part if not part or len(errpipe_data) > 50000: break finally: # be sure the FD is closed no matter what os.close(errpipe_read) if errpipe_data: try: pid, sts = os.waitpid(self.pid, 0) if pid == self.pid: self._handle_exitstatus(sts) else: self.returncode = sys.maxsize except ChildProcessError: pass try: exception_name, hex_errno, err_msg = ( errpipe_data.split(b':', 2)) # The encoding here should match the encoding # written in by the subprocess implementations # like _posixsubprocess err_msg = err_msg.decode() except ValueError: exception_name = b'SubprocessError' hex_errno = b'0' err_msg = 'Bad exception data from child: {!r}'.format( bytes(errpipe_data)) child_exception_type = getattr( builtins, exception_name.decode('ascii'), SubprocessError) if issubclass(child_exception_type, OSError) and hex_errno: errno_num = int(hex_errno, 16) child_exec_never_called = (err_msg == "noexec") if child_exec_never_called: err_msg = "" # The error must be from chdir(cwd). err_filename = cwd else: err_filename = orig_executable if errno_num != 0: err_msg = os.strerror(errno_num) > raise child_exception_type(errno_num, err_msg, err_filename) E FileNotFoundError: [Errno 2] No such file or directory: 'svnadmin' /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/subprocess.py:1702: FileNotFoundError __________________________________________________________________ test_basic_install_editable_from_svn __________________________________________________________________ script = @need_svn def test_basic_install_editable_from_svn(script): """ Test checking out from svn. """ checkout_path = _create_test_package(script) > repo_url = _create_svn_repo(script, checkout_path) tests/functional/test_install.py:273: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/lib/__init__.py:875: in _create_svn_repo script.run( tests/lib/__init__.py:591: in run result = super(PipTestEnvironment, self).run(cwd=cwd, *args, **kw) /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/subprocess.py:854: in __init__ self._execute_child(args, executable, preexec_fn, close_fds, _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = , args = ['svnadmin', 'create', 'pip-test-package-repo'], executable = b'svnadmin', preexec_fn = None, close_fds = True pass_fds = (), cwd = Path('/private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_basic_install_editable_fr0/workspace/scratch') env = {'GIT_AUTHOR_EMAIL': 'pypa-dev@googlegroups.com', 'GIT_AUTHOR_NAME': 'pip', 'GIT_CONFIG_NOSYSTEM': '1', 'HOME': '/private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_basic_install_editable_fr0/home', ...} startupinfo = None, creationflags = 0, shell = False, p2cread = 9, p2cwrite = 12, c2pread = 13, c2pwrite = 14, errread = 15, errwrite = 16, restore_signals = True start_new_session = False def _execute_child(self, args, executable, preexec_fn, close_fds, pass_fds, cwd, env, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, restore_signals, start_new_session): """Execute program (POSIX version)""" if isinstance(args, (str, bytes)): args = [args] elif isinstance(args, os.PathLike): if shell: raise TypeError('path-like args is not allowed when ' 'shell is true') args = [args] else: args = list(args) if shell: # On Android the default shell is at '/system/bin/sh'. unix_shell = ('/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh') args = [unix_shell, "-c"] + args if executable: args[0] = executable if executable is None: executable = args[0] sys.audit("subprocess.Popen", executable, args, cwd, env) if (_USE_POSIX_SPAWN and os.path.dirname(executable) and preexec_fn is None and not close_fds and not pass_fds and cwd is None and (p2cread == -1 or p2cread > 2) and (c2pwrite == -1 or c2pwrite > 2) and (errwrite == -1 or errwrite > 2) and not start_new_session): self._posix_spawn(args, executable, env, restore_signals, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite) return orig_executable = executable # For transferring possible exec failure from child to parent. # Data format: "exception name:hex errno:description" # Pickle is not used; it is complex and involves memory allocation. errpipe_read, errpipe_write = os.pipe() # errpipe_write must not be in the standard io 0, 1, or 2 fd range. low_fds_to_close = [] while errpipe_write < 3: low_fds_to_close.append(errpipe_write) errpipe_write = os.dup(errpipe_write) for low_fd in low_fds_to_close: os.close(low_fd) try: try: # We must avoid complex work that could involve # malloc or free in the child process to avoid # potential deadlocks, thus we do all this here. # and pass it to fork_exec() if env is not None: env_list = [] for k, v in env.items(): k = os.fsencode(k) if b'=' in k: raise ValueError("illegal environment variable name") env_list.append(k + b'=' + os.fsencode(v)) else: env_list = None # Use execv instead of execve. executable = os.fsencode(executable) if os.path.dirname(executable): executable_list = (executable,) else: # This matches the behavior of os._execvpe(). executable_list = tuple( os.path.join(os.fsencode(dir), executable) for dir in os.get_exec_path(env)) fds_to_keep = set(pass_fds) fds_to_keep.add(errpipe_write) self.pid = _posixsubprocess.fork_exec( args, executable_list, close_fds, tuple(sorted(map(int, fds_to_keep))), cwd, env_list, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, errpipe_read, errpipe_write, restore_signals, start_new_session, preexec_fn) self._child_created = True finally: # be sure the FD is closed no matter what os.close(errpipe_write) self._close_pipe_fds(p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite) # Wait for exec to fail or succeed; possibly raising an # exception (limited in size) errpipe_data = bytearray() while True: part = os.read(errpipe_read, 50000) errpipe_data += part if not part or len(errpipe_data) > 50000: break finally: # be sure the FD is closed no matter what os.close(errpipe_read) if errpipe_data: try: pid, sts = os.waitpid(self.pid, 0) if pid == self.pid: self._handle_exitstatus(sts) else: self.returncode = sys.maxsize except ChildProcessError: pass try: exception_name, hex_errno, err_msg = ( errpipe_data.split(b':', 2)) # The encoding here should match the encoding # written in by the subprocess implementations # like _posixsubprocess err_msg = err_msg.decode() except ValueError: exception_name = b'SubprocessError' hex_errno = b'0' err_msg = 'Bad exception data from child: {!r}'.format( bytes(errpipe_data)) child_exception_type = getattr( builtins, exception_name.decode('ascii'), SubprocessError) if issubclass(child_exception_type, OSError) and hex_errno: errno_num = int(hex_errno, 16) child_exec_never_called = (err_msg == "noexec") if child_exec_never_called: err_msg = "" # The error must be from chdir(cwd). err_filename = cwd else: err_filename = orig_executable if errno_num != 0: err_msg = os.strerror(errno_num) > raise child_exception_type(errno_num, err_msg, err_filename) E FileNotFoundError: [Errno 2] No such file or directory: 'svnadmin' /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/subprocess.py:1702: FileNotFoundError _______________________________________________________________________ test_user_config_accepted ________________________________________________________________________ script = @pytest.mark.incompatible_with_test_venv def test_user_config_accepted(script): # user set in the config file is parsed as 0/1 instead of True/False. # Check that this doesn't cause a problem. config_file = script.scratch_path / 'pip.conf' script.environ['PIP_CONFIG_FILE'] = str(config_file) config_file.write_text("[install]\nuser = true") result = script.pip_install_local('simplewheel') assert "Successfully installed simplewheel" in result.stdout relative_user = os.path.relpath(script.user_site_path, script.base_path) > assert join(relative_user, 'simplewheel') in result.files_created E AssertionError: assert 'venv/user/lib/python/site-packages/simplewheel' in {'venv/user/lib/python3.8': , ...} E + where 'venv/user/lib/python/site-packages/simplewheel' = join('venv/user/lib/python/site-packages', 'simplewheel') E + and {'venv/user/lib/python3.8': , ...} = .files_created tests/functional/test_install.py:1692: AssertionError ____________________________________________________________________ test_multiple_requirements_files ____________________________________________________________________ script = tmpdir = Path('/private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_multiple_requirements_fil0') @pytest.mark.network @need_svn def test_multiple_requirements_files(script, tmpdir): """ Test installing from multiple nested requirements files. """ other_lib_name, other_lib_version = 'anyjson', '0.3' script.scratch_path.joinpath("initools-req.txt").write_text( textwrap.dedent(""" -e %s@10#egg=INITools -r %s-req.txt """) % ( > local_checkout('svn+http://svn.colorstudy.com/INITools', tmpdir), other_lib_name ), ) tests/functional/test_install_reqs.py:127: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/lib/local_repos.py:63: in local_checkout _create_svn_initools_repo(repo_url_path) tests/lib/local_repos.py:22: in _create_svn_initools_repo subprocess.check_call('svnadmin create INITools'.split(), cwd=directory) /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/subprocess.py:359: in check_call retcode = call(*popenargs, **kwargs) /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/subprocess.py:340: in call with Popen(*popenargs, **kwargs) as p: /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/subprocess.py:854: in __init__ self._execute_child(args, executable, preexec_fn, close_fds, _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = , args = ['svnadmin', 'create', 'INITools'], executable = b'svnadmin', preexec_fn = None, close_fds = True, pass_fds = () cwd = '/private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_multiple_requirements_fil0/cache', env = None, startupinfo = None creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = -1, c2pwrite = -1, errread = -1, errwrite = -1, restore_signals = True, start_new_session = False def _execute_child(self, args, executable, preexec_fn, close_fds, pass_fds, cwd, env, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, restore_signals, start_new_session): """Execute program (POSIX version)""" if isinstance(args, (str, bytes)): args = [args] elif isinstance(args, os.PathLike): if shell: raise TypeError('path-like args is not allowed when ' 'shell is true') args = [args] else: args = list(args) if shell: # On Android the default shell is at '/system/bin/sh'. unix_shell = ('/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh') args = [unix_shell, "-c"] + args if executable: args[0] = executable if executable is None: executable = args[0] sys.audit("subprocess.Popen", executable, args, cwd, env) if (_USE_POSIX_SPAWN and os.path.dirname(executable) and preexec_fn is None and not close_fds and not pass_fds and cwd is None and (p2cread == -1 or p2cread > 2) and (c2pwrite == -1 or c2pwrite > 2) and (errwrite == -1 or errwrite > 2) and not start_new_session): self._posix_spawn(args, executable, env, restore_signals, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite) return orig_executable = executable # For transferring possible exec failure from child to parent. # Data format: "exception name:hex errno:description" # Pickle is not used; it is complex and involves memory allocation. errpipe_read, errpipe_write = os.pipe() # errpipe_write must not be in the standard io 0, 1, or 2 fd range. low_fds_to_close = [] while errpipe_write < 3: low_fds_to_close.append(errpipe_write) errpipe_write = os.dup(errpipe_write) for low_fd in low_fds_to_close: os.close(low_fd) try: try: # We must avoid complex work that could involve # malloc or free in the child process to avoid # potential deadlocks, thus we do all this here. # and pass it to fork_exec() if env is not None: env_list = [] for k, v in env.items(): k = os.fsencode(k) if b'=' in k: raise ValueError("illegal environment variable name") env_list.append(k + b'=' + os.fsencode(v)) else: env_list = None # Use execv instead of execve. executable = os.fsencode(executable) if os.path.dirname(executable): executable_list = (executable,) else: # This matches the behavior of os._execvpe(). executable_list = tuple( os.path.join(os.fsencode(dir), executable) for dir in os.get_exec_path(env)) fds_to_keep = set(pass_fds) fds_to_keep.add(errpipe_write) self.pid = _posixsubprocess.fork_exec( args, executable_list, close_fds, tuple(sorted(map(int, fds_to_keep))), cwd, env_list, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, errpipe_read, errpipe_write, restore_signals, start_new_session, preexec_fn) self._child_created = True finally: # be sure the FD is closed no matter what os.close(errpipe_write) self._close_pipe_fds(p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite) # Wait for exec to fail or succeed; possibly raising an # exception (limited in size) errpipe_data = bytearray() while True: part = os.read(errpipe_read, 50000) errpipe_data += part if not part or len(errpipe_data) > 50000: break finally: # be sure the FD is closed no matter what os.close(errpipe_read) if errpipe_data: try: pid, sts = os.waitpid(self.pid, 0) if pid == self.pid: self._handle_exitstatus(sts) else: self.returncode = sys.maxsize except ChildProcessError: pass try: exception_name, hex_errno, err_msg = ( errpipe_data.split(b':', 2)) # The encoding here should match the encoding # written in by the subprocess implementations # like _posixsubprocess err_msg = err_msg.decode() except ValueError: exception_name = b'SubprocessError' hex_errno = b'0' err_msg = 'Bad exception data from child: {!r}'.format( bytes(errpipe_data)) child_exception_type = getattr( builtins, exception_name.decode('ascii'), SubprocessError) if issubclass(child_exception_type, OSError) and hex_errno: errno_num = int(hex_errno, 16) child_exec_never_called = (err_msg == "noexec") if child_exec_never_called: err_msg = "" # The error must be from chdir(cwd). err_filename = cwd else: err_filename = orig_executable if errno_num != 0: err_msg = os.strerror(errno_num) > raise child_exception_type(errno_num, err_msg, err_filename) E FileNotFoundError: [Errno 2] No such file or directory: 'svnadmin' /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/subprocess.py:1702: FileNotFoundError ________________________________________________ Tests_UserSite.test_install_subversion_usersite_editable_with_distribute ________________________________________________ self = , script = tmpdir = Path('/private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_install_subversion_usersi0') @pytest.mark.network @need_svn @pytest.mark.incompatible_with_test_venv def test_install_subversion_usersite_editable_with_distribute( self, script, tmpdir): """ Test installing current directory ('.') into usersite after installing distribute """ result = script.pip( 'install', '--user', '-e', '%s#egg=initools' % > local_checkout('svn+http://svn.colorstudy.com/INITools', tmpdir) ) tests/functional/test_install_user.py:56: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/lib/local_repos.py:63: in local_checkout _create_svn_initools_repo(repo_url_path) tests/lib/local_repos.py:22: in _create_svn_initools_repo subprocess.check_call('svnadmin create INITools'.split(), cwd=directory) /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/subprocess.py:359: in check_call retcode = call(*popenargs, **kwargs) /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/subprocess.py:340: in call with Popen(*popenargs, **kwargs) as p: /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/subprocess.py:854: in __init__ self._execute_child(args, executable, preexec_fn, close_fds, _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = , args = ['svnadmin', 'create', 'INITools'], executable = b'svnadmin', preexec_fn = None, close_fds = True, pass_fds = () cwd = '/private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_install_subversion_usersi0/cache', env = None, startupinfo = None creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = -1, c2pwrite = -1, errread = -1, errwrite = -1, restore_signals = True, start_new_session = False def _execute_child(self, args, executable, preexec_fn, close_fds, pass_fds, cwd, env, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, restore_signals, start_new_session): """Execute program (POSIX version)""" if isinstance(args, (str, bytes)): args = [args] elif isinstance(args, os.PathLike): if shell: raise TypeError('path-like args is not allowed when ' 'shell is true') args = [args] else: args = list(args) if shell: # On Android the default shell is at '/system/bin/sh'. unix_shell = ('/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh') args = [unix_shell, "-c"] + args if executable: args[0] = executable if executable is None: executable = args[0] sys.audit("subprocess.Popen", executable, args, cwd, env) if (_USE_POSIX_SPAWN and os.path.dirname(executable) and preexec_fn is None and not close_fds and not pass_fds and cwd is None and (p2cread == -1 or p2cread > 2) and (c2pwrite == -1 or c2pwrite > 2) and (errwrite == -1 or errwrite > 2) and not start_new_session): self._posix_spawn(args, executable, env, restore_signals, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite) return orig_executable = executable # For transferring possible exec failure from child to parent. # Data format: "exception name:hex errno:description" # Pickle is not used; it is complex and involves memory allocation. errpipe_read, errpipe_write = os.pipe() # errpipe_write must not be in the standard io 0, 1, or 2 fd range. low_fds_to_close = [] while errpipe_write < 3: low_fds_to_close.append(errpipe_write) errpipe_write = os.dup(errpipe_write) for low_fd in low_fds_to_close: os.close(low_fd) try: try: # We must avoid complex work that could involve # malloc or free in the child process to avoid # potential deadlocks, thus we do all this here. # and pass it to fork_exec() if env is not None: env_list = [] for k, v in env.items(): k = os.fsencode(k) if b'=' in k: raise ValueError("illegal environment variable name") env_list.append(k + b'=' + os.fsencode(v)) else: env_list = None # Use execv instead of execve. executable = os.fsencode(executable) if os.path.dirname(executable): executable_list = (executable,) else: # This matches the behavior of os._execvpe(). executable_list = tuple( os.path.join(os.fsencode(dir), executable) for dir in os.get_exec_path(env)) fds_to_keep = set(pass_fds) fds_to_keep.add(errpipe_write) self.pid = _posixsubprocess.fork_exec( args, executable_list, close_fds, tuple(sorted(map(int, fds_to_keep))), cwd, env_list, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, errpipe_read, errpipe_write, restore_signals, start_new_session, preexec_fn) self._child_created = True finally: # be sure the FD is closed no matter what os.close(errpipe_write) self._close_pipe_fds(p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite) # Wait for exec to fail or succeed; possibly raising an # exception (limited in size) errpipe_data = bytearray() while True: part = os.read(errpipe_read, 50000) errpipe_data += part if not part or len(errpipe_data) > 50000: break finally: # be sure the FD is closed no matter what os.close(errpipe_read) if errpipe_data: try: pid, sts = os.waitpid(self.pid, 0) if pid == self.pid: self._handle_exitstatus(sts) else: self.returncode = sys.maxsize except ChildProcessError: pass try: exception_name, hex_errno, err_msg = ( errpipe_data.split(b':', 2)) # The encoding here should match the encoding # written in by the subprocess implementations # like _posixsubprocess err_msg = err_msg.decode() except ValueError: exception_name = b'SubprocessError' hex_errno = b'0' err_msg = 'Bad exception data from child: {!r}'.format( bytes(errpipe_data)) child_exception_type = getattr( builtins, exception_name.decode('ascii'), SubprocessError) if issubclass(child_exception_type, OSError) and hex_errno: errno_num = int(hex_errno, 16) child_exec_never_called = (err_msg == "noexec") if child_exec_never_called: err_msg = "" # The error must be from chdir(cwd). err_filename = cwd else: err_filename = orig_executable if errno_num != 0: err_msg = os.strerror(errno_num) > raise child_exception_type(errno_num, err_msg, err_filename) E FileNotFoundError: [Errno 2] No such file or directory: 'svnadmin' /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/subprocess.py:1702: FileNotFoundError ____________________________________________________ Tests_UserSite.test_install_from_current_directory_into_usersite ____________________________________________________ self = , script = data = , with_wheel = None @pytest.mark.incompatible_with_test_venv def test_install_from_current_directory_into_usersite( self, script, data, with_wheel): """ Test installing current directory ('.') into usersite """ run_from = data.packages.joinpath("FSPkg") result = script.pip( 'install', '-vvv', '--user', curdir, cwd=run_from, ) fspkg_folder = script.user_site / 'fspkg' > assert fspkg_folder in result.files_created, result.stdout E AssertionError: User install by explicit request E Created temporary directory: /private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_install_from_current_dire0/workspace/tmp/pip-ephem-wheel-cache-hs30cvxo E Created temporary directory: /private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_install_from_current_dire0/workspace/tmp/pip-req-tracker-ykkzr6k1 E Initialized build tracking at /private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_install_from_current_dire0/workspace/tmp/pip-req-tracker-ykkzr6k1 E Created build tracker: /private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_install_from_current_dire0/workspace/tmp/pip-req-tracker-ykkzr6k1 E Entered build tracker: /private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_install_from_current_dire0/workspace/tmp/pip-req-tracker-ykkzr6k1 E Created temporary directory: /private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_install_from_current_dire0/workspace/tmp/pip-install-3m98e45c E Processing /private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_install_from_current_dire0/data/packages/FSPkg E Created temporary directory: /private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_install_from_current_dire0/workspace/tmp/pip-req-build-drdhrnvi E Added file:///private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_install_from_current_dire0/data/packages/FSPkg to build tracker '/private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_install_from_current_dire0/workspace/tmp/pip-req-tracker-ykkzr6k1' E Running setup.py (path:/private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_install_from_current_dire0/workspace/tmp/pip-req-build-drdhrnvi/setup.py) egg_info for package from file:///private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_install_from_current_dire0/data/packages/FSPkg E Source in /private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_install_from_current_dire0/workspace/tmp/pip-req-build-drdhrnvi has version 0.1.dev0, which satisfies requirement FSPkg==0.1.dev0 from file:///private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_install_from_current_dire0/data/packages/FSPkg E Removed FSPkg==0.1.dev0 from file:///private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_install_from_current_dire0/data/packages/FSPkg from build tracker '/private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_install_from_current_dire0/workspace/tmp/pip-req-tracker-ykkzr6k1' E Building wheels for collected packages: FSPkg E Created temporary directory: /private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_install_from_current_dire0/workspace/tmp/pip-wheel-fdhu41pb E Building wheel for FSPkg (setup.py): started E Destination directory: /private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_install_from_current_dire0/workspace/tmp/pip-wheel-fdhu41pb E Building wheel for FSPkg (setup.py): finished with status 'done' E Created wheel for FSPkg: filename=FSPkg-0.1.dev0-py3-none-any.whl size=1459 sha256=b00fac4a46c4d0b8b2520a000f01c47face626108721389b43724ab12804676f E Stored in directory: /private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_install_from_current_dire0/workspace/tmp/pip-ephem-wheel-cache-hs30cvxo/wheels/91/3c/19/511ea121c22cba8261806be6173df523435d3646b9832c2d81 E Successfully built FSPkg E Installing collected packages: FSPkg E Created temporary directory: /private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_install_from_current_dire0/workspace/tmp/pip-unpacked-wheel-yaqpheoo E E Successfully installed FSPkg-0.1.dev0 E Removed build tracker: '/private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_install_from_current_dire0/workspace/tmp/pip-req-tracker-ykkzr6k1' E E assert Path('venv/user/lib/python/site-packages/fspkg') in {'venv/user/lib/python3.8': , ...} E + where {'venv/user/lib/python3.8': , ...} = .files_created tests/functional/test_install_user.py:73: AssertionError _________________________________________________________ Tests_UserSite.test_install_user_conflict_in_usersite __________________________________________________________ self = , script = @pytest.mark.network @pytest.mark.incompatible_with_test_venv def test_install_user_conflict_in_usersite(self, script): """ Test user install with conflict in usersite updates usersite. """ script.pip('install', '--user', 'INITools==0.3', '--no-binary=:all:') result2 = script.pip( 'install', '--user', 'INITools==0.1', '--no-binary=:all:') # usersite has 0.1 egg_info_folder = ( script.user_site / 'INITools-0.1-py%s.egg-info' % pyversion ) initools_v3_file = ( # file only in 0.3 script.base_path / script.user_site / 'initools' / 'configparser.py' ) > assert egg_info_folder in result2.files_created, str(result2) E AssertionError: Script result: python -m pip install --user INITools==0.1 --no-binary=:all: E -- stdout: -------------------- E Collecting INITools==0.1 E Downloading INITools-0.1.tar.gz (16 kB) E Could not build wheels for INITools,since package 'wheel' is not installed. E Installing collected packages: INITools E Attempting uninstall: INITools E Found existing installation: INITools 0.3 E Uninstalling INITools-0.3: E Successfully uninstalled INITools-0.3 E Running setup.py install for INITools: started E Running setup.py install for INITools: finished with status 'done' E Successfully installed INITools-0.1 E E -- created: ------------------- E venv/user/lib/python3.8/site-packages/INITools-0.1-py3.8.egg-info E PKG-INFO (532 bytes) E SOURCES.txt (332 bytes) E dependency_links.txt (1 bytes) E installed-files.txt (593 bytes) E top_level.txt (9 bytes) E zip-safe (1 bytes) E -- deleted: ------------------- E venv/user/lib/python3.8/site-packages/INITools-0.3-py3.8.egg-info E PKG-INFO (721 bytes) E SOURCES.txt (688 bytes) E dependency_links.txt (1 bytes) E installed-files.txt (747 bytes) E top_level.txt (9 bytes) E zip-safe (1 bytes) E initools/_setmixin.py (2488 bytes) E configparser.py (34600 bytes) E -- updated: ------------------- E venv/user/lib/python3.8/site-packages E initools E __init__.py (2 bytes) E configwrapper.py (8346 bytes) E iniparser.py (7948 bytes) E inischema.py (13365 bytes) E lazyiniparser.py (5274 bytes) E lazyloader.py (8381 bytes) E nested.py (5262 bytes) E assert 'venv/user/lib/python/site-packages/INITools-0.1-py3.8.egg-info' in {'venv/user/lib/python3.8/site-packages/INITools-0.1-py3.8.egg-info': , ...} E + where {'venv/user/lib/python3.8/site-packages/INITools-0.1-py3.8.egg-info': , ...} = .files_created tests/functional/test_install_user.py:120: AssertionError ________________________________________________________ Tests_UserSite.test_install_user_conflict_in_globalsite _________________________________________________________ self = virtualenv = script = @pytest.mark.network @pytest.mark.incompatible_with_test_venv def test_install_user_conflict_in_globalsite(self, virtualenv, script): """ Test user install with conflict in global site ignores site and installs to usersite """ _patch_dist_in_site_packages(virtualenv) script.pip('install', 'INITools==0.2', '--no-binary=:all:') result2 = script.pip( 'install', '--user', 'INITools==0.1', '--no-binary=:all:') # usersite has 0.1 egg_info_folder = ( script.user_site / 'INITools-0.1-py%s.egg-info' % pyversion ) initools_folder = script.user_site / 'initools' > assert egg_info_folder in result2.files_created, str(result2) E AssertionError: Script result: python -m pip install --user INITools==0.1 --no-binary=:all: E -- stdout: -------------------- E Collecting INITools==0.1 E Downloading INITools-0.1.tar.gz (16 kB) E Could not build wheels for INITools,since package 'wheel' is not installed. E Installing collected packages: INITools E Running setup.py install for INITools: started E Running setup.py install for INITools: finished with status 'done' E Successfully installed INITools-0.1 E E -- created: ------------------- E venv/user/lib/python3.8 E site-packages E INITools-0.1-py3.8.egg-info E PKG-INFO (532 bytes) E SOURCES.txt (332 bytes) E dependency_links.txt (1 bytes) E installed-files.txt (593 bytes) E top_level.txt (9 bytes) E zip-safe (1 bytes) E initools E __init__.py (2 bytes) E configwrapper.py (8346 bytes) E iniparser.py (7948 bytes) E inischema.py (13365 bytes) E lazyiniparser.py (5274 bytes) E lazyloader.py (8381 bytes) E nested.py (5262 bytes) E -- updated: ------------------- E venv/user/lib E assert 'venv/user/lib/python/site-packages/INITools-0.1-py3.8.egg-info' in {'venv/user/lib/python3.8': , ...} E + where {'venv/user/lib/python3.8': , ...} = .files_created tests/functional/test_install_user.py:142: AssertionError ________________________________________________________ Tests_UserSite.test_upgrade_user_conflict_in_globalsite _________________________________________________________ self = virtualenv = script = @pytest.mark.network @pytest.mark.incompatible_with_test_venv def test_upgrade_user_conflict_in_globalsite(self, virtualenv, script): """ Test user install/upgrade with conflict in global site ignores site and installs to usersite """ _patch_dist_in_site_packages(virtualenv) script.pip('install', 'INITools==0.2', '--no-binary=:all:') result2 = script.pip( 'install', '--user', '--upgrade', 'INITools', '--no-binary=:all:') # usersite has 0.3.1 egg_info_folder = ( script.user_site / 'INITools-0.3.1-py%s.egg-info' % pyversion ) initools_folder = script.user_site / 'initools' > assert egg_info_folder in result2.files_created, str(result2) E AssertionError: Script result: python -m pip install --user --upgrade INITools --no-binary=:all: E -- stdout: -------------------- E Collecting INITools E Downloading INITools-0.3.1.tar.gz (21 kB) E Could not build wheels for INITools,since package 'wheel' is not installed. E Installing collected packages: INITools E Running setup.py install for INITools: started E Running setup.py install for INITools: finished with status 'done' E Successfully installed INITools-0.3.1 E E -- created: ------------------- E venv/user/lib/python3.8 E site-packages E INITools-0.3.1-py3.8.egg-info E PKG-INFO (874 bytes) E SOURCES.txt (379 bytes) E dependency_links.txt (1 bytes) E installed-files.txt (747 bytes) E top_level.txt (9 bytes) E zip-safe (1 bytes) E initools E __init__.py (2 bytes) E _setmixin.py (2488 bytes) E configparser.py (34580 bytes) E configwrapper.py (8550 bytes) E iniparser.py (8097 bytes) E inischema.py (13460 bytes) E lazyiniparser.py (5274 bytes) E lazyloader.py (8574 bytes) E nested.py (5451 bytes) E -- updated: ------------------- E venv/user/lib E assert 'venv/user/lib/python/site-packages/INITools-0.3.1-py3.8.egg-info' in {'venv/user/lib/python3.8': , ...} E + where {'venv/user/lib/python3.8': , ...} = .files_created tests/functional/test_install_user.py:172: AssertionError __________________________________________________ Tests_UserSite.test_install_user_conflict_in_globalsite_and_usersite __________________________________________________ self = virtualenv = script = @pytest.mark.network @pytest.mark.incompatible_with_test_venv def test_install_user_conflict_in_globalsite_and_usersite( self, virtualenv, script): """ Test user install with conflict in globalsite and usersite ignores global site and updates usersite. """ _patch_dist_in_site_packages(virtualenv) script.pip('install', 'INITools==0.2', '--no-binary=:all:') script.pip('install', '--user', 'INITools==0.3', '--no-binary=:all:') result3 = script.pip( 'install', '--user', 'INITools==0.1', '--no-binary=:all:') # usersite has 0.1 egg_info_folder = ( script.user_site / 'INITools-0.1-py%s.egg-info' % pyversion ) initools_v3_file = ( # file only in 0.3 script.base_path / script.user_site / 'initools' / 'configparser.py' ) > assert egg_info_folder in result3.files_created, str(result3) E AssertionError: Script result: python -m pip install --user INITools==0.1 --no-binary=:all: E -- stdout: -------------------- E Collecting INITools==0.1 E Downloading INITools-0.1.tar.gz (16 kB) E Could not build wheels for INITools,since package 'wheel' is not installed. E Installing collected packages: INITools E Attempting uninstall: INITools E Found existing installation: INITools 0.3 E Uninstalling INITools-0.3: E Successfully uninstalled INITools-0.3 E Running setup.py install for INITools: started E Running setup.py install for INITools: finished with status 'done' E Successfully installed INITools-0.1 E E -- created: ------------------- E venv/user/lib/python3.8/site-packages/INITools-0.1-py3.8.egg-info E PKG-INFO (532 bytes) E SOURCES.txt (332 bytes) E dependency_links.txt (1 bytes) E installed-files.txt (593 bytes) E top_level.txt (9 bytes) E zip-safe (1 bytes) E -- deleted: ------------------- E venv/user/lib/python3.8/site-packages/INITools-0.3-py3.8.egg-info E PKG-INFO (721 bytes) E SOURCES.txt (688 bytes) E dependency_links.txt (1 bytes) E installed-files.txt (747 bytes) E top_level.txt (9 bytes) E zip-safe (1 bytes) E initools/_setmixin.py (2488 bytes) E configparser.py (34600 bytes) E -- updated: ------------------- E venv/user/lib/python3.8/site-packages E initools E __init__.py (2 bytes) E configwrapper.py (8346 bytes) E iniparser.py (7948 bytes) E inischema.py (13365 bytes) E lazyiniparser.py (5274 bytes) E lazyloader.py (8381 bytes) E nested.py (5262 bytes) E assert 'venv/user/lib/python/site-packages/INITools-0.1-py3.8.egg-info' in {'venv/user/lib/python3.8/site-packages/INITools-0.1-py3.8.egg-info': , ...} E + where {'venv/user/lib/python3.8/site-packages/INITools-0.1-py3.8.egg-info': , ...} = .files_created tests/functional/test_install_user.py:209: AssertionError ________________________________________________________________________ test_install_user_wheel _________________________________________________________________________ script = , shared_data = , with_wheel = None tmpdir = Path('/private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_install_user_wheel0') @pytest.mark.incompatible_with_test_venv def test_install_user_wheel(script, shared_data, with_wheel, tmpdir): """ Test user install from wheel (that has a script) """ shutil.copy( shared_data.packages / "has.script-1.0-py2.py3-none-any.whl", tmpdir ) result = script.pip( 'install', 'has.script==1.0', '--user', '--no-index', '--find-links', tmpdir, ) egg_info_folder = script.user_site / 'has.script-1.0.dist-info' > assert egg_info_folder in result.files_created, str(result) E AssertionError: Script result: python -m pip install has.script==1.0 --user --no-index --find-links /private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_install_user_wheel0 E -- stdout: -------------------- E Looking in links: /private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_install_user_wheel0 E Processing /private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_install_user_wheel0/has.script-1.0-py2.py3-none-any.whl E Installing collected packages: has.script E Successfully installed has.script-1.0 E E -- created: ------------------- E venv/user/bin E script.py (8 bytes) E lib/python3.8 E site-packages E has.script-1.0.dist-info E DESCRIPTION.rst (10 bytes) E INSTALLER (4 bytes) E METADATA (172 bytes) E RECORD (710 bytes) E WHEEL (103 bytes) E pydist.json (180 bytes) E top_level.txt (1 bytes) E -- updated: ------------------- E venv/user E lib E assert Path('venv/user/lib/python/site-packages/has.script-1.0.dist-info') in {'venv/user/bin': , ...} E + where {'venv/user/bin': , ...} = .files_created tests/functional/test_install_wheel.py:285: AssertionError ____________________________________________________________________ test_uninstall_editable_from_svn ____________________________________________________________________ script = tmpdir = Path('/private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_uninstall_editable_from_s0') @pytest.mark.network @need_svn def test_uninstall_editable_from_svn(script, tmpdir): """ Test uninstalling an editable installation from svn. """ result = script.pip( 'install', '-e', '%s#egg=initools' % ( > local_checkout('svn+http://svn.colorstudy.com/INITools', tmpdir) ), ) tests/functional/test_uninstall.py:332: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/lib/local_repos.py:63: in local_checkout _create_svn_initools_repo(repo_url_path) tests/lib/local_repos.py:22: in _create_svn_initools_repo subprocess.check_call('svnadmin create INITools'.split(), cwd=directory) /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/subprocess.py:359: in check_call retcode = call(*popenargs, **kwargs) /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/subprocess.py:340: in call with Popen(*popenargs, **kwargs) as p: /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/subprocess.py:854: in __init__ self._execute_child(args, executable, preexec_fn, close_fds, _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = , args = ['svnadmin', 'create', 'INITools'], executable = b'svnadmin', preexec_fn = None, close_fds = True, pass_fds = () cwd = '/private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_uninstall_editable_from_s0/cache', env = None, startupinfo = None creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = -1, c2pwrite = -1, errread = -1, errwrite = -1, restore_signals = True, start_new_session = False def _execute_child(self, args, executable, preexec_fn, close_fds, pass_fds, cwd, env, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, restore_signals, start_new_session): """Execute program (POSIX version)""" if isinstance(args, (str, bytes)): args = [args] elif isinstance(args, os.PathLike): if shell: raise TypeError('path-like args is not allowed when ' 'shell is true') args = [args] else: args = list(args) if shell: # On Android the default shell is at '/system/bin/sh'. unix_shell = ('/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh') args = [unix_shell, "-c"] + args if executable: args[0] = executable if executable is None: executable = args[0] sys.audit("subprocess.Popen", executable, args, cwd, env) if (_USE_POSIX_SPAWN and os.path.dirname(executable) and preexec_fn is None and not close_fds and not pass_fds and cwd is None and (p2cread == -1 or p2cread > 2) and (c2pwrite == -1 or c2pwrite > 2) and (errwrite == -1 or errwrite > 2) and not start_new_session): self._posix_spawn(args, executable, env, restore_signals, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite) return orig_executable = executable # For transferring possible exec failure from child to parent. # Data format: "exception name:hex errno:description" # Pickle is not used; it is complex and involves memory allocation. errpipe_read, errpipe_write = os.pipe() # errpipe_write must not be in the standard io 0, 1, or 2 fd range. low_fds_to_close = [] while errpipe_write < 3: low_fds_to_close.append(errpipe_write) errpipe_write = os.dup(errpipe_write) for low_fd in low_fds_to_close: os.close(low_fd) try: try: # We must avoid complex work that could involve # malloc or free in the child process to avoid # potential deadlocks, thus we do all this here. # and pass it to fork_exec() if env is not None: env_list = [] for k, v in env.items(): k = os.fsencode(k) if b'=' in k: raise ValueError("illegal environment variable name") env_list.append(k + b'=' + os.fsencode(v)) else: env_list = None # Use execv instead of execve. executable = os.fsencode(executable) if os.path.dirname(executable): executable_list = (executable,) else: # This matches the behavior of os._execvpe(). executable_list = tuple( os.path.join(os.fsencode(dir), executable) for dir in os.get_exec_path(env)) fds_to_keep = set(pass_fds) fds_to_keep.add(errpipe_write) self.pid = _posixsubprocess.fork_exec( args, executable_list, close_fds, tuple(sorted(map(int, fds_to_keep))), cwd, env_list, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, errpipe_read, errpipe_write, restore_signals, start_new_session, preexec_fn) self._child_created = True finally: # be sure the FD is closed no matter what os.close(errpipe_write) self._close_pipe_fds(p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite) # Wait for exec to fail or succeed; possibly raising an # exception (limited in size) errpipe_data = bytearray() while True: part = os.read(errpipe_read, 50000) errpipe_data += part if not part or len(errpipe_data) > 50000: break finally: # be sure the FD is closed no matter what os.close(errpipe_read) if errpipe_data: try: pid, sts = os.waitpid(self.pid, 0) if pid == self.pid: self._handle_exitstatus(sts) else: self.returncode = sys.maxsize except ChildProcessError: pass try: exception_name, hex_errno, err_msg = ( errpipe_data.split(b':', 2)) # The encoding here should match the encoding # written in by the subprocess implementations # like _posixsubprocess err_msg = err_msg.decode() except ValueError: exception_name = b'SubprocessError' hex_errno = b'0' err_msg = 'Bad exception data from child: {!r}'.format( bytes(errpipe_data)) child_exception_type = getattr( builtins, exception_name.decode('ascii'), SubprocessError) if issubclass(child_exception_type, OSError) and hex_errno: errno_num = int(hex_errno, 16) child_exec_never_called = (err_msg == "noexec") if child_exec_never_called: err_msg = "" # The error must be from chdir(cwd). err_filename = cwd else: err_filename = orig_executable if errno_num != 0: err_msg = os.strerror(errno_num) > raise child_exception_type(errno_num, err_msg, err_filename) E FileNotFoundError: [Errno 2] No such file or directory: 'svnadmin' /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/subprocess.py:1702: FileNotFoundError _____________________________________________________________________ test_uninstall_from_reqs_file ______________________________________________________________________ script = tmpdir = Path('/private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_uninstall_from_reqs_file0') @pytest.mark.network @need_svn def test_uninstall_from_reqs_file(script, tmpdir): """ Test uninstall from a requirements file. """ > local_svn_url = local_checkout( 'svn+http://svn.colorstudy.com/INITools', tmpdir, ) tests/functional/test_uninstall.py:394: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ tests/lib/local_repos.py:63: in local_checkout _create_svn_initools_repo(repo_url_path) tests/lib/local_repos.py:22: in _create_svn_initools_repo subprocess.check_call('svnadmin create INITools'.split(), cwd=directory) /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/subprocess.py:359: in check_call retcode = call(*popenargs, **kwargs) /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/subprocess.py:340: in call with Popen(*popenargs, **kwargs) as p: /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/subprocess.py:854: in __init__ self._execute_child(args, executable, preexec_fn, close_fds, _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = , args = ['svnadmin', 'create', 'INITools'], executable = b'svnadmin', preexec_fn = None, close_fds = True, pass_fds = () cwd = '/private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_uninstall_from_reqs_file0/cache', env = None, startupinfo = None creationflags = 0, shell = False, p2cread = -1, p2cwrite = -1, c2pread = -1, c2pwrite = -1, errread = -1, errwrite = -1, restore_signals = True, start_new_session = False def _execute_child(self, args, executable, preexec_fn, close_fds, pass_fds, cwd, env, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, restore_signals, start_new_session): """Execute program (POSIX version)""" if isinstance(args, (str, bytes)): args = [args] elif isinstance(args, os.PathLike): if shell: raise TypeError('path-like args is not allowed when ' 'shell is true') args = [args] else: args = list(args) if shell: # On Android the default shell is at '/system/bin/sh'. unix_shell = ('/system/bin/sh' if hasattr(sys, 'getandroidapilevel') else '/bin/sh') args = [unix_shell, "-c"] + args if executable: args[0] = executable if executable is None: executable = args[0] sys.audit("subprocess.Popen", executable, args, cwd, env) if (_USE_POSIX_SPAWN and os.path.dirname(executable) and preexec_fn is None and not close_fds and not pass_fds and cwd is None and (p2cread == -1 or p2cread > 2) and (c2pwrite == -1 or c2pwrite > 2) and (errwrite == -1 or errwrite > 2) and not start_new_session): self._posix_spawn(args, executable, env, restore_signals, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite) return orig_executable = executable # For transferring possible exec failure from child to parent. # Data format: "exception name:hex errno:description" # Pickle is not used; it is complex and involves memory allocation. errpipe_read, errpipe_write = os.pipe() # errpipe_write must not be in the standard io 0, 1, or 2 fd range. low_fds_to_close = [] while errpipe_write < 3: low_fds_to_close.append(errpipe_write) errpipe_write = os.dup(errpipe_write) for low_fd in low_fds_to_close: os.close(low_fd) try: try: # We must avoid complex work that could involve # malloc or free in the child process to avoid # potential deadlocks, thus we do all this here. # and pass it to fork_exec() if env is not None: env_list = [] for k, v in env.items(): k = os.fsencode(k) if b'=' in k: raise ValueError("illegal environment variable name") env_list.append(k + b'=' + os.fsencode(v)) else: env_list = None # Use execv instead of execve. executable = os.fsencode(executable) if os.path.dirname(executable): executable_list = (executable,) else: # This matches the behavior of os._execvpe(). executable_list = tuple( os.path.join(os.fsencode(dir), executable) for dir in os.get_exec_path(env)) fds_to_keep = set(pass_fds) fds_to_keep.add(errpipe_write) self.pid = _posixsubprocess.fork_exec( args, executable_list, close_fds, tuple(sorted(map(int, fds_to_keep))), cwd, env_list, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, errpipe_read, errpipe_write, restore_signals, start_new_session, preexec_fn) self._child_created = True finally: # be sure the FD is closed no matter what os.close(errpipe_write) self._close_pipe_fds(p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite) # Wait for exec to fail or succeed; possibly raising an # exception (limited in size) errpipe_data = bytearray() while True: part = os.read(errpipe_read, 50000) errpipe_data += part if not part or len(errpipe_data) > 50000: break finally: # be sure the FD is closed no matter what os.close(errpipe_read) if errpipe_data: try: pid, sts = os.waitpid(self.pid, 0) if pid == self.pid: self._handle_exitstatus(sts) else: self.returncode = sys.maxsize except ChildProcessError: pass try: exception_name, hex_errno, err_msg = ( errpipe_data.split(b':', 2)) # The encoding here should match the encoding # written in by the subprocess implementations # like _posixsubprocess err_msg = err_msg.decode() except ValueError: exception_name = b'SubprocessError' hex_errno = b'0' err_msg = 'Bad exception data from child: {!r}'.format( bytes(errpipe_data)) child_exception_type = getattr( builtins, exception_name.decode('ascii'), SubprocessError) if issubclass(child_exception_type, OSError) and hex_errno: errno_num = int(hex_errno, 16) child_exec_never_called = (err_msg == "noexec") if child_exec_never_called: err_msg = "" # The error must be from chdir(cwd). err_filename = cwd else: err_filename = orig_executable if errno_num != 0: err_msg = os.strerror(errno_num) > raise child_exception_type(errno_num, err_msg, err_filename) E FileNotFoundError: [Errno 2] No such file or directory: 'svnadmin' /Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/subprocess.py:1702: FileNotFoundError __________________________________________________________ Tests_UninstallUserSite.test_uninstall_from_usersite __________________________________________________________ self = , script = @pytest.mark.network def test_uninstall_from_usersite(self, script): """ Test uninstall from usersite """ result1 = script.pip('install', '--user', 'INITools==0.3') result2 = script.pip('uninstall', '-y', 'INITools') > assert_all_changes(result1, result2, [script.venv / 'build', 'cache']) E tests.lib.TestFailure: Unexpected changes: E deleted: E created: venv/user/lib/python3.8/site-packages, venv/user/lib/python3.8 E updated: tests/functional/test_uninstall_user.py:22: TestFailure _____________________________________________ Tests_UninstallUserSite.test_uninstall_from_usersite_with_dist_in_global_site ______________________________________________ self = virtualenv = script = def test_uninstall_from_usersite_with_dist_in_global_site( self, virtualenv, script): """ Test uninstall from usersite (with same dist in global site) """ _patch_dist_in_site_packages(virtualenv) script.pip_install_local('pip-test-package==0.1', '--no-binary=:all:') result2 = script.pip_install_local( '--user', 'pip-test-package==0.1.1', '--no-binary=:all:') result3 = script.pip('uninstall', '-vy', 'pip-test-package') # uninstall console is mentioning user scripts, but not global scripts assert normcase(script.user_bin_path) in result3.stdout, str(result3) assert normcase(script.bin_path) not in result3.stdout, str(result3) # uninstall worked > assert_all_changes(result2, result3, [script.venv / 'build', 'cache']) E tests.lib.TestFailure: Unexpected changes: E deleted: E created: venv/user/lib/python3.8/site-packages, venv/user/lib/python3.8 E updated: tests/functional/test_uninstall_user.py:42: TestFailure _____________________________________________________ Tests_UninstallUserSite.test_uninstall_editable_from_usersite ______________________________________________________ self = , script = data = def test_uninstall_editable_from_usersite(self, script, data): """ Test uninstall editable local user install """ assert script.user_site_path.exists() # install to_install = data.packages.joinpath("FSPkg") > result1 = script.pip( 'install', '--user', '-e', to_install ) tests/functional/test_uninstall_user.py:59: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = , args = ('python', '-m', 'pip', 'install', '--user', '-e', ...), kw = {'expect_stderr': True} cwd = Path('/private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_uninstall_editable_from_u0/workspace/scratch'), run_from = None allow_stderr_error = False, allow_stderr_warning = False, expect_error = None def run(self, *args, **kw): """ :param allow_stderr_error: whether a logged error is allowed in stderr. Passing True for this argument implies `allow_stderr_warning` since warnings are weaker than errors. :param allow_stderr_warning: whether a logged warning (or deprecation message) is allowed in stderr. :param expect_error: if False (the default), asserts that the command exits with 0. Otherwise, asserts that the command exits with a non-zero exit code. Passing True also implies allow_stderr_error and allow_stderr_warning. :param expect_stderr: whether to allow warnings in stderr (equivalent to `allow_stderr_warning`). This argument is an abbreviated version of `allow_stderr_warning` and is also kept for backwards compatibility. """ if self.verbose: print('>> running %s %s' % (args, kw)) cwd = kw.pop('cwd', None) run_from = kw.pop('run_from', None) assert not cwd or not run_from, "Don't use run_from; it's going away" cwd = cwd or run_from or self.cwd if sys.platform == 'win32': # Partial fix for ScriptTest.run using `shell=True` on Windows. args = [str(a).replace('^', '^^').replace('&', '^&') for a in args] # Remove `allow_stderr_error` and `allow_stderr_warning` before # calling run() because PipTestEnvironment doesn't support them. allow_stderr_error = kw.pop('allow_stderr_error', None) allow_stderr_warning = kw.pop('allow_stderr_warning', None) # Propagate default values. expect_error = kw.get('expect_error') if expect_error: # Then default to allowing logged errors. if allow_stderr_error is not None and not allow_stderr_error: raise RuntimeError( 'cannot pass allow_stderr_error=False with ' 'expect_error=True' ) allow_stderr_error = True elif kw.get('expect_stderr'): # Then default to allowing logged warnings. if allow_stderr_warning is not None and not allow_stderr_warning: raise RuntimeError( 'cannot pass allow_stderr_warning=False with ' 'expect_stderr=True' ) allow_stderr_warning = True if allow_stderr_error: if allow_stderr_warning is not None and not allow_stderr_warning: raise RuntimeError( 'cannot pass allow_stderr_warning=False with ' 'allow_stderr_error=True' ) # Default values if not set. if allow_stderr_error is None: allow_stderr_error = False if allow_stderr_warning is None: allow_stderr_warning = allow_stderr_error # Pass expect_stderr=True to allow any stderr. We do this because # we do our checking of stderr further on in check_stderr(). kw['expect_stderr'] = True > result = super(PipTestEnvironment, self).run(cwd=cwd, *args, **kw) E AssertionError: Script returned code: 1 tests/lib/__init__.py:591: AssertionError -------------------------------------------------------------------------- Captured stdout call -------------------------------------------------------------------------- Script result: python -m pip install --user -e /private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_uninstall_editable_from_u0/data/packages/FSPkg return code: 1 -- stderr: -------------------- ERROR: Command errored out with exit status 1: command: /private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_uninstall_editable_from_u0/workspace/venv/bin/python -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_uninstall_editable_from_u0/data/packages/FSPkg/setup.py'"'"'; __file__='"'"'/private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_uninstall_editable_from_u0/data/packages/FSPkg/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' develop --no-deps --user --prefix= cwd: /private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_uninstall_editable_from_u0/data/packages/FSPkg/ Complete output (19 lines): running develop /private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/setuptools0/install/setuptools/dist.py:473: UserWarning: Normalizing '0.1dev' to '0.1.dev0' warnings.warn( error: can't create or remove files in install directory The following error occurred while trying to add or remove files in the installation directory: [Errno 2] No such file or directory: '/private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_uninstall_editable_from_u0/workspace/venv/user/lib/python3.8/site-packages/test-easy-install-1256.write-test' The installation directory you specified (via --install-dir, --prefix, or the distutils default setting) was: /private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_uninstall_editable_from_u0/workspace/venv/user/lib/python3.8/site-packages This directory does not currently exist. Please create it and try again, or choose a different installation directory (using the -d or --install-dir option). ---------------------------------------- ERROR: Command errored out with exit status 1: /private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_uninstall_editable_from_u0/workspace/venv/bin/python -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_uninstall_editable_from_u0/data/packages/FSPkg/setup.py'"'"'; __file__='"'"'/private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_uninstall_editable_from_u0/data/packages/FSPkg/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' develop --no-deps --user --prefix= Check the logs for full command output. -- stdout: -------------------- Obtaining file:///private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_uninstall_editable_from_u0/data/packages/FSPkg Could not build wheels for FSPkg,since package 'wheel' is not installed. Installing collected packages: FSPkg Running setup.py develop for FSPkg ======================================================================== short test summary info ========================================================================= FAIL tests/functional/test_freeze.py::test_freeze_svn FAIL tests/functional/test_install.py::test_basic_install_editable_from_svn FAIL tests/functional/test_install.py::test_user_config_accepted FAIL tests/functional/test_install_reqs.py::test_multiple_requirements_files FAIL tests/functional/test_install_user.py::Tests_UserSite::()::test_install_subversion_usersite_editable_with_distribute FAIL tests/functional/test_install_user.py::Tests_UserSite::()::test_install_from_current_directory_into_usersite FAIL tests/functional/test_install_user.py::Tests_UserSite::()::test_install_user_conflict_in_usersite FAIL tests/functional/test_install_user.py::Tests_UserSite::()::test_install_user_conflict_in_globalsite FAIL tests/functional/test_install_user.py::Tests_UserSite::()::test_upgrade_user_conflict_in_globalsite FAIL tests/functional/test_install_user.py::Tests_UserSite::()::test_install_user_conflict_in_globalsite_and_usersite FAIL tests/functional/test_install_wheel.py::test_install_user_wheel FAIL tests/functional/test_uninstall.py::test_uninstall_editable_from_svn FAIL tests/functional/test_uninstall.py::test_uninstall_from_reqs_file FAIL tests/functional/test_uninstall_user.py::Tests_UninstallUserSite::()::test_uninstall_from_usersite FAIL tests/functional/test_uninstall_user.py::Tests_UninstallUserSite::()::test_uninstall_from_usersite_with_dist_in_global_site FAIL tests/functional/test_uninstall_user.py::Tests_UninstallUserSite::()::test_uninstall_editable_from_usersite SKIP [1] tests/functional/test_configuration.py:19: Can't modify underlying file for any mode SKIP [1] tests/functional/test_install.py:630: Python 2 only SKIP [1] /Users/jaraco/code/public/pypa/pip/tests/functional/test_no_color.py:34: Unable to capture output using script: script --flush --quiet --return /tmp/pip-test-no-color.txt --command "pip uninstall noSuchPackage" SKIP [1] tests/functional/test_requests.py:4: SKIP [1] tests/functional/test_search.py:81: Warehouse search behavior is different and no longer returns multiple results. See https://github.com/pypa/warehouse/issues/3717 for more information. SKIP [1] tests/functional/test_vcs_bazaar.py:20: Bazaar is only required under Travis SKIP [1] tests/functional/test_warning.py:52: Python 2 only SKIP [1] tests/functional/test_warning.py:62: Python 2 only SKIP [1] tests/unit/test_collector.py:235: condition: sys.platform != 'win32' SKIP [2] tests/unit/test_collector.py:258: condition: sys.platform != 'win32' SKIP [1] tests/unit/test_locations.py:94: Incompatible with venv SKIP [1] tests/unit/test_locations.py:112: Incompatible with venv SKIP [3] tests/unit/test_req.py:673: Test only available on Windows SKIP [1] tests/unit/test_urls.py:27: condition: sys.platform != 'win32' SKIP [1] tests/unit/test_urls.py:59: condition: sys.platform != 'win32' SKIP [2] tests/unit/test_utils_subprocess.py:105: condition: sys.version_info >= (3,) SKIP [1] tests/unit/test_vcs.py:24: Subversion is only required under Travis XFAIL tests/functional/test_freeze.py::test_freeze_exclude_editable XFAIL tests/functional/test_install_reqs.py::test_install_distribution_union_conflicting_extras XFAIL tests/functional/test_yaml.py::test_yaml_based[install/conflicting_triangle] XFAIL tests/functional/test_yaml.py::test_yaml_based[install/conflicting_diamond] XFAIL tests/functional/test_yaml.py::test_yaml_based[install/extras-2] ============================================================================ warnings summary ============================================================================ /Users/jaraco/code/public/pypa/pip/.tox/python/lib/python3.8/site-packages/pip/_internal/req/req_file.py:209: UserWarning: Disabling all use of wheels due to the use of --build-option / --global-option / --install-option. cmdoptions.check_install_build_global(options, line.opts) -- Docs: https://docs.pytest.org/en/latest/warnings.html ============================================== 16 failed, 1791 passed, 21 skipped, 5 xfailed, 1 warnings in 609.03 seconds =============================================== ERROR: InvocationError for command /Users/jaraco/code/public/pypa/pip/.tox/python/bin/pytest --timeout 300 (exited with code 1) ________________________________________________________________________________ summary _________________________________________________________________________________ ERROR: python: commands failed ```
pradyunsg commented 4 years ago

Hmm... I'm also on MacOS and everything passes. Are you using a newer virtualenv (virtualenv >= 20.0)? We know that pip's tests aren't compatible with that but idk what the failure modes are (#7698).

jaraco commented 4 years ago

I realized I have tox-venv installed, meaning that tox envs get installed using venv, so I disabled that by creating a separate environment for running tox, but tests are still failing:

``` pip master $ python -m venv .tox/.tox pip master $ .tox/.tox/bin/pip install tox Collecting tox Using cached https://files.pythonhosted.org/packages/3a/21/aa738f33db84be2caf89fae9d868320f7fc004329dd681cec4056d08cf75/tox-3.14.5-py2.py3-none-any.whl Collecting pluggy<1,>=0.12.0 (from tox) Using cached https://files.pythonhosted.org/packages/a0/28/85c7aa31b80d150b772fbe4a229487bc6644da9ccb7e427dd8cc60cb8a62/pluggy-0.13.1-py2.py3-none-any.whl Collecting six<2,>=1.14.0 (from tox) Using cached https://files.pythonhosted.org/packages/65/eb/1f97cb97bfc2390a276969c6fae16075da282f5058082d4cb10c6c5c1dba/six-1.14.0-py2.py3-none-any.whl Collecting filelock<4,>=3.0.0 (from tox) Using cached https://files.pythonhosted.org/packages/93/83/71a2ee6158bb9f39a90c0dea1637f81d5eef866e188e1971a1b1ab01a35a/filelock-3.0.12-py3-none-any.whl Collecting packaging>=14 (from tox) Downloading https://files.pythonhosted.org/packages/62/0a/34641d2bf5c917c96db0ded85ae4da25b6cd922d6b794648d4e7e07c88e5/packaging-20.3-py2.py3-none-any.whl Collecting toml>=0.9.4 (from tox) Using cached https://files.pythonhosted.org/packages/a2/12/ced7105d2de62fa7c8fb5fce92cc4ce66b57c95fb875e9318dba7f8c5db0/toml-0.10.0-py2.py3-none-any.whl Collecting virtualenv>=16.0.0 (from tox) Downloading https://files.pythonhosted.org/packages/12/6a/6266c56d19c935c5fd7384e7d23936cbda6ecd0997ea3f3fbe9c9464f177/virtualenv-20.0.8-py2.py3-none-any.whl (4.6MB) |████████████████████████████████| 4.6MB 2.2MB/s Collecting py<2,>=1.4.17 (from tox) Using cached https://files.pythonhosted.org/packages/99/8d/21e1767c009211a62a8e3067280bfce76e89c9f876180308515942304d2d/py-1.8.1-py2.py3-none-any.whl Collecting pyparsing>=2.0.2 (from packaging>=14->tox) Using cached https://files.pythonhosted.org/packages/5d/bc/1e58593167fade7b544bfe9502a26dc860940a79ab306e651e7f13be68c2/pyparsing-2.4.6-py2.py3-none-any.whl Collecting appdirs<2,>=1.4.3 (from virtualenv>=16.0.0->tox) Using cached https://files.pythonhosted.org/packages/56/eb/810e700ed1349edde4cbdc1b2a21e28cdf115f9faf263f6bbf8447c1abf3/appdirs-1.4.3-py2.py3-none-any.whl Collecting distlib<1,>=0.3.0 (from virtualenv>=16.0.0->tox) Using cached https://files.pythonhosted.org/packages/7d/29/694a3a4d7c0e1aef76092e9167fbe372e0f7da055f5dcf4e1313ec21d96a/distlib-0.3.0.zip Installing collected packages: pluggy, six, filelock, pyparsing, packaging, toml, appdirs, distlib, virtualenv, py, tox Running setup.py install for distlib ... done Successfully installed appdirs-1.4.3 distlib-0.3.0 filelock-3.0.12 packaging-20.3 pluggy-0.13.1 py-1.8.1 pyparsing-2.4.6 six-1.14.0 toml-0.10.0 tox-3.14.5 virtualenv-20.0.8 WARNING: You are using pip version 19.2.3, however version 20.0.2 is available. You should consider upgrading via the 'pip install --upgrade pip' command. pip master $ .tox/.tox/bin/pip install -U pip Collecting pip Using cached https://files.pythonhosted.org/packages/54/0c/d01aa759fdc501a58f431eb594a17495f15b88da142ce14b5845662c13f3/pip-20.0.2-py2.py3-none-any.whl Installing collected packages: pip Found existing installation: pip 19.2.3 Uninstalling pip-19.2.3: Successfully uninstalled pip-19.2.3 Successfully installed pip-20.0.2 pip master $ .tox/.tox/bin/tox GLOB sdist-make: /Users/jaraco/code/public/pypa/pip/setup.py python recreate: /Users/jaraco/code/public/pypa/pip/.tox/python python installdeps: -r/Users/jaraco/code/public/pypa/pip/tools/requirements/tests.txt python inst: /Users/jaraco/code/public/pypa/pip/.tox/.tmp/package/1/pip-20.1.dev0.zip python installed: apipkg==1.5,atomicwrites==1.3.0,attrs==19.3.0,cffi==1.14.0,coverage==5.0.3,cryptography==2.8,csv23==0.1.6,execnet==1.7.1,freezegun==0.3.15,mock==4.0.1,more-itertools==8.2.0,pip==20.1.dev0,pluggy==0.13.1,pretend==1.0.9,py==1.8.1,pycparser==2.20,pytest==3.8.2,pytest-cov==2.8.1,pytest-forked==1.1.3,pytest-rerunfailures==6.0,pytest-timeout==1.3.4,pytest-xdist==1.27.0,python-dateutil==2.8.1,PyYAML==5.3,scripttest==1.3,setuptools==45.2.0,six==1.14.0,virtualenv==16.7.10,Werkzeug==0.16.0,wheel==0.34.2 python run-test-pre: PYTHONHASHSEED='1354229447' python run-test-pre: commands[0] | python -c 'import shutil, sys; shutil.rmtree(sys.argv[1], ignore_errors=True)' /Users/jaraco/code/public/pypa/pip/tests/data/common_wheels python run-test-pre: commands[1] | python /Users/jaraco/code/public/pypa/pip/tools/tox_pip.py wheel -w /Users/jaraco/code/public/pypa/pip/tests/data/common_wheels -r /Users/jaraco/code/public/pypa/pip/tools/requirements/tests-common_wheels.txt Collecting setuptools>=40.8.0 Using cached setuptools-45.2.0-py3-none-any.whl (584 kB) Saved ./tests/data/common_wheels/setuptools-45.2.0-py3-none-any.whl Collecting wheel Using cached wheel-0.34.2-py2.py3-none-any.whl (26 kB) Saved ./tests/data/common_wheels/wheel-0.34.2-py2.py3-none-any.whl Skipping setuptools, due to already being wheel. Skipping wheel, due to already being wheel. python run-test: commands[0] | pytest --timeout 300 ========================================================================== test session starts =========================================================================== platform darwin -- Python 3.8.1, pytest-3.8.2, py-1.8.1, pluggy-0.13.1 rootdir: /Users/jaraco/code/public/pypa/pip, inifile: setup.cfg plugins: timeout-1.3.4, rerunfailures-6.0, forked-1.1.3, cov-2.8.1, xdist-1.27.0 timeout: 300.0s timeout method: signal timeout func_only: False collected 1833 items tests/functional/test_broken_stdout.py ... [ 0%] tests/functional/test_check.py .......... [ 0%] tests/functional/test_cli.py ... [ 0%] tests/functional/test_completion.py ..................... [ 2%] tests/functional/test_configuration.py .s... [ 2%] tests/functional/test_debug.py ............. [ 3%] tests/functional/test_download.py ...................................... [ 5%] tests/functional/test_freeze.py .....Fx................. [ 6%] tests/functional/test_hash.py ... [ 6%] tests/functional/test_help.py ....... [ 6%] tests/functional/test_install.py .......................F........................s.............................................................F........ [ 13%] tests/functional/test_install_check.py .. [ 13%] tests/functional/test_install_cleanup.py ......... [ 14%] tests/functional/test_install_compat.py .. [ 14%] tests/functional/test_install_config.py ........ [ 14%] tests/functional/test_install_extras.py ....... [ 14%] tests/functional/test_install_force_reinstall.py .. [ 15%] tests/functional/test_install_index.py .... [ 15%] tests/functional/test_install_reqs.py ........F..........................x... [ 17%] tests/functional/test_install_upgrade.py ................... [ 18%] tests/functional/test_install_user.py .FF.FFFF. [ 18%] tests/functional/test_install_vcs_git.py ........................ [ 20%] tests/functional/test_install_wheel.py .............F................ [ 21%] tests/functional/test_list.py .......... ```

I can see in the output that virtualenv==16.7.10 is used (both in this run an the previous one).

jaraco commented 4 years ago

Running the tests with the --use-venv option, 11 of the previous test failures are skipped:

pip master $ tox -- --use-venv --lf                                                                                                                                       
GLOB sdist-make: /Users/jaraco/code/public/pypa/pip/setup.py
python inst-nodeps: /Users/jaraco/code/public/pypa/pip/.tox/.tmp/package/1/pip-20.1.dev0.zip
python installed: apipkg==1.5,atomicwrites==1.3.0,attrs==19.3.0,cffi==1.14.0,coverage==5.0.3,cryptography==2.8,csv23==0.1.6,execnet==1.7.1,freezegun==0.3.15,mock==4.0.1,more-itertools==8.2.0,pip==20.1.dev0,pluggy==0.13.1,pretend==1.0.9,py==1.8.1,pycparser==2.20,pytest==3.8.2,pytest-cov==2.8.1,pytest-forked==1.1.3,pytest-rerunfailures==6.0,pytest-timeout==1.3.4,pytest-xdist==1.27.0,python-dateutil==2.8.1,PyYAML==5.3,scripttest==1.3,setuptools==41.2.0,six==1.14.0,virtualenv==16.7.10,Werkzeug==0.16.0,wheel==0.34.2
python run-test-pre: PYTHONHASHSEED='2897048640'
python run-test-pre: commands[0] | python -c 'import shutil, sys; shutil.rmtree(sys.argv[1], ignore_errors=True)' /Users/jaraco/code/public/pypa/pip/tests/data/common_wheels
python run-test-pre: commands[1] | python /Users/jaraco/code/public/pypa/pip/tools/tox_pip.py wheel -w /Users/jaraco/code/public/pypa/pip/tests/data/common_wheels -r /Users/jaraco/code/public/pypa/pip/tools/requirements/tests-common_wheels.txt
Collecting setuptools>=40.8.0
  Using cached setuptools-45.2.0-py3-none-any.whl (584 kB)
  Saved ./tests/data/common_wheels/setuptools-45.2.0-py3-none-any.whl
Collecting wheel
  Using cached wheel-0.34.2-py2.py3-none-any.whl (26 kB)
  Saved ./tests/data/common_wheels/wheel-0.34.2-py2.py3-none-any.whl
Skipping setuptools, due to already being wheel.
Skipping wheel, due to already being wheel.
python run-test: commands[0] | pytest --timeout 300 --use-venv --lf
========================================================================== test session starts ===========================================================================
platform darwin -- Python 3.8.1, pytest-3.8.2, py-1.8.1, pluggy-0.13.1
rootdir: /Users/jaraco/code/public/pypa/pip, inifile: setup.cfg
plugins: timeout-1.3.4, rerunfailures-6.0, forked-1.1.3, cov-2.8.1, xdist-1.27.0
timeout: 300.0s
timeout method: signal
timeout func_only: False
collected 1833 items / 1817 deselected                                                                                                                                   
run-last-failure: rerun previous 16 failures

tests/functional/test_freeze.py F                                                                                                                                  [  6%]
tests/functional/test_install.py Fs                                                                                                                                [ 18%]
tests/functional/test_install_reqs.py F                                                                                                                            [ 25%]
tests/functional/test_install_user.py ssssss                                                                                                                       [ 62%]
tests/functional/test_install_wheel.py s                                                                                                                           [ 68%]
tests/functional/test_uninstall.py FF                                                                                                                              [ 81%]
tests/functional/test_uninstall_user.py sss                                                                                                                        [100%]

================================================================================ FAILURES ================================================================================
======================================================================== short test summary info =========================================================================
FAIL tests/functional/test_freeze.py::test_freeze_svn
FAIL tests/functional/test_install.py::test_basic_install_editable_from_svn
FAIL tests/functional/test_install_reqs.py::test_multiple_requirements_files
FAIL tests/functional/test_uninstall.py::test_uninstall_editable_from_svn
FAIL tests/functional/test_uninstall.py::test_uninstall_from_reqs_file
SKIP [1] tests/functional/test_install.py:1680: Incompatible with test venv
SKIP [1] tests/functional/test_install_user.py:44: Incompatible with test venv
SKIP [1] tests/functional/test_install_user.py:60: Incompatible with test venv
SKIP [1] tests/functional/test_install_user.py:99: Incompatible with test venv
SKIP [1] tests/functional/test_install_user.py:123: Incompatible with test venv
SKIP [1] tests/functional/test_install_user.py:154: Incompatible with test venv
SKIP [1] tests/functional/test_install_user.py:184: Incompatible with test venv
SKIP [1] tests/functional/test_install_wheel.py:272: Incompatible with test venv
SKIP [1] tests/functional/test_uninstall_user.py:15: Incompatible with test venv
SKIP [2] tests/functional/test_uninstall_user.py: Incompatible with test venv
========================================================= 5 failed, 11 skipped, 1817 deselected in 5.71 seconds ==========================================================

The ones that remain failing are decorated with @need_svn but fail with No such file or directory: 'svnadmin'

jaraco commented 4 years ago

It seems that I have svn installed but not svnadmin, but the pip test suite assumes that if the former is installed that the latter is available. I'll open a separate issue for that.

jaraco commented 4 years ago

After addressing the svn issue, I double-checked that virtualenv 16.7.10 is being invoked when the tests are failing:

python run-test: commands[0] | pytest --timeout 300 -x --lf
========================================================================== test session starts ===========================================================================
platform darwin -- Python 3.8.1, pytest-3.8.2, py-1.8.1, pluggy-0.13.1
rootdir: /Users/jaraco/code/public/pypa/pip, inifile: setup.cfg
plugins: timeout-1.3.4, rerunfailures-6.0, forked-1.1.3, cov-2.8.1, xdist-1.27.0
timeout: 300.0s
timeout method: signal
timeout func_only: False
collected 1833 items / 1823 deselected                                                                                                                                   
run-last-failure: rerun previous 10 failures

tests/functional/test_install.py 
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> PDB set_trace (IO-capturing turned off) >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> /Users/jaraco/code/public/pypa/pip/tests/lib/venv.py(67)_create()
-> _virtualenv.create_environment(
(Pdb) _virtualenv.__file__
'/Users/jaraco/code/public/pypa/pip/.tox/python/lib/python3.8/site-packages/virtualenv.py'
(Pdb) import pkg_resources
(Pdb) pkg_resources.get_distribution('virtualenv').version
'16.7.10'

I then inspected first failing result:

pip bugfix/7823-need-svnadmin $ tox -- -x --lf --pdb                                                                                                                      
GLOB sdist-make: /Users/jaraco/code/public/pypa/pip/setup.py
python inst-nodeps: /Users/jaraco/code/public/pypa/pip/.tox/.tmp/package/1/pip-20.1.dev0.zip
python installed: apipkg==1.5,atomicwrites==1.3.0,attrs==19.3.0,cffi==1.14.0,coverage==5.0.3,cryptography==2.8,csv23==0.1.6,execnet==1.7.1,freezegun==0.3.15,mock==4.0.1,more-itertools==8.2.0,pip==20.1.dev0,pluggy==0.13.1,pretend==1.0.9,py==1.8.1,pycparser==2.20,pytest==3.8.2,pytest-cov==2.8.1,pytest-forked==1.1.3,pytest-rerunfailures==6.0,pytest-timeout==1.3.4,pytest-xdist==1.27.0,python-dateutil==2.8.1,PyYAML==5.3,scripttest==1.3,setuptools==41.2.0,six==1.14.0,virtualenv==16.7.10,Werkzeug==0.16.0,wheel==0.34.2
python run-test-pre: PYTHONHASHSEED='3501743582'
python run-test-pre: commands[0] | python -c 'import shutil, sys; shutil.rmtree(sys.argv[1], ignore_errors=True)' /Users/jaraco/code/public/pypa/pip/tests/data/common_wheels
python run-test-pre: commands[1] | python /Users/jaraco/code/public/pypa/pip/tools/tox_pip.py wheel -w /Users/jaraco/code/public/pypa/pip/tests/data/common_wheels -r /Users/jaraco/code/public/pypa/pip/tools/requirements/tests-common_wheels.txt
Collecting setuptools>=40.8.0
  Using cached setuptools-45.2.0-py3-none-any.whl (584 kB)
  Saved ./tests/data/common_wheels/setuptools-45.2.0-py3-none-any.whl
Collecting wheel
  Using cached wheel-0.34.2-py2.py3-none-any.whl (26 kB)
  Saved ./tests/data/common_wheels/wheel-0.34.2-py2.py3-none-any.whl
Skipping setuptools, due to already being wheel.
Skipping wheel, due to already being wheel.
python run-test: commands[0] | pytest --timeout 300 -x --lf --pdb
========================================================================== test session starts ===========================================================================
platform darwin -- Python 3.8.1, pytest-3.8.2, py-1.8.1, pluggy-0.13.1
rootdir: /Users/jaraco/code/public/pypa/pip, inifile: setup.cfg
plugins: timeout-1.3.4, rerunfailures-6.0, forked-1.1.3, cov-2.8.1, xdist-1.27.0
timeout: 300.0s
timeout method: signal
timeout func_only: False
collected 1833 items / 1823 deselected                                                                                                                                   
run-last-failure: rerun previous 10 failures

tests/functional/test_install.py F
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> captured stderr >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
warning: no files found matching 'docs/docutils.conf'
warning: no previously-included files found matching '.coveragerc'
warning: no previously-included files found matching '.mailmap'
warning: no previously-included files found matching '.appveyor.yml'
warning: no previously-included files found matching '.travis.yml'
warning: no previously-included files found matching '.readthedocs.yml'
warning: no previously-included files found matching '.pre-commit-config.yaml'
warning: no previously-included files found matching 'tox.ini'
warning: no previously-included files found matching 'noxfile.py'
warning: no files found matching 'Makefile' under directory 'docs'
warning: no files found matching '*.rst' under directory 'docs'
warning: no files found matching '*.py' under directory 'docs'
warning: no files found matching '*.bat' under directory 'docs'
warning: no previously-included files found matching 'src/pip/_vendor/six'
warning: no previously-included files found matching 'src/pip/_vendor/six/moves'
warning: no previously-included files matching '*.pyi' found under directory 'src/pip/_vendor'
no previously-included directories found matching '.github'
no previously-included directories found matching '.azure-pipelines'
no previously-included directories found matching 'docs/build'
no previously-included directories found matching 'news'
no previously-included directories found matching 'tasks'
no previously-included directories found matching 'tests'
no previously-included directories found matching 'tools'
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> traceback >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

script = <tests.lib.PipTestEnvironment object at 0x10fa15fd0>

    @pytest.mark.incompatible_with_test_venv
    def test_user_config_accepted(script):
        # user set in the config file is parsed as 0/1 instead of True/False.
        # Check that this doesn't cause a problem.
        config_file = script.scratch_path / 'pip.conf'
        script.environ['PIP_CONFIG_FILE'] = str(config_file)
        config_file.write_text("[install]\nuser = true")
        result = script.pip_install_local('simplewheel')

        assert "Successfully installed simplewheel" in result.stdout

        relative_user = os.path.relpath(script.user_site_path, script.base_path)
>       assert join(relative_user, 'simplewheel') in result.files_created
E       AssertionError: assert 'venv/user/lib/python/site-packages/simplewheel' in {'venv/user/lib/python3.8': <FoundDir /private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest...pytest-19/test_user_config_accepted0/workspace:venv/user/lib/python3.8/site-packages/simplewheel-2.0-1.dist-info>, ...}
E        +  where 'venv/user/lib/python/site-packages/simplewheel' = join('venv/user/lib/python/site-packages', 'simplewheel')
E        +  and   {'venv/user/lib/python3.8': <FoundDir /private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest...pytest-19/test_user_config_accepted0/workspace:venv/user/lib/python3.8/site-packages/simplewheel-2.0-1.dist-info>, ...} = <tests.lib.TestPipResult object at 0x10ec986d0>.files_created

tests/functional/test_install.py:1692: AssertionError
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> entering PDB >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
> /Users/jaraco/code/public/pypa/pip/tests/functional/test_install.py(1692)test_user_config_accepted()
-> assert join(relative_user, 'simplewheel') in result.files_created
(Pdb) result.files_created
{'venv/user/lib/python3.8': <FoundDir /private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_user_config_accepted0/workspace:venv/user/lib/python3.8>, 'venv/user/lib/python3.8/site-packages': <FoundDir /private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_user_config_accepted0/workspace:venv/user/lib/python3.8/site-packages>, 'venv/user/lib/python3.8/site-packages/simplewheel-2.0-1.dist-info': <FoundDir /private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_user_config_accepted0/workspace:venv/user/lib/python3.8/site-packages/simplewheel-2.0-1.dist-info>, 'venv/user/lib/python3.8/site-packages/simplewheel-2.0-1.dist-info/RECORD': <FoundFile /private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_user_config_accepted0/workspace:venv/user/lib/python3.8/site-packages/simplewheel-2.0-1.dist-info/RECORD>, 'venv/user/lib/python3.8/site-packages/simplewheel-2.0-1.dist-info/metadata.json': <FoundFile /private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_user_config_accepted0/workspace:venv/user/lib/python3.8/site-packages/simplewheel-2.0-1.dist-info/metadata.json>, 'venv/user/lib/python3.8/site-packages/simplewheel-2.0-1.dist-info/WHEEL': <FoundFile /private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_user_config_accepted0/workspace:venv/user/lib/python3.8/site-packages/simplewheel-2.0-1.dist-info/WHEEL>, 'venv/user/lib/python3.8/site-packages/simplewheel-2.0-1.dist-info/DESCRIPTION.rst': <FoundFile /private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_user_config_accepted0/workspace:venv/user/lib/python3.8/site-packages/simplewheel-2.0-1.dist-info/DESCRIPTION.rst>, 'venv/user/lib/python3.8/site-packages/simplewheel-2.0-1.dist-info/top_level.txt': <FoundFile /private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_user_config_accepted0/workspace:venv/user/lib/python3.8/site-packages/simplewheel-2.0-1.dist-info/top_level.txt>, 'venv/user/lib/python3.8/site-packages/simplewheel-2.0-1.dist-info/INSTALLER': <FoundFile /private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_user_config_accepted0/workspace:venv/user/lib/python3.8/site-packages/simplewheel-2.0-1.dist-info/INSTALLER>, 'venv/user/lib/python3.8/site-packages/simplewheel-2.0-1.dist-info/METADATA': <FoundFile /private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_user_config_accepted0/workspace:venv/user/lib/python3.8/site-packages/simplewheel-2.0-1.dist-info/METADATA>, 'venv/user/lib/python3.8/site-packages/simplewheel': <FoundDir /private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_user_config_accepted0/workspace:venv/user/lib/python3.8/site-packages/simplewheel>, 'venv/user/lib/python3.8/site-packages/simplewheel/__init__.py': <FoundFile /private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_user_config_accepted0/workspace:venv/user/lib/python3.8/site-packages/simplewheel/__init__.py>}
(Pdb) join(relative_user, 'simplewheel')
'venv/user/lib/python/site-packages/simplewheel'
(Pdb) !list(map(print, list(result.files_created)))
venv/user/lib/python3.8
venv/user/lib/python3.8/site-packages
venv/user/lib/python3.8/site-packages/simplewheel-2.0-1.dist-info
venv/user/lib/python3.8/site-packages/simplewheel-2.0-1.dist-info/RECORD
venv/user/lib/python3.8/site-packages/simplewheel-2.0-1.dist-info/metadata.json
venv/user/lib/python3.8/site-packages/simplewheel-2.0-1.dist-info/WHEEL
venv/user/lib/python3.8/site-packages/simplewheel-2.0-1.dist-info/DESCRIPTION.rst
venv/user/lib/python3.8/site-packages/simplewheel-2.0-1.dist-info/top_level.txt
venv/user/lib/python3.8/site-packages/simplewheel-2.0-1.dist-info/INSTALLER
venv/user/lib/python3.8/site-packages/simplewheel-2.0-1.dist-info/METADATA
venv/user/lib/python3.8/site-packages/simplewheel
venv/user/lib/python3.8/site-packages/simplewheel/__init__.py
[None, None, None, None, None, None, None, None, None, None, None, None]

As you can see, the test is expecting venv/usr/lib/python to be in the result files when what it finds is venv/usr/lib/python3.8.

jaraco commented 4 years ago

Here's a bit more detail about how that discrepancy comes about:

(Pdb) script.user_site_path
Path('/private/var/folders/c6/v7hnmq453xb6p2dbz1gqc6rr0000gn/T/pytest-of-jaraco/pytest-19/test_user_config_accepted0/workspace/venv/user/lib/python/site-packages')
(Pdb) import site
(Pdb) site.USER_SITE
'/Users/jaraco/Library/Python/3.8/lib/python/site-packages'
jaraco commented 4 years ago

I suspect the pip test suite isn't accounting for this branch.

jaraco commented 4 years ago

The commit in af9f744 works around the issue. Feel free to merge that in or address the underlying cause.

gutsytechster commented 4 years ago

Is this still an active issue or is it resolved with above-mentioned commit?

jaraco commented 4 years ago

I don't believe the aforementioned commit is in master (though it's not obvious to me from what I can see in GitHub). Even if merged into master, it's only a workaround and this ticket maybe should remain open to address the root cause.