urlmon: Don't create stgmed_obj for binding to object.
[wine] / dlls / snmpapi / tests / util.c
1 /*
2  * Copyright 2007 Hans Leidekker
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18
19 #include <stdio.h>
20
21 #include <wine/test.h>
22
23 #include <windef.h>
24 #include <snmp.h>
25
26 static INT  (WINAPI *pSnmpUtilAsnAnyCpy)(AsnAny*, AsnAny*);
27 static VOID (WINAPI *pSnmpUtilAsnAnyFree)(AsnAny*);
28 static INT  (WINAPI *pSnmpUtilOctetsCmp)(AsnOctetString*, AsnOctetString*);
29 static INT  (WINAPI *pSnmpUtilOctetsCpy)(AsnOctetString*, AsnOctetString*);
30 static VOID (WINAPI *pSnmpUtilOctetsFree)(AsnOctetString*);
31 static INT  (WINAPI *pSnmpUtilOctetsNCmp)(AsnOctetString*, AsnOctetString*, UINT);
32
33 static void InitFunctionPtrs(void)
34 {
35     HMODULE hSnmpapi = GetModuleHandle("snmpapi.dll");
36
37 #define SNMPAPI_GET_PROC(func) \
38     p ## func = (void*)GetProcAddress(hSnmpapi, #func); \
39     if(!p ## func) \
40       trace("GetProcAddress(%s) failed\n", #func);
41
42     SNMPAPI_GET_PROC(SnmpUtilAsnAnyCpy)
43     SNMPAPI_GET_PROC(SnmpUtilAsnAnyFree)
44     SNMPAPI_GET_PROC(SnmpUtilOctetsCmp)
45     SNMPAPI_GET_PROC(SnmpUtilOctetsCpy)
46     SNMPAPI_GET_PROC(SnmpUtilOctetsFree)
47     SNMPAPI_GET_PROC(SnmpUtilOctetsNCmp)
48
49 #undef SNMPAPI_GET_PROC
50 }
51
52 static void test_SnmpUtilOidToA(void)
53 {
54     LPSTR ret;
55     static UINT ids1[] = { 1,3,6,1,4,1,311 };
56     static UINT ids2[] = {
57           1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
58           1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
59           1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
60           1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
61           1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
62           1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
63           1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
64           1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
65           1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 };
66     static UINT ids3[] = { 0xffffffff };
67     static AsnObjectIdentifier oid0 = { 0, ids1 };
68     static AsnObjectIdentifier oid1 = { 7, ids1 };
69     static AsnObjectIdentifier oid2 = { 256, ids2 };
70     static AsnObjectIdentifier oid3 = { 257, ids2 };
71     static AsnObjectIdentifier oid4 = { 258, ids2 };
72     static AsnObjectIdentifier oid5 = { 1, ids3 };
73     static const char expect0[] = "<null oid>";
74     static const char expect1[] = "1.3.6.1.4.1.311";
75     static const char expect2[] =
76         "1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1."
77         "1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1."
78         "1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1."
79         "1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1."
80         "1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1."
81         "1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1."
82         "1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1."
83         "1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1";
84     static const char expect3[] =
85         "1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1."
86         "1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1."
87         "1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1."
88         "1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1."
89         "1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1."
90         "1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1."
91         "1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1."
92         "1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1";
93     static const char expect4[] = "-1";
94
95     ret = SnmpUtilOidToA(NULL);
96     ok(ret != NULL, "SnmpUtilOidToA failed\n");
97     ok(!strcmp(ret, expect0), "SnmpUtilOidToA failed got \n%s\n expected \n%s\n",
98        ret, expect1);
99
100     ret = SnmpUtilOidToA(&oid0);
101     ok(ret != NULL, "SnmpUtilOidToA failed\n");
102     ok(!strcmp(ret, expect0), "SnmpUtilOidToA failed got \n%s\n expected \n%s\n",
103        ret, expect0);
104
105     ret = SnmpUtilOidToA(&oid1);
106     ok(ret != NULL, "SnmpUtilOidToA failed\n");
107     ok(!strcmp(ret, expect1), "SnmpUtilOidToA failed got \n%s\n expected \n%s\n",
108        ret, expect1);
109
110     ret = SnmpUtilOidToA(&oid2);
111     ok(ret != NULL, "SnmpUtilOidToA failed\n");
112     ok(!strcmp(ret, expect2), "SnmpUtilOidToA failed got \n%s\n expected \n%s\n",
113        ret, expect2);
114
115     ret = SnmpUtilOidToA(&oid3);
116     ok(ret != NULL, "SnmpUtilOidToA failed\n");
117     ok(!strcmp(ret, expect3), "SnmpUtilOidToA failed got \n%s\n expected \n%s\n",
118        ret, expect3);
119
120     ret = SnmpUtilOidToA(&oid4);
121     ok(ret != NULL, "SnmpUtilOidToA failed\n");
122     ok(!strcmp(ret, expect3), "SnmpUtilOidToA failed got \n%s\n expected \n%s\n",
123        ret, expect3);
124
125     ret = SnmpUtilOidToA(&oid5);
126     ok(ret != NULL, "SnmpUtilOidToA failed\n");
127     ok(!strcmp(ret, expect4), "SnmpUtilOidToA failed got \n%s\n expected \n%s\n",
128        ret, expect4);
129 }
130
131 static void test_SnmpUtilAsnAnyCpyFree(void)
132 {
133     INT ret;
134     static AsnAny dst, src = { ASN_INTEGER, { 1 } };
135
136     if (0) { /* these crash on XP */
137     ret = pSnmpUtilAsnAnyCpy(NULL, NULL);
138     ok(!ret, "SnmpUtilAsnAnyCpy succeeded\n");
139
140     ret = pSnmpUtilAsnAnyCpy(&dst, NULL);
141     ok(!ret, "SnmpUtilAsnAnyCpy succeeded\n");
142
143     ret = pSnmpUtilAsnAnyCpy(NULL, &src);
144     ok(!ret, "SnmpUtilAsnAnyCpy succeeded\n");
145     }
146
147     ret = pSnmpUtilAsnAnyCpy(&dst, &src);
148     ok(ret, "SnmpUtilAsnAnyCpy failed\n");
149     ok(!memcmp(&src, &dst, sizeof(AsnAny)), "SnmpUtilAsnAnyCpy failed\n");
150
151     if (0) { /* crashes on XP */
152     pSnmpUtilAsnAnyFree(NULL);
153     }
154     pSnmpUtilAsnAnyFree(&dst);
155     ok(dst.asnType == ASN_NULL, "SnmpUtilAsnAnyFree failed\n");
156     ok(dst.asnValue.number == 1, "SnmpUtilAsnAnyFree failed\n");
157 }
158
159 static void test_SnmpUtilOctetsCpyFree(void)
160 {
161     INT ret;
162     static BYTE stream[] = { '1', '2', '3', '4' };
163     static AsnOctetString dst, src = { stream, 4, TRUE };
164
165     ret = pSnmpUtilOctetsCpy(NULL, NULL);
166     ok(!ret, "SnmpUtilOctetsCpy succeeded\n");
167
168     memset(&dst, 1, sizeof(AsnOctetString));
169     ret = pSnmpUtilOctetsCpy(&dst, NULL);
170     ok(ret, "SnmpUtilOctetsCpy failed\n");
171     ok(dst.length == 0, "SnmpUtilOctetsCpy failed\n");
172     ok(dst.stream == NULL, "SnmpUtilOctetsCpy failed\n");
173     ok(dst.dynamic == FALSE, "SnmpUtilOctetsCpy failed\n");
174
175     ret = pSnmpUtilOctetsCpy(NULL, &src);
176     ok(!ret, "SnmpUtilOctetsCpy succeeded\n");
177
178     memset(&dst, 0, sizeof(AsnOctetString));
179     ret = pSnmpUtilOctetsCpy(&dst, &src);
180     ok(ret, "SnmpUtilOctetsCpy failed\n");
181     ok(src.length == dst.length, "SnmpUtilOctetsCpy failed\n");
182     ok(!memcmp(src.stream, dst.stream, dst.length), "SnmpUtilOctetsCpy failed\n");
183     ok(dst.dynamic == TRUE, "SnmpUtilOctetsCpy failed\n");
184
185     pSnmpUtilOctetsFree(NULL);
186     pSnmpUtilOctetsFree(&dst);
187     ok(dst.stream == NULL, "SnmpUtilOctetsFree failed\n");
188     ok(dst.length == 0, "SnmpUtilOctetsFree failed\n");
189     ok(dst.dynamic == FALSE, "SnmpUtilOctetsFree failed\n");
190 }
191
192 static void test_SnmpUtilOidCpyFree(void)
193 {
194     INT ret;
195     static UINT ids[] = { 1, 3, 6, 1, 4, 1, 311 };
196     static AsnObjectIdentifier dst, src = { sizeof(ids) / sizeof(ids[0]), ids };
197
198     ret = SnmpUtilOidCpy(NULL, NULL);
199     ok(!ret, "SnmpUtilOidCpy succeeded\n");
200
201     memset(&dst, 1, sizeof(AsnObjectIdentifier));
202     ret = SnmpUtilOidCpy(&dst, NULL);
203     ok(ret, "SnmpUtilOidCpy failed\n");
204     ok(dst.idLength == 0, "SnmpUtilOidCpy failed\n");
205     ok(dst.ids == NULL, "SnmpUtilOidCpy failed\n");
206
207     ret = SnmpUtilOidCpy(NULL, &src);
208     ok(!ret, "SnmpUtilOidCpy succeeded\n");
209
210     memset(&dst, 0, sizeof(AsnObjectIdentifier));
211     ret = SnmpUtilOidCpy(&dst, &src);
212     ok(ret, "SnmpUtilOidCpy failed\n");
213     ok(src.idLength == dst.idLength, "SnmpUtilOidCpy failed\n");
214     ok(!memcmp(src.ids, dst.ids, dst.idLength * sizeof(UINT)), "SnmpUtilOidCpy failed\n");
215
216     SnmpUtilOidFree(NULL);
217     SnmpUtilOidFree(&dst);
218     ok(dst.idLength == 0, "SnmpUtilOidFree failed\n");
219     ok(dst.ids == NULL, "SnmpUtilOidFree failed\n");
220 }
221
222 static void test_SnmpUtilOctetsNCmp(void)
223 {
224     INT ret;
225     static BYTE stream1[] = { '1', '2', '3', '4' };
226     static BYTE stream2[] = { '5', '6', '7', '8' };
227     static AsnOctetString octets1 = { stream1, 4, FALSE };
228     static AsnOctetString octets2 = { stream2, 4, FALSE };
229
230     ret = pSnmpUtilOctetsNCmp(NULL, NULL, 0);
231     ok(!ret, "SnmpUtilOctetsNCmp succeeded\n");
232
233     ret = pSnmpUtilOctetsNCmp(NULL, NULL, 1);
234     ok(!ret, "SnmpUtilOctetsNCmp succeeded\n");
235
236     ret = pSnmpUtilOctetsNCmp(&octets1, NULL, 0);
237     ok(!ret, "SnmpUtilOctetsNCmp succeeded\n");
238
239     ret = pSnmpUtilOctetsNCmp(&octets1, NULL, 1);
240     ok(!ret, "SnmpUtilOctetsNCmp succeeded\n");
241
242     ret = pSnmpUtilOctetsNCmp(NULL, &octets2, 0);
243     ok(!ret, "SnmpUtilOctetsNCmp succeeded\n");
244
245     ret = pSnmpUtilOctetsNCmp(NULL, &octets2, 1);
246     ok(!ret, "SnmpUtilOctetsNCmp succeeded\n");
247
248     ret = pSnmpUtilOctetsNCmp(&octets1, &octets1, 0);
249     ok(!ret, "SnmpUtilOctetsNCmp failed\n");
250
251     ret = pSnmpUtilOctetsNCmp(&octets1, &octets1, 4);
252     ok(!ret, "SnmpUtilOctetsNCmp failed\n");
253
254     ret = pSnmpUtilOctetsNCmp(&octets1, &octets2, 4);
255     ok(ret == -4, "SnmpUtilOctetsNCmp failed\n");
256
257     ret = pSnmpUtilOctetsNCmp(&octets2, &octets1, 4);
258     ok(ret == 4, "SnmpUtilOctetsNCmp failed\n");
259 }
260
261 static void test_SnmpUtilOctetsCmp(void)
262 {
263     INT ret;
264     static BYTE stream1[] = { '1', '2', '3' };
265     static BYTE stream2[] = { '1', '2', '3', '4' };
266     static AsnOctetString octets1 = { stream1, 3, FALSE };
267     static AsnOctetString octets2 = { stream2, 4, FALSE };
268
269     if (0) { /* these crash on XP */
270     ret = pSnmpUtilOctetsCmp(NULL, NULL);
271     ok(!ret, "SnmpUtilOctetsCmp succeeded\n");
272
273     ret = pSnmpUtilOctetsCmp(&octets1, NULL);
274     ok(!ret, "SnmpUtilOctetsCmp succeeded\n");
275
276     ret = pSnmpUtilOctetsCmp(NULL, &octets2);
277     ok(!ret, "SnmpUtilOctetsCmp succeeded\n");
278     }
279
280     ret = pSnmpUtilOctetsCmp(&octets2, &octets1);
281     ok(ret == 1, "SnmpUtilOctetsCmp failed\n");
282
283     ret = pSnmpUtilOctetsCmp(&octets1, &octets2);
284     ok(ret == -1, "SnmpUtilOctetsCmp failed\n");
285 }
286
287 static void test_SnmpUtilOidNCmp(void)
288 {
289     INT ret;
290     static UINT ids1[] = { 1, 2, 3, 4 };
291     static UINT ids2[] = { 5, 6, 7, 8 };
292     static AsnObjectIdentifier oid1 = { 4, ids1 };
293     static AsnObjectIdentifier oid2 = { 4, ids2 };
294
295     ret = SnmpUtilOidNCmp(NULL, NULL, 0);
296     ok(!ret, "SnmpUtilOidNCmp succeeded\n");
297
298     ret = SnmpUtilOidNCmp(NULL, NULL, 1);
299     ok(!ret, "SnmpUtilOidNCmp succeeded\n");
300
301     ret = SnmpUtilOidNCmp(&oid1, NULL, 0);
302     ok(!ret, "SnmpUtilOidNCmp succeeded\n");
303
304     ret = SnmpUtilOidNCmp(&oid1, NULL, 1);
305     ok(!ret, "SnmpUtilOidNCmp succeeded\n");
306
307     ret = SnmpUtilOidNCmp(NULL, &oid2, 0);
308     ok(!ret, "SnmpUtilOidNCmp succeeded\n");
309
310     ret = SnmpUtilOidNCmp(NULL, &oid2, 1);
311     ok(!ret, "SnmpUtilOidNCmp succeeded\n");
312
313     ret = SnmpUtilOidNCmp(&oid1, &oid1, 0);
314     ok(!ret, "SnmpUtilOidNCmp failed\n");
315
316     ret = SnmpUtilOidNCmp(&oid1, &oid1, 4);
317     ok(!ret, "SnmpUtilOidNCmp failed\n");
318
319     ret = SnmpUtilOidNCmp(&oid1, &oid2, 4);
320     ok(ret == -1, "SnmpUtilOidNCmp failed: %d\n", ret);
321
322     ret = SnmpUtilOidNCmp(&oid2, &oid1, 4);
323     ok(ret == 1, "SnmpUtilOidNCmp failed: %d\n", ret);
324 }
325
326 static void test_SnmpUtilOidCmp(void)
327 {
328     INT ret;
329     static UINT ids1[] = { 1, 2, 3 };
330     static UINT ids2[] = { 1, 2, 3, 4 };
331     static AsnObjectIdentifier oid1 = { 3, ids1 };
332     static AsnObjectIdentifier oid2 = { 4, ids2 };
333
334     if (0) { /* these crash on XP */
335     ret = SnmpUtilOidCmp(NULL, NULL);
336     ok(!ret, "SnmpUtilOidCmp succeeded\n");
337
338     ret = SnmpUtilOidCmp(&oid1, NULL);
339     ok(!ret, "SnmpUtilOidCmp succeeded\n");
340
341     ret = SnmpUtilOidCmp(NULL, &oid2);
342     ok(!ret, "SnmpUtilOidCmp succeeded\n");
343     }
344
345     ret = SnmpUtilOidCmp(&oid2, &oid1);
346     ok(ret == 1, "SnmpUtilOidCmp failed\n");
347
348     ret = SnmpUtilOidCmp(&oid1, &oid2);
349     ok(ret == -1, "SnmpUtilOidCmp failed\n");
350 }
351
352 static void test_SnmpUtilOidAppend(void)
353 {
354     INT ret;
355     UINT *ids1;
356     static UINT ids2[] = { 4, 5, 6 };
357     static AsnObjectIdentifier oid1;
358     static AsnObjectIdentifier oid2 = { 3, ids2 };
359
360     ids1 = HeapAlloc(GetProcessHeap(), 0, 3 * sizeof(UINT));
361     ids1[0] = 1;
362     ids1[1] = 2;
363     ids1[2] = 3;
364
365     oid1.idLength = 3;
366     oid1.ids = ids1;
367
368     ret = SnmpUtilOidAppend(NULL, NULL);
369     ok(!ret, "SnmpUtilOidAppend succeeded\n");
370
371     ret = SnmpUtilOidAppend(&oid1, NULL);
372     ok(ret, "SnmpUtilOidAppend failed\n");
373
374     ret = SnmpUtilOidAppend(NULL, &oid2);
375     ok(!ret, "SnmpUtilOidAppend succeeded\n");
376
377     ret = SnmpUtilOidAppend(&oid1, &oid2);
378     ok(ret, "SnmpUtilOidAppend failed\n");
379     ok(oid1.idLength == 6, "SnmpUtilOidAppend failed\n");
380     ok(!memcmp(&oid1.ids[3], ids2, 3 * sizeof(UINT)),
381        "SnmpUtilOidAppend failed\n");
382
383     HeapFree(GetProcessHeap(), 0, ids1);
384 }
385
386 static void test_SnmpUtilVarBindCpyFree(void)
387 {
388     INT ret;
389     static UINT ids[] = { 1, 3, 6, 1, 4, 1, 311 };
390     static SnmpVarBind dst, src = { { 7, ids }, { ASN_INTEGER, { 1 } } };
391
392     ret = SnmpUtilVarBindCpy(NULL, NULL);
393     ok(!ret, "SnmpUtilVarBindCpy succeeded\n");
394
395     memset(&dst, 0, sizeof(SnmpVarBind));
396     ret = SnmpUtilVarBindCpy(&dst, NULL);
397     ok(ret, "SnmpUtilVarBindCpy failed\n");
398     ok(dst.name.idLength == 0, "SnmpUtilVarBindCpy failed\n");
399     ok(dst.name.ids == NULL, "SnmpUtilVarBindCpy failed\n");
400     ok(dst.value.asnType == ASN_NULL, "SnmpUtilVarBindCpy failed\n");
401     ok(dst.value.asnValue.number == 0, "SnmpUtilVarBindCpy failed\n");
402
403     ret = SnmpUtilVarBindCpy(NULL, &src);
404     ok(!ret, "SnmpUtilVarBindCpy succeeded\n");
405
406     memset(&dst, 0, sizeof(SnmpVarBind));
407     ret = SnmpUtilVarBindCpy(&dst, &src);
408     ok(ret, "SnmpUtilVarBindCpy failed\n");
409     ok(src.name.idLength == dst.name.idLength, "SnmpUtilVarBindCpy failed\n");
410     ok(!memcmp(src.name.ids, dst.name.ids, dst.name.idLength * sizeof(UINT)),
411        "SnmpUtilVarBindCpy failed\n");
412     ok(!memcmp(&src.value, &dst.value, sizeof(AsnObjectSyntax)),
413        "SnmpUtilVarBindCpy failed\n");
414
415     SnmpUtilVarBindFree(NULL);
416     SnmpUtilVarBindFree(&dst);
417     ok(dst.name.idLength == 0, "SnmpUtilVarBindFree failed\n");
418     ok(dst.name.ids == NULL, "SnmpUtilVarBindFree failed\n");
419     ok(dst.value.asnType == ASN_NULL, "SnmpUtilVarBindFree failed\n");
420     ok(dst.value.asnValue.number == 1, "SnmpUtilVarBindFree failed\n");
421 }
422
423 static void test_SnmpUtilVarBindListCpyFree(void)
424 {
425     INT ret;
426     static UINT ids[] = { 1, 3, 6, 1, 4, 1, 311 };
427     static SnmpVarBind src = { { 7, ids }, { ASN_INTEGER, { 1 } } };
428     static SnmpVarBindList dst_list, src_list = { &src, 1 };
429
430     if (0) { /* these crash on XP */
431     ret = SnmpUtilVarBindListCpy(NULL, NULL);
432     ok(!ret, "SnmpUtilVarBindCpy succeeded\n");
433
434     ret = SnmpUtilVarBindListCpy(NULL, &src_list);
435     ok(!ret, "SnmpUtilVarBindListCpy succeeded\n");
436     }
437
438     memset(&dst_list, 0xff, sizeof(SnmpVarBindList));
439     ret = SnmpUtilVarBindListCpy(&dst_list, NULL);
440     ok(ret, "SnmpUtilVarBindListCpy failed\n");
441     ok(dst_list.list == NULL, "SnmpUtilVarBindListCpy failed\n");
442     ok(dst_list.len == 0, "SnmpUtilVarBindListCpy failed\n");
443
444     ret = SnmpUtilVarBindListCpy(&dst_list, &src_list);
445     ok(ret, "SnmpUtilVarBindListCpy failed\n");
446     ok(src_list.len == dst_list.len, "SnmpUtilVarBindListCpy failed\n");
447     ok(src_list.list->name.idLength == dst_list.list->name.idLength,
448        "SnmpUtilVarBindListCpy failed\n");
449     ok(!memcmp(src_list.list->name.ids, dst_list.list->name.ids,
450                dst_list.list->name.idLength * sizeof(UINT)),
451        "SnmpUtilVarBindListCpy failed\n");
452     ok(!memcmp(&src_list.list->value, &dst_list.list->value, sizeof(AsnAny)),
453        "SnmpUtilVarBindListCpy failed\n");
454
455     if (0) { /* crashes on XP */
456     SnmpUtilVarBindListFree(NULL);
457     }
458     SnmpUtilVarBindListFree(&dst_list);
459     ok(dst_list.list == NULL, "SnmpUtilVarBindListFree failed\n");
460     ok(dst_list.len == 0, "SnmpUtilVarBindListFree failed\n");
461 }
462
463 START_TEST(util)
464 {
465     InitFunctionPtrs();
466
467     test_SnmpUtilOidToA();
468
469     if (!pSnmpUtilAsnAnyCpy || !pSnmpUtilAsnAnyFree)
470         skip("SnmpUtilAsnAnyCpy and/or SnmpUtilAsnAnyFree not available\n");
471     else
472         test_SnmpUtilAsnAnyCpyFree();
473
474     if (!pSnmpUtilOctetsCpy || !pSnmpUtilOctetsFree)
475         skip("SnmpUtilOctetsCpy and/or SnmpUtilOctetsFree not available\n");
476     else
477         test_SnmpUtilOctetsCpyFree();
478
479     test_SnmpUtilOidCpyFree();
480
481     if (!pSnmpUtilOctetsNCmp)
482         skip("SnmpUtilOctetsNCmp not available\n");
483     else
484         test_SnmpUtilOctetsNCmp();
485
486     if (!pSnmpUtilOctetsCmp)
487         skip("SnmpUtilOctetsCmp not available\n");
488     else
489         test_SnmpUtilOctetsCmp();
490
491     test_SnmpUtilOidCmp();
492     test_SnmpUtilOidNCmp();
493     test_SnmpUtilOidAppend();
494     test_SnmpUtilVarBindCpyFree();
495     test_SnmpUtilVarBindListCpyFree();
496 }