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

barerepo / server / e2e/runlog_test.go
81 lines · 2.5kb · 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
"bytes"
133728e barerepo 1mo
5
"context"
133728e barerepo 1mo
6
"encoding/json"
133728e barerepo 1mo
7
"net/http"
133728e barerepo 1mo
8
"os/exec"
133728e barerepo 1mo
9
"strings"
133728e barerepo 1mo
10
"testing"
133728e barerepo 1mo
11
133728e barerepo 1mo
12
"github.com/barerepo/server/internal/token"
133728e barerepo 1mo
13
)
133728e barerepo 1mo
14
133728e barerepo 1mo
15
// Chapter 25 budgets any page with no diff at 15kb, and a build log is the thing that can break it.
133728e barerepo 1mo
16
func TestALongBuildLogDoesNotBreakTheRunPage(t *testing.T) {
133728e barerepo 1mo
17
if _, err := exec.LookPath("git"); err != nil {
133728e barerepo 1mo
18
t.Skip("git is not installed")
133728e barerepo 1mo
19
}
133728e barerepo 1mo
20
in := newInstance(t)
133728e barerepo 1mo
21
john := in.account("john")
133728e barerepo 1mo
22
work := seed(t, in, john, "john", "johnbot")
133728e barerepo 1mo
23
133728e barerepo 1mo
24
sha := strings.TrimSpace(run(t, work, "git", "rev-parse", "HEAD"))
133728e barerepo 1mo
25
jobID, runnerToken := jobOn(t, in, "john", "john/johnbot", sha)
133728e barerepo 1mo
26
// A build that says a lot, which is what a real one does when it fails.
133728e barerepo 1mo
27
var log strings.Builder
133728e barerepo 1mo
28
for i := 0; i < 4000; i++ {
133728e barerepo 1mo
29
log.WriteString("go: downloading example.com/some/module v1.2.3\n")
133728e barerepo 1mo
30
}
133728e barerepo 1mo
31
log.WriteString("store/db.go:14:2: cannot find module providing package\n")
133728e barerepo 1mo
32
body, err := json.Marshal(map[string]any{
133728e barerepo 1mo
33
"token": runnerToken, "job_id": jobID, "chunk": log.String(),
133728e barerepo 1mo
34
})
133728e barerepo 1mo
35
if err != nil {
133728e barerepo 1mo
36
t.Fatal(err)
133728e barerepo 1mo
37
}
133728e barerepo 1mo
38
resp, err := http.Post(in.http.URL+"/runner/log", "application/json", bytes.NewReader(body))
133728e barerepo 1mo
39
if err != nil {
133728e barerepo 1mo
40
t.Fatal(err)
133728e barerepo 1mo
41
}
133728e barerepo 1mo
42
resp.Body.Close()
133728e barerepo 1mo
43
finish(t, in, runnerToken, jobID, 1)
133728e barerepo 1mo
44
133728e barerepo 1mo
45
code, _, page := get(t, in.http.URL+"/john/johnbot/run/"+sha)
133728e barerepo 1mo
46
if code != http.StatusOK {
133728e barerepo 1mo
47
t.Fatalf("the run page answered %d", code)
133728e barerepo 1mo
48
}
133728e barerepo 1mo
49
if len(page) > 15<<10 {
133728e barerepo 1mo
50
t.Errorf("the run page sent %dkb, over chapter 25's 15kb", len(page)>>10)
133728e barerepo 1mo
51
}
133728e barerepo 1mo
52
// The end of a log is where the failure is, so that is the end that stays.
133728e barerepo 1mo
53
if !strings.Contains(page, "cannot find module providing package") {
133728e barerepo 1mo
54
t.Error("the page cut off the line the reader came for")
133728e barerepo 1mo
55
}
133728e barerepo 1mo
56
if !strings.Contains(page, "the whole log") {
133728e barerepo 1mo
57
t.Error("the page does not offer the rest of the log it cut")
133728e barerepo 1mo
58
}
133728e barerepo 1mo
59
}
133728e barerepo 1mo
60
133728e barerepo 1mo
61
// jobOn queues and takes a job for one real commit, which is what the run page can then find.
133728e barerepo 1mo
62
func jobOn(t *testing.T, in *instance, account, repo, sha string) (int64, string) {
133728e barerepo 1mo
63
t.Helper()
133728e barerepo 1mo
64
ctx := context.Background()
133728e barerepo 1mo
65
runnerToken, tok, err := in.db.CreateToken(ctx, token.Runner, account, repo, "a runner")
133728e barerepo 1mo
66
if err != nil {
133728e barerepo 1mo
67
t.Fatal(err)
133728e barerepo 1mo
68
}
133728e barerepo 1mo
69
runner, err := in.db.AttachRunner(ctx, tok.ID, repo, "uproar.local", "linux", "amd64", nil)
133728e barerepo 1mo
70
if err != nil {
133728e barerepo 1mo
71
t.Fatal(err)
133728e barerepo 1mo
72
}
133728e barerepo 1mo
73
if _, err := in.db.QueueJob(ctx, repo, "refs/heads/master", sha, "go build", ""); err != nil {
133728e barerepo 1mo
74
t.Fatal(err)
133728e barerepo 1mo
75
}
133728e barerepo 1mo
76
job, err := in.db.TakeJob(ctx, repo, *runner)
133728e barerepo 1mo
77
if err != nil || job == nil {
133728e barerepo 1mo
78
t.Fatalf("the runner could not take the job: %v", err)
133728e barerepo 1mo
79
}
133728e barerepo 1mo
80
return job.ID, runnerToken
133728e barerepo 1mo
81
}
history · rawbarerepo 0.1.0