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;
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 = ''
def verifyDeviceIDSet(machine, expectedDevice):
- machine.succeed(
+ machine.wait_until_succeeds(
'(( "$(nix eval --raw -f "<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}"
)
-
- hostDeviceIDFilename = os.path.join(
- os.environ["out"],
- os.path.basename("${deviceIDFilename}"),
+ configurationWithFolder = (
+ "${configurationWithFolder}"
)
+ start_all()
a.wait_for_unit("syncthing-autoregister.service")
setConfig(a, configurationWithDeviceIDs)
verifyDeviceIDSet(a, "a")
- a.copy_from_vm("${deviceIDFilename}")
+ getDeviceFile(a)
- b.copy_from_host(
- hostDeviceIDFilename, "${deviceIDFilename}"
- )
- b.succeed("chown syncthing ${deviceIDFilename}")
+ 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")
'';
})