mirror of
https://github.com/python/cpython.git
synced 2025-07-21 10:15:46 +00:00

- Add requires_fork and requires_subprocess to more tests - Skip extension import tests if dlopen is not available - Don't assume that _testcapi is a shared extension - Skip a lot of socket tests that don't work on Emscripten - Skip mmap tests, mmap emulation is incomplete - venv does not work yet - Cannot get libc from executable The "entire" test suite is now passing on Emscripten with EMSDK from git head (91 suites are skipped).
232 lines
7.4 KiB
Python
232 lines
7.4 KiB
Python
import errno
|
|
import os
|
|
import sys
|
|
import textwrap
|
|
import unittest
|
|
import subprocess
|
|
|
|
from test import support
|
|
from test.support import os_helper
|
|
from test.support.script_helper import assert_python_ok
|
|
|
|
|
|
@support.requires_subprocess()
|
|
class TestTool(unittest.TestCase):
|
|
data = """
|
|
|
|
[["blorpie"],[ "whoops" ] , [
|
|
],\t"d-shtaeou",\r"d-nthiouh",
|
|
"i-vhbjkhnth", {"nifty":87}, {"morefield" :\tfalse,"field"
|
|
:"yes"} ]
|
|
"""
|
|
|
|
expect_without_sort_keys = textwrap.dedent("""\
|
|
[
|
|
[
|
|
"blorpie"
|
|
],
|
|
[
|
|
"whoops"
|
|
],
|
|
[],
|
|
"d-shtaeou",
|
|
"d-nthiouh",
|
|
"i-vhbjkhnth",
|
|
{
|
|
"nifty": 87
|
|
},
|
|
{
|
|
"field": "yes",
|
|
"morefield": false
|
|
}
|
|
]
|
|
""")
|
|
|
|
expect = textwrap.dedent("""\
|
|
[
|
|
[
|
|
"blorpie"
|
|
],
|
|
[
|
|
"whoops"
|
|
],
|
|
[],
|
|
"d-shtaeou",
|
|
"d-nthiouh",
|
|
"i-vhbjkhnth",
|
|
{
|
|
"nifty": 87
|
|
},
|
|
{
|
|
"morefield": false,
|
|
"field": "yes"
|
|
}
|
|
]
|
|
""")
|
|
|
|
jsonlines_raw = textwrap.dedent("""\
|
|
{"ingredients":["frog", "water", "chocolate", "glucose"]}
|
|
{"ingredients":["chocolate","steel bolts"]}
|
|
""")
|
|
|
|
jsonlines_expect = textwrap.dedent("""\
|
|
{
|
|
"ingredients": [
|
|
"frog",
|
|
"water",
|
|
"chocolate",
|
|
"glucose"
|
|
]
|
|
}
|
|
{
|
|
"ingredients": [
|
|
"chocolate",
|
|
"steel bolts"
|
|
]
|
|
}
|
|
""")
|
|
|
|
def test_stdin_stdout(self):
|
|
args = sys.executable, '-m', 'json.tool'
|
|
process = subprocess.run(args, input=self.data, capture_output=True, text=True, check=True)
|
|
self.assertEqual(process.stdout, self.expect)
|
|
self.assertEqual(process.stderr, '')
|
|
|
|
def _create_infile(self, data=None):
|
|
infile = os_helper.TESTFN
|
|
with open(infile, "w", encoding="utf-8") as fp:
|
|
self.addCleanup(os.remove, infile)
|
|
fp.write(data or self.data)
|
|
return infile
|
|
|
|
def test_infile_stdout(self):
|
|
infile = self._create_infile()
|
|
rc, out, err = assert_python_ok('-m', 'json.tool', infile)
|
|
self.assertEqual(rc, 0)
|
|
self.assertEqual(out.splitlines(), self.expect.encode().splitlines())
|
|
self.assertEqual(err, b'')
|
|
|
|
def test_non_ascii_infile(self):
|
|
data = '{"msg": "\u3053\u3093\u306b\u3061\u306f"}'
|
|
expect = textwrap.dedent('''\
|
|
{
|
|
"msg": "\\u3053\\u3093\\u306b\\u3061\\u306f"
|
|
}
|
|
''').encode()
|
|
|
|
infile = self._create_infile(data)
|
|
rc, out, err = assert_python_ok('-m', 'json.tool', infile)
|
|
|
|
self.assertEqual(rc, 0)
|
|
self.assertEqual(out.splitlines(), expect.splitlines())
|
|
self.assertEqual(err, b'')
|
|
|
|
def test_infile_outfile(self):
|
|
infile = self._create_infile()
|
|
outfile = os_helper.TESTFN + '.out'
|
|
rc, out, err = assert_python_ok('-m', 'json.tool', infile, outfile)
|
|
self.addCleanup(os.remove, outfile)
|
|
with open(outfile, "r", encoding="utf-8") as fp:
|
|
self.assertEqual(fp.read(), self.expect)
|
|
self.assertEqual(rc, 0)
|
|
self.assertEqual(out, b'')
|
|
self.assertEqual(err, b'')
|
|
|
|
def test_writing_in_place(self):
|
|
infile = self._create_infile()
|
|
rc, out, err = assert_python_ok('-m', 'json.tool', infile, infile)
|
|
with open(infile, "r", encoding="utf-8") as fp:
|
|
self.assertEqual(fp.read(), self.expect)
|
|
self.assertEqual(rc, 0)
|
|
self.assertEqual(out, b'')
|
|
self.assertEqual(err, b'')
|
|
|
|
def test_jsonlines(self):
|
|
args = sys.executable, '-m', 'json.tool', '--json-lines'
|
|
process = subprocess.run(args, input=self.jsonlines_raw, capture_output=True, text=True, check=True)
|
|
self.assertEqual(process.stdout, self.jsonlines_expect)
|
|
self.assertEqual(process.stderr, '')
|
|
|
|
def test_help_flag(self):
|
|
rc, out, err = assert_python_ok('-m', 'json.tool', '-h')
|
|
self.assertEqual(rc, 0)
|
|
self.assertTrue(out.startswith(b'usage: '))
|
|
self.assertEqual(err, b'')
|
|
|
|
def test_sort_keys_flag(self):
|
|
infile = self._create_infile()
|
|
rc, out, err = assert_python_ok('-m', 'json.tool', '--sort-keys', infile)
|
|
self.assertEqual(rc, 0)
|
|
self.assertEqual(out.splitlines(),
|
|
self.expect_without_sort_keys.encode().splitlines())
|
|
self.assertEqual(err, b'')
|
|
|
|
def test_indent(self):
|
|
input_ = '[1, 2]'
|
|
expect = textwrap.dedent('''\
|
|
[
|
|
1,
|
|
2
|
|
]
|
|
''')
|
|
args = sys.executable, '-m', 'json.tool', '--indent', '2'
|
|
process = subprocess.run(args, input=input_, capture_output=True, text=True, check=True)
|
|
self.assertEqual(process.stdout, expect)
|
|
self.assertEqual(process.stderr, '')
|
|
|
|
def test_no_indent(self):
|
|
input_ = '[1,\n2]'
|
|
expect = '[1, 2]\n'
|
|
args = sys.executable, '-m', 'json.tool', '--no-indent'
|
|
process = subprocess.run(args, input=input_, capture_output=True, text=True, check=True)
|
|
self.assertEqual(process.stdout, expect)
|
|
self.assertEqual(process.stderr, '')
|
|
|
|
def test_tab(self):
|
|
input_ = '[1, 2]'
|
|
expect = '[\n\t1,\n\t2\n]\n'
|
|
args = sys.executable, '-m', 'json.tool', '--tab'
|
|
process = subprocess.run(args, input=input_, capture_output=True, text=True, check=True)
|
|
self.assertEqual(process.stdout, expect)
|
|
self.assertEqual(process.stderr, '')
|
|
|
|
def test_compact(self):
|
|
input_ = '[ 1 ,\n 2]'
|
|
expect = '[1,2]\n'
|
|
args = sys.executable, '-m', 'json.tool', '--compact'
|
|
process = subprocess.run(args, input=input_, capture_output=True, text=True, check=True)
|
|
self.assertEqual(process.stdout, expect)
|
|
self.assertEqual(process.stderr, '')
|
|
|
|
def test_no_ensure_ascii_flag(self):
|
|
infile = self._create_infile('{"key":"💩"}')
|
|
outfile = os_helper.TESTFN + '.out'
|
|
self.addCleanup(os.remove, outfile)
|
|
assert_python_ok('-m', 'json.tool', '--no-ensure-ascii', infile, outfile)
|
|
with open(outfile, "rb") as f:
|
|
lines = f.read().splitlines()
|
|
# asserting utf-8 encoded output file
|
|
expected = [b'{', b' "key": "\xf0\x9f\x92\xa9"', b"}"]
|
|
self.assertEqual(lines, expected)
|
|
|
|
def test_ensure_ascii_default(self):
|
|
infile = self._create_infile('{"key":"💩"}')
|
|
outfile = os_helper.TESTFN + '.out'
|
|
self.addCleanup(os.remove, outfile)
|
|
assert_python_ok('-m', 'json.tool', infile, outfile)
|
|
with open(outfile, "rb") as f:
|
|
lines = f.read().splitlines()
|
|
# asserting an ascii encoded output file
|
|
expected = [b'{', rb' "key": "\ud83d\udca9"', b"}"]
|
|
self.assertEqual(lines, expected)
|
|
|
|
@unittest.skipIf(sys.platform =="win32", "The test is failed with ValueError on Windows")
|
|
def test_broken_pipe_error(self):
|
|
cmd = [sys.executable, '-m', 'json.tool']
|
|
proc = subprocess.Popen(cmd,
|
|
stdout=subprocess.PIPE,
|
|
stdin=subprocess.PIPE)
|
|
# bpo-39828: Closing before json.tool attempts to write into stdout.
|
|
proc.stdout.close()
|
|
proc.communicate(b'"{}"')
|
|
self.assertEqual(proc.returncode, errno.EPIPE)
|