Recognize OS_REGION_NAME if env var is set.

Also, provide an out in case you really, really want to ignore this
environment variable.
diff --git a/service_catalog_test.go b/service_catalog_test.go
index 52e2388..b78f01f 100644
--- a/service_catalog_test.go
+++ b/service_catalog_test.go
@@ -1,55 +1,68 @@
 package gophercloud
 
 import (
+	"os"
 	"testing"
 )
 
-func TestFindFirstEndpointByCriteria(t *testing.T) {
-	endpoint := FindFirstEndpointByCriteria([]CatalogEntry{}, ApiCriteria{Name: "test"})
-	if endpoint.PublicURL != "" {
-		t.Error("Not expecting to find anything in an empty service catalog.")
-		return
-	}
+// TestFFEBCViaEnvVariable exercises only those calls where a region
+// parameter is required, but is provided by an environment variable.
+func TestFFEBCViaEnvVariable(t *testing.T) {
+	changeRegion("RGN")
 
-	endpoint = FindFirstEndpointByCriteria(
-		[]CatalogEntry{
-			{Name: "test"},
-		},
-		ApiCriteria{Name: "test"},
-	)
-	if endpoint.PublicURL != "" {
-		t.Error("Even though we have a matching entry, no endpoints exist")
-		return
-	}
-
-	endpoint = FindFirstEndpointByCriteria(
+	endpoint := FindFirstEndpointByCriteria(
 		catalog("test", "compute", "http://localhost", "", ""),
 		ApiCriteria{Name: "test"},
 	)
-	if endpoint.PublicURL != "http://localhost" {
-		t.Error("Looking for an endpoint by name but without region or version ID should match first entry endpoint.")
+	if endpoint.PublicURL != "" {
+		t.Error("If provided, the Region qualifier must exclude endpoints with missing or mismatching regions.")
 		return
 	}
 
 	endpoint = FindFirstEndpointByCriteria(
-		catalog("test", "compute", "http://localhost", "", ""),
-		ApiCriteria{Type: "compute"},
+		catalog("test", "compute", "http://localhost", "rgn", ""),
+		ApiCriteria{Name: "test"},
 	)
 	if endpoint.PublicURL != "http://localhost" {
-		t.Error("Looking for an endpoint by type but without region or version ID should match first entry endpoint.")
+		t.Error("Regions are case insensitive.")
 		return
 	}
 
 	endpoint = FindFirstEndpointByCriteria(
-		catalog("test", "compute", "http://localhost", "", ""),
-		ApiCriteria{Type: "identity"},
+		catalog("test", "compute", "http://localhost", "rgn", ""),
+		ApiCriteria{Name: "test", VersionId: "2"},
 	)
 	if endpoint.PublicURL != "" {
-		t.Error("Returned mismatched type.")
+		t.Error("Missing version ID means no match.")
 		return
 	}
 
 	endpoint = FindFirstEndpointByCriteria(
+		catalog("test", "compute", "http://localhost", "rgn", "3"),
+		ApiCriteria{Name: "test", VersionId: "2"},
+	)
+	if endpoint.PublicURL != "" {
+		t.Error("Mismatched version ID means no match.")
+		return
+	}
+
+	endpoint = FindFirstEndpointByCriteria(
+		catalog("test", "compute", "http://localhost", "rgn", "2"),
+		ApiCriteria{Name: "test", VersionId: "2"},
+	)
+	if endpoint.PublicURL != "http://localhost" {
+		t.Error("All search criteria met; endpoint expected.")
+		return
+	}
+}
+
+// TestFFEBCViaRegionOption exercises only those calls where a region
+// parameter is specified explicitly.  The region option overrides
+// any defined OS_REGION_NAME environment setting.
+func TestFFEBCViaRegionOption(t *testing.T) {
+	changeRegion("Starfleet Command")
+
+	endpoint := FindFirstEndpointByCriteria(
 		catalog("test", "compute", "http://localhost", "", ""),
 		ApiCriteria{Name: "test", Region: "RGN"},
 	)
@@ -93,10 +106,59 @@
 		t.Error("All search criteria met; endpoint expected.")
 		return
 	}
+}
+
+// TestFFEBCWithoutRegion exercises only those calls where a region
+// is irrelevant.  Just to make sure, though, we enforce Gophercloud
+// from paying any attention to OS_REGION_NAME if it happens to be set.
+func TestFindFirstEndpointByCriteria(t *testing.T) {
+	endpoint := FindFirstEndpointByCriteria([]CatalogEntry{}, ApiCriteria{Name: "test", IgnoreEnvVars: true})
+	if endpoint.PublicURL != "" {
+		t.Error("Not expecting to find anything in an empty service catalog.")
+		return
+	}
+
+	endpoint = FindFirstEndpointByCriteria(
+		[]CatalogEntry{
+			{Name: "test"},
+		},
+		ApiCriteria{Name: "test", IgnoreEnvVars: true},
+	)
+	if endpoint.PublicURL != "" {
+		t.Error("Even though we have a matching entry, no endpoints exist")
+		return
+	}
+
+	endpoint = FindFirstEndpointByCriteria(
+		catalog("test", "compute", "http://localhost", "", ""),
+		ApiCriteria{Name: "test", IgnoreEnvVars: true},
+	)
+	if endpoint.PublicURL != "http://localhost" {
+		t.Error("Looking for an endpoint by name but without region or version ID should match first entry endpoint.")
+		return
+	}
+
+	endpoint = FindFirstEndpointByCriteria(
+		catalog("test", "compute", "http://localhost", "", ""),
+		ApiCriteria{Type: "compute", IgnoreEnvVars: true},
+	)
+	if endpoint.PublicURL != "http://localhost" {
+		t.Error("Looking for an endpoint by type but without region or version ID should match first entry endpoint.")
+		return
+	}
+
+	endpoint = FindFirstEndpointByCriteria(
+		catalog("test", "compute", "http://localhost", "", ""),
+		ApiCriteria{Type: "identity", IgnoreEnvVars: true},
+	)
+	if endpoint.PublicURL != "" {
+		t.Error("Returned mismatched type.")
+		return
+	}
 
 	endpoint = FindFirstEndpointByCriteria(
 		catalog("test", "compute", "http://localhost", "ord", "2"),
-		ApiCriteria{Name: "test", VersionId: "2"},
+		ApiCriteria{Name: "test", VersionId: "2", IgnoreEnvVars: true},
 	)
 	if endpoint.PublicURL != "http://localhost" {
 		t.Error("Sometimes, you might not care what region your stuff is in.")
@@ -119,3 +181,10 @@
 		},
 	}
 }
+
+func changeRegion(r string) {
+	err := os.Setenv("OS_REGION_NAME", r)
+	if err != nil {
+		panic(err)
+	}
+}