at 21.11-pre 2.7 kB view raw
1import ./make-test-python.nix { 2 name = "nginx-etag"; 3 4 nodes = { 5 server = { pkgs, lib, ... }: { 6 networking.firewall.enable = false; 7 services.nginx.enable = true; 8 services.nginx.virtualHosts.server = { 9 root = pkgs.runCommandLocal "testdir" {} '' 10 mkdir "$out" 11 cat > "$out/test.js" <<EOF 12 document.getElementById('foobar').setAttribute('foo', 'bar'); 13 EOF 14 cat > "$out/index.html" <<EOF 15 <!DOCTYPE html> 16 <div id="foobar">test</div> 17 <script src="test.js"></script> 18 EOF 19 ''; 20 }; 21 22 specialisation.pass-checks.configuration = { 23 services.nginx.virtualHosts.server = { 24 root = lib.mkForce (pkgs.runCommandLocal "testdir2" {} '' 25 mkdir "$out" 26 cat > "$out/test.js" <<EOF 27 document.getElementById('foobar').setAttribute('foo', 'yay'); 28 EOF 29 cat > "$out/index.html" <<EOF 30 <!DOCTYPE html> 31 <div id="foobar">test</div> 32 <script src="test.js"></script> 33 EOF 34 ''); 35 }; 36 }; 37 }; 38 39 client = { pkgs, lib, ... }: { 40 virtualisation.memorySize = 512; 41 environment.systemPackages = let 42 testRunner = pkgs.writers.writePython3Bin "test-runner" { 43 libraries = [ pkgs.python3Packages.selenium ]; 44 } '' 45 import os 46 import time 47 48 from selenium.webdriver import Firefox 49 from selenium.webdriver.firefox.options import Options 50 51 options = Options() 52 options.add_argument('--headless') 53 driver = Firefox(options=options) 54 55 driver.implicitly_wait(20) 56 driver.get('http://server/') 57 driver.find_element_by_xpath('//div[@foo="bar"]') 58 open('/tmp/passed_stage1', 'w') 59 60 while not os.path.exists('/tmp/proceed'): 61 time.sleep(0.5) 62 63 driver.get('http://server/') 64 driver.find_element_by_xpath('//div[@foo="yay"]') 65 open('/tmp/passed', 'w') 66 ''; 67 in [ pkgs.firefox-unwrapped pkgs.geckodriver testRunner ]; 68 }; 69 }; 70 71 testScript = { nodes, ... }: let 72 inherit (nodes.server.config.system.build) toplevel; 73 newSystem = "${toplevel}/specialisation/pass-checks"; 74 in '' 75 start_all() 76 77 server.wait_for_unit("nginx.service") 78 client.wait_for_unit("multi-user.target") 79 client.execute("test-runner &") 80 client.wait_for_file("/tmp/passed_stage1") 81 82 server.succeed( 83 "${newSystem}/bin/switch-to-configuration test >&2" 84 ) 85 client.succeed("touch /tmp/proceed") 86 87 client.wait_for_file("/tmp/passed") 88 ''; 89}