diff options
author | Michal Minar <miminar@redhat.com> | 2012-10-10 17:55:12 +0200 |
---|---|---|
committer | Michal Minar <miminar@redhat.com> | 2012-10-10 17:55:12 +0200 |
commit | 2aa4f8635b13e1849763a1964eb45032ee30948c (patch) | |
tree | 3563082116a1a3464a365668505a4db68d55a20a /src/software/test/test_software_file_check.py | |
parent | 167c13bdf07c2a86ff7043b4b874073556858e69 (diff) | |
download | openlmi-providers-2aa4f8635b13e1849763a1964eb45032ee30948c.tar.gz openlmi-providers-2aa4f8635b13e1849763a1964eb45032ee30948c.tar.xz openlmi-providers-2aa4f8635b13e1849763a1964eb45032ee30948c.zip |
renamed yum package providers to software
renamed LMI_Yum* to LMI_Software*
removed attributes GroupString and LicenseString from LMI_SoftwarePackage
modified attributes Group, Architecture and License of
LMI_SoftwarePackage to return string instead of Uints
- because values and valuemaps would need frequent updates
Diffstat (limited to 'src/software/test/test_software_file_check.py')
-rwxr-xr-x | src/software/test/test_software_file_check.py | 289 |
1 files changed, 289 insertions, 0 deletions
diff --git a/src/software/test/test_software_file_check.py b/src/software/test/test_software_file_check.py new file mode 100755 index 0000000..66b2452 --- /dev/null +++ b/src/software/test/test_software_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 TestSoftwareInstalledPackage(SoftwareBaseTestCase): + + CLASS_NAME = "LMI_SoftwareFileCheck" + 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() |