1package beanstalk 2 3import ( 4 "fmt" 5 "io" 6 "strings" 7) 8 9type mockError struct { 10 exp []byte 11 got []byte 12} 13 14func (e mockError) Error() string { 15 return fmt.Sprintf( 16 "mock error: exp %#v, got %#v", 17 string(e.exp), 18 string(e.got), 19 ) 20} 21 22type mockIO struct { 23 recv *strings.Reader 24 send *strings.Reader 25} 26 27func mock(recv, send string) io.ReadWriteCloser { 28 return &mockIO{strings.NewReader(recv), strings.NewReader(send)} 29} 30 31func (m mockIO) Read(b []byte) (int, error) { 32 return m.send.Read(b) 33} 34 35func (m mockIO) Write(got []byte) (n int, err error) { 36 exp := make([]byte, len(got)) 37 n, err = m.recv.Read(exp) 38 if err != nil { 39 return n, err 40 } 41 exp = exp[:n] 42 for i := range exp { 43 if exp[i] != got[i] { 44 return i, mockError{exp, got} 45 } 46 } 47 if n != len(got) { 48 return n, mockError{exp, got} 49 } 50 return n, err 51} 52 53func (m mockIO) Close() error { 54 if m.recv.Len() == 0 && m.send.Len() == 0 { 55 return nil 56 } 57 if m.recv.Len() > 0 { 58 b := make([]byte, m.recv.Len()) 59 m.recv.Read(b) 60 return mockError{b, nil} 61 } 62 b := make([]byte, m.send.Len()) 63 m.send.Read(b) 64 return mockError{b, nil} 65} 66