1 package client
2
3 import (
4 "encoding/json"
5 "errors"
6 "os"
7 "path/filepath"
8 "strings"
9 "testing"
10
11 "gopkg.in/check.v1"
12 )
13
14 type FileJSONStoreSuite struct{}
15
16 var _ = check.Suite(&FileJSONStoreSuite{})
17
18
19 func Test(t *testing.T) { check.TestingT(t) }
20
21 func (FileJSONStoreSuite) TestNewOk(c *check.C) {
22 tmp := c.MkDir()
23 p := filepath.Join(tmp, "tuf_raw.db")
24
25
26 fi, err := os.Stat(p)
27 c.Assert(fi, check.IsNil)
28 c.Assert(errors.Is(err, os.ErrNotExist), check.Equals, true)
29
30
31 s, err := NewFileJSONStore(p)
32 c.Assert(err, check.IsNil)
33 c.Assert(s, check.NotNil)
34
35
36 fi, err = os.Stat(p)
37 c.Assert(fi, check.NotNil)
38 c.Assert(err, check.IsNil)
39 c.Assert(fi.IsDir(), check.Equals, true)
40 }
41
42 func (FileJSONStoreSuite) TestNewFileExists(c *check.C) {
43 tmp := c.MkDir()
44 p := filepath.Join(tmp, "tuf_raw.db")
45
46
47 f, err := os.Create(p)
48 c.Assert(err, check.IsNil)
49 f.Close()
50
51
52 s, err := NewFileJSONStore(p)
53 c.Assert(s, check.IsNil)
54 c.Assert(err, check.NotNil)
55 found := strings.Contains(err.Error(), ", not a directory")
56 c.Assert(found, check.Equals, true)
57 }
58
59 func (FileJSONStoreSuite) TestNewDirectoryExists(c *check.C) {
60 tmp := c.MkDir()
61 p := filepath.Join(tmp, "tuf_raw.db")
62
63 err := os.Mkdir(p, 0750)
64 c.Assert(err, check.IsNil)
65
66
67 s, err := NewFileJSONStore(p)
68 c.Assert(s, check.NotNil)
69 c.Assert(err, check.IsNil)
70 }
71
72 func (FileJSONStoreSuite) TestGetMetaEmpty(c *check.C) {
73 tmp := c.MkDir()
74 p := filepath.Join(tmp, "tuf_raw.db")
75 s, err := NewFileJSONStore(p)
76 c.Assert(err, check.IsNil)
77
78 md, err := s.GetMeta()
79 c.Assert(err, check.IsNil)
80 c.Assert(md, check.HasLen, 0)
81 }
82
83 func (FileJSONStoreSuite) TestGetNoDirectory(c *check.C) {
84 tmp := c.MkDir()
85 p := filepath.Join(tmp, "tuf_raw.db")
86 s, err := NewFileJSONStore(p)
87 c.Assert(err, check.IsNil)
88
89 err = os.Remove(p)
90 c.Assert(err, check.IsNil)
91
92 md, err := s.GetMeta()
93 c.Assert(md, check.IsNil)
94 c.Assert(err, check.NotNil)
95 }
96
97 func (FileJSONStoreSuite) TestMetadataOperations(c *check.C) {
98 tmp := c.MkDir()
99 p := filepath.Join(tmp, "tuf_raw.db")
100 s, err := NewFileJSONStore(p)
101 c.Assert(err, check.IsNil)
102
103 expected := map[string]json.RawMessage{
104 "file1.json": []byte{0xf1, 0xe1, 0xd1},
105 "file2.json": []byte{0xf2, 0xe2, 0xd2},
106 "file3.json": []byte{0xf3, 0xe3, 0xd3},
107 }
108
109 for k, v := range expected {
110 err := s.SetMeta(k, v)
111 c.Assert(err, check.IsNil)
112 }
113
114 md, err := s.GetMeta()
115 c.Assert(err, check.IsNil)
116 c.Assert(md, check.HasLen, 3)
117 c.Assert(md, check.DeepEquals, expected)
118
119
120 count := 3
121 for k := range expected {
122 err = s.DeleteMeta(k)
123 c.Assert(err, check.IsNil)
124
125 md, err := s.GetMeta()
126 c.Assert(err, check.IsNil)
127
128 count--
129 c.Assert(md, check.HasLen, count)
130 }
131
132 md, err = s.GetMeta()
133 c.Assert(err, check.IsNil)
134 c.Assert(md, check.HasLen, 0)
135 }
136
137 func (FileJSONStoreSuite) TestGetNoJSON(c *check.C) {
138 tmp := c.MkDir()
139 p := filepath.Join(tmp, "tuf_raw.db")
140 s, err := NewFileJSONStore(p)
141 c.Assert(s, check.NotNil)
142 c.Assert(err, check.IsNil)
143
144
145 fp := filepath.Join(p, "meta.xml")
146 err = os.WriteFile(fp, []byte{}, 0644)
147 c.Assert(err, check.IsNil)
148
149 md, err := s.GetMeta()
150 c.Assert(err, check.IsNil)
151 c.Assert(md, check.HasLen, 0)
152 }
153
154 func (FileJSONStoreSuite) TestNoJSON(c *check.C) {
155 tmp := c.MkDir()
156 p := filepath.Join(tmp, "tuf_raw.db")
157 s, err := NewFileJSONStore(p)
158 c.Assert(s, check.NotNil)
159 c.Assert(err, check.IsNil)
160
161 files := []string{
162 "file.xml",
163 "file",
164 "",
165 }
166 for _, f := range files {
167 err := s.SetMeta(f, []byte{})
168 c.Assert(err, check.ErrorMatches, "file.*is not a JSON file")
169 }
170 }
171
172 func (FileJSONStoreSuite) TestClose(c *check.C) {
173 tmp := c.MkDir()
174 p := filepath.Join(tmp, "tuf_raw.db")
175 s, err := NewFileJSONStore(p)
176 c.Assert(s, check.NotNil)
177 c.Assert(err, check.IsNil)
178
179 err = s.Close()
180 c.Assert(err, check.IsNil)
181 }
182
183 func (FileJSONStoreSuite) TestDelete(c *check.C) {
184 tmp := c.MkDir()
185 p := filepath.Join(tmp, "tuf_raw.db")
186 s, err := NewFileJSONStore(p)
187 c.Assert(s, check.NotNil)
188 c.Assert(err, check.IsNil)
189
190 err = s.DeleteMeta("not_json.yml")
191 c.Assert(err, check.ErrorMatches, "file not_json\\.yml is not a JSON file")
192 err = s.DeleteMeta("non_existing.json")
193 c.Assert(errors.Is(err, os.ErrNotExist), check.Equals, true)
194 }
195
View as plain text