Skip to content

Commit 6d26c21

Browse files
authored
test: Adding fuzz testing for common util (#691)
* test: Adding fuzz testing for common util Signed-off-by: Shubham Chaudhary <[email protected]> * fix the random interval test Signed-off-by: Shubham Chaudhary <[email protected]> --------- Signed-off-by: Shubham Chaudhary <[email protected]>
1 parent 5554a29 commit 6d26c21

File tree

4 files changed

+145
-11
lines changed

4 files changed

+145
-11
lines changed

go.mod

+2
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
@@ -59,6 +60,7 @@ require (
5960
github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417 // indirect
6061
github.com/pmezard/go-difflib v1.0.0 // indirect
6162
github.com/spf13/pflag v1.0.5 // indirect
63+
github.com/stretchr/objx v0.2.0 // indirect
6264
go.opencensus.io v0.23.0 // indirect
6365
golang.org/x/crypto v0.16.0 // indirect
6466
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_fuzz_test.go

+140-9
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
package common
22

33
import (
4-
"github.com/stretchr/testify/assert"
54
"regexp"
65
"strconv"
76
"strings"
87
"testing"
8+
9+
fuzz "github.com/AdaLogics/go-fuzz-headers"
10+
"github.com/litmuschaos/litmus-go/pkg/types"
11+
"github.com/stretchr/testify/assert"
12+
"github.com/stretchr/testify/require"
913
)
1014

1115
func FuzzRandomInterval(f *testing.F) {
@@ -24,17 +28,144 @@ func FuzzRandomInterval(f *testing.F) {
2428
f.Fuzz(func(t *testing.T, interval string) {
2529
re := regexp.MustCompile(`^\d+(-\d+)?$`)
2630
intervals := strings.Split(interval, "-")
27-
err := RandomInterval(interval)
31+
skip := false
32+
if re.MatchString(interval) {
33+
a, _ := strconv.Atoi(intervals[0])
34+
if len(intervals) == 2 {
35+
b, _ := strconv.Atoi(intervals[1])
36+
if a > 5 || (b-a) > 5 || (b-a) < 1 {
37+
skip = true
38+
}
39+
} else if len(intervals) == 1 {
40+
if a > 5 || a < 1 {
41+
skip = true
42+
}
43+
}
44+
}
45+
46+
if !skip {
47+
err := RandomInterval(interval)
48+
if re.MatchString(interval) == false {
49+
assert.Error(t, err, "{\"errorCode\":\"GENERIC_ERROR\",\"reason\":\"could not parse CHAOS_INTERVAL env, bad input\"}")
50+
return
51+
}
52+
53+
num, _ := strconv.Atoi(intervals[0])
54+
if num < 1 && err != nil {
55+
assert.Error(t, err, "{\"errorCode\":\"GENERIC_ERROR\",\"reason\":\"invalid CHAOS_INTERVAL env value, value below lower limit\"}")
56+
return
57+
} else if num > 1 && err != nil {
58+
t.Errorf("Unexpected Error: %v", err)
59+
}
60+
}
61+
})
62+
}
63+
64+
func FuzzGetContainerNames(f *testing.F) {
65+
66+
f.Fuzz(func(t *testing.T, data []byte) {
67+
fuzzConsumer := fuzz.NewConsumer(data)
68+
targetStruct := &struct {
69+
chaosDetails types.ChaosDetails
70+
}{}
71+
err := fuzzConsumer.GenerateStruct(targetStruct)
72+
if err != nil {
73+
return
74+
}
75+
names := GetContainerNames(&targetStruct.chaosDetails)
76+
require.Equal(t, len(names), len(targetStruct.chaosDetails.SideCar)+1)
77+
})
78+
}
79+
80+
func FuzzGetSidecarVolumes(f *testing.F) {
81+
82+
f.Fuzz(func(t *testing.T, data []byte) {
83+
fuzzConsumer := fuzz.NewConsumer(data)
84+
targetStruct := &struct {
85+
chaosDetails types.ChaosDetails
86+
}{}
87+
err := fuzzConsumer.GenerateStruct(targetStruct)
88+
if err != nil {
89+
return
90+
}
91+
volumes := GetSidecarVolumes(&targetStruct.chaosDetails)
92+
var volCounts = 0
93+
for _, s := range targetStruct.chaosDetails.SideCar {
94+
volCounts += len(s.Secrets)
95+
}
96+
require.Equal(t, len(volumes), len(volumes))
97+
})
98+
}
2899

29-
if re.MatchString(interval) == false {
30-
assert.Error(t, err, "{\"errorCode\":\"GENERIC_ERROR\",\"reason\":\"could not parse CHAOS_INTERVAL env, bad input\"}")
100+
func FuzzBuildSidecar(f *testing.F) {
101+
102+
f.Fuzz(func(t *testing.T, data []byte) {
103+
fuzzConsumer := fuzz.NewConsumer(data)
104+
targetStruct := &struct {
105+
chaosDetails types.ChaosDetails
106+
}{}
107+
err := fuzzConsumer.GenerateStruct(targetStruct)
108+
if err != nil {
109+
return
110+
}
111+
containers := BuildSidecar(&targetStruct.chaosDetails)
112+
require.Equal(t, len(containers), len(targetStruct.chaosDetails.SideCar))
113+
})
114+
}
115+
116+
func FuzzContains(f *testing.F) {
117+
f.Fuzz(func(t *testing.T, data []byte) {
118+
fuzzConsumer := fuzz.NewConsumer(data)
119+
targetStruct := &struct {
120+
val string
121+
slice []string
122+
}{}
123+
err := fuzzConsumer.GenerateStruct(targetStruct)
124+
if err != nil {
125+
return
126+
}
127+
contains := Contains(targetStruct.val, targetStruct.slice)
128+
for _, s := range targetStruct.slice {
129+
if s == targetStruct.val {
130+
require.True(t, contains)
131+
return
132+
}
31133
}
134+
require.False(t, contains)
135+
})
136+
}
137+
138+
func FuzzSubStringExistsInSlice(f *testing.F) {
139+
f.Fuzz(func(t *testing.T, data []byte) {
140+
fuzzConsumer := fuzz.NewConsumer(data)
141+
targetStruct := &struct {
142+
val string
143+
slice []string
144+
}{}
145+
err := fuzzConsumer.GenerateStruct(targetStruct)
146+
if err != nil {
147+
return
148+
}
149+
contains := SubStringExistsInSlice(targetStruct.val, targetStruct.slice)
150+
for _, s := range targetStruct.slice {
151+
if strings.Contains(s, targetStruct.val) {
152+
require.True(t, contains)
153+
return
154+
}
155+
}
156+
require.False(t, contains)
157+
})
158+
}
159+
160+
func FuzzGetRandomSequence(f *testing.F) {
161+
f.Add("random")
32162

33-
num, _ := strconv.Atoi(intervals[0])
34-
if num < 1 && err != nil {
35-
assert.Error(t, err, "{\"errorCode\":\"GENERIC_ERROR\",\"reason\":\"invalid CHAOS_INTERVAL env value, value below lower limit\"}")
36-
} else if num > 1 && err != nil {
37-
t.Errorf("Unexpected Error: %v", err)
163+
f.Fuzz(func(t *testing.T, sequence string) {
164+
val := GetRandomSequence(sequence)
165+
if strings.ToLower(sequence) == "random" {
166+
require.Contains(t, []string{"serial", "parallel"}, val)
167+
return
38168
}
169+
require.Equal(t, sequence, val)
39170
})
40171
}

pkg/utils/common/testdata/fuzz/FuzzRandomInterval/711bbee1d16a50e2

-2
This file was deleted.

0 commit comments

Comments
 (0)