github.com/hugh712/snapd@v0.0.0-20200910133618-1a99902bd583/asserts/findwildcard_test.go (about) 1 // -*- Mode: Go; indent-tabs-mode: t -*- 2 3 /* 4 * Copyright (C) 2015-2020 Canonical Ltd 5 * 6 * This program is free software: you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License version 3 as 8 * published by the Free Software Foundation. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program. If not, see <http://www.gnu.org/licenses/>. 17 * 18 */ 19 20 package asserts 21 22 import ( 23 "errors" 24 "io/ioutil" 25 "os" 26 "path/filepath" 27 "sort" 28 29 "gopkg.in/check.v1" 30 ) 31 32 type findWildcardSuite struct{} 33 34 var _ = check.Suite(&findWildcardSuite{}) 35 36 func (fs *findWildcardSuite) TestFindWildcard(c *check.C) { 37 top := filepath.Join(c.MkDir(), "top") 38 39 err := os.MkdirAll(top, os.ModePerm) 40 c.Assert(err, check.IsNil) 41 err = os.MkdirAll(filepath.Join(top, "acc-id1"), os.ModePerm) 42 c.Assert(err, check.IsNil) 43 err = os.MkdirAll(filepath.Join(top, "acc-id1", "abcd"), os.ModePerm) 44 c.Assert(err, check.IsNil) 45 err = os.MkdirAll(filepath.Join(top, "acc-id1", "e5cd"), os.ModePerm) 46 c.Assert(err, check.IsNil) 47 err = os.MkdirAll(filepath.Join(top, "acc-id2"), os.ModePerm) 48 c.Assert(err, check.IsNil) 49 err = os.MkdirAll(filepath.Join(top, "acc-id2", "f444"), os.ModePerm) 50 c.Assert(err, check.IsNil) 51 52 err = ioutil.WriteFile(filepath.Join(top, "acc-id1", "abcd", "active"), nil, os.ModePerm) 53 c.Assert(err, check.IsNil) 54 err = ioutil.WriteFile(filepath.Join(top, "acc-id1", "abcd", "active.1"), nil, os.ModePerm) 55 c.Assert(err, check.IsNil) 56 err = ioutil.WriteFile(filepath.Join(top, "acc-id1", "e5cd", "active"), nil, os.ModePerm) 57 c.Assert(err, check.IsNil) 58 err = ioutil.WriteFile(filepath.Join(top, "acc-id2", "f444", "active"), nil, os.ModePerm) 59 c.Assert(err, check.IsNil) 60 61 var res []string 62 foundCb := func(relpath []string) error { 63 res = append(res, relpath...) 64 return nil 65 } 66 67 err = findWildcard(top, []string{"*", "*", "active"}, 0, foundCb) 68 c.Assert(err, check.IsNil) 69 sort.Strings(res) 70 c.Check(res, check.DeepEquals, []string{"acc-id1/abcd/active", "acc-id1/e5cd/active", "acc-id2/f444/active"}) 71 72 res = nil 73 err = findWildcard(top, []string{"*", "*", "active*"}, 0, foundCb) 74 c.Assert(err, check.IsNil) 75 sort.Strings(res) 76 c.Check(res, check.DeepEquals, []string{"acc-id1/abcd/active", "acc-id1/abcd/active.1", "acc-id1/e5cd/active", "acc-id2/f444/active"}) 77 78 res = nil 79 err = findWildcard(top, []string{"zoo", "*", "active"}, 0, foundCb) 80 c.Assert(err, check.IsNil) 81 c.Check(res, check.HasLen, 0) 82 83 res = nil 84 err = findWildcard(top, []string{"zoo", "*", "active*"}, 0, foundCb) 85 c.Assert(err, check.IsNil) 86 c.Check(res, check.HasLen, 0) 87 88 res = nil 89 err = findWildcard(top, []string{"a*", "zoo", "active"}, 0, foundCb) 90 c.Assert(err, check.IsNil) 91 c.Check(res, check.HasLen, 0) 92 93 res = nil 94 err = findWildcard(top, []string{"acc-id1", "*cd", "active"}, 0, foundCb) 95 c.Assert(err, check.IsNil) 96 sort.Strings(res) 97 c.Check(res, check.DeepEquals, []string{"acc-id1/abcd/active", "acc-id1/e5cd/active"}) 98 99 res = nil 100 err = findWildcard(top, []string{"acc-id1", "*cd", "active*"}, 0, foundCb) 101 c.Assert(err, check.IsNil) 102 sort.Strings(res) 103 c.Check(res, check.DeepEquals, []string{"acc-id1/abcd/active", "acc-id1/abcd/active.1", "acc-id1/e5cd/active"}) 104 105 } 106 107 func (fs *findWildcardSuite) TestFindWildcardSomeErrors(c *check.C) { 108 top := filepath.Join(c.MkDir(), "top-errors") 109 110 err := os.MkdirAll(top, os.ModePerm) 111 c.Assert(err, check.IsNil) 112 err = os.MkdirAll(filepath.Join(top, "acc-id1"), os.ModePerm) 113 c.Assert(err, check.IsNil) 114 err = os.MkdirAll(filepath.Join(top, "acc-id2"), os.ModePerm) 115 c.Assert(err, check.IsNil) 116 117 err = ioutil.WriteFile(filepath.Join(top, "acc-id1", "abcd"), nil, os.ModePerm) 118 c.Assert(err, check.IsNil) 119 120 err = os.MkdirAll(filepath.Join(top, "acc-id2", "dddd"), os.ModePerm) 121 c.Assert(err, check.IsNil) 122 123 var res []string 124 var retErr error 125 foundCb := func(relpath []string) error { 126 res = append(res, relpath...) 127 return retErr 128 } 129 130 myErr := errors.New("boom") 131 retErr = myErr 132 err = findWildcard(top, []string{"acc-id1", "*"}, 0, foundCb) 133 c.Check(err, check.Equals, myErr) 134 135 retErr = nil 136 res = nil 137 err = findWildcard(top, []string{"acc-id2", "*"}, 0, foundCb) 138 c.Check(err, check.ErrorMatches, "expected a regular file: .*") 139 } 140 141 func (fs *findWildcardSuite) TestFindWildcardSequence(c *check.C) { 142 top := filepath.Join(c.MkDir(), "top") 143 144 err := os.MkdirAll(top, os.ModePerm) 145 c.Assert(err, check.IsNil) 146 147 files := []string{ 148 "s1/3/active.1", 149 "s1/3/active.2", 150 "s1/2/active", 151 "s1/2/active.1", 152 "s1/1/active", 153 } 154 for _, fn := range files { 155 err := os.MkdirAll(filepath.Dir(filepath.Join(top, fn)), os.ModePerm) 156 c.Assert(err, check.IsNil) 157 err = ioutil.WriteFile(filepath.Join(top, fn), nil, os.ModePerm) 158 c.Assert(err, check.IsNil) 159 } 160 161 var res [][]string 162 foundCb := func(relpath []string) error { 163 res = append(res, relpath) 164 return nil 165 } 166 167 sort := func() { 168 for _, r := range res { 169 sort.Strings(r) 170 } 171 } 172 173 // ascending 174 175 err = findWildcard(top, []string{"s1", "#>", "active*"}, 1, foundCb) 176 c.Assert(err, check.IsNil) 177 sort() 178 c.Check(res, check.DeepEquals, [][]string{ 179 {"s1/2/active", "s1/2/active.1"}, 180 {"s1/3/active.1", "s1/3/active.2"}, 181 }) 182 183 res = nil 184 err = findWildcard(top, []string{"s1", "#>", "active*"}, 2, foundCb) 185 c.Assert(err, check.IsNil) 186 sort() 187 c.Check(res, check.DeepEquals, [][]string{ 188 {"s1/3/active.1", "s1/3/active.2"}, 189 }) 190 191 res = nil 192 err = findWildcard(top, []string{"s1", "#>", "active*"}, 3, foundCb) 193 c.Assert(err, check.IsNil) 194 c.Check(res, check.HasLen, 0) 195 196 res = nil 197 err = findWildcard(top, []string{"s1", "#>", "active*"}, -1, foundCb) 198 c.Assert(err, check.IsNil) 199 sort() 200 c.Check(res, check.DeepEquals, [][]string{ 201 {"s1/1/active"}, 202 {"s1/2/active", "s1/2/active.1"}, 203 {"s1/3/active.1", "s1/3/active.2"}, 204 }) 205 206 // descending 207 208 res = nil 209 err = findWildcard(top, []string{"s1", "#<", "active*"}, -1, foundCb) 210 c.Assert(err, check.IsNil) 211 sort() 212 c.Check(res, check.DeepEquals, [][]string{ 213 {"s1/3/active.1", "s1/3/active.2"}, 214 {"s1/2/active", "s1/2/active.1"}, 215 {"s1/1/active"}, 216 }) 217 218 res = nil 219 err = findWildcard(top, []string{"s1", "#<", "active*"}, 3, foundCb) 220 c.Assert(err, check.IsNil) 221 sort() 222 c.Check(res, check.DeepEquals, [][]string{ 223 {"s1/2/active", "s1/2/active.1"}, 224 {"s1/1/active"}, 225 }) 226 227 res = nil 228 err = findWildcard(top, []string{"s1", "#<", "active*"}, 2, foundCb) 229 c.Assert(err, check.IsNil) 230 sort() 231 c.Check(res, check.DeepEquals, [][]string{ 232 {"s1/1/active"}, 233 }) 234 235 res = nil 236 err = findWildcard(top, []string{"s1", "#<", "active*"}, 1, foundCb) 237 c.Assert(err, check.IsNil) 238 c.Check(res, check.HasLen, 0) 239 240 // missing dir 241 res = nil 242 err = findWildcard(top, []string{"s2", "#<", "active*"}, 1, foundCb) 243 c.Assert(err, check.IsNil) 244 c.Check(res, check.HasLen, 0) 245 } 246 247 func (fs *findWildcardSuite) TestFindWildcardSequenceSomeErrors(c *check.C) { 248 top := filepath.Join(c.MkDir(), "top-errors") 249 250 err := os.MkdirAll(top, os.ModePerm) 251 c.Assert(err, check.IsNil) 252 253 files := []string{ 254 "s1/1/active", 255 "s2/a/active.1", 256 "s3/-9/active.1", 257 "s4/01/active", 258 } 259 for _, fn := range files { 260 err := os.MkdirAll(filepath.Dir(filepath.Join(top, fn)), os.ModePerm) 261 c.Assert(err, check.IsNil) 262 err = ioutil.WriteFile(filepath.Join(top, fn), nil, os.ModePerm) 263 c.Assert(err, check.IsNil) 264 } 265 266 myErr := errors.New("boom") 267 foundCb := func(relpath []string) error { 268 return myErr 269 } 270 271 err = findWildcard(top, []string{"s1", "#>", "active*"}, -1, foundCb) 272 c.Assert(err, check.Equals, myErr) 273 274 err = findWildcard(top, []string{"s2", "#>", "active*"}, -1, foundCb) 275 c.Assert(err, check.ErrorMatches, `cannot parse ".*/top-errors/s2/a" name as a valid sequence number`) 276 277 err = findWildcard(top, []string{"s3", "#>", "active*"}, -1, foundCb) 278 c.Assert(err, check.ErrorMatches, `cannot parse ".*/top-errors/s3/-9" name as a valid sequence number`) 279 280 err = findWildcard(top, []string{"s4", "#>", "active*"}, -1, foundCb) 281 c.Assert(err, check.ErrorMatches, `cannot parse ".*/top-errors/s4/01" name as a valid sequence number`) 282 }