libutil: moved the networking defines to util_net.h
[sfrench/samba-autobuild/.git] / nsswitch / libwbclient / tests / wbclient.c
index 5a55a43ceb0c9caf8d4b38253572f536a260f996..007404024df2e94863975f97a74e0cdc43e8d7d0 100644 (file)
@@ -1,7 +1,7 @@
 /*
    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(),
@@ -43,6 +56,34 @@ static bool test_wbc_ping(struct torture_context *tctx)
        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;
@@ -192,6 +233,73 @@ static bool test_wbc_users(struct torture_context *tctx)
        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;
@@ -268,13 +376,83 @@ static bool test_wbc_trusts(struct torture_context *tctx)
        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);
@@ -282,8 +460,13 @@ struct torture_suite *torture_wbclient(void)
        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;
 }