svn commit: samba r26488 - in branches/SAMBA_4_0: source/dsdb/samdb/ldb_modules testprogs/ejs

abartlet at samba.org abartlet at samba.org
Mon Dec 17 05:56:43 GMT 2007


Author: abartlet
Date: 2007-12-17 05:56:42 +0000 (Mon, 17 Dec 2007)
New Revision: 26488

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=26488

Log:
Implement tests for the ranged_results module.

Untested code is broken code, so rework the module until it passes...

It turns out that AD puts search attributes onto the wire in the
reverse order to what Samba does.  This complicates exact value
matching, so this is skipped for now.

Andrew Bartlett

Modified:
   branches/SAMBA_4_0/source/dsdb/samdb/ldb_modules/ranged_results.c
   branches/SAMBA_4_0/testprogs/ejs/ldap.js


Changeset:
Modified: branches/SAMBA_4_0/source/dsdb/samdb/ldb_modules/ranged_results.c
===================================================================
--- branches/SAMBA_4_0/source/dsdb/samdb/ldb_modules/ranged_results.c	2007-12-17 05:53:37 UTC (rev 26487)
+++ branches/SAMBA_4_0/source/dsdb/samdb/ldb_modules/ranged_results.c	2007-12-17 05:56:42 UTC (rev 26488)
@@ -60,9 +60,10 @@
 		if (strncasecmp(p, ";range=", strlen(";range=")) != 0) {
 			continue;
 		}
-		if (sscanf(p, ";range=%u-*", &start) == 1) {
+		if (sscanf(p, ";range=%u-%u", &start, &end) == 2) {
+		} else if (sscanf(p, ";range=%u-*", &start) == 1) {
 			end = (unsigned int)-1;
-		} else if (sscanf(p, ";range=%u-%u", &start, &end) != 2) {
+		} else {
 			continue;
 		}
 		new_attr = talloc_strndup(orig_req, 
@@ -82,39 +83,44 @@
 			ldb_asprintf_errstring(ldb, "range request error: start must not be greater than end");
 			return LDB_ERR_UNWILLING_TO_PERFORM;
 		}
-		if (end >= el->num_values) {
+		if (end >= (el->num_values - 1)) {
 			/* Need to leave the requested attribute in
 			 * there (so add an empty one to match) */
 			end_str = "*";
-			end = el->num_values;
-			ret = ldb_msg_add_empty(ares->message, orig_req->op.search.attrs[i], 
-					       0, NULL);
-			if (ret != LDB_SUCCESS) {
-				return ret;
-			}
+			end = el->num_values - 1;
 		} else {
 			end_str = talloc_asprintf(el, "%u", end);
+			if (!end_str) {
+				ldb_oom(ldb);
+				return LDB_ERR_OPERATIONS_ERROR;
+			}
 		}
-		orig_values = el->values;
-		orig_num_values = el->num_values;
-
-		if ((start + end < start) || (start + end < end)) {
-			ldb_asprintf_errstring(ldb, "range request error: start or end would overflow!");
-			return LDB_ERR_UNWILLING_TO_PERFORM;
+		/* If start is greater then where we noe find the end to be */
+		if (start > end) {
+			el->num_values = 0;
+			el->values = NULL;
+		} else {
+			orig_values = el->values;
+			orig_num_values = el->num_values;
+			
+			if ((start + end < start) || (start + end < end)) {
+				ldb_asprintf_errstring(ldb, "range request error: start or end would overflow!");
+				return LDB_ERR_UNWILLING_TO_PERFORM;
+			}
+			
+			el->num_values = 0;
+			
+			el->values = talloc_array(el, struct ldb_val, (end - start) + 1);
+			if (!el->values) {
+				ldb_oom(ldb);
+				return LDB_ERR_OPERATIONS_ERROR;
+			}
+			for (j=start; j <= end; j++) {
+				el->values[el->num_values] = orig_values[j];
+				el->num_values++;
+			}
 		}
-
-		el->values = talloc_array(el, struct ldb_val, end - start);
-		el->num_values = 0;
-
-		if (!el->values) {
-			ldb_oom(ldb);
-			return LDB_ERR_OPERATIONS_ERROR;
-		}
-		for (j=start; j < end; j++) {
-			el->values[el->num_values] = orig_values[j];
-			el->num_values++;
-		}
-		el->name = talloc_asprintf(el, "%s;Range=%u-%s", el->name, start, end_str);
+		el->name = talloc_asprintf(el, "%s;range=%u-%s", el->name, start, end_str);
 		if (!el->name) {
 			ldb_oom(ldb);
 			return LDB_ERR_OPERATIONS_ERROR;

Modified: branches/SAMBA_4_0/testprogs/ejs/ldap.js
===================================================================
--- branches/SAMBA_4_0/testprogs/ejs/ldap.js	2007-12-17 05:53:37 UTC (rev 26487)
+++ branches/SAMBA_4_0/testprogs/ejs/ldap.js	2007-12-17 05:56:42 UTC (rev 26488)
@@ -161,10 +161,10 @@
 servicePrincipalName: cifs/ldaptest2computer
 ");
 
-		if (ok.error != 0) {
-			println("Failed to replace servicePrincpalName:" + ok.errstr);
-			assert(ok.error == 20);
-		}
+	    if (ok.error != 0) {
+		    println("Failed to replace servicePrincpalName:" + ok.errstr);
+		    assert(ok.error == 20);
+	    }
 
 	    ok = ldb.modify("
 dn: cn=ldaptest2computer,cn=computers," + base_dn + "
@@ -174,12 +174,156 @@
 ");
 
 //LDB_ERR_ATTRIBUTE_OR_VALUE_EXISTS
-		if (ok.error != 20) {
-			println("Expected error LDB_ERR_ATTRIBUTE_OR_VALUE_EXISTS, got :" + ok.errstr);
+	    if (ok.error != 20) {
+		    println("Expected error LDB_ERR_ATTRIBUTE_OR_VALUE_EXISTS, got :" + ok.errstr);
 			assert(ok.error == 20);
-		}
+	    }
+	    
+	    println("Testing ranged results");
+	    ok = ldb.modify("
+dn: cn=ldaptest2computer,cn=computers," + base_dn + "
+changetype: modify
+replace: servicePrincipalName
+");
+	    if (ok.error != 0) {
+		    println("Failed to replace servicePrincpalName:" + ok.errstr);
+		    assert(ok.error == 0);
+	    }
+	    
+	    ok = ldb.modify("
+dn: cn=ldaptest2computer,cn=computers," + base_dn + "
+changetype: modify
+add: servicePrincipalName
+servicePrincipalName: host/ldaptest2computer0
+servicePrincipalName: host/ldaptest2computer1
+servicePrincipalName: host/ldaptest2computer2
+servicePrincipalName: host/ldaptest2computer3
+servicePrincipalName: host/ldaptest2computer4
+servicePrincipalName: host/ldaptest2computer5
+servicePrincipalName: host/ldaptest2computer6
+servicePrincipalName: host/ldaptest2computer7
+servicePrincipalName: host/ldaptest2computer8
+servicePrincipalName: host/ldaptest2computer9
+servicePrincipalName: host/ldaptest2computer10
+servicePrincipalName: host/ldaptest2computer11
+servicePrincipalName: host/ldaptest2computer12
+servicePrincipalName: host/ldaptest2computer13
+servicePrincipalName: host/ldaptest2computer14
+servicePrincipalName: host/ldaptest2computer15
+servicePrincipalName: host/ldaptest2computer16
+servicePrincipalName: host/ldaptest2computer17
+servicePrincipalName: host/ldaptest2computer18
+servicePrincipalName: host/ldaptest2computer19
+servicePrincipalName: host/ldaptest2computer20
+servicePrincipalName: host/ldaptest2computer21
+servicePrincipalName: host/ldaptest2computer22
+servicePrincipalName: host/ldaptest2computer23
+servicePrincipalName: host/ldaptest2computer24
+servicePrincipalName: host/ldaptest2computer25
+servicePrincipalName: host/ldaptest2computer26
+servicePrincipalName: host/ldaptest2computer27
+servicePrincipalName: host/ldaptest2computer28
+servicePrincipalName: host/ldaptest2computer29
+");
 
-	ok = ldb.add("
+	    if (ok.error != 0) {
+		    println("Failed to replace servicePrincpalName:" + ok.errstr);
+		    assert(ok.error == 0);
+	    }
+	    
+	    
+	    var attrs = new Array("servicePrincipalName;range=0-*");
+	    var res = ldb.search("(cn=ldaptest2computer))", base_dn, ldb.SCOPE_SUBTREE, attrs);
+	    if (res.error != 0 || res.msgs.length != 1) {
+		    println("Could not find (cn=ldaptest2computer)");
+		    assert(res.error == 0);
+		    assert(res.msgs.length == 1);
+	    }
+//	    println(res.msgs[0]["servicePrincipalName;range=0-*"].length);
+	    assert(res.msgs[0]["servicePrincipalName;range=0-*"].length == 30);
+
+	    var attrs = new Array("servicePrincipalName;range=0-19");
+	    var res = ldb.search("(cn=ldaptest2computer))", base_dn, ldb.SCOPE_SUBTREE, attrs);
+	    if (res.error != 0 || res.msgs.length != 1) {
+		    println("Could not find (cn=ldaptest2computer)");
+		    assert(res.error == 0);
+		    assert(res.msgs.length == 1);
+	    }
+//	    println(res.msgs[0]["servicePrincipalName;range=0-19"].length);
+	    assert(res.msgs[0]["servicePrincipalName;range=0-19"].length == 20);
+
+	    var attrs = new Array("servicePrincipalName;range=0-30");
+	    var res = ldb.search("(cn=ldaptest2computer))", base_dn, ldb.SCOPE_SUBTREE, attrs);
+	    if (res.error != 0 || res.msgs.length != 1) {
+		    println("Could not find (cn=ldaptest2computer)");
+		    assert(res.error == 0);
+		    assert(res.msgs.length == 1);
+	    }
+	    assert(res.msgs[0]["servicePrincipalName;range=0-*"].length == 30);
+
+	    var attrs = new Array("servicePrincipalName;range=0-40");
+	    var res = ldb.search("(cn=ldaptest2computer))", base_dn, ldb.SCOPE_SUBTREE, attrs);
+	    if (res.error != 0 || res.msgs.length != 1) {
+		    println("Could not find (cn=ldaptest2computer)");
+		    assert(res.error == 0);
+		    assert(res.msgs.length == 1);
+	    }
+	    assert(res.msgs[0]["servicePrincipalName;range=0-*"].length == 30);
+
+	    var attrs = new Array("servicePrincipalName;range=30-40");
+	    var res = ldb.search("(cn=ldaptest2computer))", base_dn, ldb.SCOPE_SUBTREE, attrs);
+	    if (res.error != 0 || res.msgs.length != 1) {
+		    println("Could not find (cn=ldaptest2computer)");
+		    assert(res.error == 0);
+		    assert(res.msgs.length == 1);
+	    }
+	    assert(res.msgs[0]["servicePrincipalName;range=30-*"].length == 0);
+
+	    var attrs = new Array("servicePrincipalName;range=10-40");
+	    var res = ldb.search("(cn=ldaptest2computer))", base_dn, ldb.SCOPE_SUBTREE, attrs);
+	    if (res.error != 0 || res.msgs.length != 1) {
+		    println("Could not find (cn=ldaptest2computer)");
+		    assert(res.error == 0);
+		    assert(res.msgs.length == 1);
+	    }
+	    assert(res.msgs[0]["servicePrincipalName;range=10-*"].length == 20);
+//	    var pos_11 = res.msgs[0]["servicePrincipalName;range=10-*"][18];
+
+	    var attrs = new Array("servicePrincipalName;range=11-40");
+	    var res = ldb.search("(cn=ldaptest2computer))", base_dn, ldb.SCOPE_SUBTREE, attrs);
+	    if (res.error != 0 || res.msgs.length != 1) {
+		    println("Could not find (cn=ldaptest2computer)");
+		    assert(res.error == 0);
+		    assert(res.msgs.length == 1);
+	    }
+	    assert(res.msgs[0]["servicePrincipalName;range=11-*"].length == 19);
+//	    println(res.msgs[0]["servicePrincipalName;range=11-*"][18]);
+//	    println(pos_11);
+//	    assert((res.msgs[0]["servicePrincipalName;range=11-*"][18]) == pos_11);
+
+	    var attrs = new Array("servicePrincipalName;range=11-15");
+	    var res = ldb.search("(cn=ldaptest2computer))", base_dn, ldb.SCOPE_SUBTREE, attrs);
+	    if (res.error != 0 || res.msgs.length != 1) {
+		    println("Could not find (cn=ldaptest2computer)");
+		    assert(res.error == 0);
+		    assert(res.msgs.length == 1);
+	    }
+	    assert(res.msgs[0]["servicePrincipalName;range=11-15"].length == 5);
+//	    assert(res.msgs[0]["servicePrincipalName;range=11-15"][4] == pos_11);
+
+	    var attrs = new Array("servicePrincipalName");
+	    var res = ldb.search("(cn=ldaptest2computer))", base_dn, ldb.SCOPE_SUBTREE, attrs);
+	    if (res.error != 0 || res.msgs.length != 1) {
+		    println("Could not find (cn=ldaptest2computer)");
+		    assert(res.error == 0);
+		    assert(res.msgs.length == 1);
+	    }
+//	    println(res.msgs[0]["servicePrincipalName"][18]);
+//	    println(pos_11);
+	    assert(res.msgs[0]["servicePrincipalName"].length == 30);
+//	    assert(res.msgs[0]["servicePrincipalName"][18] == pos_11);
+
+	    ok = ldb.add("
 dn: cn=ldaptestuser2,cn=useRs," + base_dn + "
 objectClass: person
 objectClass: user



More information about the samba-cvs mailing list