internal/store/builds_test.go

dca7370cd168dc7cf1f262252ab9548f66cc7dcc
gitbay/internal/store/builds_test.go history · blame · raw

71 lines · 1833 bytes

 1package store
 2
 3import (
 4	"strings"
 5	"testing"
 6)
 7
 8// A runner that dies between claiming a build and reporting it leaves the row
 9// claimed. The next claim resolves it rather than leaving the build running and
10// the commit pending forever.
11func TestReapStaleBuilds(t *testing.T) {
12	s := open(t)
13	if err := s.MigrateUp(); err != nil {
14		t.Fatal(err)
15	}
16	uid, err := s.CreateUser("cmc", true)
17	if err != nil {
18		t.Fatal(err)
19	}
20	if _, err := s.CreateRepo("user", uid, "orgo", "public"); err != nil {
21		t.Fatal(err)
22	}
23
24	stuck, err := s.CreateBuild(1, "test", "abc123", "main", `["true"]`)
25	if err != nil {
26		t.Fatal(err)
27	}
28	fresh, err := s.CreateBuild(1, "pages", "abc123", "main", `["true"]`)
29	if err != nil {
30		t.Fatal(err)
31	}
32
33	// Claim both, then age only the first past the deadline.
34	for range 2 {
35		if _, ok, err := s.ClaimBuild(); err != nil || !ok {
36			t.Fatalf("claim: %v ok=%v", err, ok)
37		}
38	}
39	if _, err := s.DB.Exec(
40		`UPDATE builds SET started_at = '2020-01-01T00:00:00Z' WHERE number = ?`, stuck); err != nil {
41		t.Fatal(err)
42	}
43
44	reaped, err := s.ReapStaleBuilds()
45	if err != nil {
46		t.Fatal(err)
47	}
48	if len(reaped) != 1 || reaped[0].Number != stuck {
49		t.Fatalf("reaped %+v, want only build %d", reaped, stuck)
50	}
51
52	b, err := s.BuildByNumber(1, stuck)
53	if err != nil {
54		t.Fatal(err)
55	}
56	if b.Status != "failure" || b.FinishedAt == "" {
57		t.Fatalf("stale build is %s finished %q, want failure with a timestamp", b.Status, b.FinishedAt)
58	}
59	log, err := s.BuildLog(b.ID)
60	if err != nil {
61		t.Fatal(err)
62	}
63	if !strings.Contains(string(log), "abandoned") {
64		t.Fatalf("log does not say why it failed: %q", log)
65	}
66
67	// A build still inside the deadline is left alone.
68	if b, err := s.BuildByNumber(1, fresh); err != nil || b.Status != "running" {
69		t.Fatalf("fresh build is %v (%v), want running", b.Status, err)
70	}
71}