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

Reply via email to