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

barerepo / server / internal/run/run_test.go
108 lines · 3.1kb · 133728eaa05486504991b230f9d4c7e986b7defc
log files threads runs releases config jump to file t
133728e barerepo 1mo
1
package run
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/gitx"
133728e barerepo 1mo
10
)
133728e barerepo 1mo
11
133728e barerepo 1mo
12
func repoWithCommit(t *testing.T) (dir, sha string) {
133728e barerepo 1mo
13
t.Helper()
133728e barerepo 1mo
14
if _, err := gitx.Version(context.Background()); err != nil {
133728e barerepo 1mo
15
t.Skip("git is not installed")
133728e barerepo 1mo
16
}
133728e barerepo 1mo
17
dir = t.TempDir()
133728e barerepo 1mo
18
run := func(args ...string) string {
133728e barerepo 1mo
19
t.Helper()
133728e barerepo 1mo
20
cmd := exec.Command(gitx.Bin, args...)
133728e barerepo 1mo
21
cmd.Dir = dir
133728e barerepo 1mo
22
cmd.Env = append(cmd.Environ(),
133728e barerepo 1mo
23
"GIT_AUTHOR_NAME=m", "GIT_AUTHOR_EMAIL=m@x",
133728e barerepo 1mo
24
"GIT_COMMITTER_NAME=m", "GIT_COMMITTER_EMAIL=m@x")
133728e barerepo 1mo
25
out, err := cmd.CombinedOutput()
133728e barerepo 1mo
26
if err != nil {
133728e barerepo 1mo
27
t.Fatalf("git %v: %v\n%s", args, err, out)
133728e barerepo 1mo
28
}
133728e barerepo 1mo
29
return strings.TrimSpace(string(out))
133728e barerepo 1mo
30
}
133728e barerepo 1mo
31
run("init", "-q", "-b", "master")
133728e barerepo 1mo
32
run("commit", "-q", "--allow-empty", "-m", "first")
133728e barerepo 1mo
33
return dir, run("rev-parse", "HEAD")
133728e barerepo 1mo
34
}
133728e barerepo 1mo
35
133728e barerepo 1mo
36
func TestAppendAndRead(t *testing.T) {
133728e barerepo 1mo
37
ctx := context.Background()
133728e barerepo 1mo
38
dir, sha := repoWithCommit(t)
133728e barerepo 1mo
39
133728e barerepo 1mo
40
rec := Record{Runner: "uproar.local", Labels: []string{"build", "test"},
133728e barerepo 1mo
41
Started: 1787074650, Duration: 18, Exit: 0}
133728e barerepo 1mo
42
if err := Append(ctx, dir, sha, rec, "$ make ci\nok\n"); err != nil {
133728e barerepo 1mo
43
t.Fatal(err)
133728e barerepo 1mo
44
}
133728e barerepo 1mo
45
got, err := For(ctx, dir, sha)
133728e barerepo 1mo
46
if err != nil || len(got) != 1 {
133728e barerepo 1mo
47
t.Fatalf("For = %v, %v", got, err)
133728e barerepo 1mo
48
}
133728e barerepo 1mo
49
if got[0].Runner != "uproar.local" || got[0].Exit != 0 || got[0].Duration != 18 {
133728e barerepo 1mo
50
t.Errorf("record lost fields: %+v", got[0])
133728e barerepo 1mo
51
}
133728e barerepo 1mo
52
if log, _ := Log(ctx, dir, got[0]); log != "$ make ci\nok\n" {
133728e barerepo 1mo
53
t.Errorf("log = %q", log)
133728e barerepo 1mo
54
}
133728e barerepo 1mo
55
133728e barerepo 1mo
56
// A commit can be built more than once, and both runs survive.
133728e barerepo 1mo
57
if err := Append(ctx, dir, sha, Record{Runner: "lisa-mbp", Started: 1787074999, Exit: 2}, "boom"); err != nil {
133728e barerepo 1mo
58
t.Fatal(err)
133728e barerepo 1mo
59
}
133728e barerepo 1mo
60
got, _ = For(ctx, dir, sha)
133728e barerepo 1mo
61
if len(got) != 2 {
133728e barerepo 1mo
62
t.Fatalf("got %d runs, want 2", len(got))
133728e barerepo 1mo
63
}
133728e barerepo 1mo
64
if got[0].Runner != "lisa-mbp" {
133728e barerepo 1mo
65
t.Errorf("runs are not newest first: %+v", got)
133728e barerepo 1mo
66
}
133728e barerepo 1mo
67
if !got[0].Failed() {
133728e barerepo 1mo
68
t.Error("exit 2 is not reported as failed")
133728e barerepo 1mo
69
}
133728e barerepo 1mo
70
}
133728e barerepo 1mo
71
133728e barerepo 1mo
72
// Chapter 16 claims build history is readable with git alone, and this is that claim tested.
133728e barerepo 1mo
73
func TestGitCanReadTheRuns(t *testing.T) {
133728e barerepo 1mo
74
ctx := context.Background()
133728e barerepo 1mo
75
dir, sha := repoWithCommit(t)
133728e barerepo 1mo
76
if err := Append(ctx, dir, sha,
133728e barerepo 1mo
77
Record{Runner: "uproar.local", Started: 1, Exit: 0}, "ok"); err != nil {
133728e barerepo 1mo
78
t.Fatal(err)
133728e barerepo 1mo
79
}
133728e barerepo 1mo
80
out, err := gitx.Run(ctx, dir, "log", "--show-notes=runs", "--max-count=1")
133728e barerepo 1mo
81
if err != nil {
133728e barerepo 1mo
82
t.Fatal(err)
133728e barerepo 1mo
83
}
133728e barerepo 1mo
84
if !strings.Contains(out, "Notes (runs)") || !strings.Contains(out, "uproar.local") {
133728e barerepo 1mo
85
t.Errorf("git log --show-notes=runs did not print the run:\n%s", out)
133728e barerepo 1mo
86
}
133728e barerepo 1mo
87
}
133728e barerepo 1mo
88
133728e barerepo 1mo
89
// A long log goes to a blob so that reading the notes ref stays cheap.
133728e barerepo 1mo
90
func TestLargeLogGoesToABlob(t *testing.T) {
133728e barerepo 1mo
91
ctx := context.Background()
133728e barerepo 1mo
92
dir, sha := repoWithCommit(t)
133728e barerepo 1mo
93
big := strings.Repeat("x", inlineLimit+1)
133728e barerepo 1mo
94
if err := Append(ctx, dir, sha, Record{Runner: "r", Started: 1}, big); err != nil {
133728e barerepo 1mo
95
t.Fatal(err)
133728e barerepo 1mo
96
}
133728e barerepo 1mo
97
got, _ := For(ctx, dir, sha)
133728e barerepo 1mo
98
if got[0].Output != "" {
133728e barerepo 1mo
99
t.Error("a large log was inlined")
133728e barerepo 1mo
100
}
133728e barerepo 1mo
101
if got[0].Log == "" {
133728e barerepo 1mo
102
t.Fatal("a large log has no blob")
133728e barerepo 1mo
103
}
133728e barerepo 1mo
104
log, err := Log(ctx, dir, got[0])
133728e barerepo 1mo
105
if err != nil || len(log) != len(big) {
133728e barerepo 1mo
106
t.Errorf("blob log came back as %d bytes, want %d (%v)", len(log), len(big), err)
133728e barerepo 1mo
107
}
133728e barerepo 1mo
108
}
history · rawbarerepo 0.1.0