endpoint_test.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package registry
  2. import (
  3. "net/http"
  4. "net/http/httptest"
  5. "net/url"
  6. "testing"
  7. )
  8. func TestEndpointParse(t *testing.T) {
  9. testData := []struct {
  10. str string
  11. expected string
  12. }{
  13. {IndexServer, IndexServer},
  14. {"http://0.0.0.0:5000/v1/", "http://0.0.0.0:5000/v1/"},
  15. {"http://0.0.0.0:5000/v2/", "http://0.0.0.0:5000/v2/"},
  16. {"http://0.0.0.0:5000", "http://0.0.0.0:5000/v0/"},
  17. {"0.0.0.0:5000", "https://0.0.0.0:5000/v0/"},
  18. }
  19. for _, td := range testData {
  20. e, err := newEndpoint(td.str, nil, nil)
  21. if err != nil {
  22. t.Errorf("%q: %s", td.str, err)
  23. }
  24. if e == nil {
  25. t.Logf("something's fishy, endpoint for %q is nil", td.str)
  26. continue
  27. }
  28. if e.String() != td.expected {
  29. t.Errorf("expected %q, got %q", td.expected, e.String())
  30. }
  31. }
  32. }
  33. // Ensure that a registry endpoint that responds with a 401 only is determined
  34. // to be a v1 registry unless it includes a valid v2 API header.
  35. func TestValidateEndpointAmbiguousAPIVersion(t *testing.T) {
  36. requireBasicAuthHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  37. w.Header().Add("WWW-Authenticate", `Basic realm="localhost"`)
  38. w.WriteHeader(http.StatusUnauthorized)
  39. })
  40. requireBasicAuthHandlerV2 := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  41. // This mock server supports v2.0, v2.1, v42.0, and v100.0
  42. w.Header().Add("Docker-Distribution-API-Version", "registry/100.0 registry/42.0")
  43. w.Header().Add("Docker-Distribution-API-Version", "registry/2.0 registry/2.1")
  44. requireBasicAuthHandler.ServeHTTP(w, r)
  45. })
  46. // Make a test server which should validate as a v1 server.
  47. testServer := httptest.NewServer(requireBasicAuthHandler)
  48. defer testServer.Close()
  49. testServerURL, err := url.Parse(testServer.URL)
  50. if err != nil {
  51. t.Fatal(err)
  52. }
  53. testEndpoint := Endpoint{
  54. URL: testServerURL,
  55. Version: APIVersionUnknown,
  56. client: HTTPClient(NewTransport(nil)),
  57. }
  58. if err = validateEndpoint(&testEndpoint); err != nil {
  59. t.Fatal(err)
  60. }
  61. if testEndpoint.Version != APIVersion1 {
  62. t.Fatalf("expected endpoint to validate to %d, got %d", APIVersion1, testEndpoint.Version)
  63. }
  64. // Make a test server which should validate as a v2 server.
  65. testServer = httptest.NewServer(requireBasicAuthHandlerV2)
  66. defer testServer.Close()
  67. testServerURL, err = url.Parse(testServer.URL)
  68. if err != nil {
  69. t.Fatal(err)
  70. }
  71. testEndpoint.URL = testServerURL
  72. testEndpoint.Version = APIVersionUnknown
  73. if err = validateEndpoint(&testEndpoint); err != nil {
  74. t.Fatal(err)
  75. }
  76. if testEndpoint.Version != APIVersion2 {
  77. t.Fatalf("expected endpoint to validate to %d, got %d", APIVersion2, testEndpoint.Version)
  78. }
  79. }