diff --git a/Doc/reference/ldap.rst b/Doc/reference/ldap.rst index b13aa6f..69e2462 100644 --- a/Doc/reference/ldap.rst +++ b/Doc/reference/ldap.rst @@ -699,7 +699,9 @@ and wait for and return with the server's result, or with and the value *value*. The synchronous forms returns ``True`` or ``False``. The asynchronous forms returns the message ID of the initiated request, and the result of the asynchronous compare can be obtained using - :py:meth:`result()`. + :py:meth:`result()`. The operation can fail with an exception, e.g. + :py:exc:`ldap.NO_SUCH_OBJECT` when *dn* does not exist or + :py:exc:`ldap.UNDEFINED_TYPE` for an invalid attribute. Note that the asynchronous technique yields the answer by raising the exception objects :py:exc:`ldap.COMPARE_TRUE` or diff --git a/Lib/ldap/ldapobject.py b/Lib/ldap/ldapobject.py index e4e6841..f7443fa 100644 --- a/Lib/ldap/ldapobject.py +++ b/Lib/ldap/ldapobject.py @@ -526,7 +526,7 @@ def compare_ext_s(self,dn,attr,value,serverctrls=None,clientctrls=None): except ldap.COMPARE_FALSE: return False raise ldap.PROTOCOL_ERROR( - 'Compare operation returned wrong result: %r' % (ldap_res) + 'Compare operation returned wrong result: %r' % (ldap_res,) ) def compare(self,dn,attr,value): diff --git a/Tests/t_ldapobject.py b/Tests/t_ldapobject.py index 0619d51..67adeb2 100644 --- a/Tests/t_ldapobject.py +++ b/Tests/t_ldapobject.py @@ -661,6 +661,18 @@ def test_compare_s_false(self): result = l.compare_s('cn=Foo1,%s' % base, 'cn', b'Foo2') self.assertIs(result, False) + def test_compare_s_notfound(self): + base = self.server.suffix + l = self._ldap_conn + with self.assertRaises(ldap.NO_SUCH_OBJECT): + result = l.compare_s('cn=invalid,%s' % base, 'cn', b'Foo2') + + def test_compare_s_invalidattr(self): + base = self.server.suffix + l = self._ldap_conn + with self.assertRaises(ldap.UNDEFINED_TYPE): + result = l.compare_s('cn=Foo1,%s' % base, 'invalidattr', b'invalid') + class Test01_ReconnectLDAPObject(Test00_SimpleLDAPObject): """