Add python based csma-bridge regression test. Closes #344.
authorGustavo J. A. M. Carneiro <gjc@inescporto.pt>
Mon, 15 Sep 2008 11:45:32 +0100
changeset 3697 97c84e70a7db
parent 3696 559a7114a1e6
child 3699 29473501ade8
Add python based csma-bridge regression test. Closes #344.
regression/tests/test-csma-bridge.py
regression/tests/test-wifi-wired-bridging.py
wscript
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/regression/tests/test-csma-bridge.py	Mon Sep 15 11:45:32 2008 +0100
@@ -0,0 +1,16 @@
+#! /usr/bin/env python
+
+"""Generic trace-comparison-type regression test."""
+
+import os
+import sys
+import tracediff
+
+def run(verbose, generate, refDirName):
+    """Execute a test."""
+    if tracediff.env['ENABLE_PYTHON_BINDINGS']:
+        return tracediff.run_test(verbose, generate, refDirName,
+                                  "csma-bridge", pyscript=os.path.join('examples', 'csma-bridge.py'))
+    else:
+        print >> sys.stderr, "Skipping csma-bridge: Python bindings not available."
+        raise NotImplementedError
--- a/regression/tests/test-wifi-wired-bridging.py	Mon Sep 15 11:39:15 2008 +0100
+++ b/regression/tests/test-wifi-wired-bridging.py	Mon Sep 15 11:45:32 2008 +0100
@@ -9,4 +9,4 @@
 def run(verbose, generate, refDirName):
     """Execute a test."""
 
-    return tracediff.run_test(verbose, generate, refDirName, "wifi-wired-bridging", "--SendIp=0")
+    return tracediff.run_test(verbose, generate, refDirName, "wifi-wired-bridging", ["--SendIp=0"])
--- a/wscript	Mon Sep 15 11:39:15 2008 +0100
+++ b/wscript	Mon Sep 15 11:45:32 2008 +0100
@@ -820,7 +820,26 @@
         self.testdir = testdir
         self.env = Params.g_build.env_of_name('default')
 
-    def run_test(self, verbose, generate, refDirName, testName, *arguments):
+    def run_test(self, verbose, generate, refDirName, testName, arguments=[], pyscript=None):
+        """
+        @param verbose: enable verbose execution
+
+        @param generate: generate new traces instead of comparing with the reference
+
+        @param refDirName: name of the base directory containing reference traces
+
+        @param testName: name of the test
+
+        @arguments: list of extra parameters to pass to the program to be tested
+
+        @pyscript: if not None, the test is written in Python and this
+        parameter contains the path to the python script, relative to
+        the project root dir
+
+        """
+        if not isinstance(arguments, list):
+            raise TypeError
+        
         refTestDirName = os.path.join(refDirName, (testName + ".ref"))
 
         if not os.path.exists(refDirName):
@@ -832,12 +851,20 @@
                 print "creating new " + refTestDirName
                 os.mkdir(refTestDirName)
 
-            Params.g_options.cwd_launch = refTestDirName
-            tmpl = "%s"
-            for arg in arguments:
-                tmpl = tmpl + " " + arg
-            run_program(testName, tmpl)
-
+            if pyscript is None:
+                Params.g_options.cwd_launch = refTestDirName
+                tmpl = "%s"
+                for arg in arguments:
+                    tmpl = tmpl + " " + arg
+                run_program(testName, tmpl)
+            else:
+                argv = [self.env['PYTHON'], os.path.join('..', '..', '..', *os.path.split(pyscript))] + arguments
+                before = os.getcwd()
+                os.chdir(refTestDirName)
+                try:
+                    _run_argv(argv)
+                finally:
+                    os.chdir(before)
             print "Remember to commit " + refTestDirName
             return 0
         else:
@@ -850,13 +877,23 @@
 
             #os.system("./waf --cwd regression/traces --run " +
             #  testName + " > /dev/null 2>&1")
-            Params.g_options.cwd_launch = "traces"
-            run_program(testName, command_template=get_command_template(*arguments))
+
+            if pyscript is None:
+                Params.g_options.cwd_launch = "traces"
+                run_program(testName, command_template=get_command_template(*arguments))
+            else:
+                argv = [self.env['PYTHON'], os.path.join('..', '..', *os.path.split(pyscript))] + arguments
+                before = os.getcwd()
+                os.chdir("traces")
+                try:
+                    _run_argv(argv)
+                finally:
+                    os.chdir(before)
 
             if verbose:
                 #diffCmd = "diff traces " + refTestDirName + " | head"
                 diffCmd = subprocess.Popen([self.env['DIFF'], "traces", refTestDirName],
-                                           stdout=dev_null())
+                                           stdout=subprocess.PIPE)
                 headCmd = subprocess.Popen("head", stdin=diffCmd.stdout)
                 rc2 = headCmd.wait()
                 diffCmd.stdout.close()
@@ -943,15 +980,18 @@
     bad = []
 
     for test in tests:
-        result = _run_regression_test(test)
-        if result == 0:
-            if Params.g_options.regression_generate:
-                print "GENERATE " + test
+        try:
+            result = _run_regression_test(test)
+            if result == 0:
+                if Params.g_options.regression_generate:
+                    print "GENERATE " + test
+                else:
+                    print "PASS " + test
             else:
-                print "PASS " + test
-        else:
-            bad.append(test)
-            print "FAIL " + test
+                bad.append(test)
+                print "FAIL " + test
+        except NotImplementedError:
+                print "SKIP " + test            
 
     return len(bad) > 0