1
2
3
4
5
6
7
8
9
10
11
12
13 package fs
14
15 import (
16 "context"
17 "errors"
18 "net/http"
19 "os"
20 "path"
21 "path/filepath"
22 "runtime"
23 "testing"
24
25 "gitlab.com/flimzy/testy"
26
27 internal "github.com/go-kivik/kivik/v4/int/errors"
28 "github.com/go-kivik/kivik/v4/x/fsdb/filesystem"
29 )
30
31 const isGopherJS117 = runtime.GOARCH == "js"
32
33 func TestCompact(t *testing.T) {
34 if isGopherJS117 {
35 t.Skip("Tests broken for GopherJS 1.17")
36 }
37 type tt struct {
38 fs filesystem.Filesystem
39 path string
40 dbname string
41 status int
42 err string
43 }
44 tests := testy.NewTable()
45 tests.Add("directory does not exist", tt{
46 path: "testdata",
47 dbname: "notfound",
48 status: http.StatusNotFound,
49 err: "^open testdata/notfound: [Nn]o such file or directory$",
50 })
51 tests.Add("empty directory", func(t *testing.T) interface{} {
52 tmpdir := tempDir(t)
53 tests.Cleanup(func() error {
54 return os.RemoveAll(tmpdir)
55 })
56 if err := os.Mkdir(filepath.Join(tmpdir, "foo"), 0o666); err != nil {
57 t.Fatal(err)
58 }
59
60 return tt{
61 path: tmpdir,
62 dbname: "foo",
63 }
64 })
65 tests.Add("permission denied", tt{
66 fs: &filesystem.MockFS{
67 OpenFunc: func(_ string) (filesystem.File, error) {
68 return nil, statusError{status: http.StatusForbidden, error: errors.New("permission denied")}
69 },
70 },
71 path: "somepath",
72 dbname: "doesntmatter",
73 status: http.StatusForbidden,
74 err: "permission denied$",
75 })
76 tests.Add("no attachments", func(t *testing.T) interface{} {
77 tmpdir := testy.CopyTempDir(t, "testdata/compact_noatt", 1)
78 tests.Cleanup(func() error {
79 return os.RemoveAll(tmpdir)
80 })
81
82 return tt{
83 path: tmpdir,
84 dbname: "compact_noatt",
85 }
86 })
87 tests.Add("non-winning revs only, no attachments", func(t *testing.T) interface{} {
88 tmpdir := testy.CopyTempDir(t, "testdata/compact_nowinner_noatt", 1)
89 tests.Cleanup(func() error {
90 return os.RemoveAll(tmpdir)
91 })
92
93 return tt{
94 path: tmpdir,
95 dbname: "compact_nowinner_noatt",
96 }
97 })
98 tests.Add("clean up old revs", func(t *testing.T) interface{} {
99 tmpdir := testy.CopyTempDir(t, "testdata/compact_oldrevs", 1)
100 tests.Cleanup(func() error {
101 return os.RemoveAll(tmpdir)
102 })
103
104 return tt{
105 path: tmpdir,
106 dbname: "compact_oldrevs",
107 }
108 })
109 tests.Add("clean up old revs with atts", func(t *testing.T) interface{} {
110 tmpdir := testy.CopyTempDir(t, "testdata/compact_oldrevsatt", 1)
111 tests.Cleanup(func() error {
112 return os.RemoveAll(tmpdir)
113 })
114
115 return tt{
116 path: tmpdir,
117 dbname: "compact_oldrevsatt",
118 }
119 })
120
121 tests.Run(t, func(t *testing.T, tt tt) {
122 fs := tt.fs
123 if fs == nil {
124 fs = filesystem.Default()
125 }
126 db := &db{
127 client: &client{root: tt.path},
128 dbPath: path.Join(tt.path, tt.dbname),
129 dbName: tt.dbname,
130 }
131 err := db.compact(context.Background(), fs)
132 if d := internal.StatusErrorDiffRE(tt.err, tt.status, err); d != "" {
133 t.Error(d)
134 }
135 if err != nil {
136 return
137 }
138 if d := testy.DiffAsJSON(testy.Snapshot(t), testy.JSONDir{
139 Path: tt.path,
140 NoMD5Sum: true,
141 FileContent: true,
142 }); d != nil {
143 t.Error(d)
144 }
145 })
146 }
147
View as plain text