diff options
Diffstat (limited to 'ipc/ipdl/test/ipdl/runtests.py')
-rw-r--r-- | ipc/ipdl/test/ipdl/runtests.py | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/ipc/ipdl/test/ipdl/runtests.py b/ipc/ipdl/test/ipdl/runtests.py new file mode 100644 index 0000000000..7338c7087a --- /dev/null +++ b/ipc/ipdl/test/ipdl/runtests.py @@ -0,0 +1,116 @@ +import os +import unittest + +from IPDLCompile import IPDLCompile + + +class IPDLTestCase(unittest.TestCase): + def __init__(self, ipdlargv, filename): + unittest.TestCase.__init__(self, "test") + self.filename = filename + self.compile = IPDLCompile(filename, ipdlargv) + + def test(self): + self.compile.run() + self.assertFalse(self.compile.exception(), self.mkFailMsg()) + self.checkPassed() + + def mkCustomMsg(self, msg): + return """ +### Command: %s +### %s +### stderr: +%s""" % ( + " ".join(self.compile.argv), + msg, + self.compile.stderr, + ) + + def mkFailMsg(self): + return """ +### Command: %s +### stderr: +%s""" % ( + " ".join(self.compile.argv), + self.compile.stderr, + ) + + def shortDescription(self): + return '%s test of "%s"' % (self.__class__.__name__, self.filename) + + +class OkTestCase(IPDLTestCase): + """An invocation of the IPDL compiler on a valid specification. + The IPDL compiler should not produce errors or exceptions.""" + + def __init__(self, ipdlargv, filename): + IPDLTestCase.__init__(self, ipdlargv, filename) + + def checkPassed(self): + self.assertTrue(self.compile.ok(), self.mkFailMsg()) + + +class ErrorTestCase(IPDLTestCase): + """An invocation of the IPDL compiler on an *invalid* specification. + The IPDL compiler *should* produce errors but not exceptions.""" + + def __init__(self, ipdlargv, filename): + IPDLTestCase.__init__(self, ipdlargv, filename) + + # Look for expected errors in the input file. + f = open(filename, "r") + self.expectedErrorMessage = [] + for l in f: + if l.startswith("//error:"): + self.expectedErrorMessage.append(l[2:-1]) + f.close() + + def checkPassed(self): + self.assertNotEqual( + self.expectedErrorMessage, + [], + self.mkCustomMsg( + "Error test should contain at least " + + "one line starting with //error: " + + "that indicates the expected failure." + ), + ) + + for e in self.expectedErrorMessage: + self.assertTrue( + self.compile.error(e), + self.mkCustomMsg('Did not see expected error "' + e + '"'), + ) + + +if __name__ == "__main__": + import sys + + okdir = sys.argv[1] + assert os.path.isdir(okdir) + errordir = sys.argv[2] + assert os.path.isdir(errordir) + + ipdlargv = [] + oksuite = unittest.TestSuite() + errorsuite = unittest.TestSuite() + + oktests, errortests = False, False + for arg in sys.argv[3:]: + if errortests: + # The extra subdirectory is used for non-failing files we want + # to include from failing files. + errorIncludes = ["-I", os.path.join(errordir, "extra"), "-I", errordir] + errorsuite.addTest(ErrorTestCase(ipdlargv + errorIncludes, arg)) + elif oktests: + if "ERRORTESTS" == arg: + errortests = True + continue + oksuite.addTest(OkTestCase(ipdlargv + ["-I", okdir], arg)) + else: + if "OKTESTS" == arg: + oktests = True + continue + ipdlargv.append(arg) + + (unittest.TextTestRunner()).run(unittest.TestSuite([oksuite, errorsuite])) |