...

Source file src/github.com/LINBIT/golinstor/client/client_test.go

Documentation: github.com/LINBIT/golinstor/client

     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