#!/usr/bin/env python # Copyright (c) 2010 Red Hat, Inc. All rights reserved. This copyrighted material # is made available to anyone wishing to use, modify, copy, or # redistribute it subject to the terms and conditions of the GNU General # Public License v.2. # # This program is distributed in the hope that it will be useful, but WITHOUT ANY # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # # Author: David Sommerseth # import os, sys class UnitTest(object): "Unified unit test class" def __init__(self, srcrootdir): "UnitTest constructor. srcrootdir argument must point at the source root directory" self.imported_mods = [] self.mod_impcount = 0 self.mod_impfail = 0 self.mod_testpass = 0 self.mod_testfail = 0 self.mod_testmiss = 0 self.rootdir = srcrootdir sys.path.insert(0, self.rootdir) def LoadModules(self, modules): """Loads all the defined modules. The modules argument takes a tuple list consisting of ('subdir','module name')""" for (directory, mod) in modules: # Check if the directory is in the "include" path try: sys.path.index('%s/%s' % (self.rootdir,directory)) except ValueError: # Not found, insert it sys.path.insert(0, '%s/%s' % (self.rootdir, directory)) try: impmod = __import__(mod) print "** Imported %s/%s" % (directory, mod) self.imported_mods.append({'name': '%s/%s' %(directory, mod), 'module': impmod}) self.mod_impcount += 1 except ImportError, e: print "!! ** ERROR ** Failed to import %s/%s (Exception: %s)" % (directory, mod, str(e)) self.mod_impfail += 1 return True def RunTests(self): "Runs the unit_test() function in all successfully imported modules" for m in self.imported_mods: try: # Check if the unit_test() function exists and is callable before trying # to run the unit test if callable(m['module'].unit_test): print print 78 * '-' print "** Running unit test for: %s" % m['name'] print 78 * '.' res = m['module'].unit_test(self.rootdir) print 78 * '.' if res == 0: print "** Result of %s: PASS" % m['name'] self.mod_testpass += 1 else: print "** Result of %s: FAILED (return code: %s)" % (m['name'], str(res)) self.mod_testfail += 1 print 78 * '=' else: self.mod_testmiss += 1 print "!!! ** ERROR ** Could not run %s::unit_test()" % m['name'] except AttributeError: self.mod_testmiss += 1 print "!!! ** ERROR ** No %s::unit_test() method found" % m['name'] def PrintTestSummary(self): "Prints a result summary of all the tests" print print " --------------------" print " ** TEST SUMMARY ** " print " --------------------" print print " - Modules:" print " Declared for test: %i" % (self.mod_impcount + self.mod_impfail) print " Successfully imported: %i" % self.mod_impcount print " Failed import: %i" % self.mod_impfail print print " - Tests:" print " Tests scheduled: %i" % (self.mod_testpass + self.mod_testfail + self.mod_testmiss) print " Sucessfully tests: %i" % self.mod_testpass print " Failed tests: %i" % self.mod_testfail print " Missing unit_test() %i" % self.mod_testmiss print if __name__ == '__main__': # Retrieve the root directory if the source dir # - use the first occurence of the 'v7' subdir as the root dirq srcrootdir_ar = os.getcwd().split('/') rootdir = '/'.join(srcrootdir_ar[0:srcrootdir_ar.index('rteval')+1]) print "** Source root dir: %s" % rootdir # Prepare the unit tester tests = UnitTest(rootdir) # Load defined modules ('subdir','import name') tests.LoadModules(( ('rteval','cputopology'), ('rteval','dmi'), ('rteval','rtevalConfig'), ('rteval','xmlout'), ('server','unittest') )) # Run all tests tests.RunTests() tests.PrintTestSummary()