comctl32: A couple fixes for tab icon offsets.
[wine] / dlls / crypt32 / tests / main.c
1 /*
2  * Miscellaneous crypt32 tests
3  *
4  * Copyright 2005 Juan Lang
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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  */
20
21 #include <stdio.h>
22 #include <stdarg.h>
23 #include <windef.h>
24 #include <winbase.h>
25 #include <winerror.h>
26 #include <wincrypt.h>
27
28 #include "wine/test.h"
29
30 static void test_findAttribute(void)
31 {
32     PCRYPT_ATTRIBUTE ret;
33     BYTE blobbin[] = {0x02,0x01,0x01};
34     CRYPT_ATTR_BLOB blobs[] = { { sizeof blobbin, blobbin }, };
35     CRYPT_ATTRIBUTE attr = { "1.2.3", sizeof(blobs) / sizeof(blobs[0]), blobs };
36
37     /* returns NULL, last error not set */
38     SetLastError(0xdeadbeef);
39     ret = CertFindAttribute(NULL, 0, NULL);
40     ok(ret == NULL, "Expected failure\n");
41     ok(GetLastError() == 0xdeadbeef, "Last error was set to %08lx\n",
42      GetLastError());
43     /* crashes
44     SetLastError(0xdeadbeef);
45     ret = CertFindAttribute(NULL, 1, NULL);
46      */
47     /* returns NULL, last error is ERROR_INVALID_PARAMETER */
48     SetLastError(0xdeadbeef);
49     ret = CertFindAttribute(NULL, 1, &attr);
50     ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER,
51      "Expected ERROR_INVALID_PARAMETER, got %ld (%08lx)\n", GetLastError(),
52      GetLastError());
53     /* returns NULL, last error not set */
54     SetLastError(0xdeadbeef);
55     ret = CertFindAttribute("bogus", 1, &attr);
56     ok(ret == NULL, "Expected failure\n");
57     ok(GetLastError() == 0xdeadbeef, "Last error was set to %08lx\n",
58      GetLastError());
59     /* returns NULL, last error not set */
60     SetLastError(0xdeadbeef);
61     ret = CertFindAttribute("1.2.4", 1, &attr);
62     ok(ret == NULL, "Expected failure\n");
63     ok(GetLastError() == 0xdeadbeef, "Last error was set to %08lx\n",
64      GetLastError());
65     /* succeeds, last error not set */
66     SetLastError(0xdeadbeef);
67     ret = CertFindAttribute("1.2.3", 1, &attr);
68     ok(ret != NULL, "CertFindAttribute failed: %08lx\n", GetLastError());
69 }
70
71 static void test_findExtension(void)
72 {
73     PCERT_EXTENSION ret;
74     BYTE blobbin[] = {0x02,0x01,0x01};
75     CERT_EXTENSION ext = { "1.2.3", TRUE, { sizeof blobbin, blobbin } };
76
77     /* returns NULL, last error not set */
78     SetLastError(0xdeadbeef);
79     ret = CertFindExtension(NULL, 0, NULL);
80     ok(ret == NULL, "Expected failure\n");
81     ok(GetLastError() == 0xdeadbeef, "Last error was set to %08lx\n",
82      GetLastError());
83     /* crashes
84     SetLastError(0xdeadbeef);
85     ret = CertFindExtension(NULL, 1, NULL);
86      */
87     /* returns NULL, last error is ERROR_INVALID_PARAMETER */
88     SetLastError(0xdeadbeef);
89     ret = CertFindExtension(NULL, 1, &ext);
90     ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER,
91      "Expected ERROR_INVALID_PARAMETER, got %ld (%08lx)\n", GetLastError(),
92      GetLastError());
93     /* returns NULL, last error not set */
94     SetLastError(0xdeadbeef);
95     ret = CertFindExtension("bogus", 1, &ext);
96     ok(ret == NULL, "Expected failure\n");
97     ok(GetLastError() == 0xdeadbeef, "Last error was set to %08lx\n",
98      GetLastError());
99     /* returns NULL, last error not set */
100     SetLastError(0xdeadbeef);
101     ret = CertFindExtension("1.2.4", 1, &ext);
102     ok(ret == NULL, "Expected failure\n");
103     ok(GetLastError() == 0xdeadbeef, "Last error was set to %08lx\n",
104      GetLastError());
105     /* succeeds, last error not set */
106     SetLastError(0xdeadbeef);
107     ret = CertFindExtension("1.2.3", 1, &ext);
108     ok(ret != NULL, "CertFindExtension failed: %08lx\n", GetLastError());
109 }
110
111 static void test_findRDNAttr(void)
112 {
113     PCERT_RDN_ATTR ret;
114     BYTE bin[] = { 0x16,0x09,'J','u','a','n',' ','L','a','n','g' };
115     CERT_RDN_ATTR attrs[] = {
116      { "1.2.3", CERT_RDN_IA5_STRING, { sizeof bin, bin } },
117     };
118     CERT_RDN rdns[] = {
119      { sizeof(attrs) / sizeof(attrs[0]), attrs },
120     };
121     CERT_NAME_INFO nameInfo = { sizeof(rdns) / sizeof(rdns[0]), rdns };
122
123     /* crashes
124     SetLastError(0xdeadbeef);
125     ret = CertFindRDNAttr(NULL, NULL);
126      */
127     /* returns NULL, last error is ERROR_INVALID_PARAMETER */
128     SetLastError(0xdeadbeef);
129     ret = CertFindRDNAttr(NULL, &nameInfo);
130     ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER,
131      "Expected ERROR_INVALID_PARAMETER, got %ld (%08lx)\n", GetLastError(),
132      GetLastError());
133     /* returns NULL, last error not set */
134     SetLastError(0xdeadbeef);
135     ret = CertFindRDNAttr("bogus", &nameInfo);
136     ok(ret == NULL, "Expected failure\n");
137     ok(GetLastError() == 0xdeadbeef, "Last error was set to %08lx\n",
138      GetLastError());
139     /* returns NULL, last error not set */
140     SetLastError(0xdeadbeef);
141     ret = CertFindRDNAttr("1.2.4", &nameInfo);
142     ok(ret == NULL, "Expected failure\n");
143     ok(GetLastError() == 0xdeadbeef, "Last error was set to %08lx\n",
144      GetLastError());
145     /* succeeds, last error not set */
146     SetLastError(0xdeadbeef);
147     ret = CertFindRDNAttr("1.2.3", &nameInfo);
148     ok(ret != NULL, "CertFindRDNAttr failed: %08lx\n", GetLastError());
149 }
150
151 static void test_verifyTimeValidity(void)
152 {
153     SYSTEMTIME sysTime;
154     FILETIME fileTime;
155     CERT_INFO info = { 0 };
156     LONG ret;
157
158     GetSystemTime(&sysTime);
159     SystemTimeToFileTime(&sysTime, &fileTime);
160     /* crashes
161     ret = CertVerifyTimeValidity(NULL, NULL);
162     ret = CertVerifyTimeValidity(&fileTime, NULL);
163      */
164     /* Check with 0 NotBefore and NotAfter */
165     ret = CertVerifyTimeValidity(&fileTime, &info);
166     ok(ret == 1, "Expected 1, got %ld\n", ret);
167     memcpy(&info.NotAfter, &fileTime, sizeof(info.NotAfter));
168     /* Check with NotAfter equal to comparison time */
169     ret = CertVerifyTimeValidity(&fileTime, &info);
170     ok(ret == 0, "Expected 0, got %ld\n", ret);
171     /* Check with NotBefore after comparison time */
172     memcpy(&info.NotBefore, &fileTime, sizeof(info.NotBefore));
173     info.NotBefore.dwLowDateTime += 5000;
174     ret = CertVerifyTimeValidity(&fileTime, &info);
175     ok(ret == -1, "Expected -1, got %ld\n", ret);
176 }
177
178 static void test_cryptAllocate(void)
179 {
180     LPVOID buf;
181
182     buf = CryptMemAlloc(0);
183     ok(buf != NULL, "CryptMemAlloc failed: %08lx\n", GetLastError());
184     CryptMemFree(buf);
185     buf = CryptMemRealloc(NULL, 0);
186     ok(!buf, "Expected NULL\n");
187     buf = CryptMemAlloc(0);
188     buf = CryptMemRealloc(buf, 1);
189     ok(buf != NULL, "CryptMemRealloc failed: %08lx\n", GetLastError());
190     CryptMemFree(buf);
191 }
192
193 typedef DWORD  (WINAPI *I_CryptAllocTlsFunc)(void);
194 typedef LPVOID (WINAPI *I_CryptDetachTlsFunc)(DWORD dwTlsIndex);
195 typedef LPVOID (WINAPI *I_CryptGetTlsFunc)(DWORD dwTlsIndex);
196 typedef BOOL   (WINAPI *I_CryptSetTlsFunc)(DWORD dwTlsIndex, LPVOID lpTlsValue);
197 typedef BOOL   (WINAPI *I_CryptFreeTlsFunc)(DWORD dwTlsIndex, DWORD unknown);
198
199 static I_CryptAllocTlsFunc pI_CryptAllocTls;
200 static I_CryptDetachTlsFunc pI_CryptDetachTls;
201 static I_CryptGetTlsFunc pI_CryptGetTls;
202 static I_CryptSetTlsFunc pI_CryptSetTls;
203 static I_CryptFreeTlsFunc pI_CryptFreeTls;
204
205 static void test_cryptTls(void)
206 {
207     HMODULE lib = LoadLibraryA("crypt32.dll");
208
209     if (lib)
210     {
211         DWORD index;
212         BOOL ret;
213
214         pI_CryptAllocTls = (I_CryptAllocTlsFunc)GetProcAddress(lib,
215          "I_CryptAllocTls");
216         pI_CryptDetachTls = (I_CryptDetachTlsFunc)GetProcAddress(lib,
217          "I_CryptDetachTls");
218         pI_CryptGetTls = (I_CryptGetTlsFunc)GetProcAddress(lib,
219          "I_CryptGetTls");
220         pI_CryptSetTls = (I_CryptSetTlsFunc)GetProcAddress(lib,
221          "I_CryptSetTls");
222         pI_CryptFreeTls = (I_CryptFreeTlsFunc)GetProcAddress(lib,
223          "I_CryptFreeTls");
224
225         /* One normal pass */
226         index = pI_CryptAllocTls();
227         ok(index, "I_CryptAllocTls failed: %08lx\n", GetLastError());
228         if (index)
229         {
230             LPVOID ptr;
231
232             ptr = pI_CryptGetTls(index);
233             ok(!ptr, "Expected NULL\n");
234             ret = pI_CryptSetTls(index, (LPVOID)0xdeadbeef);
235             ok(ret, "I_CryptSetTls failed: %08lx\n", GetLastError());
236             ptr = pI_CryptGetTls(index);
237             ok(ptr == (LPVOID)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", ptr);
238             /* This crashes
239             ret = pI_CryptFreeTls(index, 1);
240              */
241             ret = pI_CryptFreeTls(index, 0);
242             ok(ret, "I_CryptFreeTls failed: %08lx\n", GetLastError());
243             ret = pI_CryptFreeTls(index, 0);
244             /* Not sure if this fails because TlsFree should fail, so leave as
245              * todo for now.
246              */
247             todo_wine ok(!ret && GetLastError() ==
248              HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER),
249              "Expected HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER), got %08lx\n",
250              GetLastError());
251         }
252         /* Similar pass, check I_CryptDetachTls */
253         index = pI_CryptAllocTls();
254         ok(index, "I_CryptAllocTls failed: %08lx\n", GetLastError());
255         if (index)
256         {
257             LPVOID ptr;
258
259             ptr = pI_CryptGetTls(index);
260             ok(!ptr, "Expected NULL\n");
261             ret = pI_CryptSetTls(index, (LPVOID)0xdeadbeef);
262             ok(ret, "I_CryptSetTls failed: %08lx\n", GetLastError());
263             ptr = pI_CryptGetTls(index);
264             ok(ptr == (LPVOID)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", ptr);
265             ptr = pI_CryptDetachTls(index);
266             ok(ptr == (LPVOID)0xdeadbeef, "Expected 0xdeadbeef, got %p\n", ptr);
267             ptr = pI_CryptGetTls(index);
268             ok(!ptr, "Expected NULL\n");
269         }
270         FreeLibrary(lib);
271     }
272 }
273
274 START_TEST(main)
275 {
276     test_findAttribute();
277     test_findExtension();
278     test_findRDNAttr();
279     test_verifyTimeValidity();
280     test_cryptAllocate();
281     test_cryptTls();
282 }