internal/control/backuplock_test.go

v1.43.0
gitbay/internal/control/backuplock_test.go history · blame · raw

57 lines · 1798 bytes

 1package control
 2
 3import (
 4	"strings"
 5	"testing"
 6
 7	"gitbay.org/gitbay/internal/backuplock"
 8	"gitbay.org/gitbay/internal/protocol"
 9)
10
11func TestRepoDeleteAndRenameRefusedDuringBackup(t *testing.T) {
12	st, repo, uid := newQueueTestRepo(t)
13	owner, err := st.UserByID(uid)
14	if err != nil {
15		t.Fatal(err)
16	}
17	root := t.TempDir()
18	release, err := backuplock.Hold(root)
19	if err != nil {
20		t.Fatal(err)
21	}
22	for _, argv := range [][]string{
23		{"repo", "rename", repo.Path(), "renamed"},
24		{"repo", "delete", repo.Path(), "--yes"},
25	} {
26		c, errOut := pruneCtx(st, root, owner)
27		if code := Dispatch(c, argv); code != protocol.ExitFailure || !strings.Contains(errOut.String(), "a backup is running") {
28			t.Fatalf("%v during a backup: exit %d, %s", argv, code, errOut)
29		}
30	}
31	if got, err := st.RepoByID(repo.ID); err != nil || got.Name != repo.Name {
32		t.Fatalf("repository changed during a backup: %+v, %v", got, err)
33	}
34	release()
35
36	c, errOut := pruneCtx(st, root, owner)
37	if code := Dispatch(c, []string{"repo", "delete", repo.Path(), "--yes"}); code != protocol.ExitOK {
38		t.Fatalf("delete after the backup: exit %d, %s", code, errOut)
39	}
40}
41
42func TestAdminMRPruneRefusedDuringBackup(t *testing.T) {
43	st, repo, root, headSHA := prunedRepo(t)
44	dir := RepoDir(root, repo.OwnerName, repo.Name)
45	release, err := backuplock.Hold(root)
46	if err != nil {
47		t.Fatal(err)
48	}
49	defer release()
50	c, errOut := pruneCtx(st, root, rootUser(t, st))
51	if code := Dispatch(c, []string{"admin", "mr", "prune", repo.Path(), "1", "--yes"}); code != protocol.ExitFailure || !strings.Contains(errOut.String(), "a backup is running") {
52		t.Fatalf("prune during a backup: exit %d, %s", code, errOut)
53	}
54	if !refExists(dir, mrHeadRef(1)) || !objectExists(dir, headSHA) {
55		t.Fatal("prune during a backup changed the repository")
56	}
57}