summaryrefslogtreecommitdiffstats
path: root/test-framework/checker/testrunner
diff options
context:
space:
mode:
Diffstat (limited to 'test-framework/checker/testrunner')
-rw-r--r--test-framework/checker/testrunner/__init__.py1
-rw-r--r--test-framework/checker/testrunner/files.py33
-rw-r--r--test-framework/checker/testrunner/logger.py0
-rw-r--r--test-framework/checker/testrunner/registry.py21
-rw-r--r--test-framework/checker/testrunner/testexception.py5
-rw-r--r--test-framework/checker/testrunner/testrunner.py90
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