The fourth patch (testcases) I have to giva a conditional ACK due to
some minor problems that need fixing.
1) Executing regular immoitest (without --longDn) the test case
'immoitest 3 6" fails for some reason that has to do
with long DNs. That old testcase explicitly does a negative test on long
DNs and now fails.
6 FAILED saImmOiRtObjectCreate_2 - SA_AIS_ERR_NAME_TOO_LONG - size
of dn for new object too big (expected SA_AIS_ERR_NAME_TOO_LONG, got
SA_AIS_OK)
Obviously this test needs t o be made conditional on whether long-names
are allowed or not. The question is if there is a simple way to do this.
One possibility is to lookup the longDnsAllowed config attribute and if
it is nozero to assume that the IMM service accepts long DNs.
Another possibility is to remove this testcase, since long DN testing
now has its own section.
2) The new usage of '--longDn' is Ok, but we should add two things:
(a) A '-h' help flag that prints a usage eplaining what flags are
supported (only two I guess now: '-h' and 'longDn').
(b) If an unknown flag is given then the program should report error
print usage and exit.
I accidentally tried '--longDns' and the result is a derailment
of the tests in a very strange way.
These minor issues can be fixed either in a new version of this patch.
Or a defect ticket may be written to track this being fixed after 4.5.FC
/AndersBj
Zoran Milinkovic wrote:
> tests/immsv/common/immtest.c | 30 +-
> tests/immsv/implementer/Makefile.am | 1 +
> tests/immsv/implementer/applier.c | 24 +-
> tests/immsv/implementer/test_cleanup.c | 38 +-
> tests/immsv/implementer/test_saImmOiLongDn.c | 621
> +++++++++++++++++++++++++++
> tests/immsv/management/Makefile.am | 1 +
> tests/immsv/management/test_cleanup.c | 38 +-
> tests/immsv/management/test_saImmOmLongDn.c | 368 ++++++++++++++++
> 8 files changed, 1075 insertions(+), 46 deletions(-)
>
>
> New test cases have been added to immomtest and immoitest.
> If SA_ENABLE_EXTENDED_NAMES is not set, immomtest and immoitest can use
> --longDn parameter to set SA_ENABLE_EXTENDED_NAMES for testing.
>
> diff --git a/tests/immsv/common/immtest.c b/tests/immsv/common/immtest.c
> --- a/tests/immsv/common/immtest.c
> +++ b/tests/immsv/common/immtest.c
> @@ -47,17 +47,26 @@ int main(int argc, char **argv)
> {
> int suite = ALL_SUITES, tcase = ALL_TESTS;
> int rc = 0;
> + int i;
> + int index = 0;
> + int longDn = 0;
>
> srandom(getpid());
>
> - if (argc > 1)
> - {
> - suite = atoi(argv[1]);
> + for(i=1; i<argc; i++) {
> + if(!strcmp(argv[i], "--longDn")) {
> + longDn = 1;
> + } else if(index == 0) {
> + suite = atoi(argv[i]);
> + index++;
> + } else if(index == 1) {
> + tcase = atoi(argv[i]);
> + index++;
> + }
> }
>
> - if (argc > 2)
> - {
> - tcase = atoi(argv[2]);
> + if(longDn) {
> + setenv("SA_ENABLE_EXTENDED_NAMES", "1", 1);
> }
>
> if(test_setup)
> @@ -111,7 +120,10 @@ SaAisErrorT config_class_create(SaImmHan
> SaImmAttrDefinitionT_2 attr7 = {
> "attr7", SA_IMM_ATTR_SAANYT, SA_IMM_ATTR_CONFIG |
> SA_IMM_ATTR_WRITABLE | SA_IMM_ATTR_MULTI_VALUE | SA_IMM_ATTR_NO_DUPLICATES,
> NULL};
>
> - const SaImmAttrDefinitionT_2* attributes[] = {&rdn, &attr1, &attr2,
> &attr3, &attr4, &attr5, &attr6, &attr7, NULL};
> + SaImmAttrDefinitionT_2 attr8 = {
> + "attr8", SA_IMM_ATTR_SANAMET, SA_IMM_ATTR_CONFIG |
> SA_IMM_ATTR_WRITABLE, NULL};
> +
> + const SaImmAttrDefinitionT_2* attributes[] = {&rdn, &attr1, &attr2,
> &attr3, &attr4, &attr5, &attr6, &attr7, &attr8, NULL};
>
> err = saImmOmClassCreate_2(immHandle, configClassName,
> SA_IMM_CLASS_CONFIG,
> attributes);
> @@ -142,8 +154,10 @@ SaAisErrorT runtime_class_create(SaImmHa
>
> SaImmAttrDefinitionT_2 attr1 = {
> "attr1", SA_IMM_ATTR_SAUINT32T, SA_IMM_ATTR_RUNTIME, NULL};
> + SaImmAttrDefinitionT_2 attr2 = {
> + "attr2", SA_IMM_ATTR_SANAMET, SA_IMM_ATTR_RUNTIME, NULL};
>
> - const SaImmAttrDefinitionT_2* attributes[] = {&rdn, &attr1, NULL};
> + const SaImmAttrDefinitionT_2* attributes[] = {&rdn, &attr1, &attr2,
> NULL};
>
> return saImmOmClassCreate_2(immHandle, runtimeClassName,
> SA_IMM_CLASS_RUNTIME,
> attributes);
> diff --git a/tests/immsv/implementer/Makefile.am
> b/tests/immsv/implementer/Makefile.am
> --- a/tests/immsv/implementer/Makefile.am
> +++ b/tests/immsv/implementer/Makefile.am
> @@ -44,6 +44,7 @@ immoitest_SOURCES = \
> test_SaImmOiCcb.c \
> test_SaImmOiAdminOperation.c \
> test_saImmOiAugmentCcbInitialize.c \
> + test_saImmOiLongDn.c \
> test_cleanup.c
>
> immoitest_LDADD = \
> diff --git a/tests/immsv/implementer/applier.c
> b/tests/immsv/implementer/applier.c
> --- a/tests/immsv/implementer/applier.c
> +++ b/tests/immsv/implementer/applier.c
> @@ -41,6 +41,9 @@
> #include <immutil.h>
> #include "saf_error.h"
> #include <poll.h>
> +
> +#include "osaf_extended_name.h"
> +
> #ifdef HAVE_CONFIG_H
> #include <config.h>
> #endif
> @@ -74,7 +77,7 @@ static SaAisErrorT saImmOiCcbObjectModif
> const SaNameT *objectName,
> const SaImmAttrModificationT_2 **attrMods)
> {
> SaAisErrorT rc = SA_AIS_OK;
> - printf("Modify callback on %s - object:%s ccbId:%llu\n", implName,
> objectName->value, ccbId);
> + printf("Modify callback on %s - object:%s ccbId:%llu\n", implName,
> osaf_extended_name_borrow(objectName), ccbId);
>
> struct CcbUtilCcbData *ccbUtilCcbData;
> if ((ccbUtilCcbData = ccbutil_findCcbData(ccbId)) == NULL) {
> @@ -100,7 +103,7 @@ static SaAisErrorT saImmOiCcbObjectCreat
> SaAisErrorT rc = SA_AIS_OK;
> struct CcbUtilCcbData *ccbUtilCcbData;
>
> - printf("Create callback on %s - parent:%s ccbId:%llu\n", implName,
> parentName->value, ccbId);
> + printf("Create callback on %s - parent:%s ccbId:%llu\n", implName,
> osaf_extended_name_borrow(parentName), ccbId);
>
> if ((ccbUtilCcbData = ccbutil_findCcbData(ccbId)) == NULL) {
> if ((ccbUtilCcbData = ccbutil_getCcbData(ccbId)) == NULL) {
> @@ -120,7 +123,7 @@ static SaAisErrorT saImmOiCcbObjectDelet
> {
> SaAisErrorT rc = SA_AIS_OK;
> struct CcbUtilCcbData *ccbUtilCcbData;
> - printf("Delete callback on %s - object:%s ccbId:%llu\n", implName,
> objectName->value, ccbId);
> + printf("Delete callback on %s - object:%s ccbId:%llu\n", implName,
> osaf_extended_name_borrow(objectName), ccbId);
>
> if ((ccbUtilCcbData = ccbutil_findCcbData(ccbId)) == NULL) {
> if ((ccbUtilCcbData = ccbutil_getCcbData(ccbId)) == NULL) {
> @@ -187,7 +190,7 @@ static void saImmOiAdminOperationCallbac
> const SaImmAdminOperationParamsT_2 **params)
> {
> printf("AdminOperationCallback received by impl %s on object %s
> operation:%llu invocation:%llu\n",
> - implName, (char *) objectName->value, operationId, invocation);
> + implName, (char *) osaf_extended_name_borrow(objectName),
> operationId, invocation);
> SaAisErrorT err = saImmOiAdminOperationResult(immOiHandle, invocation,
> SA_AIS_OK);
> if(err != SA_AIS_OK) {
> fprintf(stderr, "Reply on admin operation failed, err:%u\n",
> err);
> @@ -273,12 +276,13 @@ int main(int argc, char *argv[])
>
> /* Remaining arguments should be class names for which implementer is
> set. */
> while (optind < argc) {
> - strncpy((char *)objectName.value, argv[optind],
> SA_MAX_NAME_LENGTH);
> - objectName.length = strlen((char *)objectName.value);
> + osaf_extended_name_alloc(argv[optind], &objectName);
> +// strncpy((char *)objectName.value, argv[optind],
> SA_MAX_NAME_LENGTH);
> +// objectName.length = strlen((char *)objectName.value);
>
> - printf("Class: %s\n", objectName.value);
> + printf("Class: %s\n", osaf_extended_name_borrow(&objectName));
>
> - if(!strcmp((const char *) objectName.value,
> "OpensafImmRtTest")) {
> + if(!strcmp((const char *)
> osaf_extended_name_borrow(&objectName), "OpensafImmRtTest")) {
> /* Special test case for RTO's.
> Class OpensafImmRtTest foundd at
> samples/immsv/immsv_test_classes_rtobj.xml
> */
> @@ -287,7 +291,7 @@ int main(int argc, char *argv[])
> SaImmAttrValuesT_2 v1 = { "testRdn",
> SA_IMM_ATTR_SASTRINGT, 1, (void**)strValues };
> const SaImmAttrValuesT_2* attrValues[] = {&v1, NULL};
>
> - error = saImmOiRtObjectCreate_2(immOiHandle,
> (SaImmClassNameT) objectName.value, NULL, attrValues);
> + error = saImmOiRtObjectCreate_2(immOiHandle,
> (SaImmClassNameT) osaf_extended_name_borrow(&objectName), NULL, attrValues);
> if (error != SA_AIS_OK && error != SA_AIS_ERR_EXIST) {
> fprintf(stderr, "error -
> saImmOiClassImplementerSet FAILED: %s\n", saf_error(error));
> exit(EXIT_FAILURE);
> @@ -298,7 +302,7 @@ int main(int argc, char *argv[])
> printf("Runtime object: %s exists\n", str1);
> }
> } else {
> - error = saImmOiClassImplementerSet(immOiHandle,
> (SaImmClassNameT) objectName.value);
> + error = saImmOiClassImplementerSet(immOiHandle,
> (SaImmClassNameT) osaf_extended_name_borrow(&objectName));
> if (error != SA_AIS_OK) {
> fprintf(stderr, "error -
> saImmOiClassImplementerSet FAILED: %s\n", saf_error(error));
> exit(EXIT_FAILURE);
> diff --git a/tests/immsv/implementer/test_cleanup.c
> b/tests/immsv/implementer/test_cleanup.c
> --- a/tests/immsv/implementer/test_cleanup.c
> +++ b/tests/immsv/implementer/test_cleanup.c
> @@ -16,6 +16,7 @@
> */
>
> #include "immtest.h"
> +#include "osaf_extended_name.h"
>
>
> static char *objects[] = {
> @@ -31,6 +32,7 @@ static char *objects[] = {
>
> "123456789012345678901234567890123456789012345678901234567890123,123456789012345678901234567890123456789012345678901234567890123,123456789012345678901234567890123456789012345678901234567890123,rdn=root",
> "Test,rdn=root",
> "rdn=root",
> +
> "longdn=012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789",
> NULL
> };
>
> @@ -41,6 +43,7 @@ static char *classes[] = {
> NULL
> };
>
> +extern void addOiLongDnTestCases();
>
> static void cleanup() {
> SaVersionT version = { 'A', 2, 11 };
> @@ -64,26 +67,25 @@ static void cleanup() {
> assert(rc == SA_AIS_OK);
>
> /* Delete objects */
> - int len;
> SaNameT objectName = {0};
> SaNameT *objectNames[2] = { &objectName, NULL };
> obj = objects;
> while(*obj) {
> - len = strlen(*obj);
> - objectName.length = (len > SA_MAX_NAME_LENGTH) ?
> SA_MAX_NAME_LENGTH : len;
> - strncpy((char *)objectName.value, *obj, objectName.length);
> + if(osaf_is_extended_names_enabled() || strlen(*obj) <
> SA_MAX_NAME_LENGTH) {
> + osaf_extended_name_lend(*obj, &objectName);
>
> - rc = saImmOmAdminOwnerSet(ownerHandle, (const SaNameT
> **)objectNames, SA_IMM_ONE);
> - if(rc == SA_AIS_ERR_NOT_EXIST) {
> - obj++;
> - continue;
> + rc = saImmOmAdminOwnerSet(ownerHandle, (const SaNameT
> **)objectNames, SA_IMM_ONE);
> + if(rc == SA_AIS_ERR_NOT_EXIST) {
> + obj++;
> + continue;
> + }
> + assert(rc == SA_AIS_OK);
> +
> + rc = saImmOmCcbObjectDelete(ccbHandle, &objectName);
> + if(rc != SA_AIS_OK && rc != SA_AIS_ERR_NOT_EXIST)
> + fprintf(stderr, "Failed to delete object '%s'
> with error code: %d\n", *obj, rc);
> + assert(rc == SA_AIS_OK || rc == SA_AIS_ERR_NOT_EXIST);
> }
> - assert(rc == SA_AIS_OK);
> -
> - rc = saImmOmCcbObjectDelete(ccbHandle, &objectName);
> - if(rc != SA_AIS_OK && rc != SA_AIS_ERR_NOT_EXIST)
> - fprintf(stderr, "Failed to delete object '%s' with
> error code: %d\n", *obj, rc);
> - assert(rc == SA_AIS_OK || rc == SA_AIS_ERR_NOT_EXIST);
>
> obj++;
> }
> @@ -132,6 +134,14 @@ static void startup() {
> safassert(object_create(immOmHandle, ownerHandle, configClassName,
> &rootObj, NULL, NULL), SA_AIS_OK);
> safassert(saImmOmAdminOwnerFinalize(ownerHandle), SA_AIS_OK);
> safassert(saImmOmFinalize(immOmHandle), SA_AIS_OK);
> +
> + /* Add long DN test cases */
> + char *env;
> + if((env = getenv("SA_ENABLE_EXTENDED_NAMES"))) {
> + if(!strcmp(env, "1")) {
> + addOiLongDnTestCases();
> + }
> + }
> }
>
> __attribute__ ((constructor)) static void cleanup_constructor(void)
> diff --git a/tests/immsv/implementer/test_saImmOiLongDn.c
> b/tests/immsv/implementer/test_saImmOiLongDn.c
> new file mode 100644
> --- /dev/null
> +++ b/tests/immsv/implementer/test_saImmOiLongDn.c
> @@ -0,0 +1,621 @@
> +/* -*- OpenSAF -*-
> + *
> + * (C) Copyright 2014 The OpenSAF Foundation
> + *
> + * This program is distributed in the hope that it will be useful, but
> + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
> + * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed
> + * under the GNU Lesser General Public License Version 2.1, February 1999.
> + * The complete license can be accessed from the following location:
> + * http://opensource.org/licenses/lgpl-license.php
> + * See the Copying file included with the OpenSAF distribution for full
> + * licensing terms.
> + *
> + * Author(s): Ericsson AB
> + *
> + */
> +
> +
> +#include <unistd.h>
> +#include <pthread.h>
> +#include <poll.h>
> +
> +#include "immtest.h"
> +#include "osaf_extended_name.h"
> +
> +
> +static char *longDn =
> "longdn=0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"
> +
> "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"
> +
> "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789";
> +static char *longDn2 =
> "longdn=0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"
> +
> "012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"
> +
> "012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789";
> +
> +
> +static void setupOiLongDn(void) {
> + SaImmHandleT immHandle;
> + SaImmAdminOwnerHandleT ownerHandle;
> + SaImmCcbHandleT ccbHandle;
> + SaNameT dn;
> + const SaImmAdminOwnerNameT ownerName = (const
> SaImmAdminOwnerNameT)__FUNCTION__;
> +
> + SaImmAttrValueT attrValues[1] = { &dn };
> + SaImmAttrModificationT_2 attrMod = { SA_IMM_ATTR_VALUES_REPLACE,
> + { "attr8", SA_IMM_ATTR_SANAMET, 1, attrValues }};
> + const SaImmAttrModificationT_2 *attrMods[2] = { &attrMod, NULL };
> +
> + osaf_extended_name_lend(longDn, &dn);
> +
> + safassert(saImmOmInitialize(&immHandle, NULL, &immVersion), SA_AIS_OK);
> + config_class_create(immHandle);
> + safassert(saImmOmAdminOwnerInitialize(immHandle, ownerName, SA_TRUE,
> &ownerHandle), SA_AIS_OK);
> + safassert(object_create(immHandle, ownerHandle, configClassName, &dn,
> NULL, NULL), SA_AIS_OK);
> +
> + // Change SaNameT attribute for testing
> + safassert(saImmOmCcbInitialize(ownerHandle, 0, &ccbHandle), SA_AIS_OK);
> + safassert(saImmOmCcbObjectModify_2(ccbHandle, &dn, attrMods),
> SA_AIS_OK);
> + safassert(saImmOmCcbApply(ccbHandle), SA_AIS_OK);
> + safassert(saImmOmCcbFinalize(ccbHandle), SA_AIS_OK);
> +
> + safassert(saImmOmAdminOwnerFinalize(ownerHandle), SA_AIS_OK);
> + safassert(saImmOmFinalize(immHandle), SA_AIS_OK);
> +}
> +
> +static void cleanOiLongDn(void) {
> + SaImmHandleT immHandle;
> + SaImmAdminOwnerHandleT ownerHandle;
> + SaNameT dn;
> + const SaNameT *objects[2] = { &dn, NULL };
> + const SaImmAdminOwnerNameT ownerName = (const
> SaImmAdminOwnerNameT)__FUNCTION__;
> +
> + osaf_extended_name_lend(longDn, &dn);
> +
> + safassert(saImmOmInitialize(&immHandle, NULL, &immVersion), SA_AIS_OK);
> + safassert(saImmOmAdminOwnerInitialize(immHandle, ownerName, SA_TRUE,
> &ownerHandle), SA_AIS_OK);
> + saImmOmAdminOwnerSet(ownerHandle, objects, SA_IMM_ONE);
> +
> + object_delete(ownerHandle, &dn, 0);
> + config_class_delete(immHandle);
> +
> + safassert(saImmOmAdminOwnerFinalize(ownerHandle), SA_AIS_OK);
> + safassert(saImmOmFinalize(immHandle), SA_AIS_OK);
> +}
> +
> +
> +static void saImmOiAdminOperationCallback(SaImmOiHandleT immOiHandle,
> + SaInvocationT invocation,
> + const SaNameT *objectName,
> + SaImmAdminOperationIdT operationId,
> + const SaImmAdminOperationParamsT_2
> **params) {
> +
> + if(params && params[0] && !strcmp(params[0]->paramName, "attr8")) {
> + SaNameT *val = (SaNameT *)params[0]->paramBuffer;
> + if(!strcmp(osaf_extended_name_borrow(val), longDn2)) {
> + // Return input parameters
> + saImmOiAdminOperationResult_o2(immOiHandle, invocation,
> SA_AIS_OK, params);
> + return;
> + }
> + }
> +
> + saImmOiAdminOperationResult_o2(immOiHandle, invocation,
> SA_AIS_ERR_BAD_OPERATION, NULL);
> +}
> +
> +static void saImmOiCcbAbortCallback(SaImmOiHandleT immOiHandle,
> SaImmOiCcbIdT ccbId) {
> +}
> +
> +static void saImmOiCcbApplyCallback(SaImmOiHandleT immOiHandle,
> SaImmOiCcbIdT ccbId) {
> +}
> +
> +static SaAisErrorT saImmOiCcbCompletedCallback(SaImmOiHandleT immOiHandle,
> SaImmOiCcbIdT ccbId) {
> + return SA_AIS_OK;
> +}
> +
> +static SaAisErrorT saImmOiCcbObjectCreateCallback(SaImmOiHandleT immOiHandle,
> + SaImmOiCcbIdT ccbId,
> + const SaImmClassNameT className,
> + const SaNameT *parentName, const
> SaImmAttrValuesT_2 **attr) {
> + return SA_AIS_OK;
> +}
> +
> +static SaAisErrorT saImmOiCcbObjectDeleteCallback(SaImmOiHandleT
> immOiHandle, SaImmOiCcbIdT ccbId, const SaNameT *objectName) {
> + return SA_AIS_OK;
> +}
> +
> +static SaAisErrorT saImmOiCcbObjectModifyCallback(SaImmOiHandleT
> immOiHandle, SaImmOiCcbIdT ccbId, const SaNameT *objectName, const
> SaImmAttrModificationT_2 **attrMods) {
> + return SA_AIS_OK;
> +}
> +
> +static SaAisErrorT saImmOiRtAttrUpdateCallback(SaImmOiHandleT immOiHandle,
> const SaNameT *objectName, const SaImmAttrNameT *attributeNames) {
> + SaNameT val;
> + SaImmAttrValueT attrValues[1] = { &val };
> + SaImmAttrModificationT_2 attrMod = { SA_IMM_ATTR_VALUES_REPLACE,
> + { "attr2", SA_IMM_ATTR_SANAMET, 1, attrValues
> }};
> + const SaImmAttrModificationT_2 *attrMods[2] = { &attrMod, NULL };
> +
> + if(osaf_extended_name_length(objectName) == strlen(longDn)
> + && !strncmp(osaf_extended_name_borrow(objectName),
> longDn, strlen(longDn2))) {
> + osaf_extended_name_lend(longDn2, &val);
> + saImmOiRtObjectUpdate_2(immOiHandle, objectName, attrMods);
> + return SA_AIS_OK;
> + }
> +
> + return SA_AIS_ERR_FAILED_OPERATION;
> +}
> +
> +static SaImmOiCallbacksT_2 localImmOiCallbacks = {
> + saImmOiAdminOperationCallback,
> + saImmOiCcbAbortCallback,
> + saImmOiCcbApplyCallback,
> + saImmOiCcbCompletedCallback,
> + saImmOiCcbObjectCreateCallback,
> + saImmOiCcbObjectDeleteCallback,
> + saImmOiCcbObjectModifyCallback,
> + saImmOiRtAttrUpdateCallback,
> +};
> +
> +enum {
> + S_DISP_START = 0,
> + S_DISP_READY,
> + S_DISP_FINISH
> +};
> +
> +// -1 for infinite loop, exit with setting s_dispatch_exit = 0
> +static int s_dispatch_repeat = 0;
> +static int s_dispatch_exit = 0;
> +static int s_dispatch_status = 0;
> +static SaImmOiHandleT s_dispatch_oi_handle = 0;
> +
> +static void *dispatchThread(void *param) {
> + SaImmOiHandleT oiHandle = s_dispatch_oi_handle;
> + SaSelectionObjectT selObj;
> + int repeat = s_dispatch_repeat ? s_dispatch_repeat : -1;
> + int waittime = (repeat == -1) ? 10 : -1;
> + int rc;
> + struct pollfd fd;
> +
> + safassert(saImmOiSelectionObjectGet(oiHandle, &selObj), SA_AIS_OK);
> +
> + s_dispatch_status = S_DISP_READY;
> +
> + while(repeat) {
> + fd.fd = selObj;
> + fd.events = POLLIN;
> + rc = poll(&fd, 1, waittime);
> + if(!rc) {
> + if(s_dispatch_exit)
> + repeat = 0;
> + continue;
> + }
> + assert(rc != -1);
> +
> + saImmOiDispatch(oiHandle, SA_DISPATCH_ONE);
> +
> + if(repeat > 0) {
> + repeat--;
> + } else if(s_dispatch_exit) {
> + // Exit from loop
> + repeat = 0;
> + }
> + }
> +
> + s_dispatch_status = S_DISP_FINISH;
> +
> + return NULL;
> +}
> +
> +static void saImmOiLongDn_01(void) {
> + SaAisErrorT rc;
> + SaImmOiHandleT immOiHandle;
> + SaImmHandleT immOmHandle;
> + SaImmAdminOwnerHandleT ownerHandle;
> + SaImmCcbHandleT ccbHandle;
> + SaImmAdminOwnerNameT ownerName = (SaImmAdminOwnerNameT)__FUNCTION__;
> + const SaImmOiImplementerNameT implementerName =
> (SaImmOiImplementerNameT)__FILE__;
> + pthread_t threadid;
> +
> + SaNameT dn;
> + SaImmAttrValueT rdnVal[1] = { (SaImmAttrValueT)&dn };
> + SaImmAttrValuesT_2 attrValue = { "rdn", SA_IMM_ATTR_SANAMET, 1, rdnVal
> };
> + const SaImmAttrValuesT_2 *attrValues[2] = { &attrValue, NULL };
> +
> + osaf_extended_name_lend(longDn, &dn);
> +
> + safassert(saImmOiInitialize_2(&immOiHandle, &localImmOiCallbacks,
> &immVersion), SA_AIS_OK);
> + safassert(saImmOiImplementerSet(immOiHandle, implementerName),
> SA_AIS_OK);
> +
> + s_dispatch_repeat = 0;
> + s_dispatch_oi_handle = immOiHandle;
> + s_dispatch_exit = 0;
> + s_dispatch_status = 0;
> + assert(pthread_create(&threadid, NULL, dispatchThread, NULL) == 0);
> +
> + while(s_dispatch_status != S_DISP_READY) {
> + usleep(100);
> + }
> +
> + safassert(saImmOmInitialize(&immOmHandle, NULL, &immVersion),
> SA_AIS_OK);
> + config_class_create(immOmHandle);
> +
> + safassert(saImmOiClassImplementerSet(immOiHandle, configClassName),
> SA_AIS_OK);
> +
> + safassert(saImmOmAdminOwnerInitialize(immOmHandle, ownerName, SA_TRUE,
> &ownerHandle), SA_AIS_OK);
> + safassert(saImmOmCcbInitialize(ownerHandle, 0, &ccbHandle), SA_AIS_OK);
> +
> + rc = saImmOmCcbObjectCreate_2(ccbHandle, configClassName, NULL,
> attrValues);
> +
> + safassert(saImmOmCcbFinalize(ccbHandle), SA_AIS_OK);
> + safassert(saImmOmAdminOwnerFinalize(ownerHandle), SA_AIS_OK);
> +
> + safassert(saImmOiClassImplementerRelease(immOiHandle, configClassName),
> SA_AIS_OK);
> +
> + // Wait for thread to exit
> + s_dispatch_exit = 1;
> + while(s_dispatch_status != S_DISP_FINISH) {
> + usleep(100);
> + }
> +
> + safassert(saImmOiFinalize(immOiHandle), SA_AIS_OK);
> +
> + config_class_delete(immOmHandle);
> + safassert(saImmOmFinalize(immOmHandle), SA_AIS_OK);
> +
> + test_validate(rc, SA_AIS_OK);
> +}
> +
> +static void saImmOiLongDn_02(void) {
> + SaAisErrorT rc;
> + SaImmOiHandleT immOiHandle;
> + SaImmHandleT immOmHandle;
> + SaImmAdminOwnerHandleT ownerHandle;
> + SaImmCcbHandleT ccbHandle;
> + SaImmAdminOwnerNameT ownerName = (SaImmAdminOwnerNameT)__FUNCTION__;
> + const SaImmOiImplementerNameT implementerName =
> (SaImmOiImplementerNameT)__FILE__;
> + pthread_t threadid;
> + SaNameT dn;
> + SaNameT val;
> + const SaNameT *objects[2] = { &dn, NULL };
> +
> + SaImmAttrValueT attrValues[1] = { &val };
> + SaImmAttrModificationT_2 attrMod = { SA_IMM_ATTR_VALUES_REPLACE,
> + { "attr8", SA_IMM_ATTR_SANAMET, 1, attrValues }};
> + const SaImmAttrModificationT_2 *attrMods[2] = { &attrMod, NULL };
> +
> + osaf_extended_name_lend(longDn, &dn);
> + osaf_extended_name_lend(longDn2, &val);
> +
> + setupOiLongDn();
> +
> + safassert(saImmOiInitialize_2(&immOiHandle, &localImmOiCallbacks,
> &immVersion), SA_AIS_OK);
> + safassert(saImmOiImplementerSet(immOiHandle, implementerName),
> SA_AIS_OK);
> + safassert(saImmOiClassImplementerSet(immOiHandle, configClassName),
> SA_AIS_OK);
> +
> + s_dispatch_repeat = 0;
> + s_dispatch_oi_handle = immOiHandle;
> + s_dispatch_exit = 0;
> + s_dispatch_status = 0;
> + pthread_create(&threadid, NULL, dispatchThread, NULL);
> +
> + while(s_dispatch_status != S_DISP_READY) {
> + usleep(100);
> + }
> +
> + safassert(saImmOmInitialize(&immOmHandle, NULL, &immVersion),
> SA_AIS_OK);
> + safassert(saImmOmAdminOwnerInitialize(immOmHandle, ownerName, SA_TRUE,
> &ownerHandle), SA_AIS_OK);
> + safassert(saImmOmAdminOwnerSet(ownerHandle, objects, SA_IMM_ONE),
> SA_AIS_OK);
> + safassert(saImmOmCcbInitialize(ownerHandle, 0, &ccbHandle), SA_AIS_OK);
> +
> + rc = saImmOmCcbObjectModify_2(ccbHandle, &dn, attrMods);
> +
> + safassert(saImmOmCcbApply(ccbHandle), SA_AIS_OK);
> + safassert(saImmOmCcbFinalize(ccbHandle), SA_AIS_OK);
> + safassert(saImmOmAdminOwnerFinalize(ownerHandle), SA_AIS_OK);
> + safassert(saImmOmFinalize(immOmHandle), SA_AIS_OK);
> +
> + safassert(saImmOiClassImplementerRelease(immOiHandle, configClassName),
> SA_AIS_OK);
> +
> + // Wait for thread to exit
> + s_dispatch_exit = 1;
> + while(s_dispatch_status != S_DISP_FINISH) {
> + usleep(100);
> + }
> +
> + safassert(saImmOiFinalize(immOiHandle), SA_AIS_OK);
> +
> + test_validate(rc, SA_AIS_OK);
> +
> + cleanOiLongDn();
> +}
> +
> +static void saImmOiLongDn_03(void) {
> + SaAisErrorT rc;
> + SaImmOiHandleT immOiHandle;
> + SaImmHandleT immOmHandle;
> + SaImmAdminOwnerHandleT ownerHandle;
> + SaImmCcbHandleT ccbHandle;
> + SaImmAdminOwnerNameT ownerName = (SaImmAdminOwnerNameT)__FUNCTION__;
> + const SaImmOiImplementerNameT implementerName =
> (SaImmOiImplementerNameT)__FILE__;
> + pthread_t threadid;
> + SaNameT dn;
> + const SaNameT *objects[2] = { &dn, NULL };
> +
> + osaf_extended_name_lend(longDn, &dn);
> +
> + setupOiLongDn();
> +
> + safassert(saImmOiInitialize_2(&immOiHandle, &localImmOiCallbacks,
> &immVersion), SA_AIS_OK);
> + safassert(saImmOiImplementerSet(immOiHandle, implementerName),
> SA_AIS_OK);
> + safassert(saImmOiClassImplementerSet(immOiHandle, configClassName),
> SA_AIS_OK);
> +
> + s_dispatch_repeat = 0;
> + s_dispatch_oi_handle = immOiHandle;
> + s_dispatch_exit = 0;
> + s_dispatch_status = 0;
> + pthread_create(&threadid, NULL, dispatchThread, NULL);
> +
> + while(s_dispatch_status != S_DISP_READY) {
> + usleep(100);
> + }
> +
> + safassert(saImmOmInitialize(&immOmHandle, NULL, &immVersion),
> SA_AIS_OK);
> + safassert(saImmOmAdminOwnerInitialize(immOmHandle, ownerName, SA_TRUE,
> &ownerHandle), SA_AIS_OK);
> + safassert(saImmOmAdminOwnerSet(ownerHandle, objects, SA_IMM_ONE),
> SA_AIS_OK);
> + safassert(saImmOmCcbInitialize(ownerHandle, 0, &ccbHandle), SA_AIS_OK);
> +
> + rc = saImmOmCcbObjectDelete(ccbHandle, &dn);
> +
> + safassert(saImmOmCcbApply(ccbHandle), SA_AIS_OK);
> + safassert(saImmOmCcbFinalize(ccbHandle), SA_AIS_OK);
> + safassert(saImmOmAdminOwnerFinalize(ownerHandle), SA_AIS_OK);
> + safassert(saImmOmFinalize(immOmHandle), SA_AIS_OK);
> +
> + safassert(saImmOiClassImplementerRelease(immOiHandle, configClassName),
> SA_AIS_OK);
> +
> + // Wait for thread to exit
> + s_dispatch_exit = 1;
> + while(s_dispatch_status != S_DISP_FINISH) {
> + usleep(100);
> + }
> +
> + safassert(saImmOiFinalize(immOiHandle), SA_AIS_OK);
> +
> + test_validate(rc, SA_AIS_OK);
> +
> + cleanOiLongDn();
> +}
> +
> +static void saImmOiLongDn_04(void) {
> + SaAisErrorT rc, rc1;
> + SaImmOiHandleT immOiHandle;
> + SaImmHandleT immOmHandle;
> + const SaImmOiImplementerNameT implementerName =
> (SaImmOiImplementerNameT)__FILE__;
> + pthread_t threadid;
> +
> + SaNameT dn;
> + SaImmAttrValueT rdnVal[1] = { (SaImmAttrValueT)&dn };
> + SaImmAttrValuesT_2 attrValue = { "rdn", SA_IMM_ATTR_SANAMET, 1, rdnVal
> };
> + const SaImmAttrValuesT_2 *attrValues[2] = { &attrValue, NULL };
> +
> + osaf_extended_name_lend(longDn, &dn);
> +
> + safassert(saImmOiInitialize_2(&immOiHandle, &localImmOiCallbacks,
> &immVersion), SA_AIS_OK);
> + safassert(saImmOiImplementerSet(immOiHandle, implementerName),
> SA_AIS_OK);
> +
> + s_dispatch_repeat = 0;
> + s_dispatch_oi_handle = immOiHandle;
> + s_dispatch_exit = 0;
> + s_dispatch_status = 0;
> + pthread_create(&threadid, NULL, dispatchThread, NULL);
> +
> + while(s_dispatch_status != S_DISP_READY) {
> + usleep(100);
> + }
> +
> + safassert(saImmOmInitialize(&immOmHandle, NULL, &immVersion),
> SA_AIS_OK);
> + runtime_class_create(immOmHandle);
> +
> + rc = saImmOiRtObjectCreate_2(immOiHandle, runtimeClassName, NULL,
> attrValues);
> + rc1 = saImmOiRtObjectDelete(immOiHandle, &dn);
> +
> + if(rc == SA_AIS_OK) {
> + rc = rc1;
> + }
> +
> + runtime_class_delete(immOmHandle);
> + safassert(saImmOmFinalize(immOmHandle), SA_AIS_OK);
> +
> + // Wait for thread to exit
> + s_dispatch_exit = 1;
> + while(s_dispatch_status != S_DISP_FINISH) {
> + usleep(100);
> + }
> +
> + safassert(saImmOiFinalize(immOiHandle), SA_AIS_OK);
> +
> + test_validate(rc, SA_AIS_OK);
> +}
> +
> +static void saImmOiLongDn_05(void) {
> + SaAisErrorT rc;
> + SaImmOiHandleT immOiHandle;
> + SaImmHandleT immOmHandle;
> + SaImmAccessorHandleT accessorHandle;
> + const SaImmOiImplementerNameT implementerName =
> (SaImmOiImplementerNameT)__FILE__;
> + pthread_t threadid;
> + SaImmAttrValuesT_2 **attributes = NULL;
> +
> + SaNameT dn;
> + SaImmAttrValueT rdnVal[1] = { (SaImmAttrValueT)&dn };
> + SaImmAttrValuesT_2 attrValue = { "rdn", SA_IMM_ATTR_SANAMET, 1, rdnVal
> };
> + const SaImmAttrValuesT_2 *attrValues[2] = { &attrValue, NULL };
> +
> + osaf_extended_name_lend(longDn, &dn);
> +
> + safassert(saImmOiInitialize_2(&immOiHandle, &localImmOiCallbacks,
> &immVersion), SA_AIS_OK);
> + safassert(saImmOiImplementerSet(immOiHandle, implementerName),
> SA_AIS_OK);
> +
> + s_dispatch_repeat = 0;
> + s_dispatch_oi_handle = immOiHandle;
> + s_dispatch_exit = 0;
> + s_dispatch_status = 0;
> + pthread_create(&threadid, NULL, dispatchThread, NULL);
> +
> + while(s_dispatch_status != S_DISP_READY) {
> + usleep(100);
> + }
> +
> + safassert(saImmOmInitialize(&immOmHandle, NULL, &immVersion),
> SA_AIS_OK);
> + runtime_class_create(immOmHandle);
> + safassert(saImmOiRtObjectCreate_2(immOiHandle, runtimeClassName, NULL,
> attrValues), SA_AIS_OK);
> +
> + safassert(saImmOmAccessorInitialize(immOmHandle, &accessorHandle),
> SA_AIS_OK);
> + rc = saImmOmAccessorGet_2(accessorHandle, &dn, NULL, &attributes);
> + if(rc == SA_AIS_OK) {
> + // Accesor get must return a value. attributes cannot be NULL
> + assert(attributes);
> +
> + SaNameT *val;
> + int i;
> + for(i=0; attributes[i]; i++) {
> + if(!strcmp(attributes[i]->attrName, "attr2")) {
> + // Must return 1 value
> + assert(attributes[i]->attrValuesNumber == 1);
> + assert(attributes[i]->attrValues);
> +
> + val = (SaNameT *)attributes[i]->attrValues[0];
> + // Check attribute value
> + assert(osaf_extended_name_length(val) ==
> strlen(longDn2));
> + assert(strncmp(osaf_extended_name_borrow(val),
> longDn2, strlen(longDn2)) == 0);
> + break;
> + }
> + }
> +
> + // Updated value was not found in the result list
> + assert(attributes[i]);
> + }
> +
> + safassert(saImmOiRtObjectDelete(immOiHandle, &dn), SA_AIS_OK);
> + runtime_class_delete(immOmHandle);
> + safassert(saImmOmFinalize(immOmHandle), SA_AIS_OK);
> +
> + // Wait for thread to exit
> + s_dispatch_exit = 1;
> + while(s_dispatch_status != S_DISP_FINISH) {
> + usleep(100);
> + }
> +
> + safassert(saImmOiFinalize(immOiHandle), SA_AIS_OK);
> +
> + test_validate(rc, SA_AIS_OK);
> +}
> +
> +static void saImmOiLongDn_06(void) {
> + SaAisErrorT rc;
> + SaAisErrorT result;
> + SaImmOiHandleT immOiHandle;
> + SaImmHandleT immOmHandle;
> + SaImmAdminOwnerHandleT ownerHandle;
> + const SaImmAdminOwnerNameT ownerName =
> (SaImmAdminOwnerNameT)__FUNCTION__;
> + const SaImmOiImplementerNameT implementerName =
> (SaImmOiImplementerNameT)__FILE__;
> + pthread_t threadid;
> + SaNameT dn;
> + SaNameT val;
> + const SaNameT *objects[2] = { &dn, NULL };
> + SaImmAdminOperationParamsT_2 param = {
> + "attr8",
> + SA_IMM_ATTR_SANAMET,
> + &val
> + };
> + const SaImmAdminOperationParamsT_2 *params[2] = { ¶m, NULL };
> + SaImmAdminOperationParamsT_2 **returnParams;
> +
> + osaf_extended_name_lend(longDn, &dn);
> + osaf_extended_name_lend(longDn2, &val);
> +
> + setupOiLongDn();
> +
> + safassert(saImmOiInitialize_2(&immOiHandle, &localImmOiCallbacks,
> &immVersion), SA_AIS_OK);
> + safassert(saImmOiImplementerSet(immOiHandle, implementerName),
> SA_AIS_OK);
> + safassert(saImmOiClassImplementerSet(immOiHandle, configClassName),
> SA_AIS_OK);
> +
> + s_dispatch_repeat = 0;
> + s_dispatch_oi_handle = immOiHandle;
> + s_dispatch_exit = 0;
> + s_dispatch_status = 0;
> + pthread_create(&threadid, NULL, dispatchThread, NULL);
> +
> + while(s_dispatch_status != S_DISP_READY) {
> + usleep(100);
> + }
> +
> + safassert(saImmOmInitialize(&immOmHandle, NULL, &immVersion),
> SA_AIS_OK);
> + safassert(saImmOmAdminOwnerInitialize(immOmHandle, ownerName, SA_TRUE,
> &ownerHandle), SA_AIS_OK);
> + safassert(saImmOmAdminOwnerSet(ownerHandle, objects, SA_IMM_ONE),
> SA_AIS_OK);
> +
> + rc = saImmOmAdminOperationInvoke_o2(ownerHandle, &dn, 1, 1, params,
> &result, 10, &returnParams);
> +
> + if(rc == SA_AIS_OK) {
> + assert(returnParams);
> + assert(returnParams[0]);
> + assert(!strcmp(returnParams[0]->paramName, "attr8"));
> + SaNameT *val = (SaNameT *)returnParams[0]->paramBuffer;
> + assert(!strcmp(osaf_extended_name_borrow(val), longDn2));
> + saImmOmAdminOperationMemoryFree(ownerHandle, returnParams);
> + }
> +
> + safassert(saImmOmAdminOwnerFinalize(ownerHandle), SA_AIS_OK);
> + safassert(saImmOmFinalize(immOmHandle), SA_AIS_OK);
> +
> + safassert(saImmOiClassImplementerRelease(immOiHandle, configClassName),
> SA_AIS_OK);
> +
> + // Wait for thread to exit
> + s_dispatch_exit = 1;
> + while(s_dispatch_status != S_DISP_FINISH) {
> + usleep(100);
> + }
> +
> + safassert(saImmOiFinalize(immOiHandle), SA_AIS_OK);
> +
> + test_validate(rc, SA_AIS_OK);
> +
> + cleanOiLongDn();
> +}
> +
> +static void saImmOiLongDn_07(void) {
> + SaAisErrorT rc;
> + SaImmOiHandleT immOiHandle;
> + const SaImmOiImplementerNameT implementerName =
> (SaImmOiImplementerNameT)__FILE__;
> + SaNameT dn;
> +
> + osaf_extended_name_lend(longDn, &dn);
> +
> + setupOiLongDn();
> +
> + safassert(saImmOiInitialize_2(&immOiHandle, &localImmOiCallbacks,
> &immVersion), SA_AIS_OK);
> + safassert(saImmOiImplementerSet(immOiHandle, implementerName),
> SA_AIS_OK);
> +
> + rc = saImmOiObjectImplementerSet(immOiHandle, &dn, SA_IMM_ONE);
> + if(rc == SA_AIS_OK) {
> + rc = saImmOiObjectImplementerRelease(immOiHandle, &dn,
> SA_IMM_ONE);
> + }
> +
> + safassert(saImmOiFinalize(immOiHandle), SA_AIS_OK);
> +
> + test_validate(rc, SA_AIS_OK);
> +
> + cleanOiLongDn();
> +}
> +
> +void addOiLongDnTestCases() {
> + test_case_add(7, saImmOiLongDn_01, "SA_AIS_OK - Object create
> callback");
> + test_case_add(7, saImmOiLongDn_02, "SA_AIS_OK - Object modify
> callback");
> + test_case_add(7, saImmOiLongDn_03, "SA_AIS_OK - Object delete
> callback");
> + test_case_add(7, saImmOiLongDn_04, "SA_AIS_OK - Rt Object create and
> delete");
> + test_case_add(7, saImmOiLongDn_05, "SA_AIS_OK - Rt Object update");
> + test_case_add(7, saImmOiLongDn_06, "SA_AIS_OK - Admin operation
> callback");
> + test_case_add(7, saImmOiLongDn_07, "SA_AIS_OK -
> saImmOiObjectImplementerSet");
> +}
> +
> +__attribute__ ((constructor)) static void saImmOiLongDn_constructor(void)
> +{
> + test_suite_add(7, "Long DN");
> +}
> diff --git a/tests/immsv/management/Makefile.am
> b/tests/immsv/management/Makefile.am
> --- a/tests/immsv/management/Makefile.am
> +++ b/tests/immsv/management/Makefile.am
> @@ -53,6 +53,7 @@ immomtest_SOURCES = \
> test_saImmOmCcbFinalize.c \
> test_saImmOmAdminOperationContinue.c \
> test_saImmOmThreadInterference.c \
> + test_saImmOmLongDn.c \
> test_cleanup.c
>
> immomtest_LDADD = \
> diff --git a/tests/immsv/management/test_cleanup.c
> b/tests/immsv/management/test_cleanup.c
> --- a/tests/immsv/management/test_cleanup.c
> +++ b/tests/immsv/management/test_cleanup.c
> @@ -16,6 +16,7 @@
> */
>
> #include "immtest.h"
> +#include "osaf_extended_name.h"
>
>
> static char *objects[] = {
> @@ -28,6 +29,7 @@ static char *objects[] = {
> "id=2",
> "id=3",
> "rdn=root",
> +
> "longdn=012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789",
> NULL
> };
>
> @@ -51,6 +53,7 @@ static char *classes[] = {
> NULL
> };
>
> +extern void addOmLongDnTestCases();
>
> static void cleanup() {
> SaVersionT version = { 'A', 2, 11 };
> @@ -74,26 +77,25 @@ static void cleanup() {
> assert(rc == SA_AIS_OK);
>
> /* Delete objects */
> - int len;
> SaNameT objectName = {0};
> SaNameT *objectNames[2] = { &objectName, NULL };
> obj = objects;
> while(*obj) {
> - len = strlen(*obj);
> - objectName.length = (len > SA_MAX_NAME_LENGTH) ?
> SA_MAX_NAME_LENGTH : len;
> - strncpy((char *)objectName.value, *obj, objectName.length);
> + if(osaf_is_extended_names_enabled() || strlen(*obj) <
> SA_MAX_NAME_LENGTH) {
> + osaf_extended_name_lend(*obj, &objectName);
>
> - rc = saImmOmAdminOwnerSet(ownerHandle, (const SaNameT
> **)objectNames, SA_IMM_SUBTREE);
> - if(rc == SA_AIS_ERR_NOT_EXIST) {
> - obj++;
> - continue;
> + rc = saImmOmAdminOwnerSet(ownerHandle, (const SaNameT
> **)objectNames, SA_IMM_SUBTREE);
> + if(rc == SA_AIS_ERR_NOT_EXIST) {
> + obj++;
> + continue;
> + }
> + assert(rc == SA_AIS_OK);
> +
> + rc = saImmOmCcbObjectDelete(ccbHandle, &objectName);
> + if(rc != SA_AIS_OK && rc != SA_AIS_ERR_NOT_EXIST)
> + fprintf(stderr, "Failed to delete object '%s'
> with error code: %d\n", *obj, rc);
> + assert(rc == SA_AIS_OK || rc == SA_AIS_ERR_NOT_EXIST);
> }
> - assert(rc == SA_AIS_OK);
> -
> - rc = saImmOmCcbObjectDelete(ccbHandle, &objectName);
> - if(rc != SA_AIS_OK && rc != SA_AIS_ERR_NOT_EXIST)
> - fprintf(stderr, "Failed to delete object '%s' with
> error code: %d\n", *obj, rc);
> - assert(rc == SA_AIS_OK || rc == SA_AIS_ERR_NOT_EXIST);
>
> obj++;
> }
> @@ -142,6 +144,14 @@ static void startup() {
> safassert(object_create(immOmHandle, ownerHandle, configClassName,
> &rootObj, NULL, NULL), SA_AIS_OK);
> safassert(saImmOmAdminOwnerFinalize(ownerHandle), SA_AIS_OK);
> safassert(saImmOmFinalize(immOmHandle), SA_AIS_OK);
> +
> + /* Add long DN test cases */
> + char *env;
> + if((env = getenv("SA_ENABLE_EXTENDED_NAMES"))) {
> + if(!strcmp(env, "1")) {
> + addOmLongDnTestCases();
> + }
> + }
> }
>
> __attribute__ ((constructor)) static void cleanup_constructor(void)
> diff --git a/tests/immsv/management/test_saImmOmLongDn.c
> b/tests/immsv/management/test_saImmOmLongDn.c
> new file mode 100644
> --- /dev/null
> +++ b/tests/immsv/management/test_saImmOmLongDn.c
> @@ -0,0 +1,368 @@
> +/* -*- OpenSAF -*-
> + *
> + * (C) Copyright 2014 The OpenSAF Foundation
> + *
> + * This program is distributed in the hope that it will be useful, but
> + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
> + * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed
> + * under the GNU Lesser General Public License Version 2.1, February 1999.
> + * The complete license can be accessed from the following location:
> + * http://opensource.org/licenses/lgpl-license.php
> + * See the Copying file included with the OpenSAF distribution for full
> + * licensing terms.
> + *
> + * Author(s): Ericsson AB
> + *
> + */
> +
> +#include "immtest.h"
> +#include "osaf_extended_name.h"
> +
> +
> +static char *longDn =
> "longdn=0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"
> +
> "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"
> +
> "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789";
> +
> +
> +static void setupLongDn(void) {
> + SaImmHandleT immHandle;
> + SaImmAdminOwnerHandleT ownerHandle;
> + SaImmCcbHandleT ccbHandle;
> + SaNameT dn;
> + const SaImmAdminOwnerNameT ownerName = (const
> SaImmAdminOwnerNameT)__FUNCTION__;
> +
> + SaImmAttrValueT attrValues[1] = { &dn };
> + SaImmAttrModificationT_2 attrMod = { SA_IMM_ATTR_VALUES_REPLACE,
> + { "attr8", SA_IMM_ATTR_SANAMET, 1, attrValues }};
> + const SaImmAttrModificationT_2 *attrMods[2] = { &attrMod, NULL };
> +
> + osaf_extended_name_lend(longDn, &dn);
> +
> + safassert(saImmOmInitialize(&immHandle, NULL, &immVersion), SA_AIS_OK);
> + config_class_create(immHandle);
> + safassert(saImmOmAdminOwnerInitialize(immHandle, ownerName, SA_TRUE,
> &ownerHandle), SA_AIS_OK);
> + safassert(object_create(immHandle, ownerHandle, configClassName, &dn,
> NULL, NULL), SA_AIS_OK);
> +
> + // Change SaNameT attribute for testing
> + safassert(saImmOmCcbInitialize(ownerHandle, 0, &ccbHandle), SA_AIS_OK);
> + safassert(saImmOmCcbObjectModify_2(ccbHandle, &dn, attrMods),
> SA_AIS_OK);
> + safassert(saImmOmCcbApply(ccbHandle), SA_AIS_OK);
> + safassert(saImmOmCcbFinalize(ccbHandle), SA_AIS_OK);
> +
> + safassert(saImmOmAdminOwnerFinalize(ownerHandle), SA_AIS_OK);
> + safassert(saImmOmFinalize(immHandle), SA_AIS_OK);
> +}
> +
> +static void cleanLongDn(void) {
> + SaImmHandleT immHandle;
> + SaImmAdminOwnerHandleT ownerHandle;
> + SaNameT dn;
> + const SaNameT *objects[2] = { &dn, NULL };
> + const SaImmAdminOwnerNameT ownerName = (const
> SaImmAdminOwnerNameT)__FUNCTION__;
> +
> + osaf_extended_name_lend(longDn, &dn);
> +
> + safassert(saImmOmInitialize(&immHandle, NULL, &immVersion), SA_AIS_OK);
> + safassert(saImmOmAdminOwnerInitialize(immHandle, ownerName, SA_TRUE,
> &ownerHandle), SA_AIS_OK);
> + safassert(saImmOmAdminOwnerSet(ownerHandle, objects, SA_IMM_ONE),
> SA_AIS_OK);
> +
> + safassert(object_delete(ownerHandle, &dn, 0), SA_AIS_OK);
> + config_class_delete(immHandle);
> +
> + safassert(saImmOmAdminOwnerFinalize(ownerHandle), SA_AIS_OK);
> + safassert(saImmOmFinalize(immHandle), SA_AIS_OK);
> +}
> +
> +static void saImmOmLongDn_01(void) {
> + SaImmHandleT immHandle;
> + SaAisErrorT error;
> + SaNameT defaultValue;
> + SaImmAttrDefinitionT_2 rdn = {
> + "rdn", SA_IMM_ATTR_SANAMET, SA_IMM_ATTR_CONFIG |
> SA_IMM_ATTR_RDN, NULL
> + };
> + SaImmAttrDefinitionT_2 attr = {
> + "attr", SA_IMM_ATTR_SANAMET, SA_IMM_ATTR_CONFIG |
> SA_IMM_ATTR_WRITABLE, &defaultValue
> + };
> + const SaImmAttrDefinitionT_2* attributes[] = {&rdn, &attr, NULL};
> +
> + safassert(saImmOmInitialize(&immHandle, NULL, &immVersion), SA_AIS_OK);
> + osaf_extended_name_lend(longDn, &defaultValue);
> + error = saImmOmClassCreate_2(immHandle, "LongDnClass",
> SA_IMM_CLASS_CONFIG, attributes);
> + safassert(saImmOmClassDelete(immHandle, "LongDnClass"), SA_AIS_OK);
> + safassert(saImmOmFinalize(immHandle), SA_AIS_OK);
> +
> + test_validate(error, SA_AIS_OK);
> +}
> +
> +static void saImmOmLongDn_02(void) {
> + SaImmHandleT immHandle;
> + SaAisErrorT error;
> + SaNameT defaultValue;
> + SaImmClassCategoryT classCategory;
> + SaImmAttrDefinitionT_2 rdn = {
> + "rdn", SA_IMM_ATTR_SANAMET, SA_IMM_ATTR_CONFIG |
> SA_IMM_ATTR_RDN, NULL
> + };
> + SaImmAttrDefinitionT_2 attr = {
> + "attr", SA_IMM_ATTR_SANAMET, SA_IMM_ATTR_CONFIG |
> SA_IMM_ATTR_WRITABLE, &defaultValue
> + };
> + const SaImmAttrDefinitionT_2* attributes[] = {&rdn, &attr, NULL};
> + SaImmAttrDefinitionT_2 **attrDef;
> +
> + safassert(saImmOmInitialize(&immHandle, NULL, &immVersion), SA_AIS_OK);
> + osaf_extended_name_lend(longDn, &defaultValue);
> + safassert(saImmOmClassCreate_2(immHandle, "LongDnClass",
> SA_IMM_CLASS_CONFIG, attributes), SA_AIS_OK);
> +
> + error = saImmOmClassDescriptionGet_2(immHandle, "LongDnClass",
> &classCategory, &attrDef);
> + if(error == SA_AIS_OK) {
> + int i = 0;
> + while(attrDef[i]) {
> + if(!strcmp("attr", attrDef[i]->attrName)) {
> + SaNameT *testDn = (SaNameT
> *)attrDef[i]->attrDefaultValue;
> + assert(testDn != NULL);
> + assert(strcmp(longDn,
> osaf_extended_name_borrow(testDn)) == 0);
> + break;
> + }
> + i++;
> + }
> + assert(attrDef[i] != NULL);
> +
> + safassert(saImmOmClassDescriptionMemoryFree_2(immHandle,
> attrDef), SA_AIS_OK);
> + }
> +
> + safassert(saImmOmClassDelete(immHandle, "LongDnClass"), SA_AIS_OK);
> + safassert(saImmOmFinalize(immHandle), SA_AIS_OK);
> +
> + test_validate(error, SA_AIS_OK);
> +}
> +
> +static void saImmOmLongDn_03(void) {
> + SaImmHandleT immHandle;
> + SaImmAdminOwnerHandleT ownerHandle;
> + SaImmCcbHandleT ccbHandle;
> + SaAisErrorT rc;
> + SaNameT dn;
> + const SaImmAdminOwnerNameT ownerName = (const
> SaImmAdminOwnerNameT)__FUNCTION__;
> +
> + SaImmAttrValueT rdnVal[1] = { (SaImmAttrValueT)&dn };
> + SaImmAttrValuesT_2 attrValue = { "rdn", SA_IMM_ATTR_SANAMET, 1, rdnVal
> };
> + const SaImmAttrValuesT_2 *attrValues[2] = { &attrValue, NULL };
> +
> + safassert(saImmOmInitialize(&immHandle, NULL, &immVersion), SA_AIS_OK);
> + config_class_create(immHandle);
> + osaf_extended_name_lend(longDn, &dn);
> +
> + safassert(saImmOmAdminOwnerInitialize(immHandle, ownerName, SA_TRUE,
> &ownerHandle), SA_AIS_OK);
> + safassert(saImmOmCcbInitialize(ownerHandle, 0, &ccbHandle), SA_AIS_OK);
> +
> + rc = saImmOmCcbObjectCreate_2(ccbHandle, configClassName, NULL,
> attrValues);
> + saImmOmCcbApply(ccbHandle);
> +
> + safassert(saImmOmCcbFinalize(ccbHandle), SA_AIS_OK);
> +
> + safassert(object_delete(ownerHandle, &dn, 1), SA_AIS_OK);
> + config_class_delete(immHandle);
> +
> + safassert(saImmOmAdminOwnerFinalize(ownerHandle), SA_AIS_OK);
> + safassert(saImmOmFinalize(immHandle), SA_AIS_OK);
> +
> + test_validate(rc, SA_AIS_OK);
> +}
> +
> +static void saImmOmLongDn_04(void) {
> + SaImmHandleT immHandle;
> + SaImmAdminOwnerHandleT ownerHandle;
> + SaImmCcbHandleT ccbHandle;
> + SaAisErrorT rc;
> + SaNameT dn;
> + const SaImmAdminOwnerNameT ownerName = (const
> SaImmAdminOwnerNameT)__FUNCTION__;
> +
> + SaImmAttrValueT attrValues[1] = { &dn };
> + SaImmAttrModificationT_2 attrMod = { SA_IMM_ATTR_VALUES_REPLACE,
> + { "attr8", SA_IMM_ATTR_SANAMET, 1, attrValues }};
> + const SaImmAttrModificationT_2 *attrMods[2] = { &attrMod, NULL };
> +
> + safassert(saImmOmInitialize(&immHandle, NULL, &immVersion), SA_AIS_OK);
> + config_class_create(immHandle);
> +
> + safassert(saImmOmAdminOwnerInitialize(immHandle, ownerName, SA_TRUE,
> &ownerHandle), SA_AIS_OK);
> +
> + osaf_extended_name_lend(longDn, &dn);
> + safassert(object_create(immHandle, ownerHandle, configClassName, &dn,
> NULL, NULL), SA_AIS_OK);
> +
> + safassert(saImmOmCcbInitialize(ownerHandle, 0, &ccbHandle), SA_AIS_OK);
> +
> + rc = saImmOmCcbObjectModify_2(ccbHandle, &dn, attrMods);
> + saImmOmCcbApply(ccbHandle);
> +
> + safassert(saImmOmCcbFinalize(ccbHandle), SA_AIS_OK);
> +
> + safassert(object_delete(ownerHandle, &dn, 1), SA_AIS_OK);
> + config_class_delete(immHandle);
> +
> + safassert(saImmOmAdminOwnerFinalize(ownerHandle), SA_AIS_OK);
> + safassert(saImmOmFinalize(immHandle), SA_AIS_OK);
> +
> + test_validate(rc, SA_AIS_OK);
> +}
> +
> +static void saImmOmLongDn_05(void) {
> + SaImmHandleT immHandle;
> + SaImmAdminOwnerHandleT ownerHandle;
> + SaImmCcbHandleT ccbHandle;
> + SaAisErrorT rc;
> + SaNameT dn;
> + const SaImmAdminOwnerNameT ownerName = (const
> SaImmAdminOwnerNameT)__FUNCTION__;
> +
> + safassert(saImmOmInitialize(&immHandle, NULL, &immVersion), SA_AIS_OK);
> + config_class_create(immHandle);
> +
> + safassert(saImmOmAdminOwnerInitialize(immHandle, ownerName, SA_TRUE,
> &ownerHandle), SA_AIS_OK);
> +
> + osaf_extended_name_lend(longDn, &dn);
> + safassert(object_create(immHandle, ownerHandle, configClassName, &dn,
> NULL, NULL), SA_AIS_OK);
> +
> + safassert(saImmOmCcbInitialize(ownerHandle, 0, &ccbHandle), SA_AIS_OK);
> +
> + rc = saImmOmCcbObjectDelete(ccbHandle, &dn);
> + saImmOmCcbApply(ccbHandle);
> +
> + safassert(saImmOmCcbFinalize(ccbHandle), SA_AIS_OK);
> +
> + config_class_delete(immHandle);
> +
> + safassert(saImmOmAdminOwnerFinalize(ownerHandle), SA_AIS_OK);
> + safassert(saImmOmFinalize(immHandle), SA_AIS_OK);
> +
> + test_validate(rc, SA_AIS_OK);
> +}
> +
> +static void saImmOmLongDn_06(void) {
> + SaImmHandleT immHandle;
> + SaImmSearchHandleT searchHandle;
> + SaAisErrorT rc;
> + SaNameT dn;
> + SaImmSearchParametersT_2 searchParam;
> + SaNameT objectName;
> + SaImmAttrValuesT_2 **attributes;
> + int i;
> +
> + osaf_extended_name_lend(longDn, &dn);
> + searchParam.searchOneAttr.attrName = "attr8";
> + searchParam.searchOneAttr.attrValueType = SA_IMM_ATTR_SANAMET;
> + searchParam.searchOneAttr.attrValue = &dn;
> +
> + setupLongDn();
> +
> + safassert(saImmOmInitialize(&immHandle, NULL, &immVersion), SA_AIS_OK);
> +
> + safassert(saImmOmSearchInitialize_2(immHandle, NULL, SA_IMM_SUBTREE,
> + SA_IMM_SEARCH_ONE_ATTR | SA_IMM_SEARCH_GET_ALL_ATTR,
> &searchParam,
> + NULL, &searchHandle), SA_AIS_OK);
> + rc = saImmOmSearchNext_2(searchHandle, &objectName, &attributes);
> + if(rc == SA_AIS_OK) {
> + assert(strcmp(osaf_extended_name_borrow(&objectName), longDn)
> == 0);
> + for(i=0; attributes[i]; i++) {
> + if(!strcmp(attributes[i]->attrName, "attr8")) {
> + // Must have at least one value
> + assert(attributes[i]->attrValuesNumber > 0);
> + // Check attribute value
> +
> assert(strcmp(osaf_extended_name_borrow((SaNameT
> *)(attributes[i]->attrValues[0])), longDn) == 0);
> + break;
> + }
> + }
> + // SaNameT attribute is missing
> + assert(attributes != NULL);
> + }
> + safassert(saImmOmSearchFinalize(searchHandle), SA_AIS_OK);
> +
> + safassert(saImmOmFinalize(immHandle), SA_AIS_OK);
> +
> + test_validate(rc, SA_AIS_OK);
> +
> + cleanLongDn();
> +}
> +
> +static void saImmOmLongDn_07(void) {
> + SaImmHandleT immHandle;
> + SaImmAccessorHandleT accessorHandle;
> + SaAisErrorT rc;
> + SaNameT dn;
> + SaImmAttrValuesT_2 **attributes;
> + int i;
> + int score = 0;
> +
> + osaf_extended_name_lend(longDn, &dn);
> +
> + setupLongDn();
> +
> + safassert(saImmOmInitialize(&immHandle, NULL, &immVersion), SA_AIS_OK);
> +
> + safassert(saImmOmAccessorInitialize(immHandle, &accessorHandle),
> SA_AIS_OK);
> + rc = saImmOmAccessorGet_2(accessorHandle, &dn, NULL, &attributes);
> + if(rc == SA_AIS_OK) {
> + for(i=0; attributes[i]; i++) {
> + if(!strcmp(attributes[i]->attrName, "rdn") ||
> !strcmp(attributes[i]->attrName, "attr8")) {
> + assert(attributes[i]->attrValuesNumber > 0);
> +
> assert(strcmp(osaf_extended_name_borrow((SaNameT
> *)(attributes[i]->attrValues[0])), longDn) == 0);
> + score++;
> + }
> + }
> +
> + // Both SaNameT values are correct
> + assert(score == 2);
> + }
> + safassert(saImmOmAccessorFinalize(accessorHandle), SA_AIS_OK);
> +
> + safassert(saImmOmFinalize(immHandle), SA_AIS_OK);
> +
> + test_validate(rc, SA_AIS_OK);
> +
> + cleanLongDn();
> +}
> +
> +static void saImmOmLongDn_08(void) {
> + SaImmHandleT immHandle;
> + SaImmAdminOwnerHandleT ownerHandle;
> + SaImmAdminOwnerNameT ownerName = (SaImmAdminOwnerNameT)__FUNCTION__;
> + SaAisErrorT rc;
> + SaNameT dn;
> + const SaNameT *objects[2] = { &dn, NULL };
> +
> + osaf_extended_name_lend(longDn, &dn);
> +
> + setupLongDn();
> +
> + safassert(saImmOmInitialize(&immHandle, NULL, &immVersion), SA_AIS_OK);
> + safassert(saImmOmAdminOwnerInitialize(immHandle, ownerName, SA_TRUE,
> &ownerHandle), SA_AIS_OK);
> +
> + rc = saImmOmAdminOwnerSet(ownerHandle, objects, SA_IMM_ONE);
> +
> + safassert(saImmOmAdminOwnerFinalize(ownerHandle), SA_AIS_OK);
> + safassert(saImmOmFinalize(immHandle), SA_AIS_OK);
> +
> + test_validate(rc, SA_AIS_OK);
> +
> + cleanLongDn();
> +}
> +
> +
> +
> +void addOmLongDnTestCases() {
> + test_case_add(8, saImmOmLongDn_01, "SA_AIS_OK - saImmOmClassCreate_2
> with long DN as default value");
> + test_case_add(8, saImmOmLongDn_02, "SA_AIS_OK -
> saImmOmClassDescriptionGet_2 with long DN as default value");
> + test_case_add(8, saImmOmLongDn_03, "SA_AIS_OK -
> saImmOmCcbObjectCreate_2 - long RDN");
> + test_case_add(8, saImmOmLongDn_04, "SA_AIS_OK -
> saImmOmCcbObjectModify_2 - long DN");
> + test_case_add(8, saImmOmLongDn_05, "SA_AIS_OK - saImmOmCcbObjectDelete
> - long DN");
> + test_case_add(8, saImmOmLongDn_06, "SA_AIS_OK -
> saImmOmSearchInitialize_2 and saImmOmSearchNext_2");
> + test_case_add(8, saImmOmLongDn_07, "SA_AIS_OK - saImmOmAccessorGet_2");
> + test_case_add(8, saImmOmLongDn_08, "SA_AIS_OK - saImmOmAdminOwnerSet");
> +}
> +
> +__attribute__ ((constructor)) static void saImmOmLongDn_constructor(void)
> +{
> + test_suite_add(8, "Long DN");
> +}
> +
> +
> +
> +
>
> ------------------------------------------------------------------------------
> Want fast and easy access to all the code in your enterprise? Index and
> search up to 200,000 lines of code with a free copy of Black Duck®
> Code Sight™ - the same software that powers the world's largest code
> search on Ohloh, the Black Duck Open Hub! Try it now.
> http://p.sf.net/sfu/bds
> _______________________________________________
> Opensaf-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/opensaf-devel
>
------------------------------------------------------------------------------
Want fast and easy access to all the code in your enterprise? Index and
search up to 200,000 lines of code with a free copy of Black Duck
Code Sight - the same software that powers the world's largest code
search on Ohloh, the Black Duck Open Hub! Try it now.
http://p.sf.net/sfu/bds
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel