17db96d56Sopenharmony_ciimport errno
27db96d56Sopenharmony_ciimport os
37db96d56Sopenharmony_ciimport sys
47db96d56Sopenharmony_ciimport textwrap
57db96d56Sopenharmony_ciimport unittest
67db96d56Sopenharmony_ciimport subprocess
77db96d56Sopenharmony_ci
87db96d56Sopenharmony_cifrom test import support
97db96d56Sopenharmony_cifrom test.support import os_helper
107db96d56Sopenharmony_cifrom test.support.script_helper import assert_python_ok
117db96d56Sopenharmony_ci
127db96d56Sopenharmony_ci
137db96d56Sopenharmony_ci@support.requires_subprocess()
147db96d56Sopenharmony_ciclass TestTool(unittest.TestCase):
157db96d56Sopenharmony_ci    data = """
167db96d56Sopenharmony_ci
177db96d56Sopenharmony_ci        [["blorpie"],[ "whoops" ] , [
187db96d56Sopenharmony_ci                                 ],\t"d-shtaeou",\r"d-nthiouh",
197db96d56Sopenharmony_ci        "i-vhbjkhnth", {"nifty":87}, {"morefield" :\tfalse,"field"
207db96d56Sopenharmony_ci            :"yes"}  ]
217db96d56Sopenharmony_ci           """
227db96d56Sopenharmony_ci
237db96d56Sopenharmony_ci    expect_without_sort_keys = textwrap.dedent("""\
247db96d56Sopenharmony_ci    [
257db96d56Sopenharmony_ci        [
267db96d56Sopenharmony_ci            "blorpie"
277db96d56Sopenharmony_ci        ],
287db96d56Sopenharmony_ci        [
297db96d56Sopenharmony_ci            "whoops"
307db96d56Sopenharmony_ci        ],
317db96d56Sopenharmony_ci        [],
327db96d56Sopenharmony_ci        "d-shtaeou",
337db96d56Sopenharmony_ci        "d-nthiouh",
347db96d56Sopenharmony_ci        "i-vhbjkhnth",
357db96d56Sopenharmony_ci        {
367db96d56Sopenharmony_ci            "nifty": 87
377db96d56Sopenharmony_ci        },
387db96d56Sopenharmony_ci        {
397db96d56Sopenharmony_ci            "field": "yes",
407db96d56Sopenharmony_ci            "morefield": false
417db96d56Sopenharmony_ci        }
427db96d56Sopenharmony_ci    ]
437db96d56Sopenharmony_ci    """)
447db96d56Sopenharmony_ci
457db96d56Sopenharmony_ci    expect = textwrap.dedent("""\
467db96d56Sopenharmony_ci    [
477db96d56Sopenharmony_ci        [
487db96d56Sopenharmony_ci            "blorpie"
497db96d56Sopenharmony_ci        ],
507db96d56Sopenharmony_ci        [
517db96d56Sopenharmony_ci            "whoops"
527db96d56Sopenharmony_ci        ],
537db96d56Sopenharmony_ci        [],
547db96d56Sopenharmony_ci        "d-shtaeou",
557db96d56Sopenharmony_ci        "d-nthiouh",
567db96d56Sopenharmony_ci        "i-vhbjkhnth",
577db96d56Sopenharmony_ci        {
587db96d56Sopenharmony_ci            "nifty": 87
597db96d56Sopenharmony_ci        },
607db96d56Sopenharmony_ci        {
617db96d56Sopenharmony_ci            "morefield": false,
627db96d56Sopenharmony_ci            "field": "yes"
637db96d56Sopenharmony_ci        }
647db96d56Sopenharmony_ci    ]
657db96d56Sopenharmony_ci    """)
667db96d56Sopenharmony_ci
677db96d56Sopenharmony_ci    jsonlines_raw = textwrap.dedent("""\
687db96d56Sopenharmony_ci    {"ingredients":["frog", "water", "chocolate", "glucose"]}
697db96d56Sopenharmony_ci    {"ingredients":["chocolate","steel bolts"]}
707db96d56Sopenharmony_ci    """)
717db96d56Sopenharmony_ci
727db96d56Sopenharmony_ci    jsonlines_expect = textwrap.dedent("""\
737db96d56Sopenharmony_ci    {
747db96d56Sopenharmony_ci        "ingredients": [
757db96d56Sopenharmony_ci            "frog",
767db96d56Sopenharmony_ci            "water",
777db96d56Sopenharmony_ci            "chocolate",
787db96d56Sopenharmony_ci            "glucose"
797db96d56Sopenharmony_ci        ]
807db96d56Sopenharmony_ci    }
817db96d56Sopenharmony_ci    {
827db96d56Sopenharmony_ci        "ingredients": [
837db96d56Sopenharmony_ci            "chocolate",
847db96d56Sopenharmony_ci            "steel bolts"
857db96d56Sopenharmony_ci        ]
867db96d56Sopenharmony_ci    }
877db96d56Sopenharmony_ci    """)
887db96d56Sopenharmony_ci
897db96d56Sopenharmony_ci    def test_stdin_stdout(self):
907db96d56Sopenharmony_ci        args = sys.executable, '-m', 'json.tool'
917db96d56Sopenharmony_ci        process = subprocess.run(args, input=self.data, capture_output=True, text=True, check=True)
927db96d56Sopenharmony_ci        self.assertEqual(process.stdout, self.expect)
937db96d56Sopenharmony_ci        self.assertEqual(process.stderr, '')
947db96d56Sopenharmony_ci
957db96d56Sopenharmony_ci    def _create_infile(self, data=None):
967db96d56Sopenharmony_ci        infile = os_helper.TESTFN
977db96d56Sopenharmony_ci        with open(infile, "w", encoding="utf-8") as fp:
987db96d56Sopenharmony_ci            self.addCleanup(os.remove, infile)
997db96d56Sopenharmony_ci            fp.write(data or self.data)
1007db96d56Sopenharmony_ci        return infile
1017db96d56Sopenharmony_ci
1027db96d56Sopenharmony_ci    def test_infile_stdout(self):
1037db96d56Sopenharmony_ci        infile = self._create_infile()
1047db96d56Sopenharmony_ci        rc, out, err = assert_python_ok('-m', 'json.tool', infile)
1057db96d56Sopenharmony_ci        self.assertEqual(rc, 0)
1067db96d56Sopenharmony_ci        self.assertEqual(out.splitlines(), self.expect.encode().splitlines())
1077db96d56Sopenharmony_ci        self.assertEqual(err, b'')
1087db96d56Sopenharmony_ci
1097db96d56Sopenharmony_ci    def test_non_ascii_infile(self):
1107db96d56Sopenharmony_ci        data = '{"msg": "\u3053\u3093\u306b\u3061\u306f"}'
1117db96d56Sopenharmony_ci        expect = textwrap.dedent('''\
1127db96d56Sopenharmony_ci        {
1137db96d56Sopenharmony_ci            "msg": "\\u3053\\u3093\\u306b\\u3061\\u306f"
1147db96d56Sopenharmony_ci        }
1157db96d56Sopenharmony_ci        ''').encode()
1167db96d56Sopenharmony_ci
1177db96d56Sopenharmony_ci        infile = self._create_infile(data)
1187db96d56Sopenharmony_ci        rc, out, err = assert_python_ok('-m', 'json.tool', infile)
1197db96d56Sopenharmony_ci
1207db96d56Sopenharmony_ci        self.assertEqual(rc, 0)
1217db96d56Sopenharmony_ci        self.assertEqual(out.splitlines(), expect.splitlines())
1227db96d56Sopenharmony_ci        self.assertEqual(err, b'')
1237db96d56Sopenharmony_ci
1247db96d56Sopenharmony_ci    def test_infile_outfile(self):
1257db96d56Sopenharmony_ci        infile = self._create_infile()
1267db96d56Sopenharmony_ci        outfile = os_helper.TESTFN + '.out'
1277db96d56Sopenharmony_ci        rc, out, err = assert_python_ok('-m', 'json.tool', infile, outfile)
1287db96d56Sopenharmony_ci        self.addCleanup(os.remove, outfile)
1297db96d56Sopenharmony_ci        with open(outfile, "r", encoding="utf-8") as fp:
1307db96d56Sopenharmony_ci            self.assertEqual(fp.read(), self.expect)
1317db96d56Sopenharmony_ci        self.assertEqual(rc, 0)
1327db96d56Sopenharmony_ci        self.assertEqual(out, b'')
1337db96d56Sopenharmony_ci        self.assertEqual(err, b'')
1347db96d56Sopenharmony_ci
1357db96d56Sopenharmony_ci    def test_writing_in_place(self):
1367db96d56Sopenharmony_ci        infile = self._create_infile()
1377db96d56Sopenharmony_ci        rc, out, err = assert_python_ok('-m', 'json.tool', infile, infile)
1387db96d56Sopenharmony_ci        with open(infile, "r", encoding="utf-8") as fp:
1397db96d56Sopenharmony_ci            self.assertEqual(fp.read(), self.expect)
1407db96d56Sopenharmony_ci        self.assertEqual(rc, 0)
1417db96d56Sopenharmony_ci        self.assertEqual(out, b'')
1427db96d56Sopenharmony_ci        self.assertEqual(err, b'')
1437db96d56Sopenharmony_ci
1447db96d56Sopenharmony_ci    def test_jsonlines(self):
1457db96d56Sopenharmony_ci        args = sys.executable, '-m', 'json.tool', '--json-lines'
1467db96d56Sopenharmony_ci        process = subprocess.run(args, input=self.jsonlines_raw, capture_output=True, text=True, check=True)
1477db96d56Sopenharmony_ci        self.assertEqual(process.stdout, self.jsonlines_expect)
1487db96d56Sopenharmony_ci        self.assertEqual(process.stderr, '')
1497db96d56Sopenharmony_ci
1507db96d56Sopenharmony_ci    def test_help_flag(self):
1517db96d56Sopenharmony_ci        rc, out, err = assert_python_ok('-m', 'json.tool', '-h')
1527db96d56Sopenharmony_ci        self.assertEqual(rc, 0)
1537db96d56Sopenharmony_ci        self.assertTrue(out.startswith(b'usage: '))
1547db96d56Sopenharmony_ci        self.assertEqual(err, b'')
1557db96d56Sopenharmony_ci
1567db96d56Sopenharmony_ci    def test_sort_keys_flag(self):
1577db96d56Sopenharmony_ci        infile = self._create_infile()
1587db96d56Sopenharmony_ci        rc, out, err = assert_python_ok('-m', 'json.tool', '--sort-keys', infile)
1597db96d56Sopenharmony_ci        self.assertEqual(rc, 0)
1607db96d56Sopenharmony_ci        self.assertEqual(out.splitlines(),
1617db96d56Sopenharmony_ci                         self.expect_without_sort_keys.encode().splitlines())
1627db96d56Sopenharmony_ci        self.assertEqual(err, b'')
1637db96d56Sopenharmony_ci
1647db96d56Sopenharmony_ci    def test_indent(self):
1657db96d56Sopenharmony_ci        input_ = '[1, 2]'
1667db96d56Sopenharmony_ci        expect = textwrap.dedent('''\
1677db96d56Sopenharmony_ci        [
1687db96d56Sopenharmony_ci          1,
1697db96d56Sopenharmony_ci          2
1707db96d56Sopenharmony_ci        ]
1717db96d56Sopenharmony_ci        ''')
1727db96d56Sopenharmony_ci        args = sys.executable, '-m', 'json.tool', '--indent', '2'
1737db96d56Sopenharmony_ci        process = subprocess.run(args, input=input_, capture_output=True, text=True, check=True)
1747db96d56Sopenharmony_ci        self.assertEqual(process.stdout, expect)
1757db96d56Sopenharmony_ci        self.assertEqual(process.stderr, '')
1767db96d56Sopenharmony_ci
1777db96d56Sopenharmony_ci    def test_no_indent(self):
1787db96d56Sopenharmony_ci        input_ = '[1,\n2]'
1797db96d56Sopenharmony_ci        expect = '[1, 2]\n'
1807db96d56Sopenharmony_ci        args = sys.executable, '-m', 'json.tool', '--no-indent'
1817db96d56Sopenharmony_ci        process = subprocess.run(args, input=input_, capture_output=True, text=True, check=True)
1827db96d56Sopenharmony_ci        self.assertEqual(process.stdout, expect)
1837db96d56Sopenharmony_ci        self.assertEqual(process.stderr, '')
1847db96d56Sopenharmony_ci
1857db96d56Sopenharmony_ci    def test_tab(self):
1867db96d56Sopenharmony_ci        input_ = '[1, 2]'
1877db96d56Sopenharmony_ci        expect = '[\n\t1,\n\t2\n]\n'
1887db96d56Sopenharmony_ci        args = sys.executable, '-m', 'json.tool', '--tab'
1897db96d56Sopenharmony_ci        process = subprocess.run(args, input=input_, capture_output=True, text=True, check=True)
1907db96d56Sopenharmony_ci        self.assertEqual(process.stdout, expect)
1917db96d56Sopenharmony_ci        self.assertEqual(process.stderr, '')
1927db96d56Sopenharmony_ci
1937db96d56Sopenharmony_ci    def test_compact(self):
1947db96d56Sopenharmony_ci        input_ = '[ 1 ,\n 2]'
1957db96d56Sopenharmony_ci        expect = '[1,2]\n'
1967db96d56Sopenharmony_ci        args = sys.executable, '-m', 'json.tool', '--compact'
1977db96d56Sopenharmony_ci        process = subprocess.run(args, input=input_, capture_output=True, text=True, check=True)
1987db96d56Sopenharmony_ci        self.assertEqual(process.stdout, expect)
1997db96d56Sopenharmony_ci        self.assertEqual(process.stderr, '')
2007db96d56Sopenharmony_ci
2017db96d56Sopenharmony_ci    def test_no_ensure_ascii_flag(self):
2027db96d56Sopenharmony_ci        infile = self._create_infile('{"key":"�"}')
2037db96d56Sopenharmony_ci        outfile = os_helper.TESTFN + '.out'
2047db96d56Sopenharmony_ci        self.addCleanup(os.remove, outfile)
2057db96d56Sopenharmony_ci        assert_python_ok('-m', 'json.tool', '--no-ensure-ascii', infile, outfile)
2067db96d56Sopenharmony_ci        with open(outfile, "rb") as f:
2077db96d56Sopenharmony_ci            lines = f.read().splitlines()
2087db96d56Sopenharmony_ci        # asserting utf-8 encoded output file
2097db96d56Sopenharmony_ci        expected = [b'{', b'    "key": "\xf0\x9f\x92\xa9"', b"}"]
2107db96d56Sopenharmony_ci        self.assertEqual(lines, expected)
2117db96d56Sopenharmony_ci
2127db96d56Sopenharmony_ci    def test_ensure_ascii_default(self):
2137db96d56Sopenharmony_ci        infile = self._create_infile('{"key":"�"}')
2147db96d56Sopenharmony_ci        outfile = os_helper.TESTFN + '.out'
2157db96d56Sopenharmony_ci        self.addCleanup(os.remove, outfile)
2167db96d56Sopenharmony_ci        assert_python_ok('-m', 'json.tool', infile, outfile)
2177db96d56Sopenharmony_ci        with open(outfile, "rb") as f:
2187db96d56Sopenharmony_ci            lines = f.read().splitlines()
2197db96d56Sopenharmony_ci        # asserting an ascii encoded output file
2207db96d56Sopenharmony_ci        expected = [b'{', rb'    "key": "\ud83d\udca9"', b"}"]
2217db96d56Sopenharmony_ci        self.assertEqual(lines, expected)
2227db96d56Sopenharmony_ci
2237db96d56Sopenharmony_ci    @unittest.skipIf(sys.platform =="win32", "The test is failed with ValueError on Windows")
2247db96d56Sopenharmony_ci    def test_broken_pipe_error(self):
2257db96d56Sopenharmony_ci        cmd = [sys.executable, '-m', 'json.tool']
2267db96d56Sopenharmony_ci        proc = subprocess.Popen(cmd,
2277db96d56Sopenharmony_ci                                stdout=subprocess.PIPE,
2287db96d56Sopenharmony_ci                                stdin=subprocess.PIPE)
2297db96d56Sopenharmony_ci        # bpo-39828: Closing before json.tool attempts to write into stdout.
2307db96d56Sopenharmony_ci        proc.stdout.close()
2317db96d56Sopenharmony_ci        proc.communicate(b'"{}"')
2327db96d56Sopenharmony_ci        self.assertEqual(proc.returncode, errno.EPIPE)
233