list_test.go 2.8 KB

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