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