1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4 /*
5 * test_error.c
6 *
7 * Tests Error Object Creation, ToString, Callbacks and Destroy
8 *
9 */
10
11 #include "testutil.h"
12 #include "testutil_nss.h"
13
14 static void *plContext = NULL;
15
16 static void
createErrors(PKIX_Error ** error,PKIX_Error ** error2,PKIX_Error ** error3,PKIX_Error ** error5,PKIX_Error ** error6,PKIX_Error ** error7,char * infoChar)17 createErrors(
18 PKIX_Error **error,
19 PKIX_Error **error2,
20 PKIX_Error **error3,
21 PKIX_Error **error5,
22 PKIX_Error **error6,
23 PKIX_Error **error7,
24 char *infoChar)
25
26 {
27 PKIX_PL_String *infoString = NULL;
28
29 PKIX_TEST_STD_VARS();
30
31 PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_String_Create(
32 PKIX_ESCASCII,
33 infoChar,
34 PL_strlen(infoChar),
35 &infoString,
36 plContext));
37
38 PKIX_TEST_EXPECT_NO_ERROR(PKIX_Error_Create(PKIX_MEM_ERROR,
39 NULL,
40 NULL,
41 PKIX_TESTANOTHERERRORMESSAGE,
42 error2,
43 plContext));
44
45 PKIX_TEST_EXPECT_NO_ERROR(PKIX_Error_Create(PKIX_OBJECT_ERROR,
46 *error2,
47 (PKIX_PL_Object *)infoString,
48 PKIX_TESTERRORMESSAGE,
49 error,
50 plContext));
51
52 PKIX_TEST_EXPECT_NO_ERROR(PKIX_Error_Create(PKIX_OBJECT_ERROR,
53 *error2,
54 (PKIX_PL_Object *)infoString,
55 PKIX_TESTERRORMESSAGE,
56 error3,
57 plContext));
58
59 PKIX_TEST_EXPECT_NO_ERROR(PKIX_Error_Create(PKIX_OBJECT_ERROR,
60 NULL,
61 (PKIX_PL_Object *)infoString,
62 0,
63 error5,
64 plContext));
65
66 PKIX_TEST_EXPECT_NO_ERROR(PKIX_Error_Create(PKIX_MEM_ERROR,
67 *error5,
68 (PKIX_PL_Object *)infoString,
69 0,
70 error6,
71 plContext));
72
73 PKIX_TEST_EXPECT_NO_ERROR(PKIX_Error_Create(PKIX_OBJECT_ERROR,
74 *error6,
75 (PKIX_PL_Object *)infoString,
76 0,
77 error7,
78 plContext));
79
80 cleanup:
81
82 PKIX_TEST_DECREF_AC(infoString);
83
84 PKIX_TEST_RETURN();
85 }
86
87 static void
testGetErrorClass(PKIX_Error * error,PKIX_Error * error2)88 testGetErrorClass(PKIX_Error *error, PKIX_Error *error2)
89 {
90 PKIX_ERRORCLASS errClass;
91
92 PKIX_TEST_STD_VARS();
93
94 PKIX_TEST_EXPECT_NO_ERROR(PKIX_Error_GetErrorClass(error, &errClass, plContext));
95
96 if (errClass != PKIX_OBJECT_ERROR) {
97 testError("Incorrect Class Returned");
98 }
99
100 PKIX_TEST_EXPECT_NO_ERROR(PKIX_Error_GetErrorClass(error2, &errClass, plContext));
101
102 if (errClass != PKIX_MEM_ERROR) {
103 testError("Incorrect Class Returned");
104 }
105
106 PKIX_TEST_EXPECT_NO_ERROR(PKIX_Error_GetErrorClass(PKIX_ALLOC_ERROR(),
107 &errClass, plContext));
108 if (errClass != PKIX_FATAL_ERROR) {
109 testError("Incorrect Class Returned");
110 }
111
112 cleanup:
113 PKIX_TEST_RETURN();
114 }
115
116 static void
testGetDescription(PKIX_Error * error,PKIX_Error * error2,PKIX_Error * error3,char * descChar,char * descChar2)117 testGetDescription(
118 PKIX_Error *error,
119 PKIX_Error *error2,
120 PKIX_Error *error3,
121 char *descChar,
122 char *descChar2)
123 {
124
125 PKIX_PL_String *targetString = NULL;
126 char *temp = NULL;
127
128 PKIX_TEST_STD_VARS();
129
130 PKIX_TEST_EXPECT_NO_ERROR(PKIX_Error_GetDescription(error, &targetString, plContext));
131 temp = PKIX_String2ASCII(targetString, plContext);
132 PKIX_TEST_DECREF_BC(targetString);
133
134 if (temp) {
135 if (PL_strcmp(temp, descChar) != 0) {
136 testError("Incorrect description returned");
137 }
138 PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Free(temp, plContext));
139 }
140
141 PKIX_TEST_EXPECT_NO_ERROR(PKIX_Error_GetDescription(error2, &targetString, plContext));
142 temp = PKIX_String2ASCII(targetString, plContext);
143 PKIX_TEST_DECREF_BC(targetString);
144
145 if (temp) {
146 if (PL_strcmp(temp, descChar2) != 0) {
147 testError("Incorrect description returned");
148 }
149 PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Free(temp, plContext));
150 }
151
152 PKIX_TEST_EXPECT_NO_ERROR(PKIX_Error_GetDescription(error3, &targetString, plContext));
153 temp = PKIX_String2ASCII(targetString, plContext);
154 PKIX_TEST_DECREF_BC(targetString);
155
156 if (temp) {
157 if (PL_strcmp(temp, descChar) != 0) {
158 testError("Incorrect description returned");
159 }
160 PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Free(temp, plContext));
161 }
162
163 cleanup:
164
165 PKIX_TEST_RETURN();
166 }
167
168 static void
testGetCause(PKIX_Error * error,PKIX_Error * error2,PKIX_Error * error3)169 testGetCause(PKIX_Error *error, PKIX_Error *error2, PKIX_Error *error3)
170 {
171
172 PKIX_Error *error4 = NULL;
173 PKIX_PL_String *targetString = NULL;
174 char *temp = NULL;
175 PKIX_Boolean boolResult;
176
177 PKIX_TEST_STD_VARS();
178
179 PKIX_TEST_EXPECT_NO_ERROR(PKIX_Error_GetCause(error, &error4, plContext));
180
181 PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Object_Equals((PKIX_PL_Object *)error2,
182 (PKIX_PL_Object *)error4,
183 &boolResult, plContext));
184 if (!boolResult)
185 testError("Incorrect Cause returned");
186
187 PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Object_ToString((PKIX_PL_Object *)error4,
188 &targetString, plContext));
189
190 temp = PKIX_String2ASCII(targetString, plContext);
191 if (temp) {
192 PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Free(temp, plContext));
193 }
194
195 PKIX_TEST_DECREF_BC(targetString);
196 PKIX_TEST_DECREF_BC(error4);
197
198 PKIX_TEST_EXPECT_NO_ERROR(PKIX_Error_GetCause(error3, &error4, plContext));
199 PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Object_Equals((PKIX_PL_Object *)error2,
200 (PKIX_PL_Object *)error4,
201 &boolResult, plContext));
202 if (!boolResult)
203 testError("Incorrect Cause returned");
204
205 PKIX_TEST_DECREF_BC(error4);
206
207 cleanup:
208
209 PKIX_TEST_RETURN();
210 }
211
212 static void
testGetSupplementaryInfo(PKIX_Error * error,char * infoChar)213 testGetSupplementaryInfo(PKIX_Error *error, char *infoChar)
214 {
215
216 PKIX_PL_Object *targetString = NULL;
217 char *temp = NULL;
218
219 PKIX_TEST_STD_VARS();
220
221 PKIX_TEST_EXPECT_NO_ERROR(PKIX_Error_GetSupplementaryInfo(error, &targetString, plContext));
222 temp = PKIX_String2ASCII((PKIX_PL_String *)targetString, plContext);
223 PKIX_TEST_DECREF_BC(targetString);
224
225 if (temp) {
226 if (PL_strcmp(temp, infoChar) != 0) {
227 testError("Incorrect info returned");
228 }
229 PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Free(temp, plContext));
230 }
231
232 cleanup:
233
234 PKIX_TEST_RETURN();
235 }
236
237 static void
testPrimitiveError(void)238 testPrimitiveError(void)
239 {
240 PKIX_PL_String *targetString = NULL;
241 PKIX_PL_String *targetStringCopy = NULL;
242 char *temp = NULL;
243
244 PKIX_TEST_STD_VARS();
245
246 PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Object_ToString((PKIX_PL_Object *)PKIX_ALLOC_ERROR(),
247 &targetString, plContext));
248
249 temp = PKIX_String2ASCII(targetString, plContext);
250 if (temp) {
251 PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Free(temp, plContext));
252 }
253
254 targetStringCopy = targetString;
255
256 PKIX_TEST_DECREF_BC(targetString);
257
258 /*
259 * We need to DECREF twice, b/c the PKIX_ALLOC_ERROR object
260 * which holds a cached copy of the stringRep can never be DECREF'd
261 */
262 PKIX_TEST_DECREF_BC(targetStringCopy);
263
264 cleanup:
265
266 PKIX_TEST_RETURN();
267 }
268
269 static void
testChaining(PKIX_Error * error7)270 testChaining(PKIX_Error *error7)
271 {
272 PKIX_PL_String *targetString = NULL;
273 PKIX_Error *tempError = NULL;
274 char *temp = NULL;
275 PKIX_UInt32 i;
276
277 PKIX_TEST_STD_VARS();
278
279 PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Object_ToString((PKIX_PL_Object *)error7,
280 &targetString, plContext));
281
282 temp = PKIX_String2ASCII(targetString, plContext);
283 if (temp) {
284 PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Free(temp, plContext));
285 }
286
287 for (i = 0, tempError = error7; i < 2; i++) {
288 PKIX_TEST_EXPECT_NO_ERROR(PKIX_Error_GetCause(tempError, &tempError, plContext));
289 if (tempError == NULL) {
290 testError("Unexpected end to error chain");
291 break;
292 }
293
294 PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Object_DecRef((PKIX_PL_Object *)tempError, plContext));
295 }
296
297 PKIX_TEST_DECREF_BC(targetString);
298
299 cleanup:
300
301 PKIX_TEST_RETURN();
302 }
303
304 static void
testDestroy(PKIX_Error * error)305 testDestroy(PKIX_Error *error)
306 {
307 PKIX_TEST_STD_VARS();
308
309 PKIX_TEST_DECREF_BC(error);
310
311 cleanup:
312
313 PKIX_TEST_RETURN();
314 }
315
316 int
test_error(int argc,char * argv[])317 test_error(int argc, char *argv[])
318 {
319
320 PKIX_Error *error, *error2, *error3, *error5, *error6, *error7;
321 char *descChar = "Error Message";
322 char *descChar2 = "Another Error Message";
323 char *infoChar = "Auxiliary Info";
324 PKIX_UInt32 actualMinorVersion;
325 PKIX_UInt32 j = 0;
326
327 PKIX_TEST_STD_VARS();
328
329 startTests("Errors");
330
331 PKIX_TEST_EXPECT_NO_ERROR(
332 PKIX_PL_NssContext_Create(0, PKIX_FALSE, NULL, &plContext));
333
334 subTest("PKIX_Error_Create");
335 createErrors(&error,
336 &error2,
337 &error3,
338 &error5,
339 &error6,
340 &error7,
341 infoChar);
342
343 PKIX_TEST_EQ_HASH_TOSTR_DUP(error,
344 error,
345 error2,
346 NULL,
347 Error,
348 PKIX_TRUE);
349
350 subTest("PKIX_Error_GetErrorClass");
351 testGetErrorClass(error, error2);
352
353 subTest("PKIX_Error_GetDescription");
354 testGetDescription(error, error2, error3, descChar, descChar2);
355
356 subTest("PKIX_Error_GetCause");
357 testGetCause(error, error2, error3);
358
359 subTest("PKIX_Error_GetSupplementaryInfo");
360 testGetSupplementaryInfo(error, infoChar);
361
362 subTest("Primitive Error Type");
363 testPrimitiveError();
364
365 subTest("Error Chaining");
366 testChaining(error7);
367
368 subTest("PKIX_Error_Destroy");
369 testDestroy(error);
370 testDestroy(error2);
371 testDestroy(error3);
372 testDestroy(error5);
373 testDestroy(error6);
374 testDestroy(error7);
375
376 cleanup:
377
378 PKIX_Shutdown(plContext);
379
380 PKIX_TEST_RETURN();
381
382 endTests("Errors");
383
384 return (0);
385 }
386