summaryrefslogtreecommitdiffstats
path: root/nixos/tests/cgit.nix
blob: a7839e24c4a4827e15b4d1a021b0d871f0b733e2 (plain)
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
{ pkgs, ... }:
let
  robotsTxt = pkgs.writeText "cgit-robots.txt" ''
    User-agent: *
    Disallow: /
  '';
in
{
  name = "cgit";
  meta = with pkgs.lib.maintainers; {
    maintainers = [ schnusch ];
  };

  nodes = {
    server =
      { ... }:
      {
        services.cgit."localhost" = {
          enable = true;
          package = pkgs.cgit.overrideAttrs (
            { postInstall, ... }:
            {
              postInstall = ''
                ${postInstall}
                cp ${robotsTxt} "$out/cgit/robots.txt"
              '';
            }
          );
          nginx.location = "/(c)git/";
          repos = {
            some-repo = {
              path = "/tmp/git/some-repo";
              desc = "some-repo description";
            };
          };
          settings = {
            readme = [
              ":README.md"
              ":date.txt"
            ];
          };
          gitHttpBackend.checkExportOkFiles = false;
        };
        services.cgit."check.localhost" = {
          enable = true;
          scanPath = "/tmp/git";
          settings = {
            strict-export = "git-daemon-export-ok";
          };
          gitHttpBackend.checkExportOkFiles = true;
        };
        services.cgit."no-git-http-backend.localhost" = {
          enable = true;
          scanPath = "/tmp/git";
          settings = {
            strict-export = "git-daemon-export-ok";
          };
          gitHttpBackend.enable = false;
        };

        environment.systemPackages = [ pkgs.git ];
      };
  };

  testScript =
    { nodes, ... }:
    ''
      start_all()

      server.wait_for_unit("nginx.service")
      server.wait_for_unit("network.target")
      server.wait_for_open_port(80)

      server.succeed("curl -fsS http://localhost/%28c%29git/cgit.css")

      server.succeed("curl -fsS http://localhost/%28c%29git/robots.txt | diff -u - ${robotsTxt}")

      server.succeed(
          "curl -fsS http://localhost/%28c%29git/ | grep -F 'some-repo description'"
      )

      server.fail("curl -fsS http://localhost/robots.txt")

      server.succeed("sudo -u cgit ${pkgs.writeShellScript "setup-cgit-test-repo" ''
        set -e
        git init --bare -b master /tmp/git/some-repo
        git init -b master reference
        cd reference
        git remote add origin /tmp/git/some-repo
        { echo -n "cgit NixOS Test at "; date; } > date.txt
        git add date.txt
        git -c user.name=test -c user.email=test@localhost commit -m 'add date'
        git push -u origin master
      ''}")

      # test web download
      server.succeed(
          "curl -fsS 'http://localhost/%28c%29git/some-repo/plain/date.txt?id=master' | diff -u reference/date.txt -"
      )

      # test http clone
      server.succeed(
         "git clone http://localhost/%28c%29git/some-repo && diff -u reference/date.txt some-repo/date.txt"
      )

      # test list settings by greping for the fallback readme
      server.succeed(
          "curl -fsS 'http://localhost/%28c%29git/some-repo/about/' | grep -F 'cgit NixOS Test at'"
      )

      # add real readme
      server.succeed("sudo -u cgit ${pkgs.writeShellScript "cgit-commit-readme" ''
        set -e
        echo '# cgit NixOS test README' > reference/README.md
        git -C reference add README.md
        git -C reference -c user.name=test -c user.email=test@localhost commit -m 'add readme'
        git -C reference push
      ''}")

      # test list settings by greping for the real readme
      server.succeed(
          "curl -fsS 'http://localhost/%28c%29git/some-repo/about/' | grep -F '# cgit NixOS test README'"
      )
      server.fail(
          "curl -fsS 'http://localhost/%28c%29git/some-repo/about/' | grep -F 'cgit NixOS Test at'"
      )

      # EXPORT_ALL is not set with checkExportOkFiles = true
      server.succeed("touch /tmp/git/some-repo/git-daemon-export-ok")
      server.succeed(
         "git clone http://check.localhost/some-repo $(mktemp -d)"
      )
      server.succeed("rm /tmp/git/some-repo/git-daemon-export-ok")
      server.fail(
         "git clone http://check.localhost/some-repo $(mktemp -d)"
      )

      # Disabling the git-http-backend-works
      server.succeed("touch /tmp/git/some-repo/git-daemon-export-ok")
      server.succeed(
         "git clone http://no-git-http-backend.localhost/some-repo $(mktemp -d)"
      )
      server.succeed("rm /tmp/git/some-repo/git-daemon-export-ok")
      server.fail(
         "git clone http://no-git-http-backend.localhost/some-repo $(mktemp -d)"
      )
    '';
}