Blame nss/cmd/libpkix/pkix_pl/system/test_object.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
 * test_object.c
Packit 40b132
 *
Packit 40b132
 * Test Object Allocation, toString, Equals, Destruction
Packit 40b132
 *
Packit 40b132
 */
Packit 40b132
Packit 40b132
#include "testutil.h"
Packit 40b132
#include "testutil_nss.h"
Packit 40b132
Packit 40b132
static void *plContext = NULL;
Packit 40b132
Packit 40b132
static PKIX_Error *
Packit 40b132
destructor(
Packit 40b132
        /* ARGSUSED */ PKIX_PL_Object *object,
Packit 40b132
        /* ARGSUSED */ void *plContext)
Packit 40b132
{
Packit 40b132
        (void) printf("\tUser defined destructor called\n");
Packit 40b132
        return (NULL);
Packit 40b132
}
Packit 40b132
Packit 40b132
static PKIX_Error*
Packit 40b132
toStringCallback(
Packit 40b132
        PKIX_PL_Object *obj,
Packit 40b132
        PKIX_PL_String **pString,
Packit 40b132
        /* ARGSUSED */ void* plContext) {
Packit 40b132
Packit 40b132
        PKIX_Error *errorResult;
Packit 40b132
        PKIX_UInt32 type;
Packit 40b132
        char *format = "(addr: %x, type: %d)";
Packit 40b132
        PKIX_PL_String *formatString = NULL;
Packit 40b132
Packit 40b132
        errorResult = PKIX_PL_String_Create(
Packit 40b132
                                        PKIX_ESCASCII,
Packit 40b132
                                        format,
Packit 40b132
                                        PL_strlen(format),
Packit 40b132
                                        &formatString,
Packit 40b132
                                        plContext);
Packit 40b132
        if (errorResult) testError("PKIX_PL_String_Create failed");
Packit 40b132
Packit 40b132
        if (pString == plContext)
Packit 40b132
                testError("Null String");
Packit 40b132
Packit 40b132
        type = (unsigned int)0;
Packit 40b132
Packit 40b132
        (void) PKIX_PL_Object_GetType(obj, &type, plContext);
Packit 40b132
Packit 40b132
        errorResult = PKIX_PL_Sprintf(pString, plContext,
Packit 40b132
                                    formatString,
Packit 40b132
                                    (int)obj, type);
Packit 40b132
        if (errorResult) testError("PKIX_PL_Sprintf failed");
Packit 40b132
Packit 40b132
Packit 40b132
        errorResult = PKIX_PL_Object_DecRef((PKIX_PL_Object*)formatString,
Packit 40b132
                                        plContext);
Packit 40b132
        if (errorResult) testError("PKIX_PL_Object_DecRef failed");
Packit 40b132
Packit 40b132
        return (NULL);
Packit 40b132
}
Packit 40b132
Packit 40b132
static PKIX_Error *
Packit 40b132
comparator(
Packit 40b132
        PKIX_PL_Object *first,
Packit 40b132
        PKIX_PL_Object *second,
Packit 40b132
        PKIX_Int32 *pValue,
Packit 40b132
        /* ARGSUSED */ void *plContext)
Packit 40b132
{
Packit 40b132
        if (*(char *)first > *(char *)second)
Packit 40b132
                *pValue = 1;
Packit 40b132
        else if (*(char *)first < *(char *)second)
Packit 40b132
                *pValue = -1;
Packit 40b132
        else
Packit 40b132
                *pValue = 0;
Packit 40b132
        return (NULL);
Packit 40b132
}
Packit 40b132
Packit 40b132
Packit 40b132
static PKIX_Error *
Packit 40b132
hashcodeCallback(
Packit 40b132
        PKIX_PL_Object *object,
Packit 40b132
        PKIX_UInt32 *pValue,
Packit 40b132
        /* ARGSUSED */ void *plContext)
Packit 40b132
{
Packit 40b132
        *pValue = 123456789;
Packit 40b132
        return (NULL);
Packit 40b132
}
Packit 40b132
Packit 40b132
static PKIX_Error*
Packit 40b132
equalsCallback(
Packit 40b132
        PKIX_PL_Object *first,
Packit 40b132
        PKIX_PL_Object *second,
Packit 40b132
        PKIX_Boolean *result,
Packit 40b132
        void* plContext) {
Packit 40b132
Packit 40b132
        PKIX_UInt32 firstType = 0, secondType = 0;
Packit 40b132
Packit 40b132
        if ((first == plContext)||(second == plContext))
Packit 40b132
                testError("Null Object");
Packit 40b132
Packit 40b132
        (void) PKIX_PL_Object_GetType(first, &firstType, plContext);
Packit 40b132
Packit 40b132
        (void) PKIX_PL_Object_GetType(second, &secondType, plContext);
Packit 40b132
Packit 40b132
        *result = (firstType == secondType)?PKIX_TRUE:PKIX_FALSE;
Packit 40b132
Packit 40b132
        return (NULL);
Packit 40b132
}
Packit 40b132
Packit 40b132
static void
Packit 40b132
createObjects(
Packit 40b132
        PKIX_PL_Object **obj,
Packit 40b132
        PKIX_PL_Object **obj2,
Packit 40b132
        PKIX_PL_Object **obj3,
Packit 40b132
        PKIX_PL_Object **obj4)
Packit 40b132
{
Packit 40b132
        PKIX_TEST_STD_VARS();
Packit 40b132
Packit 40b132
#ifdef PKIX_USER_OBJECT_TYPE
Packit 40b132
        PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Object_RegisterType
Packit 40b132
                    (1000, /* type */
Packit 40b132
                    "thousand", /* description */
Packit 40b132
                    NULL, /* destructor */
Packit 40b132
                    NULL, /* equals */
Packit 40b132
                    (PKIX_PL_HashcodeCallback)hashcodeCallback,
Packit 40b132
                    NULL,  /* toString */
Packit 40b132
                    NULL,  /* Comparator */
Packit 40b132
                    NULL,
Packit 40b132
                    plContext));
Packit 40b132
Packit 40b132
        PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Object_Alloc
Packit 40b132
                    (1000, /* type */
Packit 40b132
                    12, /* size */
Packit 40b132
                    obj,
Packit 40b132
                    plContext));
Packit 40b132
Packit 40b132
        PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Object_RegisterType
Packit 40b132
                    (2000, /* type */
Packit 40b132
                    "two thousand" /* description */,
Packit 40b132
                    (PKIX_PL_DestructorCallback)destructor,
Packit 40b132
                    (PKIX_PL_EqualsCallback)equalsCallback,
Packit 40b132
                    NULL, /* hashcode */
Packit 40b132
                    (PKIX_PL_ToStringCallback)toStringCallback,
Packit 40b132
                    (PKIX_PL_ComparatorCallback)comparator,
Packit 40b132
                    NULL,
Packit 40b132
                    plContext));
Packit 40b132
Packit 40b132
        PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Object_Alloc
Packit 40b132
                    (2000, /* type */
Packit 40b132
                    1, /* size */
Packit 40b132
                    obj2,
Packit 40b132
                    plContext));
Packit 40b132
Packit 40b132
        PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Object_Alloc
Packit 40b132
                    (2000, /* type */
Packit 40b132
                    1, /* size */
Packit 40b132
                    obj4,
Packit 40b132
                    plContext));
Packit 40b132
Packit 40b132
        *obj3 = *obj;
Packit 40b132
        PKIX_TEST_EXPECT_NO_ERROR(PKIX_PL_Object_IncRef(*obj3, plContext));
Packit 40b132
Packit 40b132
cleanup:
Packit 40b132
#endif /* PKIX_USER_OBJECT_TYPE */
Packit 40b132
        PKIX_TEST_RETURN();
Packit 40b132
}
Packit 40b132
Packit 40b132
Packit 40b132
static void
Packit 40b132
testGetType(
Packit 40b132
            PKIX_PL_Object *obj,
Packit 40b132
            PKIX_PL_Object *obj2,
Packit 40b132
            PKIX_PL_Object *obj3)
Packit 40b132
{
Packit 40b132
        PKIX_UInt32 testType;
Packit 40b132
Packit 40b132
        PKIX_TEST_STD_VARS();
Packit 40b132
Packit 40b132
        PKIX_TEST_EXPECT_NO_ERROR
Packit 40b132
                (PKIX_PL_Object_GetType(obj, &testType, plContext));
Packit 40b132
Packit 40b132
        if (testType != 1000)
Packit 40b132
                testError("Object 1 returned the wrong type");
Packit 40b132
Packit 40b132
        PKIX_TEST_EXPECT_NO_ERROR
Packit 40b132
                (PKIX_PL_Object_GetType(obj2, &testType, plContext));
Packit 40b132
        if (testType != 2000)
Packit 40b132
                testError("Object 2 returned the wrong type");
Packit 40b132
Packit 40b132
        PKIX_TEST_EXPECT_NO_ERROR
Packit 40b132
                (PKIX_PL_Object_GetType(obj3, &testType, plContext));
Packit 40b132
        if (testType != 1000)
Packit 40b132
                testError("Object 3 returned the wrong type");
Packit 40b132
Packit 40b132
cleanup:
Packit 40b132
Packit 40b132
        PKIX_TEST_RETURN();
Packit 40b132
}
Packit 40b132
Packit 40b132
static void
Packit 40b132
testCompare(
Packit 40b132
            PKIX_PL_Object *obj2,
Packit 40b132
            PKIX_PL_Object *obj4)
Packit 40b132
{
Packit 40b132
        PKIX_Int32 cmpResult;
Packit 40b132
        PKIX_TEST_STD_VARS();
Packit 40b132
Packit 40b132
        *(char *)obj2 = 0x20;
Packit 40b132
        *(char *)obj4 = 0x10;
Packit 40b132
        PKIX_TEST_EXPECT_NO_ERROR
Packit 40b132
                (PKIX_PL_Object_Compare(obj2, obj4, &cmpResult, plContext));
Packit 40b132
        if (cmpResult <= 0) testError("Invalid Result from Object Compare");
Packit 40b132
Packit 40b132
        PKIX_TEST_EXPECT_NO_ERROR
Packit 40b132
                (PKIX_PL_Object_Compare(obj4, obj2, &cmpResult, plContext));
Packit 40b132
        if (cmpResult >= 0) testError("Invalid Result from Object Compare");
Packit 40b132
Packit 40b132
        PKIX_TEST_EXPECT_NO_ERROR
Packit 40b132
                (PKIX_PL_Object_Compare(obj4, obj4, &cmpResult, plContext));
Packit 40b132
Packit 40b132
        *(char *)obj2 = 0x10;
Packit 40b132
        if (cmpResult != 0) testError("Invalid Result from Object Compare");
Packit 40b132
Packit 40b132
Packit 40b132
cleanup:
Packit 40b132
Packit 40b132
        PKIX_TEST_RETURN();
Packit 40b132
}
Packit 40b132
Packit 40b132
Packit 40b132
static void
Packit 40b132
testDestroy(
Packit 40b132
            PKIX_PL_Object *obj,
Packit 40b132
            PKIX_PL_Object *obj2,
Packit 40b132
            PKIX_PL_Object *obj3,
Packit 40b132
            PKIX_PL_Object *obj4)
Packit 40b132
{
Packit 40b132
        PKIX_TEST_STD_VARS();
Packit 40b132
Packit 40b132
        PKIX_TEST_DECREF_BC(obj);
Packit 40b132
        PKIX_TEST_DECREF_BC(obj2);
Packit 40b132
        PKIX_TEST_DECREF_BC(obj3);
Packit 40b132
        PKIX_TEST_DECREF_BC(obj4);
Packit 40b132
Packit 40b132
cleanup:
Packit 40b132
Packit 40b132
        PKIX_TEST_RETURN();
Packit 40b132
}
Packit 40b132
Packit 40b132
int test_object(int argc, char *argv[]) {
Packit 40b132
Packit 40b132
#ifdef PKIX_USER_OBJECT_TYPE
Packit 40b132
        PKIX_PL_Object *obj, *obj2, *obj3, *obj4;
Packit 40b132
        PKIX_UInt32 actualMinorVersion;
Packit 40b132
        PKIX_UInt32 j = 0;
Packit 40b132
Packit 40b132
        PKIX_TEST_STD_VARS();
Packit 40b132
Packit 40b132
        startTests("Objects");
Packit 40b132
Packit 40b132
        PKIX_TEST_EXPECT_NO_ERROR(
Packit 40b132
            PKIX_PL_NssContext_Create(0, PKIX_FALSE, NULL, &plContext));
Packit 40b132
Packit 40b132
        subTest("PKIX_PL_Object_Create");
Packit 40b132
        createObjects(&obj, &obj2, &obj3, &obj4);
Packit 40b132
Packit 40b132
        PKIX_TEST_EQ_HASH_TOSTR_DUP(obj, obj3, obj2, NULL, Object, PKIX_FALSE);
Packit 40b132
Packit 40b132
        subTest("PKIX_PL_Object_GetType");
Packit 40b132
        testGetType(obj, obj2, obj3);
Packit 40b132
Packit 40b132
        subTest("PKIX_PL_Object_Compare");
Packit 40b132
        testCompare(obj2, obj4);
Packit 40b132
Packit 40b132
        subTest("PKIX_PL_Object_Destroy");
Packit 40b132
        testDestroy(obj, obj2, obj3, obj4);
Packit 40b132
Packit 40b132
Packit 40b132
cleanup:
Packit 40b132
Packit 40b132
        PKIX_Shutdown(plContext);
Packit 40b132
Packit 40b132
        endTests("Objects");
Packit 40b132
#endif /* PKIX_USER_OBJECT_TYPE */
Packit 40b132
        return (0);
Packit 40b132
Packit 40b132
}