Blame nss/cmd/libpkix/pkixutil/pkixutil.c

Packit 40b132
/* This Source Code Form is subject to the terms of the Mozilla Public
Packit 40b132
 * License, v. 2.0. If a copy of the MPL was not distributed with this
Packit 40b132
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
Packit 40b132
/*
Packit 40b132
 * testwrapper.c
Packit 40b132
 *
Packit 40b132
 * Wrpper programm for libpkix tests.
Packit 40b132
 *
Packit 40b132
 */
Packit 40b132
Packit 40b132
#include <stdio.h>
Packit 40b132
Packit 40b132
#include "nspr.h"
Packit 40b132
#include "plgetopt.h"
Packit 40b132
Packit 40b132
#include "nss.h"
Packit 40b132
#include "secport.h"
Packit 40b132
Packit 40b132
typedef int (*mainTestFn)(int argc, char* argv[]);
Packit 40b132
Packit 40b132
extern int libpkix_buildthreads(int argc, char *argv[]);
Packit 40b132
extern int nss_threads(int argc, char *argv[]);
Packit 40b132
extern int test_certselector(int argc, char *argv[]);
Packit 40b132
extern int test_comcertselparams(int argc, char *argv[]);
Packit 40b132
extern int test_certchainchecker(int argc, char *argv[]);
Packit 40b132
extern int test_comcrlselparams(int argc, char *argv[]);
Packit 40b132
extern int test_crlselector(int argc, char *argv[]);
Packit 40b132
Packit 40b132
extern int test_procparams(int argc, char *argv[]);
Packit 40b132
extern int test_resourcelimits(int argc, char *argv[]);
Packit 40b132
extern int test_trustanchor(int argc, char *argv[]);
Packit 40b132
extern int test_valparams(int argc, char *argv[]);
Packit 40b132
extern int test_buildresult(int argc, char *argv[]);
Packit 40b132
extern int test_policynode(int argc, char *argv[]);
Packit 40b132
extern int test_valresult(int argc, char *argv[]);
Packit 40b132
extern int test_verifynode(int argc, char *argv[]);
Packit 40b132
extern int test_store(int argc, char *argv[]);
Packit 40b132
extern int test_basicchecker(int argc, char *argv[]);
Packit 40b132
extern int test_basicconstraintschecker(int argc, char *argv[]);
Packit 40b132
extern int test_buildchain(int argc, char *argv[]);
Packit 40b132
extern int test_buildchain_partialchain(int argc, char *argv[]);
Packit 40b132
extern int test_buildchain_resourcelimits(int argc, char *argv[]);
Packit 40b132
extern int test_buildchain_uchecker(int argc, char *argv[]);
Packit 40b132
extern int test_customcrlchecker(int argc, char *argv[]);
Packit 40b132
extern int test_defaultcrlchecker2stores(int argc, char *argv[]);
Packit 40b132
extern int test_ocsp(int argc, char *argv[]);
Packit 40b132
extern int test_policychecker(int argc, char *argv[]);
Packit 40b132
extern int test_subjaltnamechecker(int argc, char *argv[]);
Packit 40b132
extern int test_validatechain(int argc, char *argv[]);
Packit 40b132
extern int test_validatechain_NB(int argc, char *argv[]);
Packit 40b132
extern int test_validatechain_bc(int argc, char *argv[]);
Packit 40b132
extern int test_error(int argc, char *argv[]);
Packit 40b132
extern int test_list(int argc, char *argv[]);
Packit 40b132
extern int test_list2(int argc, char *argv[]);
Packit 40b132
extern int test_logger(int argc, char *argv[]);
Packit 40b132
extern int test_colcertstore(int argc, char *argv[]);
Packit 40b132
extern int test_ekuchecker(int argc, char *argv[]);
Packit 40b132
extern int test_httpcertstore(int argc, char *argv[]);
Packit 40b132
extern int test_pk11certstore(int argc, char *argv[]);
Packit 40b132
extern int test_socket(int argc, char *argv[]);
Packit 40b132
extern int test_authorityinfoaccess(int argc, char *argv[]);
Packit 40b132
extern int test_cert(int argc, char *argv[]);
Packit 40b132
extern int test_crl(int argc, char *argv[]);
Packit 40b132
extern int test_crlentry(int argc, char *argv[]);
Packit 40b132
extern int test_date(int argc, char *argv[]);
Packit 40b132
extern int test_generalname(int argc, char *argv[]);
Packit 40b132
extern int test_nameconstraints(int argc, char *argv[]);
Packit 40b132
extern int test_subjectinfoaccess(int argc, char *argv[]);
Packit 40b132
extern int test_x500name(int argc, char *argv[]);
Packit 40b132
extern int stress_test(int argc, char *argv[]);
Packit 40b132
extern int test_bigint(int argc, char *argv[]);
Packit 40b132
extern int test_bytearray(int argc, char *argv[]);
Packit 40b132
extern int test_hashtable(int argc, char *argv[]);
Packit 40b132
extern int test_mem(int argc, char *argv[]);
Packit 40b132
extern int test_monitorlock(int argc, char *argv[]);
Packit 40b132
extern int test_mutex(int argc, char *argv[]);
Packit 40b132
extern int test_mutex2(int argc, char *argv[]);
Packit 40b132
extern int test_mutex3(int argc, char *argv[]);
Packit 40b132
extern int test_object(int argc, char *argv[]);
Packit 40b132
extern int test_oid(int argc, char *argv[]);
Packit 40b132
Packit 40b132
/* Taken out. Problem with build                   */
Packit 40b132
/* extern int test_rwlock(int argc, char *argv[]); */
Packit 40b132
extern int test_string(int argc, char *argv[]);
Packit 40b132
extern int test_string2(int argc, char *argv[]);
Packit 40b132
extern int build_chain(int argc, char *argv[]);
Packit 40b132
extern int dumpcert(int argc, char *argv[]);
Packit 40b132
extern int dumpcrl(int argc, char *argv[]);
Packit 40b132
extern int validate_chain(int argc, char *argv[]);
Packit 40b132
Packit 40b132
Packit 40b132
typedef struct {
Packit 40b132
    char *fnName;
Packit 40b132
    mainTestFn fnPointer;
Packit 40b132
} testFunctionRef;
Packit 40b132
Packit 40b132
testFunctionRef testFnRefTable[] = {
Packit 40b132
    {"libpkix_buildthreads",           libpkix_buildthreads},
Packit 40b132
    {"nss_threads",                    nss_threads},
Packit 40b132
    {"test_certselector",              test_certselector},
Packit 40b132
    {"test_comcertselparams",          test_comcertselparams},
Packit 40b132
    {"test_certchainchecker",          test_certchainchecker},
Packit 40b132
    {"test_comcrlselparams",           test_comcrlselparams},
Packit 40b132
    {"test_crlselector",               test_crlselector},
Packit 40b132
    {"test_procparams",                test_procparams},
Packit 40b132
    {"test_resourcelimits",            test_resourcelimits},
Packit 40b132
    {"test_trustanchor",               test_trustanchor},
Packit 40b132
    {"test_valparams",                 test_valparams},
Packit 40b132
    {"test_buildresult",               test_buildresult},
Packit 40b132
    {"test_policynode",                test_policynode},
Packit 40b132
    {"test_valresult",                 test_valresult},
Packit 40b132
    {"test_verifynode",                test_verifynode},
Packit 40b132
    {"test_store",                     test_store},
Packit 40b132
    {"test_basicchecker",              test_basicchecker},
Packit 40b132
    {"test_basicconstraintschecker",   test_basicconstraintschecker},
Packit 40b132
    {"test_buildchain",                test_buildchain},
Packit 40b132
    {"test_buildchain_partialchain",   test_buildchain_partialchain},
Packit 40b132
    {"test_buildchain_resourcelimits", test_buildchain_resourcelimits},
Packit 40b132
    {"test_buildchain_uchecker",       test_buildchain_uchecker},
Packit 40b132
    {"test_customcrlchecker",          test_customcrlchecker},
Packit 40b132
    {"test_defaultcrlchecker2stores",  test_defaultcrlchecker2stores},
Packit 40b132
    {"test_ocsp",                      test_ocsp},
Packit 40b132
    {"test_policychecker",             test_policychecker},
Packit 40b132
    {"test_subjaltnamechecker",        test_subjaltnamechecker},
Packit 40b132
    {"test_validatechain",             test_validatechain},
Packit 40b132
    {"test_validatechain_NB",          test_validatechain_NB},
Packit 40b132
    {"test_validatechain_bc",          test_validatechain_bc},
Packit 40b132
    {"test_error",                     test_error},
Packit 40b132
    {"test_list",                      test_list},
Packit 40b132
    {"test_list2",                     test_list2},
Packit 40b132
    {"test_logger",                    test_logger},
Packit 40b132
    {"test_colcertstore",              test_colcertstore},
Packit 40b132
    {"test_ekuchecker",                test_ekuchecker},
Packit 40b132
    {"test_httpcertstore",             test_httpcertstore},
Packit 40b132
    {"test_pk11certstore",             test_pk11certstore},
Packit 40b132
    {"test_socket",                    test_socket},
Packit 40b132
    {"test_authorityinfoaccess",       test_authorityinfoaccess},
Packit 40b132
    {"test_cert",                      test_cert},
Packit 40b132
    {"test_crl",                       test_crl},
Packit 40b132
    {"test_crlentry",                  test_crlentry},
Packit 40b132
    {"test_date",                      test_date},
Packit 40b132
    {"test_generalname",               test_generalname},
Packit 40b132
    {"test_nameconstraints",           test_nameconstraints},
Packit 40b132
    {"test_subjectinfoaccess",         test_subjectinfoaccess},
Packit 40b132
    {"test_x500name",                  test_x500name},
Packit 40b132
    {"stress_test",                    stress_test},
Packit 40b132
    {"test_bigint",                    test_bigint},
Packit 40b132
    {"test_bytearray",                 test_bytearray},
Packit 40b132
    {"test_hashtable",                 test_hashtable},
Packit 40b132
    {"test_mem",                       test_mem},
Packit 40b132
    {"test_monitorlock",               test_monitorlock},
Packit 40b132
    {"test_mutex",                     test_mutex},
Packit 40b132
    {"test_mutex2",                    test_mutex2},
Packit 40b132
    {"test_mutex3",                    test_mutex3},
Packit 40b132
    {"test_object",                    test_object},
Packit 40b132
    {"test_oid",                       test_oid},
Packit 40b132
/*  {"test_rwlock",                    test_rwlock, }*/
Packit 40b132
    {"test_string",                    test_string},
Packit 40b132
    {"test_string2",                   test_string2},
Packit 40b132
    {"build_chain",                    build_chain},
Packit 40b132
    {"dumpcert",                       dumpcert},
Packit 40b132
    {"dumpcrl",                        dumpcrl},
Packit 40b132
    {"validate_chain",                 validate_chain},
Packit 40b132
    {NULL,                             NULL },
Packit 40b132
};
Packit 40b132
Packit 40b132
static
Packit 40b132
void printUsage(char *cmdName) {
Packit 40b132
    int fnCounter = 0;
Packit 40b132
Packit 40b132
    fprintf(stderr, "Usage: %s [test name] [arg1]...[argN]\n\n", cmdName);
Packit 40b132
    fprintf(stderr, "List of possible names for the tests:");
Packit 40b132
    while (testFnRefTable[fnCounter].fnName != NULL) {
Packit 40b132
        if (fnCounter % 2 == 0) {
Packit 40b132
            fprintf(stderr, "\n");
Packit 40b132
        }
Packit 40b132
        fprintf(stderr, "  %-35s ", testFnRefTable[fnCounter].fnName);
Packit 40b132
        fnCounter += 1;
Packit 40b132
    }
Packit 40b132
    fprintf(stderr, "\n");
Packit 40b132
}
Packit 40b132
Packit 40b132
static SECStatus
Packit 40b132
getTestArguments(int         argc,
Packit 40b132
                 char      **argv,
Packit 40b132
                 mainTestFn *ptestFn,
Packit 40b132
                 char      **pdbPath,
Packit 40b132
                 int        *pargc,
Packit 40b132
                 char     ***pargv)
Packit 40b132
{
Packit 40b132
    PLOptState *optstate = NULL;
Packit 40b132
    PLOptStatus status;
Packit 40b132
    mainTestFn testFunction = NULL;
Packit 40b132
    char **wArgv = NULL;
Packit 40b132
    char  *dbPath = NULL;
Packit 40b132
    char  *fnName = NULL;
Packit 40b132
    int    wArgc = 0;
Packit 40b132
    int    fnCounter = 0;
Packit 40b132
    
Packit 40b132
    if (argc < 2) {
Packit 40b132
        printf("ERROR: insufficient number of arguments: %s.\n", fnName);
Packit 40b132
        return SECFailure;
Packit 40b132
    }
Packit 40b132
Packit 40b132
    fnName = argv[1];
Packit 40b132
    while (testFnRefTable[fnCounter].fnName != NULL) {
Packit 40b132
        if (!PORT_Strcmp(fnName, testFnRefTable[fnCounter].fnName)) {
Packit 40b132
            testFunction = testFnRefTable[fnCounter].fnPointer;
Packit 40b132
            break;
Packit 40b132
        }
Packit 40b132
        fnCounter += 1;
Packit 40b132
    }
Packit 40b132
    if (!testFunction) {
Packit 40b132
        printf("ERROR: unknown name of the test: %s.\n", fnName);
Packit 40b132
        return SECFailure;
Packit 40b132
    }
Packit 40b132
Packit 40b132
    wArgv = PORT_ZNewArray(char*, argc);
Packit 40b132
    if (!wArgv) {
Packit 40b132
        return SECFailure;
Packit 40b132
    }
Packit 40b132
Packit 40b132
    /* set name of the function as a first arg and increment arg count. */
Packit 40b132
    wArgv[0] = fnName;
Packit 40b132
    wArgc += 1;
Packit 40b132
Packit 40b132
    optstate = PL_CreateOptState(argc - 1, argv + 1, "d:");
Packit 40b132
    while ((status = PL_GetNextOpt(optstate)) == PL_OPT_OK) {
Packit 40b132
        switch (optstate->option) {
Packit 40b132
        case 'd':
Packit 40b132
            dbPath = (char*)optstate->value;
Packit 40b132
            break;
Packit 40b132
Packit 40b132
        default:
Packit 40b132
            wArgv[wArgc] = (char*)optstate->value;
Packit 40b132
            wArgc += 1;
Packit 40b132
            break;
Packit 40b132
        }
Packit 40b132
    }
Packit 40b132
    PL_DestroyOptState(optstate);
Packit 40b132
Packit 40b132
    *ptestFn = testFunction;
Packit 40b132
    *pdbPath = dbPath;
Packit 40b132
    *pargc = wArgc;
Packit 40b132
    *pargv = wArgv;
Packit 40b132
    
Packit 40b132
    return SECSuccess;
Packit 40b132
}
Packit 40b132
Packit 40b132
Packit 40b132
static
Packit 40b132
int runCmd(mainTestFn fnPointer,
Packit 40b132
           int argc,
Packit 40b132
           char **argv,
Packit 40b132
           char *dbPath)
Packit 40b132
{
Packit 40b132
    int retStat = 0;
Packit 40b132
    
Packit 40b132
    /*  Initialize NSPR and NSS.  */
Packit 40b132
    PR_Init(PR_SYSTEM_THREAD, PR_PRIORITY_NORMAL, 1);
Packit 40b132
    
Packit 40b132
    /* if using databases, use NSS_Init and not NSS_NoDB_Init */
Packit 40b132
    if (dbPath && PORT_Strlen(dbPath) != 0) {
Packit 40b132
        if (NSS_Init(dbPath) != SECSuccess)
Packit 40b132
            return SECFailure;
Packit 40b132
    } else {
Packit 40b132
        if (NSS_NoDB_Init(NULL) != 0)
Packit 40b132
            return SECFailure;
Packit 40b132
    }
Packit 40b132
    retStat = fnPointer(argc, argv);
Packit 40b132
Packit 40b132
    if (NSS_Shutdown() != SECSuccess) {
Packit 40b132
        exit(1);
Packit 40b132
    }
Packit 40b132
    PR_Cleanup();
Packit 40b132
    return retStat;
Packit 40b132
}
Packit 40b132
Packit 40b132
int main(int argc, char **argv) {
Packit 40b132
    mainTestFn testFunction = NULL;
Packit 40b132
    char *dbPath = NULL;
Packit 40b132
    char **testArgv = NULL;
Packit 40b132
    int testArgc = 0;
Packit 40b132
    int rv = 0;
Packit 40b132
Packit 40b132
    rv = getTestArguments(argc, argv, &testFunction, &dbPath,
Packit 40b132
                          &testArgc, &testArgv);
Packit 40b132
    if (rv != SECSuccess) {
Packit 40b132
        printUsage(argv[0]);
Packit 40b132
        return 1;
Packit 40b132
    }
Packit 40b132
    
Packit 40b132
    rv = runCmd(testFunction, testArgc, testArgv, dbPath);
Packit 40b132
Packit 40b132
    PORT_Free(testArgv);
Packit 40b132
Packit 40b132
    return rv;
Packit 40b132
}
Packit 40b132