|  | package openstack | 
|  |  | 
|  | import ( | 
|  | "fmt" | 
|  | "net/http" | 
|  | "strings" | 
|  | "testing" | 
|  |  | 
|  | "github.com/rackspace/gophercloud" | 
|  | tokens2 "github.com/rackspace/gophercloud/openstack/identity/v2/tokens" | 
|  | th "github.com/rackspace/gophercloud/testhelper" | 
|  | fake "github.com/rackspace/gophercloud/testhelper/client" | 
|  | ) | 
|  |  | 
|  | // Service catalog fixtures take too much vertical space! | 
|  | var catalog2 = tokens2.ServiceCatalog{ | 
|  | Entries: []tokens2.CatalogEntry{ | 
|  | tokens2.CatalogEntry{ | 
|  | Type: "same", | 
|  | Name: "same", | 
|  | Endpoints: []tokens2.Endpoint{ | 
|  | tokens2.Endpoint{ | 
|  | Region:      "same", | 
|  | PublicURL:   "https://public.correct.com/", | 
|  | InternalURL: "https://internal.correct.com/", | 
|  | AdminURL:    "https://admin.correct.com/", | 
|  | }, | 
|  | tokens2.Endpoint{ | 
|  | Region:    "different", | 
|  | PublicURL: "https://badregion.com/", | 
|  | }, | 
|  | }, | 
|  | }, | 
|  | tokens2.CatalogEntry{ | 
|  | Type: "same", | 
|  | Name: "different", | 
|  | Endpoints: []tokens2.Endpoint{ | 
|  | tokens2.Endpoint{ | 
|  | Region:    "same", | 
|  | PublicURL: "https://badname.com/", | 
|  | }, | 
|  | tokens2.Endpoint{ | 
|  | Region:    "different", | 
|  | PublicURL: "https://badname.com/+badregion", | 
|  | }, | 
|  | }, | 
|  | }, | 
|  | tokens2.CatalogEntry{ | 
|  | Type: "different", | 
|  | Name: "different", | 
|  | Endpoints: []tokens2.Endpoint{ | 
|  | tokens2.Endpoint{ | 
|  | Region:    "same", | 
|  | PublicURL: "https://badtype.com/+badname", | 
|  | }, | 
|  | tokens2.Endpoint{ | 
|  | Region:    "different", | 
|  | PublicURL: "https://badtype.com/+badregion+badname", | 
|  | }, | 
|  | }, | 
|  | }, | 
|  | }, | 
|  | } | 
|  |  | 
|  | func TestV2EndpointExact(t *testing.T) { | 
|  | expectedURLs := map[gophercloud.Availability]string{ | 
|  | gophercloud.AvailabilityPublic:   "https://public.correct.com/", | 
|  | gophercloud.AvailabilityAdmin:    "https://admin.correct.com/", | 
|  | gophercloud.AvailabilityInternal: "https://internal.correct.com/", | 
|  | } | 
|  |  | 
|  | for availability, expected := range expectedURLs { | 
|  | actual, err := V2EndpointURL(&catalog2, gophercloud.EndpointOpts{ | 
|  | Type:         "same", | 
|  | Name:         "same", | 
|  | Region:       "same", | 
|  | Availability: availability, | 
|  | }) | 
|  | th.AssertNoErr(t, err) | 
|  | th.CheckEquals(t, expected, actual) | 
|  | } | 
|  | } | 
|  |  | 
|  | func TestV2EndpointNone(t *testing.T) { | 
|  | _, err := V2EndpointURL(&catalog2, gophercloud.EndpointOpts{ | 
|  | Type:         "nope", | 
|  | Availability: gophercloud.AvailabilityPublic, | 
|  | }) | 
|  | th.CheckEquals(t, gophercloud.ErrEndpointNotFound, err) | 
|  | } | 
|  |  | 
|  | func TestV2EndpointMultiple(t *testing.T) { | 
|  | _, err := V2EndpointURL(&catalog2, gophercloud.EndpointOpts{ | 
|  | Type:         "same", | 
|  | Region:       "same", | 
|  | Availability: gophercloud.AvailabilityPublic, | 
|  | }) | 
|  | if !strings.HasPrefix(err.Error(), "Discovered 2 matching endpoints:") { | 
|  | t.Errorf("Received unexpected error: %v", err) | 
|  | } | 
|  | } | 
|  |  | 
|  | func TestV2EndpointBadAvailability(t *testing.T) { | 
|  | _, err := V2EndpointURL(&catalog2, gophercloud.EndpointOpts{ | 
|  | Type:         "same", | 
|  | Name:         "same", | 
|  | Region:       "same", | 
|  | Availability: "wat", | 
|  | }) | 
|  | th.CheckEquals(t, err.Error(), "Unexpected availability in endpoint query: wat") | 
|  | } | 
|  |  | 
|  | func setupV3Responses(t *testing.T) { | 
|  | // Mock the service query. | 
|  | th.Mux.HandleFunc("/services", func(w http.ResponseWriter, r *http.Request) { | 
|  | th.TestMethod(t, r, "GET") | 
|  | th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) | 
|  |  | 
|  | w.Header().Add("Content-Type", "application/json") | 
|  | fmt.Fprintf(w, ` | 
|  | { | 
|  | "links": { | 
|  | "next": null, | 
|  | "previous": null | 
|  | }, | 
|  | "services": [ | 
|  | { | 
|  | "description": "Correct", | 
|  | "id": "1234", | 
|  | "name": "same", | 
|  | "type": "same" | 
|  | }, | 
|  | { | 
|  | "description": "Bad Name", | 
|  | "id": "9876", | 
|  | "name": "different", | 
|  | "type": "same" | 
|  | } | 
|  | ] | 
|  | } | 
|  | `) | 
|  | }) | 
|  |  | 
|  | // Mock the endpoint query. | 
|  | th.Mux.HandleFunc("/endpoints", func(w http.ResponseWriter, r *http.Request) { | 
|  | th.TestMethod(t, r, "GET") | 
|  | th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) | 
|  | th.TestFormValues(t, r, map[string]string{ | 
|  | "service_id": "1234", | 
|  | "interface":  "public", | 
|  | }) | 
|  |  | 
|  | w.Header().Add("Content-Type", "application/json") | 
|  | fmt.Fprintf(w, ` | 
|  | { | 
|  | "endpoints": [ | 
|  | { | 
|  | "id": "12", | 
|  | "interface": "public", | 
|  | "name": "the-right-one", | 
|  | "region": "same", | 
|  | "service_id": "1234", | 
|  | "url": "https://correct:9000/" | 
|  | }, | 
|  | { | 
|  | "id": "14", | 
|  | "interface": "public", | 
|  | "name": "bad-region", | 
|  | "region": "different", | 
|  | "service_id": "1234", | 
|  | "url": "https://bad-region:9001/" | 
|  | } | 
|  | ], | 
|  | "links": { | 
|  | "next": null, | 
|  | "previous": null | 
|  | } | 
|  | } | 
|  | `) | 
|  | }) | 
|  | } | 
|  |  | 
|  | func TestV3EndpointExact(t *testing.T) { | 
|  | th.SetupHTTP() | 
|  | defer th.TeardownHTTP() | 
|  | setupV3Responses(t) | 
|  |  | 
|  | actual, err := V3EndpointURL(fake.ServiceClient(), gophercloud.EndpointOpts{ | 
|  | Type:         "same", | 
|  | Name:         "same", | 
|  | Region:       "same", | 
|  | Availability: gophercloud.AvailabilityPublic, | 
|  | }) | 
|  | th.AssertNoErr(t, err) | 
|  | th.CheckEquals(t, actual, "https://correct:9000/") | 
|  | } | 
|  |  | 
|  | func TestV3EndpointNoService(t *testing.T) { | 
|  | th.SetupHTTP() | 
|  | defer th.TeardownHTTP() | 
|  |  | 
|  | th.Mux.HandleFunc("/services", func(w http.ResponseWriter, r *http.Request) { | 
|  | th.TestMethod(t, r, "GET") | 
|  | th.TestHeader(t, r, "X-Auth-Token", fake.TokenID) | 
|  |  | 
|  | w.Header().Add("Content-Type", "application/json") | 
|  | fmt.Fprintf(w, ` | 
|  | { | 
|  | "links": { | 
|  | "next": null, | 
|  | "previous": null | 
|  | }, | 
|  | "services": [] | 
|  | } | 
|  | `) | 
|  | }) | 
|  |  | 
|  | _, err := V3EndpointURL(fake.ServiceClient(), gophercloud.EndpointOpts{ | 
|  | Type:         "nope", | 
|  | Name:         "same", | 
|  | Region:       "same", | 
|  | Availability: gophercloud.AvailabilityPublic, | 
|  | }) | 
|  | th.CheckEquals(t, gophercloud.ErrServiceNotFound, err) | 
|  | } |