Skip to content

Commit

Permalink
Add FillReader and DevZero
Browse files Browse the repository at this point in the history
  • Loading branch information
bodgit committed Nov 18, 2022
1 parent 469156c commit 9643ea5
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 0 deletions.
21 changes: 21 additions & 0 deletions fill.go
Original file line number Diff line number Diff line change
@@ -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}
}
18 changes: 18 additions & 0 deletions zero.go
Original file line number Diff line number Diff line change
@@ -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)}
}
36 changes: 36 additions & 0 deletions zero_test.go
Original file line number Diff line number Diff line change
@@ -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())
}

0 comments on commit 9643ea5

Please sign in to comment.