tests/ntfsv/Makefile.am                       |     4 +-
 tests/ntfsv/tet_ntf.h                         |     4 +-
 tests/ntfsv/tet_ntf_api_wrapper.c             |   438 ++++++++++
 tests/ntfsv/tet_ntf_common.c                  |    67 +
 tests/ntfsv/tet_ntf_common.h                  |   187 ++++
 tests/ntfsv/tet_ntf_main.c                    |   155 +++-
 tests/ntfsv/tet_scOutage_reinitializeHandle.c |  1021 +++++++++++++++++++++++++
 7 files changed, 1859 insertions(+), 17 deletions(-)


The patch adds new test cases to ntftest for cloud resilience
feature.

diff --git a/tests/ntfsv/Makefile.am b/tests/ntfsv/Makefile.am
--- a/tests/ntfsv/Makefile.am
+++ b/tests/ntfsv/Makefile.am
@@ -36,6 +36,7 @@ ntftest_SOURCES = \
        tet_ntf_main.c \
        sa_error.c \
        tet_ntf_common.c \
+       tet_ntf_api_wrapper.c \
        tet_saNtfInitialize.c \
        tet_saNtfSelectionObjectGet.c \
        tet_saNtfDispatch.c \
@@ -65,7 +66,8 @@ ntftest_SOURCES = \
        tet_saNtfArrayValGet.c \
        tet_saNtfPtrValGet.c \
        test_ntfFilterVerification.c \
-       tet_longDnObject_notification.c
+       tet_longDnObject_notification.c \
+       tet_scOutage_reinitializeHandle.c
 
 ntftest_LDADD = \
        $(top_builddir)/tests/unit_test_fw/src/libutest.la
diff --git a/tests/ntfsv/tet_ntf.h b/tests/ntfsv/tet_ntf.h
--- a/tests/ntfsv/tet_ntf.h
+++ b/tests/ntfsv/tet_ntf.h
@@ -44,7 +44,9 @@ extern SaAisErrorT rc;
 extern SaNtfHandleT ntfHandle;
 extern SaNtfCallbacksT ntfCallbacks;
 extern SaSelectionObjectT selectionObject;
-
+int verbose;
+int gl_tag_mode;
+int gl_prompt_mode;
 #define DEFAULT_ADDITIONAL_TEXT "this is additional text info"
 
 typedef struct  {
diff --git a/tests/ntfsv/tet_ntf_api_wrapper.c 
b/tests/ntfsv/tet_ntf_api_wrapper.c
new file mode 100644
--- /dev/null
+++ b/tests/ntfsv/tet_ntf_api_wrapper.c
@@ -0,0 +1,438 @@
+/*       -*- OpenSAF  -*-
+ *
+ * (C) Copyright 2009 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 <utest.h>
+#include "tet_ntf.h"
+#include "tet_ntf_common.h"
+
+
+SaAisErrorT ntftest_saNtfInitialize(SaNtfHandleT *ntfHandle, const 
SaNtfCallbacksT *ntfCallbacks, SaVersionT *version)
+{
+       int retryNum = 1;
+       SaAisErrorT rc;
+       do {
+               fprintf_v(stdout, "\n Running saNtfInitialize()...");
+               rc = saNtfInitialize(ntfHandle, ntfCallbacks, version);
+               fprintf_v(stdout, "Done, rc:%u", rc);
+       } while (--retryNum > 0 && rc != SA_AIS_OK);
+
+       return rc;
+}
+
+SaAisErrorT ntftest_saNtfSelectionObjectGet(SaNtfHandleT ntfHandle, 
SaSelectionObjectT *selectionObject)
+{
+       SaAisErrorT rc;
+
+       fprintf_v(stdout, "\n Running saNtfSelectionObjectGet()...");
+       rc = saNtfSelectionObjectGet(ntfHandle, selectionObject);
+       fprintf_v(stdout, "Done, rc:%u", rc);
+
+       return rc;
+}
+
+SaAisErrorT ntftest_saNtfDispatch(SaNtfHandleT ntfHandle, SaDispatchFlagsT 
dispatchFlags)
+{
+       SaAisErrorT rc;
+
+       fprintf_v(stdout, "\n Running saNtfDispatch()...");
+       rc = saNtfDispatch(ntfHandle, dispatchFlags);
+
+       fprintf_v(stdout, "Done, rc:%u", rc);
+
+       return rc;
+}
+
+SaAisErrorT ntftest_saNtfFinalize(SaNtfHandleT ntfHandle)
+{
+       SaAisErrorT rc;
+
+       fprintf_v(stdout, "\n Running saNtfFinalize()...");
+       rc = saNtfFinalize(ntfHandle);
+       fprintf_v(stdout, "Done, rc:%u", rc);
+
+       return rc;
+}
+
+
+SaAisErrorT ntftest_saNtfNotificationFree(SaNtfNotificationHandleT 
notificationHandle)
+{
+       SaAisErrorT rc;
+
+       fprintf_v(stdout, "\n Running saNtfNotificationFree()...");
+       rc = saNtfNotificationFree(notificationHandle);
+
+       fprintf_v(stdout, "Done, rc:%u", rc);
+
+       return rc;
+}
+
+SaAisErrorT ntftest_saNtfNotificationSend(SaNtfNotificationHandleT 
notificationHandle)
+{
+       SaAisErrorT rc;
+
+       fprintf_v(stdout, "\n Running saNtfNotificationSend()...");
+       rc = saNtfNotificationSend(notificationHandle);
+       fprintf_v(stdout, "Done, rc:%u", rc);
+
+       return rc;
+}
+
+SaAisErrorT ntftest_saNtfNotificationSubscribe(const 
SaNtfNotificationTypeFilterHandlesT *notificationFilterHandles,
+                                      SaNtfSubscriptionIdT subscriptionId)
+{
+       SaAisErrorT rc;
+
+       fprintf_v(stdout, "\n Running saNtfNotificationSubscribe()...");
+       rc = saNtfNotificationSubscribe(notificationFilterHandles, 
subscriptionId);
+
+       fprintf_v(stdout, "Done, rc:%u", rc);
+
+       return rc;
+}
+
+SaAisErrorT ntftest_saNtfNotificationUnsubscribe(SaNtfSubscriptionIdT 
subscriptionId)
+{
+       SaAisErrorT rc;
+
+       fprintf_v(stdout, "\n Running saNtfNotificationUnsubscribe()...");
+
+       rc = saNtfNotificationUnsubscribe(subscriptionId);
+
+       fprintf_v(stdout, "Done, rc:%u", rc);
+
+       return rc;
+}
+
+SaAisErrorT ntftest_saNtfNotificationFilterFree(SaNtfNotificationFilterHandleT 
notificationFilterHandle)
+{
+       SaAisErrorT rc;
+
+       fprintf_v(stdout, "\n Running saNtfNotificationFilterFree()...");
+       rc = saNtfNotificationFilterFree(notificationFilterHandle);
+
+       fprintf_v(stdout, "Done, rc:%u", rc);
+
+       return rc;
+}
+
+SaAisErrorT ntftest_saNtfNotificationReadInitialize(SaNtfSearchCriteriaT 
searchCriteria,
+                                           const 
SaNtfNotificationTypeFilterHandlesT *notificationFilterHandles,
+                                           SaNtfReadHandleT *readHandle)
+{
+       SaAisErrorT rc;
+
+       fprintf_v(stdout, "\n Running saNtfNotificationReadInitialize()...");
+
+       rc = saNtfNotificationReadInitialize(searchCriteria, 
notificationFilterHandles, readHandle);
+
+       fprintf_v(stdout, "Done, rc:%u", rc);
+
+       return rc;
+}
+SaAisErrorT ntftest_saNtfNotificationReadNext(SaNtfReadHandleT readHandle,
+                                     SaNtfSearchDirectionT searchDirection, 
SaNtfNotificationsT *notification)
+{
+       SaAisErrorT rc;
+
+       fprintf_v(stdout, "\n Running saNtfNotificationReadNext()...");
+
+       rc = saNtfNotificationReadNext(readHandle, searchDirection, 
notification);
+
+       fprintf_v(stdout, "Done, rc:%u", rc);
+
+       return rc;
+}
+SaAisErrorT ntftest_saNtfNotificationReadFinalize(SaNtfReadHandleT readhandle)
+{
+       SaAisErrorT rc;
+
+       fprintf_v(stdout, "\n Running saNtfNotificationReadFinalize()...");
+
+       rc = saNtfNotificationReadFinalize(readhandle);
+
+       fprintf_v(stdout, "Done, rc:%u", rc);
+
+       return rc;
+}
+
+
+SaAisErrorT ntftest_saNtfPtrValAllocate(SaNtfNotificationHandleT 
notificationHandle,
+                               SaUint16T dataSize, void **dataPtr, SaNtfValueT 
*value)
+{
+       SaAisErrorT rc;
+
+       fprintf_v(stdout, "\n Running saNtfPtrValAllocate()...");
+       rc = saNtfPtrValAllocate(notificationHandle, dataSize,
+                                                               dataPtr, value);
+       fprintf_v(stdout, "Done, rc:%u", rc);
+
+       return rc;
+}
+
+SaAisErrorT ntftest_saNtfAlarmNotificationAllocate(SaNtfHandleT ntfHandle,
+                                          SaNtfAlarmNotificationT 
*notification,
+                                          SaUint16T numCorrelatedNotifications,
+                                          SaUint16T lengthAdditionalText,
+                                          SaUint16T numAdditionalInfo,
+                                          SaUint16T numSpecificProblems,
+                                          SaUint16T numMonitoredAttributes,
+                                          SaUint16T numProposedRepairActions,
+                                          SaInt16T variableDataSize)
+{
+       SaAisErrorT rc;
+
+       fprintf_v(stdout, "\n Running saNtfAlarmNotificationAllocate()...");
+       rc = saNtfAlarmNotificationAllocate(ntfHandle,
+                                          notification,
+                                          numCorrelatedNotifications,
+                                          lengthAdditionalText,
+                                          numAdditionalInfo,
+                                          numSpecificProblems,
+                                          numMonitoredAttributes,
+                                          numProposedRepairActions,
+                                          variableDataSize);
+       fprintf_v(stdout, "Done, rc:%u", rc);
+
+       return rc;
+}
+
+SaAisErrorT ntftest_saNtfSecurityAlarmNotificationAllocate(SaNtfHandleT 
ntfHandle,
+                                                  
SaNtfSecurityAlarmNotificationT *notification,
+                                                  SaUint16T 
numCorrelatedNotifications,
+                                                  SaUint16T 
lengthAdditionalText,
+                                                  SaUint16T numAdditionalInfo,
+                                                  SaInt16T variableDataSize)
+{
+       SaAisErrorT rc;
+
+       fprintf_v(stdout, "\n Running 
saNtfSecurityAlarmNotificationAllocate()...");
+       rc = saNtfSecurityAlarmNotificationAllocate(ntfHandle,
+                                                  notification,
+                                                  numCorrelatedNotifications,
+                                                  lengthAdditionalText,
+                                                  numAdditionalInfo,
+                                                  variableDataSize);
+
+       fprintf_v(stdout, "Done, rc:%u", rc);
+
+       return rc;
+}
+
+SaAisErrorT ntftest_saNtfStateChangeNotificationAllocate(SaNtfHandleT 
ntfHandle,
+                                    SaNtfStateChangeNotificationT 
*notification,
+                                    SaUint16T numCorrelatedNotifications,
+                                    SaUint16T lengthAdditionalText,
+                                    SaUint16T numAdditionalInfo,
+                                        SaUint16T numStateChanges,
+                                        SaInt16T variableDataSize)
+{
+       SaAisErrorT rc;
+
+       fprintf_v(stdout, "\n Running 
saNtfStateChangeNotificationAllocate()...");
+       rc = saNtfStateChangeNotificationAllocate(ntfHandle,
+                                    notification,
+                                    numCorrelatedNotifications,
+                                    lengthAdditionalText,
+                                    numAdditionalInfo,
+                                        numStateChanges,
+                                        variableDataSize);
+
+       fprintf_v(stdout, "Done, rc:%u", rc);
+
+       return rc;
+}
+
+SaAisErrorT ntftest_saNtfObjectCreateDeleteNotificationAllocate(SaNtfHandleT 
ntfHandle,
+                                           
SaNtfObjectCreateDeleteNotificationT *notification,
+                                           SaUint16T 
numCorrelatedNotifications,
+                                           SaUint16T lengthAdditionalText,
+                                           SaUint16T numAdditionalInfo,
+                                           SaUint16T numAttributes,
+                                               SaInt16T variableDataSize)
+{
+       SaAisErrorT rc;
+
+       fprintf_v(stdout, "\n Running 
saNtfObjectCreateDeleteNotificationAllocate()...");
+       rc = saNtfObjectCreateDeleteNotificationAllocate(ntfHandle,
+                                           notification,
+                                           numCorrelatedNotifications,
+                                           lengthAdditionalText,
+                                           numAdditionalInfo,
+                                           numAttributes,
+                                               variableDataSize);
+
+       fprintf_v(stdout, "Done, rc:%u", rc);
+
+       return rc;
+}
+
+SaAisErrorT ntftest_saNtfAttributeChangeNotificationAllocate(SaNtfHandleT 
ntfHandle,
+                                        SaNtfAttributeChangeNotificationT 
*notification,
+                                        SaUint16T numCorrelatedNotifications,
+                                        SaUint16T lengthAdditionalText,
+                                        SaUint16T numAdditionalInfo,
+                                        SaUint16T numAttributes,
+                                        SaInt16T variableDataSize)
+{
+       SaAisErrorT rc;
+
+       fprintf_v(stdout, "\n Running 
saNtfAttributeChangeNotificationAllocate()...");
+       rc = saNtfAttributeChangeNotificationAllocate(ntfHandle,
+                                        notification,
+                                        numCorrelatedNotifications,
+                                        lengthAdditionalText,
+                                        numAdditionalInfo,
+                                        numAttributes,
+                                        variableDataSize);
+
+       fprintf_v(stdout, "Done, rc:%u", rc);
+
+       return rc;
+}
+
+SaAisErrorT ntftest_saNtfAlarmNotificationFilterAllocate(SaNtfHandleT 
ntfHandle,
+                                                SaNtfAlarmNotificationFilterT 
*notificationFilter,
+                                                SaUint16T numEventTypes,
+                                                SaUint16T 
numNotificationObjects,
+                                                SaUint16T numNotifyingObjects,
+                                                SaUint16T 
numNotificationClassIds,
+                                                SaUint16T numProbableCauses,
+                                                SaUint16T 
numPerceivedSeverities,
+                                                SaUint16T numTrends)
+{
+       SaAisErrorT rc;
+
+       fprintf_v(stdout, "\n Running 
saNtfAlarmNotificationFilterAllocate()...");
+       rc = saNtfAlarmNotificationFilterAllocate(ntfHandle,
+                                                notificationFilter,
+                                                numEventTypes,
+                                                numNotificationObjects,
+                                                numNotifyingObjects,
+                                                numNotificationClassIds,
+                                                numProbableCauses,
+                                                numPerceivedSeverities,
+                                                numTrends);
+
+       fprintf_v(stdout, "Done, rc:%u", rc);
+
+       return rc;
+}
+
+SaAisErrorT ntftest_saNtfSecurityAlarmNotificationFilterAllocate(SaNtfHandleT 
ntfHandle,
+                                                        
SaNtfSecurityAlarmNotificationFilterT *notificationFilter,
+                                                        SaUint16T 
numEventTypes,
+                                                        SaUint16T 
numNotificationObjects,
+                                                        SaUint16T 
numNotifyingObjects,
+                                                        SaUint16T 
numNotificationClassIds,
+                                                        SaUint16T 
numProbableCauses,
+                                                        SaUint16T 
numSeverities,
+                                                        SaUint16T 
numSecurityAlarmDetectors,
+                                                        SaUint16T 
numServiceUsers,
+                                                        SaUint16T 
numServiceProviders)
+{
+       SaAisErrorT rc;
+
+       fprintf_v(stdout, "\n Running 
saNtfSecurityAlarmNotificationFilterAllocate()...");
+       rc = saNtfSecurityAlarmNotificationFilterAllocate(ntfHandle,
+                                                        notificationFilter,
+                                                        numEventTypes,
+                                                        numNotificationObjects,
+                                                        numNotifyingObjects,
+                                                        
numNotificationClassIds,
+                                                        numProbableCauses,
+                                                        numSeverities,
+                                                        
numSecurityAlarmDetectors,
+                                                        numServiceUsers,
+                                                        numServiceProviders);
+
+       fprintf_v(stdout, "Done, rc:%u", rc);
+
+       return rc;
+}
+
+SaAisErrorT ntftest_saNtfStateChangeNotificationFilterAllocate(SaNtfHandleT 
ntfHandle,
+                                                      
SaNtfStateChangeNotificationFilterT *notificationFilter,
+                                                      SaUint16T numEventTypes,
+                                                      SaUint16T 
numNotificationObjects,
+                                                      SaUint16T 
numNotifyingObjects,
+                                                      SaUint16T 
numNotificationClassIds,
+                                                      SaUint16T 
numSourceIndicators,
+                                                          SaUint16T 
numChangedStates)
+{
+       SaAisErrorT rc;
+
+       fprintf_v(stdout, "\n Running 
saNtfStateChangeNotificationFilterAllocate()...");
+       rc = saNtfStateChangeNotificationFilterAllocate(ntfHandle,
+                                                      notificationFilter,
+                                                      numEventTypes,
+                                                      numNotificationObjects,
+                                                      numNotifyingObjects,
+                                                      numNotificationClassIds,
+                                                      numSourceIndicators,
+                                                          numChangedStates);
+
+       fprintf_v(stdout, "Done, rc:%u", rc);
+
+       return rc;
+}
+
+SaAisErrorT 
ntftest_saNtfObjectCreateDeleteNotificationFilterAllocate(SaNtfHandleT 
ntfHandle,
+                                                               
SaNtfObjectCreateDeleteNotificationFilterT *notificationFilter,
+                                                               SaUint16T 
numEventTypes,
+                                                           SaUint16T 
numNotificationObjects,
+                                                           SaUint16T 
numNotifyingObjects,
+                                                           SaUint16T 
numNotificationClassIds,
+                                                           SaUint16T 
numSourceIndicators)
+{
+       SaAisErrorT rc;
+
+       fprintf_v(stdout, "\n Running 
saNtfObjectCreateDeleteNotificationFilterAllocate()...");
+       rc = saNtfObjectCreateDeleteNotificationFilterAllocate(ntfHandle,
+                                                               
notificationFilter,
+                                                               numEventTypes,
+                                                           
numNotificationObjects,
+                                                           numNotifyingObjects,
+                                                           
numNotificationClassIds,
+                                                           
numSourceIndicators);
+
+       fprintf_v(stdout, "Done, rc:%u", rc);
+
+       return rc;
+}
+
+SaAisErrorT 
ntftest_saNtfAttributeChangeNotificationFilterAllocate(SaNtfHandleT ntfHandle,
+                                                          
SaNtfAttributeChangeNotificationFilterT *notificationFilter,
+                                                          SaUint16T 
numEventTypes,
+                                                          SaUint16T 
numNotificationObjects,
+                                                          SaUint16T 
numNotifyingObjects,
+                                                          SaUint16T 
numNotificationClassIds,
+                                                          SaUint16T 
numSourceIndicators)
+{
+       SaAisErrorT rc;
+
+       fprintf_v(stdout, "\n Running 
saNtfAttributeChangeNotificationFilterAllocate()...");
+       rc = saNtfAttributeChangeNotificationFilterAllocate(ntfHandle,
+                                                          notificationFilter,
+                                                          numEventTypes,
+                                                          
numNotificationObjects,
+                                                          numNotifyingObjects,
+                                                          
numNotificationClassIds,
+                                                          numSourceIndicators);
+
+       fprintf_v(stdout, "Done, rc:%u", rc);
+
+       return rc;
+}
diff --git a/tests/ntfsv/tet_ntf_common.c b/tests/ntfsv/tet_ntf_common.c
--- a/tests/ntfsv/tet_ntf_common.c
+++ b/tests/ntfsv/tet_ntf_common.c
@@ -20,6 +20,7 @@
 #include <util.h>
 #include <poll.h>
 #include <unistd.h>
+#include <stdarg.h>
 #include "sa_error.h"
 #include "tet_ntf.h"
 #include "tet_ntf_common.h"
@@ -27,6 +28,9 @@
 #define CALLBACK_USED 1
 
 SaNtfIdentifierT last_not_id = SA_NTF_IDENTIFIER_UNUSED;
+extern int verbose;
+extern int gl_tag_mode;
+extern int gl_prompt_mode;
 
 void assertvalue_impl(__const char *__assertion, __const char *__file,
                   unsigned int __line, __const char *__function)
@@ -1207,3 +1211,66 @@ int verifySecurityAlarmNotification(cons
        }
        return errors;
 }
+
+/**
+ * verbose printout
+ * String will only be printed if verbose is enabled
+ *
+ * @param f [out] output stream
+ * @param format [in] format string
+ * @param ... [in] arguments of format string
+ */
+void fprintf_v(FILE* f, const char *format, ...)
+{
+       va_list argptr;
+
+       if (!verbose)
+               return;
+
+       va_start(argptr, format);
+       vfprintf(f, format, argptr);
+       va_end(argptr);
+       fflush(f);
+}
+
+/**
+ * printout in tag mode
+ * String will only be printed if tag_mode is enabled
+ *
+ * @param f [out] output stream
+ * @param format [in] format string
+ * @param ... [in] arguments of format string
+ */
+void fprintf_t(FILE* f, const char *format, ...)
+{
+       va_list argptr;
+
+       if (!gl_tag_mode)
+               return;
+
+       va_start(argptr, format);
+       vfprintf(f, format, argptr);
+       va_end(argptr);
+       fflush(f);
+}
+
+/**
+ * printout in prompt mode
+ * String will only be printed if prompt_mode is enabled
+ *
+ * @param f [out] output stream
+ * @param format [in] format string
+ * @param ... [in] arguments of format string
+ */
+void fprintf_p(FILE* f, const char *format, ...)
+{
+       va_list argptr;
+
+       if (!gl_prompt_mode)
+               return;
+
+       va_start(argptr, format);
+       vfprintf(f, format, argptr);
+       va_end(argptr);
+       fflush(f);
+}
diff --git a/tests/ntfsv/tet_ntf_common.h b/tests/ntfsv/tet_ntf_common.h
--- a/tests/ntfsv/tet_ntf_common.h
+++ b/tests/ntfsv/tet_ntf_common.h
@@ -129,6 +129,41 @@ typedef struct {
     unsigned int            repeateSends;
 } saNotificationParamsT;
 
+typedef enum {
+       SANTF_ALL = 0,
+       SANTF_INITIALIZE,
+       SANTF_SELECTION_OBJECT_GET,
+       SANTF_DISPATCH,
+       SANTF_FINALIZE,
+       SANTF_ALARM_NOTIFICATION_ALLOCATE,
+       SANTF_STATECHANGE_NOTIFICATION_ALLOCATE,
+       SANTF_OBJECTCREATEDELETE_NOTIFICATION_ALLOCATE,
+       SANTF_ATTRIBUTECHANGE_NOTIFICATION_ALLOCATE,
+       SANTF_NOTIFICATION_FREE,
+       SANTF_NOTIFICATION_SEND,
+       SANTF_NOTIFICATION_SUBSCRIBE,
+       SANTF_SECURITY_ALARM_NOTIFICATION_ALLOCATE,
+       SANTF_PTRVAL_ALLOCATE,
+       SANTF_ARRAYVAL_ALLOCATE,
+       SANTF_LOCALIZED_MESSAGE_GET,
+       SANTF_LOCALIZED_MESSAGE_FREE,
+       SANTF_PTRVAL_GET,
+       SANTF_ARRAYVAL_GET,
+       SANTF_OBJECTCREATEDELETE_NOTIFICATION_FILTER_ALLOCATE,
+       SANTF_ATTRIBUTECHANGE_NOTIFICATION_FILTER_ALLOCATE,
+       SANTF_STATECHANGE_NOTIFICATION_FILTER_ALLOCATE,
+       SANTF_ALARM_NOTIFICATION_FILTER_ALLOCATE,
+       SANTF_SECURITYALARM_NOTIFICATION_FILTER_ALLOCATE,
+       SANTF_NOTIFICATION_FILTER_FREE,
+       SANTF_NOTIFICATION_UNSUBSCRIBE,
+       SANTF_NOTIFICATION_READ_INITIALIZE,
+       SANTF_NOTIFICATION_READ_FINALIZE,
+       SANTF_NOTIFICATION_READ_NEXT,
+       SANTF_API_MAX
+
+} eSaNtfAPI;
+
+
 typedef SaUint16T       saNotificationFlagsT;
 extern SaNtfIdentifierT last_not_id;
 
@@ -186,6 +221,158 @@ void newNotification(
 extern SaNtfIdentifierT get_ntf_id(const SaNtfNotificationsT *notif);
 void poll_until_received(SaNtfHandleT ntfHandle, SaNtfIdentifierT wanted_id);
 
+SaAisErrorT ntftest_saNtfInitialize(SaNtfHandleT *ntfHandle, const 
SaNtfCallbacksT *ntfCallbacks, SaVersionT *version);
+SaAisErrorT ntftest_saNtfSelectionObjectGet(SaNtfHandleT ntfHandle, 
SaSelectionObjectT *selectionObject);
+SaAisErrorT ntftest_saNtfDispatch(SaNtfHandleT ntfHandle, SaDispatchFlagsT 
dispatchFlags);
+SaAisErrorT ntftest_saNtfFinalize(SaNtfHandleT ntfHandle);
+SaAisErrorT ntftest_saNtfNotificationFree(SaNtfNotificationHandleT 
notificationHandle);
+SaAisErrorT ntftest_saNtfNotificationSend(SaNtfNotificationHandleT 
notificationHandle);
+SaAisErrorT ntftest_saNtfNotificationSubscribe(const 
SaNtfNotificationTypeFilterHandlesT *notificationFilterHandles,
+                                      SaNtfSubscriptionIdT subscriptionId);
+SaAisErrorT ntftest_saNtfNotificationUnsubscribe(SaNtfSubscriptionIdT 
subscriptionId);
+SaAisErrorT 
ntftest_saNtfObjectCreateDeleteNotificationFilterAllocate(SaNtfHandleT 
ntfHandle, SaNtfObjectCreateDeleteNotificationFilterT
+                                                             
*notificationFilter, SaUint16T numEventTypes,
+                                                             SaUint16T 
numNotificationObjects,
+                                                             SaUint16T 
numNotifyingObjects,
+                                                             SaUint16T 
numNotificationClassIds,
+                                                             SaUint16T 
numSourceIndicators);
+SaAisErrorT 
ntftest_saNtfAttributeChangeNotificationFilterAllocate(SaNtfHandleT ntfHandle,
+                                                          
SaNtfAttributeChangeNotificationFilterT *notificationFilter,
+                                                          SaUint16T 
numEventTypes,
+                                                          SaUint16T 
numNotificationObjects,
+                                                          SaUint16T 
numNotifyingObjects,
+                                                          SaUint16T 
numNotificationClassIds,
+                                                          SaUint16T 
numSourceIndicators);
+SaAisErrorT ntftest_saNtfStateChangeNotificationFilterAllocate(SaNtfHandleT 
ntfHandle,
+                                                      
SaNtfStateChangeNotificationFilterT *notificationFilter,
+                                                      SaUint16T numEventTypes,
+                                                      SaUint16T 
numNotificationObjects,
+                                                      SaUint16T 
numNotifyingObjects,
+                                                      SaUint16T 
numNotificationClassIds,
+                                                      SaUint16T 
numSourceIndicators, SaUint16T numChangedStates);
+SaAisErrorT ntftest_saNtfAlarmNotificationFilterAllocate(SaNtfHandleT 
ntfHandle,
+                                                SaNtfAlarmNotificationFilterT 
*notificationFilter,
+                                                SaUint16T numEventTypes,
+                                                SaUint16T 
numNotificationObjects,
+                                                SaUint16T numNotifyingObjects,
+                                                SaUint16T 
numNotificationClassIds,
+                                                SaUint16T numProbableCauses,
+                                                SaUint16T 
numPerceivedSeverities, SaUint16T numTrends);
+SaAisErrorT ntftest_saNtfSecurityAlarmNotificationFilterAllocate(SaNtfHandleT 
ntfHandle,
+                                                        
SaNtfSecurityAlarmNotificationFilterT *notificationFilter,
+                                                        SaUint16T 
numEventTypes,
+                                                        SaUint16T 
numNotificationObjects,
+                                                        SaUint16T 
numNotifyingObjects,
+                                                        SaUint16T 
numNotificationClassIds,
+                                                        SaUint16T 
numProbableCauses,
+                                                        SaUint16T 
numSeverities,
+                                                        SaUint16T 
numSecurityAlarmDetectors,
+                                                        SaUint16T 
numServiceUsers, SaUint16T numServiceProviders);
+
+SaAisErrorT ntftest_saNtfNotificationFilterFree(SaNtfNotificationFilterHandleT 
notificationFilterHandle);
+SaAisErrorT ntftest_saNtfNotificationReadInitialize(SaNtfSearchCriteriaT 
searchCriteria,
+                                           const 
SaNtfNotificationTypeFilterHandlesT *notificationFilterHandles,
+                                           SaNtfReadHandleT *readHandle);
+
+SaAisErrorT ntftest_saNtfNotificationReadNext(SaNtfReadHandleT readHandle,
+                                     SaNtfSearchDirectionT searchDirection, 
SaNtfNotificationsT *notification);
+
+SaAisErrorT ntftest_saNtfNotificationReadFinalize(SaNtfReadHandleT readhandle);
+
+SaAisErrorT ntftest_saNtfPtrValAllocate(SaNtfNotificationHandleT 
notificationHandle,
+                               SaUint16T dataSize, void **dataPtr, SaNtfValueT 
*value);
+
+SaAisErrorT ntftest_saNtfAlarmNotificationAllocate(SaNtfHandleT ntfHandle,
+                                          SaNtfAlarmNotificationT 
*notification,
+                                          SaUint16T numCorrelatedNotifications,
+                                          SaUint16T lengthAdditionalText,
+                                          SaUint16T numAdditionalInfo,
+                                          SaUint16T numSpecificProblems,
+                                          SaUint16T numMonitoredAttributes,
+                                          SaUint16T numProposedRepairActions,
+                                          SaInt16T variableDataSize);
+
+SaAisErrorT ntftest_saNtfSecurityAlarmNotificationAllocate(SaNtfHandleT 
ntfHandle,
+                                                  
SaNtfSecurityAlarmNotificationT *notification,
+                                                  SaUint16T 
numCorrelatedNotifications,
+                                                  SaUint16T 
lengthAdditionalText,
+                                                  SaUint16T numAdditionalInfo,
+                                                  SaInt16T variableDataSize);
+
+SaAisErrorT ntftest_saNtfStateChangeNotificationAllocate(SaNtfHandleT 
ntfHandle,
+                                    SaNtfStateChangeNotificationT 
*notification,
+                                    SaUint16T numCorrelatedNotifications,
+                                    SaUint16T lengthAdditionalText,
+                                    SaUint16T numAdditionalInfo,
+                                        SaUint16T numStateChanges,
+                                        SaInt16T variableDataSize);
+
+SaAisErrorT ntftest_saNtfObjectCreateDeleteNotificationAllocate(SaNtfHandleT 
ntfHandle,
+                                           
SaNtfObjectCreateDeleteNotificationT *notification,
+                                           SaUint16T 
numCorrelatedNotifications,
+                                           SaUint16T lengthAdditionalText,
+                                           SaUint16T numAdditionalInfo,
+                                           SaUint16T numAttributes,
+                                               SaInt16T variableDataSize);
+
+SaAisErrorT ntftest_saNtfAttributeChangeNotificationAllocate(SaNtfHandleT 
ntfHandle,
+                                        SaNtfAttributeChangeNotificationT 
*notification,
+                                        SaUint16T numCorrelatedNotifications,
+                                        SaUint16T lengthAdditionalText,
+                                        SaUint16T numAdditionalInfo,
+                                        SaUint16T numAttributes,
+                                        SaInt16T variableDataSize);
+
+SaAisErrorT ntftest_saNtfAlarmNotificationFilterAllocate(SaNtfHandleT 
ntfHandle,
+                                                SaNtfAlarmNotificationFilterT 
*notificationFilter,
+                                                SaUint16T numEventTypes,
+                                                SaUint16T 
numNotificationObjects,
+                                                SaUint16T numNotifyingObjects,
+                                                SaUint16T 
numNotificationClassIds,
+                                                SaUint16T numProbableCauses,
+                                                SaUint16T 
numPerceivedSeverities,
+                                                SaUint16T numTrends);
+
+SaAisErrorT ntftest_saNtfSecurityAlarmNotificationFilterAllocate(SaNtfHandleT 
ntfHandle,
+                                                        
SaNtfSecurityAlarmNotificationFilterT *notificationFilter,
+                                                        SaUint16T 
numEventTypes,
+                                                        SaUint16T 
numNotificationObjects,
+                                                        SaUint16T 
numNotifyingObjects,
+                                                        SaUint16T 
numNotificationClassIds,
+                                                        SaUint16T 
numProbableCauses,
+                                                        SaUint16T 
numSeverities,
+                                                        SaUint16T 
numSecurityAlarmDetectors,
+                                                        SaUint16T 
numServiceUsers,
+                                                        SaUint16T 
numServiceProviders);
+
+SaAisErrorT ntftest_saNtfStateChangeNotificationFilterAllocate(SaNtfHandleT 
ntfHandle,
+                                                      
SaNtfStateChangeNotificationFilterT *notificationFilter,
+                                                      SaUint16T numEventTypes,
+                                                      SaUint16T 
numNotificationObjects,
+                                                      SaUint16T 
numNotifyingObjects,
+                                                      SaUint16T 
numNotificationClassIds,
+                                                      SaUint16T 
numSourceIndicators,
+                                                          SaUint16T 
numChangedStates);
+
+SaAisErrorT 
ntftest_saNtfObjectCreateDeleteNotificationFilterAllocate(SaNtfHandleT 
ntfHandle,
+                                                               
SaNtfObjectCreateDeleteNotificationFilterT *notificationFilter,
+                                                               SaUint16T 
numEventTypes,
+                                                           SaUint16T 
numNotificationObjects,
+                                                           SaUint16T 
numNotifyingObjects,
+                                                           SaUint16T 
numNotificationClassIds,
+                                                           SaUint16T 
numSourceIndicators);
+
+SaAisErrorT 
ntftest_saNtfAttributeChangeNotificationFilterAllocate(SaNtfHandleT ntfHandle,
+                                                          
SaNtfAttributeChangeNotificationFilterT *notificationFilter,
+                                                          SaUint16T 
numEventTypes,
+                                                          SaUint16T 
numNotificationObjects,
+                                                          SaUint16T 
numNotifyingObjects,
+                                                          SaUint16T 
numNotificationClassIds,
+                                                          SaUint16T 
numSourceIndicators);
+
+void fprintf_v(FILE*, const char *format, ...);
+void fprintf_t(FILE*, const char *format, ...);
+void fprintf_p(FILE*, const char *format, ...);
 
 extern void assertvalue_impl(__const char *__assertion, __const char *__file,
                   unsigned int __line, __const char *__function);
diff --git a/tests/ntfsv/tet_ntf_main.c b/tests/ntfsv/tet_ntf_main.c
--- a/tests/ntfsv/tet_ntf_main.c
+++ b/tests/ntfsv/tet_ntf_main.c
@@ -28,7 +28,10 @@ SaAisErrorT rc = SA_AIS_OK;
 SaNtfHandleT ntfHandle = 0;
 SaNtfCallbacksT ntfCallbacks = {NULL, NULL};
 SaSelectionObjectT selectionObject;
-int verbose = 0;
+extern void add_scOutage_reinitializeHandle_test(void);
+extern int verbose;
+extern int gl_tag_mode;
+extern int gl_prompt_mode;
 
 struct tet_testlist
 {
@@ -36,29 +39,151 @@ struct tet_testlist
     int icref;
     int tpnum;
 };
+static void print_usage(void)
+{
+       printf("\nNAME\n");
+       printf("\nntftest - Test NTF service\n");
+
+       printf("\nSYNOPSIS\n");
+       printf("\t ntftest [options]\n");
+
+       printf( "\nDESCRIPTION\n");
+       printf( "\t Run test suite or single test case for NTF service.\n"
+                       "\t Tests include automatic and manual tests. If 
ntftest\n"
+                       "\t is used with option -e, only manual test will be \n"
+                       "\t executed. Otherwise, automatic test will be 
executed\n"
+                       "\t It is also possible to run one test case, one 
test\n"
+                       "\t suite or all test suites.\n");
+
+
+       printf("\nOPTIONS\n");
+
+       printf( "  '0'\t\t List all automatic test cases. No test case\n"
+                       "  \t\t is executed.\n");
+       printf( "  -l\t\t List all automatic and manual test cases \n");
+       printf( "  -e <s> [t]\t Run manual test case 't' in suite 's'\n");
+       printf( "  <s> [t]\t Run automatic test case 't' in suite 's'\n");
+
+       printf( "  \t\t In both cases of with or without -e, if 't' is\n"
+                       "  \t\t omitted, all test cases in suite 's' will 
be\n");
+       printf( "  \t\t run. If both 's' and 't' are omitted, all test\n");
+       printf( "  \t\t suites of manual tests will only be run. EX:\n");
+       printf( "  \t\t ntftest 1       Run test suite 1\n"
+               "  \t\t ntftest 1 1     Run test case 1 in suite 1\n"
+               "  \t\t ntftest -e 37   Run test suite 37\n"
+                       "  \t\t ntftest -e 37 1 Run test case 1 of suite 37\n"
+                       "  \t\t ntftest \t Run all automatic test suites\n");
+       printf( "  -v\t\t Activate verbose printing (applicable for \n"
+                       "  \t\t some test cases)\n");
+
+       printf( "\n");
+       printf( "  The following options can only be used together with 
option\n");
+       printf( "  -e. Running manual test case requires interaction from 
tester\n");
+       printf( "  or external test program. That means ntftest needs to 
inform\n");
+       printf( "  the next step to be executed.\n");
+       printf( "\n");
+
+       printf( "  -p\t\t Activate prompt mode. EX: ntftest prints out a\n"
+                       "  \t\t message to manually start/stop SC, or press 
'key'\n"
+                       "  \t\t to continue the test,...\n");
+
+       printf( "  -t\t\t Activate tag mode. A tag is a short and \n"
+                       "  \t\t CONSISTENT string that is printed to inform \n"
+                       "  \t\t external test programs to take appropriate \n"
+                       "  \t\t actions. EX:\n"
+                       "  \t\t - \"TAG_ND\" means the test case asks the SCs 
to\n"
+                       "  \t\t be stopped, and external test programs send 
USR2\n"
+                       "  \t\t to continue test case after successfully stop 
SCs.\n"
+                       "  \t\t - \"TAG_UP\" means the test case waits for the 
SCs \n"
+                       "  \t\t starting up, and external test programs send 
USR2\n"
+                       "  \t\t to continue test case after successfully start 
SCs.\n");
+       printf( "  -h\t\t This help\n");
+       printf( "\n");
+}
+
+static void err_exit(void)
+{
+       print_usage();
+       exit(1);
+}
 
 int main(int argc, char **argv)
 {
-    int suite = -1, tcase = -1;
+    int suite = ALL_SUITES, tcase = ALL_TESTS;
+       int option = 0;
+       int extendedTest = 0;
 
     srandom(getpid());
 
-    if (argc > 1)
-    {
-        suite = atoi(argv[1]);
-    }
+    verbose = 0;
+    gl_tag_mode = 0;
+    gl_prompt_mode = 0;
+       /* Check option */
+       char optstr[] ="hle:vpt";
 
-    if (argc > 2)
-    {
-        tcase = atoi(argv[2]);
-    }
+       if (argc >= 1) {
+               while ((option = getopt(argc, argv, optstr)) != -1) {
+                       switch (option) {
+                       case 'h':
+                               print_usage();
+                               exit(0);
+                       case 'l':
+                               add_scOutage_reinitializeHandle_test();
+                               test_list();
+                               exit(0);
+                       case 'v':
+                               verbose = 1;
+                               gl_prompt_mode = 1;
+                               gl_tag_mode = 1;
+                               break;
+                       case 't':
+                               // Can't use with prompt mode or verbose
+                               if (gl_prompt_mode == 1 || verbose == 1)
+                                       err_exit();
 
-    if (suite == 0)
-    {
-        test_list();
-        return 0;
-    }
+                               gl_tag_mode = 1;
+                               break;
+                       case 'p':
+                               // Can't use with tag mode
+                               if (gl_tag_mode == 1)
+                                       err_exit();
+                               gl_prompt_mode = 1;
+                               break;
+                       case 'e':
+                               if (argv[optind-1] != NULL) {
+                                       suite = atoi(argv[optind-1]);
+                                       extendedTest = 1;
+                                       add_scOutage_reinitializeHandle_test();
+                               } else
+                                       err_exit();
+                               if (optind < argc && argv[optind] != NULL)
+                                       tcase = atoi(argv[optind]);
 
+                               break;
+                       }
+               }
+       }
+
+       // Can't run -t/-p without -e
+       if (!extendedTest && (gl_prompt_mode == 1 || gl_tag_mode == 1))
+               err_exit();
+
+       // If none of modes is set with -e, prompt is chosen
+       if (extendedTest && gl_prompt_mode == 0 && gl_tag_mode == 0)
+               gl_prompt_mode = 1;
+
+       if (!extendedTest) {
+               if (argc > 1)
+                       suite = atoi(argv[1]);
+
+               if (argc > 2)
+                       tcase = atoi(argv[2]);
+
+               if (suite == 0) {
+                       test_list();
+                       return 0;
+               }
+       }
     return test_run(suite, tcase);
 
 }
diff --git a/tests/ntfsv/tet_scOutage_reinitializeHandle.c 
b/tests/ntfsv/tet_scOutage_reinitializeHandle.c
new file mode 100644
--- /dev/null
+++ b/tests/ntfsv/tet_scOutage_reinitializeHandle.c
@@ -0,0 +1,1021 @@
+/*       -*- OpenSAF  -*-
+ *
+ * (C) Copyright 2009 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 <utest.h>
+#include <util.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <signal.h>
+#include <poll.h>
+#include <pthread.h>
+#include "tet_ntf.h"
+#include "tet_ntf_common.h"
+#define NTF_REST_MAX_IDS 30
+#define DEFAULT_UNEXT_NAME_STRING "This is unextended SaNameT string (<256)"
+#define TST_TAG_ND "\nTAG_ND\n"        /* Tag for take SC nodes down */
+#define TST_TAG_NU "\nTAG_NU\n"        /* Tag for start SC nodes */
+
+struct not_idsT {
+       int length;
+       SaNtfIdentifierT ids[NTF_REST_MAX_IDS];
+};
+
+struct saNtfAPIName{
+       eSaNtfAPI apiNo;
+       const char* apiName;
+};
+static struct saNtfAPIName ntf_api_name_list[SANTF_API_MAX] = {
+       { SANTF_ALL, "all API" },
+       { SANTF_INITIALIZE, "saNtfInitialize"  },
+       { SANTF_SELECTION_OBJECT_GET, "saNtfSelectionObjectGet"  },
+       { SANTF_DISPATCH, "saNtfDispatch"  },
+       { SANTF_FINALIZE, "saNtfFinalize"  },
+       { SANTF_ALARM_NOTIFICATION_ALLOCATE, "saNtfAlarmNotificationAllocate"  
},
+       { SANTF_STATECHANGE_NOTIFICATION_ALLOCATE, 
"saNtfStateChangeNotificationAllocate"  },
+       { SANTF_OBJECTCREATEDELETE_NOTIFICATION_ALLOCATE, 
"saNtfObjectCreateDeleteNotificationAllocate"  },
+       { SANTF_ATTRIBUTECHANGE_NOTIFICATION_ALLOCATE, 
"saNtfAttributeChangeNotificationAllocate"  },
+       { SANTF_NOTIFICATION_FREE, "saNtfNotificationFree"  },
+       { SANTF_NOTIFICATION_SEND, "saNtfNotificationSend"  },
+       { SANTF_NOTIFICATION_SUBSCRIBE, "saNtfNotificationSubscribe"  },
+       { SANTF_SECURITY_ALARM_NOTIFICATION_ALLOCATE, 
"saNtfSecurityAlarmNotificationAllocate"  },
+       { SANTF_PTRVAL_ALLOCATE, "saNtfPtrValAllocate"  },
+       { SANTF_ARRAYVAL_ALLOCATE, "saNtfArrayValAllocate"  },
+       { SANTF_LOCALIZED_MESSAGE_GET, "saNtfLocalizedMessageGet"  },
+       { SANTF_LOCALIZED_MESSAGE_FREE, "saNtfLocalizedMessageFree"  },
+       { SANTF_PTRVAL_GET, "saNtfPtrGet"  },
+       { SANTF_ARRAYVAL_GET, "saNtfArrayGet"  },
+       { SANTF_OBJECTCREATEDELETE_NOTIFICATION_FILTER_ALLOCATE, 
"saNtfObjectCreateDeleteNotificationFilterAllocate"  },
+       { SANTF_ATTRIBUTECHANGE_NOTIFICATION_FILTER_ALLOCATE, 
"saNtfAttributeChangeNotificationFilterAllocate"  },
+       { SANTF_STATECHANGE_NOTIFICATION_FILTER_ALLOCATE, 
"saNtfStateChangeNotificationFilterAllocate"  },
+       { SANTF_ALARM_NOTIFICATION_FILTER_ALLOCATE, 
"saNtfAlarmNotificationFilterAllocate"  },
+       { SANTF_SECURITYALARM_NOTIFICATION_FILTER_ALLOCATE, 
"saNtfSecurityAlarmNotificationFilterAllocate"  },
+       { SANTF_NOTIFICATION_FILTER_FREE, "saNtfNotificationFilterFree"  },
+       { SANTF_NOTIFICATION_UNSUBSCRIBE, "saNtfNotificationUnsubscribe"  },
+       { SANTF_NOTIFICATION_READ_INITIALIZE, "saNtfNotificationReadInitialize" 
 },
+       { SANTF_NOTIFICATION_READ_FINALIZE, "saNtfNotificationReadFinalize"  },
+       { SANTF_NOTIFICATION_READ_NEXT, "saNtfNotificationReadNext"  }
+};
+
+static struct not_idsT received_ok_ids = {0,};
+static struct not_idsT sent_ok_ids = {0,};
+
+static SaNtfNotificationTypeFilterHandlesT myNotificationFilterHandles;
+
+/* Used to keep track of which ntf we got */
+static SaNtfNotificationTypeFilterHandlesT ntfRecieved;
+
+static int glob_errors;
+static SaNtfSubscriptionIdT subscriptionId;
+static SaNtfAlarmNotificationT myAlarmNotification;
+static SaNtfNotificationTypeFilterHandlesT myNotificationFilterHandles;
+static SaNtfObjectCreateDeleteNotificationT myObjCrDelNotification;
+static SaNtfAttributeChangeNotificationT myAttrChangeNotification;
+static SaNtfStateChangeNotificationT myStateChangeNotification;
+static SaNtfSecurityAlarmNotificationT mySecAlarmNotification;
+
+bool gl_suspending = true;
+
+
+static void sigusr2_handler(int sig)
+{
+       if (gl_suspending)
+               gl_suspending = false;
+}
+
+/**
+ * Store all recieved notificationIds
+ */
+static void ntf_id_store(SaNtfIdentifierT n_id)
+{
+       assert(NTF_REST_MAX_IDS > received_ok_ids.length);
+       received_ok_ids.ids[received_ok_ids.length++] = n_id;
+}
+
+/**
+ * Post process all recived notificationIds towards the ids that
+ * are expected to be received.
+ */
+static SaAisErrorT check_errors()
+{
+       int i, j, found;
+       int rcv_notif_counter;
+       int errors = 0;
+       SaAisErrorT rc = SA_AIS_OK;
+       rcv_notif_counter = 0;
+       for (i = 0; i < received_ok_ids.length; i++) {
+               found = 0;
+               for (j= 0; j< sent_ok_ids.length; j++) {
+                       if (received_ok_ids.ids[i] == sent_ok_ids.ids[j]){
+                               found = 1;
+                               rcv_notif_counter++;
+                               break;
+                       }
+               }
+               if(!found)
+                       errors++;
+       }
+       if (rcv_notif_counter == sent_ok_ids.length)
+               errors = 0;
+       glob_errors += errors;
+       if(glob_errors) {
+               rc = SA_AIS_ERR_FAILED_OPERATION;
+               fprintf_v(stdout, "num of failed notifications: %d\n", 
glob_errors);
+       }
+       return rc;
+}
+
+void saferror(SaAisErrorT rc, SaAisErrorT exp)
+{
+       if (rc != exp)
+               glob_errors++;
+}
+
+static void resetCounters()
+{
+       glob_errors = 0;
+       received_ok_ids.length = 0;
+       sent_ok_ids.length = 0;
+       ntfRecieved.alarmFilterHandle = 0;
+       ntfRecieved.attributeChangeFilterHandle = 0;
+       ntfRecieved.objectCreateDeleteFilterHandle = 0;
+       ntfRecieved.securityAlarmFilterHandle = 0;
+       ntfRecieved.stateChangeFilterHandle = 0;
+}
+
+/**
+ * Verify the contents in the notification.
+ * We use the myNotificationFilterHandles to know which notifications to 
expect.
+ */
+static void saNtfNotificationCallbackT(
+       SaNtfSubscriptionIdT subscriptionId,
+       const SaNtfNotificationsT *notification)
+{
+       SaNtfNotificationHandleT notificationHandle = 0;
+       switch(notification->notificationType)
+       {
+               case SA_NTF_TYPE_OBJECT_CREATE_DELETE:
+                       notificationHandle = 
notification->notification.objectCreateDeleteNotification.notificationHandle;
+                       ntfRecieved.objectCreateDeleteFilterHandle += 1;
+
+                               fprintf_v(stdout, "\n Received 
notificationCallback: notifType:%d, notifId:%d", 
(int)notification->notificationType,
+                                               
(int)*notification->notification.objectCreateDeleteNotification.notificationHeader.notificationId);
+
+                       
if(myNotificationFilterHandles.objectCreateDeleteFilterHandle == 0)
+                               glob_errors +=1;
+                       else
+                               
ntf_id_store(*notification->notification.objectCreateDeleteNotification.notificationHeader.notificationId);
+                       break;
+
+               case SA_NTF_TYPE_ATTRIBUTE_CHANGE:
+                       notificationHandle = 
notification->notification.attributeChangeNotification.notificationHandle;
+                       ntfRecieved.attributeChangeFilterHandle += 1;
+
+                       fprintf_v(stdout, "\n Received notificationCallback: 
notifType:%d, notifId:%d", (int)notification->notificationType,
+                                               
(int)*notification->notification.attributeChangeNotification.notificationHeader.notificationId);
+
+                       
if(myNotificationFilterHandles.attributeChangeFilterHandle == 0)
+                               glob_errors += 1;
+                       else
+                                
ntf_id_store(*notification->notification.attributeChangeNotification.notificationHeader.notificationId);
+                       break;
+
+               case SA_NTF_TYPE_STATE_CHANGE:
+                       notificationHandle = 
notification->notification.stateChangeNotification.notificationHandle;
+                       ntfRecieved.stateChangeFilterHandle += 1;
+
+                       fprintf_v(stdout, "\n Received notificationCallback: 
notifType:%d, notifId:%d", (int)notification->notificationType,
+                                               
(int)*notification->notification.stateChangeNotification.notificationHeader.notificationId);
+
+                       if(myNotificationFilterHandles.stateChangeFilterHandle 
== 0)
+                               glob_errors += 1;
+                       else
+                               
ntf_id_store(*notification->notification.stateChangeNotification.notificationHeader.notificationId);
+                       break;
+
+               case SA_NTF_TYPE_ALARM:
+                       notificationHandle = 
notification->notification.alarmNotification.notificationHandle;
+                       ntfRecieved.alarmFilterHandle += 1;
+
+                       fprintf_v(stdout, "\n Received notificationCallback: 
notifType:%d, notifId:%d", (int)notification->notificationType,
+                                               
(int)*notification->notification.alarmNotification.notificationHeader.notificationId);
+
+                       if(myNotificationFilterHandles.alarmFilterHandle == 0) {
+                               glob_errors +=1;
+                       } else
+                               
ntf_id_store(*notification->notification.alarmNotification.notificationHeader.notificationId);
+                       break;
+
+               case SA_NTF_TYPE_SECURITY_ALARM:
+                       notificationHandle = 
notification->notification.securityAlarmNotification.notificationHandle;
+                       ntfRecieved.securityAlarmFilterHandle += 1;
+
+                       fprintf_v(stdout, "\n Received notificationCallback: 
notifType:%d, notifId:%d", (int)notification->notificationType,
+                                               
(int)*notification->notification.securityAlarmNotification.notificationHeader.notificationId);
+
+                       
if(myNotificationFilterHandles.securityAlarmFilterHandle == 0)
+                               glob_errors += 1;
+                       else
+                               
ntf_id_store(*notification->notification.securityAlarmNotification.notificationHeader.notificationId);
+                       break;
+
+               default:
+                       glob_errors +=1;
+                       assert(0);
+                       break;
+       }
+       last_not_id = get_ntf_id(notification);
+       if (notificationHandle != 0)
+               saferror(saNtfNotificationFree(notificationHandle), SA_AIS_OK);
+}
+
+/*
+ * Loop of reading key press, stop if 'n+Enter'. Sleep 1 between reading key
+ */
+static void *nonblk_io_getchar()
+{
+       while (gl_suspending) {
+               int c = getchar();
+               if (c == 'n')
+                       gl_suspending = false;
+               else
+                       sleep(1);
+       }
+       return NULL;
+}
+
+/*
+ * Wait for both controllers UP(wished_scs_state=1) or DOWN(wished_scs_state=2)
+ * Once bring up/down controllers, tester press 'n' or send USR2 to ntftest to
+ * continue the test
+ */
+void wait_controllers(int wished_scs_state)
+{
+       int i = 0;
+       pthread_t thread_id;
+       gl_suspending = true;
+       /* print slogan */
+       if (wished_scs_state == 1) {
+               fprintf_p(stdout, "\nNext: manually START both SCs(in UML env. 
./opensaf nodestart <1|2>)");
+               fprintf_t(stdout, TST_TAG_NU);
+       } else if (wished_scs_state == 2) {
+               fprintf_p(stdout, "\nNext: manually STOP both SCs(in UML env. 
./opensaf nodestop <1|2>)");
+               fprintf_t(stdout, TST_TAG_ND);
+       } else {
+               fprintf_p(stderr, "wrong value wished_scs_state:%d\n", 
wished_scs_state);
+               exit(EXIT_FAILURE);
+       }
+
+       /* start non-blocking io thread */
+       if (pthread_create(&thread_id, NULL, nonblk_io_getchar, NULL) != 0) {
+               fprintf_p(stderr, "%d, %s; pthread_create FAILED: 
%s\n",__LINE__,
+                       __FUNCTION__, strerror(errno));
+               exit(EXIT_FAILURE);
+       }
+       fprintf_p(stdout, "\nThen press 'n' and 'Enter' (or 'pkill -USR2 
ntftest') to continue. Waiting ...\n");
+       while (gl_suspending) {
+               i++;
+               i = i % 20;
+               i > 0 ? fprintf_p(stdout, ".") : fprintf_p(stdout, "\n");
+               fflush(stdout);
+               sleep(1);
+       }
+}
+
+static SaNtfCallbacksT ntfCbTest = {
+       saNtfNotificationCallbackT,
+       NULL
+};
+
+void fillCommonNotifHeader(SaNtfNotificationHeaderT *head) {
+       int i;
+
+       head->notificationObject->length =
+               strlen(DEFAULT_NOTIFICATION_OBJECT);
+       (void)memcpy(head->notificationObject->value,
+                       DEFAULT_NOTIFICATION_OBJECT,
+                       head->notificationObject->length);
+
+       head->notifyingObject->length =
+               strlen(DEFAULT_NOTIFYING_OBJECT);
+       (void)memcpy(head->notifyingObject->value,
+                       DEFAULT_NOTIFYING_OBJECT,
+                       head->notifyingObject->length);
+       head->notificationClassId->vendorId = ERICSSON_VENDOR_ID;
+       head->notificationClassId->majorId = 92;
+       head->notificationClassId->minorId = 12;
+
+       /* set additional text */
+    (void)strncpy(head->additionalText,
+               DEFAULT_ADDITIONAL_TEXT,
+               (SaUint16T)(strlen(DEFAULT_ADDITIONAL_TEXT) + 1));
+
+    for (i = 0; i < head->numCorrelatedNotifications; i++)
+    {
+       head->correlatedNotifications[i] = (SaNtfIdentifierT) (i + 400);
+    }
+
+    for (i = 0; i < head->numAdditionalInfo; i++)
+    {
+       head->additionalInfo[i].infoId = i;
+       head->additionalInfo[i].infoType = SA_NTF_VALUE_INT32;
+       head->additionalInfo[i].infoValue.int32Val = 444 + i;
+    }
+}
+
+void fillCommonFilterHeader(SaNtfNotificationFilterHeaderT *head)
+{
+       assert(head->numEventTypes == 1);
+       assert(head->numNotificationClassIds == 1);
+       assert(head->numNotificationObjects == 1);
+       assert(head->numNotifyingObjects == 1);
+
+       head->notificationObjects[0].length = 
strlen(DEFAULT_NOTIFICATION_OBJECT);
+       memcpy(head->notificationObjects[0].value, DEFAULT_NOTIFICATION_OBJECT, 
head->notificationObjects[0].length);
+
+       head->notifyingObjects[0].length = strlen(DEFAULT_NOTIFYING_OBJECT);
+       memcpy(head->notifyingObjects[0].value, DEFAULT_NOTIFYING_OBJECT, 
head->notifyingObjects[0].length);
+
+       head->notificationClassIds[0].vendorId = ERICSSON_VENDOR_ID;
+       head->notificationClassIds[0].majorId = 92;
+       head->notificationClassIds[0].minorId = 12;
+}
+
+SaAisErrorT scoutage_saNtfPtrValAllocate(SaNtfNotificationHeaderT *head, 
SaNtfNotificationHandleT notHandle)
+{
+       int i;
+       SaStringT dest_ptr;
+       SaNameT name;
+       SaAisErrorT ret;
+
+       head->notificationClassId->vendorId = ERICSSON_VENDOR_ID;
+       head->notificationClassId->majorId = 92;
+       head->notificationClassId->minorId = 12;
+
+       /* set additional text */
+       (void)strncpy(head->additionalText,
+                       DEFAULT_ADDITIONAL_TEXT,
+                       (SaUint16T)(strlen(DEFAULT_ADDITIONAL_TEXT) + 1));
+
+       for (i = 0; i < head->numCorrelatedNotifications; i++)
+               head->correlatedNotifications[i] = (SaNtfIdentifierT) (i + 400);
+
+       // Fill first additionalInfo as extended SaNameT including NULL 
character
+       head->additionalInfo[0].infoType = SA_NTF_VALUE_LDAP_NAME;
+       head->additionalInfo[0].infoId = 1;
+
+       name.length = strlen(DEFAULT_UNEXT_NAME_STRING);
+       (void)memcpy(name.value, DEFAULT_UNEXT_NAME_STRING,     name.length);
+
+       ret = ntftest_saNtfPtrValAllocate(notHandle,
+                               sizeof(name) + 1,
+                               (void**)&dest_ptr,
+                               &(head->additionalInfo[0].infoValue));
+       if (ret == SA_AIS_OK)
+               memcpy(dest_ptr, &name, sizeof(name));
+
+       return ret;
+}
+
+SaAisErrorT scoutage_saNtfAlarmNotificationAllocate(SaNtfHandleT ntf_handle,
+                                                                       
SaNtfAlarmNotificationT* alarmNotification)
+{
+       SaNtfNotificationHeaderT *head = &alarmNotification->notificationHeader;
+       SaAisErrorT rc;
+       rc = ntftest_saNtfAlarmNotificationAllocate(
+                       ntf_handle,
+                       alarmNotification,
+                       0,
+                       (SaUint16T)(strlen(DEFAULT_ADDITIONAL_TEXT) + 1),
+                       1,
+                       0,
+                       0,
+                       0,
+                       SA_NTF_ALLOC_SYSTEM_LIMIT);
+       if (rc == SA_AIS_OK) {
+               /* Fill alarm info */
+               fillCommonNotifHeader(head);
+               *(head->eventType) = SA_NTF_ALARM_COMMUNICATION;
+               *(head->eventTime) = SA_TIME_UNKNOWN;
+               *(alarmNotification->perceivedSeverity) = 
SA_NTF_SEVERITY_WARNING;
+               *(alarmNotification->probableCause) = SA_NTF_BANDWIDTH_REDUCED;
+               *(alarmNotification->trend) = SA_NTF_TREND_MORE_SEVERE;
+
+               alarmNotification->thresholdInformation->thresholdValueType = 
SA_NTF_VALUE_UINT32;
+               
alarmNotification->thresholdInformation->thresholdValue.uint32Val = 600;
+               
alarmNotification->thresholdInformation->thresholdHysteresis.uint32Val = 100;
+               
alarmNotification->thresholdInformation->observedValue.uint32Val = 567;
+               alarmNotification->thresholdInformation->armTime = 
SA_TIME_UNKNOWN;
+       }
+
+       return rc;
+}
+
+SaAisErrorT scoutage_saNtfSecurityAlarmNotificationAllocate(SaNtfHandleT 
ntf_handle,
+                                                               
SaNtfSecurityAlarmNotificationT* secAlarm_notification)
+{
+       SaNtfNotificationHeaderT *head = 
&secAlarm_notification->notificationHeader;
+       SaAisErrorT rc;
+       rc = ntftest_saNtfSecurityAlarmNotificationAllocate(
+                       ntf_handle,
+                       secAlarm_notification,
+                       1,
+                       (SaUint16T)(strlen(DEFAULT_ADDITIONAL_TEXT)+1),
+                       1,
+                       SA_NTF_ALLOC_SYSTEM_LIMIT);
+       if (rc == SA_AIS_OK) {
+               /* Fill sec alarm info */
+               fillCommonNotifHeader(head);
+               *(head->eventType) = SA_NTF_OPERATION_VIOLATION;
+               *(head->eventTime) = SA_TIME_UNKNOWN;
+               *(secAlarm_notification->severity) = SA_NTF_SEVERITY_MAJOR;
+
+               *(secAlarm_notification->probableCause)  = 
SA_NTF_AUTHENTICATION_FAILURE;
+
+               secAlarm_notification->serviceUser->valueType = 
SA_NTF_VALUE_INT32;
+               secAlarm_notification->serviceUser->value.int32Val = 468;
+
+               secAlarm_notification->serviceProvider->valueType = 
SA_NTF_VALUE_INT32;
+               secAlarm_notification->serviceProvider->value.int32Val = 789;
+
+               secAlarm_notification->securityAlarmDetector->valueType = 
SA_NTF_VALUE_UINT64;
+               secAlarm_notification->securityAlarmDetector->value.uint64Val = 
123412341234llu;
+       }
+
+       return rc;
+}
+
+SaAisErrorT scoutage_saNtfStateChangeNotificationAllocate(SaNtfHandleT 
ntf_handle,
+                                                               
SaNtfStateChangeNotificationT* stateChange_notification)
+{
+       SaNtfNotificationHeaderT *head = 
&stateChange_notification->notificationHeader;
+       SaAisErrorT rc;
+       rc = ntftest_saNtfStateChangeNotificationAllocate(
+                       ntf_handle,
+                       stateChange_notification,
+                       1,
+                       (SaUint16T)(strlen(DEFAULT_ADDITIONAL_TEXT)+1),
+                       1,
+                       2,
+                       SA_NTF_ALLOC_SYSTEM_LIMIT);
+       if (rc == SA_AIS_OK) {
+               /* Fill sec alarm info */
+               fillCommonNotifHeader(head);
+               *(head->eventType) = SA_NTF_OBJECT_STATE_CHANGE;
+               *(head->eventTime) = SA_TIME_UNKNOWN;
+               *(stateChange_notification->sourceIndicator) = 
SA_NTF_OBJECT_OPERATION;
+
+               stateChange_notification->changedStates[0].stateId = 2;
+               stateChange_notification->changedStates[0].oldStatePresent = 
SA_TRUE;
+               stateChange_notification->changedStates[0].newState = 3;
+               stateChange_notification->changedStates[0].oldState = 5;
+
+               stateChange_notification->changedStates[1].stateId = 77;
+               stateChange_notification->changedStates[1].oldStatePresent = 
SA_TRUE;
+               stateChange_notification->changedStates[1].oldState = 78;
+               stateChange_notification->changedStates[1].newState = 79;
+       }
+
+       return rc;
+}
+
+SaAisErrorT scoutage_saNtfObjectCreateDeleteNotificationAllocate(SaNtfHandleT 
ntf_handle,
+                                                               
SaNtfObjectCreateDeleteNotificationT* objCreateDelete_notification)
+{
+       SaNtfNotificationHeaderT *head = 
&objCreateDelete_notification->notificationHeader;
+       SaAisErrorT rc;
+       rc = ntftest_saNtfObjectCreateDeleteNotificationAllocate(
+                       ntf_handle,
+                       objCreateDelete_notification,
+                       0,
+                       (SaUint16T)(sizeof(DEFAULT_ADDITIONAL_TEXT) +1),
+                       0,
+                       2,
+                       SA_NTF_ALLOC_SYSTEM_LIMIT);
+       if (rc == SA_AIS_OK) {
+               /* Set objectAttibutes */
+               fillCommonNotifHeader(head);
+               *(head->eventType) = SA_NTF_OBJECT_CREATION;
+               *(head->eventTime) = SA_TIME_UNKNOWN;
+
+               objCreateDelete_notification->objectAttributes[0].attributeId = 
0;
+               objCreateDelete_notification->objectAttributes[0].attributeType 
= SA_NTF_VALUE_INT32;
+               
objCreateDelete_notification->objectAttributes[0].attributeValue.int32Val = 1;
+               objCreateDelete_notification->objectAttributes[1].attributeId = 
1;
+               objCreateDelete_notification->objectAttributes[1].attributeType 
= SA_NTF_VALUE_INT32;
+               
objCreateDelete_notification->objectAttributes[1].attributeValue.int32Val = 2;
+       }
+
+       return rc;
+}
+
+SaAisErrorT scoutage_saNtfAttributeChangeNotificationAllocate(SaNtfHandleT 
ntf_handle,
+                                                               
SaNtfAttributeChangeNotificationT* attrChange_notification)
+{
+       SaNtfNotificationHeaderT *head = 
&attrChange_notification->notificationHeader;
+       SaAisErrorT rc;
+       rc = ntftest_saNtfAttributeChangeNotificationAllocate(
+                       ntf_handle,
+                       attrChange_notification,
+                       1,
+                       (SaUint16T)(strlen(DEFAULT_ADDITIONAL_TEXT)+1),
+                       1,
+                       2,
+                       SA_NTF_ALLOC_SYSTEM_LIMIT);
+       if (rc == SA_AIS_OK) {
+               /* Set objectAttibutes */
+               fillCommonNotifHeader(head);
+               *(head->eventType) = SA_NTF_ATTRIBUTE_CHANGED;
+               *(head->eventTime) = SA_TIME_UNKNOWN;
+               attrChange_notification->changedAttributes[0].attributeId = 1;
+               attrChange_notification->changedAttributes[0].attributeType = 
SA_NTF_VALUE_INT32;
+               
attrChange_notification->changedAttributes[0].newAttributeValue.int32Val = 32;
+               
attrChange_notification->changedAttributes[0].oldAttributePresent = SA_TRUE;
+               
attrChange_notification->changedAttributes[0].oldAttributeValue.int32Val = 33;
+
+               attrChange_notification->changedAttributes[1].attributeId = 2;
+               attrChange_notification->changedAttributes[1].attributeType = 
SA_NTF_VALUE_INT16;
+               
attrChange_notification->changedAttributes[1].newAttributeValue.int16Val = 4;
+               
attrChange_notification->changedAttributes[1].oldAttributePresent = SA_TRUE;
+               
attrChange_notification->changedAttributes[1].oldAttributeValue.int16Val = 44;
+       }
+       return rc;
+}
+
+SaAisErrorT scoutage_saNtfAlarmNotificationFilterAllocate(SaNtfHandleT 
ntf_handle,
+                                                                       
SaNtfAlarmNotificationFilterT* alarm_filter)
+{
+       SaAisErrorT rc = SA_AIS_OK;
+       rc = ntftest_saNtfAlarmNotificationFilterAllocate(ntf_handle, 
alarm_filter,     1, 1, 1, 1, 0, 0, 0);
+       if (rc == SA_AIS_OK) {
+               fillCommonFilterHeader(&alarm_filter->notificationFilterHeader);
+               alarm_filter->notificationFilterHeader.eventTypes[0] = 
SA_NTF_ALARM_COMMUNICATION;
+       }
+       return rc;
+}
+
+SaAisErrorT scoutage_saNtfSecurityAlarmNotificationFilterAllocate(SaNtfHandleT 
ntf_handle,
+                                                                       
SaNtfSecurityAlarmNotificationFilterT* secAlarm_filter)
+{
+       SaAisErrorT rc = SA_AIS_OK;
+       rc = ntftest_saNtfSecurityAlarmNotificationFilterAllocate(ntf_handle, 
secAlarm_filter, 0, 0, 0, 0, 1, 0, 0, 0, 0);
+       if (rc == SA_AIS_OK) {
+               secAlarm_filter->probableCauses[0] = 
SA_NTF_AUTHENTICATION_FAILURE;
+       }
+       return rc;
+}
+
+SaAisErrorT scoutage_saNtfStateChangeNotificationFilterAllocate(SaNtfHandleT 
ntf_handle,
+                                                                       
SaNtfStateChangeNotificationFilterT* stateChange_filter)
+{
+       SaAisErrorT rc = SA_AIS_OK;
+       rc = ntftest_saNtfStateChangeNotificationFilterAllocate(ntf_handle, 
stateChange_filter, 1, 1, 1, 1, 1, 0);
+       if (rc == SA_AIS_OK) {
+               
fillCommonFilterHeader(&stateChange_filter->notificationFilterHeader);
+               stateChange_filter->sourceIndicators[0] = 
SA_NTF_OBJECT_OPERATION;
+               stateChange_filter->notificationFilterHeader.eventTypes[0] = 
SA_NTF_OBJECT_STATE_CHANGE;
+       }
+       return rc;
+}
+
+SaAisErrorT 
scoutage_saNtfObjectCreateDeleteNotificationFilterAllocate(SaNtfHandleT 
ntf_handle,
+                                                                       
SaNtfObjectCreateDeleteNotificationFilterT* objectCreateDelete_filter)
+{
+       SaAisErrorT rc = SA_AIS_OK;
+       rc = 
ntftest_saNtfObjectCreateDeleteNotificationFilterAllocate(ntf_handle, 
objectCreateDelete_filter, 1, 1, 1, 1, 0);
+       if (rc == SA_AIS_OK) {
+               
fillCommonFilterHeader(&objectCreateDelete_filter->notificationFilterHeader);
+               
objectCreateDelete_filter->notificationFilterHeader.eventTypes[0] = 
SA_NTF_OBJECT_CREATION;
+       }
+       return rc;
+}
+
+SaAisErrorT 
scoutage_saNtfAttributeChangeNotificationFilterAllocate(SaNtfHandleT ntf_handle,
+                                                                       
SaNtfAttributeChangeNotificationFilterT* attributeChange_filter)
+{
+       SaAisErrorT rc = SA_AIS_OK;
+       rc = ntftest_saNtfAttributeChangeNotificationFilterAllocate(ntf_handle, 
attributeChange_filter, 1, 1, 1, 1, 0);
+       if (rc == SA_AIS_OK) {
+               
fillCommonFilterHeader(&attributeChange_filter->notificationFilterHeader);
+               attributeChange_filter->notificationFilterHeader.eventTypes[0] 
= SA_NTF_ATTRIBUTE_CHANGED;
+       }
+       return rc;
+}
+
+SaNtfIdentifierT send_alarmNotification(SaNtfHandleT ntf_handle,
+                                                                       
SaNtfAlarmNotificationT* alarmNotification)
+{
+       SaNtfIdentifierT notifId;
+       saferror(scoutage_saNtfAlarmNotificationAllocate(ntf_handle, 
alarmNotification), SA_AIS_OK);
+       
saferror(ntftest_saNtfNotificationSend(alarmNotification->notificationHandle), 
SA_AIS_OK);
+       notifId = *alarmNotification->notificationHeader.notificationId;
+       
saferror(ntftest_saNtfNotificationFree(alarmNotification->notificationHandle), 
SA_AIS_OK);
+       return notifId;
+}
+
+SaNtfIdentifierT send_secAlarmNotification(SaNtfHandleT ntf_handle,
+                                                                       
SaNtfSecurityAlarmNotificationT* secAlarmNotification)
+{
+       SaNtfIdentifierT notifId;
+       saferror(scoutage_saNtfSecurityAlarmNotificationAllocate(ntf_handle, 
secAlarmNotification), SA_AIS_OK);
+       
saferror(ntftest_saNtfNotificationSend(secAlarmNotification->notificationHandle),
 SA_AIS_OK);
+       notifId = *secAlarmNotification->notificationHeader.notificationId;
+       
saferror(ntftest_saNtfNotificationFree(secAlarmNotification->notificationHandle),
 SA_AIS_OK);
+       return notifId;
+}
+
+SaNtfIdentifierT send_stateChangeNotification(SaNtfHandleT ntf_handle,
+                                                                       
SaNtfStateChangeNotificationT* stateChangeNotification)
+{
+       SaNtfIdentifierT notifId;
+       saferror(scoutage_saNtfStateChangeNotificationAllocate(ntf_handle, 
stateChangeNotification), SA_AIS_OK);
+       
saferror(ntftest_saNtfNotificationSend(stateChangeNotification->notificationHandle),
 SA_AIS_OK);
+       notifId = *stateChangeNotification->notificationHeader.notificationId;
+       
saferror(ntftest_saNtfNotificationFree(stateChangeNotification->notificationHandle),
 SA_AIS_OK);
+       return notifId;
+}
+
+SaNtfIdentifierT send_objectCreateDeleteNotification(SaNtfHandleT ntf_handle,
+                                                                       
SaNtfObjectCreateDeleteNotificationT* objectCreateDeleteNotification)
+{
+       SaNtfIdentifierT notifId;
+       
saferror(scoutage_saNtfObjectCreateDeleteNotificationAllocate(ntf_handle, 
objectCreateDeleteNotification), SA_AIS_OK);
+       
saferror(ntftest_saNtfNotificationSend(objectCreateDeleteNotification->notificationHandle),
 SA_AIS_OK);
+       notifId = 
*objectCreateDeleteNotification->notificationHeader.notificationId;
+       
saferror(ntftest_saNtfNotificationFree(objectCreateDeleteNotification->notificationHandle),
 SA_AIS_OK);
+       return notifId;
+}
+
+SaNtfIdentifierT send_attrChangeNotification(SaNtfHandleT ntf_handle,
+                                                                       
SaNtfAttributeChangeNotificationT* attrChange_notification)
+{
+       SaNtfIdentifierT notifId;
+       saferror(scoutage_saNtfAttributeChangeNotificationAllocate(ntf_handle, 
attrChange_notification), SA_AIS_OK);
+       
saferror(ntftest_saNtfNotificationSend(attrChange_notification->notificationHandle),
 SA_AIS_OK);
+       notifId = *attrChange_notification->notificationHeader.notificationId;
+       
saferror(ntftest_saNtfNotificationFree(attrChange_notification->notificationHandle),
 SA_AIS_OK);
+       return notifId;
+}
+
+void producer_life_cycle(int test_api)
+{
+       rc = SA_AIS_OK;
+
+       fprintf_v(stdout, "\nStart test API: %s", 
ntf_api_name_list[test_api].apiName);
+       resetCounters();
+
+       if (test_api == SANTF_INITIALIZE) wait_controllers(2);
+       rc = ntftest_saNtfInitialize(&ntfHandle, &ntfCbTest, &ntfVersion);
+       if (test_api == SANTF_INITIALIZE) {
+               saferror(rc, SA_AIS_ERR_TRY_AGAIN);
+               wait_controllers(1);
+               rc = ntftest_saNtfInitialize(&ntfHandle, &ntfCbTest, 
&ntfVersion);
+       }
+       saferror(rc, SA_AIS_OK);
+
+       /* Create alarm notification */
+       rc = scoutage_saNtfAlarmNotificationAllocate(ntfHandle, 
&myAlarmNotification);
+       saferror(rc, SA_AIS_OK);
+
+       rc = 
scoutage_saNtfPtrValAllocate(&myAlarmNotification.notificationHeader, 
myAlarmNotification.notificationHandle);
+       saferror(rc, SA_AIS_OK);
+
+       /* Create security alarm notification */
+       rc = scoutage_saNtfSecurityAlarmNotificationAllocate(ntfHandle, 
&mySecAlarmNotification);
+       saferror(rc, SA_AIS_OK);
+
+       /* Create state change notification */
+       rc = scoutage_saNtfStateChangeNotificationAllocate(ntfHandle, 
&myStateChangeNotification);
+       saferror(rc, SA_AIS_OK);
+
+       /* Create object create delete notification */
+       rc = scoutage_saNtfObjectCreateDeleteNotificationAllocate(ntfHandle, 
&myObjCrDelNotification);
+       saferror(rc, SA_AIS_OK);
+
+       /* Create attribute change notification */
+       rc = scoutage_saNtfAttributeChangeNotificationAllocate(ntfHandle, 
&myAttrChangeNotification);
+       saferror(rc, SA_AIS_OK);
+
+       /* Send alarm notification*/
+       if (test_api == SANTF_NOTIFICATION_SEND) wait_controllers(2);
+       rc = 
ntftest_saNtfNotificationSend(myAlarmNotification.notificationHandle);
+       if (test_api == SANTF_NOTIFICATION_SEND) {
+               saferror(rc, SA_AIS_ERR_TRY_AGAIN);
+               wait_controllers(1);
+               rc = 
ntftest_saNtfNotificationSend(myAlarmNotification.notificationHandle);
+       }
+       saferror(rc, SA_AIS_OK);
+
+       if ((rc = 
ntftest_saNtfNotificationFree(myAlarmNotification.notificationHandle)) != 
SA_AIS_OK ||
+               (rc = 
ntftest_saNtfNotificationFree(mySecAlarmNotification.notificationHandle)) != 
SA_AIS_OK ||
+               (rc = 
ntftest_saNtfNotificationFree(myStateChangeNotification.notificationHandle)) != 
SA_AIS_OK ||
+               (rc = 
ntftest_saNtfNotificationFree(myObjCrDelNotification.notificationHandle)) != 
SA_AIS_OK ||
+               (rc = 
ntftest_saNtfNotificationFree(myAttrChangeNotification.notificationHandle)) != 
SA_AIS_OK);
+       saferror(rc, SA_AIS_OK);
+
+       if (test_api == SANTF_FINALIZE) wait_controllers(2);
+       rc = ntftest_saNtfFinalize(ntfHandle);
+       saferror(rc, SA_AIS_OK);
+       if (test_api == SANTF_FINALIZE) wait_controllers(1);
+
+       fprintf_v(stdout, "\nEnd test API: %s\n", 
ntf_api_name_list[test_api].apiName);
+}
+
+void consumer_life_cycle(int test_api)
+{
+       rc = SA_AIS_OK;
+       SaNtfAlarmNotificationFilterT myAlarmFilter;
+       SaNtfSecurityAlarmNotificationFilterT mySecurityAlarmFilter;
+       SaNtfStateChangeNotificationFilterT myStateChangeFilter;
+       SaNtfObjectCreateDeleteNotificationFilterT myObjectCreateDeleteFilter;
+       SaNtfAttributeChangeNotificationFilterT myAttributeChangeFilter;
+
+       int ret;
+       struct pollfd fds[1];
+
+       fprintf_v(stdout, "\nStart test API: %s", 
ntf_api_name_list[test_api].apiName);
+       resetCounters();
+
+       if (test_api == SANTF_INITIALIZE) wait_controllers(2);
+       rc = ntftest_saNtfInitialize(&ntfHandle, &ntfCbTest, &ntfVersion);
+       if (test_api == SANTF_INITIALIZE) {
+               saferror(rc, SA_AIS_ERR_TRY_AGAIN);
+               wait_controllers(1);
+               rc = ntftest_saNtfInitialize(&ntfHandle, &ntfCbTest, 
&ntfVersion);
+       }
+       saferror(rc, SA_AIS_OK);
+
+       rc = ntftest_saNtfSelectionObjectGet(ntfHandle, &selectionObject);
+       saferror(rc, SA_AIS_OK);
+
+       rc = scoutage_saNtfAlarmNotificationFilterAllocate(ntfHandle, 
&myAlarmFilter);
+       saferror(rc, SA_AIS_OK);
+
+       rc = scoutage_saNtfSecurityAlarmNotificationFilterAllocate(ntfHandle, 
&mySecurityAlarmFilter);
+       saferror(rc, SA_AIS_OK);
+
+       rc = scoutage_saNtfStateChangeNotificationFilterAllocate(ntfHandle, 
&myStateChangeFilter);
+       saferror(rc, SA_AIS_OK);
+
+       rc = 
scoutage_saNtfObjectCreateDeleteNotificationFilterAllocate(ntfHandle, 
&myObjectCreateDeleteFilter);
+       saferror(rc, SA_AIS_OK);
+
+       rc = scoutage_saNtfAttributeChangeNotificationFilterAllocate(ntfHandle, 
&myAttributeChangeFilter);
+       saferror(rc, SA_AIS_OK);
+
+       myNotificationFilterHandles.alarmFilterHandle = 
myAlarmFilter.notificationFilterHandle;
+       myNotificationFilterHandles.attributeChangeFilterHandle = 
myAttributeChangeFilter.notificationFilterHandle;
+       myNotificationFilterHandles.objectCreateDeleteFilterHandle = 
myObjectCreateDeleteFilter.notificationFilterHandle;
+       myNotificationFilterHandles.securityAlarmFilterHandle = 
mySecurityAlarmFilter.notificationFilterHandle;
+       myNotificationFilterHandles.stateChangeFilterHandle = 
myStateChangeFilter.notificationFilterHandle;
+
+       if (test_api == SANTF_NOTIFICATION_SUBSCRIBE) wait_controllers(2);
+       rc = ntftest_saNtfNotificationSubscribe(&myNotificationFilterHandles, 
subscriptionId);
+       if (test_api == SANTF_NOTIFICATION_SUBSCRIBE){
+               saferror(rc, SA_AIS_ERR_TRY_AGAIN);
+               wait_controllers(1);
+               rc = 
ntftest_saNtfNotificationSubscribe(&myNotificationFilterHandles, 
subscriptionId);
+       }
+       saferror(rc, SA_AIS_OK);
+
+       // Free 2 filters here to test whether all filters are recovered
+       if ((rc = 
ntftest_saNtfNotificationFilterFree(myObjectCreateDeleteFilter.notificationFilterHandle))
 != SA_AIS_OK ||
+               (rc = 
ntftest_saNtfNotificationFilterFree(myAttributeChangeFilter.notificationFilterHandle))
 != SA_AIS_OK);
+       saferror(rc, SA_AIS_OK);
+
+       sent_ok_ids.ids[sent_ok_ids.length++] = 
send_alarmNotification(ntfHandle, &myAlarmNotification);
+       sent_ok_ids.ids[sent_ok_ids.length++] = 
send_secAlarmNotification(ntfHandle, &mySecAlarmNotification);
+       sent_ok_ids.ids[sent_ok_ids.length++] = 
send_stateChangeNotification(ntfHandle, &myStateChangeNotification);
+       sent_ok_ids.ids[sent_ok_ids.length++] = 
send_objectCreateDeleteNotification(ntfHandle, &myObjCrDelNotification);
+       sent_ok_ids.ids[sent_ok_ids.length++] = 
send_attrChangeNotification(ntfHandle, &myAttrChangeNotification);
+
+       fds[0].fd = (int) selectionObject;
+
+       while (1) {
+               fds[0].events = POLLIN;
+               ret = poll(fds, 1, 10000);
+               if (ret <= 0) {
+                       saferror(true, false);
+               }
+               if (test_api == SANTF_DISPATCH) wait_controllers(2);
+
+               rc = ntftest_saNtfDispatch(ntfHandle, SA_DISPATCH_ALL);
+               if (test_api == SANTF_DISPATCH) {
+                       saferror(rc, SA_AIS_ERR_TRY_AGAIN);
+                       wait_controllers(1);
+                       test_api = SANTF_NOTIFICATION_SEND;
+
+               } else if (test_api == SANTF_NOTIFICATION_SEND) {
+                       // Resend notification by another handle to check if 
saNtfDispatch performs recovery and
+                       // subscriber can receives notification
+                       SaNtfHandleT subNtfHandle;
+                       saferror(ntftest_saNtfInitialize(&subNtfHandle, NULL, 
&ntfVersion), SA_AIS_OK);
+                       sent_ok_ids.ids[sent_ok_ids.length++] = 
send_alarmNotification(subNtfHandle, &myAlarmNotification);
+                       sent_ok_ids.ids[sent_ok_ids.length++] = 
send_secAlarmNotification(subNtfHandle, &mySecAlarmNotification);
+                       sent_ok_ids.ids[sent_ok_ids.length++] = 
send_stateChangeNotification(subNtfHandle, &myStateChangeNotification);
+                       sent_ok_ids.ids[sent_ok_ids.length++] = 
send_objectCreateDeleteNotification(subNtfHandle, &myObjCrDelNotification);
+                       sent_ok_ids.ids[sent_ok_ids.length++] = 
send_attrChangeNotification(subNtfHandle, &myAttrChangeNotification);
+                       saferror(ntftest_saNtfFinalize(subNtfHandle), 
SA_AIS_OK);
+                       test_api = SANTF_ALL;
+               } else {
+                       saferror(rc, SA_AIS_OK);
+                       break;
+               }
+       }
+
+       if ((rc = 
ntftest_saNtfNotificationFilterFree(myAlarmFilter.notificationFilterHandle)) != 
SA_AIS_OK ||
+               (rc = 
ntftest_saNtfNotificationFilterFree(mySecurityAlarmFilter.notificationFilterHandle))
 != SA_AIS_OK ||
+               (rc = 
ntftest_saNtfNotificationFilterFree(myStateChangeFilter.notificationFilterHandle))
 != SA_AIS_OK);
+       saferror(rc, SA_AIS_OK);
+
+       if (test_api == SANTF_NOTIFICATION_UNSUBSCRIBE) wait_controllers(2);
+       rc = ntftest_saNtfNotificationUnsubscribe(subscriptionId);
+       if (test_api == SANTF_NOTIFICATION_UNSUBSCRIBE) {
+               saferror(rc, SA_AIS_ERR_TRY_AGAIN);
+               wait_controllers(1);
+               rc = ntftest_saNtfNotificationUnsubscribe(subscriptionId);
+       }
+       saferror(rc, SA_AIS_OK);
+
+       if (test_api == SANTF_FINALIZE) wait_controllers(2);
+       rc = ntftest_saNtfFinalize(ntfHandle);
+       saferror(rc, SA_AIS_OK);
+       if (test_api == SANTF_FINALIZE) wait_controllers(1);
+
+       fprintf_v(stdout, "\nEnd test API: %s\n", 
ntf_api_name_list[test_api].apiName);
+}
+
+void reader_life_cycle(int test_api)
+{
+       rc = SA_AIS_OK;
+       SaNtfAlarmNotificationFilterT myAlarmFilter;
+       SaNtfSecurityAlarmNotificationFilterT mySecurityAlarmFilter;
+
+       SaNtfReadHandleT readHandle;
+       SaNtfSearchCriteriaT searchCriteria;
+       SaNtfNotificationsT returnedNotification;
+
+       fprintf_v(stdout, "\nStart test API: %s", 
ntf_api_name_list[test_api].apiName);
+       resetCounters();
+
+       if (test_api == SANTF_INITIALIZE) wait_controllers(2);
+       rc = ntftest_saNtfInitialize(&ntfHandle, &ntfCbTest, &ntfVersion);
+       if (test_api == SANTF_INITIALIZE) {
+               saferror(rc, SA_AIS_ERR_TRY_AGAIN);
+               wait_controllers(1);
+               rc = ntftest_saNtfInitialize(&ntfHandle, &ntfCbTest, 
&ntfVersion);
+       }
+       saferror(rc, SA_AIS_OK);
+
+       rc = ntftest_saNtfSelectionObjectGet(ntfHandle, &selectionObject);
+       saferror(rc, SA_AIS_OK);
+
+       rc = scoutage_saNtfAlarmNotificationFilterAllocate(ntfHandle, 
&myAlarmFilter);
+       saferror(rc, SA_AIS_OK);
+
+       rc = scoutage_saNtfSecurityAlarmNotificationFilterAllocate(ntfHandle, 
&mySecurityAlarmFilter);
+       saferror(rc, SA_AIS_OK);
+
+       memset(&myNotificationFilterHandles, 0, 
sizeof(myNotificationFilterHandles));
+       myNotificationFilterHandles.alarmFilterHandle = 
myAlarmFilter.notificationFilterHandle;
+       myNotificationFilterHandles.securityAlarmFilterHandle = 
mySecurityAlarmFilter.notificationFilterHandle;
+
+       sent_ok_ids.ids[sent_ok_ids.length++] = 
send_alarmNotification(ntfHandle, &myAlarmNotification);
+       sent_ok_ids.ids[sent_ok_ids.length++] = 
send_secAlarmNotification(ntfHandle, &mySecAlarmNotification);
+
+       if (test_api == SANTF_NOTIFICATION_READ_INITIALIZE) wait_controllers(2);
+       searchCriteria.searchMode = SA_NTF_SEARCH_ONLY_FILTER;
+       rc = ntftest_saNtfNotificationReadInitialize(searchCriteria,
+                                                                               
&myNotificationFilterHandles, &readHandle);
+       if (test_api == SANTF_NOTIFICATION_READ_INITIALIZE) {
+               saferror(rc, SA_AIS_ERR_TRY_AGAIN);
+               wait_controllers(1);
+               rc = ntftest_saNtfNotificationReadInitialize(searchCriteria,
+                                                                               
        &myNotificationFilterHandles, &readHandle);
+       }
+       saferror(rc, SA_AIS_OK);
+
+       // Free one filter here to test whether all filters are recovered
+       rc = 
ntftest_saNtfNotificationFilterFree(myAlarmFilter.notificationFilterHandle);
+       saferror(rc, SA_AIS_OK);
+
+       if (test_api == SANTF_NOTIFICATION_READ_NEXT) wait_controllers(2);
+       while ((rc = ntftest_saNtfNotificationReadNext(readHandle, 
SA_NTF_SEARCH_YOUNGER,
+                                                                       
&returnedNotification)) == SA_AIS_OK) {
+               saNtfNotificationCallbackT(0, &returnedNotification);
+       }
+       if (test_api == SANTF_NOTIFICATION_READ_NEXT) {
+               saferror(rc, SA_AIS_ERR_TRY_AGAIN);
+               wait_controllers(1);
+               // Resend notification by another handle to check if 
saNtfNotificationReadNext performs recovery and
+               // reader can read notification
+               SaNtfHandleT subNtfHandle;
+               saferror(ntftest_saNtfInitialize(&subNtfHandle, NULL, 
&ntfVersion), SA_AIS_OK);
+               sent_ok_ids.ids[sent_ok_ids.length++] = 
send_alarmNotification(subNtfHandle, &myAlarmNotification);
+               sent_ok_ids.ids[sent_ok_ids.length++] = 
send_secAlarmNotification(subNtfHandle, &mySecAlarmNotification);
+               saferror(ntftest_saNtfFinalize(subNtfHandle), SA_AIS_OK);
+
+               while ((rc = ntftest_saNtfNotificationReadNext(readHandle, 
SA_NTF_SEARCH_YOUNGER,
+                                                                               
&returnedNotification)) == SA_AIS_OK) {
+                       saNtfNotificationCallbackT(0, &returnedNotification);
+               }
+       }
+       saferror(rc, SA_AIS_ERR_NOT_EXIST);
+
+       rc = 
ntftest_saNtfNotificationFilterFree(mySecurityAlarmFilter.notificationFilterHandle);
+       saferror(rc, SA_AIS_OK);
+
+       if (test_api == SANTF_NOTIFICATION_READ_FINALIZE) wait_controllers(2);
+       rc = ntftest_saNtfNotificationReadFinalize(readHandle);
+       if (test_api == SANTF_NOTIFICATION_READ_FINALIZE) {
+               saferror(rc, SA_AIS_ERR_TRY_AGAIN);
+               wait_controllers(1);
+               rc = ntftest_saNtfNotificationReadFinalize(readHandle);
+       }
+       saferror(rc, SA_AIS_OK);
+
+       if (test_api == SANTF_FINALIZE) wait_controllers(2);
+       rc = ntftest_saNtfFinalize(ntfHandle);
+       saferror(rc, SA_AIS_OK);
+       if (test_api == SANTF_FINALIZE) wait_controllers(1);
+
+       fprintf_v(stdout, "\nEnd test API: %s\n", 
ntf_api_name_list[test_api].apiName);
+}
+
+void test_sc_outage_producer_1() {
+       producer_life_cycle(SANTF_INITIALIZE);
+       test_validate(check_errors(), SA_AIS_OK);
+}
+
+void test_sc_outage_producer_2() {
+       producer_life_cycle(SANTF_NOTIFICATION_SEND);
+       test_validate(check_errors(), SA_AIS_OK);
+}
+
+void test_sc_outage_producer_3() {
+       producer_life_cycle(SANTF_FINALIZE);
+       test_validate(check_errors(), SA_AIS_OK);
+}
+
+void test_sc_outage_consumer_1() {
+       consumer_life_cycle(SANTF_NOTIFICATION_SUBSCRIBE);
+       test_validate(check_errors(), SA_AIS_OK);
+}
+
+void test_sc_outage_consumer_2() {
+       consumer_life_cycle(SANTF_DISPATCH);
+       test_validate(check_errors(), SA_AIS_OK);
+}
+
+void test_sc_outage_consumer_3() {
+       consumer_life_cycle(SANTF_NOTIFICATION_UNSUBSCRIBE);
+       test_validate(check_errors(), SA_AIS_OK);
+}
+
+void test_sc_outage_reader_1() {
+       reader_life_cycle(SANTF_NOTIFICATION_READ_INITIALIZE);
+       test_validate(check_errors(), SA_AIS_OK);
+}
+
+void test_sc_outage_reader_2() {
+       reader_life_cycle(SANTF_NOTIFICATION_READ_NEXT);
+       test_validate(check_errors(), SA_AIS_OK);
+}
+
+void test_sc_outage_reader_3() {
+       reader_life_cycle(SANTF_NOTIFICATION_READ_FINALIZE);
+       test_validate(check_errors(), SA_AIS_OK);
+}
+
+void add_scOutage_reinitializeHandle_test(void)
+{
+       signal(SIGUSR2, sigusr2_handler);
+
+       test_suite_add(37, "SC outage: Test for producer");
+       test_case_add(37, test_sc_outage_producer_1, "Test saNtfInitialize");
+       test_case_add(37, test_sc_outage_producer_2, "Test 
saNtfNotificationSend");
+       test_case_add(37, test_sc_outage_producer_3, "Test saNtfFinalize");
+       test_suite_add(38, "SC outage: Test for consumer");
+       test_case_add(38, test_sc_outage_consumer_1, "Test 
saNtfNotificationSubscribe");
+       test_case_add(38, test_sc_outage_consumer_2, "Test saNtfDispatch");
+       test_case_add(38, test_sc_outage_consumer_3, "Test 
saNtfNotificationUnsubscribe");
+       test_suite_add(39, "SC outage: Test for reader");
+       test_case_add(39, test_sc_outage_reader_1, "Test 
saNtfNotificationReadInitialize");
+       test_case_add(39, test_sc_outage_reader_2, "Test 
saNtfNotificationReadNext");
+       test_case_add(39, test_sc_outage_reader_3, "Test 
saNtfNotificationReadFinalize");
+}

------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to