1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
|
import pytest
import py
import os.path
import sys
from pypy.module.sys.initpath import (compute_stdlib_path_sourcetree,
find_executable, find_stdlib, resolvedirof, pypy_init_home, pypy_init_free,
find_pyvenv_cfg)
from pypy.module.sys.version import PYPY_VERSION, CPYTHON_VERSION
from rpython.rtyper.lltypesystem import rffi
def build_hierarchy_srctree(prefix):
dirname = '%d' % CPYTHON_VERSION[0]
a = prefix.join('lib_pypy').ensure(dir=1)
b = prefix.join('lib-python', dirname).ensure(dir=1)
return a, b
def build_hierarchy_package(prefix, platlibdir="lib"):
if sys.platform == "win32":
b = prefix.join(platlibdir).ensure(dir=1)
else:
dot_ver = 'pypy%d.%d' % CPYTHON_VERSION[:2]
b = prefix.join(platlibdir, dot_ver).ensure(dir=1)
b.join('site.py').ensure(dir=0)
return b
def test_find_stdlib(tmpdir):
bin_dir = tmpdir.join('bin').ensure(dir=True)
pypy = bin_dir.join('pypy3').ensure(file=True)
build_hierarchy_srctree(tmpdir)
path, prefix = find_stdlib(None, "lib", str(pypy))
assert prefix == tmpdir
# if executable is None look for stdlib based on the working directory
# see lib-python/2.7/test/test_sys.py:test_executable
_, prefix = find_stdlib(None, "lib", '')
cwd = os.path.dirname(os.path.realpath(__file__))
assert prefix is not None
assert cwd.startswith(str(prefix))
if sys.platform == "win32":
libdirnames = ["Lib"]
else:
libdirnames = ["lib", "lib64"]
@pytest.mark.parametrize("platlibdir", libdirnames)
def test_find_stdlib_package(tmpdir, platlibdir):
bin_dir = tmpdir.join('bin').ensure(dir=True)
pypy = bin_dir.join('pypy3').ensure(file=True)
build_hierarchy_package(tmpdir, platlibdir)
path, prefix = find_stdlib(None, platlibdir, str(pypy))
assert prefix == tmpdir
# if executable is None look for stdlib based on the working directory
# see lib-python/2.7/test/test_sys.py:test_executable
_, prefix = find_stdlib(None, platlibdir, '')
cwd = os.path.dirname(os.path.realpath(__file__))
assert prefix is not None
assert cwd.startswith(str(prefix))
@py.test.mark.skipif('not hasattr(os, "symlink")')
def test_find_stdlib_follow_symlink(tmpdir):
pypydir = tmpdir.join('opt', 'pypy3-xxx')
pypy = pypydir.join('bin', 'pypy3').ensure(file=True)
build_hierarchy_srctree(pypydir)
pypy_sym = tmpdir.join('pypy3_sym')
os.symlink(str(pypy), str(pypy_sym))
path, prefix = find_stdlib(None, "lib", str(pypy_sym))
assert prefix == pypydir
def test_pypy_init_home():
p = pypy_init_home()
assert p
s = rffi.charp2str(p)
pypy_init_free(p)
assert os.path.exists(s)
def test_compute_stdlib_path(tmpdir):
dirs = build_hierarchy_srctree(tmpdir)
path = compute_stdlib_path_sourcetree(None, "lib", str(tmpdir))
# we get at least 'dirs'
assert path[:len(dirs)] == map(str, dirs)
def test_find_executable(tmpdir, monkeypatch):
from pypy.module.sys import initpath
tmpdir = py.path.local(os.path.realpath(str(tmpdir)))
# /tmp/a/pypy3
# /tmp/b/pypy3
# /tmp/c
a = tmpdir.join('a').ensure(dir=True)
b = tmpdir.join('b').ensure(dir=True)
c = tmpdir.join('c').ensure(dir=True)
a.join('pypy3').ensure(file=True)
b.join('pypy3').ensure(file=True)
#
monkeypatch.setattr(os, 'access', lambda x, y: True)
# if there is already a slash, don't do anything
monkeypatch.chdir(tmpdir)
assert find_executable('a/pypy3') == a.join('pypy3')
#
# if path is None, try abspath (if the file exists)
monkeypatch.setenv('PATH', None)
monkeypatch.chdir(a)
assert find_executable('pypy3') == a.join('pypy3')
monkeypatch.chdir(tmpdir) # no pypy3 there
assert find_executable('pypy3') == ''
#
# find it in path
monkeypatch.setenv('PATH', str(a))
assert find_executable('pypy3') == a.join('pypy3')
#
# find it in the first dir in path
monkeypatch.setenv('PATH', '%s%s%s' % (b, os.pathsep, a))
assert find_executable('pypy3') == b.join('pypy3')
#
# find it in the second, because in the first it's not there
monkeypatch.setenv('PATH', '%s%s%s' % (c, os.pathsep, a))
assert find_executable('pypy3') == a.join('pypy3')
# if pypy3 is found but it's not a file, ignore it
c.join('pypy3').ensure(dir=True)
assert find_executable('pypy3') == a.join('pypy3')
# if pypy3 is found but it's not executable, ignore it
monkeypatch.setattr(os, 'access', lambda x, y: False)
assert find_executable('pypy3') == ''
#
monkeypatch.setattr(os, 'access', lambda x, y: True)
monkeypatch.setattr(initpath, 'we_are_translated', lambda: True)
monkeypatch.setattr(initpath, '_WIN32', True)
monkeypatch.setenv('PATH', str(a))
a.join('pypy3.exe').ensure(file=True)
assert find_executable('pypy3') == a.join('pypy3.exe')
def test_resolvedirof(tmpdir):
assert resolvedirof('') == os.path.abspath(os.path.join(os.getcwd(), '..'))
foo = tmpdir.join('foo').ensure(dir=True)
bar = tmpdir.join('bar').ensure(dir=True)
myfile = foo.join('myfile').ensure(file=True)
assert resolvedirof(str(myfile)) == foo
if hasattr(myfile, 'mksymlinkto'):
myfile2 = bar.join('myfile')
myfile2.mksymlinkto(myfile)
assert resolvedirof(str(myfile2)) == foo
def test_find_pyvenv_cfg(tmpdir):
subdir = tmpdir.join('find_cfg').ensure(dir=True)
assert find_pyvenv_cfg(str(subdir)) == ''
subdir.join('pyvenv.cfg').write('foobar')
assert find_pyvenv_cfg(str(subdir)) == ''
subdir.join('pyvenv.cfg').write('foobar\nhome=xyz')
assert find_pyvenv_cfg(str(subdir)) == 'xyz'
subdir.join('pyvenv.cfg').write('foohome=xyz')
assert find_pyvenv_cfg(str(subdir)) == ''
subdir.join('pyvenv.cfg').write('home = xyx \nbar = baz\n')
assert find_pyvenv_cfg(str(subdir)) == 'xyx'
def test_find_stdlib_follow_pyvenv_cfg(tmpdir):
mydir = tmpdir.join('follow_pyvenv_cfg').ensure(dir=True)
otherdir = tmpdir.join('otherdir').ensure(dir=True)
bin_dir = mydir.join('bin').ensure(dir=True)
pypy = bin_dir.join('pypy3').ensure(file=True)
build_hierarchy_srctree(otherdir)
for homedir in [otherdir, otherdir.join('bin')]:
mydir.join('pyvenv.cfg').write('home = %s\n' % (homedir,))
_, prefix = find_stdlib(None, "lib", str(pypy))
assert prefix == otherdir
|