# Test for cntr tool
{ system ? builtins.currentSystem, config ? { }
, pkgs ? import ../.. { inherit system config; }, lib ? pkgs.lib }:

let
  inherit (import ../lib/testing-python.nix { inherit system pkgs; }) makeTest;

  mkOCITest = backend:
    makeTest {
      name = "cntr-${backend}";

      meta = { maintainers = with lib.maintainers; [ srk mic92 ]; };

      nodes = {
        ${backend} = { pkgs, ... }: {
          environment.systemPackages = [ pkgs.cntr ];
          virtualisation.oci-containers = {
            inherit backend;
            containers.nginx = {
              image = "nginx-container";
              imageFile = pkgs.dockerTools.examples.nginx;
              ports = [ "8181:80" ];
            };
          };
        };
      };

      testScript = ''
        start_all()
        ${backend}.wait_for_unit("${backend}-nginx.service")
        result = ${backend}.wait_until_succeeds(
            "cntr attach -t ${backend} nginx sh -- -c 'curl localhost | grep Hello'"
        )
        assert "Hello" in result
      '';
    };

  mkContainersTest = makeTest {
    name = "cntr-containers";

    meta = with pkgs.lib.maintainers; { maintainers = [ sorki mic92 ]; };

    machine = { lib, ... }: {
      environment.systemPackages = [ pkgs.cntr ];
      containers.test = {
        autoStart = true;
        privateNetwork = true;
        hostAddress = "172.16.0.1";
        localAddress = "172.16.0.2";
        config = { };
      };
    };

    testScript = ''
      machine.start()
      machine.wait_for_unit("container@test.service")
      machine.succeed("cntr attach test sh -- -c 'ping -c5 172.16.0.1'")
    '';
  };
in {
  nixos-container = mkContainersTest;
} // (lib.foldl' (attrs: backend: attrs // { ${backend} = mkOCITest backend; })
  { } [ "docker" "podman" ])
