at 23.05-pre 2.6 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 environment.systemPackages = let 41 testRunner = pkgs.writers.writePython3Bin "test-runner" { 42 libraries = [ pkgs.python3Packages.selenium ]; 43 } '' 44 import os 45 import time 46 47 from selenium.webdriver import Firefox 48 from selenium.webdriver.firefox.options import Options 49 50 options = Options() 51 options.add_argument('--headless') 52 driver = Firefox(options=options) 53 54 driver.implicitly_wait(20) 55 driver.get('http://server/') 56 driver.find_element('xpath', '//div[@foo="bar"]') 57 open('/tmp/passed_stage1', 'w') 58 59 while not os.path.exists('/tmp/proceed'): 60 time.sleep(0.5) 61 62 driver.get('http://server/') 63 driver.find_element('xpath', '//div[@foo="yay"]') 64 open('/tmp/passed', 'w') 65 ''; 66 in [ pkgs.firefox-unwrapped pkgs.geckodriver testRunner ]; 67 }; 68 }; 69 70 testScript = { nodes, ... }: let 71 inherit (nodes.server.config.system.build) toplevel; 72 newSystem = "${toplevel}/specialisation/pass-checks"; 73 in '' 74 start_all() 75 76 server.wait_for_unit("nginx.service") 77 client.wait_for_unit("multi-user.target") 78 client.execute("test-runner >&2 &") 79 client.wait_for_file("/tmp/passed_stage1") 80 81 server.succeed( 82 "${newSystem}/bin/switch-to-configuration test >&2" 83 ) 84 client.succeed("touch /tmp/proceed") 85 86 client.wait_for_file("/tmp/passed") 87 ''; 88}