From 57d690b6f693d9a90eb77404bbffc05a1c245972 Mon Sep 17 00:00:00 2001 From: Andrew Bartlett Date: Tue, 4 Aug 2009 12:52:11 +1000 Subject: s4:torture rework LDAP sort test This reworks the test to be part of the LDAP tests, to make better use of the torture API and the ldb API (in particular around adding controls), and a general cleanup. This also adds the test to the 'make test' run. Andrew Bartlett --- source4/selftest/tests.sh | 2 +- source4/torture/ldap/common.c | 1 + source4/torture/ldap/ldap_sort.c | 156 +++++++++++++++++++++++++ source4/torture/ldb/modules/ldb_module.c | 190 ------------------------------- source4/torture/torture.c | 1 - 5 files changed, 158 insertions(+), 192 deletions(-) create mode 100644 source4/torture/ldap/ldap_sort.c delete mode 100644 source4/torture/ldb/modules/ldb_module.c diff --git a/source4/selftest/tests.sh b/source4/selftest/tests.sh index 1b575a978b..6c6a09fbbd 100755 --- a/source4/selftest/tests.sh +++ b/source4/selftest/tests.sh @@ -120,7 +120,7 @@ if grep ENABLE_GNUTLS.1 include/config.h > /dev/null; then done fi plantest "ldb.ldapi with options $options" dc $bbdir/test_ldb.sh ldapi \$PREFIX_ABS/dc/private/ldapi $options -for t in LDAP-CLDAP LDAP-BASIC LDAP-SCHEMA LDAP-UPTODATEVECTOR +for t in `$smb4torture --list | grep "^LDAP-"` do plansmbtorturetest "$t" dc "-U\$USERNAME%\$PASSWORD" //\$SERVER_IP/_none_ done diff --git a/source4/torture/ldap/common.c b/source4/torture/ldap/common.c index 2c11de729c..4a2bc2e391 100644 --- a/source4/torture/ldap/common.c +++ b/source4/torture/ldap/common.c @@ -105,6 +105,7 @@ NTSTATUS torture_ldap_init(void) struct torture_suite *suite = torture_suite_create(talloc_autofree_context(), "LDAP"); torture_suite_add_simple_test(suite, "BENCH-CLDAP", torture_bench_cldap); torture_suite_add_simple_test(suite, "BASIC", torture_ldap_basic); + torture_suite_add_simple_test(suite, "SORT", torture_ldap_sort); torture_suite_add_simple_test(suite, "CLDAP", torture_cldap); torture_suite_add_simple_test(suite, "SCHEMA", torture_ldap_schema); torture_suite_add_simple_test(suite, "UPTODATEVECTOR", torture_ldap_uptodatevector); diff --git a/source4/torture/ldap/ldap_sort.c b/source4/torture/ldap/ldap_sort.c new file mode 100644 index 0000000000..4d732cf997 --- /dev/null +++ b/source4/torture/ldap/ldap_sort.c @@ -0,0 +1,156 @@ +/* + Unix SMB/CIFS implementation. + + Test LDB attribute functions + + Copyright (C) Andrew Bartlet 2008-2009 + Copyright (C) Matthieu Patou 2009 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "includes.h" +#include "lib/events/events.h" +#include "lib/ldb/include/ldb.h" +#include "lib/ldb/include/ldb_errors.h" +#include "ldb_wrap.h" +#include "param/param.h" +#include "lib/cmdline/popt_common.h" +#include "torture/smbtorture.h" +#include "torture/local/proto.h" +#include +bool torture_ldap_sort(struct torture_context *torture) +{ + + struct ldb_context *ldb; + + bool ret = false; + const char *host = torture_setting_string(torture, "host", NULL); + char *url; + int i; + codepoint_t j; + struct ldb_message_element *elem; + struct ldb_message *msg; + + struct ldb_server_sort_control **control; + struct ldb_request *req; + struct ldb_result *ctx; + struct ldb_val* prev = NULL; + const char *prev_txt = NULL; + int prev_len = 0; + struct ldb_val* cur = NULL; + const char *cur_txt = NULL; + int cur_len = 0; + struct ldb_dn* dn; + + + /* TALLOC_CTX* ctx;*/ + + url = talloc_asprintf(torture, "ldap://%s/", host); + + ldb = ldb_wrap_connect(torture, torture->ev, torture->lp_ctx, url, + NULL, + cmdline_credentials, + 0, NULL); + torture_assert(torture, ldb, "Failed to make LDB connection to target"); + + ctx = talloc_zero(ldb, struct ldb_result); + + control = talloc_array(ctx, struct ldb_server_sort_control *, 2); + control[0] = talloc(control, struct ldb_server_sort_control); + control[0]->attributeName = talloc_strdup(control, "cn"); + control[0]->orderingRule = NULL; + control[0]->reverse = 0; + control[1] = NULL; + + dn = ldb_get_root_basedn(ldb); + ldb_dn_add_child_fmt(dn, "cn=users"); + ret = ldb_build_search_req(&req, ldb, ctx, + dn, + LDB_SCOPE_SUBTREE, + "(objectClass=*)", NULL, + NULL, + ctx, ldb_search_default_callback, NULL); + torture_assert(torture, ret == LDB_SUCCESS, "Failed to build search request"); + + ret = ldb_request_add_control(req, LDB_CONTROL_SERVER_SORT_OID, true, control); + torture_assert(torture, ret == LDB_SUCCESS, "Failed to add control to search request"); + + ret = ldb_request(ldb, req); + torture_assert(torture, ret == LDB_SUCCESS, ldb_errstring(ldb)); + + ret = ldb_wait(req->handle, LDB_WAIT_ALL); + torture_assert(torture, ret == LDB_SUCCESS, ldb_errstring(ldb)); + + ret = true; + if (ctx->count > 1) { + for (i=0;icount;i++) { + msg = ctx->msgs[i]; + elem = ldb_msg_find_element(msg,"cn"); + cur = elem->values; + torture_comment(torture, "cn: %s\n",cur->data); + if (prev != NULL) + { + /* Do only the ascii case right now ... */ + cur_txt=cur->data; + cur_len=cur->length; + prev_txt=prev->data; + prev_len=prev->length; + /* Remove leading whitespace as the sort function do so ... */ + while ( cur_txt[0] == cur_txt[1] ) { cur_txt++; cur_len--;} + while ( prev_txt[0] == prev_txt[1] ) { prev_txt++; prev_len--;} + while( *(cur_txt) && *(prev_txt) && cur_len && prev_len ) { + j = toupper_m(*(prev_txt))-toupper_m(*(cur_txt)); + if ( j > 0 ) { + /* Just check that is not due to trailling white space in prev_txt + * That is to say *cur_txt = 0 and prev_txt = 20 */ + /* Remove trailling whitespace */ + while ( *prev_txt == ' ' ) { prev_txt++; prev_len--;} + while ( *cur_txt == ' ' ) { cur_txt++; cur_len--;} + /* Now that potential whitespace are removed if we are at the end + * of the cur_txt then it means that in fact strings were identical + */ + torture_assert(torture, *cur_txt && *prev_txt, "Data wrongly sorted"); + break; + } + else + { + if ( j == 0 ) + { + if ( *(cur_txt) == ' ') { + while ( cur_txt[0] == cur_txt[1] ) { cur_txt++; cur_len--;} + while ( prev_txt[0] == prev_txt[1] ) { prev_txt++; prev_len--;} + } + cur_txt++; + prev_txt++; + prev_len--; + cur_len--; + } + else + { + break; + } + } + } + if ( ret != 1 ) { + break; + } + } + prev = cur; + } + + } + + return ret; +} diff --git a/source4/torture/ldb/modules/ldb_module.c b/source4/torture/ldb/modules/ldb_module.c deleted file mode 100644 index 64f95f7619..0000000000 --- a/source4/torture/ldb/modules/ldb_module.c +++ /dev/null @@ -1,190 +0,0 @@ -/* - Unix SMB/CIFS implementation. - - Test LDB attribute functions - - Copyright (C) Andrew Bartlet 2008 - Copyright (C) Matthieu Patou 2009 - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -#include "includes.h" -#include "lib/events/events.h" -#include "lib/ldb/include/ldb.h" -#include "lib/ldb/include/ldb_errors.h" -#include "ldb_wrap.h" -#include "param/param.h" -#include "lib/cmdline/popt_common.h" -#include "torture/smbtorture.h" -#include "torture/local/proto.h" - -static bool torture_ldb_mod_sort(struct torture_context *torture) -{ - - struct ldb_context *ldb; - - bool ret = false; - const char *host = torture_setting_string(torture, "host", NULL); - char *url; - char *basedn; - int i; - int j; - struct ldb_message_element *elem; - struct ldb_message *msg; - struct dsdb_schema *schema = NULL; - struct ldb_control **ctrl; - - struct ldb_server_sort_control ** control; - struct ldb_request *req; - struct ldb_result *ctx; - struct ldb_val* prev = NULL; - char *prev_txt = NULL; - int prev_len = 0; - struct ldb_val* cur = NULL; - char *cur_txt = NULL; - int cur_len = 0; - struct ldb_dn* dn; - char* user_cn = "Users"; - - - /* TALLOC_CTX* ctx;*/ - - url = talloc_asprintf(torture, "ldap://%s/", host); - - ldb = ldb_wrap_connect(torture, torture->ev, torture->lp_ctx, url, - NULL, - cmdline_credentials, - 0, NULL); - if (!ldb) goto failed; - ret = false; - fprintf(stderr,"Ici \n"); - - ctx = talloc_zero(ldb, struct ldb_result); - - ctrl = talloc_array(ctx, struct ldb_control *, 2); - ctrl[0] = talloc(ctrl, struct ldb_control); - ctrl[0]->oid = LDB_CONTROL_SERVER_SORT_OID; - ctrl[0]->critical = true; - - control = talloc_array(ctrl[0], struct ldb_server_sort_control *, 2); - control[0] = talloc(control, struct ldb_server_sort_control); - control[0]->attributeName = talloc_strdup(control, "cn"); - control[0]->orderingRule = NULL; - control[0]->reverse = 0; - control[1] = NULL; - ctrl[0]->data = control; - ctrl[1] = NULL; - - dn = ldb_get_root_basedn(ldb); - ldb_dn_add_child_fmt(dn, "cn=%s", user_cn); - ret = ldb_build_search_req(&req, ldb, ctx, - dn, - LDB_SCOPE_SUBTREE, - "(objectClass=*)", NULL, - ctrl, - ctx, ldb_search_default_callback, NULL); - - ret = ldb_request(ldb, req); - if (ret != LDB_SUCCESS) { - d_printf("search failed - %s\n", ldb_errstring(ldb)); - talloc_free(req); - return false; - } - - ret = ldb_wait(req->handle, LDB_WAIT_ALL); - - if (ret != LDB_SUCCESS) { - d_printf("search error - %s\n", ldb_errstring(ldb)); - talloc_free(req); - return false; - } - ret = 1; - if (ctx->count > 1) { - for (i=0;icount;i++) { - msg = ctx->msgs[i]; - elem = ldb_msg_find_element(msg,"cn"); - cur = elem->values; - d_printf("cn: %s\n",cur->data); - if (prev != NULL) - { - /* Do only the ascii case right now ... */ - cur_txt=cur->data; - cur_len=cur->length; - prev_txt=prev->data; - prev_len=prev->length; - /* Remove leading whitespace as the sort function do so ... */ - while ( cur_txt[0] == cur_txt[1] ) { cur_txt++; cur_len--;} - while ( prev_txt[0] == prev_txt[1] ) { prev_txt++; prev_len--;} - while( *(cur_txt) && *(prev_txt) && cur_len && prev_len ) { - j = (int)toupper(*(prev_txt))-(int)toupper(*(cur_txt)); - if ( j > 0 ) { - /* Just check that is not due to trailling white space in prev_txt - * That is to say *cur_txt = 0 and prev_txt = 20 */ - /* Remove trailling whitespace */ - while ( *prev_txt == ' ' ) { prev_txt++; prev_len--;} - while ( *cur_txt == ' ' ) { cur_txt++; cur_len--;} - /* Now that potential whitespace are removed if we are at the end - * of the cur_txt then it means that in fact strings were identical - */ - if ( *cur_txt || *prev_txt ) { - ret = 0; - torture->last_reason = talloc_strdup(torture, "Data wrongly sorted"); - } - break; - } - else - { - if ( j == 0 ) - { - if ( *(cur_txt) == ' ') { - while ( cur_txt[0] == cur_txt[1] ) { cur_txt++; cur_len--;} - while ( prev_txt[0] == prev_txt[1] ) { prev_txt++; prev_len--;} - } - cur_txt++; - prev_txt++; - prev_len--; - cur_len--; - } - else - { - break; - } - } - } - if ( ret != 1 ) { - break; - } - } - prev = cur; - } - - } - -failed: - return ret; -} - - -NTSTATUS torture_ldb_module_init(void) -{ - struct torture_suite *suite = torture_suite_create(talloc_autofree_context(), "LDB_MODULE"); - torture_suite_add_simple_test(suite, "SORT", torture_ldb_mod_sort); - suite->description = talloc_strdup(suite, "LDB MODULES (samba-specific behaviour) tests"); - - torture_register_suite(suite); - - return NT_STATUS_OK; -} - diff --git a/source4/torture/torture.c b/source4/torture/torture.c index 1dce12adb0..a7296e62db 100644 --- a/source4/torture/torture.c +++ b/source4/torture/torture.c @@ -56,7 +56,6 @@ _PUBLIC_ int torture_init(void) { extern NTSTATUS torture_base_init(void); extern NTSTATUS torture_ldap_init(void); - extern NTSTATUS torture_ldb_module_init(void); extern NTSTATUS torture_local_init(void); extern NTSTATUS torture_nbt_init(void); extern NTSTATUS torture_nbench_init(void); -- cgit