On 31-Jul-14 5:36 PM, Anders Widell wrote:
> You have a point, backwards compatibility is tricky when fixing bugs. 
> So the current situation is then that sometimes SA_NTF_VALUE_LDAP_NAME 
> comes with two bytes of length information in the beginning, and 
> sometimes it doesn't. How will the user know how to interpret the value?
>
When LDAP name is set a user knows it by SaNtfValueTypeT in additional 
info structure
typedef struct {
     SaNtfElementIdT infoId;
     /* API user is expected to define this field    */
     SaNtfValueTypeT infoType;
     SaNtfValueT infoValue;
} SaNtfAdditionalInfoT;

Thanks,
Praveen

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


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

Reply via email to