github.com/Axway/agent-sdk@v1.1.101/pkg/util/util_test.go (about)

     1  package util
     2  
     3  import (
     4  	"net/url"
     5  	"os"
     6  	"reflect"
     7  	"strconv"
     8  	"testing"
     9  
    10  	"github.com/stretchr/testify/assert"
    11  )
    12  
    13  func TestComputeHash(t *testing.T) {
    14  	val, err := ComputeHash("this is a test")
    15  	assert.Nil(t, err)
    16  	val1, err := ComputeHash("this is a test1")
    17  	assert.Nil(t, err)
    18  	assert.NotEqual(t, val, val1)
    19  	val, err = ComputeHash("this is a test1")
    20  	assert.Nil(t, err)
    21  	assert.Equal(t, val, val1)
    22  }
    23  
    24  func TestStringSliceContains(t *testing.T) {
    25  	strSlice := []string{"foo", "bar"}
    26  	assert.True(t, StringSliceContains(strSlice, "foo"))
    27  	assert.False(t, StringSliceContains(strSlice, "foobar"))
    28  }
    29  
    30  func TestRemoveDuplicateValuesFromStringSlice(t *testing.T) {
    31  	strSlice := []string{"foo", "bar", "foo", "bar", "foobar"}
    32  	newSlice := RemoveDuplicateValuesFromStringSlice(strSlice)
    33  	assert.Equal(t, 3, len(newSlice))
    34  	assert.True(t, reflect.DeepEqual(newSlice, []string{"foo", "bar", "foobar"}))
    35  }
    36  
    37  func TestMaskValue(t *testing.T) {
    38  	value := MaskValue("12345")
    39  	assert.Equal(t, "*****", value)
    40  }
    41  
    42  func TestGetURLHostName(t *testing.T) {
    43  	host := GetURLHostName("http://axway.com/abcd")
    44  	assert.Equal(t, host, "axway.com")
    45  
    46  	host = GetURLHostName("axway")
    47  	assert.Equal(t, "", host)
    48  }
    49  
    50  func TestGetProxyURL(t *testing.T) {
    51  	url := &url.URL{
    52  		Scheme: "http",
    53  		Host:   "axway.com",
    54  		Path:   "abcd",
    55  	}
    56  
    57  	proxyurl := GetProxyURL(url)
    58  	// assert.Nil(t, err)
    59  	assert.NotNil(t, proxyurl)
    60  
    61  	u, err := proxyurl(nil)
    62  	assert.Nil(t, err)
    63  	assert.NotNil(t, u)
    64  	assert.Equal(t, url, u)
    65  
    66  	url.Host = ""
    67  	proxyurl = GetProxyURL(url)
    68  	u, err = proxyurl(nil)
    69  	assert.Nil(t, err)
    70  	assert.Nil(t, u)
    71  
    72  	proxyurl = GetProxyURL(nil)
    73  	u, err = proxyurl(nil)
    74  	assert.Nil(t, err)
    75  	assert.Nil(t, u)
    76  }
    77  
    78  func TestLoadEnvFromFile(t *testing.T) {
    79  	err := LoadEnvFromFile("foobar")
    80  	assert.NotNil(t, err)
    81  
    82  	err = LoadEnvFromFile("./testdata/env_vars.txt")
    83  	assert.Nil(t, err)
    84  
    85  	assert.Equal(t, "https://bbunny.dev.test.net", os.Getenv("CENTRAL_URL"))
    86  	i, _ := strconv.ParseInt(os.Getenv("CENTRAL_INTVAL1"), 10, 0)
    87  	assert.Equal(t, int64(15), i)
    88  	b, _ := strconv.ParseBool(os.Getenv("CENTRAL_SSL_INSECURESKIPVERIFY"))
    89  	assert.True(t, b)
    90  
    91  	// These keys in the env_vars.txt all have values followed by a TAB char
    92  	// this test is to verify that they get parsed correctly
    93  	b, _ = strconv.ParseBool(os.Getenv("CENTRAL_USAGEREPORTING_OFFLINE"))
    94  	assert.True(t, b)
    95  	i, _ = strconv.ParseInt(os.Getenv("CENTRAL_INTVAL2"), 10, 0)
    96  	assert.Equal(t, int64(20), i)
    97  	assert.Equal(t, "https://test.net", os.Getenv("CENTRAL_AUTH_URL"))
    98  }
    99  
   100  func TestMergeMapStringInterface(t *testing.T) {
   101  	m1 := map[string]interface{}{
   102  		"foo": "foo1",
   103  		"baz": "baz1",
   104  		"aaa": "aaa1",
   105  	}
   106  	m2 := map[string]interface{}{
   107  		"foo":  "foo2",
   108  		"baz":  "baz2",
   109  		"quux": "quux2",
   110  		"asdf": "asdf2",
   111  	}
   112  
   113  	result := MergeMapStringInterface(m1, m2)
   114  	assert.Equal(t, m1["aaa"], result["aaa"])
   115  	assert.Equal(t, m2["foo"], result["foo"])
   116  	assert.Equal(t, m2["baz"], result["baz"])
   117  	assert.Equal(t, m2["quux"], result["quux"])
   118  	assert.Equal(t, m2["asdf"], result["asdf"])
   119  
   120  	m3 := map[string]interface{}{
   121  		"foo":  "foo3",
   122  		"zxcv": "zxcv3",
   123  	}
   124  
   125  	resul2t := MergeMapStringInterface(m1, m2, m3)
   126  	assert.Equal(t, m1["aaa"], resul2t["aaa"])
   127  	assert.Equal(t, m2["baz"], resul2t["baz"])
   128  	assert.Equal(t, m2["quux"], resul2t["quux"])
   129  	assert.Equal(t, m2["asdf"], resul2t["asdf"])
   130  	assert.Equal(t, m3["foo"], resul2t["foo"])
   131  	assert.Equal(t, m3["zxcv"], resul2t["zxcv"])
   132  
   133  	result3 := MergeMapStringInterface(nil)
   134  	assert.NotNil(t, result3)
   135  
   136  	result4 := MergeMapStringInterface(m1, nil)
   137  	assert.NotNil(t, result4)
   138  }
   139  
   140  func TestMergeMapStringString(t *testing.T) {
   141  	m1 := map[string]string{
   142  		"foo": "foo1",
   143  		"baz": "baz1",
   144  		"aaa": "aaa1",
   145  	}
   146  	m2 := map[string]string{
   147  		"foo":  "foo2",
   148  		"baz":  "baz2",
   149  		"quux": "quux2",
   150  		"asdf": "asdf2",
   151  	}
   152  
   153  	result := MergeMapStringString(m1, m2)
   154  	assert.Equal(t, m1["aaa"], result["aaa"])
   155  	assert.Equal(t, m2["foo"], result["foo"])
   156  	assert.Equal(t, m2["baz"], result["baz"])
   157  	assert.Equal(t, m2["quux"], result["quux"])
   158  	assert.Equal(t, m2["asdf"], result["asdf"])
   159  
   160  	m3 := map[string]string{
   161  		"foo":  "foo3",
   162  		"zxcv": "zxcv3",
   163  	}
   164  
   165  	result2 := MergeMapStringString(m1, m2, m3)
   166  	assert.Equal(t, m1["aaa"], result2["aaa"])
   167  	assert.Equal(t, m2["baz"], result2["baz"])
   168  	assert.Equal(t, m2["quux"], result2["quux"])
   169  	assert.Equal(t, m2["asdf"], result2["asdf"])
   170  	assert.Equal(t, m3["foo"], result2["foo"])
   171  	assert.Equal(t, m3["zxcv"], result2["zxcv"])
   172  
   173  	result3 := MergeMapStringString(nil)
   174  	assert.NotNil(t, result3)
   175  
   176  	result4 := MergeMapStringString(m1, nil)
   177  	assert.NotNil(t, result4)
   178  }
   179  
   180  func TestMapStringInterfaceToStringString(t *testing.T) {
   181  	m1 := map[string]interface{}{
   182  		"foo":  "foo1",
   183  		"baz":  false,
   184  		"aaa":  1,
   185  		"test": `{"a":"a","b":["1","2","3"]}`,
   186  		"nil":  nil,
   187  	}
   188  	result := MapStringInterfaceToStringString(m1)
   189  
   190  	assert.Equal(t, "foo1", result["foo"])
   191  	assert.Equal(t, "false", result["baz"])
   192  	assert.Equal(t, "1", result["aaa"])
   193  	assert.Equal(t, `{"a":"a","b":["1","2","3"]}`, result["test"])
   194  	assert.Equal(t, "", result["nil"])
   195  }
   196  
   197  func TestParsePort(t *testing.T) {
   198  	p := ParsePort(nil)
   199  	assert.Equal(t, 0, p)
   200  
   201  	u, _ := url.Parse("http://test:222")
   202  	p = ParsePort(u)
   203  	assert.Equal(t, 222, p)
   204  
   205  	u, _ = url.Parse("http://test")
   206  	p = ParsePort(u)
   207  	assert.Equal(t, 80, p)
   208  
   209  	u, _ = url.Parse("noscheme://test")
   210  	p = ParsePort(u)
   211  	assert.Equal(t, 0, p)
   212  }
   213  
   214  func TestParseAddr(t *testing.T) {
   215  	addr := ParseAddr(nil)
   216  	assert.Equal(t, "", addr)
   217  
   218  	u, _ := url.Parse("http://test:222")
   219  	addr = ParseAddr(u)
   220  	assert.Equal(t, "test:222", addr)
   221  
   222  	u, _ = url.Parse("http://test")
   223  	addr = ParseAddr(u)
   224  	assert.Equal(t, "test:80", addr)
   225  }
   226  
   227  func TestComputeKIDFromDER(t *testing.T) {
   228  	key, err := os.ReadFile("testdata/public_key")
   229  	if err != nil {
   230  		t.Errorf("unable to read public_key")
   231  	}
   232  	res, err := ComputeKIDFromDER(key)
   233  	if err != nil {
   234  		t.Errorf("unable to compute kid")
   235  	}
   236  	expected := "1wzYoslzjo-ROTN1CUWPQYtTUqrqiaDO96fAAmb7JvA"
   237  	if res != expected {
   238  		t.Fail()
   239  	}
   240  
   241  	// der file format
   242  	key, err = os.ReadFile("testdata/public_key.der")
   243  	if err != nil {
   244  		t.Errorf("unable to read public_key.der")
   245  	}
   246  	res, err = ComputeKIDFromDER(key)
   247  	if err != nil {
   248  		t.Errorf("unable to compute kid")
   249  	}
   250  	expected = "iXcfstYFMANhYzgPwMWJxIQdfLQBqWjdiwyl7e4xv6Q"
   251  	if res != expected {
   252  		t.Fail()
   253  	}
   254  }
   255  
   256  func TestReadPrivateKey(t *testing.T) {
   257  	cases := []struct {
   258  		description  string
   259  		privKeyFile  string
   260  		passwordFile string
   261  	}{
   262  		{
   263  			description: "no password",
   264  			privKeyFile: "testdata/private_key.pem",
   265  		},
   266  		{
   267  			description:  "with empty password file",
   268  			privKeyFile:  "testdata/private_key.pem",
   269  			passwordFile: "testdata/password_empty",
   270  		},
   271  		{
   272  			description:  "with password",
   273  			privKeyFile:  "testdata/private_key_with_pwd.pem",
   274  			passwordFile: "testdata/password",
   275  		},
   276  	}
   277  
   278  	for _, testCase := range cases {
   279  		if _, err := ReadPrivateKeyFile(testCase.privKeyFile, testCase.passwordFile); err != nil {
   280  			t.Errorf("testcase: %s: failed to read rsa key %s", testCase.description, err)
   281  		}
   282  	}
   283  }
   284  
   285  func TestReadPublicKeyFile(t *testing.T) {
   286  	cases := []struct {
   287  		description   string
   288  		publicKeyFile string
   289  	}{
   290  		{
   291  			description:   "with public key",
   292  			publicKeyFile: "testdata/public_key",
   293  		},
   294  	}
   295  	for _, testCase := range cases {
   296  		if _, err := ReadPublicKeyBytes(testCase.publicKeyFile); err != nil {
   297  			t.Errorf("testcase: %s: failed to read public key %s", testCase.description, err)
   298  		}
   299  	}
   300  }
   301  
   302  func TestGetStringFromMapInterface(t *testing.T) {
   303  	cases := []struct {
   304  		data        map[string]interface{}
   305  		key         string
   306  		expectedVal string
   307  	}{
   308  		{
   309  			data:        map[string]interface{}{"key": "valid"},
   310  			key:         "key",
   311  			expectedVal: "valid",
   312  		},
   313  		{
   314  			data:        map[string]interface{}{"key": 10},
   315  			key:         "invalidKey",
   316  			expectedVal: "",
   317  		},
   318  		{
   319  			data:        map[string]interface{}{"key": 10},
   320  			expectedVal: "",
   321  		},
   322  	}
   323  	for _, testCase := range cases {
   324  		ret := GetStringFromMapInterface(testCase.key, testCase.data)
   325  		assert.Equal(t, testCase.expectedVal, ret)
   326  	}
   327  }
   328  
   329  func TestGetStringArrayFromMapInterface(t *testing.T) {
   330  	cases := []struct {
   331  		data        map[string]interface{}
   332  		key         string
   333  		expectedVal []string
   334  	}{
   335  		{
   336  			data:        map[string]interface{}{"key": []string{"val1", "val2"}},
   337  			key:         "key",
   338  			expectedVal: []string{"val1", "val2"},
   339  		},
   340  		{
   341  			data:        map[string]interface{}{"key": []interface{}{"val1", "val2"}},
   342  			key:         "key",
   343  			expectedVal: []string{"val1", "val2"},
   344  		},
   345  		{
   346  			data:        map[string]interface{}{"key": []string{"val1", "val2"}},
   347  			key:         "invalidKey",
   348  			expectedVal: []string{},
   349  		},
   350  		{
   351  			data:        map[string]interface{}{"key": []interface{}{10, "val1"}},
   352  			key:         "key",
   353  			expectedVal: []string{"val1"},
   354  		},
   355  		{
   356  			data:        map[string]interface{}{"key": []interface{}{10, 10}},
   357  			key:         "key",
   358  			expectedVal: []string{},
   359  		},
   360  		{
   361  			data:        map[string]interface{}{"key": []int{10}},
   362  			expectedVal: []string{},
   363  		},
   364  	}
   365  	for _, testCase := range cases {
   366  		ret := GetStringArrayFromMapInterface(testCase.key, testCase.data)
   367  		assert.Equal(t, testCase.expectedVal, ret)
   368  	}
   369  }
   370  
   371  func TestConvertToDomainNameCompliant(t *testing.T) {
   372  	name := ConvertToDomainNameCompliant("Abc.Def")
   373  	assert.Equal(t, "abc.def", name)
   374  	name = ConvertToDomainNameCompliant(".Abc.Def")
   375  	assert.Equal(t, "abc.def", name)
   376  	name = ConvertToDomainNameCompliant(".Abc...De/f")
   377  	assert.Equal(t, "abc--.de-f", name)
   378  	name = ConvertToDomainNameCompliant("Abc.D-ef")
   379  	assert.Equal(t, "abc.d-ef", name)
   380  	name = ConvertToDomainNameCompliant("Abc.Def=")
   381  	assert.Equal(t, "abc.def", name)
   382  	name = ConvertToDomainNameCompliant("A..bc.Def")
   383  	assert.Equal(t, "a--bc.def", name)
   384  }
   385  
   386  func TestGCMEcryptor(t *testing.T) {
   387  	cases := []struct {
   388  		name             string
   389  		data             string
   390  		encKey           []byte
   391  		decryptKey       []byte
   392  		expectDecryptErr bool
   393  	}{
   394  		{
   395  			name:             "decrypt with different key",
   396  			data:             "test-data",
   397  			encKey:           []byte("enc-key"),
   398  			decryptKey:       []byte("decrypt-key"),
   399  			expectDecryptErr: true,
   400  		},
   401  		{
   402  			name:       "decrypt with same key",
   403  			data:       "test-data",
   404  			encKey:     []byte("key"),
   405  			decryptKey: []byte("key"),
   406  		},
   407  	}
   408  	for _, tc := range cases {
   409  		t.Run(tc.name, func(t *testing.T) {
   410  			enc, err := NewGCMEncryptor(tc.encKey)
   411  			assert.Nil(t, err)
   412  			assert.NotNil(t, enc)
   413  			encStr, err := enc.Encrypt(tc.data)
   414  			assert.Nil(t, err)
   415  			assert.NotNil(t, encStr)
   416  
   417  			dc, err := NewGCMDecryptor(tc.decryptKey)
   418  			assert.Nil(t, err)
   419  			assert.NotNil(t, dc)
   420  			str, err := dc.Decrypt(encStr)
   421  			if tc.expectDecryptErr {
   422  				assert.NotNil(t, err)
   423  				return
   424  			}
   425  			assert.Nil(t, err)
   426  			assert.Equal(t, tc.data, str)
   427  		})
   428  	}
   429  }