From 9643ea5235fc73cdab50c00c40ba255cc47b1417 Mon Sep 17 00:00:00 2001 From: Matt Dainty Date: Fri, 18 Nov 2022 00:35:38 +0000 Subject: [PATCH] Add FillReader and DevZero --- fill.go | 21 +++++++++++++++++++++ zero.go | 18 ++++++++++++++++++ zero_test.go | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 75 insertions(+) create mode 100644 fill.go create mode 100644 zero.go create mode 100644 zero_test.go diff --git a/fill.go b/fill.go new file mode 100644 index 0000000..353d6a6 --- /dev/null +++ b/fill.go @@ -0,0 +1,21 @@ +package plumbing + +import "io" + +type fillReader struct { + b byte +} + +func (r *fillReader) Read(p []byte) (int, error) { + for i := range p { + p[i] = r.b + } + + return len(p), nil +} + +// FillReader returns an io.Reader such that Read calls return an unlimited +// stream of b bytes. +func FillReader(b byte) io.Reader { + return &fillReader{b} +} diff --git a/zero.go b/zero.go new file mode 100644 index 0000000..943a35d --- /dev/null +++ b/zero.go @@ -0,0 +1,18 @@ +package plumbing + +import "io" + +type devZero struct { + io.Reader +} + +func (w *devZero) Write(p []byte) (int, error) { + return len(p), nil +} + +// DevZero returns an io.ReadWriter that behaves like /dev/zero such that Read +// calls return an unlimited stream of zero bytes and all Write calls succeed +// without doing anything. +func DevZero() io.ReadWriter { + return &devZero{FillReader(0)} +} diff --git a/zero_test.go b/zero_test.go new file mode 100644 index 0000000..32d5d40 --- /dev/null +++ b/zero_test.go @@ -0,0 +1,36 @@ +package plumbing_test + +import ( + "bytes" + "io" + "testing" + + "github.com/bodgit/plumbing" + "github.com/stretchr/testify/assert" +) + +const limit = 10 + +func TestDevZero(t *testing.T) { + t.Parallel() + + rw := plumbing.DevZero() + b := new(bytes.Buffer) + + n, err := io.Copy(b, io.LimitReader(rw, limit)) + if err != nil { + t.Fatal(err) + } + + assert.Equal(t, limit, int(n)) + assert.Equal(t, limit, b.Len()) + assert.Equal(t, bytes.Repeat([]byte{0x00}, limit), b.Bytes()) + + n, err = io.Copy(rw, b) + if err != nil { + t.Fatal(err) + } + + assert.Equal(t, limit, int(n)) + assert.Equal(t, 0, b.Len()) +}