From 56b8c594e58c16363cf78ac04c5f2344517b466c Mon Sep 17 00:00:00 2001 From: Philip Potter Date: Thu, 7 Mar 2024 13:23:58 +0000 Subject: [PATCH] test bufferedReader --- pkg/download/buffered_reader_test.go | 84 ++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 pkg/download/buffered_reader_test.go diff --git a/pkg/download/buffered_reader_test.go b/pkg/download/buffered_reader_test.go new file mode 100644 index 0000000..f28a6a0 --- /dev/null +++ b/pkg/download/buffered_reader_test.go @@ -0,0 +1,84 @@ +package download + +import ( + "bytes" + "io" + "strings" + "sync" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestBufferedReaderSerial(t *testing.T) { + pool := newBufferPool(10) + br := newBufferedReader(pool) + n, err := br.ReadFrom(strings.NewReader("foobar")) + assert.NoError(t, err) + assert.Equal(t, int64(6), n) + br.Done() + buf, err := io.ReadAll(br) + assert.NoError(t, err) + assert.Equal(t, "foobar", string(buf)) +} + +func TestBufferedReaderParallel(t *testing.T) { + pool := newBufferPool(10) + br := newBufferedReader(pool) + wg := new(sync.WaitGroup) + wg.Add(1) + go func() { + defer br.Done() + defer wg.Done() + n, err := br.ReadFrom(strings.NewReader("foobar")) + assert.NoError(t, err) + assert.Equal(t, int64(6), n) + }() + buf, err := io.ReadAll(br) + assert.NoError(t, err) + assert.Equal(t, "foobar", string(buf)) + wg.Wait() +} + +func TestBufferedReaderReadsWholeChunk(t *testing.T) { + chunkSize := int64(1024 * 1024) + pool := newBufferPool(chunkSize) + br := newBufferedReader(pool) + data := bytes.Repeat([]byte("x"), int(chunkSize)) + n64, err := br.ReadFrom(bytes.NewReader(data)) + assert.NoError(t, err) + assert.Equal(t, chunkSize, n64) + br.Done() + buf := make([]byte, chunkSize) + // We should only require a single Read() call because all the data should + // be buffered + n, err := br.Read(buf) + assert.NoError(t, err) + assert.Equal(t, data, buf) + assert.Equal(t, int(chunkSize), n) +} + +func TestBufferedReaderSubsequentReadsReturnEOF(t *testing.T) { + pool := newBufferPool(10) + br := newBufferedReader(pool) + n64, err := br.ReadFrom(strings.NewReader("foobar")) + assert.NoError(t, err) + assert.Equal(t, int64(6), n64) + br.Done() + buf, err := io.ReadAll(br) + assert.NoError(t, err) + assert.Equal(t, "foobar", string(buf)) + + n, err := br.Read(buf) + assert.Equal(t, 0, n) + assert.ErrorIs(t, err, io.EOF) +} + +func TestBufferedReaderDoneWithoutReadFrom(t *testing.T) { + pool := newBufferPool(10) + br := newBufferedReader(pool) + br.Done() + buf, err := io.ReadAll(br) + assert.NoError(t, err) + assert.Equal(t, 0, len(buf)) +}