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

Reply via email to