chiark / gitweb /
tests/dtest.py: Refer to the home directory via a symlink.
authorMark Wooding <mdw@distorted.org.uk>
Mon, 27 Nov 2017 10:18:11 +0000 (10:18 +0000)
committerMark Wooding <mdw@distorted.org.uk>
Wed, 29 Nov 2017 11:47:21 +0000 (11:47 +0000)
Pathnames during `make distcheck' are remarkably long, even if the
original project path is very short.  Indeed, the previous change which
added the test name into the `testroot' path is enough to push the
server's socket name over the magic 108-byte limit.

As an additional hack, arrange to refer to the home directory via a
symbolic link in `/tmp' (or wherever $TMPDIR points), which should be
much shorter.  The symlink is deleted on test completion, because
otherwise we'll fill up `/tmp' with cruft, but I hope this doesn't cause
too much in the way of diagnostic trouble.

tests/dtest.py

index 6f9e6a8..ffb63cb 100644 (file)
 """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"):
@@ -167,7 +175,7 @@ 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
 queue_pad 5
@@ -193,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.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)
@@ -228,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",