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