From 609c994f7bd5bc78808cde0672baf2461d2d94f8 Mon Sep 17 00:00:00 2001 From: Jack Palevich Date: Thu, 25 Jun 2009 11:49:43 -0700 Subject: [PATCH] Rewrite compiler test using python. Nice because we're now checking the output for success/failure automatically rather than by eye. --- libacc/tests/test | 6 +++ libacc/tests/test.py | 114 +++++++++++++++++++++++++++++++++++++++++ libacc/tests/testarm | 9 ---- libacc/tests/testlocal | 23 --------- 4 files changed, 120 insertions(+), 32 deletions(-) create mode 100755 libacc/tests/test create mode 100644 libacc/tests/test.py delete mode 100755 libacc/tests/testarm delete mode 100755 libacc/tests/testlocal diff --git a/libacc/tests/test b/libacc/tests/test new file mode 100755 index 000000000..ef105000a --- /dev/null +++ b/libacc/tests/test @@ -0,0 +1,6 @@ +#!/bin/bash + +SCRIPT_DIR=`dirname $BASH_SOURCE` +cd $SCRIPT_DIR +python test.py + diff --git a/libacc/tests/test.py b/libacc/tests/test.py new file mode 100644 index 000000000..ef5963b9c --- /dev/null +++ b/libacc/tests/test.py @@ -0,0 +1,114 @@ +# +# Test the acc compiler + +import unittest +import subprocess +import os + +def compile(args): + proc = subprocess.Popen(["acc"] + args, stderr=subprocess.PIPE, stdout=subprocess.PIPE) + result = proc.communicate() + return result + +def runCmd(args): + proc = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + result = proc.communicate() + return result[0].strip() + +def which(item): + return runCmd(["which", item]) + +def fileType(item): + return runCmd(["file", item]) + +def outputCanRun(): + ft = fileType(which("acc")) + return ft.find("ELF 32-bit LSB executable, Intel 80386") >= 0 + +def adb(args): + return runCmd(["adb"] + args) + +gArmInitialized = False + +def setupArm(): + if gArmInitialized: + return + print "Setting up arm" + adb(["remount"]) + adb(["shell", "rm", "/system/bin/acc"]) + adb(["shell", "mkdir", "/system/bin/accdata"]) + adb(["shell", "mkdir", "/system/bin/accdata/data"]) + # Clear out old data TODO: handle recursion + adb(["shell", "rm", "/system/bin/accdata/data/*"]) + # Copy over data + for root, dirs, files in os.walk("data"): + for d in dirs: + adb(["shell", "mkdir", os.path.join(root, d)]) + for f in files: + adb(["push", os.path.join(root, f), os.path.join("/system/bin/accdata", root, f)]) + # Copy over compiler + adb(["sync"]) + gArmInitialied = True + +def compileArm(args): + setupArm() + proc = subprocess.Popen(["adb", "shell", "/system/bin/acc"] + args, stdout=subprocess.PIPE) + result = proc.communicate() + return result[0].replace("\r","") + +def compare(a, b): + if a != b: + firstDiff = firstDifference(a,b) + print "Strings differ at character", firstDiff, a[firstDiff], b[firstDiff] + +def firstDifference(a, b): + commonLen = min(len(a), len(b)) + for i in xrange(0, commonLen): + if a[i] != b[i]: + return i + return commonLen + +class TestACC(unittest.TestCase): + + def compileCheck(self, args, stdErrResult, stdOutResult=""): + out, err = compile(args) + compare(out, stdOutResult) + compare(err, stdErrResult) + self.assertEqual(out, stdOutResult) + self.assertEqual(err, stdErrResult) + + def compileCheckArm(self, args, result): + self.assertEqual(compileArm(args), result) + + def testCompileReturnVal(self): + self.compileCheck(["data/returnval-ansi.c"], "") + + def testCompileReturnVal(self): + self.compileCheck(["data/otcc-ansi.c"], "") + + def testRunReturnVal(self): + self.compileCheck(["-R", "data/returnval-ansi.c"], + "Executing compiled code:\nresult: 42\n") + def testRunOTCCANSI(self): + self.compileCheck(["-R", "data/otcc-ansi.c", "data/returnval.c"], + "Executing compiled code:\notcc-ansi.c: About to execute compiled code:\natcc-ansi.c: result: 42\nresult: 42\n") + + def testRunOTCCANSI2(self): + self.compileCheck(["-R", "data/otcc-ansi.c", "data/otcc.c", "data/returnval.c"], + "Executing compiled code:\notcc-ansi.c: About to execute compiled code:\notcc.c: about to execute compiled code.\natcc-ansi.c: result: 42\nresult: 42\n") + + def testRunConstants(self): + self.compileCheck(["-R", "data/constants.c"], + "Executing compiled code:\nresult: 12\n", + "0 = 0\n010 = 8\n0x10 = 16\n'\\a' = 7\n'\\b' = 8\n'\\f' = 12\n'\\n' = 10\n'\\r' = 13\n'\\t' = 9\n'\\v' = 11\n'\\\\' = 92\n'\\'' = 39\n" + + "'\\\"' = 34\n'\\?' = 63\n'\\0' = 0\n'\\1' = 1\n'\\12' = 10\n'\\123' = 83\n'\\x0' = 0\n'\\x1' = 1\n'\\x12' = 18\n'\\x123' = 291\n'\\x1f' = 31\n'\\x1F' = 31\n") + + def testArmRunReturnVal(self): + self.compileCheckArm(["-R", "/system/bin/accdata/data/returnval-ansi.c"], + "Executing compiled code:\nresult: 42\n") + +if __name__ == '__main__': + if not outputCanRun(): + print "Many tests are expected to fail, because acc is not a 32-bit x86 Linux executable." + unittest.main() + diff --git a/libacc/tests/testarm b/libacc/tests/testarm deleted file mode 100755 index 1d4b866c4..000000000 --- a/libacc/tests/testarm +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh -adb remount -adb shell rm /system/bin/acc -adb push data/returnval-ansi.c /system/bin/returnval-ansi.c -cd .. -mm -j8 -cd tests -adb sync -adb shell /system/bin/acc -R -S /system/bin/returnval-ansi.c diff --git a/libacc/tests/testlocal b/libacc/tests/testlocal deleted file mode 100755 index 1a0b4c5e6..000000000 --- a/libacc/tests/testlocal +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash - -SCRIPT_DIR=`dirname $BASH_SOURCE` -DATA=$SCRIPT_DIR/data -ACC=`which acc` - -echo "Compiling returnval-ansi.c" -$ACC -S $DATA/returnval-ansi.c - -echo "Compiling whole compiler." -$ACC -S "$DATA/otcc-ansi.c" - -if file $ACC | grep -q "ELF 32-bit LSB executable, Intel 80386"; then - echo "Linux 32bit Intel." - echo "TESTING returnval-ansi.c:" - $ACC -R $DATA/returnval-ansi.c - echo TESTING otcc-ansi.c returnval-ansi.c - $ACC -R "$DATA/otcc-ansi.c" "$DATA/returnval.c" - echo TESTING otcc-ansi.c otcc.c returnval-ansi.c - $ACC -R $DATA/otcc-ansi.c $DATA/otcc.c $DATA/returnval.c -fi - -echo "Done with tests."