github.com/rawahars/moby@v24.0.4+incompatible/integration/image/list_test.go (about) 1 package image // import "github.com/docker/docker/integration/image" 2 3 import ( 4 "context" 5 "fmt" 6 "strings" 7 "testing" 8 "time" 9 10 "github.com/docker/docker/api/types" 11 "github.com/docker/docker/api/types/filters" 12 "github.com/docker/docker/api/types/versions" 13 "github.com/docker/docker/integration/internal/container" 14 "github.com/google/go-cmp/cmp/cmpopts" 15 "gotest.tools/v3/assert" 16 is "gotest.tools/v3/assert/cmp" 17 "gotest.tools/v3/skip" 18 ) 19 20 // Regression : #38171 21 func TestImagesFilterMultiReference(t *testing.T) { 22 skip.If(t, versions.LessThan(testEnv.DaemonAPIVersion(), "1.40"), "broken in earlier versions") 23 defer setupTest(t)() 24 client := testEnv.APIClient() 25 ctx := context.Background() 26 27 name := strings.ToLower(t.Name()) 28 repoTags := []string{ 29 name + ":v1", 30 name + ":v2", 31 name + ":v3", 32 name + ":v4", 33 } 34 35 for _, repoTag := range repoTags { 36 err := client.ImageTag(ctx, "busybox:latest", repoTag) 37 assert.NilError(t, err) 38 } 39 40 filter := filters.NewArgs() 41 filter.Add("reference", repoTags[0]) 42 filter.Add("reference", repoTags[1]) 43 filter.Add("reference", repoTags[2]) 44 options := types.ImageListOptions{ 45 All: false, 46 Filters: filter, 47 } 48 images, err := client.ImageList(ctx, options) 49 assert.NilError(t, err) 50 51 assert.Check(t, is.Equal(len(images[0].RepoTags), 3)) 52 for _, repoTag := range images[0].RepoTags { 53 if repoTag != repoTags[0] && repoTag != repoTags[1] && repoTag != repoTags[2] { 54 t.Errorf("list images doesn't match any repoTag we expected, repoTag: %s", repoTag) 55 } 56 } 57 } 58 59 func TestImagesFilterBeforeSince(t *testing.T) { 60 defer setupTest(t)() 61 client := testEnv.APIClient() 62 ctx := context.Background() 63 64 name := strings.ToLower(t.Name()) 65 ctr := container.Create(ctx, t, client, container.WithName(name)) 66 67 imgs := make([]string, 5) 68 for i := range imgs { 69 if i > 0 { 70 // Make really really sure each image has a distinct timestamp. 71 time.Sleep(time.Millisecond) 72 } 73 id, err := client.ContainerCommit(ctx, ctr, types.ContainerCommitOptions{Reference: fmt.Sprintf("%s:v%d", name, i)}) 74 assert.NilError(t, err) 75 imgs[i] = id.ID 76 } 77 78 filter := filters.NewArgs( 79 filters.Arg("since", imgs[0]), 80 filters.Arg("before", imgs[len(imgs)-1]), 81 ) 82 list, err := client.ImageList(ctx, types.ImageListOptions{Filters: filter}) 83 assert.NilError(t, err) 84 85 var listedIDs []string 86 for _, i := range list { 87 t.Logf("ImageList: ID=%v RepoTags=%v", i.ID, i.RepoTags) 88 listedIDs = append(listedIDs, i.ID) 89 } 90 // The ImageList API sorts the list by created timestamp... truncated to 91 // 1-second precision. Since all the images were created within 92 // milliseconds of each other, listedIDs is effectively unordered and 93 // the assertion must therefore be order-independent. 94 assert.DeepEqual(t, listedIDs, imgs[1:len(imgs)-1], cmpopts.SortSlices(func(a, b string) bool { return a < b })) 95 }