package mocks type MockPerfectBiConn struct { directionA chan byte directionB chan byte } func NewMockPerfectBiConn(bufSize int) MockPerfectBiConn { return MockPerfectBiConn{ directionA: make(chan byte, bufSize), directionB: make(chan byte, bufSize), } } func (bc MockPerfectBiConn) SideA() MockPerfectConn { return MockPerfectConn{inbound: bc.directionA, outbound: bc.directionB} } func (bc MockPerfectBiConn) SideB() MockPerfectConn { return MockPerfectConn{inbound: bc.directionB, outbound: bc.directionA} } type MockPerfectConn struct { inbound chan byte outbound chan byte } func (c MockPerfectConn) Read(p []byte) (n int, err error) { for i := range p { if i == 0 { p[i] = <-c.inbound } else { select { case b := <-c.inbound: p[i] = b default: return i, nil } } } return len(p), nil } func (c MockPerfectConn) Write(p []byte) (n int, err error) { for _, b := range p { c.outbound <- b } return len(p), nil } func (c MockPerfectConn) NonBlockingRead(p []byte) (n int, err error) { for i := range p { select { case b := <-c.inbound: p[i] = b default: return i, nil } } return len(p), nil }