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