tor-browser

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

test_policynode.c (24118B)


      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_policynode.c
      6 *
      7 * Test PolicyNode Type
      8 *
      9 */
     10 
     11 #include "testutil.h"
     12 #include "testutil_nss.h"
     13 
     14 static void *plContext = NULL;
     15 
     16 static void
     17 test_GetChildren(
     18    PKIX_PolicyNode *goodNode,
     19    PKIX_PolicyNode *equalNode,
     20    PKIX_PolicyNode *diffNode)
     21 {
     22 
     23    /*
     24     * Caution: be careful where you insert this test. PKIX_PolicyNode_GetChildren
     25     * is required by the API to return an immutable List, and it does it by setting
     26     * the List immutable. We don't make a copy because the assumption is that
     27     * certificate and policy processing have been completed before the user gets at
     28     * the public API. So subsequent tests of functions that modify the policy tree,
     29     * such as Prune, will fail if called after the execution of this test.
     30     */
     31 
     32    PKIX_Boolean isImmutable = PKIX_FALSE;
     33    PKIX_List *goodList = NULL;
     34    PKIX_List *equalList = NULL;
     35    PKIX_List *diffList = NULL;
     36 
     37    PKIX_TEST_STD_VARS();
     38 
     39    subTest("PKIX_PolicyNode_GetChildren");
     40 
     41    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PolicyNode_GetChildren(goodNode, &goodList, plContext));
     42    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PolicyNode_GetChildren(equalNode, &equalList, plContext));
     43    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PolicyNode_GetChildren(diffNode, &diffList, plContext));
     44 
     45    PKIX_TEST_EQ_HASH_TOSTR_DUP(goodList, equalList, diffList, NULL, List, NULL);
     46 
     47    PKIX_TEST_EXPECT_NO_ERROR(PKIX_List_IsImmutable(goodList, &isImmutable, plContext));
     48 
     49    if (isImmutable != PKIX_TRUE) {
     50        testError("PKIX_PolicyNode_GetChildren returned a mutable List");
     51    }
     52 
     53 cleanup:
     54    PKIX_TEST_DECREF_AC(goodList);
     55    PKIX_TEST_DECREF_AC(equalList);
     56    PKIX_TEST_DECREF_AC(diffList);
     57 
     58    PKIX_TEST_RETURN();
     59 }
     60 
     61 static void
     62 test_GetParent(
     63    PKIX_PolicyNode *goodNode,
     64    PKIX_PolicyNode *equalNode,
     65    PKIX_PolicyNode *diffNode,
     66    char *expectedAscii)
     67 {
     68    PKIX_PolicyNode *goodParent = NULL;
     69    PKIX_PolicyNode *equalParent = NULL;
     70    PKIX_PolicyNode *diffParent = NULL;
     71 
     72    PKIX_TEST_STD_VARS();
     73 
     74    subTest("PKIX_PolicyNode_GetParent");
     75 
     76    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PolicyNode_GetParent(goodNode, &goodParent, plContext));
     77    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PolicyNode_GetParent(equalNode, &equalParent, plContext));
     78    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PolicyNode_GetParent(diffNode, &diffParent, plContext));
     79 
     80    PKIX_TEST_EQ_HASH_TOSTR_DUP(goodParent,
     81                                equalParent,
     82                                diffParent,
     83                                expectedAscii,
     84                                CertPolicyNode,
     85                                NULL);
     86 
     87 cleanup:
     88    PKIX_TEST_DECREF_AC(goodParent);
     89    PKIX_TEST_DECREF_AC(equalParent);
     90    PKIX_TEST_DECREF_AC(diffParent);
     91 
     92    PKIX_TEST_RETURN();
     93 }
     94 
     95 /*
     96 * This test is the same as testDuplicateHelper, except that it
     97 * produces a more useful "Actual value" and "Expected value"
     98 * in the case of an unexpected mismatch.
     99 */
    100 static void
    101 test_DuplicateHelper(PKIX_PolicyNode *object, void *plContext)
    102 {
    103    PKIX_PolicyNode *newObject = NULL;
    104    PKIX_Boolean cmpResult;
    105    PKIX_PL_String *original = NULL;
    106    PKIX_PL_String *copy = NULL;
    107 
    108    PKIX_TEST_STD_VARS();
    109 
    110    subTest("testing pkix_PolicyNode_Duplicate");
    111 
    112    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Object_Duplicate((PKIX_PL_Object *)object,
    113                                                       (PKIX_PL_Object **)&newObject,
    114                                                       plContext));
    115 
    116    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Object_Equals((PKIX_PL_Object *)object,
    117                                                    (PKIX_PL_Object *)newObject,
    118                                                    &cmpResult,
    119                                                    plContext));
    120 
    121    if (!cmpResult) {
    122        PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Object_ToString((PKIX_PL_Object *)object, &original, plContext));
    123        testError("unexpected mismatch");
    124        (void)printf("original value:\t%s\n", original->escAsciiString);
    125 
    126        if (newObject) {
    127            PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Object_ToString((PKIX_PL_Object *)newObject, &copy, plContext));
    128            (void)printf("copy value:\t%s\n", copy->escAsciiString);
    129        } else {
    130            (void)printf("copy value:\t(NULL)\n");
    131        }
    132    }
    133 
    134 cleanup:
    135 
    136    PKIX_TEST_DECREF_AC(newObject);
    137    PKIX_TEST_DECREF_AC(original);
    138    PKIX_TEST_DECREF_AC(copy);
    139 
    140    PKIX_TEST_RETURN();
    141 }
    142 
    143 static void
    144 test_GetValidPolicy(
    145    PKIX_PolicyNode *goodNode,
    146    PKIX_PolicyNode *equalNode,
    147    PKIX_PolicyNode *diffNode,
    148    char *expectedAscii)
    149 {
    150    PKIX_PL_OID *goodPolicy = NULL;
    151    PKIX_PL_OID *equalPolicy = NULL;
    152    PKIX_PL_OID *diffPolicy = NULL;
    153 
    154    PKIX_TEST_STD_VARS();
    155 
    156    subTest("PKIX_PolicyNode_GetValidPolicy");
    157 
    158    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PolicyNode_GetValidPolicy(goodNode, &goodPolicy, plContext));
    159    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PolicyNode_GetValidPolicy(equalNode, &equalPolicy, plContext));
    160    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PolicyNode_GetValidPolicy(diffNode, &diffPolicy, plContext));
    161 
    162    PKIX_TEST_EQ_HASH_TOSTR_DUP(goodPolicy, equalPolicy, diffPolicy, expectedAscii, OID, NULL);
    163 
    164 cleanup:
    165    PKIX_TEST_DECREF_AC(goodPolicy);
    166    PKIX_TEST_DECREF_AC(equalPolicy);
    167    PKIX_TEST_DECREF_AC(diffPolicy);
    168 
    169    PKIX_TEST_RETURN();
    170 }
    171 
    172 static void
    173 test_GetPolicyQualifiers(
    174    PKIX_PolicyNode *goodNode,
    175    PKIX_PolicyNode *equalNode,
    176    PKIX_PolicyNode *diffNode,
    177    char *expectedAscii)
    178 {
    179    PKIX_Boolean isImmutable = PKIX_FALSE;
    180    PKIX_List *goodList = NULL;
    181    PKIX_List *equalList = NULL;
    182    PKIX_List *diffList = NULL;
    183 
    184    PKIX_TEST_STD_VARS();
    185 
    186    subTest("PKIX_PolicyNode_GetPolicyQualifiers");
    187 
    188    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PolicyNode_GetPolicyQualifiers(goodNode, &goodList, plContext));
    189    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PolicyNode_GetPolicyQualifiers(equalNode, &equalList, plContext));
    190    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PolicyNode_GetPolicyQualifiers(diffNode, &diffList, plContext));
    191 
    192    PKIX_TEST_EQ_HASH_TOSTR_DUP(goodList, equalList, diffList, expectedAscii, List, plContext);
    193 
    194    PKIX_TEST_EXPECT_NO_ERROR(PKIX_List_IsImmutable(goodList, &isImmutable, plContext));
    195 
    196    if (isImmutable != PKIX_TRUE) {
    197        testError("PKIX_PolicyNode_GetPolicyQualifiers returned a mutable List");
    198    }
    199 cleanup:
    200    PKIX_TEST_DECREF_AC(goodList);
    201    PKIX_TEST_DECREF_AC(equalList);
    202    PKIX_TEST_DECREF_AC(diffList);
    203 
    204    PKIX_TEST_RETURN();
    205 }
    206 
    207 static void
    208 test_GetExpectedPolicies(
    209    PKIX_PolicyNode *goodNode,
    210    PKIX_PolicyNode *equalNode,
    211    PKIX_PolicyNode *diffNode,
    212    char *expectedAscii)
    213 {
    214    PKIX_Boolean isImmutable = PKIX_FALSE;
    215    PKIX_List *goodList = NULL;
    216    PKIX_List *equalList = NULL;
    217    PKIX_List *diffList = NULL;
    218 
    219    PKIX_TEST_STD_VARS();
    220 
    221    subTest("PKIX_PolicyNode_GetExpectedPolicies");
    222 
    223    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PolicyNode_GetExpectedPolicies(goodNode, &goodList, plContext));
    224    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PolicyNode_GetExpectedPolicies(equalNode, &equalList, plContext));
    225    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PolicyNode_GetExpectedPolicies(diffNode, &diffList, plContext));
    226 
    227    PKIX_TEST_EQ_HASH_TOSTR_DUP(goodList, equalList, diffList, expectedAscii, List, plContext);
    228 
    229    PKIX_TEST_EXPECT_NO_ERROR(PKIX_List_IsImmutable(goodList, &isImmutable, plContext));
    230 
    231    if (isImmutable != PKIX_TRUE) {
    232        testError("PKIX_PolicyNode_GetExpectedPolicies returned a mutable List");
    233    }
    234 cleanup:
    235    PKIX_TEST_DECREF_AC(goodList);
    236    PKIX_TEST_DECREF_AC(equalList);
    237    PKIX_TEST_DECREF_AC(diffList);
    238 
    239    PKIX_TEST_RETURN();
    240 }
    241 
    242 static void
    243 test_IsCritical(
    244    PKIX_PolicyNode *goodNode,
    245    PKIX_PolicyNode *equalNode,
    246    PKIX_PolicyNode *diffNode)
    247 {
    248    PKIX_Boolean goodBool = PKIX_FALSE;
    249    PKIX_Boolean equalBool = PKIX_FALSE;
    250    PKIX_Boolean diffBool = PKIX_FALSE;
    251    PKIX_TEST_STD_VARS();
    252 
    253    subTest("PKIX_PolicyNode_IsCritical");
    254 
    255    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PolicyNode_IsCritical(goodNode, &goodBool, plContext));
    256    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PolicyNode_IsCritical(equalNode, &equalBool, plContext));
    257    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PolicyNode_IsCritical(diffNode, &diffBool, plContext));
    258 
    259    if ((!goodBool) || (!equalBool) || (diffBool)) {
    260        testError("IsCritical returned unexpected value");
    261    }
    262 cleanup:
    263 
    264    PKIX_TEST_RETURN();
    265 }
    266 
    267 static void
    268 test_GetDepth(
    269    PKIX_PolicyNode *depth1Node,
    270    PKIX_PolicyNode *depth2Node,
    271    PKIX_PolicyNode *depth3Node)
    272 {
    273    PKIX_UInt32 depth1 = 0;
    274    PKIX_UInt32 depth2 = 0;
    275    PKIX_UInt32 depth3 = 0;
    276    PKIX_TEST_STD_VARS();
    277 
    278    subTest("PKIX_PolicyNode_GetDepth");
    279 
    280    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PolicyNode_GetDepth(depth1Node, &depth1, plContext));
    281    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PolicyNode_GetDepth(depth2Node, &depth2, plContext));
    282    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PolicyNode_GetDepth(depth3Node, &depth3, plContext));
    283 
    284    if ((depth1 != 1) || (depth2 != 2) || (depth3 != 3)) {
    285        testError("GetDepth returned unexpected value");
    286    }
    287 
    288 cleanup:
    289 
    290    PKIX_TEST_RETURN();
    291 }
    292 
    293 static void
    294 printUsage(void)
    295 {
    296    (void)printf("\nUSAGE:\ttest_policynode <NIST_FILES_DIR> \n\n");
    297 }
    298 
    299 int
    300 test_policynode(int argc, char *argv[])
    301 {
    302 
    303    /*
    304     * Create a tree with parent = anyPolicy,
    305     * child1 with Nist1+Nist2, child2 with Nist1.
    306     * Give each child another child, with policies Nist2
    307     * and Nist1, respectively. Pruning with a depth of two
    308     * should have no effect. Give one of the children
    309     * another child. Then pruning with a depth of three
    310     * should reduce the tree to a single strand, as child1
    311     * and child3 are removed.
    312     *
    313     *              parent (anyPolicy)
    314     *          /                   \
    315     *      child1(Nist1+Nist2)     child2(Nist1)
    316     *          |                       |
    317     *      child3(Nist2)           child4(Nist1)
    318     *                                  |
    319     *                              child5(Nist1)
    320     *
    321     */
    322    char *asciiAnyPolicy = "2.5.29.32.0";
    323    PKIX_PL_Cert *cert = NULL;
    324    PKIX_PL_CertPolicyInfo *nist1Policy = NULL;
    325    PKIX_PL_CertPolicyInfo *nist2Policy = NULL;
    326    PKIX_List *policyQualifierList = NULL;
    327    PKIX_PL_OID *oidAnyPolicy = NULL;
    328    PKIX_PL_OID *oidNist1Policy = NULL;
    329    PKIX_PL_OID *oidNist2Policy = NULL;
    330    PKIX_List *expectedAnyList = NULL;
    331    PKIX_List *expectedNist1List = NULL;
    332    PKIX_List *expectedNist2List = NULL;
    333    PKIX_List *expectedNist1Nist2List = NULL;
    334    PKIX_List *emptyList = NULL;
    335    PKIX_PolicyNode *parentNode = NULL;
    336    PKIX_PolicyNode *childNode1 = NULL;
    337    PKIX_PolicyNode *childNode2 = NULL;
    338    PKIX_PolicyNode *childNode3 = NULL;
    339    PKIX_PolicyNode *childNode4 = NULL;
    340    PKIX_PolicyNode *childNode5 = NULL;
    341    PKIX_PL_String *parentString = NULL;
    342    PKIX_Boolean pDelete = PKIX_FALSE;
    343    char *expectedParentAscii =
    344        "{2.16.840.1.101.3.2.1.48.2,(1.3.6.1.5.5.7.2.2:[30 5C "
    345        "1A 5A 71 31 3A 20 20 54 68 69 73 20 69 73 20 74 68 65"
    346        " 20 75 73 65 72 20 6E 6F 74 69 63 65 20 66 72 6F 6D 2"
    347        "0 71 75 61 6C 69 66 69 65 72 20 31 2E 20 20 54 68 69 "
    348        "73 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 66"
    349        " 6F 72 20 74 65 73 74 20 70 75 72 70 6F 73 65 73 20 6"
    350        "F 6E 6C 79]),Critical,(2.16.840.1.101.3.2.1.48.1[(1.3"
    351        ".6.1.5.5.7.2.2:[30 5C 1A 5A 71 31 3A 20 20 54 68 69 7"
    352        "3 20 69 73 20 74 68 65 20 75 73 65 72 20 6E 6F 74 69 "
    353        "63 65 20 66 72 6F 6D 20 71 75 61 6C 69 66 69 65 72 20"
    354        " 31 2E 20 20 54 68 69 73 20 63 65 72 74 69 66 69 63 6"
    355        "1 74 65 20 69 73 20 66 6F 72 20 74 65 73 74 20 70 75 "
    356        "72 70 6F 73 65 73 20 6F 6E 6C 79])], 2.16.840.1.101.3"
    357        ".2.1.48.2[(1.3.6.1.5.5.7.2.2:[30 5A 1A 58 71 32 3A 20"
    358        " 20 54 68 69 73 20 69 73 20 74 68 65 20 75 73 65 72 2"
    359        "0 6E 6F 74 69 63 65 20 66 72 6F 6D 20 71 75 61 6C 69 "
    360        "66 69 65 72 20 32 2E 20 20 54 68 69 73 20 75 73 65 72"
    361        " 20 6E 6F 74 69 63 65 20 73 68 6F 75 6C 64 20 6E 6F 7"
    362        "4 20 62 65 20 64 69 73 70 6C 61 79 65 64])]),1}\n"
    363        ". {2.16.840.1.101.3.2.1.48.2,(1.3.6.1.5.5.7.2.2:[30 5"
    364        "C 1A 5A 71 31 3A 20 20 54 68 69 73 20 69 73 20 74 68 "
    365        "65 20 75 73 65 72 20 6E 6F 74 69 63 65 20 66 72 6F 6D"
    366        " 20 71 75 61 6C 69 66 69 65 72 20 31 2E 20 20 54 68 6"
    367        "9 73 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 "
    368        "66 6F 72 20 74 65 73 74 20 70 75 72 70 6F 73 65 73 20"
    369        " 6F 6E 6C 79]),Critical,(2.16.840.1.101.3.2.1.48.2),2}";
    370    char *expectedValidAscii =
    371        "2.16.840.1.101.3.2.1.48.2";
    372    char *expectedQualifiersAscii =
    373        /* "(1.3.6.1.5.5.7.2.2)"; */
    374        "(1.3.6.1.5.5.7.2.2:[30 5C 1A 5A 71 31 3A 20 20 54 68 "
    375        "69 73 20 69 73 20 74 68 65 20 75 73 65 72 20 6E 6F 74"
    376        " 69 63 65 20 66 72 6F 6D 20 71 75 61 6C 69 66 69 65 7"
    377        "2 20 31 2E 20 20 54 68 69 73 20 63 65 72 74 69 66 69 "
    378        "63 61 74 65 20 69 73 20 66 6F 72 20 74 65 73 74 20 70"
    379        " 75 72 70 6F 73 65 73 20 6F 6E 6C 79])";
    380    char *expectedPoliciesAscii =
    381        "(2.16.840.1.101.3.2.1.48.1)";
    382    char *expectedTree =
    383        "{2.5.29.32.0,{},Critical,(2.5.29.32.0),0}\n"
    384        ". {2.16.840.1.101.3.2.1.48.2,(1.3.6.1.5.5.7.2.2:[30 5"
    385        "C 1A 5A 71 31 3A 20 20 54 68 69 73 20 69 73 20 74 68 "
    386        "65 20 75 73 65 72 20 6E 6F 74 69 63 65 20 66 72 6F 6D"
    387        " 20 71 75 61 6C 69 66 69 65 72 20 31 2E 20 20 54 68 6"
    388        "9 73 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 "
    389        "66 6F 72 20 74 65 73 74 20 70 75 72 70 6F 73 65 73 20"
    390        " 6F 6E 6C 79]),Critical,(2.16.840.1.101.3.2.1.48.1[(1"
    391        ".3.6.1.5.5.7.2.2:[30 5C 1A 5A 71 31 3A 20 20 54 68 69"
    392        " 73 20 69 73 20 74 68 65 20 75 73 65 72 20 6E 6F 74 6"
    393        "9 63 65 20 66 72 6F 6D 20 71 75 61 6C 69 66 69 65 72 "
    394        "20 31 2E 20 20 54 68 69 73 20 63 65 72 74 69 66 69 63"
    395        " 61 74 65 20 69 73 20 66 6F 72 20 74 65 73 74 20 70 7"
    396        "5 72 70 6F 73 65 73 20 6F 6E 6C 79])], 2.16.840.1.101"
    397        ".3.2.1.48.2[(1.3.6.1.5.5.7.2.2:[30 5A 1A 58 71 32 3A "
    398        "20 20 54 68 69 73 20 69 73 20 74 68 65 20 75 73 65 72"
    399        " 20 6E 6F 74 69 63 65 20 66 72 6F 6D 20 71 75 61 6C 6"
    400        "9 66 69 65 72 20 32 2E 20 20 54 68 69 73 20 75 73 65 "
    401        "72 20 6E 6F 74 69 63 65 20 73 68 6F 75 6C 64 20 6E 6F"
    402        " 74 20 62 65 20 64 69 73 70 6C 61 79 65 64])]"
    403        "),1}\n"
    404        ". . {2.16.840.1.101.3.2.1.48.2,(1.3.6.1.5.5.7.2.2:[30"
    405        " 5C 1A 5A 71 31 3A 20 20 54 68 69 73 20 69 73 20 74 6"
    406        "8 65 20 75 73 65 72 20 6E 6F 74 69 63 65 20 66 72 6F "
    407        "6D 20 71 75 61 6C 69 66 69 65 72 20 31 2E 20 20 54 68"
    408        " 69 73 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 2"
    409        "0 66 6F 72 20 74 65 73 74 20 70 75 72 70 6F 73 65 73 "
    410        "20 6F 6E 6C 79]),Critical,(2.16.840.1.101.3.2.1.48.2)"
    411        ",2}\n"
    412        ". {2.16.840.1.101.3.2.1.48.1,(1.3.6.1.5.5.7.2.2:[30 5"
    413        "C 1A 5A 71 31 3A 20 20 54 68 69 73 20 69 73 20 74 68 "
    414        "65 20 75 73 65 72 20 6E 6F 74 69 63 65 20 66 72 6F 6D"
    415        " 20 71 75 61 6C 69 66 69 65 72 20 31 2E 20 20 54 68 6"
    416        "9 73 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 "
    417        "66 6F 72 20 74 65 73 74 20 70 75 72 70 6F 73 65 73 20"
    418        " 6F 6E 6C 79]),Critical,(2.16.840.1.101.3.2.1.48.1),1}\n"
    419        ". . {2.16.840.1.101.3.2.1.48.1,(EMPTY),Not Critical,"
    420        "(2.16.840.1.101.3.2.1.48.1),2}\n"
    421        ". . . {2.16.840.1.101.3.2.1.48.1,{},Critical,(2.16.84"
    422        "0.1.101.3.2.1.48.1),3}";
    423    char *expectedPrunedTree =
    424        "{2.5.29.32.0,{},Critical,(2.5.29.32.0),0}\n"
    425        ". {2.16.840.1.101.3.2.1.48.1,(1.3.6.1.5.5.7.2.2:[30 5"
    426        "C 1A 5A 71 31 3A 20 20 54 68 69 73 20 69 73 20 74 68 "
    427        "65 20 75 73 65 72 20 6E 6F 74 69 63 65 20 66 72 6F 6D"
    428        " 20 71 75 61 6C 69 66 69 65 72 20 31 2E 20 20 54 68 6"
    429        "9 73 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 "
    430        "66 6F 72 20 74 65 73 74 20 70 75 72 70 6F 73 65 73 20"
    431        " 6F 6E 6C 79]),Critical,(2.16.840.1.101.3.2.1.48.1),1}\n"
    432        ". . {2.16.840.1.101.3.2.1.48.1,(EMPTY),Not Critical,"
    433        "(2.16.840.1.101.3.2.1.48.1),2}\n"
    434        ". . . {2.16.840.1.101.3.2.1.48.1,{},Critical,(2.16.84"
    435        "0.1.101.3.2.1.48.1),3}";
    436 
    437    PKIX_UInt32 actualMinorVersion;
    438    PKIX_UInt32 j = 0;
    439    char *dirName = NULL;
    440 
    441    PKIX_TEST_STD_VARS();
    442 
    443    if (argc < 2) {
    444        printUsage();
    445        return (0);
    446    }
    447 
    448    startTests("PolicyNode");
    449 
    450    PKIX_TEST_EXPECT_NO_ERROR(
    451        PKIX_PL_NssContext_Create(0, PKIX_FALSE, NULL, &plContext));
    452 
    453    dirName = argv[j + 1];
    454 
    455    subTest("Creating OID objects");
    456    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_OID_Create(asciiAnyPolicy, &oidAnyPolicy, plContext));
    457 
    458    /* Read certificates to get real policies, qualifiers */
    459 
    460    cert = createCert(dirName, "UserNoticeQualifierTest16EE.crt", plContext);
    461 
    462    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Cert_GetPolicyInformation(cert, &expectedNist1Nist2List, plContext));
    463    PKIX_TEST_EXPECT_NO_ERROR(PKIX_List_GetItem(expectedNist1Nist2List,
    464                                                0,
    465                                                (PKIX_PL_Object **)&nist1Policy,
    466                                                plContext));
    467    PKIX_TEST_EXPECT_NO_ERROR(PKIX_List_GetItem(expectedNist1Nist2List,
    468                                                1,
    469                                                (PKIX_PL_Object **)&nist2Policy,
    470                                                plContext));
    471 
    472    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_CertPolicyInfo_GetPolQualifiers(nist1Policy, &policyQualifierList, plContext));
    473 
    474    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_CertPolicyInfo_GetPolicyId(nist1Policy, &oidNist1Policy, plContext));
    475 
    476    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_CertPolicyInfo_GetPolicyId(nist2Policy, &oidNist2Policy, plContext));
    477 
    478    subTest("Creating expectedPolicy List objects");
    479 
    480    PKIX_TEST_EXPECT_NO_ERROR(PKIX_List_Create(&expectedAnyList, plContext));
    481 
    482    PKIX_TEST_EXPECT_NO_ERROR(PKIX_List_Create(&expectedNist1List, plContext));
    483 
    484    PKIX_TEST_EXPECT_NO_ERROR(PKIX_List_Create(&expectedNist2List, plContext));
    485 
    486    subTest("Populating expectedPolicy List objects");
    487 
    488    PKIX_TEST_EXPECT_NO_ERROR(PKIX_List_AppendItem(expectedAnyList, (PKIX_PL_Object *)oidAnyPolicy, plContext));
    489 
    490    PKIX_TEST_EXPECT_NO_ERROR(PKIX_List_AppendItem(expectedNist1List,
    491                                                   (PKIX_PL_Object *)oidNist1Policy,
    492                                                   plContext));
    493 
    494    PKIX_TEST_EXPECT_NO_ERROR(PKIX_List_AppendItem(expectedNist2List,
    495                                                   (PKIX_PL_Object *)oidNist2Policy,
    496                                                   plContext));
    497 
    498    subTest("Creating PolicyNode objects");
    499 
    500    PKIX_TEST_EXPECT_NO_ERROR(PKIX_List_Create(&emptyList, plContext));
    501 
    502    PKIX_TEST_EXPECT_NO_ERROR(pkix_PolicyNode_Create(oidAnyPolicy,
    503                                                     NULL,
    504                                                     PKIX_TRUE,
    505                                                     expectedAnyList,
    506                                                     &parentNode,
    507                                                     plContext));
    508 
    509    PKIX_TEST_EXPECT_NO_ERROR(pkix_PolicyNode_Create(oidNist2Policy,
    510                                                     policyQualifierList,
    511                                                     PKIX_TRUE,
    512                                                     expectedNist1Nist2List,
    513                                                     &childNode1,
    514                                                     plContext));
    515 
    516    PKIX_TEST_EXPECT_NO_ERROR(pkix_PolicyNode_Create(oidNist1Policy,
    517                                                     policyQualifierList,
    518                                                     PKIX_TRUE,
    519                                                     expectedNist1List,
    520                                                     &childNode2,
    521                                                     plContext));
    522 
    523    PKIX_TEST_EXPECT_NO_ERROR(pkix_PolicyNode_Create(oidNist2Policy,
    524                                                     policyQualifierList,
    525                                                     PKIX_TRUE,
    526                                                     expectedNist2List,
    527                                                     &childNode3,
    528                                                     plContext));
    529 
    530    PKIX_TEST_EXPECT_NO_ERROR(pkix_PolicyNode_Create(oidNist1Policy,
    531                                                     emptyList,
    532                                                     PKIX_FALSE,
    533                                                     expectedNist1List,
    534                                                     &childNode4,
    535                                                     plContext));
    536 
    537    PKIX_TEST_EXPECT_NO_ERROR(pkix_PolicyNode_Create(oidNist1Policy,
    538                                                     NULL,
    539                                                     PKIX_TRUE,
    540                                                     expectedNist1List,
    541                                                     &childNode5,
    542                                                     plContext));
    543 
    544    subTest("Creating the PolicyNode tree");
    545 
    546    PKIX_TEST_EXPECT_NO_ERROR(pkix_PolicyNode_AddToParent(parentNode, childNode1, plContext));
    547    PKIX_TEST_EXPECT_NO_ERROR(pkix_PolicyNode_AddToParent(parentNode, childNode2, plContext));
    548 
    549    PKIX_TEST_EXPECT_NO_ERROR(pkix_PolicyNode_AddToParent(childNode1, childNode3, plContext));
    550 
    551    PKIX_TEST_EXPECT_NO_ERROR(pkix_PolicyNode_AddToParent(childNode2, childNode4, plContext));
    552 
    553    PKIX_TEST_EXPECT_NO_ERROR(pkix_PolicyNode_AddToParent(childNode4, childNode5, plContext));
    554 
    555    subTest("Displaying PolicyNode objects");
    556 
    557    PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Object_ToString((PKIX_PL_Object *)parentNode, &parentString, plContext));
    558    (void)printf("parentNode is\n\t%s\n", parentString->escAsciiString);
    559 
    560    testToStringHelper((PKIX_PL_Object *)parentNode, expectedTree, plContext);
    561 
    562    test_DuplicateHelper(parentNode, plContext);
    563 
    564    test_GetParent(childNode3, childNode3, childNode4, expectedParentAscii);
    565    test_GetValidPolicy(childNode1, childNode3, parentNode, expectedValidAscii);
    566    test_GetPolicyQualifiers(childNode1, childNode3, childNode4, expectedQualifiersAscii);
    567    test_GetExpectedPolicies(childNode2, childNode4, childNode3, expectedPoliciesAscii);
    568    test_IsCritical(childNode1, childNode2, childNode4);
    569    test_GetDepth(childNode2, childNode4, childNode5);
    570 
    571    subTest("pkix_PolicyNode_Prune");
    572 
    573    PKIX_TEST_EXPECT_NO_ERROR(pkix_PolicyNode_Prune(parentNode, 2, &pDelete, plContext));
    574 
    575    testToStringHelper((PKIX_PL_Object *)parentNode, expectedTree, plContext);
    576 
    577    PKIX_TEST_EXPECT_NO_ERROR(pkix_PolicyNode_Prune(parentNode, 3, &pDelete, plContext));
    578 
    579    testToStringHelper((PKIX_PL_Object *)parentNode, expectedPrunedTree, plContext);
    580 
    581    test_GetChildren(parentNode, parentNode, childNode2);
    582 
    583 cleanup:
    584 
    585    PKIX_TEST_DECREF_AC(cert);
    586    PKIX_TEST_DECREF_AC(nist1Policy);
    587    PKIX_TEST_DECREF_AC(nist2Policy);
    588    PKIX_TEST_DECREF_AC(policyQualifierList);
    589    PKIX_TEST_DECREF_AC(oidAnyPolicy);
    590    PKIX_TEST_DECREF_AC(oidNist1Policy);
    591    PKIX_TEST_DECREF_AC(oidNist2Policy);
    592    PKIX_TEST_DECREF_AC(expectedAnyList);
    593    PKIX_TEST_DECREF_AC(expectedNist1List);
    594    PKIX_TEST_DECREF_AC(expectedNist2List);
    595    PKIX_TEST_DECREF_AC(expectedNist1Nist2List);
    596    PKIX_TEST_DECREF_AC(emptyList);
    597    PKIX_TEST_DECREF_AC(parentNode);
    598    PKIX_TEST_DECREF_AC(childNode1);
    599    PKIX_TEST_DECREF_AC(childNode2);
    600    PKIX_TEST_DECREF_AC(childNode3);
    601    PKIX_TEST_DECREF_AC(childNode4);
    602    PKIX_TEST_DECREF_AC(childNode5);
    603    PKIX_TEST_DECREF_AC(parentString);
    604 
    605    PKIX_Shutdown(plContext);
    606 
    607    PKIX_TEST_RETURN();
    608 
    609    endTests("PolicyNode");
    610 
    611    return (0);
    612 }