test_error.c (11002B)
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 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 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 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 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 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 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 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 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 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 }