Hi Mohan, Ack
Thanks Lennart -----Original Message----- From: Mohan Kanakam <[email protected]> Sent: den 21 november 2018 11:12 To: Lennart Lund <[email protected]>; Vu Minh Nguyen <[email protected]> Cc: [email protected]; Mohan Kanakam <[email protected]> Subject: [PATCH 1/1] log: add new test cases in log apitest v3 [#2915] --- src/log/apitest/tet_saLogDispatch.c | 46 +++++++++++++++- src/log/apitest/tet_saLogFinalize.c | 40 +++++++++++++- src/log/apitest/tet_saLogInitialize.c | 72 ++++++++++++++++++++----- src/log/apitest/tet_saLogSelectionObjectGet.c | 41 +++++++++++++- src/log/apitest/tet_saLogStreamClose.c | 57 +++++++++++++++++++- src/log/apitest/tet_saLogStreamOpen_2.c | 77 +++++++-------------------- src/log/apitest/tet_saLogWriteLogAsync.c | 77 +++++++++++++++++++++++++++ 7 files changed, 332 insertions(+), 78 deletions(-) diff --git a/src/log/apitest/tet_saLogDispatch.c b/src/log/apitest/tet_saLogDispatch.c index 4419e05..f366ef2 100644 --- a/src/log/apitest/tet_saLogDispatch.c +++ b/src/log/apitest/tet_saLogDispatch.c @@ -17,7 +17,11 @@ #include "logtest.h" -void saLogDispatch_01(void) +/* Object to test: saLogDispatch() API + * Test: Dispatching with valid handle and flag + * Result: Shall pass with return code SA_AIS_OK */ void +saLogDispatch_with_valid_hdl(void) { rc = logInitialize(); if (rc == SA_AIS_OK) @@ -25,3 +29,43 @@ void saLogDispatch_01(void) test_validate(rc, SA_AIS_OK); logFinalize(); } + +/* Object to test: saLogDispatch() API: + * Test: Dispatching with finalized log handle + * step1:Call logInitialize() + * step2:call logFinalize() + * step3:Now call the saLogDispatch() with logHandle + * Result: Shall fail with return code SA_AIS_ERR_BAD_HANDLE */ void +saLogDispatch_with_finalized_handle(void) +{ + rc = logInitialize(); + logFinalize(); + rc = saLogDispatch(logHandle, SA_DISPATCH_ALL); + test_validate(rc, SA_AIS_ERR_BAD_HANDLE); } + +/* Object to test: saLogDispatch() API: + * Test: Dispatching with invalid handle(0) + * Result: Shall fail with return code SA_AIS_ERR_BAD_HANDLE */ void +saLogDispatch_with_invalid_handle(void) +{ + rc = logInitialize(); + if (rc == SA_AIS_OK) + rc = saLogDispatch(0, SA_DISPATCH_ALL); + test_validate(rc, SA_AIS_ERR_BAD_HANDLE); + logFinalize(); +} + +__attribute__((constructor)) static void +saLibraryLifeCycle_constructor(void) +{ + test_suite_add(1, "Library Life Cycle"); + test_case_add(1, saLogDispatch_with_valid_hdl, "saLogDispatch() OK"); + test_case_add( + 1, saLogDispatch_with_finalized_handle, + "saLogDispatch() with finalized handle"); + test_case_add( + 1, saLogDispatch_with_invalid_handle, + "saLogDispatch() with invalid handle"); } diff --git a/src/log/apitest/tet_saLogFinalize.c b/src/log/apitest/tet_saLogFinalize.c index 7b23a98..a9b4408 100644 --- a/src/log/apitest/tet_saLogFinalize.c +++ b/src/log/apitest/tet_saLogFinalize.c @@ -17,7 +17,13 @@ #include "logtest.h" -void saLogFinalize_01(void) +/* Object to test: saLogFinalize() API: + * Test: Finalizing with valid handle + * step1:Call saLogInitialize() API and it returns SA_AIS_OK + * step2:Now call the saLogFinalize() with logHandle + * Result: Shall PASS with return code SA_AIS_OK */ void +saLogFinalize_with_valid_hdl(void) { rc = logInitialize(); if (rc == SA_AIS_OK) @@ -25,8 +31,38 @@ void saLogFinalize_01(void) test_validate(rc, SA_AIS_OK); } -void saLogFinalize_02(void) +/* Object to test: saLogFinalize() API: + * Test: Finalizing with invalid handle(0) + * Result: Shall fail with return code SA_AIS_ERR_BAD_HANDLE */ void +saLogFinalize_with_invalid_handle(void) { rc = saLogFinalize(0); test_validate(rc, SA_AIS_ERR_BAD_HANDLE); } + +/* Object to test: saLogFinalize() API: + * Test: Finalizing with finalized handle + * step1:Call saLogInitialize() API and it returns SA_AIS_OK + * step2:call logFinalize() + * step3:Now call the saLogFinalize() with logHandle + * Result: Shall fail with return code SA_AIS_ERR_BAD_HANDLE */ void +saLogFinalize_with_finalized_handle(void) +{ + SaVersionT log_version = kLogVersion; + rc = saLogInitialize(&logHandle, &logCallbacks, &log_version); + logFinalize(); + rc = saLogFinalize(logHandle); + test_validate(rc, SA_AIS_ERR_BAD_HANDLE); } + +__attribute__((constructor)) static void +saLibraryLifeCycle_constructor(void) +{ + test_suite_add(1, "Library Life Cycle"); + test_case_add(1, saLogFinalize_with_valid_hdl, "saLogFinalize() OK"); + test_case_add(1, saLogFinalize_with_invalid_handle, + "saLogFinalize() with NULL log handle"); + test_case_add(1, saLogFinalize_with_finalized_handle, + "saLogFinalize() with finalized log handle"); } diff --git a/src/log/apitest/tet_saLogInitialize.c b/src/log/apitest/tet_saLogInitialize.c index 3d31c8e..de2595a 100644 --- a/src/log/apitest/tet_saLogInitialize.c +++ b/src/log/apitest/tet_saLogInitialize.c @@ -108,12 +108,54 @@ void saLogInitialize_11(void) test_validate(rc, SA_AIS_OK); } -extern void saLogSelectionObjectGet_01(void); -extern void saLogSelectionObjectGet_02(void); -extern void saLogFinalize_01(void); -extern void saLogFinalize_02(void); -extern void saLogDispatch_01(void); +/* + * Object to test: saLogInitalize() API: + * Test: Initializing with invalid version pointer + * Result: Shall fail with return code SA_AIS_ERR_INVALID_PARAM */ +void saLogInitialize_with_null_version(void) +{ + rc = saLogInitialize(&logHandle, &logCallbacks, NULL); + logFinalize(); + test_validate(rc, SA_AIS_ERR_INVALID_PARAM); } + +/* + * Object to test: saLogInitalize() API: + * Test: Initializing with invalid handle and version pointer + * Result: Shall fail with return code SA_AIS_ERR_INVALID_PARAM */ +void saLogInitialize_with_null_handle_and_version(void) +{ + rc = saLogInitialize(NULL, &logCallbacks, NULL); + logFinalize(); + test_validate(rc, SA_AIS_ERR_INVALID_PARAM); } +/* + * Object to test: saLogInitalize() API: + * Test:Initializing with invalid handle and cblk pointer + * Result: Shall fail with return code SA_AIS_ERR_INVALID_PARAM */ +void saLogInitialize_with_null_handle_and_callbacks(void) +{ + SaVersionT log_version = {'A', 2}; + rc = saLogInitialize(NULL, NULL, &log_version); + logFinalize(); + test_validate(rc, SA_AIS_ERR_INVALID_PARAM); } + +/* + * Object to test: saLogInitalize() API: + * Test:Initializing with invalid handle, cblk and version pointer + * Result: Shall fail with return code SA_AIS_ERR_INVALID_PARAM */ +void saLogInitialize_with_null_handle_callbacks_version(void) +{ + rc = saLogInitialize(NULL, NULL, NULL); + logFinalize(); + test_validate(rc, SA_AIS_ERR_INVALID_PARAM); } __attribute__((constructor)) static void saLibraryLifeCycle_constructor(void) { test_suite_add(1, "Library Life Cycle"); @@ -139,12 +181,16 @@ __attribute__((constructor)) static void saLibraryLifeCycle_constructor(void) "saLogInitialize() with minor version is set bigger than supported version"); test_case_add(1, saLogInitialize_11, "saLogInitialize() with minor version is not set"); - test_case_add(1, saLogSelectionObjectGet_01, - "saLogSelectionObjectGet() OK"); - test_case_add(1, saLogSelectionObjectGet_02, - "saLogSelectionObjectGet() with NULL log handle"); - test_case_add(1, saLogDispatch_01, "saLogDispatch() OK"); - test_case_add(1, saLogFinalize_01, "saLogFinalize() OK"); - test_case_add(1, saLogFinalize_02, - "saLogFinalize() with NULL log handle"); + test_case_add( + 1, saLogInitialize_with_null_version, + "saLogInitialize() with version as NULL"); + test_case_add( + 1, saLogInitialize_with_null_handle_and_version, + "saLogInitialize() with handle as null, version as null"); + test_case_add( + 1, saLogInitialize_with_null_handle_and_callbacks, + "saLogInitialize() with handle as null and callbk as null"); + test_case_add( + 1, saLogInitialize_with_null_handle_callbacks_version, + "saLogInitialize() with handle, cbk and version as null values"); } diff --git a/src/log/apitest/tet_saLogSelectionObjectGet.c b/src/log/apitest/tet_saLogSelectionObjectGet.c index 4ba0d23..1e9c434 100644 --- a/src/log/apitest/tet_saLogSelectionObjectGet.c +++ b/src/log/apitest/tet_saLogSelectionObjectGet.c @@ -17,7 +17,13 @@ #include "logtest.h" -void saLogSelectionObjectGet_01(void) +/* Object to test: saLogSelectionObjectGet() API: + * Test: Getting the SelectionObject with valid handle + * step1:Call saLogInitialize() API and it returns SA_AIS_OK + * step2:Now call the saLogSelectionObjectGet() with logHandle + * Result: Shall pass with return code SA_AIS_OK */ void +saLogSelectionObjectGet_with_valid_handle(void) { rc = logInitialize(); if (rc == SA_AIS_OK) @@ -26,8 +32,39 @@ void saLogSelectionObjectGet_01(void) logFinalize(); } -void saLogSelectionObjectGet_02(void) +/* Object to test: saLogSelectionObjectGet() API: + * Test: Getting the SelectionObject with invalid handle(0) + * Result: Shall fail with return code SA_AIS_ERR_BAD_HANDLE */ void +saLogSelectionObjectGet_with_invalid_handle(void) { rc = saLogSelectionObjectGet(0, &selectionObject); test_validate(rc, SA_AIS_ERR_BAD_HANDLE); } + +/* Object to test: saLogSelectionObjectGet() API: + * Test: Getting the SelectionObject with finalized handle + * step1:Call saLogInitialize() API and it returns SA_AIS_OK + * step2:call logFinalize() + * step3:Now call the saLogSelectionObjectGet() with logHandle + * Result: Shall fail with return code SA_AIS_ERR_BAD_HANDLE */ void +saLogSelectionObjectGet_with_finalized_handle(void) +{ + SaVersionT log_version = kLogVersion; + rc = saLogInitialize(&logHandle, &logCallbacks, &log_version); + logFinalize(); + rc = saLogSelectionObjectGet(logHandle, &selectionObject); + test_validate(rc, SA_AIS_ERR_BAD_HANDLE); } + +__attribute__((constructor)) static void +saLibraryLifeCycle_constructor(void) +{ + test_suite_add(1, "Library Life Cycle"); + test_case_add(1, saLogSelectionObjectGet_with_valid_handle, + "saLogSelectionObjectGet() OK"); + test_case_add(1, saLogSelectionObjectGet_with_invalid_handle, + "saLogSelectionObjectGet() with NULL log handle"); + test_case_add(1, saLogSelectionObjectGet_with_finalized_handle, + "saLogSelectionObjectGet() with finalized log handle"); } diff --git a/src/log/apitest/tet_saLogStreamClose.c b/src/log/apitest/tet_saLogStreamClose.c index 4046194..52ca3a2 100644 --- a/src/log/apitest/tet_saLogStreamClose.c +++ b/src/log/apitest/tet_saLogStreamClose.c @@ -17,7 +17,14 @@ #include "logtest.h" -void saLogStreamClose_01(void) +/* Object to test: logStreamClose() API: + * Test: Test closing an open stream using an valid handle + * step1:Call logInitialize() + * step2:Call logStreamOpen() + * step3:Now call the saLogStreamClose() with logStreamHandle + * Result: Shall pass with return code SA_AIS_OK */ void +saLogStreamClose_with_valid_handle(void) { rc = logInitialize(); if (rc != SA_AIS_OK) { @@ -35,3 +42,51 @@ void saLogStreamClose_01(void) done: logFinalize(); } + +/* Object to test: logStreamClose() API: + * Test: Test closing an open stream using an invalid handle + * step1:Call logInitialize() + * step2:Call logStreamOpen() + * step3:Call logFinalize() + * step4:Now call the saLogStreamClose() with logStreamHandle + * Result: Shall fail with return code SA_AIS_ERR_BAD_HANDLE */ void +saLogStreamClose_with_invalid_handle(void) +{ + rc = logInitialize(); + if (rc != SA_AIS_OK) { + test_validate(rc, SA_AIS_OK); + return; + } + rc = logStreamOpen(&systemStreamName); + if (rc != SA_AIS_OK) { + test_validate(rc, SA_AIS_OK); + goto done; + } + logFinalize(); + rc = saLogStreamClose(0); + test_validate(rc, SA_AIS_ERR_BAD_HANDLE); + +done: + logFinalize(); +} + +/* Object to test: logStreamClose() API: + * Test: Test closing a logstream with uninitialized handle + * Result: Shall fail with return code SA_AIS_ERR_BAD_HANDLE */ void +saLogStreamClose_with_uninitialized_handle(void) +{ + rc = saLogStreamClose(logStreamHandle); + test_validate(rc, SA_AIS_ERR_BAD_HANDLE); } + +__attribute__((constructor)) static void +saLibraryLifeCycle_constructor(void) +{ + test_case_add(2, saLogStreamClose_with_valid_handle, + "saLogStreamClose OK"); + test_case_add(2, saLogStreamClose_with_invalid_handle, + "saLogStreamClose with invalid handle"); + test_case_add(2, saLogStreamClose_with_uninitialized_handle, + "saLogStreamClose with uninitialized handle"); } diff --git a/src/log/apitest/tet_saLogStreamOpen_2.c b/src/log/apitest/tet_saLogStreamOpen_2.c index 6992392..ecb50c3 100644 --- a/src/log/apitest/tet_saLogStreamOpen_2.c +++ b/src/log/apitest/tet_saLogStreamOpen_2.c @@ -492,6 +492,19 @@ void saLogStreamOpen_2_23(void) test_validate(rc, SA_AIS_ERR_INVALID_PARAM); } + +/* Object to test: saLogStreamOpen_2() API: + * Test: Opening Stream with invalid handle, invalid logStreamName +pointer + * logFileCreateAttributes to NULL pointer and logStreamOpenFlags to +ZERO(0) + * Result: Shall fail with return code SA_AIS_ERR_INVALID_PARAM */ +void saLogStreamOpen_2_with_invalid_hdl_name_attr_flgs(void) +{ + rc = saLogStreamOpen_2(12345, NULL, NULL, 0, SA_TIME_ONE_SECOND, + &logStreamHandle); + test_validate(rc, SA_AIS_ERR_INVALID_PARAM); } + /** * Added test cases to verify ticket #1399: * logsv gets stuck in while loop if setting maxFilesRotated = 0. @@ -1126,28 +1139,8 @@ void add_suite_16() extern void saLogStreamOpenAsync_2_01(void); extern void saLogStreamOpenCallbackT_01(void); extern void saLogWriteLog_01(void); -extern void saLogWriteLogAsync_01(void); -extern void saLogWriteLogAsync_02(void); -extern void saLogWriteLogAsync_03(void); -extern void saLogWriteLogAsync_04(void); -extern void saLogWriteLogAsync_05(void); -extern void saLogWriteLogAsync_06(void); -extern void saLogWriteLogAsync_07(void); -extern void saLogWriteLogAsync_08(void); -extern void saLogWriteLogAsync_09(void); -extern void saLogWriteLogAsync_10(void); -extern void saLogWriteLogAsync_11(void); -extern void saLogWriteLogAsync_12(void); -extern void saLogWriteLogAsync_13(void); -extern void saLogWriteLogAsync_14(void); -extern void saLogWriteLogAsync_15(void); -extern void saLogWriteLogAsync_16(void); -extern void saLogWriteLogAsync_17(void); -extern void saLogWriteLogAsync_18(void); -extern void saLogWriteLogAsync_19(void); extern void saLogWriteLogCallbackT_01(void); extern void saLogWriteLogCallbackT_02(void); -extern void saLogStreamClose_01(void); __attribute__((constructor)) static void saLibraryLifeCycle_constructor(void) { @@ -1196,6 +1189,11 @@ __attribute__((constructor)) static void saLibraryLifeCycle_constructor(void) "Open app stream with unsupported logFullAction"); test_case_add(2, saLogStreamOpen_2_22, "Open non exist app stream with NULL create attrs"); + test_case_add(2, saLogStreamOpen_2_with_invalid_hdl_name_attr_flgs, + "saLogStreamOpen with invalid handle," + "logStreamName to NULL pointer," + "logFileCreateAttributes to NULL pointer" + " and logStreamOpenFlags to ZERO(0)"); // This test case is no longer valid when Long DN is supported // test_case_add(2, saLogStreamOpen_2_23, "Open with stream name length // == 256"); @@ -1204,49 +1202,10 @@ __attribute__((constructor)) static void saLibraryLifeCycle_constructor(void) test_case_add(2, saLogStreamOpenCallbackT_01, "saLogStreamOpenCallbackT() OK"); test_case_add(2, saLogWriteLog_01, "saLogWriteLog(), Not supported"); - test_case_add(2, saLogWriteLogAsync_01, - "saLogWriteAsyncLog() system OK"); - test_case_add(2, saLogWriteLogAsync_02, - "saLogWriteAsyncLog() alarm OK"); - test_case_add(2, saLogWriteLogAsync_03, - "saLogWriteAsyncLog() notification OK"); - test_case_add(2, saLogWriteLogAsync_04, - "saLogWriteAsyncLog() with NULL logStreamHandle"); - test_case_add(2, saLogWriteLogAsync_05, - "saLogWriteAsyncLog() with invalid logStreamHandle"); - test_case_add(2, saLogWriteLogAsync_06, - "saLogWriteAsyncLog() with invalid ackFlags"); - test_case_add(2, saLogWriteLogAsync_07, - "saLogWriteAsyncLog() with NULL logRecord ptr"); - test_case_add(2, saLogWriteLogAsync_09, - "saLogWriteAsyncLog() logSvcUsrName == NULL"); - test_case_add(2, saLogWriteLogAsync_10, - "saLogWriteAsyncLog() logSvcUsrName == NULL and envset"); - test_case_add(2, saLogWriteLogAsync_11, - "saLogWriteAsyncLog() with logTimeStamp set"); - test_case_add(2, saLogWriteLogAsync_12, - "saLogWriteAsyncLog() without logTimeStamp set"); - test_case_add( - 2, saLogWriteLogAsync_13, - "saLogWriteAsyncLog() 1800 bytes logrecord (ticket #203)"); - test_case_add(2, saLogWriteLogAsync_14, - "saLogWriteAsyncLog() invalid severity"); - // These test cases are no longer valid when Long DN is supported - // test_case_add(2, saLogWriteLogAsync_15, "saLogWriteAsyncLog() NTF - // notificationObject length == 256"); test_case_add(2, - // saLogWriteLogAsync_16, "saLogWriteAsyncLog() NTF notifyingObject - // length == 256"); test_case_add(2, saLogWriteLogAsync_17, - // "saLogWriteLogAsync() Generic logSvcUsrName length == 256"); - test_case_add(2, saLogWriteLogAsync_18, - "saLogWriteLogAsync() logBufSize > strlen(logBuf) + 1"); - test_case_add( - 2, saLogWriteLogAsync_19, - "saLogWriteLogAsync() logBufSize > SA_LOG_MAX_RECORD_SIZE"); test_case_add(2, saLogWriteLogCallbackT_01, "saLogWriteLogCallbackT() SA_DISPATCH_ONE"); test_case_add(2, saLogWriteLogCallbackT_02, "saLogWriteLogCallbackT() SA_DISPATCH_ALL"); - test_case_add(2, saLogStreamClose_01, "saLogStreamClose OK"); test_case_add(2, saLogStreamOpen_2_46, "saLogStreamOpen_2 with maxFilesRotated = 0, ERR"); test_case_add(2, saLogStreamOpen_2_47, diff --git a/src/log/apitest/tet_saLogWriteLogAsync.c b/src/log/apitest/tet_saLogWriteLogAsync.c index d5586d4..9ae3e96 100644 --- a/src/log/apitest/tet_saLogWriteLogAsync.c +++ b/src/log/apitest/tet_saLogWriteLogAsync.c @@ -453,3 +453,80 @@ void saLogWriteLogAsync_19(void) done: logFinalize(); } + + +/* Object to test: saLogWriteLogAsync() API: + * Test: Writing into logstream with invalid logStreamHandle and flag + * step1:Call logInitialize() + * step2:Call logStreamOpen() + * step3:call logFinalize() + * step4:Now call the saLogWriteLogAsync() with logStreamHandle + * Result: Shall fail with return code SA_AIS_ERR_BAD_HANDLE */ void +saLogWriteLogAsync_invalid_handle(void) +{ + SaInvocationT invocation = 0; + + strcpy((char *)genLogRecord.logBuffer->logBuf, __FUNCTION__); + genLogRecord.logBuffer->logBufSize = strlen(__FUNCTION__); + + rc = logInitialize(); + if (rc != SA_AIS_OK) { + test_validate(rc, SA_AIS_OK); + return; + } + rc = logStreamOpen(&systemStreamName); + if (rc != SA_AIS_OK) { + test_validate(rc, SA_AIS_OK); + goto done; + } + rc = saLogWriteLogAsync(0, invocation, 0, &genLogRecord); + test_validate(rc, SA_AIS_ERR_BAD_HANDLE); + +done: + logFinalize(); +} +__attribute__((constructor)) static void +saLibraryLifeCycle_constructor(void) +{ + test_case_add(2, saLogWriteLogAsync_01, + "saLogWriteAsyncLog() system OK"); + test_case_add(2, saLogWriteLogAsync_02, + "saLogWriteAsyncLog() alarm OK"); + test_case_add(2, saLogWriteLogAsync_03, + "saLogWriteAsyncLog() notification OK"); + test_case_add(2, saLogWriteLogAsync_04, + "saLogWriteAsyncLog() with NULL logStreamHandle"); + test_case_add(2, saLogWriteLogAsync_05, + "saLogWriteAsyncLog() with invalid logStreamHandle"); + test_case_add(2, saLogWriteLogAsync_06, + "saLogWriteAsyncLog() with invalid ackFlags"); + test_case_add(2, saLogWriteLogAsync_07, + "saLogWriteAsyncLog() with NULL logRecord ptr"); + test_case_add(2, saLogWriteLogAsync_09, + "saLogWriteAsyncLog() logSvcUsrName == NULL"); + test_case_add(2, saLogWriteLogAsync_10, + "saLogWriteAsyncLog() logSvcUsrName == NULL and envset"); + test_case_add(2, saLogWriteLogAsync_11, + "saLogWriteAsyncLog() with logTimeStamp set"); + test_case_add(2, saLogWriteLogAsync_12, + "saLogWriteAsyncLog() without logTimeStamp set"); + test_case_add( + 2, saLogWriteLogAsync_13, + "saLogWriteAsyncLog() 1800 bytes logrecord (ticket #203)"); + test_case_add(2, saLogWriteLogAsync_14, + "saLogWriteAsyncLog() invalid severity"); + // These test cases are no longer valid when Long DN is supported + // test_case_add(2, saLogWriteLogAsync_15, "saLogWriteAsyncLog() NTF + // notificationObject length == 256"); test_case_add(2, + // saLogWriteLogAsync_16, "saLogWriteAsyncLog() NTF notifyingObject + // length == 256"); test_case_add(2, saLogWriteLogAsync_17, + // "saLogWriteLogAsync() Generic logSvcUsrName length == 256"); + test_case_add(2, saLogWriteLogAsync_18, + "saLogWriteLogAsync() logBufSize > strlen(logBuf) + 1"); + test_case_add( + 2, saLogWriteLogAsync_19, + "saLogWriteLogAsync() logBufSize > SA_LOG_MAX_RECORD_SIZE"); + test_case_add( + 2, saLogWriteLogAsync_invalid_handle, + "saLogWriteLogAsync() with invalid logStreamHandle"); } -- 2.7.4 _______________________________________________ Opensaf-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/opensaf-devel
