@@ -3,25 +3,28 @@ package pkg
33import (
44 "bytes"
55 "io"
6+ "strconv"
67 "strings"
78 "testing"
89
910 "github.com/stretchr/testify/require"
1011)
1112
12- type memChunkReaderWriter struct {
13+ // memReaderWriter is an in-memory implementation of ChunkWriter and ByteAndBlockReader interfaces
14+ // that allows to first write to the buffer and then read from it.
15+ type memReaderWriter struct {
1316 buf bytes.Buffer
1417}
1518
16- func (m * memChunkReaderWriter ) ReadByte () (byte , error ) {
19+ func (m * memReaderWriter ) ReadByte () (byte , error ) {
1720 return m .buf .ReadByte ()
1821}
1922
20- func (m * memChunkReaderWriter ) Read (p []byte ) (n int , err error ) {
23+ func (m * memReaderWriter ) Read (p []byte ) (n int , err error ) {
2124 return m .buf .Read (p )
2225}
2326
24- func (m * memChunkReaderWriter ) WriteChunk (header []byte , content []byte ) error {
27+ func (m * memReaderWriter ) WriteChunk (header []byte , content []byte ) error {
2528 _ , err := m .buf .Write (header )
2629 if err != nil {
2730 return err
@@ -30,11 +33,11 @@ func (m *memChunkReaderWriter) WriteChunk(header []byte, content []byte) error {
3033 return err
3134}
3235
33- func (m * memChunkReaderWriter ) Bytes () []byte {
36+ func (m * memReaderWriter ) Bytes () []byte {
3437 return m .buf .Bytes ()
3538}
3639
37- func TestLastFrameAndContinue (t * testing.T ) {
40+ func testLastFrameAndContinue (t * testing.T , compression Compression ) {
3841 // This test verifies that it is possible to decode until the end of available
3942 // data, get a correct indication that it is the end of the frame and end
4043 // of all available data, then once new data becomes available the decoding
@@ -43,8 +46,8 @@ func TestLastFrameAndContinue(t *testing.T) {
4346
4447 // Encode one frame with some data.
4548 encoder := FrameEncoder {}
46- buf := & memChunkReaderWriter {}
47- err := encoder .Init (buf , CompressionZstd )
49+ buf := & memReaderWriter {}
50+ err := encoder .Init (buf , compression )
4851 require .NoError (t , err )
4952 writeStr := []byte (strings .Repeat ("hello" , 10 ))
5053 _ , err = encoder .Write (writeStr )
@@ -55,7 +58,7 @@ func TestLastFrameAndContinue(t *testing.T) {
5558
5659 // Now decode that frame.
5760 decoder := FrameDecoder {}
58- err = decoder .Init (buf , CompressionZstd )
61+ err = decoder .Init (buf , compression )
5962 require .NoError (t , err )
6063 _ , err = decoder .Next ()
6164 require .NoError (t , err )
@@ -73,40 +76,113 @@ func TestLastFrameAndContinue(t *testing.T) {
7376 require .ErrorIs (t , err , EndOfFrame )
7477 require .EqualValues (t , 0 , n )
7578
76- // Try decoding the next frame and make sure we get the EOF from the source byte Reader.
77- _ , err = decoder .Next ()
79+ for i := 1 ; i <= 10 ; i ++ {
80+ // Try decoding the next frame and make sure we get the EOF from the source byte Reader.
81+ _ , err = decoder .Next ()
82+ require .ErrorIs (t , err , io .EOF )
83+
84+ // Continue adding to the same source byte buffer using encoder.
85+
86+ // Open a new frame, write new data and close the frame.
87+ encoder .OpenFrame (0 )
88+ writeStr = []byte (strings .Repeat ("foo" , i ))
89+ _ , err = encoder .Write (writeStr )
90+ require .NoError (t , err )
91+
92+ err = encoder .CloseFrame ()
93+ require .NoError (t , err )
94+
95+ // Try reading again. We should get an EndOfFrame error.
96+ readStr = make ([]byte , len (writeStr ))
97+ n , err = decoder .Read (readStr )
98+ require .ErrorIs (t , err , EndOfFrame )
99+ require .EqualValues (t , 0 , n )
100+
101+ // Now try decoding a new frame. This time it should succeed since we added a new frame.
102+ _ , err = decoder .Next ()
103+ require .NoError (t , err )
104+
105+ // Read the encoded data.
106+ n , err = decoder .Read (readStr )
107+ require .EqualValues (t , len (writeStr ), n )
108+ require .EqualValues (t , writeStr , readStr )
109+
110+ // Try decoding more, past the end of second frame.
111+ n , err = decoder .Read (readStr )
112+
113+ // Make sure the error indicates end of the frame.
114+ require .ErrorIs (t , err , EndOfFrame )
115+ require .EqualValues (t , 0 , n )
116+ }
117+ }
118+
119+ func TestLastFrameAndContinue (t * testing.T ) {
120+ compressions := []Compression {
121+ CompressionNone ,
122+ CompressionZstd ,
123+ }
124+
125+ for _ , compression := range compressions {
126+ t .Run (
127+ strconv .Itoa (int (compression )), func (t * testing.T ) {
128+ testLastFrameAndContinue (t , compression )
129+ },
130+ )
131+ }
132+ }
133+
134+ func TestLimitedReader (t * testing.T ) {
135+ data := []byte ("abcdef" )
136+ mem := & memReaderWriter {buf : * bytes .NewBuffer (data )}
137+ var lr limitedReader
138+ lr .Init (mem )
139+
140+ // Test reading with limit 0
141+ lr .limit = 0
142+ buf := make ([]byte , 3 )
143+ n , err := lr .Read (buf )
144+ require .Equal (t , 0 , n )
78145 require .ErrorIs (t , err , io .EOF )
79146
80- // Continue adding to the same source byte buffer using encoder.
147+ // Test ReadByte with limit 0
148+ lr .limit = 0
149+ _ , err = lr .ReadByte ()
150+ require .ErrorIs (t , err , io .EOF )
81151
82- // Open a new frame, write new data and close the frame.
83- encoder .OpenFrame (0 )
84- writeStr = []byte (strings .Repeat ("foo" , 10 ))
85- _ , err = encoder .Write (writeStr )
152+ // Reset and test reading less than limit
153+ mem = & memReaderWriter {buf : * bytes .NewBuffer (data )}
154+ lr .Init (mem )
155+ lr .limit = 3
156+ buf = make ([]byte , 2 )
157+ n , err = lr .Read (buf )
158+ require .Equal (t , 2 , n )
86159 require .NoError (t , err )
160+ require .Equal (t , []byte ("ab" ), buf )
161+ require .Equal (t , int64 (1 ), lr .limit )
87162
88- err = encoder .CloseFrame ()
163+ // Test ReadByte with remaining limit
164+ b , err := lr .ReadByte ()
89165 require .NoError (t , err )
166+ require .Equal (t , byte ('c' ), b )
167+ require .Equal (t , int64 (0 ), lr .limit )
90168
91- // Try reading again. We should get an EndOfFrame error.
92- readStr = make ([]byte , len (writeStr ))
93- n , err = decoder .Read (readStr )
94- require .ErrorIs (t , err , EndOfFrame )
95- require .EqualValues (t , 0 , n )
169+ // Test ReadByte at limit 0 after reading
170+ _ , err = lr .ReadByte ()
171+ require .ErrorIs (t , err , io .EOF )
96172
97- // Now try decoding a new frame. This time it should succeed since we added a new frame.
98- _ , err = decoder .Next ()
173+ // Test reading more than limit
174+ mem = & memReaderWriter {buf : * bytes .NewBuffer (data )}
175+ lr .Init (mem )
176+ lr .limit = 4
177+ buf = make ([]byte , 10 )
178+ n , err = lr .Read (buf )
179+ require .Equal (t , 4 , n )
99180 require .NoError (t , err )
181+ require .Equal (t , []byte ("abcd" ), buf [:n ])
182+ require .Equal (t , int64 (0 ), lr .limit )
100183
101- // Read the encoded data.
102- n , err = decoder .Read (readStr )
103- require .EqualValues (t , len (writeStr ), n )
104- require .EqualValues (t , writeStr , readStr )
105-
106- // Try decoding more, past the end of second frame.
107- n , err = decoder .Read (readStr )
108-
109- // Make sure the error indicates end of the frame.
110- require .ErrorIs (t , err , EndOfFrame )
111- require .EqualValues (t , 0 , n )
184+ // Test Read after limit exhausted
185+ n , err = lr .Read (buf )
186+ require .Equal (t , 0 , n )
187+ require .ErrorIs (t , err , io .EOF )
112188}
0 commit comments