diff options
Diffstat (limited to 'vendor/github.com/go-ldap/ldap/error_test.go')
-rw-r--r-- | vendor/github.com/go-ldap/ldap/error_test.go | 77 |
1 files changed, 75 insertions, 2 deletions
diff --git a/vendor/github.com/go-ldap/ldap/error_test.go b/vendor/github.com/go-ldap/ldap/error_test.go index 4ec720d9f..c010ebe3e 100644 --- a/vendor/github.com/go-ldap/ldap/error_test.go +++ b/vendor/github.com/go-ldap/ldap/error_test.go @@ -1,7 +1,11 @@ package ldap import ( + "errors" + "net" + "strings" "testing" + "time" "gopkg.in/asn1-ber.v1" ) @@ -16,8 +20,8 @@ func TestNilPacket(t *testing.T) { // Test for nil result kids := []*ber.Packet{ - &ber.Packet{}, // Unused - nil, // Can't be nil + {}, // Unused + nil, // Can't be nil } pack := &ber.Packet{Children: kids} code, _ = getLDAPResultCode(pack) @@ -25,5 +29,74 @@ func TestNilPacket(t *testing.T) { if code != ErrorUnexpectedResponse { t.Errorf("Should have an 'ErrorUnexpectedResponse' error in nil packets, got: %v", code) } +} + +// TestConnReadErr tests that an unexpected error reading from underlying +// connection bubbles up to the goroutine which makes a request. +func TestConnReadErr(t *testing.T) { + conn := &signalErrConn{ + signals: make(chan error), + } + + ldapConn := NewConn(conn, false) + ldapConn.Start() + + // Make a dummy search request. + searchReq := NewSearchRequest("dc=example,dc=com", ScopeWholeSubtree, DerefAlways, 0, 0, false, "(objectClass=*)", nil, nil) + + expectedError := errors.New("this is the error you are looking for") + + // Send the signal after a short amount of time. + time.AfterFunc(10*time.Millisecond, func() { conn.signals <- expectedError }) + + // This should block until the underlyiny conn gets the error signal + // which should bubble up through the reader() goroutine, close the + // connection, and + _, err := ldapConn.Search(searchReq) + if err == nil || !strings.Contains(err.Error(), expectedError.Error()) { + t.Errorf("not the expected error: %s", err) + } +} + +// signalErrConn is a helful type used with TestConnReadErr. It implements the +// net.Conn interface to be used as a connection for the test. Most methods are +// no-ops but the Read() method blocks until it receives a signal which it +// returns as an error. +type signalErrConn struct { + signals chan error +} + +// Read blocks until an error is sent on the internal signals channel. That +// error is returned. +func (c *signalErrConn) Read(b []byte) (n int, err error) { + return 0, <-c.signals +} + +func (c *signalErrConn) Write(b []byte) (n int, err error) { + return len(b), nil +} + +func (c *signalErrConn) Close() error { + close(c.signals) + return nil +} + +func (c *signalErrConn) LocalAddr() net.Addr { + return (*net.TCPAddr)(nil) +} + +func (c *signalErrConn) RemoteAddr() net.Addr { + return (*net.TCPAddr)(nil) +} + +func (c *signalErrConn) SetDeadline(t time.Time) error { + return nil +} + +func (c *signalErrConn) SetReadDeadline(t time.Time) error { + return nil +} +func (c *signalErrConn) SetWriteDeadline(t time.Time) error { + return nil } |