/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /* * test_error.c * * Tests Error Object Creation, ToString, Callbacks and Destroy * */ #include "testutil.h" #include "testutil_nss.h" static void *plContext = NULL; static void createErrors( PKIX_Error **error, PKIX_Error **error2, PKIX_Error **error3, PKIX_Error **error5, PKIX_Error **error6, PKIX_Error **error7, char *infoChar) { PKIX_PL_String *infoString = NULL; PKIX_TEST_STD_VARS(); PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_String_Create( PKIX_ESCASCII, infoChar, PL_strlen(infoChar), &infoString, plContext)); PKIX_TEST_EXPECT_NO_ERROR(PKIX_Error_Create(PKIX_MEM_ERROR, NULL, NULL, PKIX_TESTANOTHERERRORMESSAGE, error2, plContext)); PKIX_TEST_EXPECT_NO_ERROR(PKIX_Error_Create(PKIX_OBJECT_ERROR, *error2, (PKIX_PL_Object *)infoString, PKIX_TESTERRORMESSAGE, error, plContext)); PKIX_TEST_EXPECT_NO_ERROR(PKIX_Error_Create(PKIX_OBJECT_ERROR, *error2, (PKIX_PL_Object *)infoString, PKIX_TESTERRORMESSAGE, error3, plContext)); PKIX_TEST_EXPECT_NO_ERROR(PKIX_Error_Create(PKIX_OBJECT_ERROR, NULL, (PKIX_PL_Object *)infoString, 0, error5, plContext)); PKIX_TEST_EXPECT_NO_ERROR(PKIX_Error_Create(PKIX_MEM_ERROR, *error5, (PKIX_PL_Object *)infoString, 0, error6, plContext)); PKIX_TEST_EXPECT_NO_ERROR(PKIX_Error_Create(PKIX_OBJECT_ERROR, *error6, (PKIX_PL_Object *)infoString, 0, error7, plContext)); cleanup: PKIX_TEST_DECREF_AC(infoString); PKIX_TEST_RETURN(); } static void testGetErrorClass(PKIX_Error *error, PKIX_Error *error2) { PKIX_ERRORCLASS errClass; PKIX_TEST_STD_VARS(); PKIX_TEST_EXPECT_NO_ERROR(PKIX_Error_GetErrorClass(error, &errClass, plContext)); if (errClass != PKIX_OBJECT_ERROR) { testError("Incorrect Class Returned"); } PKIX_TEST_EXPECT_NO_ERROR(PKIX_Error_GetErrorClass(error2, &errClass, plContext)); if (errClass != PKIX_MEM_ERROR) { testError("Incorrect Class Returned"); } PKIX_TEST_EXPECT_NO_ERROR(PKIX_Error_GetErrorClass(PKIX_ALLOC_ERROR(), &errClass, plContext)); if (errClass != PKIX_FATAL_ERROR) { testError("Incorrect Class Returned"); } cleanup: PKIX_TEST_RETURN(); } static void testGetDescription( PKIX_Error *error, PKIX_Error *error2, PKIX_Error *error3, char *descChar, char *descChar2) { PKIX_PL_String *targetString = NULL; char *temp = NULL; PKIX_TEST_STD_VARS(); PKIX_TEST_EXPECT_NO_ERROR(PKIX_Error_GetDescription(error, &targetString, plContext)); temp = PKIX_String2ASCII(targetString, plContext); PKIX_TEST_DECREF_BC(targetString); if (temp) { if (PL_strcmp(temp, descChar) != 0) { testError("Incorrect description returned"); } PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Free(temp, plContext)); } PKIX_TEST_EXPECT_NO_ERROR(PKIX_Error_GetDescription(error2, &targetString, plContext)); temp = PKIX_String2ASCII(targetString, plContext); PKIX_TEST_DECREF_BC(targetString); if (temp) { if (PL_strcmp(temp, descChar2) != 0) { testError("Incorrect description returned"); } PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Free(temp, plContext)); } PKIX_TEST_EXPECT_NO_ERROR(PKIX_Error_GetDescription(error3, &targetString, plContext)); temp = PKIX_String2ASCII(targetString, plContext); PKIX_TEST_DECREF_BC(targetString); if (temp) { if (PL_strcmp(temp, descChar) != 0) { testError("Incorrect description returned"); } PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Free(temp, plContext)); } cleanup: PKIX_TEST_RETURN(); } static void testGetCause(PKIX_Error *error, PKIX_Error *error2, PKIX_Error *error3) { PKIX_Error *error4 = NULL; PKIX_PL_String *targetString = NULL; char *temp = NULL; PKIX_Boolean boolResult; PKIX_TEST_STD_VARS(); PKIX_TEST_EXPECT_NO_ERROR(PKIX_Error_GetCause(error, &error4, plContext)); PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Object_Equals((PKIX_PL_Object *)error2, (PKIX_PL_Object *)error4, &boolResult, plContext)); if (!boolResult) testError("Incorrect Cause returned"); PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Object_ToString((PKIX_PL_Object *)error4, &targetString, plContext)); temp = PKIX_String2ASCII(targetString, plContext); if (temp) { PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Free(temp, plContext)); } PKIX_TEST_DECREF_BC(targetString); PKIX_TEST_DECREF_BC(error4); PKIX_TEST_EXPECT_NO_ERROR(PKIX_Error_GetCause(error3, &error4, plContext)); PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Object_Equals((PKIX_PL_Object *)error2, (PKIX_PL_Object *)error4, &boolResult, plContext)); if (!boolResult) testError("Incorrect Cause returned"); PKIX_TEST_DECREF_BC(error4); cleanup: PKIX_TEST_RETURN(); } static void testGetSupplementaryInfo(PKIX_Error *error, char *infoChar) { PKIX_PL_Object *targetString = NULL; char *temp = NULL; PKIX_TEST_STD_VARS(); PKIX_TEST_EXPECT_NO_ERROR(PKIX_Error_GetSupplementaryInfo(error, &targetString, plContext)); temp = PKIX_String2ASCII((PKIX_PL_String *)targetString, plContext); PKIX_TEST_DECREF_BC(targetString); if (temp) { if (PL_strcmp(temp, infoChar) != 0) { testError("Incorrect info returned"); } PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Free(temp, plContext)); } cleanup: PKIX_TEST_RETURN(); } static void testPrimitiveError(void) { PKIX_PL_String *targetString = NULL; PKIX_PL_String *targetStringCopy = NULL; char *temp = NULL; PKIX_TEST_STD_VARS(); PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Object_ToString((PKIX_PL_Object *)PKIX_ALLOC_ERROR(), &targetString, plContext)); temp = PKIX_String2ASCII(targetString, plContext); if (temp) { PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Free(temp, plContext)); } targetStringCopy = targetString; PKIX_TEST_DECREF_BC(targetString); /* * We need to DECREF twice, b/c the PKIX_ALLOC_ERROR object * which holds a cached copy of the stringRep can never be DECREF'd */ PKIX_TEST_DECREF_BC(targetStringCopy); cleanup: PKIX_TEST_RETURN(); } static void testChaining(PKIX_Error *error7) { PKIX_PL_String *targetString = NULL; PKIX_Error *tempError = NULL; char *temp = NULL; PKIX_UInt32 i; PKIX_TEST_STD_VARS(); PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Object_ToString((PKIX_PL_Object *)error7, &targetString, plContext)); temp = PKIX_String2ASCII(targetString, plContext); if (temp) { PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Free(temp, plContext)); } for (i = 0, tempError = error7; i < 2; i++) { PKIX_TEST_EXPECT_NO_ERROR(PKIX_Error_GetCause(tempError, &tempError, plContext)); if (tempError == NULL) { testError("Unexpected end to error chain"); break; } PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Object_DecRef((PKIX_PL_Object *)tempError, plContext)); } PKIX_TEST_DECREF_BC(targetString); cleanup: PKIX_TEST_RETURN(); } static void testDestroy(PKIX_Error *error) { PKIX_TEST_STD_VARS(); PKIX_TEST_DECREF_BC(error); cleanup: PKIX_TEST_RETURN(); } int test_error(int argc, char *argv[]) { PKIX_Error *error, *error2, *error3, *error5, *error6, *error7; char *descChar = "Error Message"; char *descChar2 = "Another Error Message"; char *infoChar = "Auxiliary Info"; PKIX_UInt32 actualMinorVersion; PKIX_UInt32 j = 0; PKIX_TEST_STD_VARS(); startTests("Errors"); PKIX_TEST_EXPECT_NO_ERROR( PKIX_PL_NssContext_Create(0, PKIX_FALSE, NULL, &plContext)); subTest("PKIX_Error_Create"); createErrors(&error, &error2, &error3, &error5, &error6, &error7, infoChar); PKIX_TEST_EQ_HASH_TOSTR_DUP(error, error, error2, NULL, Error, PKIX_TRUE); subTest("PKIX_Error_GetErrorClass"); testGetErrorClass(error, error2); subTest("PKIX_Error_GetDescription"); testGetDescription(error, error2, error3, descChar, descChar2); subTest("PKIX_Error_GetCause"); testGetCause(error, error2, error3); subTest("PKIX_Error_GetSupplementaryInfo"); testGetSupplementaryInfo(error, infoChar); subTest("Primitive Error Type"); testPrimitiveError(); subTest("Error Chaining"); testChaining(error7); subTest("PKIX_Error_Destroy"); testDestroy(error); testDestroy(error2); testDestroy(error3); testDestroy(error5); testDestroy(error6); testDestroy(error7); cleanup: PKIX_Shutdown(plContext); PKIX_TEST_RETURN(); endTests("Errors"); return (0); }