github.com/tompao/docker@v1.9.1/registry/endpoint_test.go (about)

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