Hi Hung,

Ack from me.

Best regards,
Zoran

-----Original Message-----
From: Hung Nguyen [mailto:[email protected]] 
Sent: Tuesday, September 22, 2015 7:06 PM
To: Anders Björnerstedt; Zoran Milinkovic; [email protected]
Cc: [email protected]
Subject: [PATCH 4 of 4] imm: Add test cases for strong default [#1425]

 tests/immsv/implementer/test_saImmOiRtObjectCreate_2.c |    6 +
 tests/immsv/implementer/test_saImmOiRtObjectUpdate_2.c |  173 +++++++++++++++++
 tests/immsv/management/test_saImmOmCcbInitialize.c     |    6 +
 tests/immsv/management/test_saImmOmCcbObjectModify_2.c |  173 +++++++++++++++++
 tests/immsv/management/test_saImmOmClassCreate_2.c     |  134 +++++++++++++
 5 files changed, 492 insertions(+), 0 deletions(-)


Add test cases for strong default.

diff --git a/tests/immsv/implementer/test_saImmOiRtObjectCreate_2.c 
b/tests/immsv/implementer/test_saImmOiRtObjectCreate_2.c
--- a/tests/immsv/implementer/test_saImmOiRtObjectCreate_2.c
+++ b/tests/immsv/implementer/test_saImmOiRtObjectCreate_2.c
@@ -204,6 +204,9 @@ extern void saImmOiRtObjectUpdate_2_03(v  extern void 
saImmOiRtObjectUpdate_2_04(void);  extern void 
saImmOiRtObjectUpdate_2_05(void);  extern void saImmOiRtObjectUpdate_2_06(void);
+extern void saImmOiRtObjectUpdate_2_07(void); extern void 
+saImmOiRtObjectUpdate_2_08(void);
+extern void saImmOiRtObjectUpdate_2_09(void);
 extern void SaImmOiRtAttrUpdateCallbackT_01(void);
 
 __attribute__ ((constructor)) static void 
saImmOiRtObjectCreate_2_constructor(void)
@@ -232,6 +235,9 @@ extern void SaImmOiRtAttrUpdateCallbackT
     test_case_add(3, saImmOiRtObjectUpdate_2_04, "saImmOiRtObjectUpdate_2 - 
SA_AIS_ERR_BAD_OPERATION - update object not owned by implementer");
     test_case_add(3, saImmOiRtObjectUpdate_2_05, "saImmOiRtObjectUpdate_2 - 
SA_AIS_ERR_INVALID_PARAM - new value for the RDN attr");
     test_case_add(3, saImmOiRtObjectUpdate_2_06, "saImmOiRtObjectUpdate_2 - 
SA_AIS_ERR_INVALID_PARAM - update configuration attribute");
+    test_case_add(3, saImmOiRtObjectUpdate_2_07, "saImmOiRtObjectUpdate_2 - 
STRONG_DEFAULT, Set value of runtime attribute to NULL");
+    test_case_add(3, saImmOiRtObjectUpdate_2_08, "saImmOiRtObjectUpdate_2 - 
STRONG_DEFAULT, Set value of multi-valued runtime attribute to NULL");
+    test_case_add(3, saImmOiRtObjectUpdate_2_09, 
+ "saImmOiRtObjectUpdate_2 - STRONG_DEFAULT, Delete all values of 
+ multi-valued runtime attribute");
 
     test_case_add(3, SaImmOiRtAttrUpdateCallbackT_01, 
"SaImmOiRtAttrUpdateCallbackT - SA_AIS_OK");  } diff --git 
a/tests/immsv/implementer/test_saImmOiRtObjectUpdate_2.c 
b/tests/immsv/implementer/test_saImmOiRtObjectUpdate_2.c
--- a/tests/immsv/implementer/test_saImmOiRtObjectUpdate_2.c
+++ b/tests/immsv/implementer/test_saImmOiRtObjectUpdate_2.c
@@ -214,3 +214,176 @@ void saImmOiRtObjectUpdate_2_06(void)
     safassert(saImmOmCcbFinalize(ccbHandle), SA_AIS_OK);
     safassert(saImmOmFinalize(immOmHandle), SA_AIS_OK);  }
+
+void saImmOiRtObjectUpdate_2_07(void) {
+    /*
+     * STRONG_DEFAULT, Set value of runtime attribute to NULL
+     */
+
+    /* Create class */
+    safassert(saImmOmInitialize(&immOmHandle, &immOmCallbacks, &immVersion), 
SA_AIS_OK);
+    const SaImmClassNameT className = (SaImmClassNameT) __FUNCTION__;
+    SaImmAttrDefinitionT_2 rdn =
+        {"rdn", SA_IMM_ATTR_SANAMET, SA_IMM_ATTR_RUNTIME | SA_IMM_ATTR_CACHED 
| SA_IMM_ATTR_RDN, NULL};
+    SaUint32T defaultVal = 100;
+    SaImmAttrDefinitionT_2 attr =
+        {"attr", SA_IMM_ATTR_SAUINT32T,
+            SA_IMM_ATTR_RUNTIME | SA_IMM_ATTR_CACHED | 
SA_IMM_ATTR_STRONG_DEFAULT, &defaultVal};
+    const SaImmAttrDefinitionT_2 *attrDefinitions[] = {&rdn, &attr, NULL};
+    safassert(saImmOmClassCreate_2(immOmHandle, className, 
+ SA_IMM_CLASS_RUNTIME, attrDefinitions), SA_AIS_OK);
+
+    /* Create object */
+    SaImmOiImplementerNameT implementerName = (SaImmOiImplementerNameT) 
__FUNCTION__;
+    SaNameT obj = { strlen("id=1"), "id=1" };
+    SaImmAttrValueT nameValue = &obj;
+    SaImmAttrValuesT_2 rdnValue = {"rdn",  SA_IMM_ATTR_SANAMET, 1, &nameValue};
+    SaUint32T val = 200;
+    SaImmAttrValueT valArray = &val;
+    SaImmAttrValuesT_2 createValue= { "attr", SA_IMM_ATTR_SAUINT32T, 1, 
&valArray };
+    const SaImmAttrValuesT_2 * attrValues[] = {&rdnValue, &createValue, NULL};
+    safassert(saImmOiInitialize_2(&immOiHandle, &immOiCallbacks, &immVersion), 
SA_AIS_OK);
+    safassert(saImmOiImplementerSet(immOiHandle, implementerName), SA_AIS_OK);
+    safassert(saImmOiRtObjectCreate_2(immOiHandle, className, NULL, 
+ attrValues), SA_AIS_OK);
+
+    /* Set the strong default attribute to NULL */
+    SaImmAttrValuesT_2 value = { "attr", SA_IMM_ATTR_SAUINT32T, 0, NULL };
+    SaImmAttrModificationT_2 attrMod = { SA_IMM_ATTR_VALUES_REPLACE, value };
+    const SaImmAttrModificationT_2 *attrMods[] = { &attrMod, NULL };
+    safassert(saImmOiRtObjectUpdate_2(immOiHandle, &obj, attrMods), 
+ SA_AIS_OK);
+
+    /* Check value of the attribute */
+    SaImmAccessorHandleT accessorHandle;
+    const SaImmAttrNameT attName = "attr";
+    SaImmAttrNameT attNames[] = {attName, NULL};
+    SaImmAttrValuesT_2 ** resultAttrs;
+    safassert(saImmOmAccessorInitialize(immOmHandle, &accessorHandle), 
SA_AIS_OK);
+    safassert(saImmOmAccessorGet_2(accessorHandle, &obj, attNames, 
&resultAttrs), SA_AIS_OK);
+    assert(resultAttrs[0] && (resultAttrs[0]->attrValueType == 
SA_IMM_ATTR_SAUINT32T));
+    assert(resultAttrs[0]->attrValuesNumber == 1);
+    test_validate(*((SaUint32T *) resultAttrs[0]->attrValues[0]), 
+ defaultVal);
+
+    /* Delete Object */
+    safassert(saImmOiRtObjectDelete(immOiHandle, &obj), SA_AIS_OK);
+    safassert(saImmOiImplementerClear(immOiHandle), SA_AIS_OK);
+    safassert(saImmOiFinalize(immOiHandle), SA_AIS_OK);
+
+    /* Delete class */
+    safassert(saImmOmClassDelete(immOmHandle, className), SA_AIS_OK);
+    safassert(saImmOmFinalize(immOmHandle), SA_AIS_OK); }
+
+void saImmOiRtObjectUpdate_2_08(void) {
+    /*
+     * STRONG_DEFAULT, Set value of multi-valued runtime attribute to NULL
+     */
+
+    /* Create class */
+    safassert(saImmOmInitialize(&immOmHandle, &immOmCallbacks, &immVersion), 
SA_AIS_OK);
+    const SaImmClassNameT className = (SaImmClassNameT) __FUNCTION__;
+    SaImmAttrDefinitionT_2 rdn =
+        {"rdn", SA_IMM_ATTR_SANAMET, SA_IMM_ATTR_RUNTIME | SA_IMM_ATTR_CACHED 
| SA_IMM_ATTR_RDN, NULL};
+    SaUint32T defaultVal = 100;
+    SaImmAttrDefinitionT_2 attr =
+        {"attr", SA_IMM_ATTR_SAUINT32T,
+            SA_IMM_ATTR_RUNTIME | SA_IMM_ATTR_CACHED | 
SA_IMM_ATTR_STRONG_DEFAULT | SA_IMM_ATTR_MULTI_VALUE, &defaultVal};
+    const SaImmAttrDefinitionT_2 *attrDefinitions[] = {&rdn, &attr, NULL};
+    safassert(saImmOmClassCreate_2(immOmHandle, className, 
+ SA_IMM_CLASS_RUNTIME, attrDefinitions), SA_AIS_OK);
+
+    /* Create object */
+    SaImmOiImplementerNameT implementerName = (SaImmOiImplementerNameT) 
__FUNCTION__;
+    SaNameT obj = { strlen("id=1"), "id=1" };
+    SaImmAttrValueT nameValue = &obj;
+    SaImmAttrValuesT_2 rdnValue = {"rdn",  SA_IMM_ATTR_SANAMET, 1, &nameValue};
+    SaUint32T val1 = 200;
+    SaUint32T val2 = 300;
+    SaImmAttrValueT valArray[] = {&val1, &val2};
+    SaImmAttrValuesT_2 createValue= { "attr", SA_IMM_ATTR_SAUINT32T, 2, 
valArray };
+    const SaImmAttrValuesT_2 * attrValues[] = {&rdnValue, &createValue, NULL};
+    safassert(saImmOiInitialize_2(&immOiHandle, &immOiCallbacks, &immVersion), 
SA_AIS_OK);
+    safassert(saImmOiImplementerSet(immOiHandle, implementerName), SA_AIS_OK);
+    safassert(saImmOiRtObjectCreate_2(immOiHandle, className, NULL, 
+ attrValues), SA_AIS_OK);
+
+    /* Set the strong default attribute to NULL */
+    SaImmAttrValuesT_2 value = { "attr", SA_IMM_ATTR_SAUINT32T, 0, NULL };
+    SaImmAttrModificationT_2 attrMod = { SA_IMM_ATTR_VALUES_REPLACE, value };
+    const SaImmAttrModificationT_2 *attrMods[] = { &attrMod, NULL };
+    safassert(saImmOiRtObjectUpdate_2(immOiHandle, &obj, attrMods), 
+ SA_AIS_OK);
+
+    /* Check value of the attribute */
+    SaImmAccessorHandleT accessorHandle;
+    const SaImmAttrNameT attName = "attr";
+    SaImmAttrNameT attNames[] = {attName, NULL};
+    SaImmAttrValuesT_2 ** resultAttrs;
+    safassert(saImmOmAccessorInitialize(immOmHandle, &accessorHandle), 
SA_AIS_OK);
+    safassert(saImmOmAccessorGet_2(accessorHandle, &obj, attNames, 
&resultAttrs), SA_AIS_OK);
+    assert(resultAttrs[0] && (resultAttrs[0]->attrValueType == 
SA_IMM_ATTR_SAUINT32T));
+    assert(resultAttrs[0]->attrValuesNumber == 1);
+    test_validate(*((SaUint32T *) resultAttrs[0]->attrValues[0]), 
+ defaultVal);
+
+    /* Delete Object */
+    safassert(saImmOiRtObjectDelete(immOiHandle, &obj), SA_AIS_OK);
+    safassert(saImmOiImplementerClear(immOiHandle), SA_AIS_OK);
+    safassert(saImmOiFinalize(immOiHandle), SA_AIS_OK);
+
+    /* Delete class */
+    safassert(saImmOmClassDelete(immOmHandle, className), SA_AIS_OK);
+    safassert(saImmOmFinalize(immOmHandle), SA_AIS_OK); }
+
+void saImmOiRtObjectUpdate_2_09(void) {
+    /*
+     * STRONG_DEFAULT, Delete all values of multi-valued runtime attribute
+     */
+
+    /* Create class */
+    safassert(saImmOmInitialize(&immOmHandle, &immOmCallbacks, &immVersion), 
SA_AIS_OK);
+    const SaImmClassNameT className = (SaImmClassNameT) __FUNCTION__;
+    SaImmAttrDefinitionT_2 rdn =
+        {"rdn", SA_IMM_ATTR_SANAMET, SA_IMM_ATTR_RUNTIME | SA_IMM_ATTR_CACHED 
| SA_IMM_ATTR_RDN, NULL};
+    SaUint32T defaultVal = 100;
+    SaImmAttrDefinitionT_2 attr =
+        {"attr", SA_IMM_ATTR_SAUINT32T,
+            SA_IMM_ATTR_RUNTIME | SA_IMM_ATTR_CACHED | 
SA_IMM_ATTR_STRONG_DEFAULT | SA_IMM_ATTR_MULTI_VALUE, &defaultVal};
+    const SaImmAttrDefinitionT_2 *attrDefinitions[] = {&rdn, &attr, NULL};
+    safassert(saImmOmClassCreate_2(immOmHandle, className, 
+ SA_IMM_CLASS_RUNTIME, attrDefinitions), SA_AIS_OK);
+
+    /* Create object */
+    SaImmOiImplementerNameT implementerName = (SaImmOiImplementerNameT) 
__FUNCTION__;
+    SaNameT obj = { strlen("id=1"), "id=1" };
+    SaImmAttrValueT nameValue = &obj;
+    SaImmAttrValuesT_2 rdnValue = {"rdn",  SA_IMM_ATTR_SANAMET, 1, &nameValue};
+    SaUint32T val1 = 200;
+    SaUint32T val2 = 300;
+    SaImmAttrValueT valArray[] = {&val1, &val2};
+    SaImmAttrValuesT_2 createValue= { "attr", SA_IMM_ATTR_SAUINT32T, 2, 
valArray };
+    const SaImmAttrValuesT_2 * attrValues[] = {&rdnValue, &createValue, NULL};
+    safassert(saImmOiInitialize_2(&immOiHandle, &immOiCallbacks, &immVersion), 
SA_AIS_OK);
+    safassert(saImmOiImplementerSet(immOiHandle, implementerName), SA_AIS_OK);
+    safassert(saImmOiRtObjectCreate_2(immOiHandle, className, NULL, 
+ attrValues), SA_AIS_OK);
+
+    /* Set the strong default attribute to NULL */
+    SaImmAttrValuesT_2 value = { "attr", SA_IMM_ATTR_SAUINT32T, 2, valArray };
+    SaImmAttrModificationT_2 attrMod = { SA_IMM_ATTR_VALUES_DELETE, value };
+    const SaImmAttrModificationT_2 *attrMods[] = { &attrMod, NULL };
+    safassert(saImmOiRtObjectUpdate_2(immOiHandle, &obj, attrMods), 
+ SA_AIS_OK);
+
+    /* Check value of the attribute */
+    SaImmAccessorHandleT accessorHandle;
+    const SaImmAttrNameT attName = "attr";
+    SaImmAttrNameT attNames[] = {attName, NULL};
+    SaImmAttrValuesT_2 ** resultAttrs;
+    safassert(saImmOmAccessorInitialize(immOmHandle, &accessorHandle), 
SA_AIS_OK);
+    safassert(saImmOmAccessorGet_2(accessorHandle, &obj, attNames, 
&resultAttrs), SA_AIS_OK);
+    assert(resultAttrs[0] && (resultAttrs[0]->attrValueType == 
SA_IMM_ATTR_SAUINT32T));
+    assert(resultAttrs[0]->attrValuesNumber == 1);
+    test_validate(*((SaUint32T *) resultAttrs[0]->attrValues[0]), 
+ defaultVal);
+
+    /* Delete Object */
+    safassert(saImmOiRtObjectDelete(immOiHandle, &obj), SA_AIS_OK);
+    safassert(saImmOiImplementerClear(immOiHandle), SA_AIS_OK);
+    safassert(saImmOiFinalize(immOiHandle), SA_AIS_OK);
+
+    /* Delete class */
+    safassert(saImmOmClassDelete(immOmHandle, className), SA_AIS_OK);
+    safassert(saImmOmFinalize(immOmHandle), SA_AIS_OK); }
diff --git a/tests/immsv/management/test_saImmOmCcbInitialize.c 
b/tests/immsv/management/test_saImmOmCcbInitialize.c
--- a/tests/immsv/management/test_saImmOmCcbInitialize.c
+++ b/tests/immsv/management/test_saImmOmCcbInitialize.c
@@ -165,6 +165,9 @@ extern void saImmOmCcbObjectModify_2_18(  extern void 
saImmOmCcbObjectModify_2_19(void);
 extern void saImmOmCcbObjectModify_2_20(void);
 extern void saImmOmCcbObjectModify_2_21(void);
+extern void saImmOmCcbObjectModify_2_22(void);
+extern void saImmOmCcbObjectModify_2_23(void);
+extern void saImmOmCcbObjectModify_2_24(void);
 extern void saImmOmCcbApply_01(void);
 extern void saImmOmCcbApply_02(void);
 extern void saImmOmCcbFinalize_01(void); @@ -238,6 +241,9 @@ extern void 
saImmOmCcbValidate_02(void);
     test_case_add(6, saImmOmCcbObjectModify_2_19, "saImmOmCcbObjectModify_2 - 
SA_AIS_ERR_BUSY, set NO_DANGLING reference to a deleted object by another CCB");
     test_case_add(6, saImmOmCcbObjectModify_2_20, "saImmOmCcbObjectModify_2 - 
SA_AIS_ERR_BUSY, set NO_DANGLING reference to a create object by another CCB");
     test_case_add(6, saImmOmCcbObjectModify_2_21, "saImmOmCcbObjectModify_2 - 
SA_AIS_OK, set NO_DANGLING reference to an object created in the same CCB");
+    test_case_add(6, saImmOmCcbObjectModify_2_22, "saImmOmCcbObjectModify_2 - 
STRONG_DEFAULT, Set value of attribute to NULL");
+    test_case_add(6, saImmOmCcbObjectModify_2_23, "saImmOmCcbObjectModify_2 - 
STRONG_DEFAULT, Set value of multi-valued attribute to NULL");
+    test_case_add(6, saImmOmCcbObjectModify_2_24, 
+ "saImmOmCcbObjectModify_2 - STRONG_DEFAULT, Delete all values of 
+ multi-valued attribute");
 
     test_case_add(6, saImmOmCcbApply_01, "saImmOmCcbApply - SA_AIS_OK");
     test_case_add(6, saImmOmCcbApply_02, "saImmOmCcbApply - 
SA_AIS_ERR_BAD_HANDLE"); diff --git 
a/tests/immsv/management/test_saImmOmCcbObjectModify_2.c 
b/tests/immsv/management/test_saImmOmCcbObjectModify_2.c
--- a/tests/immsv/management/test_saImmOmCcbObjectModify_2.c
+++ b/tests/immsv/management/test_saImmOmCcbObjectModify_2.c
@@ -851,6 +851,179 @@ void saImmOmCcbObjectModify_2_21(void)
     test_validate(rc, SA_AIS_OK);
 }
 
+void saImmOmCcbObjectModify_2_22(void) {
+    /*
+     * STRONG_DEFAULT, Set value of attribute to NULL
+     */
+
+    /* Create class */
+    safassert(saImmOmInitialize(&immOmHandle, &immOmCallbacks, &immVersion), 
SA_AIS_OK);
+    const SaImmClassNameT className = (SaImmClassNameT) __FUNCTION__;
+    SaImmAttrDefinitionT_2 rdn =
+        {"rdn", SA_IMM_ATTR_SANAMET, SA_IMM_ATTR_CONFIG | SA_IMM_ATTR_RDN, 
NULL};
+    SaUint32T defaultVal = 100;
+    SaImmAttrDefinitionT_2 attr =
+        {"attr", SA_IMM_ATTR_SAUINT32T,
+            SA_IMM_ATTR_CONFIG | SA_IMM_ATTR_WRITABLE | 
SA_IMM_ATTR_STRONG_DEFAULT, &defaultVal};
+    const SaImmAttrDefinitionT_2 *attrDefinitions[] = {&rdn, &attr, NULL};
+    safassert(saImmOmClassCreate_2(immOmHandle, className, 
+ SA_IMM_CLASS_CONFIG, attrDefinitions), SA_AIS_OK);
+
+    /* Create object */
+    const SaImmAdminOwnerNameT adminOwnerName = (SaImmAdminOwnerNameT) 
__FUNCTION__;
+    SaImmAdminOwnerHandleT ownerHandle;
+    const SaNameT obj = { strlen("id=1"), "id=1" };
+    SaUint32T val = 200;
+    SaImmAttrValueT valArray = &val;
+    SaImmAttrValuesT_2 createValue= { "attr", SA_IMM_ATTR_SAUINT32T, 1, 
&valArray };
+    safassert(saImmOmAdminOwnerInitialize(immOmHandle, adminOwnerName, 
SA_TRUE, &ownerHandle), SA_AIS_OK);
+    safassert(object_create(immOmHandle, ownerHandle, className, &obj, 
+ NULL, &createValue), SA_AIS_OK);
+
+    /* Set the strong default attribute to NULL */
+    SaImmCcbHandleT ccbHandle;
+    SaImmAttrValuesT_2 value = { "attr", SA_IMM_ATTR_SAUINT32T, 0, NULL };
+    SaImmAttrModificationT_2 attrMod = { SA_IMM_ATTR_VALUES_REPLACE, value };
+    const SaImmAttrModificationT_2 *attrMods[] = { &attrMod, NULL };
+    safassert(saImmOmCcbInitialize(ownerHandle, 0, &ccbHandle), SA_AIS_OK);
+    safassert(saImmOmCcbObjectModify_2(ccbHandle, &obj, attrMods), SA_AIS_OK);
+    safassert(saImmOmCcbApply(ccbHandle), SA_AIS_OK);
+    safassert(saImmOmCcbFinalize(ccbHandle), SA_AIS_OK);
+
+    /* Check value of the attribute */
+    SaImmAccessorHandleT accessorHandle;
+    const SaImmAttrNameT attName = "attr";
+    SaImmAttrNameT attNames[] = {attName, NULL};
+    SaImmAttrValuesT_2 ** resultAttrs;
+    safassert(saImmOmAccessorInitialize(immOmHandle, &accessorHandle), 
SA_AIS_OK);
+    safassert(saImmOmAccessorGet_2(accessorHandle, &obj, attNames, 
&resultAttrs), SA_AIS_OK);
+    assert(resultAttrs[0] && (resultAttrs[0]->attrValueType == 
SA_IMM_ATTR_SAUINT32T));
+    assert(resultAttrs[0]->attrValuesNumber == 1);
+    test_validate(*((SaUint32T *) resultAttrs[0]->attrValues[0]), 
+ defaultVal);
+
+    /* Delete object */
+    safassert(object_delete(ownerHandle, &obj, 1), SA_AIS_OK);
+    safassert(saImmOmAdminOwnerFinalize(ownerHandle), SA_AIS_OK);
+
+    /* Delete class */
+    safassert(saImmOmClassDelete(immOmHandle, className), SA_AIS_OK);
+    safassert(saImmOmFinalize(immOmHandle), SA_AIS_OK); }
+
+void saImmOmCcbObjectModify_2_23(void) {
+    /*
+     * STRONG_DEFAULT, Set value of multi-valued attribute to NULL
+     */
+
+    /* Create class */
+    safassert(saImmOmInitialize(&immOmHandle, &immOmCallbacks, &immVersion), 
SA_AIS_OK);
+    const SaImmClassNameT className = (SaImmClassNameT) __FUNCTION__;
+    SaImmAttrDefinitionT_2 rdn =
+        {"rdn", SA_IMM_ATTR_SANAMET, SA_IMM_ATTR_CONFIG | SA_IMM_ATTR_RDN, 
NULL};
+    SaUint32T defaultVal = 100;
+    SaImmAttrDefinitionT_2 attr =
+        {"attr", SA_IMM_ATTR_SAUINT32T,
+            SA_IMM_ATTR_CONFIG | SA_IMM_ATTR_WRITABLE | 
SA_IMM_ATTR_STRONG_DEFAULT | SA_IMM_ATTR_MULTI_VALUE, &defaultVal};
+    const SaImmAttrDefinitionT_2 *attrDefinitions[] = {&rdn, &attr, NULL};
+    safassert(saImmOmClassCreate_2(immOmHandle, className, 
+ SA_IMM_CLASS_CONFIG, attrDefinitions), SA_AIS_OK);
+
+    /* Create object */
+    const SaImmAdminOwnerNameT adminOwnerName = (SaImmAdminOwnerNameT) 
__FUNCTION__;
+    SaImmAdminOwnerHandleT ownerHandle;
+    const SaNameT obj = { strlen("id=1"), "id=1" };
+    SaUint32T val1 = 200;
+    SaUint32T val2 = 300;
+    SaImmAttrValueT valArray[] = {&val1, &val2};
+    SaImmAttrValuesT_2 createValue= { "attr", SA_IMM_ATTR_SAUINT32T, 2, 
valArray };
+    safassert(saImmOmAdminOwnerInitialize(immOmHandle, adminOwnerName, 
SA_TRUE, &ownerHandle), SA_AIS_OK);
+    safassert(object_create(immOmHandle, ownerHandle, className, &obj, 
+ NULL, &createValue), SA_AIS_OK);
+
+    /* Set the strong default attribute to NULL */
+    SaImmCcbHandleT ccbHandle;
+    SaImmAttrValuesT_2 modValue = { "attr", SA_IMM_ATTR_SAUINT32T, 0, NULL };
+    SaImmAttrModificationT_2 attrMod = { SA_IMM_ATTR_VALUES_REPLACE, modValue 
};
+    const SaImmAttrModificationT_2 *attrMods[] = { &attrMod, NULL };
+    safassert(saImmOmCcbInitialize(ownerHandle, 0, &ccbHandle), SA_AIS_OK);
+    safassert(saImmOmCcbObjectModify_2(ccbHandle, &obj, attrMods), SA_AIS_OK);
+    safassert(saImmOmCcbApply(ccbHandle), SA_AIS_OK);
+    safassert(saImmOmCcbFinalize(ccbHandle), SA_AIS_OK);
+
+    /* Check value of the attribute */
+    SaImmAccessorHandleT accessorHandle;
+    const SaImmAttrNameT attName = "attr";
+    SaImmAttrNameT attNames[] = {attName, NULL};
+    SaImmAttrValuesT_2 ** resultAttrs;
+    safassert(saImmOmAccessorInitialize(immOmHandle, &accessorHandle), 
SA_AIS_OK);
+    safassert(saImmOmAccessorGet_2(accessorHandle, &obj, attNames, 
&resultAttrs), SA_AIS_OK);
+    assert(resultAttrs[0] && (resultAttrs[0]->attrValueType == 
SA_IMM_ATTR_SAUINT32T));
+    assert(resultAttrs[0]->attrValuesNumber == 1);
+    test_validate(*((SaUint32T *) resultAttrs[0]->attrValues[0]), 
+ defaultVal);
+
+    /* Delete object */
+    safassert(object_delete(ownerHandle, &obj, 1), SA_AIS_OK);
+    safassert(saImmOmAdminOwnerFinalize(ownerHandle), SA_AIS_OK);
+
+    /* Delete class */
+    safassert(saImmOmClassDelete(immOmHandle, className), SA_AIS_OK);
+    safassert(saImmOmFinalize(immOmHandle), SA_AIS_OK); }
+
+void saImmOmCcbObjectModify_2_24(void) {
+    /*
+     * STRONG_DEFAULT, Delete all values of multi-valued attribute
+     */
+
+    /* Create class */
+    safassert(saImmOmInitialize(&immOmHandle, &immOmCallbacks, &immVersion), 
SA_AIS_OK);
+    const SaImmClassNameT className = (SaImmClassNameT) __FUNCTION__;
+    SaImmAttrDefinitionT_2 rdn =
+        {"rdn", SA_IMM_ATTR_SANAMET, SA_IMM_ATTR_CONFIG | SA_IMM_ATTR_RDN, 
NULL};
+    SaUint32T defaultVal = 100;
+    SaImmAttrDefinitionT_2 attr =
+        {"attr", SA_IMM_ATTR_SAUINT32T,
+            SA_IMM_ATTR_CONFIG | SA_IMM_ATTR_WRITABLE | 
SA_IMM_ATTR_STRONG_DEFAULT | SA_IMM_ATTR_MULTI_VALUE, &defaultVal};
+    const SaImmAttrDefinitionT_2 *attrDefinitions[] = {&rdn, &attr, NULL};
+    safassert(saImmOmClassCreate_2(immOmHandle, className, 
+ SA_IMM_CLASS_CONFIG, attrDefinitions), SA_AIS_OK);
+
+    /* Create object */
+    const SaImmAdminOwnerNameT adminOwnerName = (SaImmAdminOwnerNameT) 
__FUNCTION__;
+    SaImmAdminOwnerHandleT ownerHandle;
+    const SaNameT obj = { strlen("id=1"), "id=1" };
+    SaUint32T val1 = 200;
+    SaUint32T val2 = 300;
+    SaImmAttrValueT valArray[] = {&val1, &val2};
+    SaImmAttrValuesT_2 createValue= { "attr", SA_IMM_ATTR_SAUINT32T, 2, 
valArray };
+    safassert(saImmOmAdminOwnerInitialize(immOmHandle, adminOwnerName, 
SA_TRUE, &ownerHandle), SA_AIS_OK);
+    safassert(object_create(immOmHandle, ownerHandle, className, &obj, 
+ NULL, &createValue), SA_AIS_OK);
+
+    /* Delete all value of attribute */
+    SaImmCcbHandleT ccbHandle;
+    SaImmAttrValuesT_2 modValue = { "attr", SA_IMM_ATTR_SAUINT32T, 2, valArray 
};
+    SaImmAttrModificationT_2 attrMod = { SA_IMM_ATTR_VALUES_DELETE, modValue };
+    const SaImmAttrModificationT_2 *attrMods[] = { &attrMod, NULL };
+    safassert(saImmOmCcbInitialize(ownerHandle, 0, &ccbHandle), SA_AIS_OK);
+    safassert(saImmOmCcbObjectModify_2(ccbHandle, &obj, attrMods), SA_AIS_OK);
+    safassert(saImmOmCcbApply(ccbHandle), SA_AIS_OK);
+    safassert(saImmOmCcbFinalize(ccbHandle), SA_AIS_OK);
+
+    /* Check value of the attribute */
+    SaImmAccessorHandleT accessorHandle;
+    const SaImmAttrNameT attName = "attr";
+    SaImmAttrNameT attNames[] = {attName, NULL};
+    SaImmAttrValuesT_2 ** resultAttrs;
+    safassert(saImmOmAccessorInitialize(immOmHandle, &accessorHandle), 
SA_AIS_OK);
+    safassert(saImmOmAccessorGet_2(accessorHandle, &obj, attNames, 
&resultAttrs), SA_AIS_OK);
+    assert(resultAttrs[0] && (resultAttrs[0]->attrValueType == 
SA_IMM_ATTR_SAUINT32T));
+    assert(resultAttrs[0]->attrValuesNumber == 1);
+    test_validate(*((SaUint32T *) resultAttrs[0]->attrValues[0]), 
+ defaultVal);
+
+    /* Delete object */
+    safassert(object_delete(ownerHandle, &obj, 1), SA_AIS_OK);
+    safassert(saImmOmAdminOwnerFinalize(ownerHandle), SA_AIS_OK);
+
+    /* Delete class */
+    safassert(saImmOmClassDelete(immOmHandle, className), SA_AIS_OK);
+    safassert(saImmOmFinalize(immOmHandle), SA_AIS_OK); }
+
 __attribute__ ((constructor)) static void 
saImmOmCcbObjectModify_2_constructor(void)
 {
     dnObj1.length = (SaUint16T) sprintf((char*) dnObj1.value, "%s,%s", 
rdnObj1.value, rootObj.value); diff --git 
a/tests/immsv/management/test_saImmOmClassCreate_2.c 
b/tests/immsv/management/test_saImmOmClassCreate_2.c
--- a/tests/immsv/management/test_saImmOmClassCreate_2.c
+++ b/tests/immsv/management/test_saImmOmClassCreate_2.c
@@ -299,6 +299,50 @@ void saImmOmClassCreate_2_17(void)
     safassert(saImmOmFinalize(immOmHandle), SA_AIS_OK);  }
 
+void saImmOmClassCreate_2_18(void)
+{
+    /*
+     * Create a class that has STRONG_DEFAULT flag.
+     */
+    safassert(saImmOmInitialize(&immOmHandle, &immOmCallbacks, 
+&immVersion), SA_AIS_OK);
+
+    const SaImmClassNameT className = (SaImmClassNameT) __FUNCTION__;
+    SaImmAttrDefinitionT_2 rdn =
+        {"rdn", SA_IMM_ATTR_SANAMET, SA_IMM_ATTR_CONFIG | SA_IMM_ATTR_RDN, 
NULL};
+    SaUint32T defaultVal = 100;
+    SaImmAttrDefinitionT_2 attr =
+        {"attr", SA_IMM_ATTR_SAUINT32T,
+            SA_IMM_ATTR_CONFIG | SA_IMM_ATTR_WRITABLE | 
SA_IMM_ATTR_STRONG_DEFAULT, &defaultVal};
+    const SaImmAttrDefinitionT_2 *attrDefinitions[] = {&rdn, &attr, 
+ NULL};
+
+    rc = saImmOmClassCreate_2(immOmHandle, className, SA_IMM_CLASS_CONFIG, 
attrDefinitions);
+    test_validate(rc, SA_AIS_OK);
+    safassert(saImmOmClassDelete(immOmHandle, className), SA_AIS_OK);
+
+    safassert(saImmOmFinalize(immOmHandle), SA_AIS_OK); }
+
+void saImmOmClassCreate_2_19(void)
+{
+    /*
+     * Create a class that has STRONG_DEFAULT flag without having default 
value.
+     */
+    safassert(saImmOmInitialize(&immOmHandle, &immOmCallbacks, 
+&immVersion), SA_AIS_OK);
+
+    const SaImmClassNameT className = (SaImmClassNameT) __FUNCTION__;
+    SaImmAttrDefinitionT_2 rdn =
+        {"rdn", SA_IMM_ATTR_SANAMET, SA_IMM_ATTR_CONFIG | SA_IMM_ATTR_RDN, 
NULL};
+    SaImmAttrDefinitionT_2 attr =
+        {"attr", SA_IMM_ATTR_SAUINT32T,
+            SA_IMM_ATTR_CONFIG | SA_IMM_ATTR_WRITABLE | 
SA_IMM_ATTR_STRONG_DEFAULT, NULL};
+    const SaImmAttrDefinitionT_2 *attrDefinitions[] = {&rdn, &attr, 
+ NULL};
+
+    rc = saImmOmClassCreate_2(immOmHandle, className, SA_IMM_CLASS_CONFIG, 
attrDefinitions);
+    test_validate(rc, SA_AIS_ERR_INVALID_PARAM);
+
+    safassert(saImmOmFinalize(immOmHandle), SA_AIS_OK); }
+
 #define OPENSAF_IMM_NOSTD_FLAG_PARAM "opensafImmNostdFlags"
 #define OPENSAF_IMM_NOSTD_FLAG_ON    1
 #define OPENSAF_IMM_NOSTD_FLAG_OFF   2
@@ -946,6 +990,90 @@ void saImmOmClassCreate_SchemaChange_2_1
     if (!schemaChangeEnabled) disableSchemaChange();  }
 
+void saImmOmClassCreate_SchemaChange_2_17(void)
+{
+    /*
+     * Add STRONG_DEFAULT flag to an attribute
+     */
+    int schemaChangeEnabled = enableSchemaChange();
+    safassert(saImmOmInitialize(&immOmHandle, &immOmCallbacks, 
+&immVersion), SA_AIS_OK);
+
+    const SaImmClassNameT className = (SaImmClassNameT) __FUNCTION__;
+    SaImmAttrDefinitionT_2 rdn =
+        {"rdn", SA_IMM_ATTR_SANAMET, SA_IMM_ATTR_CONFIG | SA_IMM_ATTR_RDN, 
NULL};
+    SaUint32T defaultVal = 100;
+    SaImmAttrDefinitionT_2 weak =
+        {"attr", SA_IMM_ATTR_SAUINT32T, SA_IMM_ATTR_CONFIG | 
SA_IMM_ATTR_WRITABLE, &defaultVal};
+    SaImmAttrDefinitionT_2 strong =
+        {"attr", SA_IMM_ATTR_SAUINT32T, SA_IMM_ATTR_CONFIG | 
SA_IMM_ATTR_WRITABLE | SA_IMM_ATTR_STRONG_DEFAULT, &defaultVal};
+    const SaImmAttrDefinitionT_2 *attrDefinitions[] = {&rdn, NULL, 
+ NULL};
+
+    attrDefinitions[1] = &weak;
+    safassert(saImmOmClassCreate_2(immOmHandle, className, 
SA_IMM_CLASS_CONFIG, attrDefinitions), SA_AIS_OK);
+    attrDefinitions[1] = &strong;
+    rc = saImmOmClassCreate_2(immOmHandle, className, SA_IMM_CLASS_CONFIG, 
attrDefinitions);
+    test_validate(rc, SA_AIS_OK);
+    safassert(saImmOmClassDelete(immOmHandle, className), SA_AIS_OK);
+
+    safassert(saImmOmFinalize(immOmHandle), SA_AIS_OK);
+    if (!schemaChangeEnabled) disableSchemaChange(); }
+
+void saImmOmClassCreate_SchemaChange_2_18(void)
+{
+    /*
+     * Remove STRONG_DEFAULT flag from an attribute
+     */
+    int schemaChangeEnabled = enableSchemaChange();
+    safassert(saImmOmInitialize(&immOmHandle, &immOmCallbacks, 
+&immVersion), SA_AIS_OK);
+
+    const SaImmClassNameT className = (SaImmClassNameT) __FUNCTION__;
+    SaImmAttrDefinitionT_2 rdn =
+        {"rdn", SA_IMM_ATTR_SANAMET, SA_IMM_ATTR_CONFIG | SA_IMM_ATTR_RDN, 
NULL};
+    SaUint32T defaultVal = 100;
+    SaImmAttrDefinitionT_2 weak =
+        {"attr", SA_IMM_ATTR_SAUINT32T, SA_IMM_ATTR_CONFIG | 
SA_IMM_ATTR_WRITABLE, &defaultVal};
+    SaImmAttrDefinitionT_2 strong =
+        {"attr", SA_IMM_ATTR_SAUINT32T, SA_IMM_ATTR_CONFIG | 
SA_IMM_ATTR_WRITABLE | SA_IMM_ATTR_STRONG_DEFAULT, &defaultVal};
+    const SaImmAttrDefinitionT_2 *attrDefinitions[] = {&rdn, NULL, 
+ NULL};
+
+    attrDefinitions[1] = &strong;
+    safassert(saImmOmClassCreate_2(immOmHandle, className, 
SA_IMM_CLASS_CONFIG, attrDefinitions), SA_AIS_OK);
+    attrDefinitions[1] = &weak;
+    rc = saImmOmClassCreate_2(immOmHandle, className, SA_IMM_CLASS_CONFIG, 
attrDefinitions);
+    test_validate(rc, SA_AIS_OK);
+    safassert(saImmOmClassDelete(immOmHandle, className), SA_AIS_OK);
+
+    safassert(saImmOmFinalize(immOmHandle), SA_AIS_OK);
+    if (!schemaChangeEnabled) disableSchemaChange(); }
+
+void saImmOmClassCreate_SchemaChange_2_19(void)
+{
+    /*
+     * Add a new attribute with STRONG_DEFAULT flag
+     */
+    int schemaChangeEnabled = enableSchemaChange();
+    safassert(saImmOmInitialize(&immOmHandle, &immOmCallbacks, 
+&immVersion), SA_AIS_OK);
+
+    const SaImmClassNameT className = (SaImmClassNameT) __FUNCTION__;
+    SaImmAttrDefinitionT_2 rdn =
+        {"rdn", SA_IMM_ATTR_SANAMET, SA_IMM_ATTR_CONFIG | SA_IMM_ATTR_RDN, 
NULL};
+    SaUint32T defaultVal = 100;
+    SaImmAttrDefinitionT_2 strong =
+        {"attr", SA_IMM_ATTR_SAUINT32T, SA_IMM_ATTR_CONFIG | 
SA_IMM_ATTR_WRITABLE | SA_IMM_ATTR_STRONG_DEFAULT, &defaultVal};
+    const SaImmAttrDefinitionT_2 *attrDefinitions[] = {&rdn, NULL, 
+ NULL};
+
+    safassert(saImmOmClassCreate_2(immOmHandle, className, 
SA_IMM_CLASS_CONFIG, attrDefinitions), SA_AIS_OK);
+    attrDefinitions[1] = &strong;
+    rc = saImmOmClassCreate_2(immOmHandle, className, SA_IMM_CLASS_CONFIG, 
attrDefinitions);
+    test_validate(rc, SA_AIS_ERR_EXIST);
+    safassert(saImmOmClassDelete(immOmHandle, className), SA_AIS_OK);
+
+    safassert(saImmOmFinalize(immOmHandle), SA_AIS_OK);
+    if (!schemaChangeEnabled) disableSchemaChange(); }
+
 extern void saImmOmClassDescriptionGet_2_01(void);
 extern void saImmOmClassDescriptionGet_2_02(void);
 extern void saImmOmClassDescriptionGet_2_03(void);
@@ -982,6 +1110,8 @@ extern void saImmOmClassDelete_2_04(void
     test_case_add(2, saImmOmClassCreate_2_15, "saImmOmClassCreate_2 - 
SA_AIS_ERR_INVALID_PARAM, flag SA_IMM_ATTR_NO_DUPLICATES only allowed on 
multivalued");
     test_case_add(2, saImmOmClassCreate_2_16, "saImmOmClassCreate_2 - 
SA_AIS_OK, flag SA_IMM_ATTR_NO_DANGLING");
     test_case_add(2, saImmOmClassCreate_2_17, "saImmOmClassCreate_2 - 
SA_AIS_ERR_INVALID_PARAM, flag SA_IMM_ATTR_NO_DANGLING for PRTA");
+    test_case_add(2, saImmOmClassCreate_2_18, "saImmOmClassCreate_2 - 
SA_AIS_OK, Create a class that has STRONG_DEFAULT flag");
+    test_case_add(2, saImmOmClassCreate_2_19, "saImmOmClassCreate_2 - 
+ SA_AIS_OK, Create a class that has STRONG_DEFAULT flag without having 
+ default value");
 
     test_case_add(2, saImmOmClassDescriptionGet_2_01, 
"saImmOmClassDescriptionGet_2 - SA_AIS_OK");
     test_case_add(2, saImmOmClassDescriptionGet_2_02, 
"saImmOmClassDescriptionGet_2 - SA_AIS_ERR_BAD_HANDLE"); @@ -1014,5 +1144,9 @@ 
extern void saImmOmClassDelete_2_04(void
     test_case_add(2, saImmOmClassCreate_SchemaChange_2_14, "SchemaChange - 
SA_AIS_ERR_INVALID_PARAM, Create new class with DEFAULT_REMOVED flag (Runtime 
class)");
     test_case_add(2, saImmOmClassCreate_SchemaChange_2_15, "SchemaChange - 
SA_AIS_ERR_INVALID_PARAM, Set value of default-removed attribute to empty when 
creating an object (Runtime class)");
     test_case_add(2, saImmOmClassCreate_SchemaChange_2_16, "SchemaChange - Set 
value of default-restored attribute to empty when creating an object (Runtime 
class)");
+
+    test_case_add(2, saImmOmClassCreate_SchemaChange_2_17, "SchemaChange - 
SA_AIS_OK, Add STRONG_DEFAULT flag to an attribute");
+    test_case_add(2, saImmOmClassCreate_SchemaChange_2_18, "SchemaChange - 
SA_AIS_OK, Remove STRONG_DEFAULT flag from an attribute");
+    test_case_add(2, saImmOmClassCreate_SchemaChange_2_19, 
+ "SchemaChange - SA_AIS_ERR_EXIST, Add a new attribute with 
+ STRONG_DEFAULT flag");
 }
 

------------------------------------------------------------------------------
Monitor Your Dynamic Infrastructure at Any Scale With Datadog!
Get real-time metrics from all of your servers, apps and tools
in one place.
SourceForge users - Click here to start your Free Trial of Datadog now!
http://pubads.g.doubleclick.net/gampad/clk?id=241902991&iu=/4140
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to