TestAsyncBufferRead tests reading from AsyncBuffer using readAt method which is base for all other methods
(t *testing.T)
| 123 | |
| 124 | // TestAsyncBufferRead tests reading from AsyncBuffer using readAt method which is base for all other methods |
| 125 | func TestAsyncBufferReadAt(t *testing.T) { |
| 126 | // Let's use source buffer which is 4.5 chunks long |
| 127 | source, bytesReader := generateSourceData(t, asyncbuffer.ChunkSize*4+halfChunkSize) |
| 128 | ab := asyncbuffer.New(bytesReader, -1) |
| 129 | defer ab.Close() |
| 130 | |
| 131 | ab.Wait() // Wait for all chunks to be read since we're going to read all data |
| 132 | |
| 133 | // Let's read all the data |
| 134 | target := make([]byte, len(source)) |
| 135 | |
| 136 | n, err := ab.ReadAt(target, 0) |
| 137 | require.NoError(t, err) |
| 138 | assert.Equal(t, len(source), n) |
| 139 | assert.Equal(t, target, source) |
| 140 | |
| 141 | // Let's read all the data + a bit more |
| 142 | target = make([]byte, len(source)+1) |
| 143 | |
| 144 | n, err = ab.ReadAt(target, 0) |
| 145 | require.NoError(t, err) // We read all the data, and reached end |
| 146 | assert.Equal(t, len(source), n) |
| 147 | assert.Equal(t, target[:n], source) |
| 148 | |
| 149 | // Let's read > 1 chunk, but with offset from the beginning and the end |
| 150 | target = make([]byte, len(source)-halfChunkSize) |
| 151 | n, err = ab.ReadAt(target, quaterChunkSize) |
| 152 | require.NoError(t, err) |
| 153 | assert.Equal(t, len(target), n) |
| 154 | assert.Equal(t, target, source[quaterChunkSize:len(source)-quaterChunkSize]) |
| 155 | |
| 156 | // Let's read some data from the middle of the stream < chunk size |
| 157 | target = make([]byte, asyncbuffer.ChunkSize/4) |
| 158 | n, err = ab.ReadAt(target, asyncbuffer.ChunkSize+asyncbuffer.ChunkSize/4) |
| 159 | require.NoError(t, err) |
| 160 | assert.Equal(t, quaterChunkSize, n) |
| 161 | assert.Equal(t, target, source[asyncbuffer.ChunkSize+quaterChunkSize:asyncbuffer.ChunkSize+quaterChunkSize*2]) |
| 162 | |
| 163 | // Let's read some data from the latest half chunk |
| 164 | target = make([]byte, quaterChunkSize) |
| 165 | n, err = ab.ReadAt(target, asyncbuffer.ChunkSize*4+quaterChunkSize) |
| 166 | require.NoError(t, err) |
| 167 | assert.Equal(t, quaterChunkSize, n) |
| 168 | assert.Equal(t, target, source[asyncbuffer.ChunkSize*4+quaterChunkSize:asyncbuffer.ChunkSize*4+halfChunkSize]) |
| 169 | |
| 170 | // Let's try to read more data then available in the stream |
| 171 | target = make([]byte, asyncbuffer.ChunkSize*2) |
| 172 | n, err = ab.ReadAt(target, asyncbuffer.ChunkSize*4) |
| 173 | require.NoError(t, err) |
| 174 | assert.Equal(t, asyncbuffer.ChunkSize/2, n) |
| 175 | assert.Equal(t, target[:asyncbuffer.ChunkSize/2], source[asyncbuffer.ChunkSize*4:]) // We read only last half chunk |
| 176 | |
| 177 | // Let's try to read data beyond the end of the stream |
| 178 | target = make([]byte, asyncbuffer.ChunkSize*2) |
| 179 | n, err = ab.ReadAt(target, asyncbuffer.ChunkSize*5) |
| 180 | require.Error(t, err) |
| 181 | assert.Equal(t, err, io.EOF) |
| 182 | assert.Equal(t, 0, n) |