| 
									
										
										
										
											2020-03-10 16:41:44 +09:00
										 |  |  | import errno | 
					
						
							| 
									
										
										
										
											2012-11-29 02:15:18 +02:00
										 |  |  | import os | 
					
						
							|  |  |  | import sys | 
					
						
							|  |  |  | import textwrap | 
					
						
							|  |  |  | import unittest | 
					
						
							| 
									
										
										
										
											2019-12-07 07:14:40 -07:00
										 |  |  | import subprocess | 
					
						
							| 
									
										
										
										
											2020-03-10 16:41:44 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-11-29 02:15:18 +02:00
										 |  |  | from test import support | 
					
						
							| 
									
										
										
										
											2020-07-06 17:12:49 +08:00
										 |  |  | from test.support import os_helper | 
					
						
							| 
									
										
										
										
											2015-05-06 06:33:17 +03:00
										 |  |  | from test.support.script_helper import assert_python_ok | 
					
						
							| 
									
										
										
										
											2012-11-29 02:15:18 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-10 09:56:54 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-22 12:04:36 +02:00
										 |  |  | @support.requires_subprocess() | 
					
						
							| 
									
										
										
										
											2012-11-29 02:15:18 +02:00
										 |  |  | class TestTool(unittest.TestCase): | 
					
						
							|  |  |  |     data = """
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         [["blorpie"],[ "whoops" ] , [ | 
					
						
							|  |  |  |                                  ],\t"d-shtaeou",\r"d-nthiouh", | 
					
						
							|  |  |  |         "i-vhbjkhnth", {"nifty":87}, {"morefield" :\tfalse,"field" | 
					
						
							|  |  |  |             :"yes"}  ] | 
					
						
							|  |  |  |            """
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-10 09:56:54 +02:00
										 |  |  |     expect_without_sort_keys = textwrap.dedent("""\
 | 
					
						
							| 
									
										
										
										
											2012-11-29 02:15:18 +02:00
										 |  |  |     [ | 
					
						
							|  |  |  |         [ | 
					
						
							|  |  |  |             "blorpie" | 
					
						
							| 
									
										
										
										
											2012-11-29 02:25:03 +02:00
										 |  |  |         ], | 
					
						
							| 
									
										
										
										
											2012-11-29 02:15:18 +02:00
										 |  |  |         [ | 
					
						
							|  |  |  |             "whoops" | 
					
						
							| 
									
										
										
										
											2012-11-29 02:25:03 +02:00
										 |  |  |         ], | 
					
						
							|  |  |  |         [], | 
					
						
							|  |  |  |         "d-shtaeou", | 
					
						
							|  |  |  |         "d-nthiouh", | 
					
						
							|  |  |  |         "i-vhbjkhnth", | 
					
						
							| 
									
										
										
										
											2012-11-29 02:15:18 +02:00
										 |  |  |         { | 
					
						
							|  |  |  |             "nifty": 87 | 
					
						
							| 
									
										
										
										
											2012-11-29 02:25:03 +02:00
										 |  |  |         }, | 
					
						
							| 
									
										
										
										
											2012-11-29 02:15:18 +02:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2012-11-29 02:25:03 +02:00
										 |  |  |             "field": "yes", | 
					
						
							| 
									
										
										
										
											2012-11-29 02:15:18 +02:00
										 |  |  |             "morefield": false | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  |     """)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-10 09:56:54 +02:00
										 |  |  |     expect = textwrap.dedent("""\
 | 
					
						
							|  |  |  |     [ | 
					
						
							|  |  |  |         [ | 
					
						
							|  |  |  |             "blorpie" | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |         [ | 
					
						
							|  |  |  |             "whoops" | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |         [], | 
					
						
							|  |  |  |         "d-shtaeou", | 
					
						
							|  |  |  |         "d-nthiouh", | 
					
						
							|  |  |  |         "i-vhbjkhnth", | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             "nifty": 87 | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             "morefield": false, | 
					
						
							|  |  |  |             "field": "yes" | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  |     """)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-07 18:09:32 +08:00
										 |  |  |     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" | 
					
						
							|  |  |  |         ] | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     """)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-11-29 02:15:18 +02:00
										 |  |  |     def test_stdin_stdout(self): | 
					
						
							| 
									
										
										
										
											2017-03-15 10:31:06 -04:00
										 |  |  |         args = sys.executable, '-m', 'json.tool' | 
					
						
							| 
									
										
										
										
											2019-12-07 07:14:40 -07:00
										 |  |  |         process = subprocess.run(args, input=self.data, capture_output=True, text=True, check=True) | 
					
						
							|  |  |  |         self.assertEqual(process.stdout, self.expect) | 
					
						
							|  |  |  |         self.assertEqual(process.stderr, '') | 
					
						
							| 
									
										
										
										
											2012-11-29 02:15:18 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-04 18:39:31 +09:00
										 |  |  |     def _create_infile(self, data=None): | 
					
						
							| 
									
										
										
										
											2020-07-06 17:12:49 +08:00
										 |  |  |         infile = os_helper.TESTFN | 
					
						
							| 
									
										
										
										
											2019-12-04 18:39:31 +09:00
										 |  |  |         with open(infile, "w", encoding="utf-8") as fp: | 
					
						
							| 
									
										
										
										
											2012-11-29 02:15:18 +02:00
										 |  |  |             self.addCleanup(os.remove, infile) | 
					
						
							| 
									
										
										
										
											2019-12-04 18:39:31 +09:00
										 |  |  |             fp.write(data or self.data) | 
					
						
							| 
									
										
										
										
											2012-11-29 02:15:18 +02:00
										 |  |  |         return infile | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_infile_stdout(self): | 
					
						
							|  |  |  |         infile = self._create_infile() | 
					
						
							|  |  |  |         rc, out, err = assert_python_ok('-m', 'json.tool', infile) | 
					
						
							| 
									
										
										
										
											2014-03-21 23:17:29 -05:00
										 |  |  |         self.assertEqual(rc, 0) | 
					
						
							| 
									
										
										
										
											2012-11-29 05:10:07 +02:00
										 |  |  |         self.assertEqual(out.splitlines(), self.expect.encode().splitlines()) | 
					
						
							| 
									
										
										
										
											2012-11-29 02:15:18 +02:00
										 |  |  |         self.assertEqual(err, b'') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-04 18:39:31 +09:00
										 |  |  |     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'') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-11-29 02:15:18 +02:00
										 |  |  |     def test_infile_outfile(self): | 
					
						
							|  |  |  |         infile = self._create_infile() | 
					
						
							| 
									
										
										
										
											2020-07-06 17:12:49 +08:00
										 |  |  |         outfile = os_helper.TESTFN + '.out' | 
					
						
							| 
									
										
										
										
											2012-11-29 02:15:18 +02:00
										 |  |  |         rc, out, err = assert_python_ok('-m', 'json.tool', infile, outfile) | 
					
						
							|  |  |  |         self.addCleanup(os.remove, outfile) | 
					
						
							| 
									
										
										
										
											2021-04-06 11:18:41 +09:00
										 |  |  |         with open(outfile, "r", encoding="utf-8") as fp: | 
					
						
							| 
									
										
										
										
											2012-11-29 02:15:18 +02:00
										 |  |  |             self.assertEqual(fp.read(), self.expect) | 
					
						
							| 
									
										
										
										
											2014-03-21 23:17:29 -05:00
										 |  |  |         self.assertEqual(rc, 0) | 
					
						
							| 
									
										
										
										
											2012-11-29 02:15:18 +02:00
										 |  |  |         self.assertEqual(out, b'') | 
					
						
							|  |  |  |         self.assertEqual(err, b'') | 
					
						
							| 
									
										
										
										
											2014-03-21 23:17:29 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-06 18:11:35 +01:00
										 |  |  |     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'') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-07 18:09:32 +08:00
										 |  |  |     def test_jsonlines(self): | 
					
						
							|  |  |  |         args = sys.executable, '-m', 'json.tool', '--json-lines' | 
					
						
							| 
									
										
										
										
											2019-12-07 07:14:40 -07:00
										 |  |  |         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, '') | 
					
						
							| 
									
										
										
										
											2018-11-07 18:09:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-21 23:17:29 -05:00
										 |  |  |     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'') | 
					
						
							| 
									
										
										
										
											2014-11-10 09:56:54 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     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'') | 
					
						
							| 
									
										
										
										
											2019-12-04 01:15:19 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_indent(self): | 
					
						
							| 
									
										
										
										
											2019-12-07 07:14:40 -07:00
										 |  |  |         input_ = '[1, 2]' | 
					
						
							| 
									
										
										
										
											2019-12-04 01:15:19 -05:00
										 |  |  |         expect = textwrap.dedent('''\
 | 
					
						
							|  |  |  |         [ | 
					
						
							|  |  |  |           1, | 
					
						
							|  |  |  |           2 | 
					
						
							|  |  |  |         ] | 
					
						
							| 
									
										
										
										
											2019-12-07 07:14:40 -07:00
										 |  |  |         ''')
 | 
					
						
							| 
									
										
										
										
											2019-12-04 01:15:19 -05:00
										 |  |  |         args = sys.executable, '-m', 'json.tool', '--indent', '2' | 
					
						
							| 
									
										
										
										
											2019-12-07 07:14:40 -07:00
										 |  |  |         process = subprocess.run(args, input=input_, capture_output=True, text=True, check=True) | 
					
						
							|  |  |  |         self.assertEqual(process.stdout, expect) | 
					
						
							|  |  |  |         self.assertEqual(process.stderr, '') | 
					
						
							| 
									
										
										
										
											2019-12-04 01:15:19 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_no_indent(self): | 
					
						
							| 
									
										
										
										
											2019-12-07 07:14:40 -07:00
										 |  |  |         input_ = '[1,\n2]' | 
					
						
							|  |  |  |         expect = '[1, 2]\n' | 
					
						
							| 
									
										
										
										
											2019-12-04 01:15:19 -05:00
										 |  |  |         args = sys.executable, '-m', 'json.tool', '--no-indent' | 
					
						
							| 
									
										
										
										
											2019-12-07 07:14:40 -07:00
										 |  |  |         process = subprocess.run(args, input=input_, capture_output=True, text=True, check=True) | 
					
						
							|  |  |  |         self.assertEqual(process.stdout, expect) | 
					
						
							|  |  |  |         self.assertEqual(process.stderr, '') | 
					
						
							| 
									
										
										
										
											2019-12-04 01:15:19 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_tab(self): | 
					
						
							| 
									
										
										
										
											2019-12-07 07:14:40 -07:00
										 |  |  |         input_ = '[1, 2]' | 
					
						
							|  |  |  |         expect = '[\n\t1,\n\t2\n]\n' | 
					
						
							| 
									
										
										
										
											2019-12-04 01:15:19 -05:00
										 |  |  |         args = sys.executable, '-m', 'json.tool', '--tab' | 
					
						
							| 
									
										
										
										
											2019-12-07 07:14:40 -07:00
										 |  |  |         process = subprocess.run(args, input=input_, capture_output=True, text=True, check=True) | 
					
						
							|  |  |  |         self.assertEqual(process.stdout, expect) | 
					
						
							|  |  |  |         self.assertEqual(process.stderr, '') | 
					
						
							| 
									
										
										
										
											2019-12-04 01:15:19 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_compact(self): | 
					
						
							| 
									
										
										
										
											2019-12-07 07:14:40 -07:00
										 |  |  |         input_ = '[ 1 ,\n 2]' | 
					
						
							|  |  |  |         expect = '[1,2]\n' | 
					
						
							| 
									
										
										
										
											2019-12-04 01:15:19 -05:00
										 |  |  |         args = sys.executable, '-m', 'json.tool', '--compact' | 
					
						
							| 
									
										
										
										
											2019-12-07 07:14:40 -07:00
										 |  |  |         process = subprocess.run(args, input=input_, capture_output=True, text=True, check=True) | 
					
						
							|  |  |  |         self.assertEqual(process.stdout, expect) | 
					
						
							|  |  |  |         self.assertEqual(process.stderr, '') | 
					
						
							| 
									
										
										
										
											2019-12-06 00:44:01 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def test_no_ensure_ascii_flag(self): | 
					
						
							|  |  |  |         infile = self._create_infile('{"key":"💩"}') | 
					
						
							| 
									
										
										
										
											2020-07-06 17:12:49 +08:00
										 |  |  |         outfile = os_helper.TESTFN + '.out' | 
					
						
							| 
									
										
										
										
											2019-12-06 00:44:01 -06:00
										 |  |  |         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":"💩"}') | 
					
						
							| 
									
										
										
										
											2020-07-06 17:12:49 +08:00
										 |  |  |         outfile = os_helper.TESTFN + '.out' | 
					
						
							| 
									
										
										
										
											2019-12-06 00:44:01 -06:00
										 |  |  |         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) | 
					
						
							| 
									
										
										
										
											2020-03-10 16:41:44 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  |     @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) |