Author: tpot Date: 2006-05-02 05:14:00 +0000 (Tue, 02 May 2006) New Revision: 15389
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=15389 Log: Add some better torture tests for LdbMessage. Fix up behaviour of Ldb.__setitem__() function. It should overwrite the element data. Add wrapper for ldb_msg_sanity_check(). Modified: branches/SAMBA_4_0/source/lib/ldb/swig/Ldb.py branches/SAMBA_4_0/source/lib/ldb/swig/ldb.i branches/SAMBA_4_0/source/scripting/swig/torture/torture_ldb.py Changeset: Modified: branches/SAMBA_4_0/source/lib/ldb/swig/Ldb.py =================================================================== --- branches/SAMBA_4_0/source/lib/ldb/swig/Ldb.py 2006-05-02 02:36:11 UTC (rev 15388) +++ branches/SAMBA_4_0/source/lib/ldb/swig/Ldb.py 2006-05-02 05:14:00 UTC (rev 15389) @@ -20,6 +20,15 @@ # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # +# +# Interface notes: +# +# - should an empty dn be represented as None, or an empty string? +# +# - should single-valued attributes be a string, or a list with one +# element? +# + from ldb import * # Global initialisation @@ -62,6 +71,9 @@ def __setattr__(self, attr, value): if attr == 'dn': self.msg.dn = ldb_dn_explode(self.msg, value) + if self.msg.dn == None: + err = LDB_ERR_INVALID_DN_SYNTAX + raise LdbError(err, ldb_strerror(err)) return self.__dict__[attr] = value @@ -78,6 +90,7 @@ for i in range(elt.num_values)] def __setitem__(self, key, value): + ldb_msg_remove_attr(self.msg, key) if type(value) in (list, tuple): [ldb_msg_add_value(self.msg, key, v) for v in value] else: @@ -99,6 +112,11 @@ def items(self): return [(k, self[k]) for k in self.keys()] + # Misc stuff + + def sanity_check(self): + return ldb_msg_sanity_check(self.msg) + class Ldb: """A class representing a binding to a ldb file.""" Modified: branches/SAMBA_4_0/source/lib/ldb/swig/ldb.i =================================================================== --- branches/SAMBA_4_0/source/lib/ldb/swig/ldb.i 2006-05-02 02:36:11 UTC (rev 15388) +++ branches/SAMBA_4_0/source/lib/ldb/swig/ldb.i 2006-05-02 05:14:00 UTC (rev 15389) @@ -199,13 +199,18 @@ * Wrap ldb functions */ +/* Initialisation */ + int ldb_global_init(void); - struct ldb_context *ldb_init(TALLOC_CTX *mem_ctx); +/* Error handling */ + const char *ldb_errstring(struct ldb_context *ldb); const char *ldb_strerror(int ldb_err); +/* Top-level ldb operations */ + int ldb_connect(struct ldb_context *ldb, const char *url, unsigned int flags, const char *options[]); int ldb_search(struct ldb_context *ldb, const struct ldb_dn *base, enum ldb_scope scope, const char *expression, const char * const *attrs, struct ldb_result **OUT); @@ -216,9 +221,20 @@ int ldb_add(struct ldb_context *ldb, const struct ldb_message *message); +/* Ldb message operations */ + struct ldb_message *ldb_msg_new(void *mem_ctx); + struct ldb_message_element *ldb_msg_find_element(const struct ldb_message *msg, const char *attr_name); + int ldb_msg_add_value(struct ldb_message *msg, const char *attr_name, const struct ldb_val *INPUT); +void ldb_msg_remove_attr(struct ldb_message *msg, const char *attr); + +int ldb_msg_sanity_check(struct ldb_message *msg); + +/* DN operations */ + struct ldb_dn *ldb_dn_explode(void *mem_ctx, const char *dn); + char *ldb_dn_linearize(void *mem_ctx, const struct ldb_dn *dn); Modified: branches/SAMBA_4_0/source/scripting/swig/torture/torture_ldb.py =================================================================== --- branches/SAMBA_4_0/source/scripting/swig/torture/torture_ldb.py 2006-05-02 02:36:11 UTC (rev 15388) +++ branches/SAMBA_4_0/source/scripting/swig/torture/torture_ldb.py 2006-05-02 05:14:00 UTC (rev 15389) @@ -1,18 +1,83 @@ #!/usr/bin/python +# +# A torture test for the Python Ldb bindings. Also a short guide on +# how the API works. +# -import Ldb, sys +from Ldb import * -def test(cond, msg): +# Helpers + +def t(cond, msg): + """Test a condition.""" if not cond: - print 'FAILED:', msg - sys.exit(1) + raise RuntimeError('FAILED: %s' % msg) +# # Torture LdbMessage +# -m = Ldb.LdbMessage() +m = LdbMessage() + +# Empty message + +t(m.keys() == [], 'empty msg') +t(m.dn == None, 'empty dn') + +t(m.sanity_check() == LDB_ERR_INVALID_DN_SYNTAX, 'sanity check') + +# Test invalid dn + +try: + m.dn = 'invalid dn' +except LdbError, arg: + if arg[0] != LDB_ERR_INVALID_DN_SYNTAX: + raise +else: + t(False, 'LdbError not raised') + +# Test valid dn + +m.dn = 'name=spotty' +t(m.dn == 'name=spotty', 'specified dn') + +t(m.sanity_check() == LDB_SUCCESS, 'sanity check') + +# Test some single-valued attributes + m['animal'] = 'dog' m['name'] = 'spotty' -test(m.keys() == ['animal', 'name'], 'keys() test failed') -test(m.values() == [['dog'], ['spotty']], 'values() test failed') -test(m.items() == [('animal', ['dog']), ('name', ['spotty'])], 'items() test failed') +t(m.keys() == ['animal', 'name'], 'keys() test failed') +t(m.values() == [['dog'], ['spotty']], 'values() test failed') +t(m.items() == [('animal', ['dog']), ('name', ['spotty'])], + 'items() test failed') + +t(m.sanity_check() == LDB_SUCCESS, 'sanity check') + +m['animal'] = 'canine' +t(m['animal'] == ['canine'], 'replace value failed') + +# Test a multi-valued attribute + +names = ['spotty', 'foot'] +m['name'] = names + +t(m['name'] == names, 'multi-valued attr failed') + +t(m.sanity_check() == LDB_SUCCESS, 'sanity check') + +# Test non-string attributes + +try: + m['foo'] = 42 +except TypeError: + pass +else: + t(False, 'TypeError not raised') + +# +# Torture Ldb +# + +l = Ldb('foo.ldb')