123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- package mocks
- import (
- "io"
- "net"
- "time"
- )
- // Mocks a net.Conn - server and client sides.
- // See server_test.go for usage examples
- // Taken from https://github.com/jordwest/mock-conn
- // This great answer http://stackoverflow.com/questions/1976950/simulate-a-tcp-connection-in-go
- // Addr is a fake network interface which implements the net.Addr interface
- type Addr struct {
- NetworkString string
- AddrString string
- }
- func (a Addr) Network() string {
- return a.NetworkString
- }
- func (a Addr) String() string {
- return a.AddrString
- }
- // End is one 'end' of a simulated connection.
- type End struct {
- Reader *io.PipeReader
- Writer *io.PipeWriter
- }
- func (e End) Close() error {
- if err := e.Writer.Close(); err != nil {
- return err
- }
- if err := e.Reader.Close(); err != nil {
- return err
- }
- return nil
- }
- func (e End) Read(data []byte) (n int, err error) { return e.Reader.Read(data) }
- func (e End) Write(data []byte) (n int, err error) { return e.Writer.Write(data) }
- func (e End) LocalAddr() net.Addr {
- return Addr{
- NetworkString: "tcp",
- AddrString: "127.0.0.1",
- }
- }
- func (e End) RemoteAddr() net.Addr {
- return Addr{
- NetworkString: "tcp",
- AddrString: "127.0.0.1",
- }
- }
- func (e End) SetDeadline(t time.Time) error { return nil }
- func (e End) SetReadDeadline(t time.Time) error { return nil }
- func (e End) SetWriteDeadline(t time.Time) error { return nil }
- // MockConn facilitates testing by providing two connected ReadWriteClosers
- // each of which can be used in place of a net.Conn
- type Conn struct {
- Server *End
- Client *End
- }
- func NewConn() *Conn {
- // A connection consists of two pipes:
- // Client | Server
- // writes ===> reads
- // reads <=== writes
- serverRead, clientWrite := io.Pipe()
- clientRead, serverWrite := io.Pipe()
- return &Conn{
- Server: &End{
- Reader: serverRead,
- Writer: serverWrite,
- },
- Client: &End{
- Reader: clientRead,
- Writer: clientWrite,
- },
- }
- }
- func (c *Conn) Close() error {
- if err := c.Server.Close(); err != nil {
- return err
- }
- if err := c.Client.Close(); err != nil {
- return err
- }
- return nil
- }
|