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 }
157
View as plain text