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

barerepo / server / e2e/requireruns_test.go
126 lines · 5.0kb · 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
"os/exec"
133728e barerepo 1mo
6
"strings"
133728e barerepo 1mo
7
"testing"
133728e barerepo 1mo
8
133728e barerepo 1mo
9
"github.com/barerepo/server/internal/token"
133728e barerepo 1mo
10
)
133728e barerepo 1mo
11
133728e barerepo 1mo
12
// Chapter 37.4: require_runs names the runs the default branch waits for, and it was never read.
133728e barerepo 1mo
13
func TestTheDefaultBranchWaitsForTheRunsTheConfigNames(t *testing.T) {
133728e barerepo 1mo
14
if _, err := exec.LookPath("git"); err != nil {
133728e barerepo 1mo
15
t.Skip("git is not installed")
133728e barerepo 1mo
16
}
133728e barerepo 1mo
17
in := newInstance(t)
133728e barerepo 1mo
18
john := in.account("john")
133728e barerepo 1mo
19
lisa := in.account("lisa")
133728e barerepo 1mo
20
work := seed(t, in, john, "john", "johnbot")
133728e barerepo 1mo
21
133728e barerepo 1mo
22
write(t, work, ".barerepo/config", "[repo]\nvisibility = \"public\"\n\n"+
133728e barerepo 1mo
23
"[access]\npush = [\"lisa\"]\n\n[proposals]\nrequire_runs = [\"build\"]\n")
133728e barerepo 1mo
24
run(t, work, "git", "add", "-A")
133728e barerepo 1mo
25
run(t, work, "git", "commit", "-qm", "builds must pass before master takes a commit")
133728e barerepo 1mo
26
run(t, work, "git", "push", "-q", in.url(john, "/john/johnbot"), "master")
133728e barerepo 1mo
27
133728e barerepo 1mo
28
hers := clone(t, in, lisa, "/john/johnbot")
133728e barerepo 1mo
29
commit(t, hers, "package main\n\nfunc main() {}\n", "a change nobody built")
133728e barerepo 1mo
30
out, err := try(t, hers, "git", "push", in.url(lisa, "/john/johnbot"), "master")
133728e barerepo 1mo
31
if err == nil {
133728e barerepo 1mo
32
t.Fatalf("master took a commit with no passing build:\n%s", out)
133728e barerepo 1mo
33
}
133728e barerepo 1mo
34
for _, want := range []string{"require_runs", "build", "refs/proposals/new"} {
133728e barerepo 1mo
35
if !strings.Contains(out, want) {
133728e barerepo 1mo
36
t.Errorf("the rejection does not mention %q:\n%s", want, out)
133728e barerepo 1mo
37
}
133728e barerepo 1mo
38
}
133728e barerepo 1mo
39
133728e barerepo 1mo
40
// The same commit, once a run named build has passed on it, is the push that must go through.
133728e barerepo 1mo
41
sha := strings.TrimSpace(run(t, hers, "git", "rev-parse", "HEAD"))
133728e barerepo 1mo
42
passRun(t, in, "john", "john/johnbot", sha, "build")
133728e barerepo 1mo
43
if code, _, body := get(t, in.http.URL+"/john/johnbot/run/"+sha); code != 200 {
133728e barerepo 1mo
44
t.Fatalf("the run page answered %d", code)
133728e barerepo 1mo
45
} else {
133728e barerepo 1mo
46
t.Logf("RUNPAGE %.900s", body[strings.Index(body, "class=\"card\""):])
133728e barerepo 1mo
47
}
133728e barerepo 1mo
48
if out, err := try(t, hers, "git", "push", in.url(lisa, "/john/johnbot"), "master"); err != nil {
133728e barerepo 1mo
49
t.Errorf("master refused a commit whose build passed (sha %s): %v\n%s", sha, err, out)
133728e barerepo 1mo
50
}
133728e barerepo 1mo
51
}
133728e barerepo 1mo
52
133728e barerepo 1mo
53
// The owner is exempt, or a repository whose runner is gone has nobody who can fix the config.
133728e barerepo 1mo
54
func TestTheOwnerIsNotLockedOutByARunThatCannotHappen(t *testing.T) {
133728e barerepo 1mo
55
if _, err := exec.LookPath("git"); err != nil {
133728e barerepo 1mo
56
t.Skip("git is not installed")
133728e barerepo 1mo
57
}
133728e barerepo 1mo
58
in := newInstance(t)
133728e barerepo 1mo
59
john := in.account("john")
133728e barerepo 1mo
60
work := seed(t, in, john, "john", "johnbot")
133728e barerepo 1mo
61
133728e barerepo 1mo
62
write(t, work, ".barerepo/config", "[proposals]\nrequire_runs = [\"build\"]\n")
133728e barerepo 1mo
63
run(t, work, "git", "add", "-A")
133728e barerepo 1mo
64
run(t, work, "git", "commit", "-qm", "require a run no runner will ever take")
133728e barerepo 1mo
65
run(t, work, "git", "push", "-q", in.url(john, "/john/johnbot"), "master")
133728e barerepo 1mo
66
133728e barerepo 1mo
67
write(t, work, "conn.go", "package irc\n")
133728e barerepo 1mo
68
run(t, work, "git", "add", "-A")
133728e barerepo 1mo
69
run(t, work, "git", "commit", "-qm", "the owner undoing their own rule")
133728e barerepo 1mo
70
if out, err := try(t, work, "git", "push", in.url(john, "/john/johnbot"), "master"); err != nil {
133728e barerepo 1mo
71
t.Errorf("the owner cannot reach their own repository to fix it: %v\n%s", err, out)
133728e barerepo 1mo
72
}
133728e barerepo 1mo
73
}
133728e barerepo 1mo
74
133728e barerepo 1mo
75
// passRun records one passing run under a name, the way a runner finishing a job does.
133728e barerepo 1mo
76
func passRun(t *testing.T, in *instance, account, repo, sha, name string) {
133728e barerepo 1mo
77
t.Helper()
133728e barerepo 1mo
78
ctx := context.Background()
133728e barerepo 1mo
79
runnerToken, tok, err := in.db.CreateToken(ctx, token.Runner, account, repo, "a runner")
133728e barerepo 1mo
80
if err != nil {
133728e barerepo 1mo
81
t.Fatal(err)
133728e barerepo 1mo
82
}
133728e barerepo 1mo
83
runner, err := in.db.AttachRunner(ctx, tok.ID, repo, "uproar.local", "linux", "amd64", nil)
133728e barerepo 1mo
84
if err != nil {
133728e barerepo 1mo
85
t.Fatal(err)
133728e barerepo 1mo
86
}
133728e barerepo 1mo
87
if _, err := in.db.QueueJobFor(ctx, repo, "refs/heads/master", sha,
133728e barerepo 1mo
88
"go build", "", nil, name); err != nil {
133728e barerepo 1mo
89
t.Fatal(err)
133728e barerepo 1mo
90
}
133728e barerepo 1mo
91
job, err := in.db.TakeJob(ctx, repo, *runner)
133728e barerepo 1mo
92
if err != nil || job == nil {
133728e barerepo 1mo
93
t.Fatalf("the runner could not take the job: %v", err)
133728e barerepo 1mo
94
}
133728e barerepo 1mo
95
finish(t, in, runnerToken, job.ID, 0)
133728e barerepo 1mo
96
}
133728e barerepo 1mo
97
133728e barerepo 1mo
98
// Chapter 33.6 is one recipe: edit default_branch, commit, push. It was parsed and read by nothing.
133728e barerepo 1mo
99
func TestChangingTheDefaultBranchInTheConfigMovesIt(t *testing.T) {
133728e barerepo 1mo
100
if _, err := exec.LookPath("git"); err != nil {
133728e barerepo 1mo
101
t.Skip("git is not installed")
133728e barerepo 1mo
102
}
133728e barerepo 1mo
103
in := newInstance(t)
133728e barerepo 1mo
104
john := in.account("john")
133728e barerepo 1mo
105
work := seed(t, in, john, "john", "johnbot")
133728e barerepo 1mo
106
133728e barerepo 1mo
107
run(t, work, "git", "branch", "main")
133728e barerepo 1mo
108
run(t, work, "git", "push", "-q", in.url(john, "/john/johnbot"), "main")
133728e barerepo 1mo
109
write(t, work, ".barerepo/config", "[repo]\ndefault_branch = \"main\"\nvisibility = \"public\"\n")
133728e barerepo 1mo
110
run(t, work, "git", "add", "-A")
133728e barerepo 1mo
111
run(t, work, "git", "commit", "-qm", "move to main")
133728e barerepo 1mo
112
run(t, work, "git", "push", "-q", in.url(john, "/john/johnbot"), "master")
133728e barerepo 1mo
113
// The config arrives on master, so main has to catch up before it can hold the file.
133728e barerepo 1mo
114
run(t, work, "git", "push", "-q", in.url(john, "/john/johnbot"), "master:main")
133728e barerepo 1mo
115
133728e barerepo 1mo
116
// A fresh clone takes its branch from HEAD, which is the only place this setting can show.
133728e barerepo 1mo
117
fresh := clone(t, in, john, "/john/johnbot")
133728e barerepo 1mo
118
if got := strings.TrimSpace(run(t, fresh, "git", "rev-parse", "--abbrev-ref", "HEAD")); got != "main" {
133728e barerepo 1mo
119
t.Errorf("a clone landed on %q, and the config says main", got)
133728e barerepo 1mo
120
}
133728e barerepo 1mo
121
// And the pages agree, or a reader is looking at a branch nobody else is on.
133728e barerepo 1mo
122
_, _, body := get(t, in.http.URL+"/john/johnbot")
133728e barerepo 1mo
123
if !strings.Contains(body, ">main</a>") {
133728e barerepo 1mo
124
t.Errorf("the landing page does not show main as the branch:\n%s", body[:min(len(body), 1200)])
133728e barerepo 1mo
125
}
133728e barerepo 1mo
126
}
history · rawbarerepo 0.1.0