From 58749af81e5f2361cce17f1b06fb6eb9d78f503e Mon Sep 17 00:00:00 2001
From: Jean-Paul Calderone <exarkun@twistedmatrix.com>
Date: Mon, 10 Jan 2022 16:39:16 -0500
Subject: [PATCH] Pull the Tahoe test code out of the Nix test module

---
 nixos/lib/testing.nix     | 23 ++++++++++++++++
 nixos/tests/tahoe.nix     | 55 +++++----------------------------------
 nixos/tests/test_tahoe.py | 45 ++++++++++++++++++++++++++++++++
 3 files changed, 75 insertions(+), 48 deletions(-)
 create mode 100644 nixos/lib/testing.nix
 create mode 100644 nixos/tests/test_tahoe.py

diff --git a/nixos/lib/testing.nix b/nixos/lib/testing.nix
new file mode 100644
index 00000000..de68dc1f
--- /dev/null
+++ b/nixos/lib/testing.nix
@@ -0,0 +1,23 @@
+{
+
+  /* Returns a string that runs tests from the Python code at the given path.
+
+     The Python code is loaded using *execfile* and the *test* global it
+     defines is called with the given keyword arguments.
+
+     Type: makeTestScript :: Path -> AttrSet -> String
+
+     Example:
+       testScript = (makeTestScript ./test_foo.py { x = "y"; });
+  */
+  makeTestScript = { testpath, kwargs ? {} }:
+    ''
+    # The driver runs pyflakes on this script before letting it
+    # run... Convince pyflakes that there is a `test` name.
+    test = None
+    with open("${testpath}") as testfile:
+        exec(testfile.read(), globals())
+    # For simple types, JSON is compatible with Python syntax!
+    test(**${builtins.toJSON kwargs})
+    '';
+}
diff --git a/nixos/tests/tahoe.nix b/nixos/tests/tahoe.nix
index e39fd6d3..da6c5ee1 100644
--- a/nixos/tests/tahoe.nix
+++ b/nixos/tests/tahoe.nix
@@ -1,5 +1,7 @@
-{ ... }:
-  {
+let
+  makeTestScript = (import ../lib/testing.nix).makeTestScript;
+in
+{
   nodes = {
     storage = { config, pkgs, ourpkgs, ... }: {
       imports = [
@@ -23,50 +25,7 @@
       };
     };
   };
-  testScript = ''
-  start_all()
-
-  # After the service starts, destroy the "created" marker to force it to
-  # re-create its internal state.
-  storage.wait_for_open_port(4001)
-  storage.succeed("systemctl stop tahoe.storage")
-  storage.succeed("rm /var/db/tahoe-lafs/storage.created")
-  storage.succeed("systemctl start tahoe.storage")
-
-  # After it starts up again, verify it has consistent internal state and a
-  # backup of the prior state.
-  storage.wait_for_open_port(4001)
-  storage.succeed("[ -e /var/db/tahoe-lafs/storage ]")
-  storage.succeed("[ -e /var/db/tahoe-lafs/storage.created ]")
-  storage.succeed("[ -e /var/db/tahoe-lafs/storage.1 ]")
-  storage.succeed("[ -e /var/db/tahoe-lafs/storage.1/private/node.privkey ]")
-  storage.succeed("[ -e /var/db/tahoe-lafs/storage.1/private/node.pem ]")
-  storage.succeed("[ ! -e /var/db/tahoe-lafs/storage.2 ]")
-
-  # Stop it again, once again destroy the "created" marker, and this time also
-  # jam some partial state in the way that will need cleanup.
-  storage.succeed("systemctl stop tahoe.storage")
-  storage.succeed("rm /var/db/tahoe-lafs/storage.created")
-  storage.succeed("mkdir -p /var/db/tahoe-lafs/storage.atomic/partial")
-  try:
-    storage.succeed("systemctl start tahoe.storage")
-  except:
-    x, y = storage.execute("journalctl -u tahoe.storage")
-    storage.log(y)
-    raise
-
-  # After it starts up again, verify it has consistent internal state and
-  # backups of the prior two states.  It also has no copy of the inconsistent
-  # state because it could never have been used.
-  storage.wait_for_open_port(4001)
-  storage.succeed("[ -e /var/db/tahoe-lafs/storage ]")
-  storage.succeed("[ -e /var/db/tahoe-lafs/storage.created ]")
-  storage.succeed("[ -e /var/db/tahoe-lafs/storage.1 ]")
-  storage.succeed("[ -e /var/db/tahoe-lafs/storage.2 ]")
-  storage.succeed("[ -e /var/db/tahoe-lafs/storage.2/private/node.privkey ]")
-  storage.succeed("[ -e /var/db/tahoe-lafs/storage.2/private/node.pem ]")
-  storage.succeed("[ ! -e /var/db/tahoe-lafs/storage.atomic ]")
-  storage.succeed("[ ! -e /var/db/tahoe-lafs/storage/partial ]")
-  storage.succeed("[ ! -e /var/db/tahoe-lafs/storage.3 ]")
-  '';
+  testScript = makeTestScript {
+    testpath = ./test_tahoe.py;
+  };
 }
diff --git a/nixos/tests/test_tahoe.py b/nixos/tests/test_tahoe.py
new file mode 100644
index 00000000..c5190c78
--- /dev/null
+++ b/nixos/tests/test_tahoe.py
@@ -0,0 +1,45 @@
+def test():
+    start_all()
+
+    # After the service starts, destroy the "created" marker to force it to
+    # re-create its internal state.
+    storage.wait_for_open_port(4001)
+    storage.succeed("systemctl stop tahoe.storage")
+    storage.succeed("rm /var/db/tahoe-lafs/storage.created")
+    storage.succeed("systemctl start tahoe.storage")
+
+    # After it starts up again, verify it has consistent internal state and a
+    # backup of the prior state.
+    storage.wait_for_open_port(4001)
+    storage.succeed("[ -e /var/db/tahoe-lafs/storage ]")
+    storage.succeed("[ -e /var/db/tahoe-lafs/storage.created ]")
+    storage.succeed("[ -e /var/db/tahoe-lafs/storage.1 ]")
+    storage.succeed("[ -e /var/db/tahoe-lafs/storage.1/private/node.privkey ]")
+    storage.succeed("[ -e /var/db/tahoe-lafs/storage.1/private/node.pem ]")
+    storage.succeed("[ ! -e /var/db/tahoe-lafs/storage.2 ]")
+
+    # Stop it again, once again destroy the "created" marker, and this time also
+    # jam some partial state in the way that will need cleanup.
+    storage.succeed("systemctl stop tahoe.storage")
+    storage.succeed("rm /var/db/tahoe-lafs/storage.created")
+    storage.succeed("mkdir -p /var/db/tahoe-lafs/storage.atomic/partial")
+    try:
+        storage.succeed("systemctl start tahoe.storage")
+    except:
+        x, y = storage.execute("journalctl -u tahoe.storage")
+        storage.log(y)
+        raise
+
+    # After it starts up again, verify it has consistent internal state and
+    # backups of the prior two states.  It also has no copy of the inconsistent
+    # state because it could never have been used.
+    storage.wait_for_open_port(4001)
+    storage.succeed("[ -e /var/db/tahoe-lafs/storage ]")
+    storage.succeed("[ -e /var/db/tahoe-lafs/storage.created ]")
+    storage.succeed("[ -e /var/db/tahoe-lafs/storage.1 ]")
+    storage.succeed("[ -e /var/db/tahoe-lafs/storage.2 ]")
+    storage.succeed("[ -e /var/db/tahoe-lafs/storage.2/private/node.privkey ]")
+    storage.succeed("[ -e /var/db/tahoe-lafs/storage.2/private/node.pem ]")
+    storage.succeed("[ ! -e /var/db/tahoe-lafs/storage.atomic ]")
+    storage.succeed("[ ! -e /var/db/tahoe-lafs/storage/partial ]")
+    storage.succeed("[ ! -e /var/db/tahoe-lafs/storage.3 ]")
-- 
GitLab