{ system ? builtins.currentSystem
, config ? { }
, pkgs ? import ../.. { inherit system config; }
}:

with import ../lib/testing-python.nix { inherit system pkgs; };
with pkgs.lib;
{
  bind = makeTest {
    name = "non-default-filesystem-bind";

    nodes.machine = { ... }: {
      virtualisation.writableStore = false;

      virtualisation.fileSystems."/test-bind-dir/bind" = {
        device = "/";
        neededForBoot = true;
        options = [ "bind" ];
      };

      virtualisation.fileSystems."/test-bind-file/bind" = {
        depends = [ "/nix/store" ];
        device = builtins.toFile "empty" "";
        neededForBoot = true;
        options = [ "bind" ];
      };
    };

    testScript = ''
      machine.wait_for_unit("multi-user.target")
    '';
  };

  btrfs = makeTest
    {
      name = "non-default-filesystems-btrfs";

      nodes.machine =
        { config, pkgs, lib, ... }:
        let
          disk = config.virtualisation.rootDevice;
        in
        {
          virtualisation.rootDevice = "/dev/vda";
          virtualisation.useDefaultFilesystems = false;

          boot.initrd.availableKernelModules = [ "btrfs" ];
          boot.supportedFilesystems = [ "btrfs" ];

          boot.initrd.postDeviceCommands = ''
            FSTYPE=$(blkid -o value -s TYPE ${disk} || true)
            if test -z "$FSTYPE"; then
              modprobe btrfs
              ${pkgs.btrfs-progs}/bin/mkfs.btrfs ${disk}

              mkdir /nixos
              mount -t btrfs ${disk} /nixos

              ${pkgs.btrfs-progs}/bin/btrfs subvolume create /nixos/root
              ${pkgs.btrfs-progs}/bin/btrfs subvolume create /nixos/home

              umount /nixos
            fi
          '';

          virtualisation.fileSystems = {
            "/" = {
              device = disk;
              fsType = "btrfs";
              options = [ "subvol=/root" ];
            };

            "/home" = {
              device = disk;
              fsType = "btrfs";
              options = [ "subvol=/home" ];
            };
          };
        };

      testScript = ''
        machine.wait_for_unit("multi-user.target")

        with subtest("BTRFS filesystems are mounted correctly"):
          print("output of \"grep -E '/dev/vda' /proc/mounts\":\n" + machine.execute("grep -E '/dev/vda' /proc/mounts")[1])
          machine.succeed("grep -E '/dev/vda / btrfs rw,.*subvolid=[0-9]+,subvol=/root 0 0' /proc/mounts")
          machine.succeed("grep -E '/dev/vda /home btrfs rw,.*subvolid=[0-9]+,subvol=/home 0 0' /proc/mounts")
      '';
    };

  erofs =
    let
      fsImage = "/tmp/non-default-filesystem.img";
    in
    makeTest {
      name = "non-default-filesystems-erofs";

      meta.maintainers = with maintainers; [ nikstur ];

      nodes.machine = _: {
        virtualisation.qemu.drives = [{
          name = "non-default-filesystem";
          file = fsImage;
        }];

        virtualisation.fileSystems."/non-default" = {
          device = "/dev/vdb";
          fsType = "erofs";
          neededForBoot = true;
        };
      };

      testScript = ''
        import subprocess
        import tempfile

        with tempfile.TemporaryDirectory() as tmp_dir:
          with open(f"{tmp_dir}/filesystem", "w") as f:
              f.write("erofs")

          subprocess.run([
            "${pkgs.erofs-utils}/bin/mkfs.erofs",
            "${fsImage}",
            tmp_dir,
          ])

        machine.start()
        machine.wait_for_unit("default.target")

        file_contents = machine.succeed("cat /non-default/filesystem")
        assert "erofs" in file_contents
      '';
    };

  squashfs =
    let
      fsImage = "/tmp/non-default-filesystem.img";
    in
    makeTest {
      name = "non-default-filesystems-squashfs";

      meta.maintainers = with maintainers; [ nikstur ];

      nodes.machine = {
        virtualisation.qemu.drives = [{
          name = "non-default-filesystem";
          file = fsImage;
          deviceExtraOpts.serial = "non-default";
        }];

        virtualisation.fileSystems."/non-default" = {
          device = "/dev/disk/by-id/virtio-non-default";
          fsType = "squashfs";
          neededForBoot = true;
        };
      };

      testScript = ''
        import subprocess

        with open("filesystem", "w") as f:
          f.write("squashfs")

        subprocess.run([
          "${pkgs.squashfsTools}/bin/mksquashfs",
          "filesystem",
          "${fsImage}",
        ])

        assert "squashfs" in machine.succeed("cat /non-default/filesystem")
      '';
    };
}
