diff options
author | Michał Górny <mgorny@gentoo.org> | 2017-10-23 17:37:46 +0200 |
---|---|---|
committer | Michał Górny <mgorny@gentoo.org> | 2017-10-23 17:37:46 +0200 |
commit | 1457be73d3d3070f922d49987ce7387f35627c8e (patch) | |
tree | a222e52757bec5dad4514d9155408836c7183bab /tests | |
parent | 2c8f6f9d1348ad274eee491487832d34f4965731 (diff) | |
download | gemato-1457be73d3d3070f922d49987ce7387f35627c8e.tar.gz |
Add basic file verification routine
Diffstat (limited to 'tests')
-rw-r--r-- | tests/test_verify.py | 371 |
1 files changed, 371 insertions, 0 deletions
diff --git a/tests/test_verify.py b/tests/test_verify.py new file mode 100644 index 0000000..432e0ac --- /dev/null +++ b/tests/test_verify.py @@ -0,0 +1,371 @@ +# gemato: Verification tests +# vim:fileencoding=utf-8 +# (c) 2017 Michał Górny +# Licensed under the terms of 2-clause BSD license + +import multiprocessing +import os +import os.path +import socket +import tempfile +import unittest + +import gemato.manifest +import gemato.verify + + +class NonExistingFileVerificationTest(unittest.TestCase): + def setUp(self): + self.dir = tempfile.mkdtemp() + + def tearDown(self): + os.rmdir(self.dir) + + def testDATA(self): + e = gemato.manifest.ManifestEntryDATA.from_list( + ('DATA', 'test', '0')) + self.assertEqual(gemato.verify.verify_path(os.path.join(self.dir, e.path), e), + (False, [('__exists__', True, False)])) + + def testIGNORE(self): + e = gemato.manifest.ManifestEntryIGNORE.from_list( + ('IGNORE', 'test')) + self.assertEqual(gemato.verify.verify_path(os.path.join(self.dir, e.path), e), + (True, [])) + + def testOPTIONAL(self): + e = gemato.manifest.ManifestEntryOPTIONAL.from_list( + ('OPTIONAL', 'test')) + self.assertEqual(gemato.verify.verify_path(os.path.join(self.dir, e.path), e), + (True, [])) + + +class DirectoryVerificationTest(unittest.TestCase): + def setUp(self): + self.dir = tempfile.mkdtemp() + + def tearDown(self): + os.rmdir(self.dir) + + def testDATA(self): + e = gemato.manifest.ManifestEntryDATA.from_list( + ('DATA', os.path.basename(self.dir), '0')) + self.assertEqual(gemato.verify.verify_path(self.dir, e), + (False, [('__type__', 'regular file', 'directory')])) + + def testIGNORE(self): + e = gemato.manifest.ManifestEntryIGNORE.from_list( + ('IGNORE', os.path.basename(self.dir))) + self.assertEqual(gemato.verify.verify_path(self.dir, e), + (True, [])) + + def testOPTIONAL(self): + e = gemato.manifest.ManifestEntryOPTIONAL.from_list( + ('OPTIONAL', os.path.basename(self.dir))) + self.assertEqual(gemato.verify.verify_path(self.dir, e), + (False, [('__exists__', False, True)])) + + +class CharacterDeviceVerificationTest(unittest.TestCase): + def setUp(self): + self.path = '/dev/null' + + def testDATA(self): + e = gemato.manifest.ManifestEntryDATA.from_list( + ('DATA', os.path.basename(self.path), '0')) + self.assertEqual(gemato.verify.verify_path(self.path, e), + (False, [('__type__', 'regular file', 'character device')])) + + def testIGNORE(self): + e = gemato.manifest.ManifestEntryIGNORE.from_list( + ('IGNORE', os.path.basename(self.path))) + self.assertEqual(gemato.verify.verify_path(self.path, e), + (True, [])) + + def testOPTIONAL(self): + e = gemato.manifest.ManifestEntryOPTIONAL.from_list( + ('OPTIONAL', os.path.basename(self.path))) + self.assertEqual(gemato.verify.verify_path(self.path, e), + (False, [('__exists__', False, True)])) + + +class NamedPipeVerificationTest(unittest.TestCase): + def setUp(self): + self.dir = tempfile.mkdtemp() + self.path = os.path.join(self.dir, 'test') + os.mkfifo(self.path) + + def tearDown(self): + os.unlink(self.path) + os.rmdir(self.dir) + + def testDATA(self): + e = gemato.manifest.ManifestEntryDATA.from_list( + ('DATA', os.path.basename(self.path), '0')) + self.assertEqual(gemato.verify.verify_path(self.path, e), + (False, [('__type__', 'regular file', 'named pipe')])) + + def testIGNORE(self): + e = gemato.manifest.ManifestEntryIGNORE.from_list( + ('IGNORE', os.path.basename(self.path))) + self.assertEqual(gemato.verify.verify_path(self.path, e), + (True, [])) + + def testOPTIONAL(self): + e = gemato.manifest.ManifestEntryOPTIONAL.from_list( + ('OPTIONAL', os.path.basename(self.path))) + self.assertEqual(gemato.verify.verify_path(self.path, e), + (False, [('__exists__', False, True)])) + + +class UNIXSocketVerificationTest(unittest.TestCase): + def setUp(self): + self.dir = tempfile.mkdtemp() + self.path = os.path.join(self.dir, 'test') + self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + self.sock.bind(self.path) + self.sock.listen(1) + + def tearDown(self): + self.sock.close() + os.unlink(self.path) + os.rmdir(self.dir) + + def testDATA(self): + e = gemato.manifest.ManifestEntryDATA.from_list( + ('DATA', os.path.basename(self.path), '0')) + self.assertEqual(gemato.verify.verify_path(self.path, e), + (False, [('__type__', 'regular file', 'UNIX socket')])) + + def testIGNORE(self): + e = gemato.manifest.ManifestEntryIGNORE.from_list( + ('IGNORE', os.path.basename(self.path))) + self.assertEqual(gemato.verify.verify_path(self.path, e), + (True, [])) + + def testOPTIONAL(self): + e = gemato.manifest.ManifestEntryOPTIONAL.from_list( + ('OPTIONAL', os.path.basename(self.path))) + self.assertEqual(gemato.verify.verify_path(self.path, e), + (False, [('__exists__', False, True)])) + + +class EmptyFileVerificationTest(unittest.TestCase): + def setUp(self): + self.f = tempfile.NamedTemporaryFile() + self.path = self.f.name + + def tearDown(self): + self.f.close() + + def testDATA(self): + e = gemato.manifest.ManifestEntryDATA.from_list( + ('DATA', os.path.basename(self.path), '0')) + self.assertEqual(gemato.verify.verify_path(self.path, e), + (True, [])) + + def testChecksumDATA(self): + e = gemato.manifest.ManifestEntryDATA.from_list( + ('DATA', os.path.basename(self.path), '0', + 'MD5', 'd41d8cd98f00b204e9800998ecf8427e', + 'SHA1', 'da39a3ee5e6b4b0d3255bfef95601890afd80709')) + self.assertEqual(gemato.verify.verify_path(self.path, e), + (True, [])) + + def testWrongSizeDATA(self): + e = gemato.manifest.ManifestEntryDATA.from_list( + ('DATA', os.path.basename(self.path), '5')) + self.assertEqual(gemato.verify.verify_path(self.path, e), + (False, [('__size__', 5, 0)])) + + def testWrongSingleChecksumDATA(self): + e = gemato.manifest.ManifestEntryDATA.from_list( + ('DATA', os.path.basename(self.path), '0', + 'MD5', '9e107d9d372bb6826bd81d3542a419d6', + 'SHA1', 'da39a3ee5e6b4b0d3255bfef95601890afd80709')) + self.assertEqual(gemato.verify.verify_path(self.path, e), + (False, [('MD5', '9e107d9d372bb6826bd81d3542a419d6', 'd41d8cd98f00b204e9800998ecf8427e')])) + + def testWrongAllChecksumDATA(self): + e = gemato.manifest.ManifestEntryDATA.from_list( + ('DATA', os.path.basename(self.path), '0', + 'MD5', '9e107d9d372bb6826bd81d3542a419d6', + 'SHA1', '2fd4e1c67a2d28fced849ee1bb76e7391b93eb12')) + self.assertEqual(gemato.verify.verify_path(self.path, e), + (False, [('MD5', '9e107d9d372bb6826bd81d3542a419d6', 'd41d8cd98f00b204e9800998ecf8427e'), + ('SHA1', '2fd4e1c67a2d28fced849ee1bb76e7391b93eb12', 'da39a3ee5e6b4b0d3255bfef95601890afd80709')])) + + def testWrongAllChecksumAndSizeDATA(self): + e = gemato.manifest.ManifestEntryDATA.from_list( + ('DATA', os.path.basename(self.path), '39', + 'MD5', '9e107d9d372bb6826bd81d3542a419d6', + 'SHA1', '2fd4e1c67a2d28fced849ee1bb76e7391b93eb12')) + self.assertEqual(gemato.verify.verify_path(self.path, e), + (False, [('__size__', 39, 0), + ('MD5', '9e107d9d372bb6826bd81d3542a419d6', 'd41d8cd98f00b204e9800998ecf8427e'), + ('SHA1', '2fd4e1c67a2d28fced849ee1bb76e7391b93eb12', 'da39a3ee5e6b4b0d3255bfef95601890afd80709')])) + + def testIGNORE(self): + e = gemato.manifest.ManifestEntryIGNORE.from_list( + ('IGNORE', os.path.basename(self.path))) + self.assertEqual(gemato.verify.verify_path(self.path, e), + (True, [])) + + def testOPTIONAL(self): + e = gemato.manifest.ManifestEntryOPTIONAL.from_list( + ('OPTIONAL', os.path.basename(self.path))) + self.assertEqual(gemato.verify.verify_path(self.path, e), + (False, [('__exists__', False, True)])) + + +class NonEmptyFileVerificationTest(unittest.TestCase): + def setUp(self): + TEST_STRING = b'The quick brown fox jumps over the lazy dog' + self.f = tempfile.NamedTemporaryFile() + self.f.write(TEST_STRING) + self.f.flush() + self.path = self.f.name + + def tearDown(self): + self.f.close() + + def testDATA(self): + e = gemato.manifest.ManifestEntryDATA.from_list( + ('DATA', os.path.basename(self.path), '43')) + self.assertEqual(gemato.verify.verify_path(self.path, e), + (True, [])) + + def testChecksumDATA(self): + e = gemato.manifest.ManifestEntryDATA.from_list( + ('DATA', os.path.basename(self.path), '43', + 'MD5', '9e107d9d372bb6826bd81d3542a419d6', + 'SHA1', '2fd4e1c67a2d28fced849ee1bb76e7391b93eb12')) + self.assertEqual(gemato.verify.verify_path(self.path, e), + (True, [])) + + def testWrongSizeDATA(self): + e = gemato.manifest.ManifestEntryDATA.from_list( + ('DATA', os.path.basename(self.path), '0')) + self.assertEqual(gemato.verify.verify_path(self.path, e), + (False, [('__size__', 0, 43)])) + + def testWrongSingleChecksumDATA(self): + e = gemato.manifest.ManifestEntryDATA.from_list( + ('DATA', os.path.basename(self.path), '43', + 'MD5', '9e107d9d372bb6826bd81d3542a419d6', + 'SHA1', 'da39a3ee5e6b4b0d3255bfef95601890afd80709')) + self.assertEqual(gemato.verify.verify_path(self.path, e), + (False, [('SHA1', 'da39a3ee5e6b4b0d3255bfef95601890afd80709', '2fd4e1c67a2d28fced849ee1bb76e7391b93eb12')])) + + def testWrongAllChecksumDATA(self): + e = gemato.manifest.ManifestEntryDATA.from_list( + ('DATA', os.path.basename(self.path), '43', + 'MD5', 'd41d8cd98f00b204e9800998ecf8427e', + 'SHA1', 'da39a3ee5e6b4b0d3255bfef95601890afd80709')) + self.assertEqual(gemato.verify.verify_path(self.path, e), + (False, [('MD5', 'd41d8cd98f00b204e9800998ecf8427e', '9e107d9d372bb6826bd81d3542a419d6'), + ('SHA1', 'da39a3ee5e6b4b0d3255bfef95601890afd80709', '2fd4e1c67a2d28fced849ee1bb76e7391b93eb12')])) + + def testWrongAllChecksumAndSizeDATA(self): + e = gemato.manifest.ManifestEntryDATA.from_list( + ('DATA', os.path.basename(self.path), '0', + 'MD5', 'd41d8cd98f00b204e9800998ecf8427e', + 'SHA1', 'da39a3ee5e6b4b0d3255bfef95601890afd80709')) + self.assertEqual(gemato.verify.verify_path(self.path, e), + (False, [('__size__', 0, 43)])) + + def testIGNORE(self): + e = gemato.manifest.ManifestEntryIGNORE.from_list( + ('IGNORE', os.path.basename(self.path))) + self.assertEqual(gemato.verify.verify_path(self.path, e), + (True, [])) + + def testOPTIONAL(self): + e = gemato.manifest.ManifestEntryOPTIONAL.from_list( + ('OPTIONAL', os.path.basename(self.path))) + self.assertEqual(gemato.verify.verify_path(self.path, e), + (False, [('__exists__', False, True)])) + + +class ProcFileVerificationTest(unittest.TestCase): + """ + Attempt to verify a file from /proc to verify that we can handle + filesystems that do not report st_size. + """ + + def setUp(self): + self.path = '/proc/version' + try: + with open(self.path, 'rb') as f: + data = f.read() + st = os.fstat(f.fileno()) + except: + raise unittest.SkipTest('{} not readable'.format(self.path)) + + if st.st_size != 0: + raise unittest.SkipTest('{} st_size is not 0'.format(self.path)) + + self.size = len(data) + if self.size == 0: + raise unittest.SkipTest('{} empty'.format(self.path)) + self.md5 = gemato.hash.hash_bytes(data, 'md5') + self.sha1 = gemato.hash.hash_bytes(data, 'sha1') + + def testDATA(self): + e = gemato.manifest.ManifestEntryDATA.from_list( + ('DATA', os.path.basename(self.path), str(self.size))) + self.assertEqual(gemato.verify.verify_path(self.path, e), + (True, [])) + + def testChecksumDATA(self): + e = gemato.manifest.ManifestEntryDATA.from_list( + ('DATA', os.path.basename(self.path), str(self.size), + 'MD5', self.md5, + 'SHA1', self.sha1)) + self.assertEqual(gemato.verify.verify_path(self.path, e), + (True, [])) + + def testWrongSizeDATA(self): + e = gemato.manifest.ManifestEntryDATA.from_list( + ('DATA', os.path.basename(self.path), '47474')) + self.assertEqual(gemato.verify.verify_path(self.path, e), + (False, [('__size__', 47474, self.size)])) + + def testWrongSingleChecksumDATA(self): + e = gemato.manifest.ManifestEntryDATA.from_list( + ('DATA', os.path.basename(self.path), self.size, + 'MD5', self.md5, + 'SHA1', 'da39a3ee5e6b4b0d3255bfef95601890afd80709')) + self.assertEqual(gemato.verify.verify_path(self.path, e), + (False, [('SHA1', 'da39a3ee5e6b4b0d3255bfef95601890afd80709', self.sha1)])) + + def testWrongAllChecksumDATA(self): + e = gemato.manifest.ManifestEntryDATA.from_list( + ('DATA', os.path.basename(self.path), self.size, + 'MD5', 'd41d8cd98f00b204e9800998ecf8427e', + 'SHA1', 'da39a3ee5e6b4b0d3255bfef95601890afd80709')) + self.assertEqual(gemato.verify.verify_path(self.path, e), + (False, [('MD5', 'd41d8cd98f00b204e9800998ecf8427e', self.md5), + ('SHA1', 'da39a3ee5e6b4b0d3255bfef95601890afd80709', self.sha1)])) + + def testWrongAllChecksumAndSizeDATA(self): + e = gemato.manifest.ManifestEntryDATA.from_list( + ('DATA', os.path.basename(self.path), '47474', + 'MD5', 'd41d8cd98f00b204e9800998ecf8427e', + 'SHA1', 'da39a3ee5e6b4b0d3255bfef95601890afd80709')) + self.assertEqual(gemato.verify.verify_path(self.path, e), + (False, [('__size__', 47474, self.size), + ('MD5', 'd41d8cd98f00b204e9800998ecf8427e', self.md5), + ('SHA1', 'da39a3ee5e6b4b0d3255bfef95601890afd80709', self.sha1)])) + + def testIGNORE(self): + e = gemato.manifest.ManifestEntryIGNORE.from_list( + ('IGNORE', os.path.basename(self.path))) + self.assertEqual(gemato.verify.verify_path(self.path, e), + (True, [])) + + def testOPTIONAL(self): + e = gemato.manifest.ManifestEntryOPTIONAL.from_list( + ('OPTIONAL', os.path.basename(self.path))) + self.assertEqual(gemato.verify.verify_path(self.path, e), + (False, [('__exists__', False, True)])) |