assertions are ued. With suite.Required() there are issues in getting the test results correct. Instead, use standard assertions and use suite.T().Failed() to do early returns.
70 lines
1.2 KiB
Go
70 lines
1.2 KiB
Go
package iowrappers
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"io"
|
|
"log"
|
|
)
|
|
|
|
type ChannelReadWriter struct {
|
|
ctx context.Context
|
|
receiver <-chan []byte
|
|
// bytes that were read and that did not fit
|
|
readBuf []byte
|
|
sender chan<- []byte
|
|
closed bool
|
|
}
|
|
|
|
func NewChannelReadWriter(ctx context.Context, receiver <-chan []byte,
|
|
sender chan<- []byte) *ChannelReadWriter {
|
|
return &ChannelReadWriter{
|
|
ctx: ctx,
|
|
receiver: receiver,
|
|
sender: sender,
|
|
closed: false,
|
|
}
|
|
}
|
|
|
|
func (rw *ChannelReadWriter) Read(p []byte) (n int, err error) {
|
|
nread := copy(p, rw.readBuf)
|
|
if nread > 0 {
|
|
log.Printf("Read %v bytes", nread)
|
|
rw.readBuf = rw.readBuf[nread:]
|
|
return nread, nil
|
|
}
|
|
|
|
select {
|
|
case <-rw.ctx.Done():
|
|
return 0, io.EOF
|
|
case data, ok := <-rw.receiver:
|
|
if !ok {
|
|
return 0, io.EOF
|
|
}
|
|
nread = copy(p, data)
|
|
rw.readBuf = data[nread:]
|
|
return nread, nil
|
|
}
|
|
|
|
}
|
|
func (rw *ChannelReadWriter) Write(p []byte) (n int, err error) {
|
|
if rw.closed {
|
|
return 0, errors.New("Write on closed channel")
|
|
}
|
|
select {
|
|
case <-rw.ctx.Done():
|
|
rw.Close()
|
|
return 0, io.EOF
|
|
case rw.sender <- p:
|
|
}
|
|
return len(p), nil
|
|
}
|
|
|
|
func (rw *ChannelReadWriter) Close() error {
|
|
if !rw.closed {
|
|
close(rw.sender)
|
|
rw.closed = true
|
|
}
|
|
return nil
|
|
}
|