83 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
		
		
			
		
	
	
			83 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| 
								 | 
							
								import ./make-test.nix ({ pkgs, ... }: {
							 | 
						||
| 
								 | 
							
								  name = "caddy";
							 | 
						||
| 
								 | 
							
								  meta = with pkgs.stdenv.lib.maintainers; {
							 | 
						||
| 
								 | 
							
								    maintainers = [ xfix ];
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  nodes = {
							 | 
						||
| 
								 | 
							
								    webserver = { pkgs, lib, ... }: {
							 | 
						||
| 
								 | 
							
								      services.caddy.enable = true;
							 | 
						||
| 
								 | 
							
								      services.caddy.config = ''
							 | 
						||
| 
								 | 
							
								        http://localhost {
							 | 
						||
| 
								 | 
							
								          gzip
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								          root ${
							 | 
						||
| 
								 | 
							
								            pkgs.runCommand "testdir" {} ''
							 | 
						||
| 
								 | 
							
								              mkdir "$out"
							 | 
						||
| 
								 | 
							
								              echo hello world > "$out/example.html"
							 | 
						||
| 
								 | 
							
								            ''
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      '';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      nesting.clone = [
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								          services.caddy.config = lib.mkForce ''
							 | 
						||
| 
								 | 
							
								            http://localhost {
							 | 
						||
| 
								 | 
							
								              gzip
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								              root ${
							 | 
						||
| 
								 | 
							
								                pkgs.runCommand "testdir2" {} ''
							 | 
						||
| 
								 | 
							
								                  mkdir "$out"
							 | 
						||
| 
								 | 
							
								                  echo changed > "$out/example.html"
							 | 
						||
| 
								 | 
							
								                ''
							 | 
						||
| 
								 | 
							
								              }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								          '';
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								          services.caddy.config = ''
							 | 
						||
| 
								 | 
							
								            http://localhost:8080 {
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								          '';
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      ];
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  testScript = { nodes, ... }: let
							 | 
						||
| 
								 | 
							
								    etagSystem = "${nodes.webserver.config.system.build.toplevel}/fine-tune/child-1";
							 | 
						||
| 
								 | 
							
								    justReloadSystem = "${nodes.webserver.config.system.build.toplevel}/fine-tune/child-2";
							 | 
						||
| 
								 | 
							
								  in ''
							 | 
						||
| 
								 | 
							
								    my $url = 'http://localhost/example.html';
							 | 
						||
| 
								 | 
							
								    $webserver->waitForUnit("caddy");
							 | 
						||
| 
								 | 
							
								    $webserver->waitForOpenPort("80");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    sub checkEtag {
							 | 
						||
| 
								 | 
							
								      my $etag = $webserver->succeed(
							 | 
						||
| 
								 | 
							
								        'curl -v '.$url.' 2>&1 | sed -n -e "s/^< [Ee][Tt][Aa][Gg]: *//p"'
							 | 
						||
| 
								 | 
							
								      );
							 | 
						||
| 
								 | 
							
								      $etag =~ s/\r?\n$//;
							 | 
						||
| 
								 | 
							
								      my $httpCode = $webserver->succeed(
							 | 
						||
| 
								 | 
							
								        'curl -w "%{http_code}" -X HEAD -H \'If-None-Match: '.$etag.'\' '.$url
							 | 
						||
| 
								 | 
							
								      );
							 | 
						||
| 
								 | 
							
								      die "HTTP code is not 304" unless $httpCode == 304;
							 | 
						||
| 
								 | 
							
								      return $etag;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    subtest "check ETag if serving Nix store paths", sub {
							 | 
						||
| 
								 | 
							
								      my $oldEtag = checkEtag;
							 | 
						||
| 
								 | 
							
								      $webserver->succeed("${etagSystem}/bin/switch-to-configuration test >&2");
							 | 
						||
| 
								 | 
							
								      $webserver->sleep(1); # race condition
							 | 
						||
| 
								 | 
							
								      my $newEtag = checkEtag;
							 | 
						||
| 
								 | 
							
								      die "Old ETag $oldEtag is the same as $newEtag" if $oldEtag eq $newEtag;
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    subtest "config is reloaded on nixos-rebuild switch", sub {
							 | 
						||
| 
								 | 
							
								      $webserver->succeed("${justReloadSystem}/bin/switch-to-configuration test >&2");
							 | 
						||
| 
								 | 
							
								      $webserver->waitForOpenPort("8080");
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								  '';
							 | 
						||
| 
								 | 
							
								})
							 |