tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 }