]> git.scottworley.com Git - syncthing-autoregister/blobdiff - tests/automatic-enrollment.nix
Follow nix version bump that changed the eval command line interface
[syncthing-autoregister] / tests / automatic-enrollment.nix
index 803013d4dab2881615cd5345c0dd3333d6f245c9..9b0b76f0d0a7fcdc3c951b8ecfc97d95920c8d8a 100644 (file)
@@ -1,11 +1,11 @@
 import <nixpkgs/nixos/tests/make-test-python.nix> ({ pkgs, lib, ... }:
   let
     deviceIDFilename = "/tmp/syncthing-auto-register-test-device-ids.nix";
-    configuration = pkgs.writeText "configuration.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;
@@ -15,57 +15,138 @@ import <nixpkgs/nixos/tests/make-test-python.nix> ({ pkgs, lib, ... }:
             path = "${deviceIDFilename}";
           };
         };
+
+        # For verifyDeviceIDSet()
         environment.systemPackages = with pkgs; [ nix ];
       }
     '';
-    initialConfiguration = pkgs.writeText "initial-configuration.nix" ''
-      {
-        imports = [ "${configuration}" ];
+
+    evaluatedVMConfiguration = import <nixos/nixos/lib/eval-config.nix> {
+      system = builtins.currentSystem;
+      modules = [ "${vmConfiguration}" ];
+    };
+
+    # Also include a syncthing configuration with a declarative 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;
+            declarative.folders.forDeps.path = "/nope";
+          };
+        }
+      ];
+    };
+
+    initialConfiguration = {
+        imports = [ "${vmConfiguration}" ];
+        virtualisation.memorySize = 2048;
         system.activationScripts.installInitialConfiguration = {
-          text = '''
+          text = ''
             mkdir -p /etc/nixos
-            cp "${configuration}" /etc/nixos/configuration.nix
-          ''';
+            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 = [
-            ${configuration}
+            ${vmConfiguration}
             ${deviceIDFilename}
           ];
         }
       '';
+
+    configurationWithFolder =
+      pkgs.writeText "configuration-with-folder.nix" ''
+        { config, ... }: {
+          imports = [ ${configurationWithDeviceIDs} ];
+          services.syncthing.declarative.folders.foo = {
+            devices = [ "a" "b" ];
+            path = "''${config.services.syncthing.dataDir}/foo";
+          };
+        }
+      '';
+
   in {
 
     name = "syncthing";
 
     nodes = {
-      a = "${initialConfiguration}";
-      b = "${initialConfiguration}";
+      a = initialConfiguration;
+      b = initialConfiguration;
     };
 
     testScript = ''
+      import os
+
+
       def setConfig(machine, config):
           machine.copy_from_host(config, "/etc/nixos/configuration.nix")
 
 
       def verifyDeviceIDSet(machine, expectedDevice):
-          machine.succeed(
-              '(( "$(nix eval --raw -f "<nixos/nixos>" config.services.syncthing.declarative.devices.%s.id | wc -c)" == 63 ))'
+          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}"
       )
+      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")
     '';
   })