diff options
Diffstat (limited to 'test-framework/checker/testrunner')
-rw-r--r-- | test-framework/checker/testrunner/__init__.py | 1 | ||||
-rw-r--r-- | test-framework/checker/testrunner/files.py | 33 | ||||
-rw-r--r-- | test-framework/checker/testrunner/logger.py | 0 | ||||
-rw-r--r-- | test-framework/checker/testrunner/registry.py | 21 | ||||
-rw-r--r-- | test-framework/checker/testrunner/testexception.py | 5 | ||||
-rw-r--r-- | test-framework/checker/testrunner/testrunner.py | 90 |
6 files changed, 150 insertions, 0 deletions
diff --git a/test-framework/checker/testrunner/__init__.py b/test-framework/checker/testrunner/__init__.py new file mode 100644 index 000000000..210f31223 --- /dev/null +++ b/test-framework/checker/testrunner/__init__.py @@ -0,0 +1 @@ +# init.py diff --git a/test-framework/checker/testrunner/files.py b/test-framework/checker/testrunner/files.py new file mode 100644 index 000000000..629bedd05 --- /dev/null +++ b/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/test-framework/checker/testrunner/logger.py b/test-framework/checker/testrunner/logger.py new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/test-framework/checker/testrunner/logger.py diff --git a/test-framework/checker/testrunner/registry.py b/test-framework/checker/testrunner/registry.py new file mode 100644 index 000000000..854a029f3 --- /dev/null +++ b/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/test-framework/checker/testrunner/testexception.py b/test-framework/checker/testrunner/testexception.py new file mode 100644 index 000000000..58254a599 --- /dev/null +++ b/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/test-framework/checker/testrunner/testrunner.py b/test-framework/checker/testrunner/testrunner.py new file mode 100644 index 000000000..fcef00b02 --- /dev/null +++ b/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 |