github.com/kaisenlinux/docker.io@v0.0.0-20230510090727-ea55db55fac7/engine/daemon/images/image_search_test.go (about) 1 package images // import "github.com/docker/docker/daemon/images" 2 3 import ( 4 "context" 5 "errors" 6 "strings" 7 "testing" 8 9 "github.com/docker/docker/api/types" 10 registrytypes "github.com/docker/docker/api/types/registry" 11 "github.com/docker/docker/registry" 12 ) 13 14 type FakeService struct { 15 registry.DefaultService 16 17 shouldReturnError bool 18 19 term string 20 results []registrytypes.SearchResult 21 } 22 23 func (s *FakeService) Search(ctx context.Context, term string, limit int, authConfig *types.AuthConfig, userAgent string, headers map[string][]string) (*registrytypes.SearchResults, error) { 24 if s.shouldReturnError { 25 return nil, errors.New("Search unknown error") 26 } 27 return ®istrytypes.SearchResults{ 28 Query: s.term, 29 NumResults: len(s.results), 30 Results: s.results, 31 }, nil 32 } 33 34 func TestSearchRegistryForImagesErrors(t *testing.T) { 35 errorCases := []struct { 36 filtersArgs string 37 shouldReturnError bool 38 expectedError string 39 }{ 40 { 41 expectedError: "Search unknown error", 42 shouldReturnError: true, 43 }, 44 { 45 filtersArgs: "invalid json", 46 expectedError: "invalid character 'i' looking for beginning of value", 47 }, 48 { 49 filtersArgs: `{"type":{"custom":true}}`, 50 expectedError: "Invalid filter 'type'", 51 }, 52 { 53 filtersArgs: `{"is-automated":{"invalid":true}}`, 54 expectedError: "Invalid filter 'is-automated=[invalid]'", 55 }, 56 { 57 filtersArgs: `{"is-automated":{"true":true,"false":true}}`, 58 expectedError: "Invalid filter 'is-automated", 59 }, 60 { 61 filtersArgs: `{"is-official":{"invalid":true}}`, 62 expectedError: "Invalid filter 'is-official=[invalid]'", 63 }, 64 { 65 filtersArgs: `{"is-official":{"true":true,"false":true}}`, 66 expectedError: "Invalid filter 'is-official", 67 }, 68 { 69 filtersArgs: `{"stars":{"invalid":true}}`, 70 expectedError: "Invalid filter 'stars=invalid'", 71 }, 72 { 73 filtersArgs: `{"stars":{"1":true,"invalid":true}}`, 74 expectedError: "Invalid filter 'stars=invalid'", 75 }, 76 } 77 for index, e := range errorCases { 78 daemon := &ImageService{ 79 registryService: &FakeService{ 80 shouldReturnError: e.shouldReturnError, 81 }, 82 } 83 _, err := daemon.SearchRegistryForImages(context.Background(), e.filtersArgs, "term", 25, nil, map[string][]string{}) 84 if err == nil { 85 t.Errorf("%d: expected an error, got nothing", index) 86 } 87 if !strings.Contains(err.Error(), e.expectedError) { 88 t.Errorf("%d: expected error to contain %s, got %s", index, e.expectedError, err.Error()) 89 } 90 } 91 } 92 93 func TestSearchRegistryForImages(t *testing.T) { 94 term := "term" 95 successCases := []struct { 96 filtersArgs string 97 registryResults []registrytypes.SearchResult 98 expectedResults []registrytypes.SearchResult 99 }{ 100 { 101 filtersArgs: "", 102 registryResults: []registrytypes.SearchResult{}, 103 expectedResults: []registrytypes.SearchResult{}, 104 }, 105 { 106 filtersArgs: "", 107 registryResults: []registrytypes.SearchResult{ 108 { 109 Name: "name", 110 Description: "description", 111 }, 112 }, 113 expectedResults: []registrytypes.SearchResult{ 114 { 115 Name: "name", 116 Description: "description", 117 }, 118 }, 119 }, 120 { 121 filtersArgs: `{"is-automated":{"true":true}}`, 122 registryResults: []registrytypes.SearchResult{ 123 { 124 Name: "name", 125 Description: "description", 126 }, 127 }, 128 expectedResults: []registrytypes.SearchResult{}, 129 }, 130 { 131 filtersArgs: `{"is-automated":{"true":true}}`, 132 registryResults: []registrytypes.SearchResult{ 133 { 134 Name: "name", 135 Description: "description", 136 IsAutomated: true, 137 }, 138 }, 139 expectedResults: []registrytypes.SearchResult{ 140 { 141 Name: "name", 142 Description: "description", 143 IsAutomated: true, 144 }, 145 }, 146 }, 147 { 148 filtersArgs: `{"is-automated":{"false":true}}`, 149 registryResults: []registrytypes.SearchResult{ 150 { 151 Name: "name", 152 Description: "description", 153 IsAutomated: true, 154 }, 155 }, 156 expectedResults: []registrytypes.SearchResult{}, 157 }, 158 { 159 filtersArgs: `{"is-automated":{"false":true}}`, 160 registryResults: []registrytypes.SearchResult{ 161 { 162 Name: "name", 163 Description: "description", 164 IsAutomated: false, 165 }, 166 }, 167 expectedResults: []registrytypes.SearchResult{ 168 { 169 Name: "name", 170 Description: "description", 171 IsAutomated: false, 172 }, 173 }, 174 }, 175 { 176 filtersArgs: `{"is-official":{"true":true}}`, 177 registryResults: []registrytypes.SearchResult{ 178 { 179 Name: "name", 180 Description: "description", 181 }, 182 }, 183 expectedResults: []registrytypes.SearchResult{}, 184 }, 185 { 186 filtersArgs: `{"is-official":{"true":true}}`, 187 registryResults: []registrytypes.SearchResult{ 188 { 189 Name: "name", 190 Description: "description", 191 IsOfficial: true, 192 }, 193 }, 194 expectedResults: []registrytypes.SearchResult{ 195 { 196 Name: "name", 197 Description: "description", 198 IsOfficial: true, 199 }, 200 }, 201 }, 202 { 203 filtersArgs: `{"is-official":{"false":true}}`, 204 registryResults: []registrytypes.SearchResult{ 205 { 206 Name: "name", 207 Description: "description", 208 IsOfficial: true, 209 }, 210 }, 211 expectedResults: []registrytypes.SearchResult{}, 212 }, 213 { 214 filtersArgs: `{"is-official":{"false":true}}`, 215 registryResults: []registrytypes.SearchResult{ 216 { 217 Name: "name", 218 Description: "description", 219 IsOfficial: false, 220 }, 221 }, 222 expectedResults: []registrytypes.SearchResult{ 223 { 224 Name: "name", 225 Description: "description", 226 IsOfficial: false, 227 }, 228 }, 229 }, 230 { 231 filtersArgs: `{"stars":{"0":true}}`, 232 registryResults: []registrytypes.SearchResult{ 233 { 234 Name: "name", 235 Description: "description", 236 StarCount: 0, 237 }, 238 }, 239 expectedResults: []registrytypes.SearchResult{ 240 { 241 Name: "name", 242 Description: "description", 243 StarCount: 0, 244 }, 245 }, 246 }, 247 { 248 filtersArgs: `{"stars":{"1":true}}`, 249 registryResults: []registrytypes.SearchResult{ 250 { 251 Name: "name", 252 Description: "description", 253 StarCount: 0, 254 }, 255 }, 256 expectedResults: []registrytypes.SearchResult{}, 257 }, 258 { 259 filtersArgs: `{"stars":{"1":true}}`, 260 registryResults: []registrytypes.SearchResult{ 261 { 262 Name: "name0", 263 Description: "description0", 264 StarCount: 0, 265 }, 266 { 267 Name: "name1", 268 Description: "description1", 269 StarCount: 1, 270 }, 271 }, 272 expectedResults: []registrytypes.SearchResult{ 273 { 274 Name: "name1", 275 Description: "description1", 276 StarCount: 1, 277 }, 278 }, 279 }, 280 { 281 filtersArgs: `{"stars":{"1":true}, "is-official":{"true":true}, "is-automated":{"true":true}}`, 282 registryResults: []registrytypes.SearchResult{ 283 { 284 Name: "name0", 285 Description: "description0", 286 StarCount: 0, 287 IsOfficial: true, 288 IsAutomated: true, 289 }, 290 { 291 Name: "name1", 292 Description: "description1", 293 StarCount: 1, 294 IsOfficial: false, 295 IsAutomated: true, 296 }, 297 { 298 Name: "name2", 299 Description: "description2", 300 StarCount: 1, 301 IsOfficial: true, 302 IsAutomated: false, 303 }, 304 { 305 Name: "name3", 306 Description: "description3", 307 StarCount: 2, 308 IsOfficial: true, 309 IsAutomated: true, 310 }, 311 }, 312 expectedResults: []registrytypes.SearchResult{ 313 { 314 Name: "name3", 315 Description: "description3", 316 StarCount: 2, 317 IsOfficial: true, 318 IsAutomated: true, 319 }, 320 }, 321 }, 322 } 323 for index, s := range successCases { 324 daemon := &ImageService{ 325 registryService: &FakeService{ 326 term: term, 327 results: s.registryResults, 328 }, 329 } 330 results, err := daemon.SearchRegistryForImages(context.Background(), s.filtersArgs, term, 25, nil, map[string][]string{}) 331 if err != nil { 332 t.Errorf("%d: %v", index, err) 333 } 334 if results.Query != term { 335 t.Errorf("%d: expected Query to be %s, got %s", index, term, results.Query) 336 } 337 if results.NumResults != len(s.expectedResults) { 338 t.Errorf("%d: expected NumResults to be %d, got %d", index, len(s.expectedResults), results.NumResults) 339 } 340 for _, result := range results.Results { 341 found := false 342 for _, expectedResult := range s.expectedResults { 343 if expectedResult.Name == result.Name && 344 expectedResult.Description == result.Description && 345 expectedResult.IsAutomated == result.IsAutomated && 346 expectedResult.IsOfficial == result.IsOfficial && 347 expectedResult.StarCount == result.StarCount { 348 found = true 349 break 350 } 351 } 352 if !found { 353 t.Errorf("%d: expected results %v, got %v", index, s.expectedResults, results.Results) 354 } 355 } 356 } 357 }