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  }