Skip to content

Commit b2a87ae

Browse files
Add more fuzz tests
1 parent c3fc504 commit b2a87ae

File tree

2 files changed

+109
-0
lines changed

2 files changed

+109
-0
lines changed

internal/fetcher/json_fuzz_test.go

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package fetcher
2+
3+
import (
4+
"encoding/json"
5+
"testing"
6+
)
7+
8+
func FuzzDecodeThreadsResponse(f *testing.F) {
9+
f.Add([]byte(`{"ThreadDebugStates":[{"Index":0,"Name":"worker","State":"ready","IsBusy":true}],"ReservedThreadCount":2}`))
10+
f.Add([]byte(`{"ThreadDebugStates":[],"ReservedThreadCount":0}`))
11+
f.Add([]byte(`{}`))
12+
f.Add([]byte(`{"ThreadDebugStates":null}`))
13+
f.Add([]byte(`{"ThreadDebugStates":[{"Index":-1,"MemoryUsage":-999}]}`))
14+
f.Add([]byte(`{"ThreadDebugStates":[{"CurrentURI":"` + string(make([]byte, 1000)) + `"}]}`))
15+
16+
f.Fuzz(func(t *testing.T, data []byte) {
17+
var resp ThreadsResponse
18+
if json.Unmarshal(data, &resp) != nil {
19+
return
20+
}
21+
22+
for i, thread := range resp.ThreadDebugStates {
23+
if thread.IsBusy && thread.IsWaiting {
24+
// both flags set simultaneously: unusual but should not panic
25+
_ = thread.State
26+
}
27+
_ = i
28+
}
29+
})
30+
}
31+
32+
func FuzzExtractListenPorts(f *testing.F) {
33+
f.Add([]byte(`{"srv0":{"listen":[":443",":8080"]}}`))
34+
f.Add([]byte(`{"srv0":{"listen":[":80"]}}`))
35+
f.Add([]byte(`{"srv0":{}}`))
36+
f.Add([]byte(`{}`))
37+
f.Add([]byte(`{"srv0":{"listen":["localhost:2019","0.0.0.0:443"]}}`))
38+
f.Add([]byte(`{"srv0":{"listen":["not-a-port"]}}`))
39+
f.Add([]byte(`{"a":{"listen":[":1"]},"b":{"listen":[":1",":2"]}}`))
40+
41+
f.Fuzz(func(t *testing.T, data []byte) {
42+
var servers map[string]json.RawMessage
43+
if json.Unmarshal(data, &servers) != nil {
44+
return
45+
}
46+
47+
ports := extractListenPorts(servers)
48+
seen := make(map[string]struct{}, len(ports))
49+
for _, p := range ports {
50+
if p == "" {
51+
t.Fatal("extractListenPorts returned empty port")
52+
}
53+
if _, dup := seen[p]; dup {
54+
t.Fatalf("extractListenPorts returned duplicate port: %s", p)
55+
}
56+
seen[p] = struct{}{}
57+
}
58+
})
59+
}

internal/ui/config_fuzz_test.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package ui
2+
3+
import (
4+
"encoding/json"
5+
"testing"
6+
)
7+
8+
func FuzzParseJSONTree(f *testing.F) {
9+
f.Add([]byte(`{"admin":{"listen":"localhost:2019"},"apps":{"http":{"servers":{"srv0":{"listen":[":443"]}}}}}`))
10+
f.Add([]byte(`[1, "two", null, true, {"nested": [1,2,3]}]`))
11+
f.Add([]byte(`"just a string"`))
12+
f.Add([]byte(`42`))
13+
f.Add([]byte(`null`))
14+
f.Add([]byte(`true`))
15+
f.Add([]byte(`{}`))
16+
f.Add([]byte(`[]`))
17+
f.Add([]byte(`{"deeply":{"nested":{"object":{"with":{"many":{"levels":"value"}}}}}}`))
18+
f.Add([]byte(`{"array_of_objects":[{"a":1},{"b":2},{"c":3}]}`))
19+
20+
f.Fuzz(func(t *testing.T, data []byte) {
21+
var raw json.RawMessage
22+
if json.Unmarshal(data, &raw) != nil {
23+
return
24+
}
25+
26+
root, err := parseJSONTree(raw)
27+
if err != nil {
28+
return
29+
}
30+
31+
if root == nil {
32+
t.Fatal("parseJSONTree returned nil root without error")
33+
}
34+
35+
visible := flattenVisible(root)
36+
for _, n := range visible {
37+
if n == nil {
38+
t.Fatal("flattenVisible returned nil node")
39+
}
40+
}
41+
42+
expandAll(root)
43+
expanded := flattenVisible(root)
44+
if len(expanded) < len(visible) {
45+
t.Fatal("expandAll should not reduce visible nodes")
46+
}
47+
48+
collapseAll(root)
49+
})
50+
}

0 commit comments

Comments
 (0)