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

barerepo / server / e2e/cold_test.go
98 lines · 3.1kb · 133728eaa05486504991b230f9d4c7e986b7defc
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
"fmt"
133728e barerepo 1mo
5
"net/http"
133728e barerepo 1mo
6
"os"
133728e barerepo 1mo
7
"os/exec"
133728e barerepo 1mo
8
"regexp"
133728e barerepo 1mo
9
"strings"
133728e barerepo 1mo
10
"testing"
133728e barerepo 1mo
11
133728e barerepo 1mo
12
"github.com/barerepo/server/internal/gitread"
133728e barerepo 1mo
13
"github.com/barerepo/server/internal/httpd"
133728e barerepo 1mo
14
"github.com/barerepo/server/internal/repocfg"
133728e barerepo 1mo
15
"github.com/barerepo/server/internal/thread"
133728e barerepo 1mo
16
)
133728e barerepo 1mo
17
133728e barerepo 1mo
18
// elapsed matches the relative times a page prints, which move between two fetches and mean nothing here.
133728e barerepo 1mo
19
var elapsed = regexp.MustCompile(`\b\d+[smhd]\b|\b\d+ (?:second|minute|hour|day|week|month|year)s? ago`)
133728e barerepo 1mo
20
133728e barerepo 1mo
21
// A cache may make a page fast. It must never be the only place an answer lives. Chapter 10 item 6.
133728e barerepo 1mo
22
func TestEveryPageRendersTheSameWithAnEmptyCache(t *testing.T) {
133728e barerepo 1mo
23
if _, err := exec.LookPath("git"); err != nil {
133728e barerepo 1mo
24
t.Skip("git is not installed")
133728e barerepo 1mo
25
}
133728e barerepo 1mo
26
in := newInstance(t)
133728e barerepo 1mo
27
john := in.account("john")
133728e barerepo 1mo
28
work := seed(t, in, john, "john", "johnbot")
133728e barerepo 1mo
29
133728e barerepo 1mo
30
write(t, work, "retry.go", "package main\n\nfunc backoff(n int) int { return n * 2 }\n")
133728e barerepo 1mo
31
// Seven files, so the log collapses this one and the expand link has something to open.
133728e barerepo 1mo
32
for i := 0; i < 7; i++ {
133728e barerepo 1mo
33
write(t, work, fmt.Sprintf("file%d.go", i), fmt.Sprintf("package main\n\nvar v%d = %d\n", i, i))
133728e barerepo 1mo
34
}
133728e barerepo 1mo
35
run(t, work, "git", "add", "-A")
133728e barerepo 1mo
36
run(t, work, "git", "commit", "-qm", "add a backoff")
133728e barerepo 1mo
37
run(t, work, "git", "tag", "-a", "v1.0.0", "-m", "first release")
133728e barerepo 1mo
38
run(t, work, "git", "notes", "--ref=refs/notes/releases", "add", "-m", "what changed", "v1.0.0")
133728e barerepo 1mo
39
run(t, work, "git", "push", "-q", in.url(john, "/john/johnbot"), "master")
133728e barerepo 1mo
40
run(t, work, "git", "push", "-q", in.url(john, "/john/johnbot"), "v1.0.0")
133728e barerepo 1mo
41
run(t, work, "git", "push", "-q", in.url(john, "/john/johnbot"),
133728e barerepo 1mo
42
"refs/notes/releases:refs/notes/releases")
133728e barerepo 1mo
43
133728e barerepo 1mo
44
head := strings.TrimSpace(run(t, work, "git", "rev-parse", "HEAD"))
133728e barerepo 1mo
45
paths := []string{
133728e barerepo 1mo
46
"/john",
133728e barerepo 1mo
47
"/john/johnbot",
133728e barerepo 1mo
48
"/john/johnbot?expand=" + head,
133728e barerepo 1mo
49
"/john/johnbot/files",
133728e barerepo 1mo
50
"/john/johnbot/files/master",
133728e barerepo 1mo
51
"/john/johnbot/file/master/retry.go",
133728e barerepo 1mo
52
"/john/johnbot/commit/" + head,
133728e barerepo 1mo
53
"/john/johnbot/compare/master...master",
133728e barerepo 1mo
54
"/john/johnbot/threads",
133728e barerepo 1mo
55
"/john/johnbot/runs",
133728e barerepo 1mo
56
"/john/johnbot/releases",
133728e barerepo 1mo
57
"/john/johnbot/config",
133728e barerepo 1mo
58
"/search?q=backoff",
133728e barerepo 1mo
59
}
133728e barerepo 1mo
60
133728e barerepo 1mo
61
warm := map[string]string{}
133728e barerepo 1mo
62
for _, p := range paths {
133728e barerepo 1mo
63
code, _, body := get(t, in.http.URL+p)
133728e barerepo 1mo
64
if code != http.StatusOK {
133728e barerepo 1mo
65
t.Fatalf("%s answered %d before the cache was emptied", p, code)
133728e barerepo 1mo
66
}
133728e barerepo 1mo
67
warm[p] = body
133728e barerepo 1mo
68
}
133728e barerepo 1mo
69
133728e barerepo 1mo
70
// A cache that retains nothing is the honest test, since an empty one is warm again by the second read.
133728e barerepo 1mo
71
if err := os.RemoveAll(in.cfg.Paths.Cache); err != nil {
133728e barerepo 1mo
72
t.Fatal(err)
133728e barerepo 1mo
73
}
133728e barerepo 1mo
74
warmAgain := gitread.Cache
133728e barerepo 1mo
75
t.Cleanup(func() {
133728e barerepo 1mo
76
gitread.Cache, repocfg.Cache, thread.Cache, httpd.Cache = warmAgain, warmAgain, warmAgain, warmAgain
133728e barerepo 1mo
77
})
133728e barerepo 1mo
78
gitread.Cache = nil
133728e barerepo 1mo
79
repocfg.Cache = nil
133728e barerepo 1mo
80
thread.Cache = nil
133728e barerepo 1mo
81
httpd.Cache = nil
133728e barerepo 1mo
82
133728e barerepo 1mo
83
for _, p := range paths {
133728e barerepo 1mo
84
code, _, body := get(t, in.http.URL+p)
133728e barerepo 1mo
85
if code != http.StatusOK {
133728e barerepo 1mo
86
t.Errorf("%s answered %d with an empty cache", p, code)
133728e barerepo 1mo
87
continue
133728e barerepo 1mo
88
}
133728e barerepo 1mo
89
if normal(body) != normal(warm[p]) {
133728e barerepo 1mo
90
t.Errorf("%s renders differently with an empty cache, so the cache holds the only copy\n"+
133728e barerepo 1mo
91
"cold:\n%s\nwarm:\n%s", p, body, warm[p])
133728e barerepo 1mo
92
}
133728e barerepo 1mo
93
}
133728e barerepo 1mo
94
}
133728e barerepo 1mo
95
133728e barerepo 1mo
96
func normal(body string) string {
133728e barerepo 1mo
97
return elapsed.ReplaceAllString(body, "<ago>")
133728e barerepo 1mo
98
}
history · rawbarerepo 0.1.0