]> git.scottworley.com Git - syncthing-autoregister/blobdiff - tests/automatic-enrollment.nix
Prefer modulesPath over <nixos/nixos/modules>
[syncthing-autoregister] / tests / automatic-enrollment.nix
index 92c90b72d0ba90b795061e9907b4d63e6357bc07..29a0bdf730cbc85c2c910038341331fc6d86d422 100644 (file)
 import <nixpkgs/nixos/tests/make-test-python.nix> ({ pkgs, lib, ... }:
   let
-    configuration = pkgs.writeText "configuration.nix" ''
+    deviceIDFilename = "/tmp/syncthing-auto-register-test-device-ids.nix";
+    vmConfiguration = pkgs.writeText "vm-configuration.nix" ''
       { pkgs, ... }: {
         imports = [
+          ${../.}/lib/test-nixos-rebuild-switch-config.nix
           ${../.}/modules/syncthing-autoregister.nix
-          <nixos/nixos/modules/installer/cd-dvd/channel.nix>
         ];
         services.syncthing = {
           enable = true;
           openDefaultPorts = true;
           autoRegister = {
             enable = true;
-            path = "/tmp/syncthing-auto-register-test-device-ids.nix";
+            path = "${deviceIDFilename}";
           };
         };
+
+        # For verifyDeviceIDSet()
         environment.systemPackages = with pkgs; [ nix ];
       }
     '';
-    configurationWithDeviceIDs = pkgs.writeText "configuration-with-device-ids.nix" ''
-      {
-        imports = [
-          ${configuration}
-          /tmp/syncthing-auto-register-test-device-ids.nix
+
+    evaluatedVMConfiguration = import <nixos/nixos/lib/eval-config.nix> {
+      system = builtins.currentSystem;
+      modules = [ "${vmConfiguration}" ];
+    };
+
+    # Also include a syncthing configuration with a device id
+    # because using this feature pulls in additional dependencies.
+    evaluatedSyncthingDeclarativeConfiguration = import <nixos/nixos/lib/eval-config.nix> {
+      system = builtins.currentSystem;
+      modules = [
+        ../lib/test-nixos-rebuild-switch-config.nix
+        {
+          services.syncthing = {
+            enable = true;
+            folders.forDeps.path = "/nope";
+          };
+        }
+      ];
+    };
+
+    initialConfiguration = {
+        imports = [ "${vmConfiguration}" ];
+        virtualisation.memorySize = 2048;
+        system.activationScripts.installInitialConfiguration = {
+          text = ''
+            mkdir -p /etc/nixos
+            cp "${vmConfiguration}" /etc/nixos/configuration.nix
+          '';
+          deps = [ ];
+        };
+        system.extraDependencies = [
+          evaluatedVMConfiguration.config.system.build.toplevel
+          evaluatedSyncthingDeclarativeConfiguration.config.system.build.toplevel
         ];
-      }
-    '';
+      };
+
+    configurationWithDeviceIDs =
+      pkgs.writeText "configuration-with-device-ids.nix" ''
+        {
+          imports = [
+            ${vmConfiguration}
+            ${deviceIDFilename}
+          ];
+        }
+      '';
+
+    configurationWithFolder =
+      pkgs.writeText "configuration-with-folder.nix" ''
+        { config, ... }: {
+          imports = [ ${configurationWithDeviceIDs} ];
+          services.syncthing.folders.foo = {
+            devices = [ "a" "b" ];
+            path = "''${config.services.syncthing.dataDir}/foo";
+          };
+        }
+      '';
+
   in {
 
     name = "syncthing";
 
-    machine = "${configuration}";
+    nodes = {
+      a = initialConfiguration;
+      b = initialConfiguration;
+    };
 
     testScript = ''
-      machine.copy_from_host(
-          "${configuration}",
-          "/etc/nixos/configuration.nix",
-      )
-      machine.wait_for_unit("syncthing-autoregister.service")
-      machine.copy_from_host(
-          "${configurationWithDeviceIDs}",
-          "/etc/nixos/configuration.nix",
+      import os
+
+
+      def setConfig(machine, config):
+          machine.copy_from_host(config, "/etc/nixos/configuration.nix")
+
+
+      def verifyDeviceIDSet(machine, expectedDevice):
+          machine.wait_until_succeeds(
+              '(( "$(nix --experimental-features nix-command eval --impure --raw --expr "(import <nixos/nixos> {}).config.services.syncthing.declarative.devices.%s.id" | wc -c)" == 63 ))'
+              % expectedDevice
+          )
+
+
+      def getDeviceFile(machine):
+          machine.copy_from_vm("${deviceIDFilename}")
+
+
+      def putDeviceFile(machine):
+          hostDeviceIDFilename = os.path.join(
+              os.environ["out"],
+              os.path.basename("${deviceIDFilename}"),
+          )
+          machine.copy_from_host(
+              hostDeviceIDFilename, "${deviceIDFilename}"
+          )
+          machine.succeed("chown syncthing ${deviceIDFilename}")
+
+
+      configurationWithDeviceIDs = (
+          "${configurationWithDeviceIDs}"
       )
-      machine.succeed(
-          '(( "$(nix eval --raw -f "<nixos/nixos>" config.services.syncthing.declarative.devices.machine.id | wc -c)" == 63 ))'
+      configurationWithFolder = (
+          "${configurationWithFolder}"
       )
+
+      start_all()
+      a.wait_for_unit("syncthing-autoregister.service")
+      setConfig(a, configurationWithDeviceIDs)
+      verifyDeviceIDSet(a, "a")
+      getDeviceFile(a)
+
+      b.wait_for_unit("syncthing-autoregister.service")
+      putDeviceFile(b)
+      setConfig(b, configurationWithDeviceIDs)
+      verifyDeviceIDSet(b, "a")
+      verifyDeviceIDSet(b, "b")
+
+      getDeviceFile(b)
+      putDeviceFile(a)
+      setConfig(a, configurationWithFolder)
+      setConfig(b, configurationWithFolder)
+      a.succeed("nixos-rebuild switch")
+      b.succeed("nixos-rebuild switch")
+      a.wait_for_file("/var/lib/syncthing/foo")
+      b.wait_for_file("/var/lib/syncthing/foo")
+      a.succeed("echo a2b > /var/lib/syncthing/foo/a2b")
+      b.succeed("echo b2a > /var/lib/syncthing/foo/b2a")
+      a.wait_for_file("/var/lib/syncthing/foo/b2a")
+      b.wait_for_file("/var/lib/syncthing/foo/a2b")
     '';
   })