nixpkgs/nixos/tests/networking-proxy.nix
2020-01-30 19:13:30 -05:00

135 lines
4.1 KiB
Nix

# 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-python.nix ({ pkgs, ...} : {
name = "networking-proxy";
meta = with pkgs.stdenv.lib.maintainers; {
maintainers = [ ];
};
nodes = {
# no proxy
machine =
{ ... }:
default-config;
# proxy default
machine2 =
{ ... }:
default-config // {
networking.proxy.default = "http://user:pass@host:port";
};
# specific proxy options
machine3 =
{ ... }:
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 =
{ ... }:
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 =
''
from typing import Dict, Optional
def get_machine_env(machine: Machine, user: Optional[str] = None) -> Dict[str, str]:
"""
Gets the environment from a given machine, and returns it as a
dictionary in the form:
{"lowercase_var_name": "value"}
Duplicate environment variables with the same name
(e.g. "foo" and "FOO") are handled in an undefined manner.
"""
if user is not None:
env = machine.succeed("su - {} -c 'env -0'".format(user))
else:
env = machine.succeed("env -0")
ret = {}
for line in env.split("\0"):
if "=" not in line:
continue
key, val = line.split("=", 1)
ret[key.lower()] = val
return ret
start_all()
with subtest("no proxy"):
assert "proxy" not in machine.succeed("env").lower()
assert "proxy" not in machine.succeed("su - alice -c env").lower()
with subtest("default proxy"):
assert "proxy" in machine2.succeed("env").lower()
assert "proxy" in machine2.succeed("su - alice -c env").lower()
with subtest("explicitly-set proxy"):
env = get_machine_env(machine3)
assert "123" in env["http_proxy"]
assert "456" in env["https_proxy"]
assert "789" in env["rsync_proxy"]
assert "101112" in env["ftp_proxy"]
assert "131415" in env["no_proxy"]
env = get_machine_env(machine3, "alice")
assert "123" in env["http_proxy"]
assert "456" in env["https_proxy"]
assert "789" in env["rsync_proxy"]
assert "101112" in env["ftp_proxy"]
assert "131415" in env["no_proxy"]
with subtest("default proxy + some other specifics"):
env = get_machine_env(machine4)
assert "000" in env["http_proxy"]
assert "000" in env["https_proxy"]
assert "123" in env["rsync_proxy"]
assert "000" in env["ftp_proxy"]
assert "131415" in env["no_proxy"]
env = get_machine_env(machine4, "alice")
assert "000" in env["http_proxy"]
assert "000" in env["https_proxy"]
assert "123" in env["rsync_proxy"]
assert "000" in env["ftp_proxy"]
assert "131415" in env["no_proxy"]
'';
})