summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_capi.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/test/test_capi.py')
-rw-r--r--Lib/test/test_capi.py96
1 files changed, 71 insertions, 25 deletions
diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py
index bbbacc2..e1f9ae9 100644
--- a/Lib/test/test_capi.py
+++ b/Lib/test/test_capi.py
@@ -9,6 +9,7 @@ import subprocess
import sys
import time
import unittest
+import textwrap
from test import support
try:
import _posixsubprocess
@@ -218,36 +219,81 @@ class Test6012(unittest.TestCase):
self.assertEqual(_testcapi.argparsing("Hello", "World"), 1)
-class EmbeddingTest(unittest.TestCase):
+@unittest.skipIf(
+ sys.platform.startswith('win'),
+ "interpreter embedding tests aren't built under Windows")
+class EmbeddingTests(unittest.TestCase):
+ # XXX only tested under Unix checkouts
- @unittest.skipIf(
- sys.platform.startswith('win'),
- "test doesn't work under Windows")
- def test_subinterps(self):
- # XXX only tested under Unix checkouts
+ def setUp(self):
basepath = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))
- oldcwd = os.getcwd()
+ self.test_exe = exe = os.path.join(basepath, "Modules", "_testembed")
+ if not os.path.exists(exe):
+ self.skipTest("%r doesn't exist" % exe)
# This is needed otherwise we get a fatal error:
# "Py_Initialize: Unable to get the locale encoding
# LookupError: no codec search functions registered: can't find encoding"
+ self.oldcwd = os.getcwd()
os.chdir(basepath)
- try:
- exe = os.path.join(basepath, "Modules", "_testembed")
- if not os.path.exists(exe):
- self.skipTest("%r doesn't exist" % exe)
- p = subprocess.Popen([exe],
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
- (out, err) = p.communicate()
- self.assertEqual(p.returncode, 0,
- "bad returncode %d, stderr is %r" %
- (p.returncode, err))
- if support.verbose:
- print()
- print(out.decode('latin1'))
- print(err.decode('latin1'))
- finally:
- os.chdir(oldcwd)
+
+ def tearDown(self):
+ os.chdir(self.oldcwd)
+
+ def run_embedded_interpreter(self, *args):
+ """Runs a test in the embedded interpreter"""
+ cmd = [self.test_exe]
+ cmd.extend(args)
+ p = subprocess.Popen(cmd,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+ (out, err) = p.communicate()
+ self.assertEqual(p.returncode, 0,
+ "bad returncode %d, stderr is %r" %
+ (p.returncode, err))
+ return out.decode("latin1"), err.decode("latin1")
+
+ def test_subinterps(self):
+ # This is just a "don't crash" test
+ out, err = self.run_embedded_interpreter()
+ if support.verbose:
+ print()
+ print(out)
+ print(err)
+
+ def test_forced_io_encoding(self):
+ # Checks forced configuration of embedded interpreter IO streams
+ out, err = self.run_embedded_interpreter("forced_io_encoding")
+ if support.verbose:
+ print()
+ print(out)
+ print(err)
+ expected_output = textwrap.dedent("""\
+ --- Use defaults ---
+ Expected encoding: default
+ Expected errors: default
+ stdin: {0.stdin.encoding}:strict
+ stdout: {0.stdout.encoding}:strict
+ stderr: {0.stderr.encoding}:backslashreplace
+ --- Set errors only ---
+ Expected encoding: default
+ Expected errors: surrogateescape
+ stdin: {0.stdin.encoding}:surrogateescape
+ stdout: {0.stdout.encoding}:surrogateescape
+ stderr: {0.stderr.encoding}:backslashreplace
+ --- Set encoding only ---
+ Expected encoding: latin-1
+ Expected errors: default
+ stdin: latin-1:strict
+ stdout: latin-1:strict
+ stderr: latin-1:backslashreplace
+ --- Set encoding and errors ---
+ Expected encoding: latin-1
+ Expected errors: surrogateescape
+ stdin: latin-1:surrogateescape
+ stdout: latin-1:surrogateescape
+ stderr: latin-1:backslashreplace""").format(sys)
+
+ self.assertEqual(out.strip(), expected_output)
class SkipitemTest(unittest.TestCase):
@@ -358,7 +404,7 @@ class TestThreadState(unittest.TestCase):
def test_main():
support.run_unittest(CAPITest, TestPendingCalls, Test6012,
- EmbeddingTest, SkipitemTest, TestThreadState,
+ EmbeddingTests, SkipitemTest, TestThreadState,
SubinterpreterTest)
for name in dir(_testcapi):