# Test whether `networking.proxy' work as expected.

# TODO: use a real proxy node and put this test into networking.nix
# TODO: test whether nix tools work as expected behind a proxy

let default-config = {
        imports = [ ./common/user-account.nix ];

        services.xserver.enable = false;

        virtualisation.memorySize = 128;
      };
in import ./make-test.nix ({ pkgs, ...} : {
  name = "networking-proxy";
  meta = with pkgs.stdenv.lib.maintainers; {
    maintainers = [  ];
  };

  nodes = {
    # no proxy
    machine =
      { config, pkgs, ... }:

      default-config;

    # proxy default
    machine2 =
      { config, pkgs, ... }:

      default-config // {
        networking.proxy.default = "http://user:pass@host:port";
      };

    # specific proxy options
    machine3 =
      { config, pkgs, ... }:

      default-config //
      {
        networking.proxy = {
          # useless because overriden by the next options
          default = "http://user:pass@host:port";
          # advanced proxy setup
          httpProxy = "123-http://user:pass@http-host:port";
          httpsProxy = "456-http://user:pass@https-host:port";
          rsyncProxy = "789-http://user:pass@rsync-host:port";
          ftpProxy = "101112-http://user:pass@ftp-host:port";
          noProxy = "131415-127.0.0.1,localhost,.localdomain";
        };
      };

    # mix default + proxy options
    machine4 =
      { config, pkgs, ... }:

      default-config // {
        networking.proxy = {
          # open for all *_proxy env var
          default = "000-http://user:pass@default-host:port";
          # except for those 2
          rsyncProxy = "123-http://user:pass@http-host:port";
          noProxy = "131415-127.0.0.1,localhost,.localdomain";
        };
      };
    };

  testScript =
    ''
      startAll;

      # no proxy at all
      print $machine->execute("env | grep -i proxy");
      print $machine->execute("su - alice -c 'env | grep -i proxy'");
      $machine->mustFail("env | grep -i proxy");
      $machine->mustFail("su - alice -c 'env | grep -i proxy'");

      # Use a default proxy option
      print $machine2->execute("env | grep -i proxy");
      print $machine2->execute("su - alice -c 'env | grep -i proxy'");
      $machine2->mustSucceed("env | grep -i proxy");
      $machine2->mustSucceed("su - alice -c 'env | grep -i proxy'");

      # explicitly set each proxy option
      print $machine3->execute("env | grep -i proxy");
      print $machine3->execute("su - alice -c 'env | grep -i proxy'");
      $machine3->mustSucceed("env | grep -i http_proxy | grep 123");
      $machine3->mustSucceed("env | grep -i https_proxy | grep 456");
      $machine3->mustSucceed("env | grep -i rsync_proxy | grep 789");
      $machine3->mustSucceed("env | grep -i ftp_proxy | grep 101112");
      $machine3->mustSucceed("env | grep -i no_proxy | grep 131415");
      $machine3->mustSucceed("su - alice -c 'env | grep -i http_proxy | grep 123'");
      $machine3->mustSucceed("su - alice -c 'env | grep -i https_proxy | grep 456'");
      $machine3->mustSucceed("su - alice -c 'env | grep -i rsync_proxy | grep 789'");
      $machine3->mustSucceed("su - alice -c 'env | grep -i ftp_proxy | grep 101112'");
      $machine3->mustSucceed("su - alice -c 'env | grep -i no_proxy | grep 131415'");

      # set default proxy option + some other specifics
      print $machine4->execute("env | grep -i proxy");
      print $machine4->execute("su - alice -c 'env | grep -i proxy'");
      $machine4->mustSucceed("env | grep -i http_proxy | grep 000");
      $machine4->mustSucceed("env | grep -i https_proxy | grep 000");
      $machine4->mustSucceed("env | grep -i rsync_proxy | grep 123");
      $machine4->mustSucceed("env | grep -i ftp_proxy | grep 000");
      $machine4->mustSucceed("env | grep -i no_proxy | grep 131415");
      $machine4->mustSucceed("su - alice -c 'env | grep -i http_proxy | grep 000'");
      $machine4->mustSucceed("su - alice -c 'env | grep -i https_proxy | grep 000'");
      $machine4->mustSucceed("su - alice -c 'env | grep -i rsync_proxy | grep 123'");
      $machine4->mustSucceed("su - alice -c 'env | grep -i ftp_proxy | grep 000'");
      $machine4->mustSucceed("su - alice -c 'env | grep -i no_proxy | grep 131415'");
    '';
})
