From 1ac00950b28e91fc35fed6445722ade92732648e Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 26 Jan 2014 23:48:38 +0200 Subject: Issue #19990: Added tests for the imghdr module. Based on patch by Claudiu Popa. --- Lib/test/imghdrdata/python.bmp | Bin 0 -> 1162 bytes Lib/test/imghdrdata/python.gif | Bin 0 -> 610 bytes Lib/test/imghdrdata/python.jpg | Bin 0 -> 543 bytes Lib/test/imghdrdata/python.pbm | 3 + Lib/test/imghdrdata/python.pgm | Bin 0 -> 269 bytes Lib/test/imghdrdata/python.png | Bin 0 -> 1020 bytes Lib/test/imghdrdata/python.ppm | Bin 0 -> 781 bytes Lib/test/imghdrdata/python.ras | Bin 0 -> 1056 bytes Lib/test/imghdrdata/python.sgi | Bin 0 -> 1967 bytes Lib/test/imghdrdata/python.tiff | Bin 0 -> 1326 bytes Lib/test/imghdrdata/python.xbm | 6 ++ Lib/test/test_imghdr.py | 131 ++++++++++++++++++++++++++++++++++++++++ Lib/test/test_sundry.py | 1 - Misc/NEWS | 3 + 14 files changed, 143 insertions(+), 1 deletion(-) create mode 100644 Lib/test/imghdrdata/python.bmp create mode 100644 Lib/test/imghdrdata/python.gif create mode 100644 Lib/test/imghdrdata/python.jpg create mode 100644 Lib/test/imghdrdata/python.pbm create mode 100644 Lib/test/imghdrdata/python.pgm create mode 100644 Lib/test/imghdrdata/python.png create mode 100644 Lib/test/imghdrdata/python.ppm create mode 100644 Lib/test/imghdrdata/python.ras create mode 100644 Lib/test/imghdrdata/python.sgi create mode 100644 Lib/test/imghdrdata/python.tiff create mode 100644 Lib/test/imghdrdata/python.xbm create mode 100644 Lib/test/test_imghdr.py diff --git a/Lib/test/imghdrdata/python.bmp b/Lib/test/imghdrdata/python.bmp new file mode 100644 index 0000000..675f951 Binary files /dev/null and b/Lib/test/imghdrdata/python.bmp differ diff --git a/Lib/test/imghdrdata/python.gif b/Lib/test/imghdrdata/python.gif new file mode 100644 index 0000000..96fd9fe Binary files /dev/null and b/Lib/test/imghdrdata/python.gif differ diff --git a/Lib/test/imghdrdata/python.jpg b/Lib/test/imghdrdata/python.jpg new file mode 100644 index 0000000..21222c0 Binary files /dev/null and b/Lib/test/imghdrdata/python.jpg differ diff --git a/Lib/test/imghdrdata/python.pbm b/Lib/test/imghdrdata/python.pbm new file mode 100644 index 0000000..1848ba7 --- /dev/null +++ b/Lib/test/imghdrdata/python.pbm @@ -0,0 +1,3 @@ +P4 +16 16 +ûñ¿úßÕ­±[ñ¥a_ÁX°°ðððð?ÿÿ \ No newline at end of file diff --git a/Lib/test/imghdrdata/python.pgm b/Lib/test/imghdrdata/python.pgm new file mode 100644 index 0000000..8349f2a Binary files /dev/null and b/Lib/test/imghdrdata/python.pgm differ diff --git a/Lib/test/imghdrdata/python.png b/Lib/test/imghdrdata/python.png new file mode 100644 index 0000000..1a987f7 Binary files /dev/null and b/Lib/test/imghdrdata/python.png differ diff --git a/Lib/test/imghdrdata/python.ppm b/Lib/test/imghdrdata/python.ppm new file mode 100644 index 0000000..7d9cdb3 Binary files /dev/null and b/Lib/test/imghdrdata/python.ppm differ diff --git a/Lib/test/imghdrdata/python.ras b/Lib/test/imghdrdata/python.ras new file mode 100644 index 0000000..130e96f Binary files /dev/null and b/Lib/test/imghdrdata/python.ras differ diff --git a/Lib/test/imghdrdata/python.sgi b/Lib/test/imghdrdata/python.sgi new file mode 100644 index 0000000..ffe9081 Binary files /dev/null and b/Lib/test/imghdrdata/python.sgi differ diff --git a/Lib/test/imghdrdata/python.tiff b/Lib/test/imghdrdata/python.tiff new file mode 100644 index 0000000..39d0bfc Binary files /dev/null and b/Lib/test/imghdrdata/python.tiff differ diff --git a/Lib/test/imghdrdata/python.xbm b/Lib/test/imghdrdata/python.xbm new file mode 100644 index 0000000..cfbee2e --- /dev/null +++ b/Lib/test/imghdrdata/python.xbm @@ -0,0 +1,6 @@ +#define python_width 16 +#define python_height 16 +static char python_bits[] = { + 0xDF, 0xFE, 0x8F, 0xFD, 0x5F, 0xFB, 0xAB, 0xFE, 0xB5, 0x8D, 0xDA, 0x8F, + 0xA5, 0x86, 0xFA, 0x83, 0x1A, 0x80, 0x0D, 0x80, 0x0D, 0x80, 0x0F, 0xE0, + 0x0F, 0xF8, 0x0F, 0xF8, 0x0F, 0xFC, 0xFF, 0xFF, }; diff --git a/Lib/test/test_imghdr.py b/Lib/test/test_imghdr.py new file mode 100644 index 0000000..0ad4343 --- /dev/null +++ b/Lib/test/test_imghdr.py @@ -0,0 +1,131 @@ +import imghdr +import io +import os +import unittest +import warnings +from test.support import findfile, TESTFN, unlink + +TEST_FILES = ( + ('python.png', 'png'), + ('python.gif', 'gif'), + ('python.bmp', 'bmp'), + ('python.ppm', 'ppm'), + ('python.pgm', 'pgm'), + ('python.pbm', 'pbm'), + ('python.jpg', 'jpeg'), + ('python.ras', 'rast'), + ('python.sgi', 'rgb'), + ('python.tiff', 'tiff'), + ('python.xbm', 'xbm') +) + +class UnseekableIO(io.FileIO): + def tell(self): + raise io.UnsupportedOperation + + def seek(self, *args, **kwargs): + raise io.UnsupportedOperation + +class TestImghdr(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.testfile = findfile('python.png', subdir='imghdrdata') + with open(cls.testfile, 'rb') as stream: + cls.testdata = stream.read() + + def tearDown(self): + unlink(TESTFN) + + def test_data(self): + for filename, expected in TEST_FILES: + filename = findfile(filename, subdir='imghdrdata') + self.assertEqual(imghdr.what(filename), expected) + with open(filename, 'rb') as stream: + self.assertEqual(imghdr.what(stream), expected) + with open(filename, 'rb') as stream: + data = stream.read() + self.assertEqual(imghdr.what(None, data), expected) + self.assertEqual(imghdr.what(None, bytearray(data)), expected) + + def test_register_test(self): + def test_jumbo(h, file): + if h.startswith(b'eggs'): + return 'ham' + imghdr.tests.append(test_jumbo) + self.addCleanup(imghdr.tests.pop) + self.assertEqual(imghdr.what(None, b'eggs'), 'ham') + + def test_file_pos(self): + with open(TESTFN, 'wb') as stream: + stream.write(b'ababagalamaga') + pos = stream.tell() + stream.write(self.testdata) + with open(TESTFN, 'rb') as stream: + stream.seek(pos) + self.assertEqual(imghdr.what(stream), 'png') + self.assertEqual(stream.tell(), pos) + + def test_bad_args(self): + with self.assertRaises(TypeError): + imghdr.what() + with self.assertRaises(AttributeError): + imghdr.what(None) + with self.assertRaises(TypeError): + imghdr.what(self.testfile, 1) + with self.assertRaises(AttributeError): + imghdr.what(os.fsencode(self.testfile)) + with open(self.testfile, 'rb') as f: + with self.assertRaises(AttributeError): + imghdr.what(f.fileno()) + + def test_invalid_headers(self): + for header in (b'\211PN\r\n', + b'\001\331', + b'\x59\xA6', + b'cutecat', + b'000000JFI', + b'GIF80'): + self.assertIsNone(imghdr.what(None, header)) + + def test_string_data(self): + with warnings.catch_warnings(): + warnings.simplefilter("ignore", BytesWarning) + for filename, _ in TEST_FILES: + filename = findfile(filename, subdir='imghdrdata') + with open(filename, 'rb') as stream: + data = stream.read().decode('latin1') + with self.assertRaises(TypeError): + imghdr.what(io.StringIO(data)) + with self.assertRaises(TypeError): + imghdr.what(None, data) + + def test_missing_file(self): + with self.assertRaises(FileNotFoundError): + imghdr.what('missing') + + def test_closed_file(self): + stream = open(self.testfile, 'rb') + stream.close() + with self.assertRaises(ValueError) as cm: + imghdr.what(stream) + stream = io.BytesIO(self.testdata) + stream.close() + with self.assertRaises(ValueError) as cm: + imghdr.what(stream) + + def test_unseekable(self): + with open(TESTFN, 'wb') as stream: + stream.write(self.testdata) + with UnseekableIO(TESTFN, 'rb') as stream: + with self.assertRaises(io.UnsupportedOperation): + imghdr.what(stream) + + def test_output_stream(self): + with open(TESTFN, 'wb') as stream: + stream.write(self.testdata) + stream.seek(0) + with self.assertRaises(OSError) as cm: + imghdr.what(stream) + +if __name__ == '__main__': + unittest.main() diff --git a/Lib/test/test_sundry.py b/Lib/test/test_sundry.py index c6cca26..8808c47 100644 --- a/Lib/test/test_sundry.py +++ b/Lib/test/test_sundry.py @@ -42,7 +42,6 @@ class TestUntestedModules(unittest.TestCase): import encodings import formatter import html.entities - import imghdr import keyword import mailcap import nturl2path diff --git a/Misc/NEWS b/Misc/NEWS index 89610c9..10cb08e 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -292,6 +292,9 @@ IDLE Tests ----- +- Issue #19990: Added tests for the imghdr module. Based on patch by + Claudiu Popa. + - Issue #19804: The test_find_mac test in test_uuid is now skipped if the ifconfig executable is not available. -- cgit v0.12