r19392: Use torture_setting_* rather than lp_parm_* where possible.
[sfrench/samba-autobuild/.git] / source4 / torture / ldap / cldap.c
index 86c261a3b003f02912855a9ac753afe9f42dbe9e..321feb639f8b648079982150c0b990d3fe13b778 100644 (file)
 
 #include "includes.h"
 #include "libcli/cldap/cldap.h"
+#include "libcli/ldap/ldap.h"
 #include "librpc/gen_ndr/ndr_nbt.h"
 #include "torture/torture.h"
+#include "lib/ldb/include/ldb.h"
 
 #define CHECK_STATUS(status, correct) do { \
        if (!NT_STATUS_EQUAL(status, correct)) { \
                ret = False; \
                goto done; \
        } \
-       if (DEBUGLVL(10)) { \
-               NDR_PRINT_UNION_DEBUG(nbt_cldap_netlogon, \
-                                     search.in.version & 0xF, \
-                                     &search.out.netlogon); \
-       } \
 } while (0)
 
 /*
@@ -165,16 +162,109 @@ done:
        return ret;     
 }
 
+/*
+  convert a ldap result message to a ldb message. This allows us to
+  use the convenient ldif dump routines in ldb to print out cldap
+  search results
+*/
+static struct ldb_message *ldap_msg_to_ldb(TALLOC_CTX *mem_ctx, struct ldap_SearchResEntry *res)
+{
+       struct ldb_message *msg;
+
+       msg = ldb_msg_new(mem_ctx);
+       msg->dn = ldb_dn_explode_or_special(msg, res->dn);
+       msg->num_elements = res->num_attributes;
+       msg->elements = talloc_steal(msg, res->attributes);
+       return msg;
+}
+
+/*
+  dump a set of cldap results
+*/
+static void cldap_dump_results(struct cldap_search *search)
+{
+       struct ldb_ldif ldif;
+       struct ldb_context *ldb;
+
+       if (!search || !(search->out.response)) {
+               return;
+       }
+
+       /* we need a ldb context to use ldb_ldif_write_file() */
+       ldb = ldb_init(NULL);
+
+       ZERO_STRUCT(ldif);
+       ldif.msg = ldap_msg_to_ldb(ldb, search->out.response);
+
+       ldb_ldif_write_file(ldb, stdout, &ldif);
+
+       talloc_free(ldb);
+}
+
+/*
+  test generic cldap operations
+*/
+static BOOL test_cldap_generic(TALLOC_CTX *mem_ctx, const char *dest)
+{
+       struct cldap_socket *cldap = cldap_socket_init(mem_ctx, NULL);
+       NTSTATUS status;
+       struct cldap_search search;
+       BOOL ret = True;
+       const char *attrs[] = { "currentTime", "highestCommittedUSN", NULL };
+
+       ZERO_STRUCT(search);
+       search.in.dest_address = dest;
+       search.in.timeout = 10;
+       search.in.retries = 3;
+
+       status = cldap_search(cldap, mem_ctx, &search);
+       CHECK_STATUS(status, NT_STATUS_OK);
+
+       printf("fetching whole rootDSE\n");
+       search.in.filter = "(objectclass=*)";
+       search.in.attributes = NULL;
+
+       status = cldap_search(cldap, mem_ctx, &search);
+       CHECK_STATUS(status, NT_STATUS_OK);
+
+       if (DEBUGLVL(3)) cldap_dump_results(&search);
+
+       printf("fetching currentTime and USN\n");
+       search.in.filter = "(objectclass=*)";
+       search.in.attributes = attrs;
+
+       status = cldap_search(cldap, mem_ctx, &search);
+       CHECK_STATUS(status, NT_STATUS_OK);
+       
+       if (DEBUGLVL(3)) cldap_dump_results(&search);
+
+       printf("Testing a false expression\n");
+       search.in.filter = "(&(objectclass=*)(highestCommittedUSN=2))";
+       search.in.attributes = attrs;
+
+       status = cldap_search(cldap, mem_ctx, &search);
+       CHECK_STATUS(status, NT_STATUS_OK);
+       
+       if (DEBUGLVL(3)) cldap_dump_results(&search);
+       
+
+done:
+       return ret;     
+}
+
 BOOL torture_cldap(struct torture_context *torture)
 {
        TALLOC_CTX *mem_ctx;
        BOOL ret = True;
-       const char *host = lp_parm_string(-1, "torture", "host");
+       const char *host = torture_setting_string(torture, "host", NULL);
 
        mem_ctx = talloc_init("torture_cldap");
 
        ret &= test_cldap_netlogon(mem_ctx, host);
 
+       /* at the moment don't consider this failing to be a failure */
+       test_cldap_generic(mem_ctx, host);
+
        talloc_free(mem_ctx);
 
        return ret;