cmd/gitbayd/backup_test.go

v1.22.1
gitbay/cmd/gitbayd/backup_test.go history · blame · raw

96 lines · 2084 bytes

 1package main
 2
 3import (
 4	"archive/tar"
 5	"compress/gzip"
 6	"io"
 7	"os"
 8	"path/filepath"
 9	"sort"
10	"testing"
11
12	"gitbay.org/gitbay/internal/config"
13)
14
15// members lists the archive's entries by name.
16func members(t *testing.T, path string) []string {
17	t.Helper()
18	f, err := os.Open(path)
19	if err != nil {
20		t.Fatal(err)
21	}
22	defer f.Close()
23	gz, err := gzip.NewReader(f)
24	if err != nil {
25		t.Fatal(err)
26	}
27	var names []string
28	tr := tar.NewReader(gz)
29	for {
30		hdr, err := tr.Next()
31		if err == io.EOF {
32			break
33		}
34		if err != nil {
35			t.Fatal(err)
36		}
37		names = append(names, hdr.Name)
38	}
39	sort.Strings(names)
40	return names
41}
42
43// --db-only is what makes an hourly schedule affordable, so it has to leave
44// the repositories out and still carry a restorable database.
45func TestBackupDBOnlyOmitsRepositories(t *testing.T) {
46	root := t.TempDir()
47	cfg := config.Config{Server: config.Server{Root: root}}
48	s, err := openStore(cfg)
49	if err != nil {
50		t.Fatal(err)
51	}
52	s.Close()
53
54	repo := filepath.Join(root, "repos", "krz", "thing.git")
55	if err := os.MkdirAll(repo, 0o750); err != nil {
56		t.Fatal(err)
57	}
58	if err := os.WriteFile(filepath.Join(repo, "HEAD"), []byte("ref: refs/heads/main\n"), 0o640); err != nil {
59		t.Fatal(err)
60	}
61
62	full := filepath.Join(t.TempDir(), "full.tar.gz")
63	if err := runBackup(cfg, full, false); err != nil {
64		t.Fatalf("full backup: %v", err)
65	}
66	dbOnly := filepath.Join(t.TempDir(), "db.tar.gz")
67	if err := runBackup(cfg, dbOnly, true); err != nil {
68		t.Fatalf("db-only backup: %v", err)
69	}
70
71	fullNames := members(t, full)
72	if len(fullNames) < 2 {
73		t.Fatalf("full backup carries only %v", fullNames)
74	}
75	var sawRepo bool
76	for _, n := range fullNames {
77		if n == "repos/krz/thing.git/HEAD" {
78			sawRepo = true
79		}
80	}
81	if !sawRepo {
82		t.Errorf("full backup is missing the repository: %v", fullNames)
83	}
84
85	if got := members(t, dbOnly); len(got) != 1 || got[0] != "gitbay.db" {
86		t.Errorf("db-only backup carries %v, want [gitbay.db]", got)
87	}
88
89	fi, err := os.Stat(dbOnly)
90	if err != nil {
91		t.Fatal(err)
92	}
93	if fi.Size() == 0 {
94		t.Error("db-only backup is empty")
95	}
96}