image_tag_test.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. package client // import "github.com/docker/docker/client"
  2. import (
  3. "bytes"
  4. "context"
  5. "fmt"
  6. "io/ioutil"
  7. "net/http"
  8. "strings"
  9. "testing"
  10. "github.com/docker/docker/errdefs"
  11. )
  12. func TestImageTagError(t *testing.T) {
  13. client := &Client{
  14. client: newMockClient(errorMock(http.StatusInternalServerError, "Server error")),
  15. }
  16. err := client.ImageTag(context.Background(), "image_id", "repo:tag")
  17. if err == nil || err.Error() != "Error response from daemon: Server error" {
  18. t.Fatalf("expected a Server Error, got %v", err)
  19. }
  20. if !errdefs.IsSystem(err) {
  21. t.Fatalf("expected a Server Error, got %T", err)
  22. }
  23. }
  24. // Note: this is not testing all the InvalidReference as it's the responsibility
  25. // of distribution/reference package.
  26. func TestImageTagInvalidReference(t *testing.T) {
  27. client := &Client{
  28. client: newMockClient(errorMock(http.StatusInternalServerError, "Server error")),
  29. }
  30. err := client.ImageTag(context.Background(), "image_id", "aa/asdf$$^/aa")
  31. if err == nil || err.Error() != `Error parsing reference: "aa/asdf$$^/aa" is not a valid repository/tag: invalid reference format` {
  32. t.Fatalf("expected ErrReferenceInvalidFormat, got %v", err)
  33. }
  34. }
  35. func TestImageTagInvalidSourceImageName(t *testing.T) {
  36. client := &Client{
  37. client: newMockClient(errorMock(http.StatusInternalServerError, "Server error")),
  38. }
  39. err := client.ImageTag(context.Background(), "invalid_source_image_name_", "repo:tag")
  40. if err == nil || err.Error() != "Error parsing reference: \"invalid_source_image_name_\" is not a valid repository/tag: invalid reference format" {
  41. t.Fatalf("expected Parsing Reference Error, got %v", err)
  42. }
  43. }
  44. func TestImageTagHexSource(t *testing.T) {
  45. client := &Client{
  46. client: newMockClient(errorMock(http.StatusOK, "OK")),
  47. }
  48. err := client.ImageTag(context.Background(), "0d409d33b27e47423b049f7f863faa08655a8c901749c2b25b93ca67d01a470d", "repo:tag")
  49. if err != nil {
  50. t.Fatalf("got error: %v", err)
  51. }
  52. }
  53. func TestImageTag(t *testing.T) {
  54. expectedURL := "/images/image_id/tag"
  55. tagCases := []struct {
  56. reference string
  57. expectedQueryParams map[string]string
  58. }{
  59. {
  60. reference: "repository:tag1",
  61. expectedQueryParams: map[string]string{
  62. "repo": "repository",
  63. "tag": "tag1",
  64. },
  65. }, {
  66. reference: "another_repository:latest",
  67. expectedQueryParams: map[string]string{
  68. "repo": "another_repository",
  69. "tag": "latest",
  70. },
  71. }, {
  72. reference: "another_repository",
  73. expectedQueryParams: map[string]string{
  74. "repo": "another_repository",
  75. "tag": "latest",
  76. },
  77. }, {
  78. reference: "test/another_repository",
  79. expectedQueryParams: map[string]string{
  80. "repo": "test/another_repository",
  81. "tag": "latest",
  82. },
  83. }, {
  84. reference: "test/another_repository:tag1",
  85. expectedQueryParams: map[string]string{
  86. "repo": "test/another_repository",
  87. "tag": "tag1",
  88. },
  89. }, {
  90. reference: "test/test/another_repository:tag1",
  91. expectedQueryParams: map[string]string{
  92. "repo": "test/test/another_repository",
  93. "tag": "tag1",
  94. },
  95. }, {
  96. reference: "test:5000/test/another_repository:tag1",
  97. expectedQueryParams: map[string]string{
  98. "repo": "test:5000/test/another_repository",
  99. "tag": "tag1",
  100. },
  101. }, {
  102. reference: "test:5000/test/another_repository",
  103. expectedQueryParams: map[string]string{
  104. "repo": "test:5000/test/another_repository",
  105. "tag": "latest",
  106. },
  107. },
  108. }
  109. for _, tagCase := range tagCases {
  110. client := &Client{
  111. client: newMockClient(func(req *http.Request) (*http.Response, error) {
  112. if !strings.HasPrefix(req.URL.Path, expectedURL) {
  113. return nil, fmt.Errorf("expected URL '%s', got '%s'", expectedURL, req.URL)
  114. }
  115. if req.Method != "POST" {
  116. return nil, fmt.Errorf("expected POST method, got %s", req.Method)
  117. }
  118. query := req.URL.Query()
  119. for key, expected := range tagCase.expectedQueryParams {
  120. actual := query.Get(key)
  121. if actual != expected {
  122. return nil, fmt.Errorf("%s not set in URL query properly. Expected '%s', got %s", key, expected, actual)
  123. }
  124. }
  125. return &http.Response{
  126. StatusCode: http.StatusOK,
  127. Body: ioutil.NopCloser(bytes.NewReader([]byte(""))),
  128. }, nil
  129. }),
  130. }
  131. err := client.ImageTag(context.Background(), "image_id", tagCase.reference)
  132. if err != nil {
  133. t.Fatal(err)
  134. }
  135. }
  136. }