tests/clmsv/Makefile.am      |    4 +-
 tests/clmsv/tet_ClmLongRdn.c |  480 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 483 insertions(+), 1 deletions(-)


The patch contains tests for testing long RDN support in CLM.
Long DN allowed must be allowed in IMM to pass new CLM tests. Otherwise, all 
tests will be skipped.
A test node with CLM node name 
"safNode=PL-123456789012345678901234567890123456789012345678901234567890,safCluster=myClmCluster"
must be added to the cluster to pass all tests, otherwise tests that use the 
test node will be skipped.

diff --git a/tests/clmsv/Makefile.am b/tests/clmsv/Makefile.am
--- a/tests/clmsv/Makefile.am
+++ b/tests/clmsv/Makefile.am
@@ -41,9 +41,11 @@ clmtest_SOURCES = \
        tet_ClmOiOps.c \
        tet_saClmDispatch.c \
        tet_saClmSelectionObjectGet.c \
-       tet_saClmFinalize.c
+       tet_saClmFinalize.c \
+       tet_ClmLongRdn.c
 
 clmtest_LDADD = \
        $(top_builddir)/osaf/libs/saf/libSaClm/libSaClm.la \
+       $(top_builddir)/osaf/libs/saf/libSaImm/libSaImmOm.la \
        $(top_builddir)/osaf/libs/core/libopensaf_core.la \
        $(top_builddir)/tests/unit_test_fw/src/libutest.la
diff --git a/tests/clmsv/tet_ClmLongRdn.c b/tests/clmsv/tet_ClmLongRdn.c
new file mode 100644
--- /dev/null
+++ b/tests/clmsv/tet_ClmLongRdn.c
@@ -0,0 +1,480 @@
+/*      -*- OpenSAF  -*-
+ *
+ * (C) Copyright 2016 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 <sys/types.h>
+#include <sys/wait.h>
+#include <pthread.h>
+#include <saImm.h>
+#include <saImmOm.h>
+#include <saImmOi.h>
+#include <saAis.h>
+#include "clmtest.h"
+
+
+static char *s_clmTrackCallback_node;                  // Node name that will 
be compared in clmTrackCallback callback
+static SaAisErrorT s_clmTrackCallback_err;     // Error code from 
clmTrackCallback callback
+static int s_existTestNode;                                    // 0 = not 
tested, -1 = doesn't exist, 1 = exists
+static int s_longDnAllowed;                                    // 0 = not 
tested, -1 = not allowed, 1 = allowed
+static char *s_testNodeName = "safNode=PL-123456789012345678901234567890"
+               "123456789012345678901234567890,safCluster=myClmCluster";
+
+static int testNodeExist() {
+       SaAisErrorT rc;
+       SaImmHandleT immHandle;
+       SaImmAccessorHandleT accessorHandle;
+       SaVersionT version = { 'A', 2, 15 };
+       const SaImmAttrNameT attributeNames[1] = { NULL };
+
+       if(s_existTestNode) {
+               return s_existTestNode;
+       }
+
+       safassert(saImmOmInitialize(&immHandle, NULL, &version), SA_AIS_OK);
+       safassert(saImmOmAccessorInitialize(immHandle, &accessorHandle), 
SA_AIS_OK);
+
+       rc = saImmOmAccessorGet_o3(accessorHandle, s_testNodeName, 
attributeNames, NULL);
+       assert(rc == SA_AIS_OK || rc == SA_AIS_ERR_NOT_EXIST);
+       if(rc == SA_AIS_ERR_NOT_EXIST) {
+               s_existTestNode = -1;
+       } else if(rc == SA_AIS_OK) {
+               s_existTestNode = 1;
+       }
+
+       saImmOmAccessorFinalize(accessorHandle);
+       saImmOmFinalize(immHandle);
+
+       return s_existTestNode;
+}
+
+static SaClmNodeIdT getClmNodeId(char *nodeName) {
+       SaImmHandleT immHandle;
+       SaImmAccessorHandleT accessorHandle;
+       SaVersionT version = { 'A', 2, 15 };
+       SaImmAttrNameT attrNodeId = "saClmNodeID";
+       SaImmAttrNameT attrNames[2] = { attrNodeId, NULL };
+       SaImmAttrValuesT_2 **attributes = NULL;
+       SaClmNodeIdT ret = 0;
+       int i;
+
+       safassert(saImmOmInitialize(&immHandle, NULL, &version), SA_AIS_OK);
+       safassert(saImmOmAccessorInitialize(immHandle, &accessorHandle), 
SA_AIS_OK);
+       safassert(saImmOmAccessorGet_o3(accessorHandle, 
(SaConstStringT)nodeName, attrNames, &attributes), SA_AIS_OK);
+
+       for(i=0; attributes[i]; ++i) {
+               if(!strcmp(attrNodeId, attributes[i]->attrName)
+                               && attributes[i]->attrValuesNumber == 1
+                               && attributes[i]->attrValueType == 
SA_IMM_ATTR_SAUINT32T) {
+                       ret = *(SaClmNodeIdT *)attributes[i]->attrValues[0];
+                       break;
+               }
+       }
+
+       saImmOmAccessorFinalize(accessorHandle);
+       saImmOmFinalize(immHandle);
+
+       return ret;
+}
+
+static SaClmNodeIdT isLongDNAllowed() {
+       SaImmHandleT immHandle;
+       SaImmAccessorHandleT accessorHandle;
+       SaVersionT version = { 'A', 2, 15 };
+       SaImmAttrNameT attrName = "longDnsAllowed";
+       SaImmAttrNameT attrNames[2] = { attrName, NULL };
+       SaImmAttrValuesT_2 **attributes = NULL;
+       SaConstStringT immObjectName = 
"opensafImm=opensafImm,safApp=safImmService";
+       int i;
+
+       if(s_longDnAllowed) {
+               return s_longDnAllowed;
+       }
+
+       safassert(saImmOmInitialize(&immHandle, NULL, &version), SA_AIS_OK);
+       safassert(saImmOmAccessorInitialize(immHandle, &accessorHandle), 
SA_AIS_OK);
+       safassert(saImmOmAccessorGet_o3(accessorHandle, immObjectName, 
attrNames, &attributes), SA_AIS_OK);
+
+       for(i=0; attributes[i]; ++i) {
+               if(!strcmp(attrName, attributes[i]->attrName)
+                               && attributes[i]->attrValuesNumber == 1
+                               && attributes[i]->attrValueType == 
SA_IMM_ATTR_SAUINT32T) {
+                       s_longDnAllowed = *(SaClmNodeIdT 
*)attributes[i]->attrValues[0];
+                       break;
+               }
+       }
+
+       saImmOmAccessorFinalize(accessorHandle);
+       saImmOmFinalize(immHandle);
+
+       return s_longDnAllowed;
+}
+
+static void skipTest(void) {
+       printf("       SKIPPED");
+}
+
+static void nodeGetCallBack(SaInvocationT invocation,
+               const SaClmClusterNodeT *clusterNode,
+               SaAisErrorT error) {
+}
+
+static void nodeGetCallBack4(SaInvocationT invocation,
+               const SaClmClusterNodeT_4 *clusterNode,
+               SaAisErrorT error) {
+}
+
+static void clmTrackCallback(const SaClmClusterNotificationBufferT 
*notificationBuffer,
+                       SaUint32T numberOfMembers,
+                       SaAisErrorT error)
+{
+       SaUint32T i;
+       char nodename[1024];
+
+       for(i=0;i<notificationBuffer->numberOfItems;i++){
+               memcpy(nodename,
+                               
notificationBuffer->notification[i].clusterNode.nodeName.value,
+                               
notificationBuffer->notification[i].clusterNode.nodeName.length);
+               
nodename[notificationBuffer->notification[i].clusterNode.nodeName.length] = 0;
+
+               // Found node name
+               if(!strcmp(nodename, s_clmTrackCallback_node)) {
+                       s_clmTrackCallback_err = SA_AIS_OK;
+                       break;
+               }
+       }
+}
+
+
+static void clmTrackCallback4(const SaClmClusterNotificationBufferT_4 
*notificationBuffer,
+               SaUint32T numberOfMembers,
+               SaInvocationT invocation,
+               const SaNameT *rootCauseEntity,
+               const SaNtfCorrelationIdsT *correlationIds,
+               SaClmChangeStepT step,
+               SaTimeT timeSupervision,
+               SaAisErrorT error)
+{
+       SaUint32T i;
+       char nodename[1024];
+
+       for(i=0;i<notificationBuffer->numberOfItems;i++){
+               memcpy(nodename,
+                               
notificationBuffer->notification[i].clusterNode.nodeName.value,
+                               
notificationBuffer->notification[i].clusterNode.nodeName.length);
+               
nodename[notificationBuffer->notification[i].clusterNode.nodeName.length] = 0;
+
+               // Found node name
+               if(!strcmp(nodename, s_clmTrackCallback_node)) {
+                       s_clmTrackCallback_err = SA_AIS_OK;
+                       break;
+               }
+       }
+}
+
+static SaClmCallbacksT_4 clmCallback4 = { nodeGetCallBack4, clmTrackCallback4 
};
+static SaClmCallbacksT clmCallback = { nodeGetCallBack, clmTrackCallback };
+
+static void unlock_node(char *nodename) {
+       char command[1024];
+
+       // Unlock the node
+       sprintf(command, "immadm -o 1 %s", nodename);
+       system(command);
+}
+
+static void lock_node(char *nodename) {
+       char command[1024];
+
+       // Lock the node
+       sprintf(command, "immadm -o 2 %s", nodename);
+       system(command);
+}
+
+static void remove_node(char *nodename) {
+       int rc;
+       char command[1024];
+
+       // Lock the node
+       sprintf(command, "immadm -o 2 %s", nodename);
+       system(command);
+
+       // Remove the node
+       sprintf(command, "immcfg -d %s", nodename);
+       assert((rc = system(command)) != -1);
+}
+
+static void saClmLongRdn_01(void) {
+       SaImmHandleT immHandle;
+       SaImmAdminOwnerHandleT ownerHandle;
+       SaImmCcbHandleT ccbHandle;
+       SaImmAdminOwnerNameT ownerName = (SaImmAdminOwnerNameT)__FUNCTION__;
+       SaConstStringT parent = "safCluster=myClmCluster";
+       SaConstStringT parentNames[] = { parent, NULL };
+       // hostname is 63 character long
+       SaConstStringT nodeName = 
"safNode=PL-ABCDEFGHIJ12345678901234567890123456789012345678901234567890,safCluster=myClmCluster";
+       SaVersionT version = { 'A', 2, 15 };
+       int rc;
+
+       if(isLongDNAllowed() != 1) {
+               skipTest();
+               return;
+       }
+
+       safassert(saImmOmInitialize(&immHandle, NULL, &version), SA_AIS_OK);
+       safassert(saImmOmAdminOwnerInitialize(immHandle, ownerName, SA_TRUE, 
&ownerHandle), SA_AIS_OK);
+       safassert(saImmOmAdminOwnerSet_o3(ownerHandle, parentNames, 
SA_IMM_ONE), SA_AIS_OK);
+       safassert(saImmOmCcbInitialize(ownerHandle, 0, &ccbHandle), SA_AIS_OK);
+
+       // Create a node with long RDN
+       safassert(saImmOmCcbObjectCreate_o3(ccbHandle, "SaClmNode", nodeName, 
NULL), SA_AIS_OK);
+
+       rc = saImmOmCcbApply(ccbHandle);
+       test_validate(rc, SA_AIS_OK);
+
+       saImmOmCcbFinalize(ccbHandle);
+       saImmOmAdminOwnerFinalize(ownerHandle);
+       saImmOmFinalize(immHandle);
+
+       // Remove new created node
+       remove_node((char *)nodeName);
+}
+
+void saClmLongRdn_02(void) {
+       struct pollfd fds[1];
+       int rc;
+       char *nodeName = s_testNodeName;
+       SaUint8T trackFlags = SA_TRACK_CHANGES;
+
+       if(isLongDNAllowed() != 1) {
+               skipTest();
+               return;
+       }
+
+       // Test node does not exist. Skip the test
+       if(testNodeExist() != 1) {
+               skipTest();
+               return;
+       }
+
+       safassert(saClmInitialize_4(&clmHandle, &clmCallback4, &clmVersion_4), 
SA_AIS_OK);
+       safassert(saClmSelectionObjectGet(clmHandle, 
&selectionObject),SA_AIS_OK);
+       rc = saClmClusterTrack_4(clmHandle, trackFlags, NULL);
+       if(rc != SA_AIS_OK) {
+               safassert(saClmFinalize(clmHandle), SA_AIS_OK);
+               // Failed at saClmClusterTrack_4
+               test_validate(rc, SA_AIS_OK);
+               return;
+       }
+
+       fds[0].fd = (int) selectionObject;
+       fds[0].events = POLLIN;
+
+       // Set failed error code
+       s_clmTrackCallback_err = 0;
+       // Set node name that will be compared in CLM callback
+       s_clmTrackCallback_node = nodeName;
+
+       lock_node(nodeName);
+
+       while (1){
+               rc = poll(fds, 1, 2000);
+               assert(rc == 1);
+               if (fds[0].revents & POLLIN)
+                       break;
+       }
+
+       safassert(saClmDispatch(clmHandle, SA_DISPATCH_ALL), SA_AIS_OK);
+       safassert(saClmClusterTrackStop(clmHandle), SA_AIS_OK);
+       safassert(saClmFinalize(clmHandle), SA_AIS_OK);
+       test_validate(s_clmTrackCallback_err, SA_AIS_OK);
+
+       unlock_node(nodeName);
+}
+
+void saClmLongRdn_03(void) {
+       struct pollfd fds[1];
+       int rc;
+       char *nodeName = s_testNodeName;
+       SaUint8T trackFlags = SA_TRACK_CHANGES;
+
+       if(isLongDNAllowed() != 1) {
+               skipTest();
+               return;
+       }
+
+       // Test node does not exist. Skip the test
+       if(testNodeExist() != 1) {
+               skipTest();
+               return;
+       }
+
+       safassert(saClmInitialize(&clmHandle, &clmCallback, &clmVersion_1), 
SA_AIS_OK);
+       safassert(saClmSelectionObjectGet(clmHandle, 
&selectionObject),SA_AIS_OK);
+       rc = saClmClusterTrack(clmHandle, trackFlags, NULL);
+       if(rc != SA_AIS_OK) {
+               safassert(saClmFinalize(clmHandle), SA_AIS_OK);
+               // Failed at saClmClusterTrack
+               test_validate(rc, SA_AIS_OK);
+               return;
+       }
+
+       fds[0].fd = (int) selectionObject;
+       fds[0].events = POLLIN;
+
+       // Set failed error code
+       s_clmTrackCallback_err = 0;
+       // Set node name that will be compared in CLM callback
+       s_clmTrackCallback_node = nodeName;
+
+       lock_node(nodeName);
+
+       while (1){
+               rc = poll(fds, 1, 2000);
+               assert(rc == 1);
+               if (fds[0].revents & POLLIN)
+                       break;
+       }
+
+       safassert(saClmDispatch(clmHandle, SA_DISPATCH_ALL), SA_AIS_OK);
+       safassert(saClmClusterTrackStop(clmHandle), SA_AIS_OK);
+       safassert(saClmFinalize(clmHandle), SA_AIS_OK);
+       test_validate(s_clmTrackCallback_err, SA_AIS_OK);
+
+       unlock_node(nodeName);
+}
+
+void saClmLongRdn_04(void) {
+       SaImmHandleT immHandle;
+       SaImmAdminOwnerHandleT ownerHandle;
+       SaImmCcbHandleT ccbHandle;
+       SaImmAdminOwnerNameT ownerName = (SaImmAdminOwnerNameT)__FUNCTION__;
+       int rc;
+       SaConstStringT parent = "safCluster=myClmCluster";
+       SaConstStringT parentNames[] = { parent, NULL };
+       SaVersionT version = { 'A', 2, 15 };
+       // Length of nodeName == 256
+       char *nodeName = 
"safNode=PL-123456789012345678901234567890123456789012345678901234567890"
+                       
"123456789012345678901234567890123456789012345678901234567890"
+                       
"123456789012345678901234567890123456789012345678901234567890"
+                       
"12345678901234567890123456789012345678901,safCluster=myClmCluster";
+
+       if(isLongDNAllowed() != 1) {
+               skipTest();
+               return;
+       }
+
+       // Create a test node
+       safassert(saImmOmInitialize(&immHandle, NULL, &version), SA_AIS_OK);
+       safassert(saImmOmAdminOwnerInitialize(immHandle, ownerName, SA_TRUE, 
&ownerHandle), SA_AIS_OK);
+       safassert(saImmOmAdminOwnerSet_o3(ownerHandle, parentNames, 
SA_IMM_ONE), SA_AIS_OK);
+       safassert(saImmOmCcbInitialize(ownerHandle, 0, &ccbHandle), SA_AIS_OK);
+
+       // Create a node with long RDN
+       // If long DN is enabled on client side, ccbObjectCreate will return 
SA_AIS_ERR_FAILED_OPERATION
+       // Otherwise ccbObjectCreate will return SA_AIS_ERR_INVALID_PARAM
+       rc = saImmOmCcbObjectCreate_o3(ccbHandle, "SaClmNode", nodeName, NULL);
+       if(rc == SA_AIS_ERR_INVALID_PARAM) {
+               test_validate(rc, SA_AIS_ERR_INVALID_PARAM);
+       } else {
+               test_validate(rc, SA_AIS_ERR_FAILED_OPERATION);
+       }
+
+       saImmOmCcbFinalize(ccbHandle);
+       saImmOmAdminOwnerFinalize(ownerHandle);
+       saImmOmFinalize(immHandle);
+}
+
+void saClmLongRdn_05(void) {
+       int rc;
+       char *nodeName = s_testNodeName;
+       SaClmNodeIdT nodeId;
+       SaClmClusterNodeT_4 clusterNode;
+
+       if(isLongDNAllowed() != 1) {
+               skipTest();
+               return;
+       }
+
+       // Test node does not exist. Skip the test
+       if(testNodeExist() != 1) {
+               skipTest();
+               return;
+       }
+
+       nodeId = getClmNodeId(nodeName);
+       assert(nodeId != 0);
+
+       safassert(saClmInitialize_4(&clmHandle, NULL, &clmVersion_4), 
SA_AIS_OK);
+
+       rc = saClmClusterNodeGet_4(clmHandle, nodeId, 10000000000ll, 
&clusterNode);
+
+       // SaNameT value cannot be longer than 255, so we don't need to use 
saAisNameBorrow
+       if(strcmp((char *)clusterNode.nodeName.value, nodeName)) {
+               printf(" (node name is not the same) ");
+               rc = SA_AIS_ERR_FAILED_OPERATION;
+       }
+
+       test_validate(rc, SA_AIS_OK);
+
+       saClmFinalize(clmHandle);
+}
+
+void saClmLongRdn_06(void) {
+       int rc;
+       char *nodeName = s_testNodeName;
+       SaClmNodeIdT nodeId;
+       SaClmClusterNodeT clusterNode;
+
+       if(isLongDNAllowed() != 1) {
+               skipTest();
+               return;
+       }
+
+       // Test node does not exist. Skip the test
+       if(testNodeExist() != 1) {
+               skipTest();
+               return;
+       }
+
+       nodeId = getClmNodeId(nodeName);
+       assert(nodeId != 0);
+
+       safassert(saClmInitialize(&clmHandle, NULL, &clmVersion_1), SA_AIS_OK);
+
+       rc = saClmClusterNodeGet(clmHandle, nodeId, 10000000000ll, 
&clusterNode);
+
+       // SaNameT value cannot be longer than 255, so we don't need to use 
saAisNameBorrow
+       if(strcmp((char *)clusterNode.nodeName.value, nodeName)) {
+               printf(" (node name is not the same) ");
+               rc = SA_AIS_ERR_FAILED_OPERATION;
+       }
+
+       test_validate(rc, SA_AIS_OK);
+
+       saClmFinalize(clmHandle);
+}
+
+__attribute__ ((constructor)) static void saClmLongRdn_constructor(void)
+{
+       test_suite_add(11, "CLM Long RDN (long DN support must be allowed)");
+       test_case_add(11, saClmLongRdn_01, "SA_AIS_OK - Create CLM node with 
long RDN");
+       test_case_add(11, saClmLongRdn_02, "SA_AIS_OK - saClmClusterTrack_4 and 
callback with long RDN");
+       test_case_add(11, saClmLongRdn_03, "SA_AIS_OK - saClmClusterTrack and 
callback with long RDN");
+       test_case_add(11, saClmLongRdn_04, "SA_AIS_ERR_INVALID_PARAM or 
SA_AIS_ERR_FAILED_OPERATION - Long DN is not supported");
+       test_case_add(11, saClmLongRdn_05, "SA_AIS_OK - saClmClusterNodeGet_4 
with long DN");
+       test_case_add(11, saClmLongRdn_06, "SA_AIS_OK - saClmClusterNodeGet 
with long DN");
+}
+

------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to