From afeeccd1300b75ba2bc2c3040d78986b15a96c1c Mon Sep 17 00:00:00 2001 From: Zac Bergquist Date: Wed, 6 Sep 2023 01:38:20 -0600 Subject: [PATCH] feat: add support for Go 1.13's errors.Is/As functions (#461) 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 --- v3/error.go | 2 ++ v3/error_test.go | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/v3/error.go b/v3/error.go index b9d6452..3c2559e 100644 --- a/v3/error.go +++ b/v3/error.go @@ -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). diff --git a/v3/error_test.go b/v3/error_test.go index 63018ee..c115e00 100644 --- a/v3/error_test.go +++ b/v3/error_test.go @@ -2,6 +2,7 @@ package ldap import ( "errors" + "io" "net" "strings" "testing" @@ -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")