https://github.com/python/cpython/commit/f247e1d04c91b5a353c499487248dda93c151d2d
commit: f247e1d04c91b5a353c499487248dda93c151d2d
branch: main
author: Semyon Moroz <donbar...@proton.me>
committer: picnixz <10796600+picn...@users.noreply.github.com>
date: 2025-04-06T11:50:32-04:00
summary:

gh-131178: Add tests for `pickle` command-line interface (#131275)

Co-authored-by: Bénédikt Tran <10796600+picn...@users.noreply.github.com>

files:
M Lib/pickle.py
M Lib/test/test_pickle.py

diff --git a/Lib/pickle.py b/Lib/pickle.py
index efcdcbec718166..4fa3632d1a738f 100644
--- a/Lib/pickle.py
+++ b/Lib/pickle.py
@@ -1907,7 +1907,7 @@ def _loads(s, /, *, fix_imports=True, encoding="ASCII", 
errors="strict",
     dump, dumps, load, loads = _dump, _dumps, _load, _loads
 
 
-if __name__ == "__main__":
+def _main(args=None):
     import argparse
     import pprint
     parser = argparse.ArgumentParser(
@@ -1915,7 +1915,7 @@ def _loads(s, /, *, fix_imports=True, encoding="ASCII", 
errors="strict",
     parser.add_argument(
         'pickle_file',
         nargs='+', help='the pickle file')
-    args = parser.parse_args()
+    args = parser.parse_args(args)
     for fn in args.pickle_file:
         if fn == '-':
             obj = load(sys.stdin.buffer)
@@ -1923,3 +1923,7 @@ def _loads(s, /, *, fix_imports=True, encoding="ASCII", 
errors="strict",
             with open(fn, 'rb') as f:
                 obj = load(f)
         pprint.pprint(obj)
+
+
+if __name__ == "__main__":
+    _main()
diff --git a/Lib/test/test_pickle.py b/Lib/test/test_pickle.py
index 385b257164ef95..296d4b882e138c 100644
--- a/Lib/test/test_pickle.py
+++ b/Lib/test/test_pickle.py
@@ -1,18 +1,21 @@
 from _compat_pickle import (IMPORT_MAPPING, REVERSE_IMPORT_MAPPING,
                             NAME_MAPPING, REVERSE_NAME_MAPPING)
 import builtins
-import pickle
-import io
 import collections
+import contextlib
+import io
+import pickle
 import struct
 import sys
+import tempfile
 import warnings
 import weakref
+from textwrap import dedent
 
 import doctest
 import unittest
 from test import support
-from test.support import import_helper
+from test.support import import_helper, os_helper
 
 from test.pickletester import AbstractHookTests
 from test.pickletester import AbstractUnpickleTests
@@ -699,6 +702,58 @@ def test_multiprocessing_exceptions(self):
                                  ('multiprocessing.context', name))
 
 
+class CommandLineTest(unittest.TestCase):
+    def setUp(self):
+        self.filename = tempfile.mktemp()
+        self.addCleanup(os_helper.unlink, self.filename)
+
+    @staticmethod
+    def text_normalize(string):
+        """Dedent *string* and strip it from its surrounding whitespaces.
+
+        This method is used by the other utility functions so that any
+        string to write or to match against can be freely indented.
+        """
+        return dedent(string).strip()
+
+    def set_pickle_data(self, data):
+        with open(self.filename, 'wb') as f:
+            pickle.dump(data, f)
+
+    def invoke_pickle(self, *flags):
+        output = io.StringIO()
+        with contextlib.redirect_stdout(output):
+            pickle._main(args=[*flags, self.filename])
+        return self.text_normalize(output.getvalue())
+
+    def test_invocation(self):
+        # test 'python -m pickle pickle_file'
+        data = {
+            'a': [1, 2.0, 3+4j],
+            'b': ('character string', b'byte string'),
+            'c': 'string'
+        }
+        expect = '''
+            {'a': [1, 2.0, (3+4j)],
+             'b': ('character string', b'byte string'),
+             'c': 'string'}
+        '''
+        self.set_pickle_data(data)
+
+        with self.subTest(data=data):
+            res = self.invoke_pickle()
+            expect = self.text_normalize(expect)
+            self.assertListEqual(res.splitlines(), expect.splitlines())
+
+    def test_unknown_flag(self):
+        stderr = io.StringIO()
+        with self.assertRaises(SystemExit):
+            # check that the parser help is shown
+            with contextlib.redirect_stderr(stderr):
+                _ = self.invoke_pickle('--unknown')
+        self.assertStartsWith(stderr.getvalue(), 'usage: ')
+
+
 def load_tests(loader, tests, pattern):
     tests.addTest(doctest.DocTestSuite(pickle))
     return tests

_______________________________________________
Python-checkins mailing list -- python-checkins@python.org
To unsubscribe send an email to python-checkins-le...@python.org
https://mail.python.org/mailman3/lists/python-checkins.python.org/
Member address: arch...@mail-archive.com

Reply via email to