Skip to content

Commit d72c7f0

Browse files
S-ayanideispeakc0de
authored andcommitted
test: Adding fuzz testing for common util (litmuschaos#688)
Signed-off-by: Shubham Chaudhary <[email protected]>
1 parent eef3b40 commit d72c7f0

File tree

5 files changed

+141
-5
lines changed

5 files changed

+141
-5
lines changed

go.mod

+4
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ module github.com/litmuschaos/litmus-go
33
go 1.18
44

55
require (
6+
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24
67
github.com/Azure/azure-sdk-for-go v56.1.0+incompatible
78
github.com/Azure/go-autorest/autorest v0.11.18
89
github.com/Azure/go-autorest/autorest/azure/auth v0.5.7
@@ -14,6 +15,7 @@ require (
1415
github.com/pkg/errors v0.9.1
1516
github.com/sirupsen/logrus v1.8.1
1617
github.com/spf13/cobra v1.1.1
18+
github.com/stretchr/testify v1.7.0
1719
google.golang.org/api v0.48.0
1820
gopkg.in/yaml.v2 v2.4.0
1921
k8s.io/api v0.26.0
@@ -56,7 +58,9 @@ require (
5658
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
5759
github.com/modern-go/reflect2 v1.0.2 // indirect
5860
github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 // indirect
61+
github.com/pmezard/go-difflib v1.0.0 // indirect
5962
github.com/spf13/pflag v1.0.5 // indirect
63+
github.com/stretchr/objx v0.2.0 // indirect
6064
go.opencensus.io v0.23.0 // indirect
6165
golang.org/x/crypto v0.16.0 // indirect
6266
golang.org/x/net v0.19.0 // indirect

go.sum

+3
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl
3939
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
4040
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
4141
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
42+
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU=
43+
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8=
4244
github.com/Azure/azure-sdk-for-go v56.1.0+incompatible h1:Ofcecdw3F1ZqnpDEZcLzH9Hq0P4Y5Si8+EioXJSamJs=
4345
github.com/Azure/azure-sdk-for-go v56.1.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
4446
github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
@@ -480,6 +482,7 @@ github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5q
480482
github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8=
481483
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
482484
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
485+
github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48=
483486
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
484487
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
485488
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=

pkg/utils/common/common.go

+13-5
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"os/exec"
1111
"os/signal"
1212
"reflect"
13+
"regexp"
1314
"strconv"
1415
"strings"
1516
"syscall"
@@ -29,13 +30,17 @@ type ENVDetails struct {
2930
ENV []apiv1.EnvVar
3031
}
3132

32-
//WaitForDuration waits for the given time duration (in seconds)
33+
// WaitForDuration waits for the given time duration (in seconds)
3334
func WaitForDuration(duration int) {
3435
time.Sleep(time.Duration(duration) * time.Second)
3536
}
3637

3738
// RandomInterval wait for the random interval lies between lower & upper bounds
3839
func RandomInterval(interval string) error {
40+
re := regexp.MustCompile(`^\d+(-\d+)?$`)
41+
if re.MatchString(interval) == false {
42+
return cerrors.Error{ErrorCode: cerrors.ErrorTypeGeneric, Reason: "could not parse CHAOS_INTERVAL env, bad input"}
43+
}
3944
intervals := strings.Split(interval, "-")
4045
var lowerBound, upperBound int
4146
switch len(intervals) {
@@ -49,6 +54,9 @@ func RandomInterval(interval string) error {
4954
return cerrors.Error{ErrorCode: cerrors.ErrorTypeGeneric, Reason: "could not parse CHAOS_INTERVAL env, invalid format"}
5055
}
5156
rand.Seed(time.Now().UnixNano())
57+
if upperBound < 1 {
58+
return cerrors.Error{ErrorCode: cerrors.ErrorTypeGeneric, Reason: "invalid CHAOS_INTERVAL env value, value below lower limit"}
59+
}
5260
waitTime := lowerBound + rand.Intn(upperBound-lowerBound)
5361
log.Infof("[Wait]: Wait for the random chaos interval %vs", waitTime)
5462
WaitForDuration(waitTime)
@@ -98,7 +106,7 @@ func AbortWatcherWithoutExit(expname string, clients clients.ClientSets, resultD
98106
}
99107
}
100108

101-
//FilterBasedOnPercentage return the slice of list based on the the provided percentage
109+
// FilterBasedOnPercentage return the slice of list based on the the provided percentage
102110
func FilterBasedOnPercentage(percentage int, list []string) []string {
103111

104112
var finalList []string
@@ -175,7 +183,7 @@ func GetStatusMessage(defaultCheck bool, defaultMsg, probeStatus string) string
175183
return "Probes: " + probeStatus
176184
}
177185

178-
//GetRandomSequence will gives a random value for sequence
186+
// GetRandomSequence will gives a random value for sequence
179187
func GetRandomSequence(sequence string) string {
180188
if strings.ToLower(sequence) == "random" {
181189
rand.Seed(time.Now().UnixNano())
@@ -186,7 +194,7 @@ func GetRandomSequence(sequence string) string {
186194
return sequence
187195
}
188196

189-
//ValidateRange validates the given range of numbers
197+
// ValidateRange validates the given range of numbers
190198
func ValidateRange(a string) string {
191199
var lb, ub int
192200
intervals := strings.Split(a, "-")
@@ -204,7 +212,7 @@ func ValidateRange(a string) string {
204212
}
205213
}
206214

207-
//getRandomValue gives a random value between two integers
215+
// getRandomValue gives a random value between two integers
208216
func getRandomValue(a, b int) int {
209217
rand.Seed(time.Now().Unix())
210218
return (a + rand.Intn(b-a+1))

pkg/utils/common/common_fuzz_test.go

+119
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
package common
2+
3+
import (
4+
"strings"
5+
"testing"
6+
7+
fuzz "github.com/AdaLogics/go-fuzz-headers"
8+
"github.com/litmuschaos/litmus-go/pkg/types"
9+
"github.com/stretchr/testify/require"
10+
)
11+
12+
func FuzzGetContainerNames(f *testing.F) {
13+
14+
f.Fuzz(func(t *testing.T, data []byte) {
15+
fuzzConsumer := fuzz.NewConsumer(data)
16+
targetStruct := &struct {
17+
chaosDetails types.ChaosDetails
18+
}{}
19+
err := fuzzConsumer.GenerateStruct(targetStruct)
20+
if err != nil {
21+
return
22+
}
23+
names := GetContainerNames(&targetStruct.chaosDetails)
24+
require.Equal(t, len(names), len(targetStruct.chaosDetails.SideCar)+1)
25+
})
26+
}
27+
28+
func FuzzGetSidecarVolumes(f *testing.F) {
29+
30+
f.Fuzz(func(t *testing.T, data []byte) {
31+
fuzzConsumer := fuzz.NewConsumer(data)
32+
targetStruct := &struct {
33+
chaosDetails types.ChaosDetails
34+
}{}
35+
err := fuzzConsumer.GenerateStruct(targetStruct)
36+
if err != nil {
37+
return
38+
}
39+
volumes := GetSidecarVolumes(&targetStruct.chaosDetails)
40+
var volCounts = 0
41+
for _, s := range targetStruct.chaosDetails.SideCar {
42+
volCounts += len(s.Secrets)
43+
}
44+
require.Equal(t, len(volumes), len(volumes))
45+
})
46+
}
47+
48+
func FuzzBuildSidecar(f *testing.F) {
49+
50+
f.Fuzz(func(t *testing.T, data []byte) {
51+
fuzzConsumer := fuzz.NewConsumer(data)
52+
targetStruct := &struct {
53+
chaosDetails types.ChaosDetails
54+
}{}
55+
err := fuzzConsumer.GenerateStruct(targetStruct)
56+
if err != nil {
57+
return
58+
}
59+
containers := BuildSidecar(&targetStruct.chaosDetails)
60+
require.Equal(t, len(containers), len(targetStruct.chaosDetails.SideCar))
61+
})
62+
}
63+
64+
func FuzzContains(f *testing.F) {
65+
f.Fuzz(func(t *testing.T, data []byte) {
66+
fuzzConsumer := fuzz.NewConsumer(data)
67+
targetStruct := &struct {
68+
val string
69+
slice []string
70+
}{}
71+
err := fuzzConsumer.GenerateStruct(targetStruct)
72+
if err != nil {
73+
return
74+
}
75+
contains := Contains(targetStruct.val, targetStruct.slice)
76+
for _, s := range targetStruct.slice {
77+
if s == targetStruct.val {
78+
require.True(t, contains)
79+
return
80+
}
81+
}
82+
require.False(t, contains)
83+
})
84+
}
85+
86+
func FuzzSubStringExistsInSlice(f *testing.F) {
87+
f.Fuzz(func(t *testing.T, data []byte) {
88+
fuzzConsumer := fuzz.NewConsumer(data)
89+
targetStruct := &struct {
90+
val string
91+
slice []string
92+
}{}
93+
err := fuzzConsumer.GenerateStruct(targetStruct)
94+
if err != nil {
95+
return
96+
}
97+
contains := SubStringExistsInSlice(targetStruct.val, targetStruct.slice)
98+
for _, s := range targetStruct.slice {
99+
if strings.Contains(s, targetStruct.val) {
100+
require.True(t, contains)
101+
return
102+
}
103+
}
104+
require.False(t, contains)
105+
})
106+
}
107+
108+
func FuzzGetRandomSequence(f *testing.F) {
109+
f.Add("random")
110+
111+
f.Fuzz(func(t *testing.T, sequence string) {
112+
val := GetRandomSequence(sequence)
113+
if strings.ToLower(sequence) == "random" {
114+
require.Contains(t, []string{"serial", "parallel"}, val)
115+
return
116+
}
117+
require.Equal(t, sequence, val)
118+
})
119+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
go test fuzz v1
2+
string("2778")

0 commit comments

Comments
 (0)