RPM Package Manager, CVS Repository http://rpm5.org/cvs/ ____________________________________________________________________________
Server: rpm5.org Name: Jeff Johnson Root: /v/rpm/cvs Email: j...@rpm5.org Module: mancoosi Date: 05-Apr-2011 13:07:58 Branch: HEAD Handle: 2011040511075700 Modified files: mancoosi/framework rpmtest.py Log: - WIP. Summary: Revision Changes Path 1.5 +79 -123 mancoosi/framework/rpmtest.py ____________________________________________________________________________ patch -p0 <<'@@ .' Index: mancoosi/framework/rpmtest.py ============================================================================ $ cvs diff -u -r1.4 -r1.5 rpmtest.py --- mancoosi/framework/rpmtest.py 4 Apr 2011 19:20:35 -0000 1.4 +++ mancoosi/framework/rpmtest.py 5 Apr 2011 11:07:57 -0000 1.5 @@ -21,10 +21,6 @@ initial_contents = {} # PKGNAME: [(FILE, mtime),...] initial_versions = {} # PKGNAME: (NEVRA, INSTALLTID) -#mainrelease_dir = '/tmp/rpms/baseline/' -#multi_updates_dir = '/home/agrr/pacotes/multi-updates/' -#multi_release_dir = '/home/agrr/pacotes/multi-base/' -precondition_dir = "CM15/RPMS/" bin_rpm = "/bin/rpm" var_lib_rpm = '/var/lib/rpm/' @@ -45,16 +41,25 @@ self.maxdelay = maxdelay self.erase_maxdelay = maxdelay self.query_maxdelay = maxdelay + self.verify_maxdelay = maxdelay self.install_maxdelay = maxdelay self.ts = None self.killtimes = [] - self.success_cases = 0 - self.details = [0,0] # (no. of transactions, no. of nop transactions) + self.stats = {} + self.stats['tests_run'] = 0 + self.stats['tests_success'] = 0 + self.stats['tests_updated'] = 0 + self.stats['tests_nochange'] = 0 + self.stats['version_wrong'] = 0 # XXX unused + self.stats['files_wrong'] = 0 # XXX unused + self.stats['stale_lock'] = 0 self.stats['recover_failed'] = 0 self.stats['script_error'] = 0 + self.stats['deps_missing'] = 0 self.stats['file_truncated'] = 0 + self.stats['ldconfig_file_empty'] = 0 self.stats['config_rpmnew'] = 0 self.stats['config_rpmsave'] = 0 @@ -75,14 +80,18 @@ self.created_as = '^warning: (.*) created as (.*)' self.saved_as = '^warning: (.*) saved as (.*)' # ldconfig: file /usr/lib/libldap-2.4.so.2.5.5;4d99f2c1 is truncated - self.file_truncated = '^ldconfig: file ([^ ]*) is truncated' +# ldconfig: File /usr/lib/libmimerS.so.1.0.0;4d9a25ae is empty, not checked. + self.ldconfig_file_truncated = '^ldconfig: file ([^ ]*) is truncated' + self.ldconfig_file_empty = '^ldconfig: File ([^ ]*) is empty, not checked.' # warning: cleaning stale lock self.script_pats = [ +# bind 'rndc: decode base64 secret: bad base64 encoding', 'rndc: connect failed: 127.0.0.1#953: connection refused', +# openldap-servers + 'Usage: service -[Rfshv] SERVICE ARGUMENTS', ] - def bad(self, args): print colored(args, 'red') @@ -91,14 +100,14 @@ # Run a command. def run(self, args): - print 'Running: ' + str(args) +# print 'Running: ' + str(args) po = subprocess.Popen(args, stdout=None, stderr=None) res = po.wait() == 0 return res # Run a command with a watchdog timer. def timed(self, args, delay): - print 'Running(' + str(delay) + '): ' + str(args) +# print 'Running(' + str(delay) + '): ' + str(args) po = subprocess.Popen(args, stdout=None, stderr=None) pid = po.pid res = None @@ -118,7 +127,7 @@ # Run a command capturing stdout/stderr. def communicate(self, args): - print 'Running: ' + str(args) +# print 'Running: ' + str(args) xx = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() return xx @@ -140,14 +149,23 @@ continue mo = re.match(self.is_needed_by, l) if mo: + self.stats['deps_missing'] += 1 + self.bad("missing: " + mo.group(0)) continue - mo = re.match(self.file_truncated, l) + mo = re.match(self.ldconfig_file_truncated, l) if mo: fn = mo.group(1) - self.stats['file_truncated'] += 1 + self.stats['ldconfig_file_truncated'] += 1 self.bad("truncated: " + fn) os.unlink(fn) continue + mo = re.match(self.ldconfig_file_empty, l) + if mo: + fn = mo.group(1) + self.stats['ldconfig_file_empty'] += 1 + self.bad("empty: " + fn) + os.unlink(fn) + continue mo = re.match(self.created_as, l) if mo: fn = mo.group(2) @@ -199,7 +217,7 @@ def install_pkgset(self): xx = True for pkg in self.rpms: - args = [bin_rpm, '-Uvh', pkg] + args = [bin_rpm, '-U', '--nodeps', pkg] (stdout, stderr) = self.communicate(args) xx = self.print_filter("install", pkg, stdout, stderr) return xx @@ -211,17 +229,22 @@ bgn = time.time() args = [bin_rpm, '-U' ] + self.rpms xx = self.run(args) - self.install_maxdelay = (time.time() - bgn) * 1000. + self.install_maxdelay = 300 + (time.time() - bgn) * 1000. bgn = time.time() args = [bin_rpm, '-q' ] + self.pkgs xx = self.run(args) - self.query_maxdelay = (time.time() - bgn) * 1000. + self.query_maxdelay = 100 + (time.time() - bgn) * 1000. + + bgn = time.time() + args = [bin_rpm, '-V' ] + self.pkgs + xx = self.run(args) + self.verify_maxdelay = 500 + (time.time() - bgn) * 1000. bgn = time.time() args = [bin_rpm, '-e' ] + self.pkgs xx = self.run(args) - self.erase_maxdelay = (time.time() - bgn) * 1000. + self.erase_maxdelay = 300 + (time.time() - bgn) * 1000. return xx @@ -254,22 +277,6 @@ xx = True return xx - def test_case_single_pkg(self, pkg): - args = [bin_rpm, '-Uvh', ] - (p, filename) = pkg - args.append(filename) - - delay = (random.random() * self.maxdelay) / 1000. - print 'Running: ' + str(args) - po = subprocess.Popen(args, stdout=sys.stdout, stderr=sys.stderr) - pid = po.pid - self.killtimes.append(delay) - time.sleep(delay) - po.kill() - sys.stderr.write('Killed pid('+str(pid)+') after %f\n' % delay) - xx = True - return xx - def queryByPkgName(self, name): if not self.ts: self.ts = rpm.TransactionSet() @@ -335,8 +342,6 @@ # Post-mortem test results analysis. def postmortem(self, opts): - version_wrong = 0 - files_wrong = 0 was_updated = 0 not_updated = 0 @@ -361,15 +366,9 @@ for (p, file) in self.pkgset: iniNEVRA = initial_versions[p] curNEVRA = self.printNEVRA(p) - if iniNEVRA and curNEVRA and iniNEVRA != curNEVRA: - print '''Initial version: %s -Current version: %s -''' % (iniNEVRA, curNEVRA) if iniNEVRA and iniNEVRA != curNEVRA: - self.bad('Version for pkg %s is different' % p) was_updated += 1 else: - self.good('Version for pkg %s is the same' % p) not_updated += 1 xx = self.verify('-V', p) @@ -377,17 +376,15 @@ self.ts = None if was_updated > 0 and not_updated > 0: - self.bad('Multiple-package test failed') res = False else: - self.good('Multiple-package test success') if was_updated == 0: - self.details[1] += 1 + self.stats['tests_nochange'] += 1 else: - self.details[0] += 1 + self.stats['tests_updated'] += 1 res = True - self.success_cases += 1 + self.stats['tests_success'] += 1 print '''Within this transaction %d pkgs were updated and %d were not updated''' \ % (was_updated, not_updated) @@ -407,14 +404,12 @@ break # Assumes single match if h and h[rpm.RPMTAG_FILENAMES]: for file in h[rpm.RPMTAG_FILENAMES]: -# print "<-- listPkgContent(ts, " + name + ") fn " + file yield file def fileTimestamp(filePath): try: timestamp = os.stat(filePath).st_mtime -# print "<-- fileTimestamp(" + filePath + ")" return timestamp except OSError: @@ -577,48 +572,36 @@ 'Failures timestamps', 'Kill interval (sec)']] package_sets = [ - 'bind,bind-doc', - 'apache-mpm-prefork,apache-modules,apache-base,libapr-util1', 'openldap,libldap2.4_2,openldap-clients,openldap-doc,openldap-extra-schemas,openldap-servers,libunixODBC1', + 'bind,bind-doc', 'ruby,ruby-devel,ruby-doc', 'ghostscript,ghostscript-X,ghostscript-common,ghostscript-doc', - 'git,gitk,perl-Git,git-core-1.7.1,git-cvs,git-email,git-svn', 'mysql,mysql-bench,mysql-client,mysql-common-core-5.1.46,mysql-common-5.1.46,mysql-core,libmysql16', + 'apache-mpm-prefork,apache-modules,apache-base,libapr-util1', + 'git,gitk,perl-Git,git-core-1.7.1,git-cvs,git-email,git-svn,libcurl4,openldap,libldap2.4_2', - 'postgresql8.3,postgresql8.3-contrib,postgresql8.3-devel,postgresql8.3-docs', - 'beagle,beagle-crawl-system,beagle-evolution', - 'evolution,evolution-data-server,evolution-exchange', +# 'postgresql8.3,postgresql8.3-contrib,postgresql8.3-devel,postgresql8.3-docs', +# 'beagle,beagle-crawl-system,beagle-evolution', +# 'evolution,evolution-data-server,evolution-exchange', ] + if opts.package_set <= 0: + opts.package_set = 1 - if opts.package_set and not opts.singlepkg: - ts = rpm.TransactionSet() - for pkgname in package_sets[opts.package_set - 1].split(','): - pat = args[0] + os.path.sep + pkgname + '-' - if string.find(pkgname, '-') < 0: - pat += '[0-9]' - pat += '*.rpm' - flist = glob.glob(pat) - for file in flist: - if pkgname not in initial_versions.keys(): - initial_contents[pkgname] = [(f, fileTimestamp(f)) - for f in listPkgContent(ts, pkgname)] - initial_versions[pkgname] = printNVRA(ts, pkgname) - to_upgrade_multi.add((pkgname, file)) - del ts - else: - ts = rpm.TransactionSet() - flist = os.listdir(args[0]) + ts = rpm.TransactionSet() + for pkgname in package_sets[opts.package_set - 1].split(','): + pat = args[0] + os.path.sep + pkgname + '-' + if string.find(pkgname, '-') < 0: + pat += '[0-9]' + pat += '*.rpm' + flist = glob.glob(pat) for file in flist: - if fnmatch.fnmatch(file, '*.rpm'): - basename = os.path.splitext(file)[0] # Remove extension - pkgname = pkgNameFromNEVRA(basename) - filename = args[0] + os.path.sep + file - to_upgrade.append((pkgname, filename)) + if pkgname not in initial_versions.keys(): initial_contents[pkgname] = [(f, fileTimestamp(f)) for f in listPkgContent(ts, pkgname)] initial_versions[pkgname] = printNVRA(ts, pkgname) - del ts + to_upgrade_multi.add((pkgname, file)) + del ts if opts.debug: print 'Selected %d Packages for Upgrades: \n%s' \ @@ -634,63 +617,36 @@ max_delay = (args[1] if len(args) > 1 else 3000.) uut = Uut(to_upgrade_multi, niters=n_iters, maxdelay=max_delay) + if uut.npkgs <= 0: + sys.exit(0) if opts.singlepkg: pkg_test = random.choice(to_upgrade) # Same-pkg test - else: # Calibrate maxdelay from actual install time + else: # Calibrate maxdelay from actual install/query/erase times xx = uut.calibrate() for n in range(uut.niters): - if opts.singlepkg: - # pkg_test = args[3] if len(args) > 3 else random.choice(to_upgrade)[1] - # pkg_test = random.choice(to_upgrade) #Random package test - # to_upgrade.remove(pkg_test) #Avoid repeating the choice - - (p, filename) = pkg_test - xx = uut.erase_pkgset(p) - uut.test_case_single_pkg(pkg_test) - if checkResultsSinglePkg(uut, p): - uut.success_cases += 1 - -# to_rollback = [] -# if initial_versions[p]: -# to_rollback.append(precondition_dir -# + initial_versions[p] + '.rpm') -# if to_rollback: -# uut.rollback(to_rollback) - - else: - - if uut.npkgs > 0: - - # Run an install test - xx = uut.prenatal('-Uvh') - xx = uut.test_case('-Uvh') - xx = uut.postmortem('-Uvh') - - # Run an erase test - xx = uut.prenatal('-ev') - xx = uut.test_case('-ev') - xx = uut.postmortem('-ev') - -# to_rollback = [] -# for (p, filename) in uut.pkgset: -# if initial_versions[p]: -# to_rollback.append(precondition_dir -# + initial_versions[p] + '.rpm') -# -# if to_rollback: -# uut.rollback(to_rollback) + # Run an install test + xx = uut.prenatal('-Uvh') + xx = uut.test_case('-Uvh') + xx = uut.postmortem('-Uvh') + uut.stats['tests_run'] += 1 + + # Run an erase test + xx = uut.prenatal('-ev') + xx = uut.test_case('-ev') + xx = uut.postmortem('-ev') + uut.stats['tests_run'] += 1 # Final clean-up xx = uut.prenatal('-Uvh') print 'Test aggregate results: %d/%d pkgs' \ - % (uut.success_cases, 2 * uut.niters) - if not opts.singlepkg: - print 'Multiple package test details: %d transactions to completion /%d initial state' \ - % (uut.details[0], uut.details[1]) + % (uut.stats['tests_success'], uut.stats['tests_run']) + + print 'Multiple package test details: %d transactions to completion /%d initial state' \ + % (uut.stats['tests_updated'], uut.stats['tests_nochange']) print 'Average killtimes: %f' % (sum(uut.killtimes) / len(uut.killtimes)) @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository rpm-cvs@rpm5.org