borrow some test naming conventions from disorder.unicode
[disorder] / tests / dtest.py
index 2bc834a..11b6e8b 100644 (file)
@@ -1,8 +1,65 @@
 #-*-python-*-
+#
+# This file is part of DisOrder.
+# Copyright (C) 2007 Richard Kettlewell
+#
+# 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; either version 2 of the License, or
+# (at your option) any later version.
+#
+# 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+# USA
+#
 
 """Utility module used by tests"""
 
-import os,os.path,subprocess,sys,disorder
+import os,os.path,subprocess,sys,re
+
+def fatal(s):
+    """Write an error message and exit"""
+    sys.stderr.write("ERROR: %s\n" % s)
+    sys.exit(1)
+
+# Identify the top build directory
+cwd = os.getcwd()
+if os.path.exists("config.h"):
+    top_builddir = cwd
+elif os.path.exists("alltests"):
+    top_builddir = os.path.dirname(cwd)
+else:
+    fatal("cannot identify build directory")
+
+# Make sure the Python build directory is on the module search path
+sys.path.insert(0, os.path.join(top_builddir, "python"))
+import disorder
+
+# Make sure the server build directory is on the executable search path
+ospath = os.environ["PATH"].split(os.pathsep)
+ospath.insert(0, os.path.join(top_builddir, "server"))
+os.environ["PATH"] = os.pathsep.join(ospath)
+
+# Parse the makefile in the current directory to identify the source directory
+top_srcdir = None
+for l in file("Makefile"):
+    r = re.match("top_srcdir *= *(.*)",  l)
+    if r:
+        top_srcdir = r.group(1)
+        break
+if not top_srcdir:
+    fatal("cannot identify source directory")
+
+# The tests source directory must be on the module search path already since
+# we found dtest.py
+
+# -----------------------------------------------------------------------------
 
 def copyfile(a,b):
     """copyfile(A, B)
@@ -17,7 +74,7 @@ Make track with relative path S exist"""
     trackdir = os.path.dirname(trackpath)
     if not os.path.exists(trackdir):
         os.makedirs(trackdir)
-    copyfile("%s/sounds/slap.ogg" % topsrcdir, trackpath)
+    copyfile("%s/sounds/slap.ogg" % top_srcdir, trackpath)
 
 def stdtracks():
     maketrack("Joe Bloggs/First Album/01:First track.ogg")
@@ -48,17 +105,12 @@ def stdtracks():
 def notracks():
     pass
 
-def start(test):
-    """start(TEST)
+def start_daemon():
+    """start_daemon()
 
-Start the daemon for test called TEST."""
+Start the daemon."""
     global daemon
     assert daemon == None
-    if test == None:
-        errs = sys.stderr
-    else:
-        errs = open("%s/%s.log" % (testroot, test), "w")
-    server = None
     print " starting daemon"
     daemon = subprocess.Popen(["disorderd",
                                "--foreground",
@@ -67,11 +119,13 @@ Start the daemon for test called TEST."""
     disorder._configfile = "%s/config" % testroot
     disorder._userconf = False
 
-def stop():
-    """stop()
+def stop_daemon():
+    """stop_daemon()
 
 Stop the daemon if it has not stopped already"""
     global daemon
+    if daemon == None:
+        return
     rc = daemon.poll()
     if rc == None:
         print " stopping daemon"
@@ -80,22 +134,36 @@ Stop the daemon if it has not stopped already"""
     print " daemon has stopped"
     daemon = None
 
-def run(test, setup=None, report=True, name=None): 
+def run(module=None, report=True):
+    """dtest.run(MODULE)
+
+    Run the test in MODULE.  This can be a string (in which case the module
+    will be imported) or a module object."""
     global tests
     tests += 1
-    if setup == None:
-        setup = stdtracks
+    if module is None:
+        # We're running a test stand-alone
+        import __main__
+        module = __main__
+        name = os.path.splitext(os.path.basename(sys.argv[0]))[0]
+    else:
+        # We've been passed a module or a module name
+        if type(module) == str:
+            module = __import__(module)
+        name = module.__name__
+    global errs
+    errs = open("%s.log" % name, "w")
+    setup = stdtracks
     setup()
-    start(name)
     try:
         try:
-            test()
+            module.test()
         except AssertionError, e:
             global failures
             failures += 1
             print e
     finally:
-        stop()
+        stop_daemon()
     if report:
         if failures:
             print " FAILED"
@@ -121,8 +189,7 @@ Recursively delete directory D"""
 tests = 0
 failures = 0
 daemon = None
-testroot = "%s/testroot" % os.getcwd()
-topsrcdir = os.path.abspath(os.getenv("topsrcdir"))
+testroot = "%s/tests/testroot" % top_builddir
 remove_dir(testroot)
 os.mkdir(testroot)
 open("%s/config" % testroot, "w").write(
@@ -139,7 +206,7 @@ stopword the a an and to too in on of we i am as im for is
 username fred
 password fredpass
 allow fred fredpass
-plugins ../plugins
+plugins %s/plugins
 player *.mp3 execraw disorder-decode
 player *.ogg execraw disorder-decode
 player *.wav execraw disorder-decode
@@ -148,6 +215,6 @@ tracklength *.mp3 disorder-tracklength
 tracklength *.ogg disorder-tracklength
 tracklength *.wav disorder-tracklength
 tracklength *.flac disorder-tracklength
-""" % (testroot, testroot, testroot, testroot))
-copyfile("%s/sounds/scratch.ogg" % topsrcdir,
+""" % (testroot, testroot, testroot, testroot, top_builddir))
+copyfile("%s/sounds/scratch.ogg" % top_srcdir,
          "%s/scratch.ogg" % testroot)