File view with blame information shown in the left gutter beside each line.

barerepo / server / e2e/head_test.go
91 lines · 2.8kb · master
log files threads runs releases config jump to file t
133728e barerepo 1mo
1
package e2e
133728e barerepo 1mo
2
133728e barerepo 1mo
3
import (
133728e barerepo 1mo
4
"context"
133728e barerepo 1mo
5
"net/http"
133728e barerepo 1mo
6
"os/exec"
133728e barerepo 1mo
7
"strconv"
133728e barerepo 1mo
8
"testing"
133728e barerepo 1mo
9
133728e barerepo 1mo
10
"github.com/barerepo/server/internal/token"
133728e barerepo 1mo
11
)
133728e barerepo 1mo
12
133728e barerepo 1mo
13
// A HEAD is a GET that stops at the headers, so a page that answers one must answer the other.
133728e barerepo 1mo
14
func TestEveryPageAnswersHeadTheWayItAnswersGet(t *testing.T) {
133728e barerepo 1mo
15
if _, err := exec.LookPath("git"); err != nil {
133728e barerepo 1mo
16
t.Skip("git is not installed")
133728e barerepo 1mo
17
}
133728e barerepo 1mo
18
in := newInstance(t)
133728e barerepo 1mo
19
john := in.account("john")
133728e barerepo 1mo
20
seed(t, in, john, "john", "johnbot")
133728e barerepo 1mo
21
133728e barerepo 1mo
22
// The two a stranger sees first are the two that were wrong, so they lead the list.
133728e barerepo 1mo
23
paths := []string{
133728e barerepo 1mo
24
"/signin", "/signup", "/", "/john", "/john/johnbot",
133728e barerepo 1mo
25
"/john/johnbot/files", "/john/johnbot/threads", "/john/johnbot/runs",
133728e barerepo 1mo
26
"/john/johnbot/releases", "/john/johnbot/config", "/john/johnbot/runners",
133728e barerepo 1mo
27
"/search?q=irc", "/john.atom", "/john/johnbot.atom", "/nobody/nothing",
133728e barerepo 1mo
28
}
133728e barerepo 1mo
29
for _, path := range paths {
133728e barerepo 1mo
30
want := status(t, in, http.MethodGet, path)
133728e barerepo 1mo
31
got := status(t, in, http.MethodHead, path)
133728e barerepo 1mo
32
if got != want {
133728e barerepo 1mo
33
t.Errorf("%s answers %d to a reader and %d to a link checker", path, want, got)
133728e barerepo 1mo
34
}
133728e barerepo 1mo
35
}
133728e barerepo 1mo
36
}
133728e barerepo 1mo
37
133728e barerepo 1mo
38
// status asks once and follows nothing, because a redirect answered is still an answer.
133728e barerepo 1mo
39
func status(t *testing.T, in *instance, method, path string) int {
133728e barerepo 1mo
40
t.Helper()
133728e barerepo 1mo
41
req, err := http.NewRequest(method, in.http.URL+path, nil)
133728e barerepo 1mo
42
if err != nil {
133728e barerepo 1mo
43
t.Fatal(err)
133728e barerepo 1mo
44
}
133728e barerepo 1mo
45
client := &http.Client{CheckRedirect: func(*http.Request, []*http.Request) error {
133728e barerepo 1mo
46
return http.ErrUseLastResponse
133728e barerepo 1mo
47
}}
133728e barerepo 1mo
48
resp, err := client.Do(req)
133728e barerepo 1mo
49
if err != nil {
133728e barerepo 1mo
50
t.Fatal(err)
133728e barerepo 1mo
51
}
133728e barerepo 1mo
52
resp.Body.Close()
133728e barerepo 1mo
53
return resp.StatusCode
133728e barerepo 1mo
54
}
133728e barerepo 1mo
55
133728e barerepo 1mo
56
// The runner poll takes a job off the queue, so it is the one GET that a HEAD must not reach.
133728e barerepo 1mo
57
func TestAHeadDoesNotSwallowAQueuedBuild(t *testing.T) {
133728e barerepo 1mo
58
if _, err := exec.LookPath("git"); err != nil {
133728e barerepo 1mo
59
t.Skip("git is not installed")
133728e barerepo 1mo
60
}
133728e barerepo 1mo
61
ctx := context.Background()
133728e barerepo 1mo
62
in := newInstance(t)
133728e barerepo 1mo
63
john := in.account("john")
133728e barerepo 1mo
64
seed(t, in, john, "john", "johnbot")
133728e barerepo 1mo
65
133728e barerepo 1mo
66
secret, tok, err := in.db.CreateToken(ctx, token.Runner, "john", "john/johnbot", "a runner")
133728e barerepo 1mo
67
if err != nil {
133728e barerepo 1mo
68
t.Fatal(err)
133728e barerepo 1mo
69
}
133728e barerepo 1mo
70
runner, err := in.db.AttachRunner(ctx, tok.ID, "john/johnbot", "uproar.local", "linux", "amd64", nil)
133728e barerepo 1mo
71
if err != nil {
133728e barerepo 1mo
72
t.Fatal(err)
133728e barerepo 1mo
73
}
133728e barerepo 1mo
74
if _, err := in.db.QueueJob(ctx, "john/johnbot", "refs/heads/master", "abc", "go build", ""); err != nil {
133728e barerepo 1mo
75
t.Fatal(err)
133728e barerepo 1mo
76
}
133728e barerepo 1mo
77
133728e barerepo 1mo
78
poll := "/runner/poll?token=" + secret + "&id=" + strconv.FormatInt(runner.ID, 10)
133728e barerepo 1mo
79
if code := status(t, in, http.MethodHead, poll); code == http.StatusOK {
133728e barerepo 1mo
80
t.Errorf("a HEAD to the poll answered %d, and the job it answered with is gone", code)
133728e barerepo 1mo
81
}
133728e barerepo 1mo
82
133728e barerepo 1mo
83
// The job has to still be there, or a link checker walking the site emptied the queue.
133728e barerepo 1mo
84
job, err := in.db.TakeJob(ctx, "john/johnbot", *runner)
133728e barerepo 1mo
85
if err != nil {
133728e barerepo 1mo
86
t.Fatal(err)
133728e barerepo 1mo
87
}
133728e barerepo 1mo
88
if job == nil {
133728e barerepo 1mo
89
t.Error("a HEAD to the poll took the build, and no runner will ever see it")
133728e barerepo 1mo
90
}
133728e barerepo 1mo
91
}
history · rawbarerepo 0.1.0