8 "golang.org/x/net/context"
10 "github.com/docker/docker/api/types"
11 registrytypes "github.com/docker/docker/api/types/registry"
12 "github.com/docker/docker/registry"
15 type FakeService struct {
16 registry.DefaultService
18 shouldReturnError bool
21 results []registrytypes.SearchResult
24 func (s *FakeService) Search(ctx context.Context, term string, limit int, authConfig *types.AuthConfig, userAgent string, headers map[string][]string) (*registrytypes.SearchResults, error) {
25 if s.shouldReturnError {
26 return nil, errors.New("Search unknown error")
28 return ®istrytypes.SearchResults{
30 NumResults: len(s.results),
35 func TestSearchRegistryForImagesErrors(t *testing.T) {
36 errorCases := []struct {
38 shouldReturnError bool
42 expectedError: "Search unknown error",
43 shouldReturnError: true,
46 filtersArgs: "invalid json",
47 expectedError: "invalid character 'i' looking for beginning of value",
50 filtersArgs: `{"type":{"custom":true}}`,
51 expectedError: "Invalid filter 'type'",
54 filtersArgs: `{"is-automated":{"invalid":true}}`,
55 expectedError: "Invalid filter 'is-automated=[invalid]'",
58 filtersArgs: `{"is-automated":{"true":true,"false":true}}`,
59 expectedError: "Invalid filter 'is-automated",
62 filtersArgs: `{"is-official":{"invalid":true}}`,
63 expectedError: "Invalid filter 'is-official=[invalid]'",
66 filtersArgs: `{"is-official":{"true":true,"false":true}}`,
67 expectedError: "Invalid filter 'is-official",
70 filtersArgs: `{"stars":{"invalid":true}}`,
71 expectedError: "Invalid filter 'stars=invalid'",
74 filtersArgs: `{"stars":{"1":true,"invalid":true}}`,
75 expectedError: "Invalid filter 'stars=invalid'",
78 for index, e := range errorCases {
80 RegistryService: &FakeService{
81 shouldReturnError: e.shouldReturnError,
84 _, err := daemon.SearchRegistryForImages(context.Background(), e.filtersArgs, "term", 25, nil, map[string][]string{})
86 t.Errorf("%d: expected an error, got nothing", index)
88 if !strings.Contains(err.Error(), e.expectedError) {
89 t.Errorf("%d: expected error to contain %s, got %s", index, e.expectedError, err.Error())
94 func TestSearchRegistryForImages(t *testing.T) {
96 successCases := []struct {
98 registryResults []registrytypes.SearchResult
99 expectedResults []registrytypes.SearchResult
103 registryResults: []registrytypes.SearchResult{},
104 expectedResults: []registrytypes.SearchResult{},
108 registryResults: []registrytypes.SearchResult{
111 Description: "description",
114 expectedResults: []registrytypes.SearchResult{
117 Description: "description",
122 filtersArgs: `{"is-automated":{"true":true}}`,
123 registryResults: []registrytypes.SearchResult{
126 Description: "description",
129 expectedResults: []registrytypes.SearchResult{},
132 filtersArgs: `{"is-automated":{"true":true}}`,
133 registryResults: []registrytypes.SearchResult{
136 Description: "description",
140 expectedResults: []registrytypes.SearchResult{
143 Description: "description",
149 filtersArgs: `{"is-automated":{"false":true}}`,
150 registryResults: []registrytypes.SearchResult{
153 Description: "description",
157 expectedResults: []registrytypes.SearchResult{},
160 filtersArgs: `{"is-automated":{"false":true}}`,
161 registryResults: []registrytypes.SearchResult{
164 Description: "description",
168 expectedResults: []registrytypes.SearchResult{
171 Description: "description",
177 filtersArgs: `{"is-official":{"true":true}}`,
178 registryResults: []registrytypes.SearchResult{
181 Description: "description",
184 expectedResults: []registrytypes.SearchResult{},
187 filtersArgs: `{"is-official":{"true":true}}`,
188 registryResults: []registrytypes.SearchResult{
191 Description: "description",
195 expectedResults: []registrytypes.SearchResult{
198 Description: "description",
204 filtersArgs: `{"is-official":{"false":true}}`,
205 registryResults: []registrytypes.SearchResult{
208 Description: "description",
212 expectedResults: []registrytypes.SearchResult{},
215 filtersArgs: `{"is-official":{"false":true}}`,
216 registryResults: []registrytypes.SearchResult{
219 Description: "description",
223 expectedResults: []registrytypes.SearchResult{
226 Description: "description",
232 filtersArgs: `{"stars":{"0":true}}`,
233 registryResults: []registrytypes.SearchResult{
236 Description: "description",
240 expectedResults: []registrytypes.SearchResult{
243 Description: "description",
249 filtersArgs: `{"stars":{"1":true}}`,
250 registryResults: []registrytypes.SearchResult{
253 Description: "description",
257 expectedResults: []registrytypes.SearchResult{},
260 filtersArgs: `{"stars":{"1":true}}`,
261 registryResults: []registrytypes.SearchResult{
264 Description: "description0",
269 Description: "description1",
273 expectedResults: []registrytypes.SearchResult{
276 Description: "description1",
282 filtersArgs: `{"stars":{"1":true}, "is-official":{"true":true}, "is-automated":{"true":true}}`,
283 registryResults: []registrytypes.SearchResult{
286 Description: "description0",
293 Description: "description1",
300 Description: "description2",
307 Description: "description3",
313 expectedResults: []registrytypes.SearchResult{
316 Description: "description3",
324 for index, s := range successCases {
326 RegistryService: &FakeService{
328 results: s.registryResults,
331 results, err := daemon.SearchRegistryForImages(context.Background(), s.filtersArgs, term, 25, nil, map[string][]string{})
333 t.Errorf("%d: %v", index, err)
335 if results.Query != term {
336 t.Errorf("%d: expected Query to be %s, got %s", index, term, results.Query)
338 if results.NumResults != len(s.expectedResults) {
339 t.Errorf("%d: expected NumResults to be %d, got %d", index, len(s.expectedResults), results.NumResults)
341 for _, result := range results.Results {
343 for _, expectedResult := range s.expectedResults {
344 if expectedResult.Name == result.Name &&
345 expectedResult.Description == result.Description &&
346 expectedResult.IsAutomated == result.IsAutomated &&
347 expectedResult.IsOfficial == result.IsOfficial &&
348 expectedResult.StarCount == result.StarCount {
354 t.Errorf("%d: expected results %v, got %v", index, s.expectedResults, results.Results)