On 31-Jul-14 3:47 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. > V3 of the patches is already uses this way for SA_NTF_VALUE_LDAP_NAME. In the newly added test cases for longDns:
- *((SaUint16T*)dest_ptr) = *((SaUint16T*)&name); - memcpy(dest_ptr + 2, saAisNameBorrow(&name), strlen(saAisNameBorrow(&name))); But then when notification is received, ntfsv should give SaNameT through saNtfPtrValGet() and user will get the string using saAisNameBorrow(). Thanks, Praveen > 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
