From 6c7aa38c608b18a71bc3b10ab14804f599cddf02 Mon Sep 17 00:00:00 2001 From: "Gustavo J. A. M. Carneiro" Date: Mon, 15 Sep 2008 11:45:32 +0100 Subject: [PATCH] Add python based csma-bridge regression test. Closes #344. --- regression/tests/test-csma-bridge.py | 16 +++++ regression/tests/test-wifi-wired-bridging.py | 2 +- wscript | 76 +++++++++++++++----- 3 files changed, 75 insertions(+), 19 deletions(-) create mode 100644 regression/tests/test-csma-bridge.py diff --git a/regression/tests/test-csma-bridge.py b/regression/tests/test-csma-bridge.py new file mode 100644 index 000000000..996bc1da9 --- /dev/null +++ b/regression/tests/test-csma-bridge.py @@ -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 diff --git a/regression/tests/test-wifi-wired-bridging.py b/regression/tests/test-wifi-wired-bridging.py index ac00ea860..cda3a3dfd 100644 --- a/regression/tests/test-wifi-wired-bridging.py +++ b/regression/tests/test-wifi-wired-bridging.py @@ -9,4 +9,4 @@ import tracediff 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"]) diff --git a/wscript b/wscript index fdd209121..cf2db428a 100644 --- a/wscript +++ b/wscript @@ -820,7 +820,26 @@ class Regression(object): 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 @@ class Regression(object): 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 @@ class Regression(object): #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 @@ def run_regression(): 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