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