Yes I noticed, but that is a bug in ntfimcn_notifier.c, isn't it? The SAF spec says that for SA_NTF_VALUE_LDAP_NAME, the data type is SaNameT.
/ Anders Widell On 07/31/2014 12:45 PM, minhchau wrote: > Note that the usage of SA_NTF_VALUE_LDAP_NAME for SaNtfValueT is not > consistent. Currently the ntfimcn_notifier.c , function > fill_attribute_value(), treat SA_NTF_VALUE_LDAP_NAME as > SA_NTF_VALUE_STRING, it drop out 2 bytes of .length. > . So it's not always "strlen(x) + 3" in document. > > On 7/31/2014 8:17 PM, Anders Widell wrote: >> I am leaning towards your suggested solution for >> SA_NTF_VALUE_LDAP_NAME now. :-) It will be the easiest one to >> implement in NTF, but it may be a bit non-obvious to the user. We >> have to clearly document that for SA_NTF_VALUE_LDAP_NAME, the user >> must allocate strlen(x) + 3 bytes. >> >> With the help of Praveen's patch, it is possible to use >> saAisNameLend() on the allocated data for additional info. Something >> similar must then be done also at other places where SaNtfValueT is >> used, and I think this is still missing. Also, at the receiving end >> it is still not possible to use saAisNameBorrow() because we would >> need to perform the opposite conversion first. >> >> A mabe simpler yet solution is to state in the documentation that >> saAisNameLend() / saAisNameBorrow() must NOT be used for data type >> SA_NTF_VALUE_LDAP_NAME. Instead, the user would himself be >> responsible for filling in 16-bit length + NUL terminated string. >> >> When I look at the existing code, it seems rather buggy for >> SA_NTF_VALUE_LDAP_NAME. This 16-bit length field in SaNameT, >> shouldn't it be encoded so that we handle big-endian / little endian >> conversion properly? I don't see where this is done in the old code. >> >> / Anders Widell >> >> On 07/31/2014 11:45 AM, praveen malviya wrote: >>> >>> On 31-Jul-14 2:50 PM, Anders Widell wrote: >>>> >>>> On 07/31/2014 11:10 AM, praveen malviya wrote: >>>>> >>>>> On 31-Jul-14 1:39 PM, Anders Widell wrote: >>>>>> 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. >>>>> If string length is >= kExtendedNameMagic then NtfSend() API can >>>>> return error as it is already doing it for other parameters. >>>> You are right, kExtendedNameMagic is larger than kMaxDnLength is it >>>> is not a problem as long as we check against kMaxDnLength. >>>> >>>>>> 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? >>>>>> >>>>> This problem can come in any other service also. Does this require >>>>> some extensions in saAis*.h in future. >>>> Well it is mainly a problem in the NTF API due to it's very strange >>>> way of handling memory allocations, e.g. saNtfPtrValAllocate(). Is >>>> there a similar memory allocation API in some other service that >>>> could cause problems with SaNameT? >>> I am not aware of such a case in other service. But, as pointed out >>> already in this mail thread, a user will also not know this just by >>> the sizeof (SaNameT). I think >>> the description of aisa_api.c for bot the APIs should also be kept >>> in saAis_B_5_14.h and AIS PR doc. >>> >>> Thanks, >>> Praveen >>>>>> 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
