Add a --with-regression-traces configure option, to allow using externally supplied regression traces instead of fetching them from the network.
authorGustavo J. A. M. Carneiro <gjc@inescporto.pt>
Wed, 19 Nov 2008 17:17:07 +0000
changeset 3872 8e757a83fb36
parent 3868 827884bf1356
child 3873 2ad80d9647f0
Add a --with-regression-traces configure option, to allow using externally supplied regression traces instead of fetching them from the network.
regression.py
regression/tests/test-csma-bridge.py
regression/tests/test-csma-broadcast.py
regression/tests/test-csma-multicast.py
regression/tests/test-csma-one-subnet.py
regression/tests/test-csma-packet-socket.py
regression/tests/test-csma-ping.py
regression/tests/test-csma-raw-ip-socket.py
regression/tests/test-csma-star.py
regression/tests/test-realtime-udp-echo.py
regression/tests/test-simple-error-model.py
regression/tests/test-simple-global-routing.py
regression/tests/test-simple-point-to-point-olsr.py
regression/tests/test-tcp-large-transfer.py
regression/tests/test-tcp-nsc-lfn.py
regression/tests/test-udp-echo.py
regression/tests/test-wifi-wired-bridging.py
wscript
--- a/regression.py	Tue Nov 18 15:12:12 2008 +0000
+++ b/regression.py	Wed Nov 19 17:17:07 2008 +0000
@@ -42,18 +42,17 @@
 
 ### Regression testing
 class Regression(object):
-    def __init__(self, testdir):
+    def __init__(self, testdir, reference_traces):
         self.testdir = testdir
+        self.reference_traces = reference_traces
         self.env = Params.g_build.env_of_name('default')
 
-    def run_test(self, verbose, generate, refDirName, testName, arguments=[], pyscript=None, refTestName=None):
+    def run_test(self, verbose, generate, testName, arguments=[], pyscript=None, refTestName=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
@@ -70,11 +69,11 @@
             raise TypeError
         
         if refTestName is None:
-            refTestDirName = os.path.join(refDirName, (testName + ".ref"))
+            refTestDirName = os.path.join(self.reference_traces, (testName + ".ref"))
         else:
-            refTestDirName = os.path.join(refDirName, refTestName)
+            refTestDirName = os.path.join(self.reference_traces, refTestName)
 
-        if not os.path.exists(refDirName):
+        if not os.path.exists(self.reference_traces):
             print"No reference trace repository"
             return 1
 
@@ -90,7 +89,7 @@
                     tmpl = tmpl + " " + arg
                 wutils.run_program(testName, tmpl)
             else:
-                argv = [self.env['PYTHON'], os.path.join('..', '..', '..', *os.path.split(pyscript))] + arguments
+                argv = [self.env['PYTHON'], os.path.join(Params.g_cwd_launch, *os.path.split(pyscript))] + arguments
                 before = os.getcwd()
                 os.chdir(refTestDirName)
                 try:
@@ -170,16 +169,27 @@
     tests.sort()
     return tests
 
-def run_regression():
-    """Execute regression tests."""
+def run_regression(reference_traces):
+    """Execute regression tests.  Called with cwd set to the 'regression' subdir of ns-3.
+
+    @param reference_traces: reference traces directory, or None for default.
+
+    """
 
     testdir = "tests"
     if not os.path.exists(testdir):
         print "Tests directory does not exist"
         sys.exit(3)
+
+    dir_name = (wutils.APPNAME + '-' + wutils.VERSION + REGRESSION_SUFFIX)
+    if reference_traces is None:
+        reference_traces = dir_name
+        no_net = False
+    else:
+        no_net = True
     
     sys.path.append(testdir)
-    sys.modules['tracediff'] = Regression(testdir)
+    sys.modules['tracediff'] = Regression(testdir, reference_traces)
 
     if Params.g_options.regression_tests:
         tests = Params.g_options.regression_tests.split(',')
@@ -187,36 +197,36 @@
         tests = _find_tests(testdir)
 
     print "========== Running Regression Tests =========="
-    dir_name = wutils.APPNAME + '-' + wutils.VERSION + REGRESSION_SUFFIX
     env = Params.g_build.env_of_name('default')
-    if env['MERCURIAL']:
-        print "Synchronizing reference traces using Mercurial."
-        if not os.path.exists(dir_name):
-            print "Cloning " + REGRESSION_TRACES_REPO + dir_name + " from repo."
-            argv = ["hg", "clone", REGRESSION_TRACES_REPO + dir_name, dir_name]
-            rv = subprocess.Popen(argv).wait()
+    if not no_net:
+        if env['MERCURIAL']:
+            print "Synchronizing reference traces using Mercurial."
+            if not os.path.exists(reference_traces):
+                print "Cloning " + REGRESSION_TRACES_REPO + dir_name + " from repo."
+                argv = ["hg", "clone", REGRESSION_TRACES_REPO + dir_name, reference_traces]
+                rv = subprocess.Popen(argv).wait()
+            else:
+                _dir = os.getcwd()
+                os.chdir(reference_traces)
+                try:
+                    print "Pulling " + REGRESSION_TRACES_REPO + dir_name + " from repo."
+                    result = subprocess.Popen(["hg", "-q", "pull", REGRESSION_TRACES_REPO + dir_name]).wait()
+                    if not result:
+                        result = subprocess.Popen(["hg", "-q", "update"]).wait()
+                finally:
+                    os.chdir("..")
+                if result:
+                    Params.fatal("Synchronizing reference traces using Mercurial failed.")
         else:
-            _dir = os.getcwd()
-            os.chdir(dir_name)
-            try:
-                print "Pulling " + REGRESSION_TRACES_REPO + dir_name + " from repo."
-                result = subprocess.Popen(["hg", "-q", "pull", REGRESSION_TRACES_REPO + dir_name]).wait()
-                if not result:
-                    result = subprocess.Popen(["hg", "-q", "update"]).wait()
-            finally:
-                os.chdir("..")
-            if result:
-                Params.fatal("Synchronizing reference traces using Mercurial failed.")
-    else:
-        if not os.path.exists(dir_name):
-            traceball = dir_name + wutils.TRACEBALL_SUFFIX
-            print "Retrieving " + traceball + " from web."
-            urllib.urlretrieve(REGRESSION_TRACES_URL + traceball, traceball)
-            os.system("tar -xjf %s -C .." % (traceball))
-            print "Done."
+            if not os.path.exists(reference_traces):
+                traceball = dir_name + wutils.TRACEBALL_SUFFIX
+                print "Retrieving " + traceball + " from web."
+                urllib.urlretrieve(REGRESSION_TRACES_URL + traceball, traceball)
+                os.system("tar -xjf %s -C .." % (traceball))
+                print "Done."
 
-    if not os.path.exists(dir_name):
-        print "Reference traces directory (%s) does not exist" % dir_name
+    if not os.path.exists(reference_traces):
+        print "Reference traces directory (%s) does not exist" % reference_traces
         return 3
     
     bad = []
@@ -254,9 +264,7 @@
     else:
         os.mkdir("traces")
     
-    dir_name = wutils.APPNAME + '-' + wutils.VERSION + REGRESSION_SUFFIX
-
     mod = __import__(test, globals(), locals(), [])
     return mod.run(verbose=(Params.g_options.verbose > 0),
-                   generate=Params.g_options.regression_generate,
-                   refDirName=dir_name)
+                   generate=Params.g_options.regression_generate)
+
--- a/regression/tests/test-csma-bridge.py	Tue Nov 18 15:12:12 2008 +0000
+++ b/regression/tests/test-csma-bridge.py	Wed Nov 19 17:17:07 2008 +0000
@@ -6,10 +6,10 @@
 import sys
 import tracediff
 
-def run(verbose, generate, refDirName):
+def run(verbose, generate):
     """Execute a test."""
     if tracediff.env['ENABLE_PYTHON_BINDINGS']:
-        return tracediff.run_test(verbose, generate, refDirName,
+        return tracediff.run_test(verbose, generate,
                                   "csma-bridge", pyscript=os.path.join('examples', 'csma-bridge.py'))
     else:
         print >> sys.stderr, "Skipping csma-bridge: Python bindings not available."
--- a/regression/tests/test-csma-broadcast.py	Tue Nov 18 15:12:12 2008 +0000
+++ b/regression/tests/test-csma-broadcast.py	Wed Nov 19 17:17:07 2008 +0000
@@ -6,7 +6,7 @@
 import shutil
 import tracediff
 
-def run(verbose, generate, refDirName):
+def run(verbose, generate):
     """Execute a test."""
 
-    return tracediff.run_test(verbose, generate, refDirName, "csma-broadcast")
+    return tracediff.run_test(verbose, generate, "csma-broadcast")
--- a/regression/tests/test-csma-multicast.py	Tue Nov 18 15:12:12 2008 +0000
+++ b/regression/tests/test-csma-multicast.py	Wed Nov 19 17:17:07 2008 +0000
@@ -6,7 +6,7 @@
 import shutil
 import tracediff
 
-def run(verbose, generate, refDirName):
+def run(verbose, generate):
     """Execute a test."""
 
-    return tracediff.run_test(verbose, generate, refDirName, "csma-multicast")
+    return tracediff.run_test(verbose, generate, "csma-multicast")
--- a/regression/tests/test-csma-one-subnet.py	Tue Nov 18 15:12:12 2008 +0000
+++ b/regression/tests/test-csma-one-subnet.py	Wed Nov 19 17:17:07 2008 +0000
@@ -6,7 +6,7 @@
 import shutil
 import tracediff
 
-def run(verbose, generate, refDirName):
+def run(verbose, generate):
     """Execute a test."""
 
-    return tracediff.run_test(verbose, generate, refDirName, "csma-one-subnet")
+    return tracediff.run_test(verbose, generate, "csma-one-subnet")
--- a/regression/tests/test-csma-packet-socket.py	Tue Nov 18 15:12:12 2008 +0000
+++ b/regression/tests/test-csma-packet-socket.py	Wed Nov 19 17:17:07 2008 +0000
@@ -6,8 +6,8 @@
 import shutil
 import tracediff
 
-def run(verbose, generate, refDirName):
+def run(verbose, generate):
     """Execute a test."""
 
-    return tracediff.run_test(verbose, generate, refDirName,
+    return tracediff.run_test(verbose, generate,
         "csma-packet-socket")
--- a/regression/tests/test-csma-ping.py	Tue Nov 18 15:12:12 2008 +0000
+++ b/regression/tests/test-csma-ping.py	Wed Nov 19 17:17:07 2008 +0000
@@ -6,7 +6,7 @@
 import shutil
 import tracediff
 
-def run(verbose, generate, refDirName):
+def run(verbose, generate):
     """Execute a test."""
 
-    return tracediff.run_test(verbose, generate, refDirName, "csma-ping")
+    return tracediff.run_test(verbose, generate, "csma-ping")
--- a/regression/tests/test-csma-raw-ip-socket.py	Tue Nov 18 15:12:12 2008 +0000
+++ b/regression/tests/test-csma-raw-ip-socket.py	Wed Nov 19 17:17:07 2008 +0000
@@ -6,7 +6,7 @@
 import shutil
 import tracediff
 
-def run(verbose, generate, refDirName):
+def run(verbose, generate):
     """Execute a test."""
 
-    return tracediff.run_test(verbose, generate, refDirName, "csma-raw-ip-socket")
+    return tracediff.run_test(verbose, generate, "csma-raw-ip-socket")
--- a/regression/tests/test-csma-star.py	Tue Nov 18 15:12:12 2008 +0000
+++ b/regression/tests/test-csma-star.py	Wed Nov 19 17:17:07 2008 +0000
@@ -6,7 +6,7 @@
 import shutil
 import tracediff
 
-def run(verbose, generate, refDirName):
+def run(verbose, generate):
     """Execute a test."""
 
-    return tracediff.run_test(verbose, generate, refDirName, "csma-star")
+    return tracediff.run_test(verbose, generate, "csma-star")
--- a/regression/tests/test-realtime-udp-echo.py	Tue Nov 18 15:12:12 2008 +0000
+++ b/regression/tests/test-realtime-udp-echo.py	Wed Nov 19 17:17:07 2008 +0000
@@ -6,7 +6,7 @@
 import shutil
 import tracediff
 
-def run(verbose, generate, refDirName):
+def run(verbose, generate):
     """Execute a test."""
 
-    return tracediff.run_test(verbose, generate, refDirName, "realtime-udp-echo")
+    return tracediff.run_test(verbose, generate, "realtime-udp-echo")
--- a/regression/tests/test-simple-error-model.py	Tue Nov 18 15:12:12 2008 +0000
+++ b/regression/tests/test-simple-error-model.py	Wed Nov 19 17:17:07 2008 +0000
@@ -6,8 +6,8 @@
 import shutil
 import tracediff
 
-def run(verbose, generate, refDirName):
+def run(verbose, generate):
     """Execute a test."""
 
-    return tracediff.run_test(verbose, generate, refDirName,
+    return tracediff.run_test(verbose, generate,
         "simple-error-model")
--- a/regression/tests/test-simple-global-routing.py	Tue Nov 18 15:12:12 2008 +0000
+++ b/regression/tests/test-simple-global-routing.py	Wed Nov 19 17:17:07 2008 +0000
@@ -6,8 +6,8 @@
 import shutil
 import tracediff
 
-def run(verbose, generate, refDirName):
+def run(verbose, generate):
     """Execute a test."""
 
-    return tracediff.run_test(verbose, generate, refDirName,
+    return tracediff.run_test(verbose, generate,
         "simple-global-routing")
--- a/regression/tests/test-simple-point-to-point-olsr.py	Tue Nov 18 15:12:12 2008 +0000
+++ b/regression/tests/test-simple-point-to-point-olsr.py	Wed Nov 19 17:17:07 2008 +0000
@@ -6,8 +6,8 @@
 import shutil
 import tracediff
 
-def run(verbose, generate, refDirName):
+def run(verbose, generate):
     """Execute a test."""
 
-    return tracediff.run_test(verbose, generate, refDirName,
+    return tracediff.run_test(verbose, generate,
         "simple-point-to-point-olsr")
--- a/regression/tests/test-tcp-large-transfer.py	Tue Nov 18 15:12:12 2008 +0000
+++ b/regression/tests/test-tcp-large-transfer.py	Wed Nov 19 17:17:07 2008 +0000
@@ -6,8 +6,8 @@
 import shutil
 import tracediff
 
-def run(verbose, generate, refDirName):
+def run(verbose, generate):
     """Execute a test."""
 
-    return tracediff.run_test(verbose, generate, refDirName,
+    return tracediff.run_test(verbose, generate,
         "tcp-large-transfer")
--- a/regression/tests/test-tcp-nsc-lfn.py	Tue Nov 18 15:12:12 2008 +0000
+++ b/regression/tests/test-tcp-nsc-lfn.py	Wed Nov 19 17:17:07 2008 +0000
@@ -9,7 +9,7 @@
 import platform
 
 
-def run(verbose, generate, refDirName):
+def run(verbose, generate):
     """Run a Network Simulation Cradle test involving two TCP streams."""
 
     if not tracediff.env['ENABLE_NSC']:
@@ -29,5 +29,5 @@
         # string might not be the best idea?
         raise "Unknown architecture, not 64 or 32 bit?"
 
-    return tracediff.run_test(verbose, generate, refDirName,
+    return tracediff.run_test(verbose, generate,
         testName, arguments=arguments, refTestName=traceDirName)
--- a/regression/tests/test-udp-echo.py	Tue Nov 18 15:12:12 2008 +0000
+++ b/regression/tests/test-udp-echo.py	Wed Nov 19 17:17:07 2008 +0000
@@ -6,7 +6,7 @@
 import shutil
 import tracediff
 
-def run(verbose, generate, refDirName):
+def run(verbose, generate):
     """Execute a test."""
     #print tracediff.env
-    return tracediff.run_test(verbose, generate, refDirName, "udp-echo")
+    return tracediff.run_test(verbose, generate, "udp-echo")
--- a/regression/tests/test-wifi-wired-bridging.py	Tue Nov 18 15:12:12 2008 +0000
+++ b/regression/tests/test-wifi-wired-bridging.py	Wed Nov 19 17:17:07 2008 +0000
@@ -6,7 +6,7 @@
 import shutil
 import tracediff
 
-def run(verbose, generate, refDirName):
+def run(verbose, generate):
     """Execute a test."""
 
-    return tracediff.run_test(verbose, generate, refDirName, "wifi-wired-bridging", ["--SendIp=0"])
+    return tracediff.run_test(verbose, generate, "wifi-wired-bridging", ["--SendIp=0"])
--- a/wscript	Tue Nov 18 15:12:12 2008 +0000
+++ b/wscript	Wed Nov 19 17:17:07 2008 +0000
@@ -143,6 +143,10 @@
                    help=('Use sudo to setup suid bits on ns3 executables.'),
                    dest='enable_sudo', action='store_true',
                    default=False)
+    opt.add_option('--with-regression-traces',
+                   help=('Path to the regression reference traces directory'),
+                   default=None,
+                   dest='regression_traces', type="string")
 
     # options provided in a script in a subdirectory named "src"
     opt.sub_options('src')
@@ -193,6 +197,11 @@
 
     variant_env['INCLUDEDIR'] = os.path.join(variant_env['PREFIX'], 'include')
 
+    if Params.g_options.regression_traces is not None:
+        variant_env['REGRESSION_TRACES'] = os.path.join("..", Params.g_options.regression_traces)
+    else:
+        variant_env['REGRESSION_TRACES'] = None
+
     if Params.g_options.enable_gcov:
         variant_name += '-gcov'
         variant_env.append_value('CCFLAGS', '-fprofile-arcs')
@@ -463,10 +472,14 @@
     if Params.g_options.regression or Params.g_options.regression_generate:
         if not env['DIFF']:
             Params.fatal("Cannot run regression tests: the 'diff' program is not installed.")
+
         _dir = os.getcwd()
         os.chdir("regression")
+        regression_traces = env['REGRESSION_TRACES']
+        if not regression_traces:
+            regression_traces = None
         try:
-            regression.run_regression()
+            regression.run_regression(regression_traces)
         finally:
             os.chdir(_dir)