# Regression test for systemd-timesync having moved the state directory without
# upstream providing a migration path. https://github.com/systemd/systemd/issues/12131

let
  common =
    { lib, ... }:
    {
      # override the `false` value from the qemu-vm base profile
      services.timesyncd.enable = lib.mkForce true;
    };
  mkVM = conf: {
    imports = [
      conf
      common
    ];
  };
in
{
  name = "systemd-timesyncd";
  nodes = {
    current = mkVM { };
    pre1909 = mkVM (
      { lib, ... }:
      {
        # create the path that should be migrated by our activation script when
        # upgrading to a newer nixos version
        system.stateVersion = "19.03";
        systemd.services.old-timesync-state-dir = {
          requiredBy = [ "sysinit.target" ];
          before = [ "systemd-timesyncd.service" ];
          after = [ "local-fs.target" ];
          unitConfig.DefaultDependencies = false;
          serviceConfig.Type = "oneshot";
          script = ''
            rm -rf /var/lib/systemd/timesync
            mkdir -p /var/lib/systemd /var/lib/private/systemd/timesync
            ln -s /var/lib/private/systemd/timesync /var/lib/systemd/timesync
            chown systemd-timesync: /var/lib/private/systemd/timesync
          '';
        };
      }
    );
  };

  testScript = ''
    start_all()
    current.succeed("systemctl status systemd-timesyncd.service")
    # on a new install with a recent systemd there should not be any
    # leftovers from the dynamic user mess
    current.succeed("test -e /var/lib/systemd/timesync")
    current.succeed("test ! -L /var/lib/systemd/timesync")

    # timesyncd should be running on the upgrading system since we fixed the
    # file bits in the activation script
    pre1909.succeed("systemctl status systemd-timesyncd.service")

    # the path should be gone after the migration
    pre1909.succeed("test ! -e /var/lib/private/systemd/timesync")

    # and the new path should no longer be a symlink
    pre1909.succeed("test -e /var/lib/systemd/timesync")
    pre1909.succeed("test ! -L /var/lib/systemd/timesync")

    # after a restart things should still work and not fail in the activation
    # scripts and cause the boot to fail..
    pre1909.shutdown()
    pre1909.start()
    pre1909.succeed("systemctl status systemd-timesyncd.service")
  '';
}
