1 /*
2  * test parsing functions
3  *
4  * Copyright 2008 Hans Leidekker for CodeWeavers
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20 
21 #include <stdarg.h>
22 #include <stdlib.h>
23 #include <windef.h>
24 #include <winbase.h>
25 #include <winldap.h>
26 
27 #include "wine/test.h"
28 
29 static void test_ldap_parse_sort_control( LDAP *ld )
30 {
31     ULONG ret, result;
32     LDAPSortKeyA *sortkeys[2], key;
33     LDAPControlA *sort, *ctrls[2], **server_ctrls;
34     LDAPMessage *res = NULL;
35     struct l_timeval timeout;
36 
37     key.sk_attrtype = (char *)"ou";
38     key.sk_matchruleoid = NULL;
39     key.sk_reverseorder = FALSE;
40 
41     sortkeys[0] = &key;
42     sortkeys[1] = NULL;
43     ret = ldap_create_sort_controlA( ld, sortkeys, 0, &sort );
44     ok( !ret, "ldap_create_sort_controlA failed 0x%x\n", ret );
45 
46     ctrls[0] = sort;
47     ctrls[1] = NULL;
48     timeout.tv_sec = 20;
49     timeout.tv_usec = 0;
50     ret = ldap_search_ext_sA( ld, (char *)"", LDAP_SCOPE_ONELEVEL, (char *)"(ou=*)", NULL, 0, ctrls, NULL, &timeout, 10, &res );
51     if (ret == LDAP_SERVER_DOWN || ret == LDAP_TIMEOUT)
52     {
53         skip("test server can't be reached\n");
54         ldap_control_freeA( sort );
55         return;
56     }
57     ok( !ret, "ldap_search_ext_sA failed 0x%x\n", ret );
58     ok( res != NULL, "expected res != NULL\n" );
59 
60     if (GetProcAddress(GetModuleHandleA("wldap32.dll"), "ber_init"))
61     {
62         ret = ldap_parse_resultA( NULL, res, &result, NULL, NULL, NULL, &server_ctrls, 1 );
63         ok( ret == LDAP_PARAM_ERROR, "ldap_parse_resultA failed 0x%x\n", ret );
64     }
65     else
66         win_skip("Test would crash on older wldap32 versions\n");
67 
68     result = ~0u;
69     ret = ldap_parse_resultA( ld, res, &result, NULL, NULL, NULL, &server_ctrls, 1 );
70     ok( !ret, "ldap_parse_resultA failed 0x%x\n", ret );
71     ok( !result, "got 0x%x expected 0\n", result );
72 
73     ret = ldap_parse_sort_controlA( NULL, NULL, NULL, NULL );
74     ok( ret == LDAP_PARAM_ERROR, "ldap_parse_sort_controlA failed 0x%d\n", ret );
75 
76     ret = ldap_parse_sort_controlA( ld, NULL, NULL, NULL );
77     ok( ret == LDAP_CONTROL_NOT_FOUND, "ldap_parse_sort_controlA failed 0x%x\n", ret );
78 
79     ret = ldap_parse_sort_controlA( ld, NULL, &result, NULL );
80     ok( ret == LDAP_CONTROL_NOT_FOUND, "ldap_parse_sort_controlA failed 0x%x\n", ret );
81 
82     ret = ldap_parse_sort_controlA( ld, server_ctrls, &result, NULL );
83     ok( ret == LDAP_CONTROL_NOT_FOUND, "ldap_parse_sort_controlA failed 0x%x\n", ret );
84 
85     ldap_control_freeA( sort );
86     ldap_controls_freeA( server_ctrls );
87 }
88 
89 static void test_ldap_search_extW( LDAP *ld )
90 {
91     ULONG ret, message, timelimit;
92     WCHAR base[] = {0}, filter[] = {'o','u','=','*',0};
93 
94     timelimit = 20;
95     ret = ldap_search_extW( ld, base, LDAP_SCOPE_SUBTREE, filter, NULL, 0, NULL, NULL, timelimit, 0, &message );
96     if (ret == LDAP_SERVER_DOWN || ret == LDAP_UNAVAILABLE)
97     {
98         skip("test server can't be reached\n");
99         return;
100     }
101     ok( !ret, "ldap_search_extW failed 0x%08x\n", ret );
102 
103     timelimit = 0;
104     ret = ldap_search_extW( ld, base, LDAP_SCOPE_SUBTREE, filter, NULL, 0, NULL, NULL, timelimit, 0, &message );
105     ok( !ret, "ldap_search_extW failed 0x%08x\n", ret );
106 }
107 
108 static void test_ldap_set_optionW( LDAP *ld )
109 {
110     ULONG ret, oldvalue;
111 
112     ret = ldap_get_optionW( ld, LDAP_OPT_REFERRALS, &oldvalue );
113     if (ret == LDAP_SERVER_DOWN || ret == LDAP_UNAVAILABLE)
114     {
115         skip("test server can't be reached\n");
116         return;
117     }
118 
119     ret = ldap_set_optionW( ld, LDAP_OPT_REFERRALS, LDAP_OPT_OFF );
120     ok( !ret || broken(ret == LDAP_PARAM_ERROR) /* nt4, win2k */, "ldap_set_optionW failed 0x%08x\n", ret );
121 
122     ret = ldap_set_optionW( ld, LDAP_OPT_REFERRALS, (void *)&oldvalue );
123     ok( !ret, "ldap_set_optionW failed 0x%08x\n", ret );
124 }
125 
126 static void test_ldap_get_optionW( LDAP *ld )
127 {
128     ULONG ret, version;
129 
130     ret = ldap_get_optionW( ld, LDAP_OPT_PROTOCOL_VERSION, &version );
131     ok( !ret, "ldap_get_optionW failed 0x%08x\n", ret );
132     ok( version == LDAP_VERSION3, "got %u\n", version );
133 }
134 
135 START_TEST (parse)
136 {
137     LDAP *ld;
138 
139     ld = ldap_initA((char *)"ldap.itd.umich.edu", 389 );
140     ok( ld != NULL, "ldap_init failed\n" );
141 
142     test_ldap_parse_sort_control( ld );
143     test_ldap_search_extW( ld );
144     test_ldap_get_optionW( ld );
145     test_ldap_set_optionW( ld );
146     ldap_unbind( ld );
147 }
148