cmd/gitbayd/backup_test.go
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}