test_imghdr.py revision 1ac00950b28e91fc35fed6445722ade92732648e
11ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchakaimport imghdr
21ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchakaimport io
31ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchakaimport os
41ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchakaimport unittest
51ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchakaimport warnings
61ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchakafrom test.support import findfile, TESTFN, unlink
71ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka
81ac00950b28e91fc35fed6445722ade92732648eSerhiy StorchakaTEST_FILES = (
91ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka    ('python.png', 'png'),
101ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka    ('python.gif', 'gif'),
111ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka    ('python.bmp', 'bmp'),
121ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka    ('python.ppm', 'ppm'),
131ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka    ('python.pgm', 'pgm'),
141ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka    ('python.pbm', 'pbm'),
151ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka    ('python.jpg', 'jpeg'),
161ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka    ('python.ras', 'rast'),
171ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka    ('python.sgi', 'rgb'),
181ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka    ('python.tiff', 'tiff'),
191ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka    ('python.xbm', 'xbm')
201ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka)
211ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka
221ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchakaclass UnseekableIO(io.FileIO):
231ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka    def tell(self):
241ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka        raise io.UnsupportedOperation
251ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka
261ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka    def seek(self, *args, **kwargs):
271ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka        raise io.UnsupportedOperation
281ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka
291ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchakaclass TestImghdr(unittest.TestCase):
301ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka    @classmethod
311ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka    def setUpClass(cls):
321ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka        cls.testfile = findfile('python.png', subdir='imghdrdata')
331ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka        with open(cls.testfile, 'rb') as stream:
341ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka            cls.testdata = stream.read()
351ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka
361ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka    def tearDown(self):
371ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka        unlink(TESTFN)
381ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka
391ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka    def test_data(self):
401ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka        for filename, expected in TEST_FILES:
411ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka            filename = findfile(filename, subdir='imghdrdata')
421ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka            self.assertEqual(imghdr.what(filename), expected)
431ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka            with open(filename, 'rb') as stream:
441ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka                self.assertEqual(imghdr.what(stream), expected)
451ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka            with open(filename, 'rb') as stream:
461ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka                data = stream.read()
471ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka            self.assertEqual(imghdr.what(None, data), expected)
481ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka            self.assertEqual(imghdr.what(None, bytearray(data)), expected)
491ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka
501ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka    def test_register_test(self):
511ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka        def test_jumbo(h, file):
521ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka            if h.startswith(b'eggs'):
531ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka                return 'ham'
541ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka        imghdr.tests.append(test_jumbo)
551ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka        self.addCleanup(imghdr.tests.pop)
561ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka        self.assertEqual(imghdr.what(None, b'eggs'), 'ham')
571ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka
581ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka    def test_file_pos(self):
591ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka        with open(TESTFN, 'wb') as stream:
601ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka            stream.write(b'ababagalamaga')
611ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka            pos = stream.tell()
621ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka            stream.write(self.testdata)
631ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka        with open(TESTFN, 'rb') as stream:
641ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka            stream.seek(pos)
651ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka            self.assertEqual(imghdr.what(stream), 'png')
661ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka            self.assertEqual(stream.tell(), pos)
671ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka
681ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka    def test_bad_args(self):
691ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka        with self.assertRaises(TypeError):
701ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka            imghdr.what()
711ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka        with self.assertRaises(AttributeError):
721ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka            imghdr.what(None)
731ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka        with self.assertRaises(TypeError):
741ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka            imghdr.what(self.testfile, 1)
751ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka        with self.assertRaises(AttributeError):
761ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka            imghdr.what(os.fsencode(self.testfile))
771ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka        with open(self.testfile, 'rb') as f:
781ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka            with self.assertRaises(AttributeError):
791ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka                imghdr.what(f.fileno())
801ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka
811ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka    def test_invalid_headers(self):
821ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka        for header in (b'\211PN\r\n',
831ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka                       b'\001\331',
841ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka                       b'\x59\xA6',
851ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka                       b'cutecat',
861ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka                       b'000000JFI',
871ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka                       b'GIF80'):
881ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka            self.assertIsNone(imghdr.what(None, header))
891ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka
901ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka    def test_string_data(self):
911ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka        with warnings.catch_warnings():
921ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka            warnings.simplefilter("ignore", BytesWarning)
931ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka            for filename, _ in TEST_FILES:
941ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka                filename = findfile(filename, subdir='imghdrdata')
951ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka                with open(filename, 'rb') as stream:
961ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka                    data = stream.read().decode('latin1')
971ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka                with self.assertRaises(TypeError):
981ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka                    imghdr.what(io.StringIO(data))
991ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka                with self.assertRaises(TypeError):
1001ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka                    imghdr.what(None, data)
1011ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka
1021ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka    def test_missing_file(self):
1031ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka        with self.assertRaises(FileNotFoundError):
1041ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka            imghdr.what('missing')
1051ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka
1061ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka    def test_closed_file(self):
1071ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka        stream = open(self.testfile, 'rb')
1081ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka        stream.close()
1091ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka        with self.assertRaises(ValueError) as cm:
1101ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka            imghdr.what(stream)
1111ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka        stream = io.BytesIO(self.testdata)
1121ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka        stream.close()
1131ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka        with self.assertRaises(ValueError) as cm:
1141ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka            imghdr.what(stream)
1151ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka
1161ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka    def test_unseekable(self):
1171ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka        with open(TESTFN, 'wb') as stream:
1181ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka            stream.write(self.testdata)
1191ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka        with UnseekableIO(TESTFN, 'rb') as stream:
1201ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka            with self.assertRaises(io.UnsupportedOperation):
1211ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka                imghdr.what(stream)
1221ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka
1231ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka    def test_output_stream(self):
1241ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka        with open(TESTFN, 'wb') as stream:
1251ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka            stream.write(self.testdata)
1261ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka            stream.seek(0)
1271ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka            with self.assertRaises(OSError) as cm:
1281ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka                imghdr.what(stream)
1291ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka
1301ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchakaif __name__ == '__main__':
1311ac00950b28e91fc35fed6445722ade92732648eSerhiy Storchaka    unittest.main()
132