17db96d56Sopenharmony_ciimport io
27db96d56Sopenharmony_ciimport os
37db96d56Sopenharmony_ciimport pathlib
47db96d56Sopenharmony_ciimport unittest
57db96d56Sopenharmony_ciimport warnings
67db96d56Sopenharmony_cifrom test.support import findfile, warnings_helper
77db96d56Sopenharmony_cifrom test.support.os_helper import TESTFN, unlink
87db96d56Sopenharmony_ci
97db96d56Sopenharmony_ciimghdr = warnings_helper.import_deprecated("imghdr")
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ci
127db96d56Sopenharmony_ciTEST_FILES = (
137db96d56Sopenharmony_ci    ('python.png', 'png'),
147db96d56Sopenharmony_ci    ('python.gif', 'gif'),
157db96d56Sopenharmony_ci    ('python.bmp', 'bmp'),
167db96d56Sopenharmony_ci    ('python.ppm', 'ppm'),
177db96d56Sopenharmony_ci    ('python.pgm', 'pgm'),
187db96d56Sopenharmony_ci    ('python.pbm', 'pbm'),
197db96d56Sopenharmony_ci    ('python.jpg', 'jpeg'),
207db96d56Sopenharmony_ci    ('python-raw.jpg', 'jpeg'),  # raw JPEG without JFIF/EXIF markers
217db96d56Sopenharmony_ci    ('python.ras', 'rast'),
227db96d56Sopenharmony_ci    ('python.sgi', 'rgb'),
237db96d56Sopenharmony_ci    ('python.tiff', 'tiff'),
247db96d56Sopenharmony_ci    ('python.xbm', 'xbm'),
257db96d56Sopenharmony_ci    ('python.webp', 'webp'),
267db96d56Sopenharmony_ci    ('python.exr', 'exr'),
277db96d56Sopenharmony_ci)
287db96d56Sopenharmony_ci
297db96d56Sopenharmony_ciclass UnseekableIO(io.FileIO):
307db96d56Sopenharmony_ci    def tell(self):
317db96d56Sopenharmony_ci        raise io.UnsupportedOperation
327db96d56Sopenharmony_ci
337db96d56Sopenharmony_ci    def seek(self, *args, **kwargs):
347db96d56Sopenharmony_ci        raise io.UnsupportedOperation
357db96d56Sopenharmony_ci
367db96d56Sopenharmony_ciclass TestImghdr(unittest.TestCase):
377db96d56Sopenharmony_ci    @classmethod
387db96d56Sopenharmony_ci    def setUpClass(cls):
397db96d56Sopenharmony_ci        cls.testfile = findfile('python.png', subdir='imghdrdata')
407db96d56Sopenharmony_ci        with open(cls.testfile, 'rb') as stream:
417db96d56Sopenharmony_ci            cls.testdata = stream.read()
427db96d56Sopenharmony_ci
437db96d56Sopenharmony_ci    def tearDown(self):
447db96d56Sopenharmony_ci        unlink(TESTFN)
457db96d56Sopenharmony_ci
467db96d56Sopenharmony_ci    def test_data(self):
477db96d56Sopenharmony_ci        for filename, expected in TEST_FILES:
487db96d56Sopenharmony_ci            filename = findfile(filename, subdir='imghdrdata')
497db96d56Sopenharmony_ci            self.assertEqual(imghdr.what(filename), expected)
507db96d56Sopenharmony_ci            with open(filename, 'rb') as stream:
517db96d56Sopenharmony_ci                self.assertEqual(imghdr.what(stream), expected)
527db96d56Sopenharmony_ci            with open(filename, 'rb') as stream:
537db96d56Sopenharmony_ci                data = stream.read()
547db96d56Sopenharmony_ci            self.assertEqual(imghdr.what(None, data), expected)
557db96d56Sopenharmony_ci            self.assertEqual(imghdr.what(None, bytearray(data)), expected)
567db96d56Sopenharmony_ci
577db96d56Sopenharmony_ci    def test_pathlike_filename(self):
587db96d56Sopenharmony_ci        for filename, expected in TEST_FILES:
597db96d56Sopenharmony_ci            with self.subTest(filename=filename):
607db96d56Sopenharmony_ci                filename = findfile(filename, subdir='imghdrdata')
617db96d56Sopenharmony_ci                self.assertEqual(imghdr.what(pathlib.Path(filename)), expected)
627db96d56Sopenharmony_ci
637db96d56Sopenharmony_ci    def test_register_test(self):
647db96d56Sopenharmony_ci        def test_jumbo(h, file):
657db96d56Sopenharmony_ci            if h.startswith(b'eggs'):
667db96d56Sopenharmony_ci                return 'ham'
677db96d56Sopenharmony_ci        imghdr.tests.append(test_jumbo)
687db96d56Sopenharmony_ci        self.addCleanup(imghdr.tests.pop)
697db96d56Sopenharmony_ci        self.assertEqual(imghdr.what(None, b'eggs'), 'ham')
707db96d56Sopenharmony_ci
717db96d56Sopenharmony_ci    def test_file_pos(self):
727db96d56Sopenharmony_ci        with open(TESTFN, 'wb') as stream:
737db96d56Sopenharmony_ci            stream.write(b'ababagalamaga')
747db96d56Sopenharmony_ci            pos = stream.tell()
757db96d56Sopenharmony_ci            stream.write(self.testdata)
767db96d56Sopenharmony_ci        with open(TESTFN, 'rb') as stream:
777db96d56Sopenharmony_ci            stream.seek(pos)
787db96d56Sopenharmony_ci            self.assertEqual(imghdr.what(stream), 'png')
797db96d56Sopenharmony_ci            self.assertEqual(stream.tell(), pos)
807db96d56Sopenharmony_ci
817db96d56Sopenharmony_ci    def test_bad_args(self):
827db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
837db96d56Sopenharmony_ci            imghdr.what()
847db96d56Sopenharmony_ci        with self.assertRaises(AttributeError):
857db96d56Sopenharmony_ci            imghdr.what(None)
867db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
877db96d56Sopenharmony_ci            imghdr.what(self.testfile, 1)
887db96d56Sopenharmony_ci        with self.assertRaises(AttributeError):
897db96d56Sopenharmony_ci            imghdr.what(os.fsencode(self.testfile))
907db96d56Sopenharmony_ci        with open(self.testfile, 'rb') as f:
917db96d56Sopenharmony_ci            with self.assertRaises(AttributeError):
927db96d56Sopenharmony_ci                imghdr.what(f.fileno())
937db96d56Sopenharmony_ci
947db96d56Sopenharmony_ci    def test_invalid_headers(self):
957db96d56Sopenharmony_ci        for header in (b'\211PN\r\n',
967db96d56Sopenharmony_ci                       b'\001\331',
977db96d56Sopenharmony_ci                       b'\x59\xA6',
987db96d56Sopenharmony_ci                       b'cutecat',
997db96d56Sopenharmony_ci                       b'000000JFI',
1007db96d56Sopenharmony_ci                       b'GIF80'):
1017db96d56Sopenharmony_ci            self.assertIsNone(imghdr.what(None, header))
1027db96d56Sopenharmony_ci
1037db96d56Sopenharmony_ci    def test_string_data(self):
1047db96d56Sopenharmony_ci        with warnings.catch_warnings():
1057db96d56Sopenharmony_ci            warnings.simplefilter("ignore", BytesWarning)
1067db96d56Sopenharmony_ci            for filename, _ in TEST_FILES:
1077db96d56Sopenharmony_ci                filename = findfile(filename, subdir='imghdrdata')
1087db96d56Sopenharmony_ci                with open(filename, 'rb') as stream:
1097db96d56Sopenharmony_ci                    data = stream.read().decode('latin1')
1107db96d56Sopenharmony_ci                with self.assertRaises(TypeError):
1117db96d56Sopenharmony_ci                    imghdr.what(io.StringIO(data))
1127db96d56Sopenharmony_ci                with self.assertRaises(TypeError):
1137db96d56Sopenharmony_ci                    imghdr.what(None, data)
1147db96d56Sopenharmony_ci
1157db96d56Sopenharmony_ci    def test_missing_file(self):
1167db96d56Sopenharmony_ci        with self.assertRaises(FileNotFoundError):
1177db96d56Sopenharmony_ci            imghdr.what('missing')
1187db96d56Sopenharmony_ci
1197db96d56Sopenharmony_ci    def test_closed_file(self):
1207db96d56Sopenharmony_ci        stream = open(self.testfile, 'rb')
1217db96d56Sopenharmony_ci        stream.close()
1227db96d56Sopenharmony_ci        with self.assertRaises(ValueError) as cm:
1237db96d56Sopenharmony_ci            imghdr.what(stream)
1247db96d56Sopenharmony_ci        stream = io.BytesIO(self.testdata)
1257db96d56Sopenharmony_ci        stream.close()
1267db96d56Sopenharmony_ci        with self.assertRaises(ValueError) as cm:
1277db96d56Sopenharmony_ci            imghdr.what(stream)
1287db96d56Sopenharmony_ci
1297db96d56Sopenharmony_ci    def test_unseekable(self):
1307db96d56Sopenharmony_ci        with open(TESTFN, 'wb') as stream:
1317db96d56Sopenharmony_ci            stream.write(self.testdata)
1327db96d56Sopenharmony_ci        with UnseekableIO(TESTFN, 'rb') as stream:
1337db96d56Sopenharmony_ci            with self.assertRaises(io.UnsupportedOperation):
1347db96d56Sopenharmony_ci                imghdr.what(stream)
1357db96d56Sopenharmony_ci
1367db96d56Sopenharmony_ci    def test_output_stream(self):
1377db96d56Sopenharmony_ci        with open(TESTFN, 'wb') as stream:
1387db96d56Sopenharmony_ci            stream.write(self.testdata)
1397db96d56Sopenharmony_ci            stream.seek(0)
1407db96d56Sopenharmony_ci            with self.assertRaises(OSError) as cm:
1417db96d56Sopenharmony_ci                imghdr.what(stream)
1427db96d56Sopenharmony_ci
1437db96d56Sopenharmony_ciif __name__ == '__main__':
1447db96d56Sopenharmony_ci    unittest.main()
145