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 }