conn_mock.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package mocks
  2. import (
  3. "io"
  4. "net"
  5. "time"
  6. )
  7. // Mocks a net.Conn - server and client sides.
  8. // See server_test.go for usage examples
  9. // Taken from https://github.com/jordwest/mock-conn
  10. // This great answer http://stackoverflow.com/questions/1976950/simulate-a-tcp-connection-in-go
  11. // Addr is a fake network interface which implements the net.Addr interface
  12. type Addr struct {
  13. NetworkString string
  14. AddrString string
  15. }
  16. func (a Addr) Network() string {
  17. return a.NetworkString
  18. }
  19. func (a Addr) String() string {
  20. return a.AddrString
  21. }
  22. // End is one 'end' of a simulated connection.
  23. type End struct {
  24. Reader *io.PipeReader
  25. Writer *io.PipeWriter
  26. }
  27. func (e End) Close() error {
  28. if err := e.Writer.Close(); err != nil {
  29. return err
  30. }
  31. if err := e.Reader.Close(); err != nil {
  32. return err
  33. }
  34. return nil
  35. }
  36. func (e End) Read(data []byte) (n int, err error) { return e.Reader.Read(data) }
  37. func (e End) Write(data []byte) (n int, err error) { return e.Writer.Write(data) }
  38. func (e End) LocalAddr() net.Addr {
  39. return Addr{
  40. NetworkString: "tcp",
  41. AddrString: "127.0.0.1",
  42. }
  43. }
  44. func (e End) RemoteAddr() net.Addr {
  45. return Addr{
  46. NetworkString: "tcp",
  47. AddrString: "127.0.0.1",
  48. }
  49. }
  50. func (e End) SetDeadline(t time.Time) error { return nil }
  51. func (e End) SetReadDeadline(t time.Time) error { return nil }
  52. func (e End) SetWriteDeadline(t time.Time) error { return nil }
  53. // MockConn facilitates testing by providing two connected ReadWriteClosers
  54. // each of which can be used in place of a net.Conn
  55. type Conn struct {
  56. Server *End
  57. Client *End
  58. }
  59. func NewConn() *Conn {
  60. // A connection consists of two pipes:
  61. // Client | Server
  62. // writes ===> reads
  63. // reads <=== writes
  64. serverRead, clientWrite := io.Pipe()
  65. clientRead, serverWrite := io.Pipe()
  66. return &Conn{
  67. Server: &End{
  68. Reader: serverRead,
  69. Writer: serverWrite,
  70. },
  71. Client: &End{
  72. Reader: clientRead,
  73. Writer: clientWrite,
  74. },
  75. }
  76. }
  77. func (c *Conn) Close() error {
  78. if err := c.Server.Close(); err != nil {
  79. return err
  80. }
  81. if err := c.Client.Close(); err != nil {
  82. return err
  83. }
  84. return nil
  85. }