| 212 | } |
| 213 | |
| 214 | func TestAsyncBufferReader(t *testing.T) { |
| 215 | source, bytesReader := generateSourceData(t, asyncbuffer.ChunkSize*4+halfChunkSize) |
| 216 | |
| 217 | // Create an AsyncBuffer with the byte slice |
| 218 | ab := asyncbuffer.New(bytesReader, -1) |
| 219 | defer ab.Close() |
| 220 | |
| 221 | // Let's wait for all chunks to be read |
| 222 | size, err := ab.Wait() |
| 223 | require.NoError(t, err, "AsyncBuffer failed to wait for all chunks") |
| 224 | assert.Equal(t, asyncbuffer.ChunkSize*4+halfChunkSize, size) |
| 225 | |
| 226 | reader := ab.Reader() |
| 227 | |
| 228 | // Ensure the total length of the data is ChunkSize*4 |
| 229 | require.NoError(t, err) |
| 230 | |
| 231 | // Read the first two chunks |
| 232 | twoChunks := make([]byte, asyncbuffer.ChunkSize*2) |
| 233 | n, err := reader.Read(twoChunks) |
| 234 | require.NoError(t, err) |
| 235 | assert.Equal(t, asyncbuffer.ChunkSize*2, n) |
| 236 | assert.Equal(t, source[:asyncbuffer.ChunkSize*2], twoChunks) |
| 237 | |
| 238 | // Seek to the last chunk + 10 bytes |
| 239 | pos, err := reader.Seek(asyncbuffer.ChunkSize*3+5, io.SeekStart) |
| 240 | require.NoError(t, err) |
| 241 | assert.Equal(t, int64(asyncbuffer.ChunkSize*3+5), pos) |
| 242 | |
| 243 | // Read the next 10 bytes |
| 244 | smallSlice := make([]byte, 10) |
| 245 | n, err = reader.Read(smallSlice) |
| 246 | require.NoError(t, err) |
| 247 | assert.Equal(t, 10, n) |
| 248 | assert.Equal(t, source[asyncbuffer.ChunkSize*3+5:asyncbuffer.ChunkSize*3+5+10], smallSlice) |
| 249 | |
| 250 | // Seek -10 bytes from the current position |
| 251 | pos, err = reader.Seek(-10, io.SeekCurrent) |
| 252 | require.NoError(t, err) |
| 253 | assert.Equal(t, int64(asyncbuffer.ChunkSize*3+5), pos) |
| 254 | |
| 255 | // Read data again |
| 256 | n, err = reader.Read(smallSlice) |
| 257 | require.NoError(t, err) |
| 258 | assert.Equal(t, 10, n) |
| 259 | assert.Equal(t, source[asyncbuffer.ChunkSize*3+5:asyncbuffer.ChunkSize*3+5+10], smallSlice) |
| 260 | |
| 261 | // Seek -10 bytes from end of the stream |
| 262 | pos, err = reader.Seek(-10, io.SeekEnd) |
| 263 | require.NoError(t, err) |
| 264 | assert.Equal(t, size-10, int(pos)) |
| 265 | |
| 266 | // Read last 10 bytes |
| 267 | n, err = reader.Read(smallSlice) |
| 268 | require.NoError(t, err) |
| 269 | assert.Equal(t, 10, n) |
| 270 | assert.Equal(t, source[size-10:], smallSlice) |
| 271 | |