github.com/LINBIT/golinstor@v0.52.0/client/client_test.go (about) 1 package client 2 3 import ( 4 "context" 5 "encoding/json" 6 "net/http" 7 "net/http/httptest" 8 "net/url" 9 "os" 10 "testing" 11 12 "github.com/stretchr/testify/assert" 13 ) 14 15 const TestCaCert = `-----BEGIN CERTIFICATE----- 16 MIIB1DCCAXqgAwIBAgIUZJyvXb6pJ9tHxKOlVkjTaqjpAAIwCgYIKoZIzj0EAwIw 17 SDELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAkNBMRYwFAYDVQQHEw1TYW4gRnJhbmNp 18 c2NvMRQwEgYDVQQDEwtleGFtcGxlLm5ldDAeFw0yMDA1MDgxMjUyMDBaFw0yNTA1 19 MDcxMjUyMDBaMEgxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTEWMBQGA1UEBxMN 20 U2FuIEZyYW5jaXNjbzEUMBIGA1UEAxMLZXhhbXBsZS5uZXQwWTATBgcqhkjOPQIB 21 BggqhkjOPQMBBwNCAAT7uWd8BeFIcw64pRJheVh6tKrsqSLF4z9LAQKEaH5pg34+ 22 06T2Ed7hKUSca3R8zEuP9EZcHNpYXKoeuF1QjZt5o0IwQDAOBgNVHQ8BAf8EBAMC 23 AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUyK850E3ZE9Jb3JPDq3BtttXd 24 wE0wCgYIKoZIzj0EAwIDSAAwRQIge+3tsEmO/WbjxmQoA+kDoSpOQDnkDckqvEXD 25 1H939HUCIQDHp0oAvI1sMM0ksAl7D0Bpxjtha2kpzbqsAf4yDy9rWw== 26 -----END CERTIFICATE----- 27 ` 28 29 func TestNewClient_ViaEnv(t *testing.T) { 30 testcases := []struct { 31 name string 32 env map[string]string 33 expectedUrl string 34 hasError bool 35 }{ 36 { 37 name: "default", 38 expectedUrl: "http://localhost:3370", 39 }, 40 { 41 name: "just-domain-name", 42 env: map[string]string{"LS_CONTROLLERS": "just.domain"}, 43 expectedUrl: "http://just.domain:3370", 44 }, 45 { 46 name: "linstor-protocol", 47 env: map[string]string{"LS_CONTROLLERS": "linstor://just.domain"}, 48 expectedUrl: "http://just.domain:3370", 49 }, 50 { 51 name: "linstor-ssl-protocol", 52 env: map[string]string{"LS_CONTROLLERS": "linstor+ssl://just.domain"}, 53 expectedUrl: "https://just.domain:3371", 54 }, 55 { 56 name: "just-domain-with-port", 57 env: map[string]string{"LS_CONTROLLERS": "just.domain:4000"}, 58 expectedUrl: "http://just.domain:4000", 59 }, 60 { 61 name: "domain-with-protocol", 62 env: map[string]string{"LS_CONTROLLERS": "http://just.domain"}, 63 expectedUrl: "http://just.domain:3370", 64 }, 65 { 66 name: "just-domain-with-https-protocol", 67 env: map[string]string{"LS_CONTROLLERS": "https://just.domain"}, 68 expectedUrl: "https://just.domain:3371", 69 }, 70 { 71 name: "just-domain-with-client-secrets", 72 env: map[string]string{"LS_CONTROLLERS": "just.domain", "LS_ROOT_CA": TestCaCert}, 73 expectedUrl: "https://just.domain:3371", 74 }, 75 { 76 name: "just-domain-with-client-secrets-and-port", 77 env: map[string]string{"LS_CONTROLLERS": "just.domain:4000", "LS_ROOT_CA": TestCaCert}, 78 expectedUrl: "https://just.domain:4000", 79 }, 80 { 81 name: "parse-error-multi-scheme", 82 env: map[string]string{"LS_CONTROLLERS": "https://http://just.domain:4000"}, 83 hasError: true, 84 }, 85 { 86 name: "parse-error-multi-port", 87 env: map[string]string{"LS_CONTROLLERS": "https://just.domain:4000:5000"}, 88 hasError: true, 89 }, 90 { 91 name: "parse-error-inconsistent-env", 92 env: map[string]string{"LS_CONTROLLERS": "https://just.domain:4000", "LS_USER_CERTIFICATE": "stuff"}, 93 hasError: true, 94 }, 95 { 96 name: "parse-error-inconsistent-env-other", 97 env: map[string]string{"LS_CONTROLLERS": "https://just.domain:4000", "LS_USER_KEY": "stuff"}, 98 hasError: true, 99 }, 100 } 101 102 for _, item := range testcases { 103 test := item 104 t.Run(test.name, func(t *testing.T) { 105 os.Clearenv() 106 defer os.Clearenv() 107 for k, v := range test.env { 108 _ = os.Setenv(k, v) 109 } 110 111 actual, err := NewClient() 112 113 if actual == nil { 114 if !test.hasError { 115 t.Errorf("expected no error, got error: %v", err) 116 } 117 return 118 } 119 120 if test.expectedUrl != actual.baseURL.String() { 121 t.Errorf("expected url: %v, got url: %v", test.expectedUrl, actual.baseURL.String()) 122 } 123 }) 124 } 125 } 126 127 func TestBearerTokenOpt(t *testing.T) { 128 const Token = "AbCdEfg1234567890" 129 var FakeVersion = ControllerVersion{ 130 BuildTime: "#buildtime", 131 GitHash: "#git", 132 RestApiVersion: "#rest", 133 Version: "#v1", 134 } 135 136 fakeHttpServer := httptest.NewServer(http.HandlerFunc(func(writer http.ResponseWriter, request *http.Request) { 137 if request.Header.Get("Authorization") != "Bearer "+Token { 138 writer.WriteHeader(http.StatusUnauthorized) 139 } else { 140 writer.WriteHeader(http.StatusOK) 141 enc := json.NewEncoder(writer) 142 _ = enc.Encode(&FakeVersion) 143 } 144 })) 145 defer fakeHttpServer.Close() 146 147 u, err := url.Parse(fakeHttpServer.URL) 148 assert.NoError(t, err) 149 150 cl, err := NewClient(BearerToken(Token), HTTPClient(fakeHttpServer.Client()), BaseURL(u)) 151 assert.NoError(t, err) 152 153 actualVersion, err := cl.Controller.GetVersion(context.Background()) 154 assert.NoError(t, err) 155 assert.Equal(t, FakeVersion, actualVersion) 156 }