Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py
index 6f73fcf..b1b831e 100644
--- a/Lib/test/test_venv.py
+++ b/Lib/test/test_venv.py
@@ -154,17 +154,47 @@
"""
for usl in (False, True):
builder = venv.EnvBuilder(clear=True, symlinks=usl)
- if (usl and sys.platform == 'darwin' and
- '__PYVENV_LAUNCHER__' in os.environ):
- self.assertRaises(ValueError, builder.create, self.env_dir)
- else:
- builder.create(self.env_dir)
- fn = self.get_env_file(self.bindir, self.exe)
- # Don't test when False, because e.g. 'python' is always
- # symlinked to 'python3.3' in the env, even when symlinking in
- # general isn't wanted.
- if usl:
- self.assertTrue(os.path.islink(fn))
+ builder.create(self.env_dir)
+ fn = self.get_env_file(self.bindir, self.exe)
+ # Don't test when False, because e.g. 'python' is always
+ # symlinked to 'python3.3' in the env, even when symlinking in
+ # general isn't wanted.
+ if usl:
+ self.assertTrue(os.path.islink(fn))
+
+ # If a venv is created from a source build and that venv is used to
+ # run the test, the pyvenv.cfg in the venv created in the test will
+ # point to the venv being used to run the test, and we lose the link
+ # to the source build - so Python can't initialise properly.
+ @unittest.skipIf(sys.prefix != sys.base_prefix, 'Test not appropriate '
+ 'in a venv')
+ def test_executable(self):
+ """
+ Test that the sys.executable value is as expected.
+ """
+ shutil.rmtree(self.env_dir)
+ self.run_with_capture(venv.create, self.env_dir)
+ envpy = os.path.join(os.path.realpath(self.env_dir), self.bindir, self.exe)
+ cmd = [envpy, '-c', 'import sys; print(sys.executable)']
+ p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+ out, err = p.communicate()
+ self.assertEqual(out[:-1], envpy.encode())
+
+ @unittest.skipUnless(can_symlink(), 'Needs symlinks')
+ def test_executable_symlinks(self):
+ """
+ Test that the sys.executable value is as expected.
+ """
+ shutil.rmtree(self.env_dir)
+ builder = venv.EnvBuilder(clear=True, symlinks=True)
+ builder.create(self.env_dir)
+ envpy = os.path.join(os.path.realpath(self.env_dir), self.bindir, self.exe)
+ cmd = [envpy, '-c', 'import sys; print(sys.executable)']
+ p = subprocess.Popen(cmd, stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+ out, err = p.communicate()
+ self.assertEqual(out[:-1], envpy.encode())
def test_main():
run_unittest(BasicTest)