Skip to content

Commit 968e4e3

Browse files
test: create/update UTs for engine, chunk and semaphore
1 parent e3a6811 commit 968e4e3

3 files changed

Lines changed: 421 additions & 75 deletions

File tree

engine/chunk/chunk_test.go

Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
package chunk
2+
3+
import (
4+
"bufio"
5+
"bytes"
6+
"github.com/stretchr/testify/require"
7+
"io"
8+
"strings"
9+
"testing"
10+
)
11+
12+
func TestGetAndPutBuf(t *testing.T) {
13+
chunk := NewChunk()
14+
buf, ok := chunk.GetBuf()
15+
defer chunk.PutBuf(buf)
16+
17+
require.True(t, ok)
18+
require.Equal(t, defaultSize, len(*buf))
19+
}
20+
21+
func TestGetAndPutPeekBuf(t *testing.T) {
22+
chunk := NewChunk()
23+
data := []byte("test")
24+
buf, ok := chunk.GetPeekBuf(data)
25+
defer chunk.PutPeekBuf(buf)
26+
27+
require.True(t, ok)
28+
require.Equal(t, defaultSize+defaultMaxPeekSize, buf.Cap())
29+
require.Equal(t, string(data), buf.String())
30+
}
31+
32+
func TestGetSize(t *testing.T) {
33+
chunk := NewChunk()
34+
require.Equal(t, defaultSize, chunk.GetSize())
35+
}
36+
37+
func TestGetMaxPeekSize(t *testing.T) {
38+
chunk := NewChunk()
39+
require.Equal(t, defaultMaxPeekSize, chunk.GetMaxPeekSize())
40+
}
41+
42+
func TestReadChunk(t *testing.T) {
43+
// Arrange
44+
type testCase struct {
45+
name string
46+
reader io.Reader
47+
expected string
48+
expectedError error
49+
}
50+
testCases := []testCase{
51+
{
52+
name: "empty",
53+
reader: strings.NewReader(""),
54+
expectedError: io.EOF,
55+
},
56+
{
57+
name: "unsupported file type",
58+
reader: bytes.NewReader([]byte{'P', 'K', 0x03, 0x04}),
59+
expectedError: ErrUnsupportedFileType,
60+
},
61+
{
62+
name: "successful read",
63+
reader: strings.NewReader("abc\n"),
64+
expected: "abc\n",
65+
},
66+
{
67+
name: "successful read - peek size exceeded",
68+
reader: strings.NewReader("abc\ndef\nghi\njkl\nmno\npqr\nstu\nvwx\nyz"),
69+
expected: "abc\ndef\nghi\njkl\nmno\npqr\ns",
70+
},
71+
{
72+
name: "successful read - multiple lines with consecutives new lines",
73+
reader: strings.NewReader("abc\ndef\n\nghi\n"),
74+
expected: "abc\ndef\n\n",
75+
},
76+
{
77+
name: "multiple lines without consecutives new lines",
78+
reader: strings.NewReader("abc\ndef\nghi\n"),
79+
expected: "abc\ndef\nghi\n",
80+
},
81+
}
82+
83+
for _, tc := range testCases {
84+
t.Run(tc.name, func(t *testing.T) {
85+
chunk := NewChunkWithSize(5, 20, 20)
86+
reader := bufio.NewReader(tc.reader)
87+
88+
// Act
89+
result, err := chunk.ReadChunk(reader, 0)
90+
require.ErrorIs(t, err, tc.expectedError)
91+
92+
// Assert
93+
require.Equal(t, tc.expected, result)
94+
})
95+
}
96+
}
97+
98+
func TestReadUntilSafeBoundary(t *testing.T) {
99+
// Arrange
100+
testCases := []struct {
101+
name string
102+
reader io.Reader
103+
expected string
104+
}{
105+
// Current split is fine, exit early.
106+
{
107+
name: "safe original split - LF",
108+
reader: strings.NewReader("abc\n\ndefghijklmnop\n\nqrstuvwxyz"),
109+
expected: "abc\n\n",
110+
},
111+
{
112+
name: "safe original split - CRLF",
113+
reader: strings.NewReader("a\r\n\r\nbcdefghijklmnop\n"),
114+
expected: "a\r\n\r\n",
115+
},
116+
// Current split is bad, look for a better one.
117+
{
118+
name: "safe split - LF",
119+
reader: strings.NewReader("abcdefg\nhijklmnop\n\nqrstuvwxyz"),
120+
expected: "abcdefg\nhijklmnop\n\n",
121+
},
122+
{
123+
name: "safe split - CRLF",
124+
reader: strings.NewReader("abcdefg\r\nhijklmnop\r\n\r\nqrstuvwxyz"),
125+
expected: "abcdefg\r\nhijklmnop\r\n\r\n",
126+
},
127+
{
128+
name: "safe split - blank line",
129+
reader: strings.NewReader("abcdefg\nhijklmnop\n\t \t\nqrstuvwxyz"),
130+
expected: "abcdefg\nhijklmnop\n\t \t\n",
131+
},
132+
// Current split is bad, exhaust options.
133+
{
134+
name: "no safe split",
135+
reader: strings.NewReader("abcdefg\nhijklmnopqrstuvwxyz"),
136+
expected: "abcdefg\nhijklmnopqrstuvwx",
137+
},
138+
}
139+
140+
for _, tc := range testCases {
141+
t.Run(tc.name, func(t *testing.T) {
142+
buf := make([]byte, 5)
143+
n, err := tc.reader.Read(buf)
144+
require.NoError(t, err)
145+
146+
// Act
147+
chunk := NewChunkWithSize(5, 20, 20)
148+
reader := bufio.NewReader(tc.reader)
149+
peekBuf := bytes.NewBuffer(buf[:n])
150+
err = chunk.readUntilSafeBoundary(reader, n, peekBuf)
151+
require.NoError(t, err)
152+
153+
// Assert
154+
require.Equal(t, tc.expected, peekBuf.String())
155+
})
156+
}
157+
}

0 commit comments

Comments
 (0)