summaryrefslogtreecommitdiffstats
path: root/nixos/tests/bees.nix
blob: e13e169bff144388640f441ec9436ab6dd2b95b3 (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
70
71
72
73
74
75
76
{ lib, pkgs, ... }:
{
  name = "bees";

  nodes.machine =
    { config, pkgs, ... }:
    {
      virtualisation.emptyDiskImages = [
        {
          size = 4096;
          driveConfig.deviceExtraOpts.serial = "aux1";
        }
        {
          size = 4096;
          driveConfig.deviceExtraOpts.serial = "aux2";
        }
      ];
      virtualisation.fileSystems = {
        "/aux1" = {
          # filesystem configured to be deduplicated
          device = "/dev/disk/by-id/virtio-aux1";
          fsType = "btrfs";
          autoFormat = true;
        };
        "/aux2" = {
          # filesystem not configured to be deduplicated
          device = "/dev/disk/by-id/virtio-aux2";
          fsType = "btrfs";
          autoFormat = true;
        };
      };
      services.beesd.filesystems = {
        aux1 = {
          spec = "/dev/disk/by-id/virtio-aux1";
          hashTableSizeMB = 16;
          verbosity = "debug";
        };
      };
    };

  testScript =
    let
      someContentIsShared =
        loc:
        pkgs.writeShellScript "some-content-is-shared" ''
          [[ $(btrfs fi du -s --raw ${lib.escapeShellArg loc}/dedup-me-{1,2} | awk 'BEGIN { count=0; } NR>1 && $3 == 0 { count++ } END { print count }') -eq 0 ]]
        '';
    in
    ''
      # shut down the instance started by systemd at boot, so we can test our test procedure
      machine.succeed("systemctl stop beesd@aux1.service")

      machine.succeed(
          "dd if=/dev/urandom of=/aux1/dedup-me-1 bs=1M count=8",
          "cp --reflink=never /aux1/dedup-me-1 /aux1/dedup-me-2",
          "cp --reflink=never /aux1/* /aux2/",
          "sync",
      )
      machine.fail(
          "${someContentIsShared "/aux1"}",
          "${someContentIsShared "/aux2"}",
      )
      machine.succeed("systemctl start beesd@aux1.service")

      # assert that "Set Shared" column is nonzero
      machine.wait_until_succeeds(
          "${someContentIsShared "/aux1"}",
      )
      machine.fail("${someContentIsShared "/aux2"}")

      # assert that 16MB hash table size requested was honored
      machine.succeed(
          "[[ $(stat -c %s /aux1/.beeshome/beeshash.dat) = $(( 16 * 1024 * 1024)) ]]"
      )
    '';
}