svn commit: samba r15389 - in branches/SAMBA_4_0/source: lib/ldb/swig scripting/swig/torture

tpot at samba.org tpot at samba.org
Tue May 2 05:14:06 GMT 2006


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')



More information about the samba-cvs mailing list