/*
Unix SMB/CIFS implementation.
SMB torture tester
- Copyright (C) Guenther Deschner 2009
+ Copyright (C) Guenther Deschner 2009-2010
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
#include "includes.h"
#include "nsswitch/libwbclient/wbclient.h"
+#include "nsswitch/libwbclient/wbc_async.h"
#include "torture/smbtorture.h"
#include "torture/winbind/proto.h"
+#include "lib/util/util_net.h"
#define WBC_ERROR_EQUAL(x,y) (x == y)
#define torture_assert_wbc_ok(torture_ctx,expr,cmt) \
torture_assert_wbc_equal(torture_ctx,expr,WBC_ERR_SUCCESS,cmt)
+
+static void wbc_debug_torture(void *private_data, enum wbcDebugLevel level,
+ const char *fmt, va_list ap) PRINTF_ATTRIBUTE(3,0);
+static void wbc_debug_torture(void *private_data, enum wbcDebugLevel level,
+ const char *fmt, va_list ap)
+{
+ struct torture_context *tctx = talloc_get_type_abort(private_data,
+ struct torture_context);
+ torture_comment(tctx, "%s", talloc_vasprintf(tctx, fmt, ap));
+}
+
static bool test_wbc_ping(struct torture_context *tctx)
{
torture_assert_wbc_ok(tctx, wbcPing(),
return true;
}
+static bool test_wbc_ping_async(struct torture_context *tctx)
+{
+ struct wb_context *wb_ctx;
+ struct tevent_req *req;
+
+ wb_ctx = wb_context_init(tctx, NULL);
+
+ req = wbcPing_send(tctx, tctx->ev, wb_ctx);
+ torture_assert(tctx, req, "wbcPing_send failed");
+
+ if(!tevent_req_poll(req, tctx->ev)) {
+ return false;
+ }
+ torture_assert_wbc_ok(tctx, wbcPing_recv(req), "wbcPing_recv failed");
+ return true;
+}
+
+
+static bool test_wbc_pingdc(struct torture_context *tctx)
+{
+ torture_assert_wbc_equal(tctx, wbcPingDc("random_string", NULL), WBC_ERR_NOT_IMPLEMENTED,
+ "wbcPingDc failed");
+ torture_assert_wbc_ok(tctx, wbcPingDc(NULL, NULL),
+ "wbcPingDc failed");
+
+ return true;
+}
+
static bool test_wbc_library_details(struct torture_context *tctx)
{
struct wbcLibraryDetails *details;
return true;
}
+static bool test_wbc_users_async(struct torture_context *tctx)
+{
+ struct wb_context *wb_ctx;
+ struct tevent_req *req;
+ const char *domain_name = NULL;
+ uint32_t num_users;
+ const char **users;
+ int i;
+ struct wbcInterfaceDetails *details;
+
+ wb_ctx = wb_context_init(tctx, NULL);
+ wbcSetDebug(wb_ctx, wbc_debug_torture, tctx);
+
+ req = wbcInterfaceDetails_send(tctx, tctx->ev, wb_ctx);
+ torture_assert(tctx, req, "wbcInterfaceDetails_send failed");
+
+ if(!tevent_req_poll(req, tctx->ev)) {
+ return false;
+ }
+ torture_assert_wbc_ok(tctx,
+ wbcInterfaceDetails_recv(req, tctx, &details),
+ "wbcInterfaceDetails_recv failed");
+
+ domain_name = talloc_strdup(tctx, details->netbios_domain);
+ wbcFreeMemory(details);
+
+ /* No async implementation of this yet. */
+ torture_assert_wbc_ok(tctx, wbcListUsers(domain_name, &num_users, &users),
+ "wbcListUsers failed");
+ torture_assert(tctx, !(num_users > 0 && !users),
+ "wbcListUsers returned invalid results");
+
+ for (i=0; i < MIN(num_users,100); i++) {
+
+ struct wbcDomainSid sid, *sids;
+ enum wbcSidType name_type;
+ char *domain;
+ char *name;
+ uint32_t num_sids;
+
+ req = wbcLookupName_send(tctx, tctx->ev, wb_ctx, domain_name,
+ users[i]);
+ torture_assert(tctx, req, "wbcLookupName_send failed");
+
+ if(!tevent_req_poll(req, tctx->ev)) {
+ return false;
+ }
+
+ torture_assert_wbc_ok(tctx,
+ wbcLookupName_recv(req, &sid, &name_type),
+ "wbcLookupName_recv failed");
+
+ torture_assert_int_equal(tctx, name_type, WBC_SID_NAME_USER,
+ "wbcLookupName expected WBC_SID_NAME_USER");
+ torture_assert_wbc_ok(tctx, wbcLookupSid(&sid, &domain, &name, &name_type),
+ "wbcLookupSid failed");
+ torture_assert_int_equal(tctx, name_type, WBC_SID_NAME_USER,
+ "wbcLookupSid expected WBC_SID_NAME_USER");
+ torture_assert(tctx, name,
+ "wbcLookupSid returned no name");
+ torture_assert_wbc_ok(tctx, wbcLookupUserSids(&sid, true, &num_sids, &sids),
+ "wbcLookupUserSids failed");
+ }
+
+ return true;
+}
+
static bool test_wbc_groups(struct torture_context *tctx)
{
const char *domain_name = NULL;
return true;
}
+static bool test_wbc_lookupdc(struct torture_context *tctx)
+{
+ const char *domain_name = NULL;
+ struct wbcInterfaceDetails *details;
+ struct wbcDomainControllerInfo *dc_info;
+
+ torture_assert_wbc_ok(tctx, wbcInterfaceDetails(&details),
+ "wbcInterfaceDetails failed");
+
+ domain_name = talloc_strdup(tctx, details->netbios_domain);
+ wbcFreeMemory(details);
+
+ torture_assert_wbc_ok(tctx, wbcLookupDomainController(domain_name, 0, &dc_info),
+ "wbcLookupDomainController failed");
+
+ return true;
+}
+
+static bool test_wbc_lookupdcex(struct torture_context *tctx)
+{
+ const char *domain_name = NULL;
+ struct wbcInterfaceDetails *details;
+ struct wbcDomainControllerInfoEx *dc_info;
+ torture_assert_wbc_ok(tctx, wbcInterfaceDetails(&details),
+ "wbcInterfaceDetails failed");
+
+ domain_name = talloc_strdup(tctx, details->netbios_domain);
+ wbcFreeMemory(details);
+
+ torture_assert_wbc_ok(tctx, wbcLookupDomainControllerEx(domain_name, NULL, NULL, 0, &dc_info),
+ "wbcLookupDomainControllerEx failed");
+
+ return true;
+}
+
+static bool test_wbc_resolve_winsbyname(struct torture_context *tctx)
+{
+ const char *name;
+ char *ip;
+ wbcErr ret;
+
+ name = torture_setting_string(tctx, "host", NULL);
+
+ ret = wbcResolveWinsByName(name, &ip);
+
+ if (is_ipaddress(name)) {
+ torture_assert_wbc_equal(tctx, ret, WBC_ERR_DOMAIN_NOT_FOUND, "wbcResolveWinsByName failed");
+ } else {
+ torture_assert_wbc_ok(tctx, ret, "wbcResolveWinsByName failed");
+ }
+
+ return true;
+}
+
+static bool test_wbc_resolve_winsbyip(struct torture_context *tctx)
+{
+ const char *ip;
+ char *name;
+ wbcErr ret;
+
+ ip = torture_setting_string(tctx, "host", NULL);
+
+ ret = wbcResolveWinsByIP(ip, &name);
+
+ torture_assert_wbc_ok(tctx, ret, "wbcResolveWinsByIP failed");
+
+ return true;
+}
struct torture_suite *torture_wbclient(void)
{
struct torture_suite *suite = torture_suite_create(talloc_autofree_context(), "WBCLIENT");
torture_suite_add_simple_test(suite, "wbcPing", test_wbc_ping);
+ torture_suite_add_simple_test(suite, "wbcPing_async", test_wbc_ping_async);
+ torture_suite_add_simple_test(suite, "wbcPingDc", test_wbc_pingdc);
torture_suite_add_simple_test(suite, "wbcLibraryDetails", test_wbc_library_details);
torture_suite_add_simple_test(suite, "wbcInterfaceDetails", test_wbc_interface_details);
torture_suite_add_simple_test(suite, "wbcSidTypeString", test_wbc_sidtypestring);
torture_suite_add_simple_test(suite, "wbcGuidToString", test_wbc_guidtostring);
torture_suite_add_simple_test(suite, "wbcDomainInfo", test_wbc_domain_info);
torture_suite_add_simple_test(suite, "wbcListUsers", test_wbc_users);
+ torture_suite_add_simple_test(suite, "wbcListUsers_async", test_wbc_users_async);
torture_suite_add_simple_test(suite, "wbcListGroups", test_wbc_groups);
torture_suite_add_simple_test(suite, "wbcListTrusts", test_wbc_trusts);
+ torture_suite_add_simple_test(suite, "wbcLookupDomainController", test_wbc_lookupdc);
+ torture_suite_add_simple_test(suite, "wbcLookupDomainControllerEx", test_wbc_lookupdcex);
+ torture_suite_add_simple_test(suite, "wbcResolveWinsByName", test_wbc_resolve_winsbyname);
+ torture_suite_add_simple_test(suite, "wbcResolveWinsByIP", test_wbc_resolve_winsbyip);
return suite;
}