90 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
		
		
			
		
	
	
			90 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| 
								 | 
							
								import ./make-test-python.nix {
							 | 
						||
| 
								 | 
							
								  name = "nginx-etag";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  nodes = {
							 | 
						||
| 
								 | 
							
								    server = { pkgs, lib, ... }: {
							 | 
						||
| 
								 | 
							
								      networking.firewall.enable = false;
							 | 
						||
| 
								 | 
							
								      services.nginx.enable = true;
							 | 
						||
| 
								 | 
							
								      services.nginx.virtualHosts.server = {
							 | 
						||
| 
								 | 
							
								        root = pkgs.runCommandLocal "testdir" {} ''
							 | 
						||
| 
								 | 
							
								          mkdir "$out"
							 | 
						||
| 
								 | 
							
								          cat > "$out/test.js" <<EOF
							 | 
						||
| 
								 | 
							
								          document.getElementById('foobar').setAttribute('foo', 'bar');
							 | 
						||
| 
								 | 
							
								          EOF
							 | 
						||
| 
								 | 
							
								          cat > "$out/index.html" <<EOF
							 | 
						||
| 
								 | 
							
								          <!DOCTYPE html>
							 | 
						||
| 
								 | 
							
								          <div id="foobar">test</div>
							 | 
						||
| 
								 | 
							
								          <script src="test.js"></script>
							 | 
						||
| 
								 | 
							
								          EOF
							 | 
						||
| 
								 | 
							
								        '';
							 | 
						||
| 
								 | 
							
								      };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      nesting.clone = lib.singleton {
							 | 
						||
| 
								 | 
							
								        services.nginx.virtualHosts.server = {
							 | 
						||
| 
								 | 
							
								          root = lib.mkForce (pkgs.runCommandLocal "testdir2" {} ''
							 | 
						||
| 
								 | 
							
								            mkdir "$out"
							 | 
						||
| 
								 | 
							
								            cat > "$out/test.js" <<EOF
							 | 
						||
| 
								 | 
							
								            document.getElementById('foobar').setAttribute('foo', 'yay');
							 | 
						||
| 
								 | 
							
								            EOF
							 | 
						||
| 
								 | 
							
								            cat > "$out/index.html" <<EOF
							 | 
						||
| 
								 | 
							
								            <!DOCTYPE html>
							 | 
						||
| 
								 | 
							
								            <div id="foobar">test</div>
							 | 
						||
| 
								 | 
							
								            <script src="test.js"></script>
							 | 
						||
| 
								 | 
							
								            EOF
							 | 
						||
| 
								 | 
							
								          '');
							 | 
						||
| 
								 | 
							
								        };
							 | 
						||
| 
								 | 
							
								      };
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    client = { pkgs, lib, ... }: {
							 | 
						||
| 
								 | 
							
								      virtualisation.memorySize = 512;
							 | 
						||
| 
								 | 
							
								      environment.systemPackages = let
							 | 
						||
| 
								 | 
							
								        testRunner = pkgs.writers.writePython3Bin "test-runner" {
							 | 
						||
| 
								 | 
							
								          libraries = [ pkgs.python3Packages.selenium ];
							 | 
						||
| 
								 | 
							
								        } ''
							 | 
						||
| 
								 | 
							
								          import os
							 | 
						||
| 
								 | 
							
								          import time
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								          from selenium.webdriver import Firefox
							 | 
						||
| 
								 | 
							
								          from selenium.webdriver.firefox.options import Options
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								          options = Options()
							 | 
						||
| 
								 | 
							
								          options.add_argument('--headless')
							 | 
						||
| 
								 | 
							
								          driver = Firefox(options=options)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								          driver.implicitly_wait(20)
							 | 
						||
| 
								 | 
							
								          driver.get('http://server/')
							 | 
						||
| 
								 | 
							
								          driver.find_element_by_xpath('//div[@foo="bar"]')
							 | 
						||
| 
								 | 
							
								          open('/tmp/passed_stage1', 'w')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								          while not os.path.exists('/tmp/proceed'):
							 | 
						||
| 
								 | 
							
								              time.sleep(0.5)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								          driver.get('http://server/')
							 | 
						||
| 
								 | 
							
								          driver.find_element_by_xpath('//div[@foo="yay"]')
							 | 
						||
| 
								 | 
							
								          open('/tmp/passed', 'w')
							 | 
						||
| 
								 | 
							
								        '';
							 | 
						||
| 
								 | 
							
								      in [ pkgs.firefox-unwrapped pkgs.geckodriver testRunner ];
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  testScript = { nodes, ... }: let
							 | 
						||
| 
								 | 
							
								    inherit (nodes.server.config.system.build) toplevel;
							 | 
						||
| 
								 | 
							
								    newSystem = "${toplevel}/fine-tune/child-1";
							 | 
						||
| 
								 | 
							
								  in ''
							 | 
						||
| 
								 | 
							
								    start_all()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    server.wait_for_unit("nginx.service")
							 | 
						||
| 
								 | 
							
								    client.wait_for_unit("multi-user.target")
							 | 
						||
| 
								 | 
							
								    client.execute("test-runner &")
							 | 
						||
| 
								 | 
							
								    client.wait_for_file("/tmp/passed_stage1")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    server.succeed(
							 | 
						||
| 
								 | 
							
								        "${newSystem}/bin/switch-to-configuration test >&2"
							 | 
						||
| 
								 | 
							
								    )
							 | 
						||
| 
								 | 
							
								    client.succeed("touch /tmp/proceed")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    client.wait_for_file("/tmp/passed")
							 | 
						||
| 
								 | 
							
								  '';
							 | 
						||
| 
								 | 
							
								}
							 |