diff options
Diffstat (limited to 'tests/test-framework/checker')
-rw-r--r-- | tests/test-framework/checker/run.py | 51 | ||||
-rw-r--r-- | tests/test-framework/checker/scripts/generate-filelist.py | 41 | ||||
-rw-r--r-- | tests/test-framework/checker/testrunner/__init__.py | 1 | ||||
-rw-r--r-- | tests/test-framework/checker/testrunner/files.py | 33 | ||||
-rw-r--r-- | tests/test-framework/checker/testrunner/logger.py | 0 | ||||
-rw-r--r-- | tests/test-framework/checker/testrunner/registry.py | 21 | ||||
-rw-r--r-- | tests/test-framework/checker/testrunner/testexception.py | 5 | ||||
-rw-r--r-- | tests/test-framework/checker/testrunner/testrunner.py | 90 |
8 files changed, 242 insertions, 0 deletions
diff --git a/tests/test-framework/checker/run.py b/tests/test-framework/checker/run.py new file mode 100644 index 000000000..137fafb94 --- /dev/null +++ b/tests/test-framework/checker/run.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +import optparse, sys +from testrunner import testrunner + +from xml.sax.saxutils import XMLGenerator +from xml.sax.xmlreader import AttributesNSImpl + +class Writer: + def __init__( self, out ): + self._out = out + self.gen = XMLGenerator( out, 'utf-8' ) + self.gen.startDocument() + self.gen.startElement( 'results', {} ) + + def addResult( self, name, status, errstr ): + self.gen.startElement('result', { 'name':name, 'status':status } ) + self.gen.characters( errstr ) + self.gen.endElement('result' ) + + def addFailed( self, name, errstr ): + self.addResult( name, "failed", errstr ) + + def addPassed( self, status, errstr ): + self.addResult( name, "passed", errstr ) + + def finalize( self ): + self.gen.endElement( 'results' ) + self.gen.endDocument + self._out.write( '\n' ) + +optionParser = optparse.OptionParser(usage="%prog [options] testcaseDir", version="%prog 0.1") +optionParser.add_option("-p", "--omit-prefix", dest="prefix", help="for file checks, prefix relative paths with this prefix", metavar="PREFIX" ) +optionParser.add_option("-o", "--output", dest="output", help="write results to file (instead of stdout)", metavar="OUTPUT" ) +(options, args) = optionParser.parse_args() + +try: + testdir = args[0] +except IndexError: + optionParser.print_usage( sys.stderr ) + sys.exit( 1 ) + +out = sys.stdout +if options.output != None: + out = file( options.output, 'wb' ) + +writer = Writer( out ) +try: + runner = testrunner.TestRunner( testdir, options.prefix, writer ) + runner.run() +finally: + writer.finalize()
\ No newline at end of file diff --git a/tests/test-framework/checker/scripts/generate-filelist.py b/tests/test-framework/checker/scripts/generate-filelist.py new file mode 100644 index 000000000..ba4929304 --- /dev/null +++ b/tests/test-framework/checker/scripts/generate-filelist.py @@ -0,0 +1,41 @@ +#!/usr/bin/python +import optparse, os, sys +from testrunner import files, testrunner + +class GenerateException( Exception ): + def __init__( self, value ): + self.value = value + def __str__( self ): + return repr( self.value ) + +def relpath( path, prefix ): + if prefix != None: + return os.path.relpath( path, prefix ) + else: + return path; + +out = sys.stdout + +def walker( prefix, current_dir, children ): + for c in children: + child = current_dir + os.sep + c + if os.path.isdir( child ): + continue + fileObj = file( child, 'rb' ) + md5 = files.md5sum( fileObj ) + out.write( "{0}; {1}; {2}\n".format( relpath( child, prefix ), os.path.getsize( child ), md5 ) ) + +optionParser = optparse.OptionParser(usage="%prog [options] directory", version="%prog 0.1") +optionParser.add_option("-p", "--omit-prefix", dest="prefix", help="make entries relative to this prefix", metavar="PREFIX" ) +optionParser.add_option("-o", "--output", dest="output", help="save file list to file (instead of stdout)", metavar="OUTPUT" ) +(options, args) = optionParser.parse_args() + +try: + directory = args[0] +except IndexError: + raise GenerateException( "No directory given.") + +if options.output != None: + out = file( options.output, 'wb' ) + +os.path.walk( directory, walker, options.prefix ) diff --git a/tests/test-framework/checker/testrunner/__init__.py b/tests/test-framework/checker/testrunner/__init__.py new file mode 100644 index 000000000..210f31223 --- /dev/null +++ b/tests/test-framework/checker/testrunner/__init__.py @@ -0,0 +1 @@ +# init.py diff --git a/tests/test-framework/checker/testrunner/files.py b/tests/test-framework/checker/testrunner/files.py new file mode 100644 index 000000000..629bedd05 --- /dev/null +++ b/tests/test-framework/checker/testrunner/files.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +from testexception import TestException + +import fnmatch, hashlib, os + +def md5sum( fileObj ): + md5 = hashlib.md5() + while True: + chunk = fileObj.read( 4096 ) + if not chunk: + break + md5.update( chunk ) + return md5.hexdigest() + +def locateFiles( rootPath, pattern ): + for path, dirs, files in os.walk( os.path.abspath( rootPath ) ): + for filename in fnmatch.filter( files, pattern ): + yield os.path.join( path, filename ) + +def checkFileImpl( path, expectedSize=-1, expectedMd5=None ): + #TODO: normalize path/convert to platform + if not os.path.exists( path ): + raise TestException( '{0}: file does not exist'.format( path ) ) + size = os.path.getsize( path ) + if expectedSize >= 0 and size != expectedSize: + raise TestException( '{0}: unexpected size. Actual: {1} Expected: {2}'.format( path, size, expectedSize ) ) + if ( expectedMd5 != None ): + fileObj = file( path, 'rb' ) + md5 = md5sum( fileObj ) + fileObj.close() + if md5 != expectedMd5: + raise TestException( '{0}: md5sum mismatch. Actual: {1} Expected: {2}'.format( path, md5, expectedMd5 ) ) + diff --git a/tests/test-framework/checker/testrunner/logger.py b/tests/test-framework/checker/testrunner/logger.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/tests/test-framework/checker/testrunner/logger.py diff --git a/tests/test-framework/checker/testrunner/registry.py b/tests/test-framework/checker/testrunner/registry.py new file mode 100644 index 000000000..854a029f3 --- /dev/null +++ b/tests/test-framework/checker/testrunner/registry.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +from testexception import TestException +import _winreg + +_registry = dict() +_registry["HKEY_CLASSES_ROOT"] = _winreg.HKEY_CLASSES_ROOT +_registry["HKEY_CURRENT_USER"] = _winreg.HKEY_CURRENT_USER +_registry["HKEY_LOCAL_MACHINE"] = _winreg.HKEY_LOCAL_MACHINE +_registry["HKEY_USERS"] = _winreg.HKEY_USERS +_registry["HKEY_CURRENT_CONFIG"] = _winreg.HKEY_CURRENT_CONFIG + +def splitKey( key ): + key, seperator, subKey = key.partition( '\\' ) + return _registry[key], subKey + +def checkKey( key, value, expectedData ): + baseKey, subKey = splitKey( key ) + keyHandle = _winreg.OpenKey( baseKey, subKey ) + data, _ = _winreg.QueryValueEx( keyHandle, value ) + if data != expectedData: + raise TestException( '{0}: unexpected registry data. Actual: {1} Expected: {2}'.format( key, data, expectedData ) ) diff --git a/tests/test-framework/checker/testrunner/testexception.py b/tests/test-framework/checker/testrunner/testexception.py new file mode 100644 index 000000000..58254a599 --- /dev/null +++ b/tests/test-framework/checker/testrunner/testexception.py @@ -0,0 +1,5 @@ +class TestException( Exception ): + def __init__( self, value ): + self.value = value + def __str__( self ): + return repr( self.value ) diff --git a/tests/test-framework/checker/testrunner/testrunner.py b/tests/test-framework/checker/testrunner/testrunner.py new file mode 100644 index 000000000..fcef00b02 --- /dev/null +++ b/tests/test-framework/checker/testrunner/testrunner.py @@ -0,0 +1,90 @@ +# -*- coding: utf-8 -*- +import files, os, string, platform +from testexception import TestException + +if ( platform.system() == "Windows" ): + import registry + +def makeAbsolutePath( path, relativeTo ): + if os.path.isabs( path ) or relativeTo == None: + return path + else: + return relativeTo + os.sep + path + + +class TestRunner: + def __init__( self, testDir, basedir, result ): + self._testDir = testDir + self._basedir = basedir + self._result = result + + def checkFile( self, name, size=-1, expectedMd5=None ): + try: + files.checkFileImpl( name, size, expectedMd5 ) + except TestException as e: + self._result.addFailed( name, e.value ) + + def checkFileList( self, path ): + lineNum = 0 + haveError = False + with open( path, 'r' ) as f: + while True: + line = f.readline() + lineNum += 1 + if not line: + break + line = string.strip( line ) + if len( line ) == 0: + continue + segments = string.split( line, ';' ) + if len( segments ) == 3: + fp = makeAbsolutePath( segments[0], self._basedir ) + try: + fs = int( segments[1] ) + except ValueError: + fs = -1 #TODO handle error + femd5 = segments[2] + femd5 = string.strip( femd5 ) + self.checkFile( fp, fs, femd5 ) + else: + self._result.addFailed( path + '_' + str( lineNum ), "Could not parse file list entry: " + line ) + haveError = True + if not haveError: + self._result.addPassed( path, "" ) + + def checkRegistryList( self, path ): + haveError = False + lineNum = 0 + with open( path, 'r' ) as f: + while True: + lineNum += 1 + line = f.readline() + if not line: + break + line = string.strip( line ) + if len( line ) == 0: + continue + segments = string.split( line, ';' ) + if len( segments ) == 3: + key = segments[0].strip() + value = segments[1].strip() + expectedData = segments[2].strip() + registry.checkKey( key, value, expectedData ) + else: + self._result.addFailed( path + '_' + str( lineNum ), "Could not parse registry list entry: " + line ) + haveError = True + if not haveError: + self._result.addPassed( path, "" ) + + def run( self ): + fileLists = files.locateFiles( self._testDir, "*.filelist" ) + for i in fileLists: + self.checkFileList( i ) + + if ( platform.system() == "Windows" ): + registryLists = files.locateFiles( self._testDir, "*.registrylist" ) + for i in registryLists: + self.checkRegistryList( i ) + + # run all .py's in testdir + # execute all filelists |