136 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			136 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"]
 | |
|     '';
 | |
| })
 | 
