import imghdr import io import sys import unittest from test.test_support import findfile, TESTFN, unlink, run_unittest 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) ufilename = filename.decode(sys.getfilesystemencoding()) self.assertEqual(imghdr.what(ufilename), 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) 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 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_missing_file(self): with self.assertRaises(IOError): 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(IOError) as cm: imghdr.what(stream) def test_main(): run_unittest(TestImghdr) if __name__ == '__main__': test_main()