about summary refs log tree commit diff
path: root/pkgs/servers/http/hiawatha/test.nix
blob: 157d0ee79644d173c207efb46f552b102d530cdd (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
{ lib
, stdenvNoCC
, hiawatha
, curl
, mbedtls
, enableTls
}:

stdenvNoCC.mkDerivation {
  name = "hiawatha-test";

  nativeBuildInputs = [
    hiawatha
    curl
  ] ++ lib.optional enableTls mbedtls;

  env = {
    inherit enableTls;
  };

  buildCommand = ''
    cp -r --no-preserve=mode ${hiawatha}/etc/hiawatha config
    sed "1i set TEST_DIR = $(pwd)" $serverConfigPath > config/hiawatha.conf

    mkdir www
    echo "it works" > www/index.html

    if [ -n "$enableTls" ]; then
      echo "Generating self-signed certificate"
      gen_key type=ec filename=server.key
      cert_write selfsign=1 issuer_key=server.key output_file=server.crt
      cat server.crt server.key > config/server.crt
    fi

    echo "Checking server configuration"
    hiawatha -c ./config -k

    echo "Starting server"
    hiawatha -c ./config

    testUrl() {
      echo "Testing $1"
      curl --verbose --insecure --fail "$1" | tee response
      grep -q "it works" response
    }

    testUrl http://127.0.0.1:8000
    if [ -n "$enableTls" ]; then
      testUrl https://127.0.0.1:8443
    fi

    touch $out
  '';

  serverConfig = ''
    # By default the server uses read-only directories like /var/lib and /etc
    WorkDirectory = TEST_DIR
    PIDfile = TEST_DIR/hiawatha.pid
    SystemLogfile = TEST_DIR/system.log
    GarbageLogfile = TEST_DIR/garbage.log
    ExploitLogfile = TEST_DIR/exploit.log
    AccessLogfile = TEST_DIR/access.log
    ErrorLogfile = TEST_DIR/error.log

    Binding {
      Interface = 127.0.0.1
      Port = 8000
    }

    ${lib.optionalString enableTls ''
      Binding {
        Interface = 127.0.0.1
        Port = 8443
        TLScertFile = TEST_DIR/config/server.crt
      }
    ''}

    Hostname = 127.0.0.1
    WebsiteRoot = TEST_DIR/www
    StartFile = index.html
  '';

  passAsFile = [ "serverConfig" ];
}