chiark / gitweb /
configure.ac, debian/: Set up correct dependencies for GStreamer.
[disorder] / tests / dtest.py
index 49bbfaac620382c5b6dad70bf6aa81c9f4428c39..ffb63cba178d7043d5164654d251b41c5730f9fc 100644 (file)
@@ -1,7 +1,7 @@
 #-*-python-*-
 #
 # This file is part of DisOrder.
-# Copyright (C) 2007-2009 Richard Kettlewell
+# Copyright (C) 2007-2012 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
 """Utility module used by tests"""
 
 import os,os.path,subprocess,sys,re,time,unicodedata,random,socket,traceback
+import atexit,base64,errno
+
+homelink = None
 
 def fatal(s):
     """Write an error message and exit"""
     sys.stderr.write("ERROR: %s\n" % s)
     sys.exit(1)
 
+@atexit.register
+def cleanup():
+    if homelink is not None:
+        os.unlink(homelink)
+
 # Identify the top build directory
 cwd = os.getcwd()
 if os.path.exists("config.h"):
@@ -85,7 +93,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/long.ogg" % top_builddir, trackpath)
+    copyfile("%s/sounds/long.ogg" % top_srcdir, trackpath)
     # We record the tracks we created so they can be tested against
     # server responses.  We put them into NFC since that's what the server
     # uses internally.
@@ -167,10 +175,9 @@ def bindable(p):
 def default_config(encoding="UTF-8"):
     """Write the default config"""
     open("%s/config" % testroot, "w").write(
-    """home %s/home
+    """home %s
 collection fs %s %s/tracks
 scratch %s/scratch.ogg
-gap 0
 queue_pad 5
 stopword 01 02 03 04 05 06 07 08 09 10
 stopword 1 2 3 4 5 6 7 8 9
@@ -194,12 +201,33 @@ api rtp
 broadcast 127.0.0.1 %d
 broadcast_from 127.0.0.1 %d
 mail_sender no.such.user.sorry@greenend.org.uk
-""" % (testroot, encoding, testroot, testroot, top_builddir, top_builddir,
+""" % (homelink, encoding, testroot, testroot, top_builddir, top_builddir,
        port, port + 1))
 
 def common_setup():
+    global homelink
     remove_dir(testroot)
-    os.mkdir(testroot)
+    os.makedirs(testroot)
+    os.makedirs("%s/home" % testroot)
+    # Establish a symlink to the home directory, to keep the socket pathnames
+    # short enough.
+    tmpdir = "/tmp"
+    for v in ["TMPDIR", "TMP"]:
+        try: tmpdir = os.environ[v]
+        except KeyError: pass
+        else: break
+    for i in xrange(1024):
+        r = base64.b64encode(os.urandom(9)).replace("/", "_")
+        f = "%s/disorder-home.%s" % (tmpdir, r)
+        try:
+            os.symlink("%s/home" % testroot, f)
+        except OSError, e:
+            if e.errno != errno.EEXIST: raise
+        else:
+            homelink = f
+            break
+    else:
+        fatal("failed to make home link")
     # Choose a port
     global port
     port = random.randint(49152, 65530)
@@ -229,7 +257,7 @@ Start the daemon."""
             time.sleep(1)
     print " starting daemon"
     # remove the socket if it exists
-    socket = "%s/home/socket" % testroot
+    socket = "%s/socket" % homelink
     if os.path.exists(socket):
         os.remove(socket)
     daemon = subprocess.Popen(["disorderd",
@@ -238,23 +266,26 @@ Start the daemon."""
                               stderr=errs)
     # Wait for the socket to be created
     waited = 0
+    sleep_resolution = 0.125
     while not os.path.exists(socket):
         rc = daemon.poll()
         if rc is not None:
             print "FATAL: daemon failed to start up"
             sys.exit(1)
-        waited += 1
+        waited += sleep_resolution
+        if sleep_resolution < 1:
+            sleep_resolution *= 2
         if waited == 1:
             print "  waiting for socket..."
         elif waited >= 60:
             print "FATAL: took too long for socket to appear"
             sys.exit(1)
-        time.sleep(1)
+        time.sleep(sleep_resolution)
     if waited > 0:
-        print "  took about %ds for socket to appear" % waited
+        print "  took about %ss for socket to appear" % waited
     # Wait for root user to be created
-    command(["disorder",
-             "--config", disorder._configfile, "--no-per-user-config",
+    command(["disorderd",
+             "--config", disorder._configfile,
              "--wait-for-root"])
 
 def create_user(username="fred", password="fredpass"):
@@ -283,6 +314,7 @@ def stop_daemon():
 Stop the daemon if it has not stopped already"""
     global daemon
     if daemon == None:
+        print " (daemon not running)"
         return
     rc = daemon.poll()
     if rc == None:
@@ -294,8 +326,6 @@ Stop the daemon if it has not stopped already"""
     else:
         print "  daemon already stopped"
     daemon = None
-    # Wait a bit for subprocess to finish too, to try to avoid stupid races
-    time.sleep(2)
 
 def run(module=None, report=True):
     """dtest.run(MODULE)
@@ -336,7 +366,9 @@ def run(module=None, report=True):
     except Exception, e:
         traceback.print_exc(None, sys.stderr)
         failures += 1
-    stop_daemon()
+    finally:
+        stop_daemon()
+        os.system("ps -ef | grep disorderd")
     if report:
         if failures:
             print " FAILED"
@@ -407,5 +439,6 @@ def command(args):
 tests = 0
 failures = 0
 daemon = None
-testroot = "%s/tests/testroot" % top_builddir
+testroot = "%s/tests/testroot/%s" % \
+           (top_builddir, os.path.basename(sys.argv[0]))
 tracks = "%s/tracks" % testroot