summaryrefslogtreecommitdiffstats
path: root/nixos/tests/timezone.nix
blob: 938c6bed95342c79f4d9dbbb867878d50923c07d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
{ pkgs, ... }:
{
  name = "timezone";
  meta.maintainers = [ ];

  nodes = {
    node_eutz =
      { pkgs, ... }:
      {
        time.timeZone = "Europe/Amsterdam";
      };

    node_nulltz =
      { pkgs, ... }:
      {
        time.timeZone = null;
      };
  };

  testScript =
    { nodes, ... }:
    ''
      node_eutz.wait_for_unit("dbus.socket")

      with subtest("static - Ensure timezone change gives the correct result"):
          node_eutz.fail("timedatectl set-timezone Asia/Tokyo")
          date_result = node_eutz.succeed('date -d @0 "+%Y-%m-%d %H:%M:%S"')
          assert date_result == "1970-01-01 01:00:00\n", "Timezone seems to be wrong"

      node_nulltz.wait_for_unit("dbus.socket")

      with subtest("imperative - Ensure timezone defaults to UTC"):
          date_result = node_nulltz.succeed('date -d @0 "+%Y-%m-%d %H:%M:%S"')
          print(date_result)
          assert (
              date_result == "1970-01-01 00:00:00\n"
          ), "Timezone seems to be wrong (not UTC)"

      with subtest("imperative - Ensure timezone adjustment produces expected result"):
          node_nulltz.succeed("timedatectl set-timezone Asia/Tokyo")

          # Adjustment should be taken into account
          date_result = node_nulltz.succeed('date -d @0 "+%Y-%m-%d %H:%M:%S"')
          print(date_result)
          assert date_result == "1970-01-01 09:00:00\n", "Timezone was not adjusted"

          # Stop systemd-timedated.service to clear /etc/localtime read cache
          node_nulltz.systemctl("stop systemd-timedated.service")
          timedatectl_result = node_nulltz.succeed("timedatectl status")
          print(timedatectl_result)
          assert "Asia/Tokyo" in timedatectl_result, "'timedatectl status' output is missing 'Asia/Tokyo'"

      with subtest("imperative - Ensure /etc/localtime symlink includes '/zoneinfo/' like icu expects"):
          # https://github.com/unicode-org/icu/blob/release-78.3/icu4c/source/common/putil.cpp#L686-L695
          readlink_result = node_nulltz.succeed("readlink --no-newline /etc/localtime")
          print(readlink_result)
          assert "/zoneinfo/" in readlink_result, f"/etc/localtime symlink is missing '/zoneinfo/': {readlink_result}"

      with subtest("imperative - Ensure timezone adjustment persists across reboot"):
          # Adjustment should persist across a reboot
          node_nulltz.shutdown()
          node_nulltz.wait_for_unit("dbus.socket")
          date_result = node_nulltz.succeed('date -d @0 "+%Y-%m-%d %H:%M:%S"')
          print(date_result)
          assert (
              date_result == "1970-01-01 09:00:00\n"
          ), "Timezone adjustment was not persisted"
    '';
}