92 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
import ./make-test-python.nix ({ pkgs, ... }: {
 | 
						|
  name = "caddy";
 | 
						|
  meta = with pkgs.stdenv.lib.maintainers; {
 | 
						|
    maintainers = [ xfix filalex77 ];
 | 
						|
  };
 | 
						|
 | 
						|
  nodes = {
 | 
						|
    webserver = { pkgs, lib, ... }: {
 | 
						|
      services.caddy.enable = true;
 | 
						|
      services.caddy.config = ''
 | 
						|
        http://localhost {
 | 
						|
          encode gzip
 | 
						|
 | 
						|
          file_server
 | 
						|
          root * ${
 | 
						|
            pkgs.runCommand "testdir" {} ''
 | 
						|
              mkdir "$out"
 | 
						|
              echo hello world > "$out/example.html"
 | 
						|
            ''
 | 
						|
          }
 | 
						|
        }
 | 
						|
      '';
 | 
						|
 | 
						|
      specialisation.etag.configuration = {
 | 
						|
        services.caddy.config = lib.mkForce ''
 | 
						|
          http://localhost {
 | 
						|
            encode gzip
 | 
						|
 | 
						|
            file_server
 | 
						|
            root * ${
 | 
						|
              pkgs.runCommand "testdir2" {} ''
 | 
						|
                mkdir "$out"
 | 
						|
                echo changed > "$out/example.html"
 | 
						|
              ''
 | 
						|
            }
 | 
						|
          }
 | 
						|
        '';
 | 
						|
      };
 | 
						|
 | 
						|
      specialisation.config-reload.configuration = {
 | 
						|
        services.caddy.config = ''
 | 
						|
          http://localhost:8080 {
 | 
						|
          }
 | 
						|
        '';
 | 
						|
      };
 | 
						|
    };
 | 
						|
  };
 | 
						|
 | 
						|
  testScript = { nodes, ... }: let
 | 
						|
    etagSystem = "${nodes.webserver.config.system.build.toplevel}/specialisation/etag";
 | 
						|
    justReloadSystem = "${nodes.webserver.config.system.build.toplevel}/specialisation/config-reload";
 | 
						|
  in ''
 | 
						|
    url = "http://localhost/example.html"
 | 
						|
    webserver.wait_for_unit("caddy")
 | 
						|
    webserver.wait_for_open_port("80")
 | 
						|
 | 
						|
 | 
						|
    def check_etag(url):
 | 
						|
        etag = webserver.succeed(
 | 
						|
            "curl --fail -v '{}' 2>&1 | sed -n -e \"s/^< [Ee][Tt][Aa][Gg]: *//p\"".format(
 | 
						|
                url
 | 
						|
            )
 | 
						|
        )
 | 
						|
        etag = etag.replace("\r\n", " ")
 | 
						|
        http_code = webserver.succeed(
 | 
						|
            "curl --fail --silent --show-error -o /dev/null -w \"%{{http_code}}\" --head -H 'If-None-Match: {}' {}".format(
 | 
						|
                etag, url
 | 
						|
            )
 | 
						|
        )
 | 
						|
        assert int(http_code) == 304, "HTTP code is {}, expected 304".format(http_code)
 | 
						|
        return etag
 | 
						|
 | 
						|
 | 
						|
    with subtest("check ETag if serving Nix store paths"):
 | 
						|
        old_etag = check_etag(url)
 | 
						|
        webserver.succeed(
 | 
						|
            "${etagSystem}/bin/switch-to-configuration test >&2"
 | 
						|
        )
 | 
						|
        webserver.sleep(1)
 | 
						|
        new_etag = check_etag(url)
 | 
						|
        assert old_etag != new_etag, "Old ETag {} is the same as {}".format(
 | 
						|
            old_etag, new_etag
 | 
						|
        )
 | 
						|
 | 
						|
    with subtest("config is reloaded on nixos-rebuild switch"):
 | 
						|
        webserver.succeed(
 | 
						|
            "${justReloadSystem}/bin/switch-to-configuration test >&2"
 | 
						|
        )
 | 
						|
        webserver.wait_for_open_port("8080")
 | 
						|
  '';
 | 
						|
})
 |