tests/ntfsv/tet_saNtfFinalize.c | 106 ++++++++++++++++++++++++++++++++++++++++
1 files changed, 106 insertions(+), 0 deletions(-)
First test (saNtfFinalize_04) will subscribe with NTF after successful
initialization. After this it will try to unsubscribe for notification in a
separate thread while main thread will try to finalize with NTF.
Here saNtfSubacribe() may get successful or return with BAD_HANDLE.
Second test (saNtfFinalize_05) will initialize with notification service.
After successful initialization, it will try to allocate state change
notification
in a separate thread while main thread will try to finalize with NTF.
Here saNtfStateChangeNotificationAllocate() may get successful or return with
BAD_HANDLE
In both the test cases saNtfFinalize() will always be sucessful.
diff --git a/tests/ntfsv/tet_saNtfFinalize.c b/tests/ntfsv/tet_saNtfFinalize.c
--- a/tests/ntfsv/tet_saNtfFinalize.c
+++ b/tests/ntfsv/tet_saNtfFinalize.c
@@ -17,7 +17,10 @@
#include <utest.h>
#include <util.h>
#include "tet_ntf.h"
+#include <unistd.h>
+#include <pthread.h>
+SaNtfStateChangeNotificationT myNotification;
void saNtfFinalize_01(void)
{
safassert(saNtfInitialize(&ntfHandle, &ntfCallbacks, &ntfVersion),
SA_AIS_OK);
@@ -39,11 +42,114 @@ void saNtfFinalize_03(void)
test_validate(rc, SA_AIS_ERR_BAD_HANDLE);
}
+SaAisErrorT subscribe()
+{
+ SaAisErrorT ret;
+ SaNtfObjectCreateDeleteNotificationFilterT obcf;
+ SaNtfNotificationTypeFilterHandlesT FilterHandles;
+ memset(&FilterHandles, 0, sizeof(FilterHandles));
+
+ ret = saNtfObjectCreateDeleteNotificationFilterAllocate(ntfHandle,
&obcf,0,0,0,1,0);
+ obcf.notificationFilterHeader.notificationClassIds->vendorId =
SA_NTF_VENDOR_ID_SAF;
+ obcf.notificationFilterHeader.notificationClassIds->majorId = 222;
+ obcf.notificationFilterHeader.notificationClassIds->minorId = 222;
+ FilterHandles.objectCreateDeleteFilterHandle =
obcf.notificationFilterHandle;
+ ret = saNtfNotificationSubscribe(&FilterHandles, 111);
+ return ret;
+}
+
+void *unsubscribe(void *arg)
+{
+ SaAisErrorT *ret = (SaAisErrorT *)arg;
+ *ret = saNtfNotificationUnsubscribe(111);
+ pthread_exit(NULL);
+}
+
+void saNtfFinalize_04()
+{
+ SaAisErrorT ret1, ret2;
+ safassert(saNtfInitialize(&ntfHandle, &ntfCallbacks, &ntfVersion),
SA_AIS_OK);
+ safassert(subscribe(),SA_AIS_OK);
+ pthread_t thread;
+ pthread_create(&thread, NULL, unsubscribe, (void *) &ret2);
+ usleep(1);
+ ret1 = saNtfFinalize(ntfHandle);
+ pthread_join(thread, NULL);
+ printf(" Return value from thread:%u\n",ret2);
+
+ //saNtfUnsubscribe() may fail with expected return value BAD_HANDLE or
TRY_AGAIN.
+ if ((ret2 == SA_AIS_ERR_BAD_HANDLE) || (ret2 == SA_AIS_ERR_TRY_AGAIN))
+ ret2 = SA_AIS_OK;
+ safassert(ret2,SA_AIS_OK);
+ test_validate(ret1, SA_AIS_OK);
+}
+void *allocate(void *arg)
+{
+ SaAisErrorT *ret = (SaAisErrorT *)arg;
+ SaStringT myAdditionalText = "My additional text";
+ SaNameT object = {9, "smallerdn" };
+
+ *ret = saNtfStateChangeNotificationAllocate(
+ ntfHandle, /* handle to Notification Service instance */
+ &myNotification,
+ 0 /* number of correlated notifications */,
+ strlen(myAdditionalText) + 1 /* length of additional text
*/,
+ 1 /* number of additional info items*/,
+ 1 /* number of changed object states */,
+ SA_NTF_ALLOC_SYSTEM_LIMIT /* use default allocation size
*/);
+ if (*ret != SA_AIS_OK)
+ goto done;
+ *(myNotification.notificationHeader.eventType) =
SA_NTF_OBJECT_STATE_CHANGE;
+ *(myNotification.notificationHeader.eventTime) = SA_TIME_UNKNOWN;
+
+ myNotification.notificationHeader.notificationClassId->vendorId = 33333;
+ myNotification.notificationHeader.notificationClassId->majorId = 997;
+ myNotification.notificationHeader.notificationClassId->minorId = 1;
+
+ *(myNotification.sourceIndicator) = SA_NTF_OBJECT_OPERATION;
+
+ myNotification.changedStates[0].stateId = 1;
+ myNotification.changedStates[0].oldStatePresent = SA_TRUE;
+ myNotification.changedStates[0].oldState = 1;
+ myNotification.changedStates[0].newState = 2;
+
+ strcpy(myNotification.notificationHeader.additionalText, myAdditionalText);
+
+ myNotification.notificationHeader.additionalInfo[0].infoId = 2;
+ myNotification.notificationHeader.additionalInfo[0].infoType =
SA_NTF_VALUE_UINT8;
+ myNotification.notificationHeader.additionalInfo[0].infoValue.uint8Val =
42;
+
+ myNotification.notificationHeader.notificationObject->length =
object.length;
+ memcpy(myNotification.notificationHeader.notificationObject->value,
object.value, object.length);
+done:
+ pthread_exit(NULL);
+}
+void saNtfFinalize_05()
+{
+ SaAisErrorT ret1, ret2;
+ safassert(saNtfInitialize(&ntfHandle, &ntfCallbacks, &ntfVersion),
SA_AIS_OK);
+ pthread_t thread;
+ pthread_create(&thread, NULL, allocate, (void *) &ret2);
+ usleep(1);
+ ret1 = saNtfFinalize(ntfHandle);
+ pthread_join(thread, NULL);
+ printf(" Return value from thread:%u\n",ret2);
+
+ //saNtfUnsubscribe() may fail with expected return value BAD_HANDLE or
TRY_AGAIN.
+ if ((ret2 == SA_AIS_ERR_BAD_HANDLE) || (ret2 == SA_AIS_ERR_TRY_AGAIN))
+ ret2 = SA_AIS_OK;
+ safassert(ret2,SA_AIS_OK);
+ test_validate(ret1, SA_AIS_OK);
+
+}
+
__attribute__ ((constructor)) static void saNtfFinalize_constructor(void)
{
test_suite_add(2, "Life cycle, finalize, API 2");
test_case_add(2, saNtfFinalize_01, "saNtfFinalize SA_AIS_OK");
test_case_add(2, saNtfFinalize_02, "saNtfFinalize SA_AIS_ERR_BAD_HANDLE -
invalid handle");
test_case_add(2, saNtfFinalize_03, "saNtfFinalize SA_AIS_ERR_BAD_HANDLE -
handle already returned");
+ test_case_add(2, saNtfFinalize_04, "Finalize and Unsubscribe in parallel
SA_AIS_OK");
+ test_case_add(2, saNtfFinalize_05, "Finalize and
saNtfStateChangeNotificationAllocate in parallel SA_AIS_OK");
}
------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel