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  }