For regression testing, use python modules filecmp and difflib instead of an external diff command, to improve portability (e.g. mingw). Closes #330.
--- a/regression.py Sat Feb 21 22:09:08 2009 +0000
+++ b/regression.py Sat Feb 21 22:50:04 2009 +0000
@@ -37,6 +37,30 @@
tests.sort()
return tests
+def diff(dir1, dir2, verbose):
+ import filecmp
+ comp = filecmp.dircmp(dir1, dir2)
+ differ = (comp.left_only or comp.right_only or comp.diff_files)
+ if differ:
+ if verbose:
+ comp.report()
+ import difflib
+ for diff_fname in comp.diff_files:
+ if not (diff_fname.endswith(".tr") or diff_fname.endswith(".mob")):
+ print "The different file %r does not sound like a text file, not compared." % (diff_fname,)
+ diff_file1 = open(os.path.join(dir1, diff_fname), "rt").readlines()
+ diff_file2 = open(os.path.join(dir2, diff_fname), "rt").readlines()
+ diff = difflib.unified_diff(diff_file1, diff_file2)
+ count = 0
+ print "Differences in file %r" % (diff_fname,)
+ for line in diff:
+ print line
+ count += 1
+ if count > 100:
+ break
+ return 1
+ else:
+ return 0
class regression_test_task(Task.TaskBase):
after = 'cc cxx cc_link cxx_link'
@@ -136,17 +160,7 @@
print >> sys.stderr, ex
return 1
- if Options.options.verbose:
- #diffCmd = "diff traces " + refTestDirName + " | head"
- diffCmd = subprocess.Popen([self.env['DIFF'], trace_output_path, reference_traces_path],
- stdout=subprocess.PIPE)
- headCmd = subprocess.Popen("head", stdin=diffCmd.stdout)
- rc2 = headCmd.wait()
- diffCmd.stdout.close()
- rc1 = diffCmd.wait()
- rc = rc1 or rc2
- else:
- rc = subprocess.Popen([self.env['DIFF'], trace_output_path, reference_traces_path], stdout=dev_null()).wait()
+ rc = diff(trace_output_path, reference_traces_path, Options.options.verbose)
if rc:
print "----------"
print "Traces differ in test: ", self.test_name
@@ -154,6 +168,8 @@
print "Traces in directory: " + trace_output_path
print "Run the following command for details:"
print "\tdiff -u %s %s" % (reference_traces_path, trace_output_path)
+ if not Options.options.verbose:
+ print "Or re-run regression testing with option -v"
print "----------"
return rc
--- a/wscript Sat Feb 21 22:09:08 2009 +0000
+++ b/wscript Sat Feb 21 22:50:04 2009 +0000
@@ -256,9 +256,6 @@
conf.env['NS3_ENABLED_MODULES'] = ['ns3-'+mod for mod in
Options.options.enable_modules.split(',')]
- # we cannot run regression tests without diff
- conf.find_program('diff', var='DIFF')
-
# for suid bits
conf.find_program('sudo', var='SUDO')
@@ -464,9 +461,6 @@
Options.options.compile_targets = os.path.basename(program_name)
if Options.options.regression or Options.options.regression_generate:
- if not env['DIFF']:
- raise Utils.WafError("Cannot run regression tests: the 'diff' program is not installed.")
-
regression_traces = env['REGRESSION_TRACES']
if not regression_traces:
raise Utils.WafError("Cannot run regression tests: reference traces directory not given"