diff options
Diffstat (limited to 'ipc/ipdl/test/ipdl/IPDLCompile.py')
-rw-r--r-- | ipc/ipdl/test/ipdl/IPDLCompile.py | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/ipc/ipdl/test/ipdl/IPDLCompile.py b/ipc/ipdl/test/ipdl/IPDLCompile.py new file mode 100644 index 0000000000..bfaf7860d6 --- /dev/null +++ b/ipc/ipdl/test/ipdl/IPDLCompile.py @@ -0,0 +1,78 @@ +import copy +import os +import re +import subprocess +import tempfile + +# We test the compiler indirectly, rather than reaching into the ipdl/ +# module, to make the testing framework as general as possible. + + +class IPDLCompile: + def __init__(self, specfilename, ipdlargv=["python", "ipdl.py"]): + self.argv = copy.deepcopy(ipdlargv) + self.specfilename = specfilename + self.stdout = None + self.stderr = None + self.returncode = None + + def run(self): + """Run |self.specfilename| through the IPDL compiler.""" + assert self.returncode is None + + tmpoutdir = tempfile.mkdtemp(prefix="ipdl_unit_test") + + try: + self.argv.extend(["-d", tmpoutdir, self.specfilename]) + + proc = subprocess.Popen( + args=self.argv, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + universal_newlines=True, + ) + self.stdout, self.stderr = proc.communicate() + + self.returncode = proc.returncode + assert self.returncode is not None + + finally: + for root, dirs, files in os.walk(tmpoutdir, topdown=0): + for name in files: + os.remove(os.path.join(root, name)) + for name in dirs: + os.rmdir(os.path.join(root, name)) + os.rmdir(tmpoutdir) + + if proc.returncode is None: + proc.kill() + + def completed(self): + return ( + self.returncode is not None + and isinstance(self.stdout, str) + and isinstance(self.stderr, str) + ) + + def error(self, expectedError): + """Return True iff compiling self.specstring resulted in an + IPDL compiler error.""" + assert self.completed() + + errorRe = re.compile(re.escape(expectedError)) + return None is not re.search(errorRe, self.stderr) + + def exception(self): + """Return True iff compiling self.specstring resulted in a Python + exception being raised.""" + assert self.completed() + + return None is not re.search(r"Traceback (most recent call last):", self.stderr) + + def ok(self): + """Return True iff compiling self.specstring was successful.""" + assert self.completed() + + return ( + not self.exception() and not self.error("error:") and (0 == self.returncode) + ) |