package clientcmd
import (
"net/http"
"net/http/httptest"
"testing"
"k8s.io/kubernetes/pkg/client/restclient"
"github.com/openshift/origin/pkg/api/v1"
"github.com/openshift/origin/pkg/api/v1beta3"
"github.com/openshift/origin/pkg/client"
)
func TestClientConfigForVersion(t *testing.T) {
called := 0
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
if req.URL.Path != "/oapi" {
t.Errorf("Unexpected path called during negotiation: %s", req.URL.Path)
return
}
called++
w.Write([]byte(`{"versions":["v1"]}`))
}))
defer server.Close()
defaultConfig := &restclient.Config{Host: server.URL}
client.SetOpenShiftDefaults(defaultConfig)
clients := &clientCache{
clients: make(map[string]*client.Client),
configs: make(map[string]*restclient.Config),
defaultConfig: defaultConfig,
}
// First call, negotiate
called = 0
v1Config, err := clients.ClientConfigForVersion(nil)
if err != nil {
t.Fatalf("Unexpected error: %v", err)
}
if v1Config.GroupVersion.String() != "v1" {
t.Fatalf("Expected v1, got %v", v1Config.GroupVersion.String())
}
if called != 1 {
t.Fatalf("Expected to be called 1 time during negotiation, was called %d times", called)
}
// Second call, cache
called = 0
v1Config, err = clients.ClientConfigForVersion(nil)
if err != nil {
t.Fatalf("Unexpected error: %v", err)
}
if v1Config.GroupVersion.String() != "v1" {
t.Fatalf("Expected v1, got %v", v1Config.GroupVersion.String())
}
if called != 0 {
t.Fatalf("Expected not be called again getting a config from cache, was called %d additional times", called)
}
// Third call, cached under exactly matching version
called = 0
v1Config, err = clients.ClientConfigForVersion(&v1.SchemeGroupVersion)
if err != nil {
t.Fatalf("Unexpected error: %v", err)
}
if v1Config.GroupVersion.String() != "v1" {
t.Fatalf("Expected v1, got %v", v1Config.GroupVersion.String())
}
if called != 0 {
t.Fatalf("Expected not be called again getting a config from cache, was called %d additional times", called)
}
// Call for unsupported version, negotiate to supported version
called = 0
v1beta3Config, err := clients.ClientConfigForVersion(&v1beta3.SchemeGroupVersion)
if err != nil {
t.Fatalf("Unexpected error: %v", err)
}
if v1beta3Config.GroupVersion.String() != "v1" {
t.Fatalf("Expected to negotiate v1 for v1beta3 config, got %v", v1beta3Config.GroupVersion.String())
}
if called != 1 {
t.Fatalf("Expected to be called once getting a config for a new version, was called %d times", called)
}
}
func TestComputeDiscoverCacheDir(t *testing.T) {
testCases := []struct {
name string
parentDir string
host string
expected string
}{
{
name: "simple append",
parentDir: "~/",
host: "localhost:8443",
expected: "~/localhost_8443",
},
{
name: "with path",
parentDir: "~/",
host: "localhost:8443/prefix",
expected: "~/localhost_8443/prefix",
},
{
name: "dotted name",
parentDir: "~/",
host: "mine.example.org:8443",
expected: "~/mine.example.org_8443",
},
{
name: "IP",
parentDir: "~/",
host: "127.0.0.1:8443",
expected: "~/127.0.0.1_8443",
},
{
// restricted characters from: https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx#naming_conventions
// it's not a complete list because they have a very helpful: "Any other character that the target file system does not allow."
name: "windows safe",
parentDir: "~/",
host: `<>:"\|?*`,
expected: "~/________",
},
}
for _, tc := range testCases {
actual := computeDiscoverCacheDir(tc.parentDir, tc.host)
if actual != tc.expected {
t.Errorf("%s: expected %v, got %v", tc.name, tc.expected, actual)
}
}
}