summaryrefslogtreecommitdiffstats
path: root/src/yum/test/test_yum_file_check.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/yum/test/test_yum_file_check.py')
-rwxr-xr-xsrc/yum/test/test_yum_file_check.py289
1 files changed, 289 insertions, 0 deletions
diff --git a/src/yum/test/test_yum_file_check.py b/src/yum/test/test_yum_file_check.py
new file mode 100755
index 0000000..82c8650
--- /dev/null
+++ b/src/yum/test/test_yum_file_check.py
@@ -0,0 +1,289 @@
+#!/usr/bin/env python
+
+from common import *
+import hashlib
+import shutil
+import socket
+import stat
+
+re_checksum = re.compile(r'^([0-9a-fA-F]+)\s+.*')
+
+PassedFlags = namedtuple("PassedFlags",
+ "exists, type, size, mode, checksum, dev, ltarget, uid, gid, mtime")
+
+class TestYumInstalledPackage(YumBaseTestCase):
+
+ CLASS_NAME = "LMI_YumFileCheck"
+ KEYS = ( "CheckID", "Name", "SoftwareElementID", "SoftwareElementState"
+ , "TargetOperatingSystem", "Version")
+
+ hash_num2algo = {
+ 1 : hashlib.md5,
+ 2 : hashlib.sha1,
+ 8 : hashlib.sha256,
+ 9 : hashlib.sha384,
+ 10 : hashlib.sha512,
+ 11 : hashlib.sha224
+ }
+
+ hash_num2cmd = {
+ 1 : "md5sum",
+ 2 : "sha1sum",
+ 8 : "sha256sum",
+ 9 : "sha384sum",
+ 10 : "sha512sum",
+ 11 : "sha224sum"
+ }
+
+ hash_num2length = {
+ 1 : 32,
+ 2 : 40,
+ 8 : 64,
+ 9 : 96,
+ 10 : 128,
+ 11 : 56
+ }
+
+ def make_op(self, nevra, filename):
+ op = self.op.copy()
+ m = re_nevra.match(nevra)
+ name, version = [ m.group(k) for k in ("name", "ver") ]
+ op["Name"] = filename
+ op["Version"] = version
+ op["CheckID"] = "%s#%s" % (name, filename)
+ op["SoftwareElementState"] = pywbem.Uint16(2)
+ op["TargetOperatingSystem"] = pywbem.Uint16(36)
+ op["SoftwareElementID"] = nevra
+ return op
+
+ def make_checksum_str(self, csumnum, filename):
+ return re_checksum.match(subprocess.check_output([
+ self.hash_num2cmd[csumnum], filename])).group(1).lower()
+
+ def do_test_symlink(self, op, nevra, f, inst):
+ target = os.readlink(f)
+ stats = os.lstat(f)
+
+ self.assertEqual(inst["FileType"], pywbem.Uint16(3))
+ self.assertEqual(inst["FileUserID"], stats.st_uid)
+ self.assertEqual(inst["FileGroupID"], stats.st_gid)
+ self.assertEqual(inst["FileMode"], stats.st_mode)
+ self.assertEqual(inst["FileSize"], stats.st_size)
+ self.assertEqual(inst["LinkTarget"], target)
+ self.assertEqual(inst["Checksum"],
+ "0"*self.hash_num2length[inst["ChecksumType"]])
+ self.assertEqual(inst["LastModificationTime"],
+ int(stats.st_mtime))
+
+ # modify owner
+ prev_user = inst["FileUserID"]
+ prev_mtime = inst["LastModificationTime"]
+ prev_pflags = PassedFlags(*inst["PassedFlags"])
+ os.lchown(f, stats.st_uid + 1, -1)
+ inst = self.conn.GetInstance(InstanceName=inst.path)
+ self.assertEqual(inst["FileUserID"], inst["ExpectedFileUserID"] + 1)
+ self.assertEqual(inst["FileUserID"], prev_user + 1)
+ self.assertEqual(inst["FileGroupID"], stats.st_gid)
+ cur_pflags = PassedFlags(*inst["PassedFlags"])
+ #self.assertGreater(inst["LastModificationTime"], prev_mtime)
+
+ self.assertTrue(cur_pflags.exists)
+ self.assertTrue(cur_pflags.type)
+ self.assertTrue(cur_pflags.size)
+ self.assertTrue(cur_pflags.mode)
+ self.assertTrue(cur_pflags.checksum)
+ self.assertTrue(cur_pflags.dev)
+ self.assertTrue(cur_pflags.ltarget)
+ self.assertFalse(cur_pflags.uid)
+ self.assertTrue(cur_pflags.gid)
+ self.assertTrue(cur_pflags.mtime)
+
+ # modify link_target
+ os.remove(f)
+ os.symlink("wrong" + "*"*len(inst["ExpectedLinkTarget"]), f)
+ os.lchown(f, inst["ExpectedFileUserID"], inst["ExpectedFileGroupID"])
+
+ inst = self.conn.GetInstance(InstanceName=inst.path)
+ cur_pflags = PassedFlags(*inst["PassedFlags"])
+ self.assertGreater(len(inst["LinkTarget"]),
+ len(inst["ExpectedLinkTarget"]))
+
+ self.assertTrue(cur_pflags.exists)
+ self.assertTrue(cur_pflags.type)
+ self.assertFalse(cur_pflags.size)
+ self.assertTrue(cur_pflags.mode)
+ self.assertTrue(cur_pflags.checksum)
+ self.assertTrue(cur_pflags.dev)
+ self.assertFalse(cur_pflags.ltarget)
+ self.assertTrue(cur_pflags.uid)
+ self.assertTrue(cur_pflags.gid)
+ self.assertTrue(cur_pflags.mtime)
+
+ def do_test_directory(self, op, nevra, f, inst):
+ stats = os.lstat(f)
+
+ self.assertEqual(inst["FileType"], pywbem.Uint16(2))
+ self.assertEqual(inst["FileUserID"], stats.st_uid)
+ self.assertEqual(inst["FileGroupID"], stats.st_gid)
+ self.assertEqual(inst["FileMode"], stats.st_mode)
+ self.assertEqual(inst["FileSize"], stats.st_size)
+ self.assertIs(inst["LinkTarget"], None)
+ self.assertEqual(inst["Checksum"],
+ "0"*self.hash_num2length[inst["ChecksumType"]])
+ self.assertEqual(inst["LastModificationTime"],
+ int(stats.st_mtime))
+
+ def do_test_file(self, op, nevra, f, inst):
+ stats = os.lstat(f)
+
+ self.assertEqual(inst["FileType"], pywbem.Uint16(1))
+ self.assertEqual(inst["FileUserID"], stats.st_uid)
+ self.assertEqual(inst["FileGroupID"], stats.st_gid)
+ self.assertEqual(inst["FileMode"], stats.st_mode)
+ self.assertEqual(inst["FileSize"], stats.st_size)
+ self.assertIs(inst["LinkTarget"], None)
+ csum = self.make_checksum_str(inst['ChecksumType'], f)
+ self.assertEqual(inst["Checksum"].lower(), csum)
+ self.assertEqual(inst["ExpectedLastModificationTime"],
+ inst["LastModificationTime"])
+ self.assertEqual(inst["LastModificationTime"],
+ int(stats.st_mtime))
+
+ # make it longer
+ with open(f, "a+") as fobj:
+ fobj.write("data\n")
+ inst = self.conn.GetInstance(InstanceName=inst.path)
+ cur_pflags = PassedFlags(*inst["PassedFlags"])
+ self.assertGreater(inst["FileSize"], inst["ExpectedFileSize"])
+ self.assertGreater(inst["LastModificationTime"],
+ inst["ExpectedLastModificationTime"])
+
+ self.assertTrue(cur_pflags.exists)
+ self.assertTrue(cur_pflags.type)
+ self.assertFalse(cur_pflags.size)
+ self.assertTrue(cur_pflags.mode)
+ self.assertFalse(cur_pflags.checksum)
+ self.assertTrue(cur_pflags.dev)
+ self.assertTrue(cur_pflags.ltarget)
+ self.assertTrue(cur_pflags.uid)
+ self.assertTrue(cur_pflags.gid)
+ self.assertFalse(cur_pflags.mtime)
+
+ # change file type
+ os.remove(f)
+ os.symlink(f, f)
+ os.lchown(f, inst["ExpectedFileUserID"], inst["ExpectedFileGroupID"])
+ inst = self.conn.GetInstance(InstanceName=inst.path)
+ cur_pflags = PassedFlags(*inst["PassedFlags"])
+ self.assertNotEqual(inst["LinkTarget"], inst["ExpectedLinkTarget"])
+ self.assertNotEqual(inst["FileSize"], inst["ExpectedFileSize"])
+ self.assertGreater(inst["LastModificationTime"],
+ inst["ExpectedLastModificationTime"])
+ self.assertNotEqual(inst["FileType"], inst["ExpectedFileType"])
+ self.assertEqual(inst["FileType"], pywbem.Uint16(3))
+
+ self.assertTrue(cur_pflags.exists)
+ self.assertFalse(cur_pflags.type)
+ self.assertFalse(cur_pflags.size)
+ self.assertFalse(cur_pflags.mode)
+ self.assertFalse(cur_pflags.checksum)
+ self.assertTrue(cur_pflags.dev)
+ self.assertFalse(cur_pflags.ltarget)
+ self.assertTrue(cur_pflags.uid)
+ self.assertTrue(cur_pflags.gid)
+ self.assertFalse(cur_pflags.mtime)
+
+ # remove it
+ os.remove(f)
+ inst = self.conn.GetInstance(InstanceName=inst.path)
+ cur_pflags = PassedFlags(*inst["PassedFlags"])
+ self.assertEqual(inst["LinkTarget"], inst["ExpectedLinkTarget"])
+ self.assertNotEqual(inst["FileSize"], inst["ExpectedFileSize"])
+ self.assertIsNone(inst["LastModificationTime"])
+ self.assertIsNone(inst["FileType"])
+ self.assertIsNone(inst["Checksum"])
+ self.assertIsNone(inst["FileMode"])
+ self.assertIsNone(inst["FileUserID"])
+ self.assertIsNone(inst["FileGroupID"])
+
+ self.assertFalse(cur_pflags.exists)
+ self.assertFalse(cur_pflags.type)
+ self.assertFalse(cur_pflags.size)
+ self.assertFalse(cur_pflags.mode)
+ self.assertFalse(cur_pflags.checksum)
+ self.assertFalse(cur_pflags.dev)
+ self.assertFalse(cur_pflags.ltarget)
+ self.assertFalse(cur_pflags.uid)
+ self.assertFalse(cur_pflags.gid)
+ self.assertFalse(cur_pflags.mtime)
+
+ def test_get_instance(self):
+ for nevra, files in pkg_files:
+ m = re_nevra.match(nevra)
+ name, version = [ m.group(k) for k in ("name", "ver") ]
+ if is_installed(nevra=nevra) and not verify_pkg(name):
+ remove_pkg(name)
+ if not is_installed(name):
+ install_pkg(nevra=nevra)
+ self.assertTrue(is_installed(nevra=nevra))
+ for f in files:
+ op = self.make_op(nevra, f)
+
+ inst = self.conn.GetInstance(InstanceName=op, LocalOnly=False)
+ self.assertIsInstance(inst, pywbem.CIMInstance)
+ self.assertEqual(inst.path, op)
+ for key in self.KEYS:
+ self.assertEqual(inst[key], op[key])
+
+ self.assertTrue(inst["FileExists"])
+ self.assertEqual(len(inst["PassedFlags"]), 10)
+ self.assertTrue(all(f is True for f in inst["PassedFlags"]))
+ for prop in ( "FileType", "FileUserID", "FileGroupID"
+ , "FileMode", "FileSize", "LinkTarget"
+ , "Checksum", "FileModeFlags"):
+ self.assertEqual(inst["Expected"+prop], inst[prop])
+ if os.path.islink(f):
+ self.do_test_symlink(op, nevra, f, inst)
+ elif os.path.isdir(f):
+ self.do_test_directory(op, nevra, f, inst)
+ elif os.path.isfile(f):
+ self.do_test_file(op, nevra, f, inst)
+
+ def test_invoke_method(self):
+ for nevra, files in pkg_files:
+ m = re_nevra.match(nevra)
+ name, version = [ m.group(k) for k in ("name", "ver") ]
+ if is_installed(nevra=nevra) and not verify_pkg(name):
+ remove_pkg(name)
+ if not is_installed(name):
+ install_pkg(nevra=nevra)
+ self.assertTrue(is_installed(nevra=nevra))
+ for f in files:
+ op = self.make_op(nevra, f)
+
+ (rval, oparms) = self.conn.InvokeMethod(
+ MethodName="Invoke",
+ ObjectName=op)
+ self.assertEqual(rval, pywbem.Uint32(0))
+
+ # modify file
+ if os.path.isfile(f):
+ os.remove(f)
+ else:
+ os.lchown(f, os.stat(f).st_uid + 1, -1)
+ (rval, oparms) = self.conn.InvokeMethod(
+ MethodName="Invoke",
+ ObjectName=op)
+ self.assertEqual(rval, pywbem.Uint32(2))
+
+ @classmethod
+ def tearDownClass(cls):
+ for pkg_nevra, files in pkg_files:
+ name = re_nevra.match(pkg_nevra).group('name')
+ if is_installed(name) and not verify_pkg(name):
+ remove_pkg(name)
+ if not is_installed(name):
+ install_pkg(nevra=pkg_nevra)
+
+if __name__ == "__main__":
+ unittest.main()