saAisNameLend() adds a terminating NUL character, so I think you would 
still need strlen(saAisNameBorrow(&name)) + 2 + 1 even with Praveen's 
patch, otherwise saAisNameLend() will write one byte past the end of the 
allocated buffer when the string is shorter than 256 bytes. Another 
concern is, can a notification be re-used and be sent multiple times? 
The current version of the patch will not work in the (rare) case that 
the string length is equal to kExtendedNameMagic. Third concern: there 
is no check that the user has allocated enough space. What if the user 
has by mistake allocated a buffer that is too small, e.g. 
sizeof(SaNameT) bytes, when the string is longer than 256 bytes?

The + 2 (or rather, + 2 + 1) will work, but it is a bit non-obvious. It 
would need to be documented clearly since I see a potential for user 
mistakes here. The user is not supposed to know or care about the 
internal structure of SaNameT anymore; it is supposed to be opaque. My 
proposal is that you instead handle extended SaNameT during encoding, 
i.e. in encodeSaNtfValueT().

/ Anders Widell

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

------------------------------------------------------------------------------
Infragistics Professional
Build stunning WinForms apps today!
Reboot your WinForms applications with our WinForms controls. 
Build a bridge from your legacy apps to the future.
http://pubads.g.doubleclick.net/gampad/clk?id=153845071&iu=/4140/ostg.clktrk
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to