registry_test.go 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. package registry
  2. import (
  3. "github.com/dotcloud/docker/auth"
  4. "github.com/dotcloud/docker/utils"
  5. "strings"
  6. "testing"
  7. )
  8. var (
  9. IMAGE_ID = "42d718c941f5c532ac049bf0b0ab53f0062f09a03afd4aa4a02c098e46032b9d"
  10. TOKEN = []string{"fake-token"}
  11. REPO = "foo42/bar"
  12. )
  13. func spawnTestRegistry(t *testing.T) *Registry {
  14. authConfig := &auth.AuthConfig{}
  15. r, err := NewRegistry(authConfig, utils.NewHTTPRequestFactory(), makeURL("/v1/"))
  16. if err != nil {
  17. t.Fatal(err)
  18. }
  19. return r
  20. }
  21. func TestPingRegistryEndpoint(t *testing.T) {
  22. standalone, err := pingRegistryEndpoint(makeURL("/v1/"))
  23. if err != nil {
  24. t.Fatal(err)
  25. }
  26. assertEqual(t, standalone, true, "Expected standalone to be true (default)")
  27. }
  28. func TestGetRemoteHistory(t *testing.T) {
  29. r := spawnTestRegistry(t)
  30. hist, err := r.GetRemoteHistory(IMAGE_ID, makeURL("/v1/"), TOKEN)
  31. if err != nil {
  32. t.Fatal(err)
  33. }
  34. assertEqual(t, len(hist), 2, "Expected 2 images in history")
  35. assertEqual(t, hist[0], IMAGE_ID, "Expected "+IMAGE_ID+"as first ancestry")
  36. assertEqual(t, hist[1], "77dbf71da1d00e3fbddc480176eac8994025630c6590d11cfc8fe1209c2a1d20",
  37. "Unexpected second ancestry")
  38. }
  39. func TestLookupRemoteImage(t *testing.T) {
  40. r := spawnTestRegistry(t)
  41. found := r.LookupRemoteImage(IMAGE_ID, makeURL("/v1/"), TOKEN)
  42. assertEqual(t, found, true, "Expected remote lookup to succeed")
  43. found = r.LookupRemoteImage("abcdef", makeURL("/v1/"), TOKEN)
  44. assertEqual(t, found, false, "Expected remote lookup to fail")
  45. }
  46. func TestGetRemoteImageJSON(t *testing.T) {
  47. r := spawnTestRegistry(t)
  48. json, size, err := r.GetRemoteImageJSON(IMAGE_ID, makeURL("/v1/"), TOKEN)
  49. if err != nil {
  50. t.Fatal(err)
  51. }
  52. assertEqual(t, size, 154, "Expected size 154")
  53. if len(json) <= 0 {
  54. t.Fatal("Expected non-empty json")
  55. }
  56. _, _, err = r.GetRemoteImageJSON("abcdef", makeURL("/v1/"), TOKEN)
  57. if err == nil {
  58. t.Fatal("Expected image not found error")
  59. }
  60. }
  61. func TestGetRemoteImageLayer(t *testing.T) {
  62. r := spawnTestRegistry(t)
  63. data, err := r.GetRemoteImageLayer(IMAGE_ID, makeURL("/v1/"), TOKEN)
  64. if err != nil {
  65. t.Fatal(err)
  66. }
  67. if data == nil {
  68. t.Fatal("Expected non-nil data result")
  69. }
  70. _, err = r.GetRemoteImageLayer("abcdef", makeURL("/v1/"), TOKEN)
  71. if err == nil {
  72. t.Fatal("Expected image not found error")
  73. }
  74. }
  75. func TestGetRemoteTags(t *testing.T) {
  76. r := spawnTestRegistry(t)
  77. tags, err := r.GetRemoteTags([]string{makeURL("/v1/")}, REPO, TOKEN)
  78. if err != nil {
  79. t.Fatal(err)
  80. }
  81. assertEqual(t, len(tags), 1, "Expected one tag")
  82. assertEqual(t, tags["latest"], IMAGE_ID, "Expected tag latest to map to "+IMAGE_ID)
  83. _, err = r.GetRemoteTags([]string{makeURL("/v1/")}, "foo42/baz", TOKEN)
  84. if err == nil {
  85. t.Fatal("Expected error when fetching tags for bogus repo")
  86. }
  87. }
  88. func TestGetRepositoryData(t *testing.T) {
  89. r := spawnTestRegistry(t)
  90. data, err := r.GetRepositoryData("foo42/bar")
  91. if err != nil {
  92. t.Fatal(err)
  93. }
  94. assertEqual(t, len(data.ImgList), 2, "Expected 2 images in ImgList")
  95. assertEqual(t, len(data.Endpoints), 1, "Expected one endpoint in Endpoints")
  96. }
  97. func TestPushImageJSONRegistry(t *testing.T) {
  98. r := spawnTestRegistry(t)
  99. imgData := &ImgData{
  100. ID: "77dbf71da1d00e3fbddc480176eac8994025630c6590d11cfc8fe1209c2a1d20",
  101. Checksum: "sha256:1ac330d56e05eef6d438586545ceff7550d3bdcb6b19961f12c5ba714ee1bb37",
  102. }
  103. err := r.PushImageJSONRegistry(imgData, []byte{0x42, 0xdf, 0x0}, makeURL("/v1/"), TOKEN)
  104. if err != nil {
  105. t.Fatal(err)
  106. }
  107. }
  108. func TestPushImageLayerRegistry(t *testing.T) {
  109. r := spawnTestRegistry(t)
  110. layer := strings.NewReader("")
  111. _, err := r.PushImageLayerRegistry(IMAGE_ID, layer, makeURL("/v1/"), TOKEN, []byte{})
  112. if err != nil {
  113. t.Fatal(err)
  114. }
  115. }
  116. func TestResolveRepositoryName(t *testing.T) {
  117. _, _, err := ResolveRepositoryName("https://github.com/dotcloud/docker")
  118. assertEqual(t, err, ErrInvalidRepositoryName, "Expected error invalid repo name")
  119. ep, repo, err := ResolveRepositoryName("fooo/bar")
  120. if err != nil {
  121. t.Fatal(err)
  122. }
  123. assertEqual(t, ep, auth.IndexServerAddress(), "Expected endpoint to be index server address")
  124. assertEqual(t, repo, "fooo/bar", "Expected resolved repo to be foo/bar")
  125. u := makeURL("")[7:]
  126. ep, repo, err = ResolveRepositoryName(u + "/private/moonbase")
  127. if err != nil {
  128. t.Fatal(err)
  129. }
  130. assertEqual(t, ep, "http://"+u+"/v1/", "Expected endpoint to be "+u)
  131. assertEqual(t, repo, "private/moonbase", "Expected endpoint to be private/moonbase")
  132. }
  133. func TestPushRegistryTag(t *testing.T) {
  134. r := spawnTestRegistry(t)
  135. err := r.PushRegistryTag("foo42/bar", IMAGE_ID, "stable", makeURL("/v1/"), TOKEN)
  136. if err != nil {
  137. t.Fatal(err)
  138. }
  139. }
  140. func TestPushImageJSONIndex(t *testing.T) {
  141. r := spawnTestRegistry(t)
  142. imgData := []*ImgData{
  143. {
  144. ID: "77dbf71da1d00e3fbddc480176eac8994025630c6590d11cfc8fe1209c2a1d20",
  145. Checksum: "sha256:1ac330d56e05eef6d438586545ceff7550d3bdcb6b19961f12c5ba714ee1bb37",
  146. },
  147. {
  148. ID: "42d718c941f5c532ac049bf0b0ab53f0062f09a03afd4aa4a02c098e46032b9d",
  149. Checksum: "sha256:bea7bf2e4bacd479344b737328db47b18880d09096e6674165533aa994f5e9f2",
  150. },
  151. }
  152. repoData, err := r.PushImageJSONIndex("foo42/bar", imgData, false, nil)
  153. if err != nil {
  154. t.Fatal(err)
  155. }
  156. if repoData == nil {
  157. t.Fatal("Expected RepositoryData object")
  158. }
  159. repoData, err = r.PushImageJSONIndex("foo42/bar", imgData, true, []string{r.indexEndpoint})
  160. if err != nil {
  161. t.Fatal(err)
  162. }
  163. if repoData == nil {
  164. t.Fatal("Expected RepositoryData object")
  165. }
  166. }
  167. func TestSearchRepositories(t *testing.T) {
  168. r := spawnTestRegistry(t)
  169. results, err := r.SearchRepositories("supercalifragilisticepsialidocious")
  170. if err != nil {
  171. t.Fatal(err)
  172. }
  173. if results == nil {
  174. t.Fatal("Expected non-nil SearchResults object")
  175. }
  176. assertEqual(t, results.NumResults, 0, "Expected 0 search results")
  177. }
  178. func TestValidRepositoryName(t *testing.T) {
  179. if err := validateRepositoryName("docker/docker"); err != nil {
  180. t.Fatal(err)
  181. }
  182. if err := validateRepositoryName("docker/Docker"); err == nil {
  183. t.Log("Repository name should be invalid")
  184. t.Fail()
  185. }
  186. }