mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	
		
			
	
	
		
			132 lines
		
	
	
	
		
			4.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			132 lines
		
	
	
	
		
			4.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | import imghdr | ||
|  | import io | ||
|  | import os | ||
|  | import unittest | ||
|  | import warnings | ||
|  | from test.support import findfile, TESTFN, unlink | ||
|  | 
 | ||
|  | 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) | ||
|  |             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) | ||
|  |             self.assertEqual(imghdr.what(None, bytearray(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 self.assertRaises(AttributeError): | ||
|  |             imghdr.what(os.fsencode(self.testfile)) | ||
|  |         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_string_data(self): | ||
|  |         with warnings.catch_warnings(): | ||
|  |             warnings.simplefilter("ignore", BytesWarning) | ||
|  |             for filename, _ in TEST_FILES: | ||
|  |                 filename = findfile(filename, subdir='imghdrdata') | ||
|  |                 with open(filename, 'rb') as stream: | ||
|  |                     data = stream.read().decode('latin1') | ||
|  |                 with self.assertRaises(TypeError): | ||
|  |                     imghdr.what(io.StringIO(data)) | ||
|  |                 with self.assertRaises(TypeError): | ||
|  |                     imghdr.what(None, data) | ||
|  | 
 | ||
|  |     def test_missing_file(self): | ||
|  |         with self.assertRaises(FileNotFoundError): | ||
|  |             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(OSError) as cm: | ||
|  |                 imghdr.what(stream) | ||
|  | 
 | ||
|  | if __name__ == '__main__': | ||
|  |     unittest.main() |