security/nss/cmd/libpkix/testutil/testutil.c

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rwxr-xr-x

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     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  * testutil.c
     6  *
     7  * Utility error handling functions
     8  *
     9  */
    11 #include "testutil.h"
    13 /*
    14  * static global variable to keep track of total number of errors for
    15  * a particular test suite (eg. all the OID tests)
    16  */
    17 static int errCount = 0;
    19 /*
    20  * FUNCTION: startTests
    21  * DESCRIPTION:
    22  *
    23  *  Prints standard message for starting the test suite with the name pointed
    24  *  to by "testName". This function should be called in the beginning of every
    25  *  test suite.
    26  *
    27  * PARAMETERS:
    28  *  "testName"
    29  *      Address of string representing name of test suite.
    30  * THREAD SAFETY:
    31  *  Not Thread Safe - assumes exclusive access to "errCount"
    32  *  (see Thread Safety Definitions in Programmer's Guide)
    33  * RETURNS:
    34  *  Returns nothing.
    35  */
    36 void
    37 startTests(char *testName)
    38 {
    39         (void) printf("*START OF TESTS FOR %s:\n", testName);
    40         errCount = 0;
    41 }
    43 /*
    44  * FUNCTION: endTests
    45  * DESCRIPTION:
    46  *
    47  *  Prints standard message for ending the test suite with the name pointed
    48  *  to by "testName", followed by a success/failure message. This function
    49  *  should be called at the end of every test suite.
    50  *
    51  * PARAMETERS:
    52  *  "testName"
    53  *      Address of string representing name of test suite.
    54  * THREAD SAFETY:
    55  *  Not Thread Safe - assumes exclusive access to "errCount"
    56  *  (see Thread Safety Definitions in Programmer's Guide)
    57  * RETURNS:
    58  *  Returns nothing.
    59  */
    60 void
    61 endTests(char *testName)
    62 {
    63         char plural = ' ';
    65         (void) printf("*END OF TESTS FOR %s: ", testName);
    66         if (errCount > 0) {
    67                 if (errCount > 1) plural = 's';
    68                 (void) printf("%d SUBTEST%c FAILED.\n\n", errCount, plural);
    69         } else {
    70                 (void) printf("ALL TESTS COMPLETED SUCCESSFULLY.\n\n");
    71         }
    72 }
    74 /*
    75  * FUNCTION: subTest
    76  * DESCRIPTION:
    77  *
    78  *  Prints standard message for starting the subtest with the name pointed to
    79  *  by "subTestName". This function should be called at the beginning of each
    80  *  subtest.
    81  *
    82  * PARAMETERS:
    83  *  "subTestName"
    84  *      Address of string representing name of subTest.
    85  * THREAD SAFETY:
    86  *  Thread Safe (see Thread Safety Definitions in Programmer's Guide)
    87  * RETURNS:
    88  *  Returns nothing.
    89  */
    90 void
    91 subTest(char *subTestName)
    92 {
    93         (void) printf("TESTING: %s ...\n", subTestName);
    94 }
    96 /*
    97  * FUNCTION: testErrorUndo
    98  * DESCRIPTION:
    99  *
   100  *  Decrements the global variable "errCount" and prints a test failure
   101  *  expected message followed by the string pointed to by "msg". This function
   102  *  should be called when an expected error condition is encountered in the
   103  *  tests. Calling this function *correct* the previous errCount increment.
   104  *  It should only be called ONCE per subtest.
   105  *
   106  * PARAMETERS:
   107  *  "msg"
   108  *      Address of text of error message.
   109  * THREAD SAFETY:
   110  *  Not Thread Safe - assumes exclusive access to "errCount"
   111  *  (see Thread Safety Definitions in Programmer's Guide)
   112  * RETURNS:
   113  *  Returns nothing.
   114  */
   115 void
   116 testErrorUndo(char *msg)
   117 {
   118         --errCount;
   119         (void) printf("TEST FAILURE *** EXPECTED *** :%s\n", msg);
   120 }
   122 /*
   123  * FUNCTION: testError
   124  * DESCRIPTION:
   125  *
   126  *  Increments the global variable "errCount" and prints a standard test
   127  *  failure message followed by the string pointed to by "msg". This function
   128  *  should be called when an unexpected error condition is encountered in the
   129  *  tests. It should only be called ONCE per subtest.
   130  *
   131  * PARAMETERS:
   132  *  "msg"
   133  *      Address of text of error message.
   134  * THREAD SAFETY:
   135  *  Not Thread Safe - assumes exclusive access to "errCount"
   136  *  (see Thread Safety Definitions in Programmer's Guide)
   137  * RETURNS:
   138  *  Returns nothing.
   139  */
   140 void
   141 testError(char *msg)
   142 {
   143         ++errCount;
   144         (void) printf("TEST FAILURE: %s\n", msg);
   145 }
   147 /*
   148  * FUNCTION: PKIX_String2ASCII
   149  * DESCRIPTION:
   150  *
   151  *  Converts String object pointed to by "string" to its ASCII representation
   152  *  and returns the converted value. Returns NULL upon failure.
   153  *
   154  *  XXX Might want to use ESCASCII_DEBUG to show control characters, etc.
   155  *
   156  * PARAMETERS:
   157  *  "string"
   158  *      Address of String to be converted to ASCII. Must be non-NULL.
   159  *  "plContext"
   160  *      Platform-specific context pointer.
   161  * THREAD SAFETY:
   162  *  Thread Safe (see Thread Safety Definitions in Programmer's Guide)
   163  * RETURNS:
   164  *  Returns the ASCII representation of "string" upon success;
   165  *  NULL upon failure.
   166  */
   167 char *
   168 PKIX_String2ASCII(PKIX_PL_String *string, void *plContext)
   169 {
   170         PKIX_UInt32 length;
   171         char *asciiString = NULL;
   172         PKIX_Error *errorResult;
   174         errorResult = PKIX_PL_String_GetEncoded
   175                 (string,
   176                 PKIX_ESCASCII,
   177                 (void **)&asciiString,
   178                 &length,
   179                 plContext);
   181         if (errorResult) goto cleanup;
   183 cleanup:
   185         if (errorResult){
   186                 return (NULL);
   187         }
   189         return (asciiString);
   191 }
   193 /*
   194  * FUNCTION: PKIX_Error2ASCII
   195  * DESCRIPTION:
   196  *
   197  *  Converts Error pointed to by "error" to its ASCII representation and
   198  *  returns the converted value. Returns NULL upon failure.
   199  *
   200  * PARAMETERS:
   201  *  "error"
   202  *      Address of Error to be converted to ASCII. Must be non-NULL.
   203  *  "plContext"
   204  *      Platform-specific context pointer.
   205  * THREAD SAFETY:
   206  *  Thread Safe (see Thread Safety Definitions in Programmer's Guide)
   207  * RETURNS:
   208  *  Returns the ASCII representation of "error" upon success;
   209  *  NULL upon failure.
   210  */
   211 char *
   212 PKIX_Error2ASCII(PKIX_Error *error, void *plContext)
   213 {
   214         PKIX_UInt32 length;
   215         char *asciiString = NULL;
   216         PKIX_PL_String *pkixString = NULL;
   217         PKIX_Error *errorResult = NULL;
   219         errorResult = PKIX_PL_Object_ToString
   220                 ((PKIX_PL_Object*)error, &pkixString, plContext);
   221         if (errorResult) goto cleanup;
   223         errorResult = PKIX_PL_String_GetEncoded
   224                 (pkixString,
   225                 PKIX_ESCASCII,
   226                 (void **)&asciiString,
   227                 &length,
   228                 plContext);
   230 cleanup:
   232         if (pkixString){
   233                 if (PKIX_PL_Object_DecRef
   234                     ((PKIX_PL_Object*)pkixString, plContext)){
   235                         return (NULL);
   236                 }
   237         }
   239         if (errorResult){
   240                 return (NULL);
   241         }
   243         return (asciiString);
   244 }
   246 /*
   247  * FUNCTION: PKIX_Object2ASCII
   248  * DESCRIPTION:
   249  *
   250  *  Converts Object pointed to by "object" to its ASCII representation and
   251  *  returns the converted value. Returns NULL upon failure.
   252  *
   253  * PARAMETERS:
   254  *  "object"
   255  *      Address of Object to be converted to ASCII. Must be non-NULL.
   256  * THREAD SAFETY:
   257  *  Thread Safe (see Thread Safety Definitions in Programmer's Guide)
   258  * RETURNS:
   259  *  Returns the ASCII representation of "object" upon success;
   260  *  NULL upon failure.
   261  */
   262 char *
   263 PKIX_Object2ASCII(PKIX_PL_Object *object)
   264 {
   265         PKIX_UInt32 length;
   266         char *asciiString = NULL;
   267         PKIX_PL_String *pkixString = NULL;
   268         PKIX_Error *errorResult = NULL;
   270         errorResult = PKIX_PL_Object_ToString
   271                 (object, &pkixString, NULL);
   272         if (errorResult) goto cleanup;
   274         errorResult = PKIX_PL_String_GetEncoded
   275             (pkixString, PKIX_ESCASCII, (void **)&asciiString, &length, NULL);
   277 cleanup:
   279         if (pkixString){
   280                 if (PKIX_PL_Object_DecRef((PKIX_PL_Object*)pkixString, NULL)){
   281                         return (NULL);
   282                 }
   283         }
   285         if (errorResult){
   286                 return (NULL);
   287         }
   289         return (asciiString);
   290 }
   292 /*
   293  * FUNCTION: PKIX_Cert2ASCII
   294  * DESCRIPTION:
   295  *
   296  *  Converts Cert pointed to by "cert" to its partial ASCII representation and
   297  *  returns the converted value. Returns NULL upon failure.
   298  *
   299  * PARAMETERS:
   300  *  "cert"
   301  *      Address of Cert to be converted to ASCII. Must be non-NULL.
   302  * THREAD SAFETY:
   303  *  Thread Safe (see Thread Safety Definitions in Programmer's Guide)
   304  * RETURNS:
   305  *  Returns the partial ASCII representation of "cert" upon success;
   306  *  NULL upon failure.
   307  */
   308 char *
   309 PKIX_Cert2ASCII(PKIX_PL_Cert *cert)
   310 {
   311         PKIX_PL_X500Name *issuer = NULL;
   312         void *issuerAscii = NULL;
   313         PKIX_PL_X500Name *subject = NULL;
   314         void *subjectAscii = NULL;
   315         void *asciiString = NULL;
   316         PKIX_Error *errorResult = NULL;
   317         PKIX_UInt32 numChars;
   319         /* Issuer */
   320         errorResult = PKIX_PL_Cert_GetIssuer(cert, &issuer, NULL);
   321         if (errorResult) goto cleanup;
   323         issuerAscii = PKIX_Object2ASCII((PKIX_PL_Object*)issuer);
   325         /* Subject */
   326         errorResult = PKIX_PL_Cert_GetSubject(cert, &subject, NULL);
   327         if (errorResult) goto cleanup;
   329         if (subject){
   330                 subjectAscii = PKIX_Object2ASCII((PKIX_PL_Object*)subject);
   331         }
   333         errorResult = PKIX_PL_Malloc(200, &asciiString, NULL);
   334         if (errorResult) goto cleanup;
   336         numChars =
   337                 PR_snprintf
   338                 (asciiString,
   339                 200,
   340                 "Issuer=%s\nSubject=%s\n",
   341                 issuerAscii,
   342                 subjectAscii);
   344         if (!numChars) goto cleanup;
   346 cleanup:
   348         if (issuer){
   349                 if (PKIX_PL_Object_DecRef((PKIX_PL_Object*)issuer, NULL)){
   350                         return (NULL);
   351                 }
   352         }
   354         if (subject){
   355                 if (PKIX_PL_Object_DecRef((PKIX_PL_Object*)subject, NULL)){
   356                         return (NULL);
   357                 }
   358         }
   360         if (PKIX_PL_Free((PKIX_PL_Object*)issuerAscii, NULL)){
   361                 return (NULL);
   362         }
   364         if (PKIX_PL_Free((PKIX_PL_Object*)subjectAscii, NULL)){
   365                 return (NULL);
   366         }
   368         if (errorResult){
   369                 return (NULL);
   370         }
   372         return (asciiString);
   373 }
   375 /*
   376  * FUNCTION: testHashcodeHelper
   377  * DESCRIPTION:
   378  *
   379  *  Computes the hashcode of the Object pointed to by "goodObject" and the
   380  *  Object pointed to by "otherObject" and compares them. If the result of the
   381  *  comparison is not the desired match as specified by "match", an error
   382  *  message is generated.
   383  *
   384  * PARAMETERS:
   385  *  "goodObject"
   386  *      Address of an object. Must be non-NULL.
   387  *  "otherObject"
   388  *      Address of another object. Must be non-NULL.
   389  *  "match"
   390  *      Boolean value representing the desired comparison result.
   391  *  "plContext"
   392  *      Platform-specific context pointer.
   393  * THREAD SAFETY:
   394  *  Thread Safe (see Thread Safety Definitions in Programmer's Guide)
   395  * RETURNS:
   396  *  Returns nothing.
   397  */
   398 void
   399 testHashcodeHelper(
   400         PKIX_PL_Object *goodObject,
   401         PKIX_PL_Object *otherObject,
   402         PKIX_Boolean match,
   403         void *plContext)
   404 {
   406         PKIX_UInt32 goodHash;
   407         PKIX_UInt32 otherHash;
   408         PKIX_Boolean cmpResult;
   409         PKIX_TEST_STD_VARS();
   411         PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Object_Hashcode
   412                         ((PKIX_PL_Object *)goodObject, &goodHash, plContext));
   414         PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Object_Hashcode
   415                         ((PKIX_PL_Object *)otherObject, &otherHash, plContext));
   417         cmpResult = (goodHash == otherHash);
   419         if ((match && !cmpResult) || (!match && cmpResult)){
   420                 testError("unexpected mismatch");
   421                 (void) printf("Hash1:\t%d\n", goodHash);
   422                 (void) printf("Hash2:\t%d\n", otherHash);
   423         }
   425 cleanup:
   427         PKIX_TEST_RETURN();
   429 }
   431 /*
   432  * FUNCTION: testToStringHelper
   433  * DESCRIPTION:
   434  *
   435  *  Calls toString on the Object pointed to by "goodObject" and compares the
   436  *  result to the string pointed to by "expected". If the results are not
   437  *  equal, an error message is generated.
   438  *
   439  * PARAMETERS:
   440  *  "goodObject"
   441  *      Address of Object. Must be non-NULL.
   442  *  "expected"
   443  *      Address of the desired string.
   444  *  "plContext"
   445  *      Platform-specific context pointer.
   446  * THREAD SAFETY:
   447  *  Thread Safe (see Thread Safety Definitions in Programmer's Guide)
   448  * RETURNS:
   449  *  Returns nothing.
   450  */
   451 void
   452 testToStringHelper(
   453         PKIX_PL_Object *goodObject,
   454         char *expected,
   455         void *plContext)
   456 {
   457         PKIX_PL_String *stringRep = NULL;
   458         char *actual = NULL;
   459         PKIX_TEST_STD_VARS();
   461         PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Object_ToString
   462                         (goodObject, &stringRep, plContext));
   464         actual = PKIX_String2ASCII(stringRep, plContext);
   465         if (actual == NULL){
   466                 pkixTestErrorMsg = "PKIX_String2ASCII Failed";
   467                 goto cleanup;
   468         }
   470         /*
   471          * If you are having trouble matching the string, uncomment the
   472          * PL_strstr function to figure out what's going on.
   473          */
   475         /*
   476             if (PL_strstr(actual, expected) == NULL){
   477                 testError("PL_strstr failed");
   478             }
   479         */
   482         if (PL_strcmp(actual, expected) != 0){
   483                 testError("unexpected mismatch");
   484                 (void) printf("Actual value:\t%s\n", actual);
   485                 (void) printf("Expected value:\t%s\n", expected);
   486         }
   488 cleanup:
   490         PKIX_PL_Free(actual, plContext);
   492         PKIX_TEST_DECREF_AC(stringRep);
   494         PKIX_TEST_RETURN();
   495 }
   497 /*
   498  * FUNCTION: testEqualsHelper
   499  * DESCRIPTION:
   500  *
   501  *  Checks if the Object pointed to by "goodObject" is Equal to the Object
   502  *  pointed to by "otherObject". If the result of the check is not the desired
   503  *  match as specified by "match", an error message is generated.
   504  *
   505  * PARAMETERS:
   506  *  "goodObject"
   507  *      Address of an Object. Must be non-NULL.
   508  *  "otherObject"
   509  *      Address of another Object. Must be non-NULL.
   510  *  "match"
   511  *      Boolean value representing the desired comparison result.
   512  *  "plContext"
   513  *      Platform-specific context pointer.
   514  * THREAD SAFETY:
   515  *  Thread Safe (see Thread Safety Definitions in Programmer's Guide)
   516  * RETURNS:
   517  *  Returns nothing.
   518  */
   519 void
   520 testEqualsHelper(
   521         PKIX_PL_Object *goodObject,
   522         PKIX_PL_Object *otherObject,
   523         PKIX_Boolean match,
   524         void *plContext)
   525 {
   527         PKIX_Boolean cmpResult;
   528         PKIX_TEST_STD_VARS();
   530         PKIX_TEST_EXPECT_NO_ERROR
   531                 (PKIX_PL_Object_Equals
   532                 (goodObject, otherObject, &cmpResult, plContext));
   534         if ((match && !cmpResult) || (!match && cmpResult)){
   535                 testError("unexpected mismatch");
   536                 (void) printf("Actual value:\t%d\n", cmpResult);
   537                 (void) printf("Expected value:\t%d\n", match);
   538         }
   540 cleanup:
   542         PKIX_TEST_RETURN();
   543 }
   546 /*
   547  * FUNCTION: testDuplicateHelper
   548  * DESCRIPTION:
   549  *  Checks if the Object pointed to by "object" is equal to its duplicate.
   550  *  If the result of the check is not equality, an error message is generated.
   551  * PARAMETERS:
   552  *  "object"
   553  *      Address of Object. Must be non-NULL.
   554  *  "plContext"
   555  *      Platform-specific context pointer.
   556  * THREAD SAFETY:
   557  *  Thread Safe (see Thread Safety Definitions in Programmer's Guide)
   558  * RETURNS:
   559  *  Returns nothing.
   560  */
   561 void
   562 testDuplicateHelper(PKIX_PL_Object *object, void *plContext)
   563 {
   564         PKIX_PL_Object *newObject = NULL;
   565         PKIX_Boolean cmpResult;
   567         PKIX_TEST_STD_VARS();
   569         PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Object_Duplicate
   570                                     (object, &newObject, plContext));
   572         PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Object_Equals
   573                                     (object, newObject, &cmpResult, plContext));
   575         if (!cmpResult){
   576                 testError("unexpected mismatch");
   577                 (void) printf("Actual value:\t%d\n", cmpResult);
   578                 (void) printf("Expected value:\t%d\n", PKIX_TRUE);
   579         }
   581 cleanup:
   583         PKIX_TEST_DECREF_AC(newObject);
   585         PKIX_TEST_RETURN();
   586 }

mercurial