mirror of
				https://github.com/python/cpython.git
				synced 2025-10-26 11:14:33 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			140 lines
		
	
	
	
		
			4.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			140 lines
		
	
	
	
		
			4.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import imghdr
 | |
| import io
 | |
| import os
 | |
| import pathlib
 | |
| 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'),
 | |
|     ('python.webp', 'webp'),
 | |
|     ('python.exr', 'exr'),
 | |
| )
 | |
| 
 | |
| 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_pathlike_filename(self):
 | |
|         for filename, expected in TEST_FILES:
 | |
|             with self.subTest(filename=filename):
 | |
|                 filename = findfile(filename, subdir='imghdrdata')
 | |
|                 self.assertEqual(imghdr.what(pathlib.Path(filename)), 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()
 | 
