Skip to content

Commit

Permalink
feat: add support for Go 1.13's errors.Is/As functions (#461)
Browse files Browse the repository at this point in the history
ldap.Error wraps an underlying error, but doesn't interoperate
with errors.Is or errors.As since it doesn't expose an Unwrap method.
This change makes it easier to detect things like an LDAP error
caused due to a network timeout.

Co-authored-by: Christopher Puschmann <cp@lumen.sh>
  • Loading branch information
zmb3 and cpuschma authored Sep 6, 2023
1 parent 7f97b82 commit afeeccd
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 0 deletions.
2 changes: 2 additions & 0 deletions v3/error.go
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,8 @@ func (e *Error) Error() string {
return fmt.Sprintf("LDAP Result Code %d %q: %s", e.ResultCode, LDAPResultCodeMap[e.ResultCode], e.Err.Error())
}

func (e *Error) Unwrap() error { return e.Err }

// GetLDAPError creates an Error out of a BER packet representing a LDAPResult
// The return is an error object. It can be casted to a Error structure.
// This function returns nil if resultCode in the LDAPResult sequence is success(0).
Expand Down
19 changes: 19 additions & 0 deletions v3/error_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package ldap

import (
"errors"
"io"
"net"
"strings"
"testing"
Expand Down Expand Up @@ -103,6 +104,24 @@ func TestGetLDAPErrorInvalidResponse(t *testing.T) {
}
}

func TestErrorIs(t *testing.T) {
err := NewError(ErrorNetwork, io.EOF)
if !errors.Is(err, io.EOF) {
t.Errorf("Expected an io.EOF error: %v", err)
}
}

func TestErrorAs(t *testing.T) {
var netErr net.InvalidAddrError = "invalid addr"
err := NewError(ErrorNetwork, netErr)

var target net.InvalidAddrError
ok := errors.As(err, &target)
if !ok {
t.Error("Expected an InvalidAddrError")
}
}

// TestGetLDAPErrorSuccess tests parsing of a result with no error (resultCode == 0).
func TestGetLDAPErrorSuccess(t *testing.T) {
bindResponse := ber.Encode(ber.ClassApplication, ber.TypeConstructed, ApplicationBindResponse, nil, "Bind Response")
Expand Down

0 comments on commit afeeccd

Please sign in to comment.