From e1319a532572555860c2a958e597e980952efd9b Mon Sep 17 00:00:00 2001 From: Juan Calderon-Perez <835733+gaby@users.noreply.github.com> Date: Sun, 13 Jul 2025 13:33:05 -0400 Subject: [PATCH 1/2] test: expand coverage --- bytes_test.go | 30 ++++++++++++++++++++++++++++++ byteseq_test.go | 20 ++++++++++++++++++++ cbor_test.go | 9 +++++++++ common_test.go | 10 ++++++++++ convert_test.go | 5 +++++ file_test.go | 8 ++++++++ http_test.go | 9 +++++++++ ips_test.go | 9 +++++++++ json_test.go | 8 ++++++++ msgpack_test.go | 8 ++++++++ parse_test.go | 16 ++++++++++++++++ strings_test.go | 7 +++++++ time_test.go | 14 ++++++++++++++ xml_test.go | 8 ++++++++ 14 files changed, 161 insertions(+) diff --git a/bytes_test.go b/bytes_test.go index 88eb6e0..7e18566 100644 --- a/bytes_test.go +++ b/bytes_test.go @@ -73,3 +73,33 @@ func Benchmark_ToUpperBytes(b *testing.B) { require.Equal(b, want, res) }) } + +func Test_ToLowerBytes_Edge(t *testing.T) { + t.Parallel() + + cases := [][]byte{ + {}, + []byte("123"), + []byte("!@#"), + } + for _, c := range cases { + t.Run(string(c), func(t *testing.T) { + require.Equal(t, bytes.ToLower(c), ToLowerBytes(c)) + }) + } +} + +func Test_ToUpperBytes_Edge(t *testing.T) { + t.Parallel() + + cases := [][]byte{ + {}, + []byte("123"), + []byte("!@#"), + } + for _, c := range cases { + t.Run(string(c), func(t *testing.T) { + require.Equal(t, bytes.ToUpper(c), ToUpperBytes(c)) + }) + } +} diff --git a/byteseq_test.go b/byteseq_test.go index 0c82684..27d99fc 100644 --- a/byteseq_test.go +++ b/byteseq_test.go @@ -282,3 +282,23 @@ func Benchmark_TrimBytes(b *testing.B) { require.Equal(b, expected, res) }) } + +func Test_Trim_Edge(t *testing.T) { + t.Parallel() + + cases := []struct { + input string + cut byte + exp string + }{ + {"foobar", 'x', "foobar"}, + {"", ' ', ""}, + {"xxfoobarxx", 'x', "foobar"}, + } + for _, c := range cases { + t.Run(c.input, func(t *testing.T) { + require.Equal(t, c.exp, Trim(c.input, c.cut)) + require.Equal(t, []byte(c.exp), Trim([]byte(c.input), c.cut)) + }) + } +} diff --git a/cbor_test.go b/cbor_test.go index e9fc7b4..aa27060 100644 --- a/cbor_test.go +++ b/cbor_test.go @@ -108,3 +108,12 @@ func Test_DefaultCBORDecoderWithUnitializedStruct(t *testing.T) { require.NoError(t, err) require.Equal(t, emptySs, ss) } + +func Test_CBORDecodeInvalid(t *testing.T) { + t.Parallel() + + data := []byte{0xff, 0xff} + var ss sampleStructure + err := cbor.Unmarshal(data, &ss) + require.Error(t, err) +} diff --git a/common_test.go b/common_test.go index 5987f89..495d55b 100644 --- a/common_test.go +++ b/common_test.go @@ -209,6 +209,16 @@ func Test_GetArgument(t *testing.T) { require.False(t, GetArgument("missing-arg")) } +func Test_GetArgument_Multiple(t *testing.T) { + original := os.Args + defer func() { os.Args = original }() + + os.Args = []string{"cmd", "-a", "-b", "--flag"} + require.True(t, GetArgument("-a")) + require.True(t, GetArgument("--flag")) + require.False(t, GetArgument("-c")) +} + func Test_IncrementIPRange(t *testing.T) { t.Parallel() diff --git a/convert_test.go b/convert_test.go index 8e146f8..122313b 100644 --- a/convert_test.go +++ b/convert_test.go @@ -159,6 +159,11 @@ func Test_ToString(t *testing.T) { require.Equal(t, tc.expected, res) }) } + + t.Run("nil", func(t *testing.T) { + t.Parallel() + require.Equal(t, "", ToString(nil)) + }) } func TestCopyBytes(t *testing.T) { diff --git a/file_test.go b/file_test.go index 390efbe..5242018 100644 --- a/file_test.go +++ b/file_test.go @@ -206,3 +206,11 @@ func Test_ReadFile_NoFS(t *testing.T) { require.NoError(t, err) require.Contains(t, string(data), "doe") } + +func Test_ReadFile_SubDir(t *testing.T) { + t.Parallel() + + data, err := ReadFile("example/example1.txt", http.FS(os.DirFS(".github/tests"))) + require.NoError(t, err) + require.NotNil(t, data) +} diff --git a/http_test.go b/http_test.go index afd25ef..7c76475 100644 --- a/http_test.go +++ b/http_test.go @@ -42,6 +42,9 @@ func Test_GetMIME(t *testing.T) { require.Equal(t, "application/javascript", res) } require.NoError(t, err) + + require.Equal(t, "application/json", GetMIME(".JSON")) + require.Equal(t, MIMEOctetStream, GetMIME(" .json")) } // go test -v -run=^$ -bench=Benchmark_GetMIME -benchmem -count=2 @@ -208,6 +211,12 @@ func Test_StatusMessage(t *testing.T) { res = StatusMessage(600) require.Equal(t, "", res) + + res = StatusMessage(100) + require.Equal(t, "Continue", res) + + res = StatusMessage(http.StatusTeapot) + require.Equal(t, "I'm a teapot", res) } // go test -run=^$ -bench=Benchmark_StatusMessage -benchmem -count=2 diff --git a/ips_test.go b/ips_test.go index 42799cd..e8aef2d 100644 --- a/ips_test.go +++ b/ips_test.go @@ -92,6 +92,15 @@ func Test_IsIPv6_EdgeCases(t *testing.T) { require.False(t, IsIPv6("1::2:3:4:5:6:7:8")) } +func Test_IPWhitespace(t *testing.T) { + t.Parallel() + + require.False(t, IsIPv4(" 1.1.1.1")) + require.False(t, IsIPv4("1.1.1.1 ")) + require.False(t, IsIPv6(" ::1")) + require.False(t, IsIPv6("::1 ")) +} + // go test -v -run=^$ -bench=UnsafeString -benchmem -count=2 func Benchmark_IsIPv4(b *testing.B) { ip := "174.23.33.100" diff --git a/json_test.go b/json_test.go index 3c756ac..0532c8d 100644 --- a/json_test.go +++ b/json_test.go @@ -58,3 +58,11 @@ func Test_DefaultJSONDecoder(t *testing.T) { require.NoError(t, err) require.Equal(t, "Hello World", ss.ImportantString) } + +func Test_JSONDecodeInvalid(t *testing.T) { + t.Parallel() + + var ss sampleStructure + err := json.Unmarshal([]byte("{invalid}"), &ss) + require.Error(t, err) +} diff --git a/msgpack_test.go b/msgpack_test.go index bc021f2..4c1e23e 100644 --- a/msgpack_test.go +++ b/msgpack_test.go @@ -49,3 +49,11 @@ func Test_MsgpackDecoder(t *testing.T) { require.NoError(t, err) require.Equal(t, "Hello World", decoded.ImportantString) } + +func Test_MsgpackDecodeInvalid(t *testing.T) { + t.Parallel() + + var decoded sampleMsgPackStructure + err := msgpack.Unmarshal([]byte{0xff, 0xff}, &decoded) + require.Error(t, err) +} diff --git a/parse_test.go b/parse_test.go index f5b4f93..05398e5 100644 --- a/parse_test.go +++ b/parse_test.go @@ -35,6 +35,14 @@ func Test_ParseUint(t *testing.T) { } } +func Test_ParseUint_Whitespace(t *testing.T) { + t.Parallel() + + v, ok := ParseUint(" 123") + require.False(t, ok) + require.Equal(t, uint64(0), v) +} + func Benchmark_ParseUint(b *testing.B) { input := "123456789" @@ -110,6 +118,14 @@ func Test_ParseInt_SignOnly(t *testing.T) { } } +func Test_ParseInt_Whitespace(t *testing.T) { + t.Parallel() + + v, ok := ParseInt(" 42") + require.False(t, ok) + require.Equal(t, int64(0), v) +} + func Test_ParseUnsigned_SignOnly(t *testing.T) { t.Parallel() diff --git a/strings_test.go b/strings_test.go index 42f6794..b61e90f 100644 --- a/strings_test.go +++ b/strings_test.go @@ -213,6 +213,13 @@ func Test_NonASCII_Unchanged(t *testing.T) { require.Equal(t, nonASCII, ToUpper(nonASCII), "ToUpper altered non-ASCII") require.Equal(t, nonASCII, ToLower(nonASCII), "ToLower altered non-ASCII") }) + + mixed := "Goµ" + t.Run("mixed", func(t *testing.T) { + t.Parallel() + require.Equal(t, "GOµ", ToUpper(mixed)) + require.Equal(t, "goµ", ToLower(mixed)) + }) } func Benchmark_ToUpper(b *testing.B) { diff --git a/time_test.go b/time_test.go index 2feddd0..66b9755 100644 --- a/time_test.go +++ b/time_test.go @@ -112,3 +112,17 @@ func Benchmark_CalculateTimestamp(b *testing.B) { } }) } + +func Test_StartStopRepeat(t *testing.T) { + timerTestMu.Lock() + defer timerTestMu.Unlock() + + StartTimeStampUpdater() + StopTimeStampUpdater() + StartTimeStampUpdater() + defer StopTimeStampUpdater() + + time.Sleep(50 * time.Millisecond) + ts := Timestamp() + require.NotZero(t, ts) +} diff --git a/xml_test.go b/xml_test.go index 9a6d85b..e94df4c 100644 --- a/xml_test.go +++ b/xml_test.go @@ -136,3 +136,11 @@ func Benchmark_DefaultXMLDecoder(b *testing.B) { } } } + +func Test_XMLDecodeInvalid(t *testing.T) { + t.Parallel() + + var ss serversXMLStructure + err := xml.Unmarshal([]byte(""), &ss) + require.Error(t, err) +} From 1c5b2e03d2a65cd89bb5bb62b15f16b034d521d1 Mon Sep 17 00:00:00 2001 From: Juan Calderon-Perez <835733+gaby@users.noreply.github.com> Date: Sun, 13 Jul 2025 14:11:11 -0400 Subject: [PATCH 2/2] Fix linter issues --- bytes_test.go | 2 ++ byteseq_test.go | 1 + 2 files changed, 3 insertions(+) diff --git a/bytes_test.go b/bytes_test.go index 7e18566..359c9db 100644 --- a/bytes_test.go +++ b/bytes_test.go @@ -84,6 +84,7 @@ func Test_ToLowerBytes_Edge(t *testing.T) { } for _, c := range cases { t.Run(string(c), func(t *testing.T) { + t.Parallel() require.Equal(t, bytes.ToLower(c), ToLowerBytes(c)) }) } @@ -99,6 +100,7 @@ func Test_ToUpperBytes_Edge(t *testing.T) { } for _, c := range cases { t.Run(string(c), func(t *testing.T) { + t.Parallel() require.Equal(t, bytes.ToUpper(c), ToUpperBytes(c)) }) } diff --git a/byteseq_test.go b/byteseq_test.go index 27d99fc..fb0cdfd 100644 --- a/byteseq_test.go +++ b/byteseq_test.go @@ -297,6 +297,7 @@ func Test_Trim_Edge(t *testing.T) { } for _, c := range cases { t.Run(c.input, func(t *testing.T) { + t.Parallel() require.Equal(t, c.exp, Trim(c.input, c.cut)) require.Equal(t, []byte(c.exp), Trim([]byte(c.input), c.cut)) })