Skip to content

Commit 6e99a9a

Browse files
authored
fix(test/snowflake): Snowflake flaky pattern test (#4083)
* replace gofakeit by default patterns in snowflake test. * use a random password generator for snowflake test which guaranteed inclusion of allowed characters.
1 parent d20b3a4 commit 6e99a9a

File tree

1 file changed

+72
-9
lines changed

1 file changed

+72
-9
lines changed

pkg/detectors/snowflake/snowflake_test.go

Lines changed: 72 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package snowflake
33
import (
44
"context"
55
"fmt"
6+
"math/rand"
67
"testing"
78

89
"github.com/brianvoe/gofakeit/v7"
@@ -11,9 +12,67 @@ import (
1112
"github.com/trufflesecurity/trufflehog/v3/pkg/engine/ahocorasick"
1213
)
1314

15+
// GoFakeIt Password generator does not guarantee inclusion of characters.
16+
// Using a custom Password gennerator with guaranteed inclusions (atleast) of lower, upper and numeric characters
17+
func generatePassword(lower, upper, numeric bool, length int) string {
18+
if length < 1 {
19+
return ""
20+
}
21+
22+
var password []rune
23+
var required []rune
24+
var allowed []rune
25+
26+
lowerChars := []rune("abcdefghijklmnopqrstuvwxyz")
27+
upperChars := []rune("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
28+
numberChars := []rune("0123456789")
29+
30+
// Ensure inclusion from each requested category
31+
if lower {
32+
ch := lowerChars[rand.Intn(len(lowerChars))]
33+
required = append(required, ch)
34+
allowed = append(allowed, lowerChars...)
35+
}
36+
if upper {
37+
ch := upperChars[rand.Intn(len(upperChars))]
38+
required = append(required, ch)
39+
allowed = append(allowed, upperChars...)
40+
}
41+
if numeric {
42+
ch := numberChars[rand.Intn(len(numberChars))]
43+
required = append(required, ch)
44+
allowed = append(allowed, numberChars...)
45+
}
46+
47+
if len(allowed) == 0 {
48+
return "" // No character sets enabled
49+
}
50+
51+
// Fill the rest of the password
52+
for i := 0; i < length-len(required); i++ {
53+
ch := allowed[rand.Intn(len(allowed))]
54+
password = append(password, ch)
55+
}
56+
57+
// Combine required and random characters, then shuffle
58+
password = append(password, required...)
59+
rand.Shuffle(len(password), func(i, j int) {
60+
password[i], password[j] = password[j], password[i]
61+
})
62+
63+
return string(password)
64+
}
65+
1466
func TestSnowflake_Pattern(t *testing.T) {
15-
username := gofakeit.Username()
16-
password := gofakeit.Password(true, true, true, false, false, 10)
67+
68+
validAccount := "tuacoip-zt74995"
69+
validPrivateLinkAccount := "tuacoip-zt74995.privatelink"
70+
validSingleCharacterAccount := "tuacoip-z"
71+
validUsername := gofakeit.Username()
72+
invalidUsername := "[email protected]" // special characters not allowed
73+
74+
validPassword := generatePassword(true, true, true, 10)
75+
invalidPassword := "!12" // invalid length
1776

1877
d := Scanner{}
1978
ahoCorasickCore := ahocorasick.NewAhoCorasickCore([]detectors.Detector{d})
@@ -24,26 +83,30 @@ func TestSnowflake_Pattern(t *testing.T) {
2483
}{
2584
{
2685
name: "Snowflake Credentials",
27-
input: fmt.Sprintf("snowflake: \n account=%s \n username=%s \n password=%s \n database=SNOWFLAKE", "tuacoip-zt74995", username, password),
86+
input: fmt.Sprintf("snowflake: \n account=%s \n username=%s \n password=%s \n database=SNOWFLAKE", validAccount, validUsername, validPassword),
2887
want: [][]string{
29-
[]string{"tuacoip-zt74995", username, password},
88+
{validAccount, validUsername, validPassword},
3089
},
3190
},
3291
{
3392
name: "Private Snowflake Credentials",
34-
input: fmt.Sprintf("snowflake: \n account=%s \n username=%s \n password=%s \n database=SNOWFLAKE", "tuacoip-zt74995.privatelink", username, password),
93+
input: fmt.Sprintf("snowflake: \n account=%s \n username=%s \n password=%s \n database=SNOWFLAKE", validPrivateLinkAccount, validUsername, validPassword),
3594
want: [][]string{
36-
[]string{"tuacoip-zt74995.privatelink", username, password},
95+
{validPrivateLinkAccount, validUsername, validPassword},
3796
},
3897
},
39-
4098
{
4199
name: "Snowflake Credentials - Single Character account",
42-
input: fmt.Sprintf("snowflake: \n account=%s \n username=%s \n password=%s \n database=SNOWFLAKE", "tuacoip-z", username, password),
100+
input: fmt.Sprintf("snowflake: \n account=%s \n username=%s \n password=%s \n database=SNOWFLAKE", validSingleCharacterAccount, validUsername, validPassword),
43101
want: [][]string{
44-
[]string{"tuacoip-z", username, password},
102+
{validSingleCharacterAccount, validUsername, validPassword},
45103
},
46104
},
105+
{
106+
name: "Snowflake Credentials - Invalid Username & Password",
107+
input: fmt.Sprintf("snowflake: \n account=%s \n username=%s \n password=%s \n database=SNOWFLAKE", validAccount, invalidUsername, invalidPassword),
108+
want: [][]string{},
109+
},
47110
}
48111

49112
for _, test := range tests {

0 commit comments

Comments
 (0)