diff options
Diffstat (limited to 'src/yum/test')
-rw-r--r-- | src/yum/test/README | 5 | ||||
-rw-r--r-- | src/yum/test/common.py | 109 | ||||
-rw-r--r-- | src/yum/test/test_common.sh | 91 | ||||
-rwxr-xr-x | src/yum/test/test_yum_file_check.py | 289 | ||||
-rwxr-xr-x | src/yum/test/test_yum_installed_package.py | 241 | ||||
-rwxr-xr-x | src/yum/test/test_yum_package.py | 79 | ||||
-rwxr-xr-x | src/yum/test/yum_package.sh | 278 |
7 files changed, 723 insertions, 369 deletions
diff --git a/src/yum/test/README b/src/yum/test/README new file mode 100644 index 0000000..d60d1e8 --- /dev/null +++ b/src/yum/test/README @@ -0,0 +1,5 @@ +Tests must be run as root on machine with sfcbd broker with +test dir as CWD. File common.py contains connection settings and +also test data. +This directory should contain all rpm packages, that will take part in testing +to speed it up. These packages are listed in common.py file. diff --git a/src/yum/test/common.py b/src/yum/test/common.py new file mode 100644 index 0000000..0da5695 --- /dev/null +++ b/src/yum/test/common.py @@ -0,0 +1,109 @@ +from collections import namedtuple +import os +import pywbem +import re +import subprocess +import unittest + +SCHEMA="http" +HOSTNAME="localhost" +PORT=5988 +USER='' +PASSWORD='' + +Package = namedtuple("Package", + "name, epoch, ver, rel, arch, " + "updatable, up_epoch, up_ver, up_rel") +# This is a database of packages used in tests. If you modify this, please +# ensure, that all corresponding rpm packages are present in test directory. +packages = [ Package(*args) for args in + ( ( "python-xlib-doc", "0", "0.15", "0.6.rc1.fc17", "noarch", False + , None, None, None) + , ( "slv2", "0", "0.6.6", "8.fc17", "x86_64", True + , "0", "0.6.6", "9.fc17") + ) ] + +pkg_files = ( + ( "bash-completion-1:2.0-1.fc17.noarch", + ( "/usr/share/bash-completion/completions/vgs" # symlink + , "/usr/share/doc/bash-completion-2.0/README" # file + , "/usr/share/doc/bash-completion-2.0" # directory + ) + , ) + , ) + +re_nevra = re.compile(r'^(?P<name>.+)-(?P<evra>(?P<epoch>\d+):(?P<ver>[^-]+)' + r'-(?P<rel>.+)\.(?P<arch>[^.]+))$') + +def make_nevra(name, epoch, ver, rel, arch, with_epoch='NOT_ZERO'): + """ + @param with_epoch may be one of: + "NOT_ZERO" - include epoch only if it's not zero + "ALWAYS" - include epoch always + "NEVER" - do not include epoch at all + """ + estr = '' + if with_epoch.lower() == "always": + estr = epoch + elif with_epoch.lower() == "not_zero": + if epoch != "0": + estr = epoch + if len(estr): estr += ":" + return "%s-%s%s-%s.%s" % (name, estr, ver, rel, arch) + +def remove_pkg(name, *args): + subprocess.call(["rpm", "--quiet"] + list(args) + ["-e", name]) + +def install_pkg(*args, **kwargs): + if len(args) > 1 or len(kwargs) > 0: + if kwargs.has_key('nevra'): + m = re_nevra.match(kwargs['nevra']) + args = [ m.group(k) for k in ( + 'name', 'epoch', 'ver', 'rel', 'arch') ] + nevra = make_nevra(*args, with_epoch="NEVER") + rpm_name = nevra + ".rpm" + if os.path.exists(rpm_name): + subprocess.call(["rpm", "--quiet", "-i", rpm_name]) + return + subprocess.call(["yum", "-q", "-y", "install", args[0]]) + +def is_installed(*args, **kwargs): + if len(args) == 1: + return subprocess.call(["rpm", "--quiet", "-q", args[0]]) == 0 + else: + if kwargs.has_key("nevra"): + nevra = kwargs["nevra"] + name = re_nevra.match(nevra).group('name') + else: + nevra = make_nevra(*args) + name = args[0] + try: + out = subprocess.check_output( + ["rpm", "-q", "--qf", "%{NEVRA}", name]) + return out == nevra + except subprocess.CalledProcessError: + return False + +def verify_pkg(name): + return subprocess.call(["rpm", "--quiet", "-Va", name]) == 0 + +class YumBaseTestCase(unittest.TestCase): + + def setUp(self): + unittest.TestCase.setUp(self) + self.url = "%s://%s:%d" % (SCHEMA, HOSTNAME, PORT) + self.conn = pywbem.WBEMConnection(self.url, (USER, PASSWORD)) + self.op = pywbem.CIMInstanceName( + namespace="root/cimv2", classname=self.CLASS_NAME) + + def tearDown(self): + del self.conn + + def assertIsSubclass(self, cls, base_cls): + if not isinstance(cls, basestring): + raise TypeError("cls must be a string") + if not isinstance(base_cls, basestring): + raise TypeError("base_cls must be a string") + return self.assertTrue(pywbem.is_subclass(self.conn, + "root/cimv2", base_cls, cls)) + diff --git a/src/yum/test/test_common.sh b/src/yum/test/test_common.sh deleted file mode 100644 index 1e5cd98..0000000 --- a/src/yum/test/test_common.sh +++ /dev/null @@ -1,91 +0,0 @@ -#!/bin/bash - -if [ -z $CLASS_NAME ]; then - echo "variable CLASS_NAME must be defined" - exit 1 -fi - - -url="http://localhost:5988" - -fedora_release=`sed 's/Fedora release\s*\([0-9]\+\).*/\1/' \ - /etc/fedora-release` - -function make_nevra() { - # accepts arguments: name, epoch, ver, rel, arch - # in this order - printf "%s-%s:%s-%s.%s" $@ -} - -function make_op() { - local class_name keys - read class_name keys <<< "$@" - [ -n "$keys" ] && keys=".$keys" - printf "root/cimv2:$class_name$keys" -} - -computer_system_keys="CreationClassName=\"Linux_ComputerSystem\"" -computer_system_keys+=",Name=$(hostname)" -computer_system_op=`make_op Linux_ComputerSystem "$computer_system_keys"` -op=`make_op ${CLASS_NAME}` - -function make_rpm_name() { - local name epoch ver rel arch; - if [ $# -ge 5 ]; then - read name epoch ver rel arch <<< "$@" - else - read name ver rel arch <<< "$@" - fi - [ $# -gt 5 ] && arch=`echo $arch | cut -d \ -f 1` - if [ -n "$epoch" -a "$epoch" != 0 ]; then - epoch="${epoch}:" - else - epoch="" - fi - printf "%s-%s%s-%s.%s.rpm" "$name" "$epoch" "$ver" "$rel" "$arch" -} - -function is_installed() { - rpm -q "$1" >/dev/null -} - -function is_installed_nevra() { - local name epoch ver rel arch; - read name epoch ver rel arch <<< "$@" - - rpm -qi name | sed -n 's/^\(Name\|Epoch\|Version\|Release\|Architecture\)\s*:\s*\(.*\)/\1 \2/p' | \ - while read l; do - read k v <<< "$l" - read ${k,,} <<< "$v" - [ $k == "version" ] && [ -z "$epoch" ] && echo "0" # print epoch - echo $v - done | set -- - [ $epoch == $2 ] && [ $ver == $3 ] && [ $rel == $4 ] && [ $arch == $5 ] -} - -function install_pkg() { - if [ $# == 1 ]; then - sudo yum -y install $1 || exit 1 - else - local rpm_name=`make_rpm_name "$@"` - if ! [ -f "$rpm_name" ]; then - if [ -f "$dir/$rpm_name" ]; then - rpm_name="$dir/$rpm_name" - fi - fi - if ! [ -e "$rpm_name" ]; then - sudo yum -y install "$1" - else - sudo rpm -i "$rpm_name" - fi - fi -} - -function remove() { - sudo rpm --allmatches -e "$1" -} - -function wbemerr() { - wbemcli "$@" |& sed 's:<br\s*/\?>:\n:g' -} - 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() diff --git a/src/yum/test/test_yum_installed_package.py b/src/yum/test/test_yum_installed_package.py new file mode 100755 index 0000000..e78aaaa --- /dev/null +++ b/src/yum/test/test_yum_installed_package.py @@ -0,0 +1,241 @@ +#!/usr/bin/env python + +from common import * +import shutil +import socket +import stat + +class TestYumInstalledPackage(YumBaseTestCase): + + CLASS_NAME = "LMI_YumInstalledPackage" + KEYS = ( "Software", "System") + + def make_op(self, name, epoch, ver, rel, arch, ses=2): + op = self.op.copy() + pkg_op = pywbem.CIMInstanceName( + classname="LMI_YumPackage", namespace="root/cimv2", + keybindings={ + "Name" : name, + "SoftwareElementID" : make_nevra( + name, epoch, ver, rel, arch, "ALWAYS"), + "SoftwareElementState" : pywbem.Uint16(ses), + "TargetOperatingSystem" : pywbem.Uint16(36), + "Version" : ver }) + system_op = pywbem.CIMInstanceName( + classname="CIM_ComputerSystem", namespace="root/cimv2", + keybindings={ + "CreationClassName" : "CIM_ComputerSystem", + "Name" : socket.gethostname() }) + op["Software"] = pkg_op + op["System"] = system_op + return op + + def test_get_instance(self): + for pkg in packages: + if not is_installed(*pkg[:5]): + install_pkg(*pkg[:5]) + op = self.make_op(*pkg[:5]) + inst = self.conn.GetInstance(InstanceName=op, LocalOnly=False) + self.assertIsSubclass(inst.path.classname, self.CLASS_NAME) + self.assertIsSubclass( + inst.path['System'].classname, op['System'].classname) + self.assertIsSubclass( + inst.path['Software'].classname, op['Software'].classname) + self.assertEqual(len(inst.path.keys()), 2) + for key in self.KEYS: + self.assertEqual(inst[key], inst.path[key]) + self.assertEqual(inst['Software'], op['Software']) + remove_pkg(pkg.name) + op['Software']['SoftwareElementState'] = pywbem.Uint16(1) + with self.assertRaises(pywbem.CIMError) as cm: + self.conn.GetInstance(InstanceName=op, LocalOnly=False) + self.assertEqual(cm.exception.args[0], pywbem.CIM_ERR_NOT_FOUND) + + def test_enum_instances(self): + pkg = packages[0] + if is_installed(*pkg[:5]): + remove_pkg(pkg.name) + insts1 = self.conn.EnumerateInstanceNames(ClassName=self.CLASS_NAME) + install_pkg(*pkg[:5]) + insts2 = self.conn.EnumerateInstanceNames(ClassName=self.CLASS_NAME) + self.assertEqual(len(insts1) + 1, len(insts2)) + + op = self.make_op(*pkg[:5]) + self.assertIn(op['Software'], (inst['Software'] for inst in insts2)) + self.assertTrue(all(isinstance(inst, pywbem.CIMInstanceName) + for inst in insts1)) + + insts1 = self.conn.EnumerateInstances(ClassName=self.CLASS_NAME) + remove_pkg(pkg.name) + insts2 = self.conn.EnumerateInstances(ClassName=self.CLASS_NAME) + + self.assertEqual(len(insts2) + 1, len(insts1)) + self.assertIn(op['Software'], (inst['Software'] for inst in insts1)) + self.assertTrue(all(inst['Software'] == inst.path['Software'] + for inst in insts1)) + self.assertTrue(all(inst['System'] == inst.path['System'] + for inst in insts1)) + + def test_create_instance(self): + for pkg in packages: + if is_installed(pkg.name): + remove_pkg(pkg.name) + self.assertFalse(is_installed(pkg.name)) + op = self.make_op(*(list(pkg[:5]) + [1])) + inst = pywbem.CIMInstance(classname=op.classname, path=op) + inst["Software"] = op["Software"] + inst["System"] = op["System"] + iname = self.conn.CreateInstance(NewInstance=inst) + self.assertIsInstance(iname, pywbem.CIMInstanceName) + op["Software"]["SoftwareElementState"] = pywbem.Uint16(2) + self.assertEqual(iname["Software"], op["Software"]) + self.assertIsInstance(iname["System"], pywbem.CIMInstanceName) + self.assertIsSubclass(iname["System"].classname, + op["System"].classname) + self.assertEqual(set(iname.keys()), set(op.keys())) + self.assertTrue(is_installed(pkg.name)) + + with self.assertRaises(pywbem.CIMError) as cm: + self.conn.CreateInstance(NewInstance=inst) + self.assertEqual(cm.exception.args[0], + pywbem.CIM_ERR_ALREADY_EXISTS) + + def test_delete_instance(self): + for pkg in packages: + if not is_installed(pkg.name): + install_pkg(*pkg[:5]) + self.assertTrue(is_installed(pkg.name)) + op = self.make_op(*pkg[:5]) + self.conn.DeleteInstance(op) + self.assertFalse(is_installed(pkg.name)) + with self.assertRaises(pywbem.CIMError) as cm: + self.conn.DeleteInstance(op) + self.assertEqual(cm.exception.args[0], pywbem.CIM_ERR_NOT_FOUND) + + def test_check_integrity(self): + for pkg_nevra, files in pkg_files: + m = re_nevra.match(pkg_nevra) + name, epoch, ver, rel, arch = [ m.group(k) for k in ( + "name", "epoch", "ver", "rel", "arch") ] + if ( (is_installed(nevra=pkg_nevra) and not verify_pkg(name)) + or (is_installed(name) and not is_installed(nevra=pkg_nevra))) : + remove_pkg(name) + if not is_installed(name): + install_pkg(name, epoch, ver, rel, arch) + self.assertTrue(is_installed(nevra=pkg_nevra)) + + op = self.make_op(name, epoch, ver, rel, arch) + (rval, oparms) = self.conn.InvokeMethod( + MethodName="CheckIntegrity", + ObjectName=op) + self.assertEqual(rval, pywbem.Uint32(0)) # check passed + self.assertEqual(len(oparms), 1) + self.assertIn("Failed", oparms) + self.assertEqual(len(oparms["Failed"]), 0) + + cnt_bad = 0 + for f in files: + stats = os.lstat(f) + if os.path.islink(f): # modify symbolic link + target = os.readlink(f) + os.remove(f) + os.symlink(target, f) # just touch symlink + (rval, oparms) = self.conn.InvokeMethod( + MethodName="CheckIntegrity", + ObjectName=op) + # symlink must pass + self.assertEqual(len(oparms["Failed"]), cnt_bad) + os.remove(f) + # now change target + os.symlink("wrong_link_target", f) + elif os.path.isdir(f): # check directory + os.chmod(f, stats.st_mode) # just touch dir + (rval, oparms) = self.conn.InvokeMethod( + MethodName="CheckIntegrity", + ObjectName=op) + # dir must pass + self.assertEqual(len(oparms["Failed"]), cnt_bad) + # modify read access of directory + os.chmod(f, stats.st_mode ^ stat.S_IROTH) + else: # modify regular file + # just touch file - this is enough to make it fail + with open(f, "w+") as fobj: pass + cnt_bad += 1 + (rval, oparms) = self.conn.InvokeMethod( + MethodName="CheckIntegrity", + ObjectName=op) + self.assertEqual(rval, pywbem.Uint32(1)) + self.assertEqual(len(oparms), 1) + self.assertIn("Failed", oparms) + self.assertEqual(len(oparms["Failed"]), cnt_bad) + self.assertIn(f, (p["Name"] for p in oparms["Failed"])) + + def test_method_update(self): + for pkg in packages: + if not pkg.updatable: continue + if is_installed(pkg.name) and not is_installed(*pkg[:5]): + remove_pkg(pkg.name) + if not is_installed(pkg.name): + install_pkg(*pkg[:5]) + self.assertTrue(is_installed(*pkg[:5])) + + op = self.make_op(*pkg[:5]) + op_up = self.make_op(pkg.name, pkg.up_epoch, + pkg.up_ver, pkg.up_rel, pkg.arch) + (rval, oparms) = self.conn.InvokeMethod( + MethodName="Update", + ObjectName=op) + self.assertEqual(rval, pywbem.Uint16(1)) + self.assertEqual(len(oparms), 1) + self.assertIn("Installed", oparms) + self.assertEqual(oparms["Installed"], op_up["Software"]) + self.assertTrue(is_installed(pkg.name, pkg.up_epoch, + pkg.up_ver, pkg.up_rel, pkg.arch)) + + (rval, oparms) = self.conn.InvokeMethod( + MethodName="Update", + ObjectName=op_up) + self.assertEqual(rval, pywbem.Uint16(0)) + self.assertEqual(len(oparms), 1) + self.assertEqual(oparms["Installed"], op_up["Software"]) + + with self.assertRaises(pywbem.CIMError) as cm: + self.conn.InvokeMethod( + MethodName="Update", + ObjectName=op) + self.assertEqual(cm.exception.args[0], + pywbem.CIM_ERR_NOT_FOUND) + + remove_pkg(pkg.name) + install_pkg(*pkg[:5]) + self.assertTrue(is_installed(*pkg[:5])) + + (rval, oparms) = self.conn.InvokeMethod( + MethodName="Update", + ObjectName=op, + Epoch=pkg.epoch, + Version=pkg.ver, + Release=pkg.rel) + self.assertEqual(rval, pywbem.Uint16(0)) + self.assertEqual(oparms["Installed"], op["Software"]) + + (rval, oparms) = self.conn.InvokeMethod( + MethodName="Update", + ObjectName=op, + Epoch=pkg.up_epoch, + Version=pkg.up_ver, + Release=pkg.up_rel) + self.assertEqual(rval, pywbem.Uint16(1)) + self.assertEqual(oparms["Installed"], op_up["Software"]) + + @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() diff --git a/src/yum/test/test_yum_package.py b/src/yum/test/test_yum_package.py new file mode 100755 index 0000000..c5b2715 --- /dev/null +++ b/src/yum/test/test_yum_package.py @@ -0,0 +1,79 @@ +#!/usr/bin/env python + +from common import * + +class TestYumPackage(YumBaseTestCase): + + CLASS_NAME = "LMI_YumPackage" + KEYS = ( "Name", "SoftwareElementID", "SoftwareElementState" + , "TargetOperatingSystem", "Version") + + def make_op(self, name, epoch, ver, rel, arch, ses=2): + op = self.op.copy() + op["Name"] = name + op["SoftwareElementID"] = make_nevra( + name, epoch, ver, rel, arch, "ALWAYS") + op["SoftwareElementState"] = pywbem.Uint16(ses) + op["TargetOperatingSystem"] = pywbem.Uint16(36) + op["Version"] = ver + return op + + def test_get_instance(self): + for pkg in packages: + if is_installed(pkg.name): + remove_pkg(pkg.name) + op = self.make_op(pkg.name, pkg.epoch, pkg.ver, + pkg.rel, pkg.arch, 1) + inst = self.conn.GetInstance(InstanceName=op, LocalOnly=False) + self.assertEqual(inst.path, op) + for key in self.KEYS: + self.assertTrue(inst.properties.has_key(key)) + self.assertEqual(inst.path[key], inst[key]) + self.assertEqual(inst['Release'], pkg.rel) + install_pkg(*pkg[:5]) + op['SoftwareElementState'] = pywbem.Uint16(2) + inst = self.conn.GetInstance(InstanceName=op, LocalOnly=False) + self.assertEqual(inst.path, op) + + def test_method_install(self): + for pkg in packages: + if is_installed(pkg.name): + remove_pkg(pkg.name) + op = self.make_op(pkg.name, pkg.epoch, pkg.ver, + pkg.rel, pkg.arch, 1) + (rval, oparms) = self.conn.InvokeMethod( + MethodName="Install", + ObjectName=op) + self.assertEqual(rval, pywbem.Uint32(1)) + self.assertEqual(len(oparms), 1) + self.assertTrue(oparms.has_key('Installed')) + op['SoftwareElementState'] = pywbem.Uint16(2) + self.assertEqual(oparms['Installed'], op) + self.assertTrue(is_installed(pkg.name)) + (rval, oparms) = self.conn.InvokeMethod( + MethodName="Install", + ObjectName=op) + self.assertEqual(rval, pywbem.Uint32(0)) + self.assertEqual(len(oparms), 1) + self.assertEqual(oparms['Installed'], op) + + def test_method_remove(self): + for pkg in packages: + if not is_installed(pkg.name): + install_pkg(*pkg[:5]) + op = self.make_op(*pkg[:5]) + (rval, oparms) = self.conn.InvokeMethod( + MethodName="Remove", + ObjectName=op) + self.assertEqual(rval, pywbem.Uint16(1)) + self.assertEqual(len(oparms), 0) + self.assertFalse(is_installed(pkg.name)) + op["SoftwareElementState"] = pywbem.Uint16(1) + (rval, oparms) = self.conn.InvokeMethod( + MethodName="Remove", + ObjectName=op) + self.assertEqual(rval, pywbem.Uint32(0)) + self.assertEqual(len(oparms), 0) + +if __name__ == '__main__': + unittest.main() diff --git a/src/yum/test/yum_package.sh b/src/yum/test/yum_package.sh deleted file mode 100755 index 5d81955..0000000 --- a/src/yum/test/yum_package.sh +++ /dev/null @@ -1,278 +0,0 @@ -#!/bin/bash - -dir=`dirname $0` -[ -z "$dir" ] && dir=. - -CLASS_NAME="LMI_YumPackage" -. $dir/test_common.sh - -declare -A pkg1 pkg2 -if [[ "$fedora_release" = 16 ]]; then - pkg1=( \ - [name]=python-xlib-doc - [epoch]=0 \ - [ver]=0.15 \ - [rel]=0.6.rc1.fc16 \ - [arch]=noarch \ - [updatable]=0 \ - ) - pkg2=( \ - [name]=ruby-ri \ - [epoch]=0 \ - [ver]=1.8.7.352 \ - [rel]=1.fc16 \ - [arch]=x86_64 \ - [updatable]=1 \ - [up_epoch]=0 \ - [up_ver]=1.8.7.358 \ - [up_rel]=2.fc16 \ - ) -elif [[ "$fedora_release" = 17 ]]; then - pkg1=( \ - [name]=python-xlib-doc - [epoch]=0 \ - [ver]=0.15 \ - [rel]=0.6.rc1.fc17 \ - [arch]=noarch \ - [updatable]=0 \ - ) - pkg2=( \ - [name]=slv2 \ - [epoch]=0 \ - [ver]=0.6.6 \ - [rel]=8.fc17 \ - [arch]=x86_64 \ - [updatable]=1 \ - [up_epoch]=0 \ - [up_ver]=0.6.6 \ - [up_rel]=9.fc17 \ - ) -elif [[ -z "$fedora_release" ]]; then - echo "failed to get Fedora release number!" 2>&1 - exit 1 -else - echo "no packages defined for Fedora release $fedora_release" 2>&1 - exit 1 -fi -keys=(name epoch ver rel arch updatable up_epoch up_ver up_rel) - -make_inst_keys() { - # accepts arguments: name, epoch, ver, rel, arch - # in this order - local path='Name="%s",SoftwareElementID="%s",SoftwareElementState="%s",' - path+='TargetOperatingSystem="%s",Version="%s"' - printf $path $1 `make_nevra "$@"` 2 36 $3 -} - -test_install() { - local name epoch ver rel arch updatable up_epoch up_ver up_rel; - read name epoch ver rel arch updatable \ - up_epoch up_ver up_rel <<< "$@" - - echo "********************************************************************" - echo " * TEST INSTALL" - nevra_arr=($name $epoch $ver $rel $arch) - nevra=`make_nevra ${nevra_arr[@]}` - echo -n "$nevra is " - [ "$updatable" == 0 ] && echo -n "not " - echo -n "updatable and " - is_installed $name || echo -n "not " - echo "installed" - - if is_installed $name; then - echo "removing package \"${nevra}\" with rpm" - remove $name - fi - - local keys=`make_inst_keys ${nevra_arr[@]}` - local url="$url/$op.${keys}" - - echo "trying to get instance" - if ! wbemerr gi "$url" |& \ - grep -q '\<SoftwareElementState="\?1"\?'; then - echo "wrong SoftwareElementState" - exit 1 - fi - - echo "installing $CLASS_NAME: $url" - if ! wbemerr cm "$url" Install |& \ - grep -q '\<Install:\s*1\s\+Installed'; then - echo "wrong return code" - exit 1 - fi - - if is_installed $name; then - echo "successful installation" - else - echo "package not installed" - exit 1 - fi - - echo "checking get instance" - if ! wbemerr gi "$url" |& \ - grep -q '\<SoftwareElementState="\?2"\?'; then - echo "wrong SoftwareElementState" - exit 1 - fi - - echo "testing installation of already installed package" - if ! wbemcli cm "${url}" Install |& \ - grep -q '\<Install:\s*0\s\+Installed'; then - echo "wrong return code" - exit 1 - fi -} - -test_update() { - read name epoch ver rel arch updatable \ - up_epoch up_ver up_rel <<< "$@" - - echo "********************************************************************" - echo " * TEST UPDATE" - if [ "$updatable" == 0 ]; then - echo "package not updatable" - exit 1 - fi - - nevra_arr=($name $epoch $ver $rel $arch) - nevra=`make_nevra ${nevra_arr[@]}` - echo -n "$nevra is " - [ "$updatable" == 0 ] && echo -n "not " - echo -n "updatable and " - is_installed $name || echo -n "not " - echo "installed" - - if is_installed $name; then - echo "removing package \"${name}\" with rpm" - remove $name - fi - - local keys=`make_inst_keys ${nevra_arr[@]}` - local package_url="$url/$op.$keys" - echo "intalling older package with $CLASS_NAME: $package_url" - wbemerr cm "$package_url" Install - - if is_installed $name; then - echo "successful installation" - else - echo "package not installed" - exit 1 - fi - - echo "updating with LMI_YumInstalledPackage.Update()" - - local installed_keys="Software=$op.$keys,System=$computer_system_op" - local installed_url="$url/`make_op LMI_YumInstalledPackage $installed_keys`" - if ! wbemerr cm "$installed_url" "Update" | \ - grep -q '\<Update:\s*1\s\+Installed'; then - echo "wrong return code" - exit 1 - fi - - if is_installed_nevra $name $up_epoch $up_ver $up_rel $arch; then - echo "successful update" - else - echo "update failed" - exit 1 - fi - - keys=`make_inst_keys $name $up_epoch $up_ver $up_rel $arch` - installed_keys="Software=$op.$keys,System=$computer_system_op" - local installed_url2="$url/`make_op LMI_YumInstalledPackage $installed_keys`" - echo "trying to update once more to: $installed_url2" - if ! wbemerr cm "$installed_url2" "Update" | \ - grep -q '\<Update:\s*0\s\+Installed'; then - echo "wrong return code" - exit 1 - fi - - echo "removing updated package" - wbemerr di "$installed_url2" - if is_installed $name; then - echo "failed to remove ${name}" - exit 1 - else - echo "success" - fi - - echo "installing older package" - install_pkg "$@" || exit 1 - - echo "trying to update to not existing version-release" - wbemerr cm "$installed_url" "Update.Version=\"not-existing-version\"" |& - grep -q CIM_ERR_NOT_FOUND && echo "ok" || echo "failed" - - echo "trying to update to the same version-release" - wbemerr cm "$installed_url" \ - "Update.Version=\"${ver}\",Release=\"${rel}\"" | \ - grep -q '\<Update:\s*0\s\+Installed' || \ - echo "wrong return code" - - if is_installed_nevra $name $epoch $ver $rel $arch; then - echo "success" - else - echo "failed" - exit 1 - fi - - echo "trying to update to the specific version" - wbemerr cm "$installed_url" \ - "Update.Version=\"${up_ver}\",Release=\"${up_rel}\"" | - grep -q '\<Update:\s*1\s\+Installed' || \ - echo "wrong return code" - - if is_installed_nevra $name $up_epoch $up_ver $up_rel $arch; then - echo "success" - else - echo "failed" - exit 1 - fi -} - -test_remove() { - read name epoch ver rel arch updatable \ - up_epoch up_ver up_rel <<< "$@" - - echo "********************************************************************" - echo " * TEST REMOVE" - nevra_arr=($name $epoch $ver $rel $arch) - nevra=`make_nevra ${nevra_arr[@]}` - - if ! is_installed $name; then - echo "installing package \"${nevra}\" with yum" - install_pkg "$@" || exit 1 - fi - - local keys=`make_inst_keys ${nevra_arr[@]}` - local installed_keys="Software=$op.$keys,System=$computer_system_op" - local installed_url="$url/`make_op LMI_YumInstalledPackage $installed_keys`" - wbemerr di "$installed_url" - if is_installed $name; then - echo "failed to remove ${name}" - exit 1 - else - echo "success" - fi - local url="$url/$op.$keys" - if ! wbemerr gi "$url" |& \ - grep -q '\<SoftwareElementState="\?1"\?'; then - echo "wrong SoftwareElementState" - exit 1 - fi -} - - -for p in 1 2 -do - declare -a args - for ((i=0; i < ${#keys[@]}; i++)) do - key=${keys[$i]} - eval "args[\$i]=\${pkg${p}[\$key]}" - done - - test_install "${args[@]}" - test_remove "${args[@]}" - eval "updatable=\${pkg${p}[updatable]}" - [ "$updatable" == 1 ] && test_update "${args[@]}" -done - |