internal/control/backuplock_test.go
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}