On 01-Aug-14 1:59 PM, minhchau wrote:
> On 8/1/2014 5:19 PM, Anders Widell wrote:
>>
>> On 07/31/2014 02:19 PM, praveen malviya wrote:
>>>
>>> On 31-Jul-14 5:31 PM, Anders Widell wrote:
>>>>
>>>> On 07/31/2014 01:40 PM, praveen malviya wrote:
>>>>>
>>>>> On 31-Jul-14 3:47 PM, Anders Widell wrote:
>>>>>> I am leaning towards your suggested solution for
>>>>>> SA_NTF_VALUE_LDAP_NAME now. :-) It will be the easiest one to
>>>>>> implement in NTF, but it may be a bit non-obvious to the user. We
>>>>>> have to clearly document that for SA_NTF_VALUE_LDAP_NAME, the user
>>>>>> must allocate strlen(x) + 3 bytes.
>>>>>>
>>>>>> With the help of Praveen's patch, it is possible to use
>>>>>> saAisNameLend() on the allocated data for additional info.
>>>>>> Something similar must then be done also at other places where
>>>>>> SaNtfValueT is used, and I think this is still missing. Also, at
>>>>>> the receiving end it is still not possible to use
>>>>>> saAisNameBorrow() because we would need to perform the opposite
>>>>>> conversion first.
>>>>>>
>>>>>> A mabe simpler yet solution is to state in the documentation that
>>>>>> saAisNameLend() / saAisNameBorrow() must NOT be used for data type
>>>>>> SA_NTF_VALUE_LDAP_NAME. Instead, the user would himself be
>>>>>> responsible for filling in 16-bit length + NUL terminated string.
>>>>>>
>>>>> V3 of the patches is already uses this way for
>>>>> SA_NTF_VALUE_LDAP_NAME. In the newly added test cases for longDns:
>>>>>
>>>>> -    *((SaUint16T*)dest_ptr) = *((SaUint16T*)&name);
>>>>> -    memcpy(dest_ptr + 2, saAisNameBorrow(&name),
>>>>> strlen(saAisNameBorrow(&name)));
>>>>>
>>>>> But then when notification is received, ntfsv should give SaNameT
>>>>> through saNtfPtrValGet() and user will get the string using
>>>>> saAisNameBorrow().
>>>> This is not part of the current patch. How will it work? Let's say
>>>> the string is longer than 255 bytes and doesn't fit in the old
>>>> SaNameT structure. Will saNtfPtrValGet() dynamically allocate a
>>>> temporary SaNameT with a pointer to the data? How is this
>>>> dynamically allocated memory going to be released?
>>> saNtfPtrValGet() is called inside notificaion callback. In
>>> notificaion callback user has to call saNtfNotificaionFree() that
>>> time ntffsv can release memory.
>> Ok. Another thing to consider: What if the (consumer) client does not
>> support extended DNs? One possibility here would be to truncate DNs to
>> 255 bytes.
> [Minh]: Let say after upgrade to Opensaf 4.5 supporting extended DNs,
> but there's still one legacy client not support extended DNs *living* in
> Opensaf 4.5. By somehow the client receives long SaNameT from other
> services and this SaNameT goes through the legacy code, which is using
> sizeof(SaNameT) to allocate the memory by saNtfPtrValAllocate. That
> would be a problem, the size of memory is not large enough to put the
> entire string later in Send() API.
> Do you think this situation could happen in real? This legacy client
> would end up many problems to access SaNameT, not only by the way it
> uses NTF API
>

[Praveen] I think in such a case legacy code will end up copying 
truncated string as it uses  memcpy(dest_ptr, name, sizeof(SaNameT)). So 
here Send() API will be sending a truncated string as length part will 
contain actual length and not kExtendedNameMagic.

Thanks
Praveen

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

------------------------------------------------------------------------------
Want fast and easy access to all the code in your enterprise? Index and
search up to 200,000 lines of code with a free copy of Black Duck
Code Sight - the same software that powers the world's largest code
search on Ohloh, the Black Duck Open Hub! Try it now.
http://p.sf.net/sfu/bds
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to