From edc1f5f67fb34734f775cf5df790895a1628e7ee Mon Sep 17 00:00:00 2001
From: David-Sarah Hopwood <david-sarah@jacaranda.org>
Date: Thu, 25 Oct 2012 02:16:21 +0100
Subject: [PATCH] Makefile: add 'make tmpfstest', which uses a tmpfs for
 _trial_temp.

This probably only works on Linux. It uses sudo to mount and unmount the tmpfs,
which may prompt for a password. refs #20

Signed-off-by: David-Sarah Hopwood <david-sarah@jacaranda.org>
---
 .gitignore                        |  1 +
 Makefile                          | 12 ++++++++++++
 src/allmydata/test/test_runner.py |  8 ++++++++
 3 files changed, 21 insertions(+)

diff --git a/.gitignore b/.gitignore
index 2af1ff66..9f1572c0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -19,6 +19,7 @@
 Twisted-*.egg
 
 /_trial_temp*
+/tmp*
 /dist/
 /twisted/plugins/dropin.cache
 /tahoe-deps/
diff --git a/Makefile b/Makefile
index cb09747d..1f9d218c 100644
--- a/Makefile
+++ b/Makefile
@@ -75,6 +75,18 @@ test-coverage: build
 quicktest:
 	$(TAHOE) debug trial $(TRIALARGS) $(TEST)
 
+# "make tmpfstest" may be a faster way of running tests on Linux. It works best when you have
+# at least 330 MiB of free physical memory (to run the whole test suite). Since it uses sudo
+# to mount/unmount the tmpfs filesystem, it might prompt for your password.
+tmpfstest:
+	time make _tmpfstest 'TMPDIR=$(shell mktemp -d --tmpdir=.)'
+
+_tmpfstest:
+	sudo mount -t tmpfs -o size=330m tmpfs '$(TMPDIR)'
+	-$(TAHOE) debug trial --rterrors '--temp-directory=$(TMPDIR)/_trial_temp' $(TRIALARGS) $(TEST)
+	sudo umount '$(TMPDIR)'
+	rmdir '$(TMPDIR)'
+
 # code-coverage: install the "coverage" package from PyPI, do "make
 # quicktest-coverage" to do a unit test run with coverage-gathering enabled,
 # then use "make coverate-output-text" for a brief report, or "make
diff --git a/src/allmydata/test/test_runner.py b/src/allmydata/test/test_runner.py
index 6aaed803..59624626 100644
--- a/src/allmydata/test/test_runner.py
+++ b/src/allmydata/test/test_runner.py
@@ -88,6 +88,10 @@ class BinTahoe(common_util.SignalMixin, unittest.TestCase, RunBinTahoeMixin):
         if os.path.basename(root_from_cwd) == 'src':
             root_from_cwd = os.path.dirname(root_from_cwd)
 
+        # This is needed if we are running in a temporary directory created by 'make tmpfstest'.
+        if os.path.basename(root_from_cwd).startswith('tmp'):
+            root_from_cwd = os.path.dirname(root_from_cwd)
+
         same = (root_from_cwd == root_to_check)
         if not same:
             try:
@@ -105,6 +109,10 @@ class BinTahoe(common_util.SignalMixin, unittest.TestCase, RunBinTahoeMixin):
             if os.path.basename(root_from_cwdu) == u'src':
                 root_from_cwdu = os.path.dirname(root_from_cwdu)
 
+            # This is needed if we are running in a temporary directory created by 'make tmpfstest'.
+            if os.path.basename(root_from_cwdu).startswith(u'tmp'):
+                root_from_cwdu = os.path.dirname(root_from_cwdu)
+
             if not isinstance(root_from_cwd, unicode) and root_from_cwd.decode(get_filesystem_encoding(), 'replace') != root_from_cwdu:
                 msg += ("However, this may be a false alarm because the current directory path\n"
                         "is not representable in the filesystem encoding. Please run the tests\n"
-- 
2.45.2