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}