storj.io/uplink@v1.13.0/private/storage/streams/splitter/common_test.go (about) 1 // Copyright (C) 2023 Storj Labs, Inc. 2 // See LICENSE for copying information. 3 4 package splitter 5 6 import ( 7 "io" 8 "math/rand" 9 ) 10 11 var emptyLimitReaderBuf [4096]byte 12 13 type emptyLimitReader struct{ n int } 14 15 func (e *emptyLimitReader) Read(p []byte) (n int, err error) { 16 if e.n == 0 { 17 return 0, io.EOF 18 } 19 if e.n < len(p) { 20 p = p[:e.n] 21 } 22 for i := range p { 23 p[i] = 0 24 } 25 e.n -= len(p) 26 return len(p), nil 27 } 28 29 func (e *emptyLimitReader) WriteTo(w io.Writer) (n int64, err error) { 30 for e.n > 0 { 31 buf := emptyLimitReaderBuf[:] 32 if e.n < len(buf) { 33 buf = buf[:e.n] 34 } 35 36 nn, err := w.Write(buf) 37 n += int64(nn) 38 e.n -= nn 39 40 if err != nil { 41 return n, err 42 } 43 } 44 45 return n, err 46 } 47 48 type emptyReader struct{} 49 50 func (emptyReader) Read(p []byte) (int, error) { return len(p), nil } 51 52 type randomWriter struct{ io.Writer } 53 54 func (r randomWriter) Write(p []byte) (n int, err error) { 55 for len(p) > 0 { 56 nn, err := r.Writer.Write(p[:rand.Intn(len(p)+1)]) 57 n += nn 58 p = p[nn:] 59 60 if err != nil { 61 return n, err 62 } 63 } 64 65 return n, nil 66 }