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