saAisNameLend() adds a terminating NUL character, so I think you would still need strlen(saAisNameBorrow(&name)) + 2 + 1 even with Praveen's patch, otherwise saAisNameLend() will write one byte past the end of the allocated buffer when the string is shorter than 256 bytes. Another concern is, can a notification be re-used and be sent multiple times? The current version of the patch will not work in the (rare) case that the string length is equal to kExtendedNameMagic. Third concern: there is no check that the user has allocated enough space. What if the user has by mistake allocated a buffer that is too small, e.g. sizeof(SaNameT) bytes, when the string is longer than 256 bytes?
The + 2 (or rather, + 2 + 1) will work, but it is a bit non-obvious. It would need to be documented clearly since I see a potential for user mistakes here. The user is not supposed to know or care about the internal structure of SaNameT anymore; it is supposed to be opaque. My proposal is that you instead handle extended SaNameT during encoding, i.e. in encodeSaNtfValueT(). / Anders Widell On 07/31/2014 09:08 AM, minhchau wrote: > Hi Anders, Praveen, > > sizeof(SaNameT) is not the right size to request the memory allocation > any more. It should be the real size (length of string + 2 bytes of > .length). It will looks like this > > saNtfPtrValAllocate(notHandle, strlen(saAisNameBorrow(&name)) + 2, > (void**)&dest_ptr, &(head->additionalInfo[1].infoValue)); > saAisNameLend((SaConstStringT)&test1_ext_notification_object, > (SaNameT*) dest_ptr); > > @Praveen: I agree with you and can I take your patch for the next version? > > Thanks/Minh > On 7/30/2014 10:53 PM, Anders Widell wrote: >> Hi! >> >> This + 2 thing looks a bit hairy to me. The size of the SaNameT type >> has not changed; it is exactly 258 bytes. Wouldn't it be more natural >> if the client, when using the SA_NTF_VALUE_LDAP_NAME data type, >> requests to allocate sizeof(SaNameT) bytes, and then stores a pointer >> to the string in this allocated data by calling saAisNameLend() ? >> >> Not sure how this code used to work before. What happened if the user >> uses SA_NTF_VALUE_LDAP_NAME and requests to allocate space that is >> smaller than sizeof(SaNameT)? I guess it would be OK, as long as the >> size is large enough to hold the entire string as indicated by the >> SaNameT.length field. But what happens if the allocated memory is not >> large enough to hold the entire string? The NTF agent should have a >> check for this, I guess... >> >> / Anders Widell >> >> On 07/30/2014 11:26 AM, praveen malviya wrote: >>> >>> On 30-Jul-14 7:17 AM, minhchau wrote: >>>> Hi Praveen, >>>> >>>> I think the main purpose in your patch is to let the Send() API >>>> takes care the variable_data and the client just simply uses >>>> saAisNameLend() >>>> >>>> + saAisNameLend((SaConstStringT)&test1_ext_notification_object, >>>> (SaNameT*) dest_ptr); >>>> >>>> Instead of: >>>> >>>> - *((SaUint16T*)dest_ptr) = *((SaUint16T*)&name); >>>> - memcpy(dest_ptr + 2, saAisNameBorrow(&name), >>>> strlen(saAisNameBorrow(&name))); >>>> >>>> Looks good, but it's risky because the >>>> test1_ext_notification_object must not be changed/deallocated >>>> before calling the Send() API. We can't stop the client doing that, >>>> since test1_ext_notification_object could be reused for other >>>> purpose, unless the client must have N string variables (like this >>>> test1_ext_notification_object) if it wants to add respectively N >>>> SA_NTF_VALUE_LDAP_NAME into AdditionalInfo >>>> >>> But, description of the SaAisNameLend() API says: >>> " If length of the string >>> is greater than or equal to >>> SA_MAX_UNEXTENDED_NAME_LENGTH, no >>> copying is performed. Instead, a reference to the >>> original >>> string is stored in the SaNameT type. In this >>> case, it is >>> therefore important that the original string is >>> not modified >>> or freed for as long as the SaNameT type may >>> still used. >>> " >>> So a user should not reuse the same memory or should not modified >>> till SaNameT is in use. >>> Referring to this, I think, in the NTFsv case, we can change the >>> test1_ext_notification_object only after calling Send() API. >>> At the same time it is aligned with NTF service saNtf*Allocate() API >>> also. A user calls saNtf*Allocate() API and fills the parameter and >>> sends notification, then >>> again refills the values and send the notification on same call of >>> saNtf*Allocate() API. >>> >>> What do you think? >>> >>> Thanks, >>> Praveen >>> >>> >>>> Thanks, >>>> Minh >>>> On 7/28/2014 6:56 PM, praveen malviya wrote: >>>>> Re: [PATCH 6 of 7] NTF: Add ntftest test cases for notification, >>>>> with long dn objects [#873] v2 Hi Minh, >>>>> >>>>> I have tried a small patch to use saAisNameLend() for extended >>>>> name in saNtfPtrValAllocate() for the discussed case. >>>>> It is handled in Send() API. Patch is generated on top of V3 >>>>> patchs and also includes relevant test changes in >>>>> extFillHeaderAddInfo() in tet_longDnObject_notification.c. >>>>> Please review it. >>>>> >>>>> Thanks >>>>> Praveen >>>>> On 18-Jul-14 5:22 AM, minhchau wrote: >>>>>> Hi Praveen, >>>>>> >>>>>> Please find my comments inline >>>>>> >>>>>> Thanks, >>>>>> Minh >>>>>> On 7/17/2014 5:02 PM, praveen malviya wrote: >>>>>>> Hi Minh, >>>>>>> >>>>>>> I saw the test and the way long DN is being used in the API. >>>>>>> I tried to modified that in one way for short DN(below is the >>>>>>> patch/diff on top this patch). >>>>>>> >>>>>>> But I have certain doubts: >>>>>>> In case ldap_name is less the 256, it can be set directly using >>>>>>> saAisNameLend(),below diff, and ntfsubscribe successfully >>>>>>> receives it. >>>>>>> This goes by the description of saAisNameLend() as in such a >>>>>>> case the contents of the string is copied into the SaNameT type >>>>>>> and can be read in a >>>>>>> backwards compatible way by legacy applications that do not >>>>>>> support the extended SaNameT format". >>>>>>> Because of this I was able to set ldap_name directly using >>>>>>> saAisNameLend(). >>>>>>> >>>>>>> But in case ldap_name is greater than 256 then saAisNameLend() >>>>>>> description says "if length of the string >>>>>>> is greater than or equal to SA_MAX_UNEXTENDED_NAME_LENGTH, no >>>>>>> copying is performed. Instead, a reference to the original >>>>>>> string is stored in the SaNameT type." >>>>>>> So for long DN the same does not work and ntfsubscribe receives >>>>>>> the garbage value because the buffer contains the reference and >>>>>>> not the original value. >>>>>>> But above description we know what saAisNanmeLend() has done. So >>>>>>> I think we need to decide: this should be considered internally >>>>>>> in the Send () API or let it to user to >>>>>>> set the longDn as in the example test case. For >>>>>>> notificationObject and NotifyingObject we are setting longDn by >>>>>>> directly using saAisNameLend(). >>>>>>> >>>>>> [Minh]: I did think about "this should be considered internally >>>>>> in the Send () API" in order that user can do the same way short >>>>>> long dn has been specified. >>>>>> And inside the Send() API, before sending the notification, we >>>>>> have to re-package variable_data (reason that *sizeof(SaNameT)+1* >>>>>> is not the right size any more). But this is really inefficient >>>>>> >>>>>> In the other hands, the description of >>>>>> saNtfPtrValAllocate(SaNtfNotificationHandleT notificationHandle, >>>>>> SaUint16T dataSize, void **dataPtr, SaNtfValueT *value): >>>>>> /*dataSize - [in] The number of bytes to be reserved.*//* >>>>>> *//*dataPtr - [out] A pointer to a pointer to the memory location >>>>>> that will be reserved with this function.*/ >>>>>> >>>>>> Thus, the dataSize is the number of bytes that user wants to put >>>>>> the content of SaNameT (both short or long dn) into a chunk >>>>>> inside variable_data which will be sent as part of notification >>>>>> message. >>>>>> The app built with extended name, using saAisNameXXX, should >>>>>> understand that *sizeof(SaNameT)* is not the real size of >>>>>> SaNameT's content any more. The way that user setting longdn is >>>>>> upon the description of saNtfPtrValAllocate plus saAisNameXXX. >>>>>> I wish to have: >>>>>> *saAisNameEncode(SaNameT* name, char* bytes), which pours the >>>>>> content of @.name into @.bytes. It is bit more *friendly*, and >>>>>> keep user not to make the endian mistake, since user has to set >>>>>> the length of string as well: >>>>>> */ *((SaUint16T*)dest_ptr) = *((SaUint16T*)&name); /**/ >>>>>> /**/ memcpy(dest_ptr + 2, saAisNameBorrow(&name), >>>>>> strlen(saAisNameBorrow(&name)) + 1); /* >>>>> But here, as in the test case, a user always have to keep in mind >>>>> this "+2 " logic while setting the DN name and its length and >>>>> while retreving it (we are doing it in ntfclient.c). >>>>> >>>>> >>>>>> *saAisNameDecode(...) does in reverse. >>>>>> These above functions can be done by user, but it'd be good to >>>>>> have it as api that every user doesn't have to create it. >>>>>> Above all of things, there's an exception that the legacy >>>>>> application by somehow receives the longDn object, then it uses >>>>>> the saNtfPtrValAllocate in the *legacy* way, that would be a >>>>>> problem. But for now, I can't imagine which situation happening >>>>>> >>>>>>> What do you think? >>>>>>> >>>>>>> Thanks, >>>>>>> Praveen >>>>>>> >>>>>>> Here is the modified test case of ldap_name less than 256: >>>>>>> diff --git a/tests/ntfsv/tet_longDnObject_notification.c >>>>>>> b/tests/ntfsv/tet_longDnObject_notification.c >>>>>>> --- a/tests/ntfsv/tet_longDnObject_notification.c >>>>>>> +++ b/tests/ntfsv/tet_longDnObject_notification.c >>>>>>> @@ -359,15 +359,15 @@ void extFillHeader(SaNtfNotificationHead >>>>>>> /* Fill fourth additionalInfo as unextended SaNameT */ >>>>>>> head->additionalInfo[3].infoType = SA_NTF_VALUE_LDAP_NAME; >>>>>>> head->additionalInfo[3].infoId = 1; >>>>>>> - saAisNameLend(DEFAULT_UNEXT_NAME_STRING, &name); >>>>>>> - >>>>>>> + SaNameT *name_buffer; >>>>>>> safassert(saNtfPtrValAllocate(notHandle, >>>>>>> - strlen(saAisNameBorrow(&name)) + 2 + 1, >>>>>>> - (void**)&dest_ptr, >>>>>>> + sizeof(SaNameT)+ 1, >>>>>>> + (void**)&name_buffer, >>>>>>> &(head->additionalInfo[3].infoValue)), SA_AIS_OK); >>>>>>> + saAisNameLend(DEFAULT_UNEXT_NAME_STRING, name_buffer); >>>>>>> + //Comment log DN setting >>>>>>> + >>>>>>> //saAisNameLend((SaConstStringT)&test1_ext_notification_object, >>>>>>> name_buffer); >>>>>>> >>>>>>> - *((SaUint16T*)dest_ptr) = *((SaUint16T*)&name); >>>>>>> - memcpy(dest_ptr + 2, saAisNameBorrow(&name), >>>>>>> strlen(saAisNameBorrow(&name)) + 1); >>>>>>> } >>>>>>> >>>>>>> /** >>>>>>> >>>>>>> >>>>>>> >>>>>>> On 17-Jul-14 5:55 AM, minhchau wrote: >>>>>>>> Hi Praveen, >>>>>>>> >>>>>>>> Regarding extended name in AdditionalInfo, I have added the >>>>>>>> test for it, as in extFillHeaderAddInfo() and >>>>>>>> extAdditionalInfoTest(). >>>>>>>> If the app built with extended name and using SaNameT in >>>>>>>> AdditionalInfo, it certainly knows how the extented name >>>>>>>> shaping, thus it has to change the way it specifies dataSize >>>>>>>> and dataPtr (there's one example in extFillHeaderAddInfo) >>>>>>>> osaf/tools/safntf/src/ntfclient.c has also fixed the crash >>>>>>>> problem when ntfread/ntfsubscribe print extended name in >>>>>>>> AdditionalInfo. >>>>>>>> >>>>>>>> Thanks, >>>>>>>> Minh >>>>>>>> >>>>>>>> tests/ntfsv/Makefile.am | 3 +- >>>>>>>> tests/ntfsv/tet_longDnObject_notification.c | 957 >>>>>>>> ++++++++++++++++++++++++++++ >>>>>>>> tests/unit_test_fw/inc/util.h | 5 +- >>>>>>>> tests/unit_test_fw/src/Makefile.am | 1 + >>>>>>>> tests/unit_test_fw/src/util.c | 14 +- >>>>>>>> 5 files changed, 963 insertions(+), 17 deletions(-) >>>>>>>> >>>>>>>> >>>>>>>> (1) Add testcase for AdditionalInfo with extended SaNameT >>>>>>>> >>>>>>>> diff --git a/tests/ntfsv/Makefile.am b/tests/ntfsv/Makefile.am >>>>>>>> --- a/tests/ntfsv/Makefile.am >>>>>>>> +++ b/tests/ntfsv/Makefile.am >>>>>>>> @@ -64,7 +64,8 @@ ntftest_SOURCES = \ >>>>>>>> tet_saNtfPtrValAllocate.c \ >>>>>>>> tet_saNtfArrayValGet.c \ >>>>>>>> tet_saNtfPtrValGet.c \ >>>>>>>> - test_ntfFilterVerification.c >>>>>>>> + test_ntfFilterVerification.c \ >>>>>>>> + tet_longDnObject_notification.c >>>>>>>> >>>>>>>> ntftest_LDADD = \ >>>>>>>> $(top_builddir)/tests/unit_test_fw/src/libutest.la >>>>>>>> diff --git a/tests/ntfsv/tet_longDnObject_notification.c >>>>>>>> b/tests/ntfsv/tet_longDnObject_notification.c >>>>>>>> new file mode 100644 >>>>>>>> --- /dev/null >>>>>>>> +++ b/tests/ntfsv/tet_longDnObject_notification.c >>>>>>>> @@ -0,0 +1,957 @@ >>>>>>>> +/* -*- 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 "tet_ntf.h" >>>>>>>> +#include "tet_ntf_common.h" >>>>>>>> +//#include "util.h" >>>>>>>> +#define NOTIFYING_OBJECT_TEST "AVND" >>>>>>>> +#define NTF_REST_MAX_IDS 30 >>>>>>>> + >>>>>>>> +#define DEFAULT_EXT_NAME_LENGTH 300 >>>>>>>> +#define DEFAULT_UNEXT_NAME_STRING "This is unextended SaNameT >>>>>>>> string (<256)" >>>>>>>> +struct not_idsT { >>>>>>>> + int length; >>>>>>>> + SaNtfIdentifierT ids[NTF_REST_MAX_IDS]; >>>>>>>> +}; >>>>>>>> + >>>>>>>> +static struct not_idsT received_ids = {0,}; >>>>>>>> +static struct not_idsT ok_ids = {0,}; >>>>>>>> + >>>>>>>> +static char >>>>>>>> default_ext_notification_object[DEFAULT_EXT_NAME_LENGTH]; >>>>>>>> +static char >>>>>>>> default_ext_notifying_object[DEFAULT_EXT_NAME_LENGTH]; >>>>>>>> +static char >>>>>>>> test1_ext_notification_object[DEFAULT_EXT_NAME_LENGTH]; >>>>>>>> +static char test1_ext_notifying_object[DEFAULT_EXT_NAME_LENGTH]; >>>>>>>> + >>>>>>>> +static SaNtfNotificationTypeFilterHandlesT >>>>>>>> myNotificationFilterHandles; >>>>>>>> + >>>>>>>> +/* Used to keep track of which ntf we got */ >>>>>>>> +static SaNtfNotificationTypeFilterHandlesT ntfRecieved; >>>>>>>> + >>>>>>>> +static int errors; >>>>>>>> +static SaNtfSubscriptionIdT subscriptionId; >>>>>>>> +static SaNtfAlarmNotificationT myAlarmNotification; >>>>>>>> +static SaNtfObjectCreateDeleteNotificationT >>>>>>>> myObjCrDelNotification; >>>>>>>> +static SaNtfAttributeChangeNotificationT >>>>>>>> myAttrChangeNotification; >>>>>>>> +static SaNtfStateChangeNotificationT myStateChangeNotification; >>>>>>>> +static SaNtfSecurityAlarmNotificationT mySecAlarmNotification; >>>>>>>> + >>>>>>>> +extern void saAisNameLend(SaConstStringT value, SaNameT* name); >>>>>>>> +extern SaConstStringT saAisNameBorrow(const SaNameT* name); >>>>>>>> + >>>>>>>> +/** >>>>>>>> + * Init default long dn objects >>>>>>>> + */ >>>>>>>> +static void init_ext_object() >>>>>>>> +{ >>>>>>>> + safassert(setenv("SA_ENABLE_EXTENDED_NAMES", "1", 1), 0); >>>>>>>> + >>>>>>>> + memset(&default_ext_notification_object, 'A', >>>>>>>> DEFAULT_EXT_NAME_LENGTH - 1); >>>>>>>> + default_ext_notification_object[DEFAULT_EXT_NAME_LENGTH - 1] >>>>>>>> = '\0'; >>>>>>>> + >>>>>>>> + memset(&default_ext_notifying_object, 'B', >>>>>>>> DEFAULT_EXT_NAME_LENGTH - 1); >>>>>>>> + default_ext_notifying_object[DEFAULT_EXT_NAME_LENGTH - 1] = >>>>>>>> '\0'; >>>>>>>> + >>>>>>>> + memset(&test1_ext_notification_object, 'C', >>>>>>>> DEFAULT_EXT_NAME_LENGTH - 1); >>>>>>>> + test1_ext_notification_object[DEFAULT_EXT_NAME_LENGTH - 1] = >>>>>>>> '\0'; >>>>>>>> + >>>>>>>> + memcpy(&test1_ext_notifying_object, NOTIFYING_OBJECT_TEST, >>>>>>>> sizeof(NOTIFYING_OBJECT_TEST)); >>>>>>>> +} >>>>>>>> + >>>>>>>> +/** >>>>>>>> + * Store all recieved notificationIds >>>>>>>> + */ >>>>>>>> +static void ntf_id_store(SaNtfIdentifierT n_id) >>>>>>>> +{ >>>>>>>> + assert(NTF_REST_MAX_IDS > received_ids.length); >>>>>>>> + received_ids.ids[received_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; >>>>>>>> + SaAisErrorT rc = SA_AIS_OK; >>>>>>>> + >>>>>>>> + for (i = 0; i< received_ids.length; i++) { >>>>>>>> + found=0; >>>>>>>> + for (j= 0; j< ok_ids.length; j++) { >>>>>>>> + if (received_ids.ids[i] == ok_ids.ids[j]){ >>>>>>>> + found = 1; >>>>>>>> + break; >>>>>>>> + } >>>>>>>> + } >>>>>>>> + if(!found) >>>>>>>> + errors++; >>>>>>>> + } >>>>>>>> + if(errors) >>>>>>>> + { >>>>>>>> + rc = SA_AIS_ERR_FAILED_OPERATION; >>>>>>>> + printf("num of failed notifications: %d\n", errors); >>>>>>>> + } >>>>>>>> + return rc; >>>>>>>> +} >>>>>>>> + >>>>>>>> +static void resetCounters() >>>>>>>> +{ >>>>>>>> + errors = 0; >>>>>>>> + received_ids.length = 0; >>>>>>>> + ok_ids.length = 0; >>>>>>>> + ntfRecieved.alarmFilterHandle = 0; >>>>>>>> + ntfRecieved.attributeChangeFilterHandle = 0; >>>>>>>> + ntfRecieved.objectCreateDeleteFilterHandle = 0; >>>>>>>> + ntfRecieved.securityAlarmFilterHandle = 0; >>>>>>>> + ntfRecieved.stateChangeFilterHandle = 0; >>>>>>>> +} >>>>>>>> + >>>>>>>> +/** >>>>>>>> + * Creates an ObjectCreateDeleteNotification with default values. >>>>>>>> + * >>>>>>>> + * @param ntfHandle >>>>>>>> + * @param myObjCreDelNotification >>>>>>>> + */ >>>>>>>> +void extCreateObjectCreateDeleteNotification(SaNtfHandleT >>>>>>>> ntfHandle, >>>>>>>> + SaNtfObjectCreateDeleteNotificationT >>>>>>>> *myObjCrDelNotification) >>>>>>>> +{ >>>>>>>> + SaNtfNotificationHeaderT *head; >>>>>>>> + >>>>>>>> + createObjectCreateDeleteNotification(ntfHandle, >>>>>>>> myObjCrDelNotification); >>>>>>>> + head = &myObjCrDelNotification->notificationHeader; >>>>>>>> + /* Overwrite with long dn object */ >>>>>>>> + >>>>>>>> saAisNameLend((SaConstStringT)&default_ext_notification_object, >>>>>>>> head->notificationObject); >>>>>>>> + saAisNameLend((SaConstStringT)&default_ext_notifying_object, >>>>>>>> head->notifyingObject); >>>>>>>> +} >>>>>>>> + >>>>>>>> +/** >>>>>>>> + * Creates an AttributeChangeNotification with default values. >>>>>>>> + * >>>>>>>> + * @param ntfhandle >>>>>>>> + * @param myAttrChangeNotification >>>>>>>> + */ >>>>>>>> +void extCreateAttributeChangeNotification(SaNtfHandleT ntfHandle, >>>>>>>> + SaNtfAttributeChangeNotificationT >>>>>>>> *myAttrChangeNotification) >>>>>>>> +{ >>>>>>>> + SaNtfNotificationHeaderT *head; >>>>>>>> + >>>>>>>> + createAttributeChangeNotification(ntfHandle, >>>>>>>> myAttrChangeNotification); >>>>>>>> + head = &myAttrChangeNotification->notificationHeader; >>>>>>>> + /* Overwrite with long dn object */ >>>>>>>> + >>>>>>>> saAisNameLend((SaConstStringT)&default_ext_notification_object, >>>>>>>> head->notificationObject); >>>>>>>> + saAisNameLend((SaConstStringT)&default_ext_notifying_object, >>>>>>>> head->notifyingObject); >>>>>>>> +} >>>>>>>> + >>>>>>>> +/** >>>>>>>> + * Create a StateChangeNotification with default values. >>>>>>>> + * >>>>>>>> + * @param ntfHandle >>>>>>>> + * @param myStateChangeNotification >>>>>>>> + */ >>>>>>>> +void extCreateStateChangeNotification(SaNtfHandleT ntfHandle, >>>>>>>> + SaNtfStateChangeNotificationT *myStateChangeNotification) >>>>>>>> +{ >>>>>>>> + SaNtfNotificationHeaderT *head; >>>>>>>> + >>>>>>>> + createStateChangeNotification(ntfHandle, >>>>>>>> myStateChangeNotification); >>>>>>>> + head = &myStateChangeNotification->notificationHeader; >>>>>>>> + /* Overwrite with long dn object */ >>>>>>>> + >>>>>>>> saAisNameLend((SaConstStringT)&default_ext_notification_object, >>>>>>>> head->notificationObject); >>>>>>>> + saAisNameLend((SaConstStringT)&default_ext_notifying_object, >>>>>>>> head->notifyingObject); >>>>>>>> +} >>>>>>>> + >>>>>>>> +/** >>>>>>>> + * Create a SecurityAlarmNotification with default values. >>>>>>>> + * >>>>>>>> + * @param ntfHandle >>>>>>>> + * @param mySecAlarmNotification >>>>>>>> + */ >>>>>>>> +void extCreateSecurityAlarmNotification(SaNtfHandleT ntfHandle, >>>>>>>> + SaNtfSecurityAlarmNotificationT *mySecAlarmNotification) >>>>>>>> +{ >>>>>>>> + SaNtfNotificationHeaderT *head; >>>>>>>> + >>>>>>>> + createSecurityAlarmNotification(ntfHandle, >>>>>>>> mySecAlarmNotification); >>>>>>>> + head = &mySecAlarmNotification->notificationHeader; >>>>>>>> + /* Overwrite with long dn object */ >>>>>>>> + >>>>>>>> saAisNameLend((SaConstStringT)&default_ext_notification_object, >>>>>>>> head->notificationObject); >>>>>>>> + saAisNameLend((SaConstStringT)&default_ext_notifying_object, >>>>>>>> head->notifyingObject); >>>>>>>> +} >>>>>>>> + >>>>>>>> +/** >>>>>>>> + * 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; >>>>>>>> + if(myNotificationFilterHandles.objectCreateDeleteFilterHandle >>>>>>>> == 0) >>>>>>>> + 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; >>>>>>>> + if(myNotificationFilterHandles.attributeChangeFilterHandle == 0) >>>>>>>> + 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; >>>>>>>> + if(myNotificationFilterHandles.stateChangeFilterHandle == 0) >>>>>>>> + 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; >>>>>>>> + if(myNotificationFilterHandles.alarmFilterHandle == 0) { >>>>>>>> + printf("alarmFilterHandle == 0\n"); >>>>>>>> + 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; >>>>>>>> + if(myNotificationFilterHandles.securityAlarmFilterHandle == 0) >>>>>>>> + errors += 1; >>>>>>>> + else >>>>>>>> + >>>>>>>> ntf_id_store(*notification->notification.securityAlarmNotification.notificationHeader.notificationId); >>>>>>>> + break; >>>>>>>> + >>>>>>>> + default: >>>>>>>> + errors +=1; >>>>>>>> + assert(0); >>>>>>>> + break; >>>>>>>> + } >>>>>>>> + last_not_id = get_ntf_id(notification); >>>>>>>> + if (notificationHandle != 0) >>>>>>>> + safassert(saNtfNotificationFree(notificationHandle), SA_AIS_OK); >>>>>>>> +} >>>>>>>> + >>>>>>>> + >>>>>>>> +static SaNtfCallbacksT ntfCbTest = { >>>>>>>> + saNtfNotificationCallbackT, >>>>>>>> + NULL >>>>>>>> +}; >>>>>>>> + >>>>>>>> +/** >>>>>>>> + * Fill the filter header with long dn objects >>>>>>>> + */ >>>>>>>> +void extFillFilterHeader(SaNtfNotificationFilterHeaderT *head) >>>>>>>> +{ >>>>>>>> + fillFilterHeader(head); >>>>>>>> + /* Overwrite the objects with long dn */ >>>>>>>> + >>>>>>>> saAisNameLend((SaConstStringT)&default_ext_notification_object, >>>>>>>> &head->notificationObjects[0]); >>>>>>>> + saAisNameLend((SaConstStringT)&default_ext_notifying_object, >>>>>>>> &head->notifyingObjects[0]); >>>>>>>> +} >>>>>>>> + >>>>>>>> +/** >>>>>>>> + * Fill the header with long dn objects >>>>>>>> + */ >>>>>>>> +void extFillHeader(SaNtfNotificationHeaderT *head) >>>>>>>> +{ >>>>>>>> + fillHeader(head); >>>>>>>> + /* Overwrite the objects with long dn */ >>>>>>>> + >>>>>>>> saAisNameLend((SaConstStringT)&default_ext_notification_object, >>>>>>>> head->notificationObject); >>>>>>>> + saAisNameLend((SaConstStringT)&default_ext_notifying_object, >>>>>>>> head->notifyingObject); >>>>>>>> +} >>>>>>>> + >>>>>>>> + >>>>>>>> +/** >>>>>>>> + * Fill header with extended SaNameT in additionalInfo >>>>>>>> + */ >>>>>>>> + void extFillHeaderAddInfo(SaNtfNotificationHeaderT *head, >>>>>>>> SaNtfNotificationHandleT notHandle) >>>>>>>> + { >>>>>>>> + int i; >>>>>>>> + SaStringT dest_ptr; >>>>>>>> + SaNameT name; >>>>>>>> + *(head->eventType) = SA_NTF_ALARM_COMMUNICATION; >>>>>>>> + *(head->eventTime) = SA_TIME_UNKNOWN; >>>>>>>> + >>>>>>>> + >>>>>>>> saAisNameLend((SaConstStringT)&default_ext_notification_object, >>>>>>>> head->notificationObject); >>>>>>>> + saAisNameLend((SaConstStringT)&default_ext_notifying_object, >>>>>>>> head->notifyingObject); >>>>>>>> + >>>>>>>> + 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; >>>>>>>> + saAisNameLend((SaConstStringT)&test1_ext_notification_object, >>>>>>>> &name); >>>>>>>> + >>>>>>>> + safassert(saNtfPtrValAllocate(notHandle, >>>>>>>> + strlen(saAisNameBorrow(&name)) + 2 + 1, >>>>>>>> + (void**)&dest_ptr, >>>>>>>> + &(head->additionalInfo[0].infoValue)), SA_AIS_OK); >>>>>>>> + >>>>>>>> + *((SaUint16T*)dest_ptr) = *((SaUint16T*)&name); >>>>>>>> + memcpy(dest_ptr + 2, saAisNameBorrow(&name), >>>>>>>> strlen(saAisNameBorrow(&name)) + 1); >>>>>>>> + >>>>>>>> + /* Fill first additionalInfo as extended SaNameT excluding >>>>>>>> NULL character */ >>>>>>>> + head->additionalInfo[1].infoType = SA_NTF_VALUE_LDAP_NAME; >>>>>>>> + head->additionalInfo[1].infoId = 1; >>>>>>>> + saAisNameLend((SaConstStringT)&test1_ext_notification_object, >>>>>>>> &name); >>>>>>>> + >>>>>>>> + safassert(saNtfPtrValAllocate(notHandle, >>>>>>>> + strlen(saAisNameBorrow(&name)) + 2, >>>>>>>> + (void**)&dest_ptr, >>>>>>>> + &(head->additionalInfo[1].infoValue)), SA_AIS_OK); >>>>>>>> + >>>>>>>> + *((SaUint16T*)dest_ptr) = *((SaUint16T*)&name); >>>>>>>> + memcpy(dest_ptr + 2, saAisNameBorrow(&name), >>>>>>>> strlen(saAisNameBorrow(&name))); >>>>>>>> + >>>>>>>> + /* Fill third additionalInfo as unextended SaNameT as >>>>>>>> legacy code */ >>>>>>>> + head->additionalInfo[2].infoType = SA_NTF_VALUE_LDAP_NAME; >>>>>>>> + head->additionalInfo[2].infoId = 1; >>>>>>>> + saAisNameLend(DEFAULT_UNEXT_NAME_STRING, &name); >>>>>>>> + >>>>>>>> + safassert(saNtfPtrValAllocate(notHandle, >>>>>>>> + sizeof(name), >>>>>>>> + (void**)&dest_ptr, >>>>>>>> + &(head->additionalInfo[2].infoValue)), SA_AIS_OK); >>>>>>>> + >>>>>>>> + memcpy(dest_ptr, &name, sizeof(name)); >>>>>>>> + >>>>>>>> + /* Fill fourth additionalInfo as unextended SaNameT */ >>>>>>>> + head->additionalInfo[3].infoType = SA_NTF_VALUE_LDAP_NAME; >>>>>>>> + head->additionalInfo[3].infoId = 1; >>>>>>>> + saAisNameLend(DEFAULT_UNEXT_NAME_STRING, &name); >>>>>>>> + >>>>>>>> + safassert(saNtfPtrValAllocate(notHandle, >>>>>>>> + strlen(saAisNameBorrow(&name)) + 2 + 1, >>>>>>>> + (void**)&dest_ptr, >>>>>>>> + &(head->additionalInfo[3].infoValue)), SA_AIS_OK); >>>>>>>> + >>>>>>>> + *((SaUint16T*)dest_ptr) = *((SaUint16T*)&name); >>>>>>>> + memcpy(dest_ptr + 2, saAisNameBorrow(&name), >>>>>>>> strlen(saAisNameBorrow(&name)) + 1); >>>>>>>> + } >>>>>>>> + >>>>>>>> + /** >>>>>>>> + * Test AdditionalInfo with extended SaNameT type >>>>>>>> + */ >>>>>>>> + void extAdditionalInfoTest(void) >>>>>>>> + { >>>>>>>> + SaNtfAlarmNotificationFilterT myAlarmFilter; >>>>>>>> + subscriptionId = 1; >>>>>>>> + SaNtfNotificationHeaderT *head; >>>>>>>> + >>>>>>>> + rc = SA_AIS_OK; >>>>>>>> + >>>>>>>> + resetCounters(); >>>>>>>> + >>>>>>>> + safassert(saNtfInitialize(&ntfHandle, &ntfCbTest, >>>>>>>> &ntfVersion) , SA_AIS_OK); >>>>>>>> + safassert(saNtfSelectionObjectGet(ntfHandle, >>>>>>>> &selectionObject) , SA_AIS_OK); >>>>>>>> + >>>>>>>> + /* specify complex filter */ >>>>>>>> + safassert(saNtfAlarmNotificationFilterAllocate( >>>>>>>> + ntfHandle, >>>>>>>> + &myAlarmFilter, >>>>>>>> + 1, >>>>>>>> + 1, >>>>>>>> + 1, >>>>>>>> + 1, >>>>>>>> + 0, >>>>>>>> + 0, >>>>>>>> + 0), SA_AIS_OK); >>>>>>>> + /* set header filter specific fields */ >>>>>>>> + extFillFilterHeader(&myAlarmFilter.notificationFilterHeader); >>>>>>>> + >>>>>>>> + /* Initialize filter handles */ >>>>>>>> + myNotificationFilterHandles.alarmFilterHandle = >>>>>>>> + myAlarmFilter.notificationFilterHandle; >>>>>>>> + myNotificationFilterHandles.attributeChangeFilterHandle = 0; >>>>>>>> + myNotificationFilterHandles.objectCreateDeleteFilterHandle = 0; >>>>>>>> + myNotificationFilterHandles.securityAlarmFilterHandle = 0; >>>>>>>> + myNotificationFilterHandles.stateChangeFilterHandle = 0; >>>>>>>> + >>>>>>>> + >>>>>>>> safassert(saNtfNotificationSubscribe(&myNotificationFilterHandles, >>>>>>>> + subscriptionId), SA_AIS_OK); >>>>>>>> + >>>>>>>> + /* Create a notification and send it */ >>>>>>>> + safassert(saNtfAlarmNotificationAllocate( >>>>>>>> + ntfHandle, >>>>>>>> + &myAlarmNotification, >>>>>>>> + 0, >>>>>>>> + (SaUint16T)(strlen(DEFAULT_ADDITIONAL_TEXT) + 1), >>>>>>>> + 4, >>>>>>>> + 0, >>>>>>>> + 0, >>>>>>>> + 0, >>>>>>>> + SA_NTF_ALLOC_SYSTEM_LIMIT), SA_AIS_OK); >>>>>>>> + >>>>>>>> + head = &myAlarmNotification.notificationHeader; >>>>>>>> + extFillHeaderAddInfo(head, >>>>>>>> myAlarmNotification.notificationHandle); >>>>>>>> + /* These 3 fields is alarm filter items */ >>>>>>>> + *(myAlarmNotification.perceivedSeverity) = >>>>>>>> SA_NTF_SEVERITY_WARNING; >>>>>>>> + *(myAlarmNotification.probableCause) = >>>>>>>> SA_NTF_BANDWIDTH_REDUCED; >>>>>>>> + *myAlarmNotification.trend = SA_NTF_TREND_MORE_SEVERE; >>>>>>>> + >>>>>>>> + myAlarmNotification.thresholdInformation->thresholdValueType >>>>>>>> = SA_NTF_VALUE_UINT32; >>>>>>>> + >>>>>>>> myAlarmNotification.thresholdInformation->thresholdValue.uint32Val >>>>>>>> = 600; >>>>>>>> + >>>>>>>> myAlarmNotification.thresholdInformation->thresholdHysteresis.uint32Val >>>>>>>> >>>>>>>> = 100; >>>>>>>> + >>>>>>>> myAlarmNotification.thresholdInformation->observedValue.uint32Val >>>>>>>> = 567; >>>>>>>> + myAlarmNotification.thresholdInformation->armTime = >>>>>>>> SA_TIME_UNKNOWN; >>>>>>>> + >>>>>>>> + >>>>>>>> safassert(saNtfNotificationSend(myAlarmNotification.notificationHandle), >>>>>>>> >>>>>>>> SA_AIS_OK); >>>>>>>> + >>>>>>>> + /* only this notification should be caught */ >>>>>>>> + ok_ids.ids[ok_ids.length++] = >>>>>>>> *myAlarmNotification.notificationHeader.notificationId; >>>>>>>> + poll_until_received(ntfHandle, >>>>>>>> *myAlarmNotification.notificationHeader.notificationId); >>>>>>>> + >>>>>>>> + if(ntfRecieved.alarmFilterHandle != 1 || >>>>>>>> + ntfRecieved.attributeChangeFilterHandle != 0 || >>>>>>>> + ntfRecieved.objectCreateDeleteFilterHandle !=0 || >>>>>>>> + ntfRecieved.securityAlarmFilterHandle != 0 || >>>>>>>> + ntfRecieved.stateChangeFilterHandle != 0) >>>>>>>> safassert(SA_AIS_ERR_BAD_FLAGS, SA_AIS_OK); >>>>>>>> + >>>>>>>> + >>>>>>>> safassert(saNtfNotificationFree(myAlarmNotification.notificationHandle) >>>>>>>> >>>>>>>> , SA_AIS_OK); >>>>>>>> + >>>>>>>> safassert(saNtfNotificationFilterFree(myAlarmFilter.notificationFilterHandle), >>>>>>>> >>>>>>>> SA_AIS_OK); >>>>>>>> + safassert(saNtfNotificationUnsubscribe(subscriptionId), >>>>>>>> SA_AIS_OK); >>>>>>>> + >>>>>>>> + safassert(saNtfFinalize(ntfHandle), SA_AIS_OK); >>>>>>>> + rc = check_errors(); >>>>>>>> + test_validate(rc, SA_AIS_OK); >>>>>>>> + } >>>>>>>> + >>>>>>>> +/** >>>>>>>> + * Test all filter header fields >>>>>>>> + */ >>>>>>>> +void extFilterNotificationTest(void) >>>>>>>> +{ >>>>>>>> + SaNtfAlarmNotificationFilterT myAlarmFilter; >>>>>>>> + subscriptionId = 1; >>>>>>>> + SaNtfNotificationHeaderT *head; >>>>>>>> + >>>>>>>> + rc = SA_AIS_OK; >>>>>>>> + >>>>>>>> + resetCounters(); >>>>>>>> + >>>>>>>> + safassert(saNtfInitialize(&ntfHandle, &ntfCbTest, >>>>>>>> &ntfVersion) , SA_AIS_OK); >>>>>>>> + safassert(saNtfSelectionObjectGet(ntfHandle, >>>>>>>> &selectionObject) , SA_AIS_OK); >>>>>>>> + >>>>>>>> + /* specify complex filter */ >>>>>>>> + safassert(saNtfAlarmNotificationFilterAllocate( >>>>>>>> + ntfHandle, >>>>>>>> + &myAlarmFilter, >>>>>>>> + 1, >>>>>>>> + 1, >>>>>>>> + 1, >>>>>>>> + 1, >>>>>>>> + 0, >>>>>>>> + 0, >>>>>>>> + 0), SA_AIS_OK); >>>>>>>> + /* set header filter specific fields */ >>>>>>>> + extFillFilterHeader(&myAlarmFilter.notificationFilterHeader); >>>>>>>> + >>>>>>>> + /* Initialize filter handles */ >>>>>>>> + myNotificationFilterHandles.alarmFilterHandle = >>>>>>>> + myAlarmFilter.notificationFilterHandle; >>>>>>>> + myNotificationFilterHandles.attributeChangeFilterHandle = 0; >>>>>>>> + myNotificationFilterHandles.objectCreateDeleteFilterHandle = 0; >>>>>>>> + myNotificationFilterHandles.securityAlarmFilterHandle = 0; >>>>>>>> + myNotificationFilterHandles.stateChangeFilterHandle = 0; >>>>>>>> + >>>>>>>> + >>>>>>>> safassert(saNtfNotificationSubscribe(&myNotificationFilterHandles, >>>>>>>> + subscriptionId), SA_AIS_OK); >>>>>>>> + >>>>>>>> + /* Create a notification and send it */ >>>>>>>> + safassert(saNtfAlarmNotificationAllocate( >>>>>>>> + ntfHandle, >>>>>>>> + &myAlarmNotification, >>>>>>>> + 0, >>>>>>>> + (SaUint16T)(strlen(DEFAULT_ADDITIONAL_TEXT) + 1), >>>>>>>> + 0, >>>>>>>> + 0, >>>>>>>> + 0, >>>>>>>> + 0, >>>>>>>> + SA_NTF_ALLOC_SYSTEM_LIMIT), SA_AIS_OK); >>>>>>>> + >>>>>>>> + head = &myAlarmNotification.notificationHeader; >>>>>>>> + extFillHeader(head); >>>>>>>> + >>>>>>>> + /* These 3 fields is alarm filter items */ >>>>>>>> + *(myAlarmNotification.perceivedSeverity) = >>>>>>>> SA_NTF_SEVERITY_WARNING; >>>>>>>> + *(myAlarmNotification.probableCause) = >>>>>>>> SA_NTF_BANDWIDTH_REDUCED; >>>>>>>> + *myAlarmNotification.trend = SA_NTF_TREND_MORE_SEVERE; >>>>>>>> + >>>>>>>> + myAlarmNotification.thresholdInformation->thresholdValueType >>>>>>>> = SA_NTF_VALUE_UINT32; >>>>>>>> + >>>>>>>> myAlarmNotification.thresholdInformation->thresholdValue.uint32Val >>>>>>>> = 600; >>>>>>>> + >>>>>>>> myAlarmNotification.thresholdInformation->thresholdHysteresis.uint32Val >>>>>>>> >>>>>>>> = 100; >>>>>>>> + >>>>>>>> myAlarmNotification.thresholdInformation->observedValue.uint32Val >>>>>>>> = 567; >>>>>>>> + myAlarmNotification.thresholdInformation->armTime = >>>>>>>> SA_TIME_UNKNOWN; >>>>>>>> + >>>>>>>> + *(head->eventType) = SA_NTF_ALARM_EQUIPMENT; >>>>>>>> + >>>>>>>> safassert(saNtfNotificationSend(myAlarmNotification.notificationHandle), >>>>>>>> >>>>>>>> SA_AIS_OK); >>>>>>>> + >>>>>>>> + saAisNameLend((SaConstStringT)&test1_ext_notification_object, >>>>>>>> head->notificationObject); >>>>>>>> + >>>>>>>> safassert(saNtfNotificationSend(myAlarmNotification.notificationHandle), >>>>>>>> >>>>>>>> SA_AIS_OK); >>>>>>>> + >>>>>>>> + extFillHeader(head); >>>>>>>> + saAisNameLend((SaConstStringT)&test1_ext_notifying_object, >>>>>>>> head->notifyingObject); >>>>>>>> + >>>>>>>> safassert(saNtfNotificationSend(myAlarmNotification.notificationHandle), >>>>>>>> >>>>>>>> SA_AIS_OK); >>>>>>>> + >>>>>>>> + extFillHeader(head); >>>>>>>> + head->notificationClassId->vendorId = 199; >>>>>>>> + >>>>>>>> safassert(saNtfNotificationSend(myAlarmNotification.notificationHandle), >>>>>>>> >>>>>>>> SA_AIS_OK); >>>>>>>> + >>>>>>>> + extFillHeader(head); >>>>>>>> + head->notificationClassId->majorId = 89; >>>>>>>> + >>>>>>>> safassert(saNtfNotificationSend(myAlarmNotification.notificationHandle), >>>>>>>> >>>>>>>> SA_AIS_OK); >>>>>>>> + >>>>>>>> + extFillHeader(head); >>>>>>>> + head->notificationClassId->minorId = 24; >>>>>>>> + >>>>>>>> safassert(saNtfNotificationSend(myAlarmNotification.notificationHandle), >>>>>>>> >>>>>>>> SA_AIS_OK); >>>>>>>> + >>>>>>>> + extFillHeader(head); >>>>>>>> + >>>>>>>> safassert(saNtfNotificationSend(myAlarmNotification.notificationHandle), >>>>>>>> >>>>>>>> SA_AIS_OK); >>>>>>>> + >>>>>>>> + /* only this notification should be caught */ >>>>>>>> + ok_ids.ids[ok_ids.length++] = >>>>>>>> *myAlarmNotification.notificationHeader.notificationId; >>>>>>>> + poll_until_received(ntfHandle, >>>>>>>> *myAlarmNotification.notificationHeader.notificationId); >>>>>>>> + >>>>>>>> + if(ntfRecieved.alarmFilterHandle != 1 || >>>>>>>> + ntfRecieved.attributeChangeFilterHandle != 0 || >>>>>>>> + ntfRecieved.objectCreateDeleteFilterHandle !=0 || >>>>>>>> + ntfRecieved.securityAlarmFilterHandle != 0 || >>>>>>>> + ntfRecieved.stateChangeFilterHandle != 0) >>>>>>>> safassert(SA_AIS_ERR_BAD_FLAGS, SA_AIS_OK); >>>>>>>> + >>>>>>>> + >>>>>>>> safassert(saNtfNotificationFree(myAlarmNotification.notificationHandle) >>>>>>>> >>>>>>>> , SA_AIS_OK); >>>>>>>> + >>>>>>>> safassert(saNtfNotificationFilterFree(myAlarmFilter.notificationFilterHandle), >>>>>>>> >>>>>>>> SA_AIS_OK); >>>>>>>> + safassert(saNtfNotificationUnsubscribe(subscriptionId), >>>>>>>> SA_AIS_OK); >>>>>>>> + >>>>>>>> + safassert(saNtfFinalize(ntfHandle), SA_AIS_OK); >>>>>>>> + rc = check_errors(); >>>>>>>> + test_validate(rc, SA_AIS_OK); >>>>>>>> +} >>>>>>>> + >>>>>>>> +/** >>>>>>>> + * Test Alarm notification with long dn objects >>>>>>>> + */ >>>>>>>> +void extAlarmNotificationTest(void) >>>>>>>> +{ >>>>>>>> + SaNtfAlarmNotificationFilterT myAlarmFilter; >>>>>>>> + subscriptionId = 1; >>>>>>>> + >>>>>>>> + rc = SA_AIS_OK; >>>>>>>> + >>>>>>>> + resetCounters(); >>>>>>>> + >>>>>>>> + safassert(saNtfInitialize(&ntfHandle, &ntfCbTest, >>>>>>>> &ntfVersion) , SA_AIS_OK); >>>>>>>> + safassert(saNtfSelectionObjectGet(ntfHandle, >>>>>>>> &selectionObject) , SA_AIS_OK); >>>>>>>> + >>>>>>>> + safassert(saNtfAlarmNotificationFilterAllocate( >>>>>>>> + ntfHandle, >>>>>>>> + &myAlarmFilter, >>>>>>>> + 0, >>>>>>>> + 0, >>>>>>>> + 0, >>>>>>>> + 0, >>>>>>>> + 1, >>>>>>>> + 1, >>>>>>>> + 1), SA_AIS_OK); >>>>>>>> + /* Set perceived severities */ >>>>>>>> + myAlarmFilter.perceivedSeverities[0] = >>>>>>>> SA_NTF_SEVERITY_WARNING; >>>>>>>> + myAlarmFilter.probableCauses[0] = SA_NTF_BANDWIDTH_REDUCED; >>>>>>>> + myAlarmFilter.trends[0] = SA_NTF_TREND_MORE_SEVERE; >>>>>>>> + >>>>>>>> + /* Initialize filter handles */ >>>>>>>> + myNotificationFilterHandles.alarmFilterHandle = >>>>>>>> + myAlarmFilter.notificationFilterHandle; >>>>>>>> + myNotificationFilterHandles.attributeChangeFilterHandle = 0; >>>>>>>> + myNotificationFilterHandles.objectCreateDeleteFilterHandle = 0; >>>>>>>> + myNotificationFilterHandles.securityAlarmFilterHandle = 0; >>>>>>>> + myNotificationFilterHandles.stateChangeFilterHandle = 0; >>>>>>>> + >>>>>>>> + >>>>>>>> safassert(saNtfNotificationSubscribe(&myNotificationFilterHandles, >>>>>>>> + subscriptionId), SA_AIS_OK); >>>>>>>> + >>>>>>>> + /* Create a notification and send it */ >>>>>>>> + safassert(saNtfAlarmNotificationAllocate( >>>>>>>> + ntfHandle, >>>>>>>> + &myAlarmNotification, >>>>>>>> + 0, >>>>>>>> + (SaUint16T)(strlen(DEFAULT_ADDITIONAL_TEXT) + 1), >>>>>>>> + 0, >>>>>>>> + 0, >>>>>>>> + 0, >>>>>>>> + 0, >>>>>>>> + SA_NTF_ALLOC_SYSTEM_LIMIT), SA_AIS_OK); >>>>>>>> + extFillHeader(&myAlarmNotification.notificationHeader); >>>>>>>> + >>>>>>>> + *(myAlarmNotification.perceivedSeverity) = >>>>>>>> SA_NTF_SEVERITY_CRITICAL; >>>>>>>> + *(myAlarmNotification.probableCause) = >>>>>>>> SA_NTF_CALL_ESTABLISHMENT_ERROR; >>>>>>>> + *myAlarmNotification.trend = SA_NTF_TREND_NO_CHANGE; >>>>>>>> + >>>>>>>> safassert(saNtfNotificationSend(myAlarmNotification.notificationHandle), >>>>>>>> >>>>>>>> SA_AIS_OK); >>>>>>>> + >>>>>>>> + *(myAlarmNotification.perceivedSeverity) = >>>>>>>> SA_NTF_SEVERITY_WARNING; >>>>>>>> + *(myAlarmNotification.probableCause) = >>>>>>>> SA_NTF_PRESSURE_UNACCEPTABLE; >>>>>>>> + >>>>>>>> safassert(saNtfNotificationSend(myAlarmNotification.notificationHandle), >>>>>>>> >>>>>>>> SA_AIS_OK); >>>>>>>> + >>>>>>>> + *(myAlarmNotification.perceivedSeverity) = >>>>>>>> SA_NTF_SEVERITY_WARNING; >>>>>>>> + *(myAlarmNotification.probableCause) = >>>>>>>> SA_NTF_BANDWIDTH_REDUCED; >>>>>>>> + *myAlarmNotification.trend = SA_NTF_TREND_NO_CHANGE; >>>>>>>> + >>>>>>>> safassert(saNtfNotificationSend(myAlarmNotification.notificationHandle), >>>>>>>> >>>>>>>> SA_AIS_OK); >>>>>>>> + >>>>>>>> + extFillHeader(&myAlarmNotification.notificationHeader); >>>>>>>> + /* These 3 fields is filter items */ >>>>>>>> + *(myAlarmNotification.perceivedSeverity) = >>>>>>>> SA_NTF_SEVERITY_WARNING; >>>>>>>> + *(myAlarmNotification.probableCause) = >>>>>>>> SA_NTF_BANDWIDTH_REDUCED; >>>>>>>> + *myAlarmNotification.trend = SA_NTF_TREND_MORE_SEVERE; >>>>>>>> + myAlarmNotification.thresholdInformation->thresholdValueType >>>>>>>> = SA_NTF_VALUE_UINT32; >>>>>>>> + >>>>>>>> myAlarmNotification.thresholdInformation->thresholdValue.uint32Val >>>>>>>> = 600; >>>>>>>> + >>>>>>>> myAlarmNotification.thresholdInformation->thresholdHysteresis.uint32Val >>>>>>>> >>>>>>>> = 100; >>>>>>>> + >>>>>>>> myAlarmNotification.thresholdInformation->observedValue.uint32Val >>>>>>>> = 567; >>>>>>>> + myAlarmNotification.thresholdInformation->armTime = >>>>>>>> SA_TIME_UNKNOWN; >>>>>>>> + >>>>>>>> safassert(saNtfNotificationSend(myAlarmNotification.notificationHandle), >>>>>>>> >>>>>>>> SA_AIS_OK); >>>>>>>> + /* only this notification should be caught*/ >>>>>>>> + ok_ids.ids[ok_ids.length++] = >>>>>>>> *myAlarmNotification.notificationHeader.notificationId; >>>>>>>> + poll_until_received(ntfHandle, >>>>>>>> *myAlarmNotification.notificationHeader.notificationId); >>>>>>>> + if(ntfRecieved.alarmFilterHandle != 1 || >>>>>>>> + ntfRecieved.attributeChangeFilterHandle != 0 || >>>>>>>> + ntfRecieved.objectCreateDeleteFilterHandle !=0 || >>>>>>>> + ntfRecieved.securityAlarmFilterHandle != 0 || >>>>>>>> + ntfRecieved.stateChangeFilterHandle != 0) >>>>>>>> safassert(SA_AIS_ERR_BAD_FLAGS, SA_AIS_OK); >>>>>>>> + >>>>>>>> + >>>>>>>> safassert(saNtfNotificationFree(myAlarmNotification.notificationHandle) >>>>>>>> >>>>>>>> , SA_AIS_OK); >>>>>>>> + >>>>>>>> safassert(saNtfNotificationFilterFree(myAlarmFilter.notificationFilterHandle), >>>>>>>> >>>>>>>> SA_AIS_OK); >>>>>>>> + >>>>>>>> + safassert(saNtfNotificationUnsubscribe(subscriptionId), >>>>>>>> SA_AIS_OK); >>>>>>>> + safassert(saNtfFinalize(ntfHandle), SA_AIS_OK); >>>>>>>> + rc = check_errors(); >>>>>>>> + test_validate(rc, SA_AIS_OK); >>>>>>>> +} >>>>>>>> + >>>>>>>> +/** >>>>>>>> + * Test Object Create/Delete notification with long dn objects >>>>>>>> + */ >>>>>>>> +void extObjectCreateDeleteNotificationTest(void) >>>>>>>> +{ >>>>>>>> + SaNtfObjectCreateDeleteNotificationFilterT myFilter; >>>>>>>> + >>>>>>>> + subscriptionId = 2; >>>>>>>> + >>>>>>>> + resetCounters(); >>>>>>>> + >>>>>>>> + safassert(saNtfInitialize(&ntfHandle, &ntfCbTest, >>>>>>>> &ntfVersion) , SA_AIS_OK); >>>>>>>> + safassert(saNtfSelectionObjectGet(ntfHandle, >>>>>>>> &selectionObject) , SA_AIS_OK); >>>>>>>> + >>>>>>>> + safassert(saNtfObjectCreateDeleteNotificationFilterAllocate( >>>>>>>> + ntfHandle, >>>>>>>> + &myFilter, >>>>>>>> + 1, >>>>>>>> + 1, >>>>>>>> + 1, >>>>>>>> + 1, >>>>>>>> + 2), SA_AIS_OK); >>>>>>>> + myFilter.sourceIndicators[0] = SA_NTF_OBJECT_OPERATION; >>>>>>>> + myFilter.sourceIndicators[1] = SA_NTF_MANAGEMENT_OPERATION; >>>>>>>> + extFillFilterHeader(&myFilter.notificationFilterHeader); >>>>>>>> + myFilter.notificationFilterHeader.eventTypes[0] = >>>>>>>> SA_NTF_OBJECT_CREATION; >>>>>>>> + /* Initialize filter handles */ >>>>>>>> + myNotificationFilterHandles.alarmFilterHandle = 0; >>>>>>>> + myNotificationFilterHandles.attributeChangeFilterHandle = 0; >>>>>>>> + myNotificationFilterHandles.objectCreateDeleteFilterHandle = >>>>>>>> + myFilter.notificationFilterHandle; >>>>>>>> + myNotificationFilterHandles.securityAlarmFilterHandle = 0; >>>>>>>> + myNotificationFilterHandles.stateChangeFilterHandle = 0; >>>>>>>> + >>>>>>>> safassert(saNtfNotificationSubscribe(&myNotificationFilterHandles, >>>>>>>> + subscriptionId), SA_AIS_OK); >>>>>>>> + extCreateObjectCreateDeleteNotification(ntfHandle, >>>>>>>> &myObjCrDelNotification); >>>>>>>> + *(myObjCrDelNotification.sourceIndicator) = >>>>>>>> SA_NTF_OBJECT_OPERATION; >>>>>>>> + >>>>>>>> safassert(saNtfNotificationSend(myObjCrDelNotification.notificationHandle), >>>>>>>> >>>>>>>> SA_AIS_OK); >>>>>>>> + /* this notification should be caught*/ >>>>>>>> + ok_ids.ids[ok_ids.length++] = >>>>>>>> *myObjCrDelNotification.notificationHeader.notificationId; >>>>>>>> + >>>>>>>> + *(myObjCrDelNotification.sourceIndicator) = >>>>>>>> SA_NTF_UNKNOWN_OPERATION; >>>>>>>> + >>>>>>>> safassert(saNtfNotificationSend(myObjCrDelNotification.notificationHandle), >>>>>>>> >>>>>>>> SA_AIS_OK); >>>>>>>> + >>>>>>>> + *(myObjCrDelNotification.sourceIndicator) = >>>>>>>> SA_NTF_MANAGEMENT_OPERATION; >>>>>>>> + >>>>>>>> safassert(saNtfNotificationSend(myObjCrDelNotification.notificationHandle), >>>>>>>> >>>>>>>> SA_AIS_OK); >>>>>>>> + /* this notification should be caught*/ >>>>>>>> + ok_ids.ids[ok_ids.length++] = >>>>>>>> *myObjCrDelNotification.notificationHeader.notificationId; >>>>>>>> + poll_until_received(ntfHandle, >>>>>>>> *myObjCrDelNotification.notificationHeader.notificationId); >>>>>>>> + if(ntfRecieved.alarmFilterHandle != 0 || >>>>>>>> + ntfRecieved.attributeChangeFilterHandle != 0 || >>>>>>>> + ntfRecieved.objectCreateDeleteFilterHandle != ok_ids.length|| >>>>>>>> + ntfRecieved.securityAlarmFilterHandle != 0 || >>>>>>>> + ntfRecieved.stateChangeFilterHandle != 0) >>>>>>>> safassert(SA_AIS_ERR_BAD_FLAGS, SA_AIS_OK); >>>>>>>> + >>>>>>>> safassert(saNtfNotificationFree(myObjCrDelNotification.notificationHandle), >>>>>>>> >>>>>>>> SA_AIS_OK); >>>>>>>> + >>>>>>>> safassert(saNtfNotificationFilterFree(myFilter.notificationFilterHandle), >>>>>>>> >>>>>>>> SA_AIS_OK); >>>>>>>> + >>>>>>>> + safassert(saNtfNotificationUnsubscribe(subscriptionId), >>>>>>>> SA_AIS_OK); >>>>>>>> + safassert(saNtfFinalize(ntfHandle) , SA_AIS_OK); >>>>>>>> + rc = check_errors(); >>>>>>>> + test_validate(rc, SA_AIS_OK); >>>>>>>> +} >>>>>>>> + >>>>>>>> +/** >>>>>>>> + * Test Attribute Change notification with long dn objects >>>>>>>> + */ >>>>>>>> +void extAttributeChangeNotificationTest(void) >>>>>>>> +{ >>>>>>>> + SaNtfAttributeChangeNotificationFilterT myFilter; >>>>>>>> + >>>>>>>> + subscriptionId = 2; >>>>>>>> + >>>>>>>> + resetCounters(); >>>>>>>> + >>>>>>>> + safassert(saNtfInitialize(&ntfHandle, &ntfCbTest, >>>>>>>> &ntfVersion) , SA_AIS_OK); >>>>>>>> + safassert(saNtfSelectionObjectGet(ntfHandle, >>>>>>>> &selectionObject) , SA_AIS_OK); >>>>>>>> + >>>>>>>> + safassert(saNtfAttributeChangeNotificationFilterAllocate( >>>>>>>> + ntfHandle, >>>>>>>> + &myFilter, >>>>>>>> + 1, >>>>>>>> + 1, >>>>>>>> + 1, >>>>>>>> + 1, >>>>>>>> + 2), SA_AIS_OK); >>>>>>>> + >>>>>>>> + myFilter.sourceIndicators[0] = SA_NTF_OBJECT_OPERATION; >>>>>>>> + myFilter.sourceIndicators[1] = SA_NTF_MANAGEMENT_OPERATION; >>>>>>>> + extFillFilterHeader(&myFilter.notificationFilterHeader); >>>>>>>> + myFilter.notificationFilterHeader.eventTypes[0] = >>>>>>>> SA_NTF_ATTRIBUTE_CHANGED; >>>>>>>> + /* Initialize filter handles */ >>>>>>>> + myNotificationFilterHandles.alarmFilterHandle = 0; >>>>>>>> + myNotificationFilterHandles.attributeChangeFilterHandle = >>>>>>>> + myFilter.notificationFilterHandle; >>>>>>>> + myNotificationFilterHandles.objectCreateDeleteFilterHandle = 0; >>>>>>>> + myNotificationFilterHandles.securityAlarmFilterHandle = 0; >>>>>>>> + myNotificationFilterHandles.stateChangeFilterHandle = 0; >>>>>>>> + >>>>>>>> safassert(saNtfNotificationSubscribe(&myNotificationFilterHandles, >>>>>>>> + subscriptionId), SA_AIS_OK); >>>>>>>> + extCreateAttributeChangeNotification(ntfHandle, >>>>>>>> &myAttrChangeNotification); >>>>>>>> + *(myAttrChangeNotification.sourceIndicator) = >>>>>>>> SA_NTF_OBJECT_OPERATION; >>>>>>>> + >>>>>>>> safassert(saNtfNotificationSend(myAttrChangeNotification.notificationHandle), >>>>>>>> >>>>>>>> SA_AIS_OK); >>>>>>>> + /* this notification should be caught*/ >>>>>>>> + ok_ids.ids[ok_ids.length++] = >>>>>>>> *myAttrChangeNotification.notificationHeader.notificationId; >>>>>>>> + >>>>>>>> + *(myAttrChangeNotification.sourceIndicator) = >>>>>>>> SA_NTF_UNKNOWN_OPERATION; >>>>>>>> + >>>>>>>> safassert(saNtfNotificationSend(myAttrChangeNotification.notificationHandle), >>>>>>>> >>>>>>>> SA_AIS_OK); >>>>>>>> + >>>>>>>> + *(myAttrChangeNotification.sourceIndicator) = >>>>>>>> SA_NTF_MANAGEMENT_OPERATION; >>>>>>>> + >>>>>>>> safassert(saNtfNotificationSend(myAttrChangeNotification.notificationHandle), >>>>>>>> >>>>>>>> SA_AIS_OK); >>>>>>>> + /* this notification should be caught*/ >>>>>>>> + ok_ids.ids[ok_ids.length++] = >>>>>>>> *myAttrChangeNotification.notificationHeader.notificationId; >>>>>>>> + poll_until_received(ntfHandle, >>>>>>>> *myAttrChangeNotification.notificationHeader.notificationId); >>>>>>>> + if(ntfRecieved.alarmFilterHandle != 0 || >>>>>>>> + ntfRecieved.attributeChangeFilterHandle != >>>>>>>> ok_ids.length || >>>>>>>> + ntfRecieved.objectCreateDeleteFilterHandle != 0|| >>>>>>>> + ntfRecieved.securityAlarmFilterHandle != 0 || >>>>>>>> + ntfRecieved.stateChangeFilterHandle != 0) >>>>>>>> safassert(SA_AIS_ERR_BAD_FLAGS, SA_AIS_OK); >>>>>>>> + >>>>>>>> safassert(saNtfNotificationFree(myAttrChangeNotification.notificationHandle), >>>>>>>> >>>>>>>> SA_AIS_OK); >>>>>>>> + >>>>>>>> safassert(saNtfNotificationFilterFree(myFilter.notificationFilterHandle), >>>>>>>> >>>>>>>> SA_AIS_OK); >>>>>>>> + >>>>>>>> + >>>>>>>> + safassert(saNtfNotificationUnsubscribe(subscriptionId), >>>>>>>> SA_AIS_OK); >>>>>>>> + safassert(saNtfFinalize(ntfHandle) , SA_AIS_OK); >>>>>>>> + rc = check_errors(); >>>>>>>> + test_validate(rc, SA_AIS_OK); >>>>>>>> +} >>>>>>>> + >>>>>>>> +/** >>>>>>>> + * Test State Change notification with long dn objects >>>>>>>> + */ >>>>>>>> +void extStateChangeNotificationTest(void) >>>>>>>> +{ >>>>>>>> + SaNtfStateChangeNotificationFilterT myFilter; >>>>>>>> + >>>>>>>> + subscriptionId = 2; >>>>>>>> + >>>>>>>> + resetCounters(); >>>>>>>> + >>>>>>>> + safassert(saNtfInitialize(&ntfHandle, &ntfCbTest, >>>>>>>> &ntfVersion) , SA_AIS_OK); >>>>>>>> + safassert(saNtfSelectionObjectGet(ntfHandle, >>>>>>>> &selectionObject) , SA_AIS_OK); >>>>>>>> + >>>>>>>> + safassert(saNtfStateChangeNotificationFilterAllocate( >>>>>>>> + ntfHandle, >>>>>>>> + &myFilter, >>>>>>>> + 1, >>>>>>>> + 1, >>>>>>>> + 1, >>>>>>>> + 1, >>>>>>>> + 2, >>>>>>>> + 0), SA_AIS_OK); >>>>>>>> + >>>>>>>> + myFilter.sourceIndicators[0] = SA_NTF_OBJECT_OPERATION; >>>>>>>> + myFilter.sourceIndicators[1] = SA_NTF_MANAGEMENT_OPERATION; >>>>>>>> + extFillFilterHeader(&myFilter.notificationFilterHeader); >>>>>>>> + myFilter.notificationFilterHeader.eventTypes[0] = >>>>>>>> SA_NTF_OBJECT_STATE_CHANGE; >>>>>>>> + /* Initialize filter handles */ >>>>>>>> + myNotificationFilterHandles.alarmFilterHandle = 0; >>>>>>>> + myNotificationFilterHandles.attributeChangeFilterHandle = 0; >>>>>>>> + myNotificationFilterHandles.objectCreateDeleteFilterHandle = 0; >>>>>>>> + myNotificationFilterHandles.securityAlarmFilterHandle = 0; >>>>>>>> + myNotificationFilterHandles.stateChangeFilterHandle = >>>>>>>> myFilter.notificationFilterHandle; >>>>>>>> + >>>>>>>> safassert(saNtfNotificationSubscribe(&myNotificationFilterHandles, >>>>>>>> + subscriptionId), SA_AIS_OK); >>>>>>>> + >>>>>>>> + extCreateStateChangeNotification(ntfHandle, >>>>>>>> &myStateChangeNotification); >>>>>>>> + *(myStateChangeNotification.sourceIndicator) = >>>>>>>> SA_NTF_OBJECT_OPERATION; >>>>>>>> + >>>>>>>> safassert(saNtfNotificationSend(myStateChangeNotification.notificationHandle), >>>>>>>> >>>>>>>> SA_AIS_OK); >>>>>>>> + /* this notification should be caught*/ >>>>>>>> + ok_ids.ids[ok_ids.length++] = >>>>>>>> *myStateChangeNotification.notificationHeader.notificationId; >>>>>>>> + >>>>>>>> + *(myStateChangeNotification.sourceIndicator) = >>>>>>>> SA_NTF_UNKNOWN_OPERATION; >>>>>>>> + >>>>>>>> safassert(saNtfNotificationSend(myStateChangeNotification.notificationHandle), >>>>>>>> >>>>>>>> SA_AIS_OK); >>>>>>>> + >>>>>>>> + *(myStateChangeNotification.sourceIndicator) = >>>>>>>> SA_NTF_MANAGEMENT_OPERATION; >>>>>>>> + >>>>>>>> safassert(saNtfNotificationSend(myStateChangeNotification.notificationHandle), >>>>>>>> >>>>>>>> SA_AIS_OK); >>>>>>>> + /* this notification should be caught*/ >>>>>>>> + ok_ids.ids[ok_ids.length++] = >>>>>>>> *myStateChangeNotification.notificationHeader.notificationId; >>>>>>>> + poll_until_received(ntfHandle, >>>>>>>> *myStateChangeNotification.notificationHeader.notificationId); >>>>>>>> + if(ntfRecieved.alarmFilterHandle != 0 || >>>>>>>> + ntfRecieved.attributeChangeFilterHandle != 0 || >>>>>>>> + ntfRecieved.objectCreateDeleteFilterHandle != 0|| >>>>>>>> + ntfRecieved.securityAlarmFilterHandle != 0 || >>>>>>>> + ntfRecieved.stateChangeFilterHandle != >>>>>>>> ok_ids.length) safassert(SA_AIS_ERR_BAD_FLAGS, SA_AIS_OK); >>>>>>>> + >>>>>>>> safassert(saNtfNotificationFree(myStateChangeNotification.notificationHandle), >>>>>>>> >>>>>>>> SA_AIS_OK); >>>>>>>> + >>>>>>>> safassert(saNtfNotificationFilterFree(myFilter.notificationFilterHandle), >>>>>>>> >>>>>>>> SA_AIS_OK); >>>>>>>> + >>>>>>>> + safassert(saNtfNotificationUnsubscribe(subscriptionId), >>>>>>>> SA_AIS_OK); >>>>>>>> + safassert(saNtfFinalize(ntfHandle), SA_AIS_OK); >>>>>>>> + rc = check_errors(); >>>>>>>> + test_validate(rc, SA_AIS_OK); >>>>>>>> +} >>>>>>>> + >>>>>>>> +/** >>>>>>>> + * Test Security Alarm notification with long dn objects >>>>>>>> + */ >>>>>>>> +void extSecurityAlarmNotificationTest(void) >>>>>>>> +{ >>>>>>>> + SaNtfSecurityAlarmNotificationFilterT myFilter; >>>>>>>> + >>>>>>>> + subscriptionId = 5; >>>>>>>> + >>>>>>>> + resetCounters(); >>>>>>>> + safassert(saNtfInitialize(&ntfHandle, &ntfCbTest, >>>>>>>> &ntfVersion) , SA_AIS_OK); >>>>>>>> + safassert(saNtfSelectionObjectGet(ntfHandle, >>>>>>>> &selectionObject) , SA_AIS_OK); >>>>>>>> + >>>>>>>> + safassert(saNtfSecurityAlarmNotificationFilterAllocate( >>>>>>>> + ntfHandle, >>>>>>>> + &myFilter, >>>>>>>> + 0, >>>>>>>> + 0, >>>>>>>> + 0, >>>>>>>> + 0, >>>>>>>> + 3, >>>>>>>> + 0, >>>>>>>> + 0, >>>>>>>> + 0, >>>>>>>> + 0), SA_AIS_OK); >>>>>>>> + >>>>>>>> + /* Initialize filter handles */ >>>>>>>> + myNotificationFilterHandles.alarmFilterHandle = 0; >>>>>>>> + myNotificationFilterHandles.attributeChangeFilterHandle = 0; >>>>>>>> + myNotificationFilterHandles.objectCreateDeleteFilterHandle = 0; >>>>>>>> + myNotificationFilterHandles.securityAlarmFilterHandle = >>>>>>>> + myFilter.notificationFilterHandle; >>>>>>>> + myNotificationFilterHandles.stateChangeFilterHandle = 0; >>>>>>>> + myFilter.probableCauses[0] = SA_NTF_ADAPTER_ERROR; >>>>>>>> + myFilter.probableCauses[1] = SA_NTF_EQUIPMENT_MALFUNCTION; >>>>>>>> + myFilter.probableCauses[2] = SA_NTF_VERSION_MISMATCH; >>>>>>>> + >>>>>>>> + /* subscribe */ >>>>>>>> + >>>>>>>> safassert(saNtfNotificationSubscribe(&myNotificationFilterHandles, >>>>>>>> + subscriptionId), SA_AIS_OK); >>>>>>>> + extCreateSecurityAlarmNotification(ntfHandle, >>>>>>>> &mySecAlarmNotification); >>>>>>>> + >>>>>>>> safassert(saNtfNotificationSend(mySecAlarmNotification.notificationHandle), >>>>>>>> >>>>>>>> SA_AIS_OK); >>>>>>>> + >>>>>>>> + *mySecAlarmNotification.probableCause = >>>>>>>> SA_NTF_VERSION_MISMATCH; >>>>>>>> + >>>>>>>> safassert(saNtfNotificationSend(mySecAlarmNotification.notificationHandle), >>>>>>>> >>>>>>>> SA_AIS_OK); >>>>>>>> + ok_ids.ids[ok_ids.length++] = >>>>>>>> *mySecAlarmNotification.notificationHeader.notificationId; >>>>>>>> + >>>>>>>> + *mySecAlarmNotification.probableCause = >>>>>>>> SA_NTF_RESPONSE_TIME_EXCESSIVE; >>>>>>>> + >>>>>>>> safassert(saNtfNotificationSend(mySecAlarmNotification.notificationHandle), >>>>>>>> >>>>>>>> SA_AIS_OK); >>>>>>>> + >>>>>>>> + *mySecAlarmNotification.probableCause = >>>>>>>> SA_NTF_NON_REPUDIATION_FAILURE; >>>>>>>> + >>>>>>>> safassert(saNtfNotificationSend(mySecAlarmNotification.notificationHandle), >>>>>>>> >>>>>>>> SA_AIS_OK); >>>>>>>> + >>>>>>>> + *mySecAlarmNotification.probableCause = >>>>>>>> SA_NTF_EQUIPMENT_MALFUNCTION; >>>>>>>> + >>>>>>>> safassert(saNtfNotificationSend(mySecAlarmNotification.notificationHandle), >>>>>>>> >>>>>>>> SA_AIS_OK); >>>>>>>> + ok_ids.ids[ok_ids.length++] = >>>>>>>> *mySecAlarmNotification.notificationHeader.notificationId; >>>>>>>> + *mySecAlarmNotification.probableCause = >>>>>>>> SA_NTF_STORAGE_CAPACITY_PROBLEM; >>>>>>>> + >>>>>>>> safassert(saNtfNotificationSend(mySecAlarmNotification.notificationHandle), >>>>>>>> >>>>>>>> SA_AIS_OK); >>>>>>>> + *mySecAlarmNotification.probableCause = >>>>>>>> SA_NTF_DENIAL_OF_SERVICE; >>>>>>>> + >>>>>>>> safassert(saNtfNotificationSend(mySecAlarmNotification.notificationHandle), >>>>>>>> >>>>>>>> SA_AIS_OK); >>>>>>>> + *mySecAlarmNotification.probableCause = SA_NTF_ADAPTER_ERROR; >>>>>>>> + >>>>>>>> safassert(saNtfNotificationSend(mySecAlarmNotification.notificationHandle), >>>>>>>> >>>>>>>> SA_AIS_OK); >>>>>>>> + ok_ids.ids[ok_ids.length++] = >>>>>>>> *mySecAlarmNotification.notificationHeader.notificationId; >>>>>>>> + poll_until_received(ntfHandle, >>>>>>>> *mySecAlarmNotification.notificationHeader.notificationId); >>>>>>>> + if(ntfRecieved.alarmFilterHandle != 0 || >>>>>>>> + ntfRecieved.attributeChangeFilterHandle != 0 || >>>>>>>> + ntfRecieved.objectCreateDeleteFilterHandle !=0 || >>>>>>>> + ntfRecieved.securityAlarmFilterHandle != >>>>>>>> ok_ids.length || >>>>>>>> + ntfRecieved.stateChangeFilterHandle != 0) >>>>>>>> safassert(SA_AIS_ERR_BAD_FLAGS, SA_AIS_OK); >>>>>>>> + >>>>>>>> safassert(saNtfNotificationFree(mySecAlarmNotification.notificationHandle), >>>>>>>> >>>>>>>> SA_AIS_OK); >>>>>>>> + >>>>>>>> safassert(saNtfNotificationFilterFree(myFilter.notificationFilterHandle), >>>>>>>> >>>>>>>> SA_AIS_OK); >>>>>>>> + >>>>>>>> + safassert(saNtfNotificationUnsubscribe(subscriptionId), >>>>>>>> SA_AIS_OK); >>>>>>>> + safassert(saNtfFinalize(ntfHandle) , SA_AIS_OK); >>>>>>>> + rc = check_errors(); >>>>>>>> + test_validate(rc, SA_AIS_OK); >>>>>>>> +} >>>>>>>> + >>>>>>>> +__attribute__ ((constructor)) static void >>>>>>>> longDnObject_notification_constructor(void) >>>>>>>> +{ >>>>>>>> + init_ext_object(); >>>>>>>> + test_suite_add(35, "Long DNs Test"); >>>>>>>> + test_case_add(35, extAdditionalInfoTest >>>>>>>> + , "Test additional info with extended >>>>>>>> SaNameT type"); >>>>>>>> + test_case_add(35, extFilterNotificationTest >>>>>>>> + , "Test filter with longDn objects"); >>>>>>>> + test_case_add(35, extAlarmNotificationTest >>>>>>>> + , "Test Alarm notification with longDn >>>>>>>> objects"); >>>>>>>> + test_case_add(35, extObjectCreateDeleteNotificationTest >>>>>>>> + , "Test Object Create/Delete notification >>>>>>>> with longDn objects"); >>>>>>>> + test_case_add(35, extAttributeChangeNotificationTest >>>>>>>> + , "Test Attribute Change notification with >>>>>>>> longDn objects"); >>>>>>>> + test_case_add(35, extStateChangeNotificationTest >>>>>>>> + , "Test State Change notification with >>>>>>>> longDn objects"); >>>>>>>> + test_case_add(35, extSecurityAlarmNotificationTest >>>>>>>> + , "Test Security Alarm notification with >>>>>>>> longDn objects"); >>>>>>>> +} >>>>>>>> diff --git a/tests/unit_test_fw/inc/util.h >>>>>>>> b/tests/unit_test_fw/inc/util.h >>>>>>>> --- a/tests/unit_test_fw/inc/util.h >>>>>>>> +++ b/tests/unit_test_fw/inc/util.h >>>>>>>> @@ -19,11 +19,10 @@ >>>>>>>> #ifndef util_h >>>>>>>> #define util_h >>>>>>>> >>>>>>>> +#include <saAis.h> >>>>>>>> + >>>>>>>> extern SaTimeT getSaTimeT(void); >>>>>>>> -extern void create_dn(char *rdn, char *parent, SaNameT *dn); >>>>>>>> -extern void sa_namet_init(char *value, SaNameT *namet); >>>>>>>> extern const char *get_saf_error(SaAisErrorT rc); >>>>>>>> - >>>>>>>> extern void safassert_impl(const char* file, unsigned int >>>>>>>> line, SaAisErrorT actual, SaAisErrorT expected); >>>>>>>> >>>>>>>> /** >>>>>>>> diff --git a/tests/unit_test_fw/src/Makefile.am >>>>>>>> b/tests/unit_test_fw/src/Makefile.am >>>>>>>> --- a/tests/unit_test_fw/src/Makefile.am >>>>>>>> +++ b/tests/unit_test_fw/src/Makefile.am >>>>>>>> @@ -22,6 +22,7 @@ noinst_LTLIBRARIES = libutest.la >>>>>>>> >>>>>>>> libutest_la_CPPFLAGS = \ >>>>>>>> $(AM_CPPFLAGS) \ >>>>>>>> + -DSA_EXTENDED_NAME_SOURCE \ >>>>>>>> -I$(top_srcdir)/tests/unit_test_fw/inc \ >>>>>>>> -I$(top_srcdir)/osaf/libs/saf/include >>>>>>>> >>>>>>>> diff --git a/tests/unit_test_fw/src/util.c >>>>>>>> b/tests/unit_test_fw/src/util.c >>>>>>>> --- a/tests/unit_test_fw/src/util.c >>>>>>>> +++ b/tests/unit_test_fw/src/util.c >>>>>>>> @@ -21,8 +21,7 @@ >>>>>>>> #include <sys/time.h> >>>>>>>> #include <unistd.h> >>>>>>>> #include <assert.h> >>>>>>>> -#include <saAis.h> >>>>>>>> - >>>>>>>> +#include "util.h" >>>>>>>> static const char *saf_error[] = >>>>>>>> { >>>>>>>> "SA_AIS_NOT_VALID", >>>>>>>> @@ -65,17 +64,6 @@ SaTimeT getSaTimeT(void) >>>>>>>> (tp.tv_usec * SA_TIME_ONE_MICROSECOND); >>>>>>>> } >>>>>>>> >>>>>>>> -void create_dn(char *rdn, char *parent, SaNameT *dn) >>>>>>>> -{ >>>>>>>> - dn->length = sprintf((char*)dn->value, "%s,%s", rdn, parent); >>>>>>>> - assert(dn->length < SA_MAX_NAME_LENGTH); >>>>>>>> -} >>>>>>>> - >>>>>>>> -void sa_namet_init(char *value, SaNameT *namet) >>>>>>>> -{ >>>>>>>> - namet->length = sprintf((char*)namet->value, "%s", value); >>>>>>>> -} >>>>>>>> - >>>>>>>> const char *get_saf_error(SaAisErrorT rc) >>>>>>>> { >>>>>>>> if (rc <= SA_AIS_ERR_UNAVAILABLE) >>>>>>>> >>>>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>> >>>>> >>>> >>> >> > ------------------------------------------------------------------------------ Infragistics Professional Build stunning WinForms apps today! Reboot your WinForms applications with our WinForms controls. Build a bridge from your legacy apps to the future. http://pubads.g.doubleclick.net/gampad/clk?id=153845071&iu=/4140/ostg.clktrk _______________________________________________ Opensaf-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/opensaf-devel
