cdk/extra/exprtest/runtests.py (78 lines of code) (raw):
#!/usr/bin/python
# Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; version 2 of the
# License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301 USA
# Test runner for general driver expression parser
# The test executable must take 2 cmdline params as input:
# <type> <expr>
# where <type> is col, tab or all
#
# It must print to stdout either:
# OK
# Protobuf text encoded message
#
# Or
# ERROR
# Error message
#
# In both cases, it must exit with status 0. Any other exit status will be
# interpreted as non-parser related error and abort the test suite.
#
# No other messages should be printed, unless you will be exiting with a
# non-0 status
#
import sys
import os
import subprocess
import difflib
def run_test(exe, otag, tag, text, out):
p = subprocess.Popen([exe, tag, text], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
output, _ = p.communicate()
if out:
out.write("## "+otag+":"+text+"\n")
out.write(output+"\n")
return output
def run_test_file(exe, tfile, outfile):
count = 0
for i, line in enumerate(open(tfile)):
line = line.strip()
if line.startswith("#") or not line:
continue
tag, sep, text = line.partition(":")
if not sep:
print "%s:%i:Unrecognized line: %s" % (tfile, i, line)
sys.exit(1)
if tag not in ["all", "col", "tab"]:
print "%s:%i:Unknown test tag: %s" % (tfile, i, tag)
sys.exit(1)
if tag == "col" or tag == "all":
result = run_test(exe, tag, "col", text, outfile)
if tag == "tab" or tag == "all":
if tag == "all":
result2 = run_test(exe, tag, "tab", text, None)
if result != result2:
outfile.write("ERROR: Output from tab mode does not match output from col\n")
outfile.write(result2+"\n")
else:
run_test(exe, tag, "tab", text, outfile)
count += 1
return count
if len(sys.argv) < 2:
print "Syntax: %s <testbinary>" % (sys.argv[0])
sys.exit(1)
exe = sys.argv[1]
import shutil
shutil.rmtree("testout", ignore_errors=True)
os.mkdir("testout")
print "Running expression suite with %s" % exe
count = 0
fails = 0
passes = 0
for f in os.listdir("t"):
n = os.path.splitext(f)[0]
category, _, casename = n.partition("_")
if category not in ["expr"]:
print "Filename for %s missing category, which can be one of: expr" % f
sys.exit(1)
print n, "...",
sys.stdout.flush()
inpath = os.path.join("t", f)
outpath = os.path.join("testout", n+".result")
respath = os.path.join("r", n+".result")
outf = open(outpath, "w+b")
count += run_test_file(exe, inpath, outf)
outf.close()
if not os.path.exists(respath):
print "Test results file", respath, " is missing. Copy ", outpath, " to it after verifying"
sys.exit(1)
diff = difflib.unified_diff(open(respath).readlines(), open(outpath).readlines(), fromfile=respath, tofile=outpath)
difftext = "".join([d for d in diff])
if not difftext:
passes += 1
print "OK"
else:
fails += 1
print "FAIL"
print "One or more test cases in %s failed with the following differences:" % inpath
print difftext
print "%i test cases executed from %i test suites" % (count, passes+fails)
print "%i failed, %i passed" % (fails, passes)
if fails > 0:
sys.exit(1)