unittest: Add unit tests to the scons framework.
authorNathan Binkert <nate@binkert.org>
Thu, 2 Oct 2008 18:27:01 +0000 (11:27 -0700)
committerNathan Binkert <nate@binkert.org>
Thu, 2 Oct 2008 18:27:01 +0000 (11:27 -0700)
Also fix the unit tests so they actually compile correctly.

src/SConscript
src/unittest/Makefile [deleted file]
src/unittest/SConscript [new file with mode: 0644]
src/unittest/bitvectest.cc
src/unittest/circletest.cc
src/unittest/initest.cc
src/unittest/nmtest.cc
src/unittest/stattest.cc
src/unittest/symtest.cc

index 14988bbbe14fdfff80e42ec05d0b3d639f8069f3..6b2ea4d60d8e86f72b877248d7cde51a90ebaac2 100644 (file)
@@ -144,12 +144,26 @@ def SwigSource(package, source):
     val = source,package
     swig_sources.append(val)
 
+unit_tests = []
+def UnitTest(target, sources):
+    if not isinstance(sources, (list, tuple)):
+        sources = [ sources ]
+    
+    srcs = []
+    for source in sources:
+        if not isinstance(source, SCons.Node.FS.File):
+            source = File(source)
+        srcs.append(source)
+            
+    unit_tests.append((target, srcs))
+
 # Children should have access
 Export('Source')
 Export('BinSource')
 Export('PySource')
 Export('SimObject')
 Export('SwigSource')
+Export('UnitTest')
 
 ########################################################################
 #
@@ -962,6 +976,10 @@ def makeEnv(label, objsfx, strip = False, **kwargs):
     m5lib = newEnv.Library('m5_' + label,
         make_objs(cc_lib_sources, newEnv) + swig_objs)
 
+    for target, sources in unit_tests:
+        objs = [ newEnv.StaticObject(s) for s in sources ]
+        newEnv.Program("unittest/%s.%s" % (target, label), objs + m5lib)
+
     # Now link a stub with main() and the library.
     exe = 'm5.' + label  # final executable
     objects = [newEnv.Object(s) for s in cc_bin_sources] + m5lib
diff --git a/src/unittest/Makefile b/src/unittest/Makefile
deleted file mode 100644 (file)
index e6a621a..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-# Copyright (c) 2006-2007 The Regents of The University of Michigan
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met: redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer;
-# redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution;
-# neither the name of the copyright holders nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#
-# Authors: Nathan Binkert
-#          Steve Reinhardt
-
-CC?= gcc
-CXX?= g++
-PYTHON?=/usr/bin/env python
-
-CURDIR?= $(shell /bin/pwd)
-SRCDIR?= $(CURDIR)/..
-
-CCFLAGS= -g -O0 -MMD -I. -I$(SRCDIR) -I- -DTRACING_ON=0
-MYSQL= -I/usr/include/mysql -L/usr/lib/mysql -lmysqlclient
-
-VPATH=$(SRCDIR):$(CURDIR)
-
-default:
-       @echo "You must specify a target"
-
-base/traceflags.cc base/traceflags.hh: $(SRCDIR)/base/traceflags.py
-       mkdir -p base; \
-       cd base; \
-       $(PYTHON) $<
-
-bitvectest: unittest/bitvectest.cc
-       $(CXX) $(CCFLAGS) -o $@ $^
-
-circletest: unittest/circletest.cc base/circlebuf.cc
-       $(CXX) $(CCFLAGS) -o $@ $^
-
-cprintftest: unittest/cprintftest.cc base/cprintf.cc
-       $(CXX) $(CCFLAGS) -o $@ $^
-
-cprintftime: unittest/cprintftime.cc base/cprintf.cc
-       $(CXX) $(CCFLAGS) -o $@ $^
-
-initest: unittest/initest.cc base/str.cc base/inifile.cc base/cprintf.cc
-       $(CXX) $(CCFLAGS) -o $@ $^
-
-lrutest: unittest/lru_test.cc
-       $(CXX) $(CCFLAGS) -o $@ $^
-
-nmtest: unittest/nmtest.cc base/output.cc base/hostinfo.cc base/cprintf.cc base/misc.cc base/loader/object_file.cc base/loader/symtab.cc base/misc.cc base/str.cc base/loader/aout_object.cc base/loader/ecoff_object.cc base/loader/elf_object.cc
-       $(CXX) $(CCFLAGS) -I/n/ziff/z/binkertn/build/work/ALPHA_FS -lelf -o $@ $^
-
-offtest: unittest/offtest.cc
-       $(CXX) $(CCFLAGS) -o $@ $^
-
-rangetest: unittest/rangetest.cc base/range.cc base/str.cc
-       $(CXX) $(CCFLAGS) -o $@ $^
-
-STATTEST+= base/cprintf.cc base/hostinfo.cc base/misc.cc base/mysql.cc
-STATTEST+= base/python.cc base/str.cc base/time.cc 
-STATTEST+= base/statistics.cc base/stats/mysql.cc base/stats/python.cc
-STATTEST+= base/stats/statdb.cc base/stats/text.cc base/stats/visit.cc
-STATTEST+= unittest/stattest.cc 
-stattest: $(STATTEST)
-       $(CXX) $(CCFLAGS) $(MYSQL) -o $@ $^ 
-
-strnumtest: unittest/strnumtest.cc base/str.cc
-       $(CXX) $(CCFLAGS) -o $@ $^
-
-symtest: unittest/symtest.cc base/misc.cc base/symtab.cc base/str.cc
-       $(CXX) $(CCFLAGS) -o $@ $^
-
-tokentest: unittest/tokentest.cc base/str.cc
-       $(CXX) $(CCFLAGS) -o $@ $^
-
-TRACE+=unittest/tracetest.cc base/trace.cc base/trace_flags.cc base/cprintf.cc
-TRACE+=base/str.cc base/misc.cc
-tracetest: $(TRACE)
-       $(CXX) $(CCFLAGS) -o $@ $^
-
-clean:
-       @rm -rf *test *~ .#* *.core core base
-.PHONY: clean
diff --git a/src/unittest/SConscript b/src/unittest/SConscript
new file mode 100644 (file)
index 0000000..1c19591
--- /dev/null
@@ -0,0 +1,48 @@
+# -*- mode:python -*-
+
+# Copyright (c) 2004-2005 The Regents of The University of Michigan
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met: redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer;
+# redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution;
+# neither the name of the copyright holders nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# Authors: Nathan Binkert
+
+Import('*')
+
+UnitTest('bitvectest', 'bitvectest.cc')
+UnitTest('circletest', 'circletest.cc')
+UnitTest('cprintftest', 'cprintftest.cc')
+UnitTest('cprintftime', 'cprintftest.cc')
+UnitTest('initest', 'initest.cc')
+UnitTest('lrutest', 'lru_test.cc')
+UnitTest('nmtest', 'nmtest.cc')
+UnitTest('offtest', 'offtest.cc')
+UnitTest('rangetest', 'rangetest.cc')
+UnitTest('rangemaptest', 'rangemaptest.cc')
+UnitTest('rangemultimaptest', 'rangemultimaptest.cc')
+UnitTest('stattest', 'stattest.cc')
+UnitTest('strnumtest', 'strnumtest.cc')
+UnitTest('symtest', 'symtest.cc')
+UnitTest('tokentest', 'tokentest.cc')
+UnitTest('tracetest', 'tracetest.cc')
index 2f01d636faa8b333687af39c23f3c98edba49bde..29069081b558cbb933ed66d6e9d3533033deff3d 100644 (file)
  * Authors: Nathan Binkert
  */
 
-#include <iostream.h>
-
+#include <iostream>
 #include <vector>
 
+using namespace std;
+
 int
 main()
 {
index c6fce0f8fbd694ed93536158c304f86111bc0e6d..2ee75b6dfaacfdfba7edafd7f85d9928dc1d26ac 100644 (file)
  */
 
 #include <fcntl.h>
-#include <iostream.h>
 #include <unistd.h>
 
+#include <iostream>
+
 #include "base/circlebuf.hh"
 
-char *strings[] = {
+const char *strings[] = {
     "This is the first test\n",
     "he went with his woman to the store\n",
     "the man with the bat hit the woman with the hat\n",
index 8f53fce5cf540b2b97b69a0b7350da0da974ff63..67ac4487420013b711d518e05a6612be6df0d9fb 100644 (file)
@@ -68,32 +68,14 @@ main(int argc, char *argv[])
 
     progname = argv[0];
 
-    vector<char *> cppArgs;
-
-    vector<char *> cpp_options;
-    cpp_options.reserve(argc * 2);
-
     for (int i = 1; i < argc; ++i) {
         char *arg_str = argv[i];
 
         // if arg starts with '-', parse as option,
         // else treat it as a configuration file name and load it
         if (arg_str[0] == '-') {
-
             // switch on second char
             switch (arg_str[1]) {
-              case 'D':
-              case 'U':
-              case 'I':
-                // cpp options: record & pass to cpp.  Note that these
-                // cannot have spaces, i.e., '-Dname=val' is OK, but
-                // '-D name=val' is not.  I don't consider this a
-                // problem, since even though gnu cpp accepts the
-                // latter, other cpp implementations do not (Tru64,
-                // for one).
-                cppArgs.push_back(arg_str);
-                break;
-
               case '-':
                 // command-line configuration parameter:
                 // '--<section>:<parameter>=<value>'
@@ -115,7 +97,7 @@ main(int argc, char *argv[])
         else {
             // no '-', treat as config file name
 
-            if (!simConfigDB.loadCPP(arg_str, cppArgs)) {
+            if (!simConfigDB.load(arg_str)) {
                 cprintf("Error processing file %s\n", arg_str);
                 exit(1);
             }
index b6b74e08dac2aef799fa6a00f5d97dce8de28603..fdd865f2ddcce31f888c951bdff2b674395286a0 100644 (file)
@@ -38,9 +38,6 @@
 #include "base/str.hh"
 
 using namespace std;
-Tick curTick;
-
-ostream *outputStream = &cout;
 
 int
 main(int argc, char *argv[])
index 4e504fde985aba24395f8b1d61dc82ca57fdac63..78d43c6f39ac2f1b6b638ae3a09bb746ae1c7ebf 100644 (file)
@@ -30,9 +30,7 @@
 
 #include <iomanip>
 #include <iostream>
-#include <fstream>
 #include <string>
-#include <unistd.h>
 
 #include "base/cprintf.hh"
 #include "base/misc.hh"
@@ -44,9 +42,6 @@
 using namespace std;
 using namespace Stats;
 
-Tick curTick = 0;
-Tick ticksPerSecond = ULL(2000000000);
-
 Scalar<> s1;
 Scalar<> s2;
 Average<> s3;
@@ -72,8 +67,6 @@ Value f5;
 Formula f6;
 Formula f7;
 
-ostream *outputStream = &cout;
-
 double
 testfunc()
 {
@@ -85,7 +78,7 @@ class TestClass {
     double operator()() { return 9.7; }
 };
 
-char *progname = "";
+const char *progname = "";
 
 void
 usage()
@@ -101,14 +94,18 @@ main(int argc, char *argv[])
     bool descriptions = false;
     bool compat = false;
     bool text = false;
+
+#if USE_MYSQL
     string mysql_name;
+    string mysql_db;
     string mysql_host;
     string mysql_user = "binkertn";
     string mysql_passwd;
+#endif
 
     char c;
     progname = argv[0];
-    while ((c = getopt(argc, argv, "cdh:P:p:s:tu:")) != -1) {
+    while ((c = getopt(argc, argv, "cD:dh:P:p:s:tu:")) != -1) {
         switch (c) {
           case 'c':
             compat = true;
@@ -116,6 +113,13 @@ main(int argc, char *argv[])
           case 'd':
             descriptions = true;
             break;
+          case 't':
+            text = true;
+            break;
+#if USE_MYSQL
+          case 'D':
+            mysql_db = optarg;
+            break;
           case 'h':
             mysql_host = optarg;
             break;
@@ -125,12 +129,10 @@ main(int argc, char *argv[])
           case 's':
             mysql_name = optarg;
             break;
-          case 't':
-            text = true;
-            break;
           case 'u':
             mysql_user = optarg;
             break;
+#endif
           default:
             usage();
         }
@@ -545,12 +547,14 @@ main(int argc, char *argv[])
         out();
     }
 
+#if USE_MYSQL
     if (!mysql_name.empty()) {
         MySql out;
-        out.connect(mysql_host, mysql_user, mysql_passwd, "m5stats",
+        out.connect(mysql_host, mysql_db, mysql_user, mysql_passwd, "test",
                     mysql_name, "test");
         out();
     }
+#endif
 
     return 0;
 }
index f0142b9235a943289cbc7fe38566874b4662bbc8..10ffb42e59c6956dc55703e9b3d86f8977372b2d 100644 (file)
  * Authors: Nathan Binkert
  */
 
-#include <iostream.h>
+#include <iostream>
 
 #include "base/str.hh"
 #include "base/loader/symtab.hh"
 
-Tick curTick = 0;
+using namespace std;
 
 void
 usage(const char *progname)