summaryrefslogtreecommitdiffstats
path: root/ipc/ipdl/test/ipdl/IPDLCompile.py
diff options
context:
space:
mode:
Diffstat (limited to 'ipc/ipdl/test/ipdl/IPDLCompile.py')
-rw-r--r--ipc/ipdl/test/ipdl/IPDLCompile.py78
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)
+ )