tests/logsv/saflogtest.c |  342 +++++++++++++++++++++++++++++++++++-----------
 1 files changed, 256 insertions(+), 86 deletions(-)


 - Create more than one stream in same session. With -o option
   streams stays open until any key is hit. Up to four -a can be used
   meaning that for app stream can be opened at the same time.
   If -a is used to open one stream the stream is closed before finalize.
   If -a is used to open more than one stream finalize is used without
   closing the streams first
 - Option -k is changed to default ack when write
 - Option -e is added. Means exit without closing streams or finalize
   lgs API (for testing client loss)
 - Option -o is added. Means, saflogtest will stop with streams open if
   any key is pressed it will exit depending on other options.

diff --git a/tests/logsv/saflogtest.c b/tests/logsv/saflogtest.c
--- a/tests/logsv/saflogtest.c
+++ b/tests/logsv/saflogtest.c
@@ -51,6 +51,8 @@
 #define VENDOR_ID 193
 #define DEFAULT_MAX_FILES_ROTATED 4
 
+#define MAX_NUM_STREAM 4
+
 static void logWriteLogCallbackT(SaInvocationT invocation, SaAisErrorT error);
 
 static SaLogCallbacksT logCallbacks = { 0, 0, logWriteLogCallbackT };
@@ -60,6 +62,7 @@ static char *progname = "saflogtest";
 static SaInvocationT cb_invocation;
 static SaAisErrorT cb_error;
 
+
 static SaTimeT get_current_SaTime(void)
 {
        struct timeval tv;
@@ -89,17 +92,23 @@ static void usage(void)
        printf("\nOPTIONS\n");
 
        printf("  -h or --help                   this help\n");
-       printf("  -k or --ack                    wait for ack after each write, 
default no wait\n");
+       printf("  -k or --ack                    do not wait for ack after 
write, default wait\n");
        printf("  -l or --alarm                  write to alarm stream\n");
        printf("  -n or --notification           write to notification 
stream\n");
        printf("  -y or --system                 write to system stream 
(default)\n");
-       printf("  -a NAME or --application=NAME  write to application stream 
NAME\n");
+       printf("%s%s%s",
+                  "  -a NAME or --application=NAME  write to application 
stream NAME\n",
+                  "     Can be used more than once, more than one stream can 
be opened\n",
+                  "     Cannot be used in combination with other streams\n");
+       printf("     Max %d application streams can be 
created\n",MAX_NUM_STREAM);
+       printf("     Example: > saflogtest -a tst1 \"tst1 msg\" -a tst2 -a tst3 
\"tst3 msg\"\n");
        printf("  -b NAME or --capplication=NAME write to config application 
stream NAME\n");
        printf("  -s SEV or --severity=SEV       use severity SEV, default 
INFO\n");
+       printf("     valid severity names: emerg, alert, crit, error, warn, 
notice, info\n");
        printf("  -i INT or --interval=INT       write with interval INT us 
(only with --count, default 0us)\n");
        printf("  -c CNT or --count=CNT          write CNT number of times, -1 
forever (with interval INT) \n");
-       printf("      valid severity names: emerg, alert, crit, error, warn, 
notice, info\n");
-       printf("  -o Open log stream and wait forever. Exit on any key\n");
+       printf("  -o Open log stream(s) and wait forever. Exit on any key\n");
+       printf("  -e Exit without closing stream(s) or finalizing after log 
records are written\n");
 }
 
 static void logWriteLogCallbackT(SaInvocationT invocation, SaAisErrorT error)
@@ -129,7 +138,7 @@ static SaAisErrorT write_log_record(SaLo
        static int i = 0;
        int try_agains = 0;
        SaLogAckFlagsT ackflags;
-
+       
        if (wait_for_ack)
                ackflags = SA_LOG_RECORD_WRITE_ACK;
        else
@@ -187,7 +196,7 @@ static SaAisErrorT write_log_record(SaLo
                }
 
                if (try_agains > 0) {
-                       fprintf(stderr, "got %u SA_AIS_ERR_TRY_AGAIN, waited %u 
secs\n", try_agains, try_agains / 10);
+                       fprintf(stderr, "\tgot %u SA_AIS_ERR_TRY_AGAIN, waited 
%u secs\n", try_agains, try_agains / 10);
                }
        }
 
@@ -221,17 +230,103 @@ static SaLogSeverityT get_severity(char 
        exit(EXIT_FAILURE);
 }
 
+/**
+ * Creates a log record by filling in the log service API struct of
+ * type SaLogRecordT.
+ * Note: When the log record is written it has to be freed.
+ *       Use free_log_record() function 
+ * 
+ * @param logRecord[out]
+ * @param logHdrType[in]
+ * @param logSvcUsrName[in]
+ * @param notificationClassId[in]
+ *        Can be set to NULL if Hdr-type is SA_LOG_GENERIC_HEADER
+ * @param log_message[in]
+ *        Set to NULL if there is no message
+ */
+static void create_log_record(SaLogRecordT *logRecord,
+                                               SaLogHeaderTypeT logHdrType,
+                                               SaNameT *logSvcUsrName,
+                                               SaNtfClassIdT 
*notificationClassId,
+                                               char *log_message,
+                                               SaLogBufferT *logBuffer)
+{
+       logRecord->logTimeStamp = SA_TIME_UNKNOWN;      /* LOG service should 
supply timestamp */
+       logRecord->logBuffer = NULL;
+               
+       if (logHdrType == SA_LOG_GENERIC_HEADER) {
+               /* Setup generic header */
+               logRecord->logHdrType = SA_LOG_GENERIC_HEADER;
+               logRecord->logHeader.genericHdr.notificationClassId = NULL;
+               logRecord->logHeader.genericHdr.logSeverity = SA_LOG_SEV_INFO;
+               logRecord->logHeader.genericHdr.logSvcUsrName = logSvcUsrName;
+       } else if (logHdrType == SA_LOG_NTF_HEADER) {
+               /* Setup header for Alarm and Notification record */
+               logRecord->logHdrType = SA_LOG_NTF_HEADER;
+               logRecord->logHeader.ntfHdr.notificationId = 
SA_NTF_IDENTIFIER_UNUSED;
+               logRecord->logHeader.ntfHdr.eventType = SA_NTF_ALARM_PROCESSING;
+               logRecord->logHeader.ntfHdr.notificationObject = logSvcUsrName;
+               logRecord->logHeader.ntfHdr.notifyingObject = logSvcUsrName;
+               logRecord->logHeader.ntfHdr.notificationClassId = 
notificationClassId;
+               logRecord->logHeader.ntfHdr.eventTime = get_current_SaTime();
+       } else {
+               printf("\nInternal error when setting up log header\n");
+               exit(EXIT_FAILURE);
+       }
+
+       /* Create body of log record (if any) */
+       int sz;
+       char *logBuf = NULL;
+       
+       if (log_message != NULL) {
+               sz = strlen(log_message)+1;
+               logBuf = malloc(sz + 64);       /* add space for index/id in 
periodic writes */
+               strcpy(logBuf, log_message);
+               logBuffer->logBufSize = sz;
+               logBuffer->logBuf = (SaUint8T *)logBuf;
+               logRecord->logBuffer = logBuffer;
+       } else {
+               logRecord->logBuffer = NULL;
+       }
+}
+
+static void free_loc_record(SaLogRecordT *logRecord)
+{
+       if (logRecord->logBuffer != NULL) {
+               free(logRecord->logBuffer->logBuf);
+       }
+}
+
+static void set_logFileCreateAttributes(
+                                       SaLogFileCreateAttributesT_2 
*logFileCreateAttributes,
+                                       SaStringT logFileName)
+{
+       /* Setup default values used when creating an application stream using 
API */
+       logFileCreateAttributes->logFilePathName = "saflogtest";
+       logFileCreateAttributes->maxLogFileSize = DEFAULT_APP_LOG_FILE_SIZE;
+       logFileCreateAttributes->maxLogRecordSize = DEFAULT_APP_LOG_REC_SIZE;
+       logFileCreateAttributes->haProperty = SA_TRUE;
+       logFileCreateAttributes->logFileFullAction = 
SA_LOG_FILE_FULL_ACTION_ROTATE;
+       logFileCreateAttributes->maxFilesRotated = DEFAULT_MAX_FILES_ROTATED;
+       logFileCreateAttributes->logFileFmt = DEFAULT_FORMAT_EXPRESSION;
+       logFileCreateAttributes->logFileName = strdup(logFileName);
+}
+
+static void free_logFileCreateAttributes(
+                                       SaLogFileCreateAttributesT_2 
*logFileCreateAttributes)
+{
+       if (logFileCreateAttributes != NULL) {
+               free(logFileCreateAttributes->logFileName);
+       }
+}
+
+
 int main(int argc, char *argv[])
 {
-       bool do_not_exit_f = false;
        int c, i;
-       SaNameT logStreamName = {.length = 0 };
-       SaLogFileCreateAttributesT_2 *logFileCreateAttributes = NULL;
-       SaLogFileCreateAttributesT_2 appLogFileCreateAttributes;
+       //SaNameT logStreamName;
        SaLogStreamOpenFlagsT logStreamOpenFlags = 0;
-       SaLogRecordT logRecord;
        SaNameT logSvcUsrName;
-       SaLogBufferT logBuffer;
        SaNtfClassIdT notificationClassId = { 1, 2, 3 };
        struct option long_options[] = {
                {"ack", no_argument, 0, 'k'},
@@ -253,8 +348,27 @@ int main(int argc, char *argv[])
        SaLogHandleT logHandle;
        SaLogStreamHandleT logStreamHandle;
        SaSelectionObjectT selectionObject;
-       bool wait_for_ack = false;
-
+       bool wait_for_ack = true;
+       bool do_not_exit_f = false;
+       bool no_finalize_exit = false;
+       char *log_message;
+       SaLogSeverityT logSeverity = SA_LOG_SEV_INFO;
+               
+       int stream_cnt = 0;
+       
+       /* Used with application streams to save info about all app streams to
+        * create and send log-records to.
+        */
+       struct {
+          SaNameT logStreamName;
+          SaLogRecordT logRecord;
+       } stream_info[MAX_NUM_STREAM];
+       
+       SaLogBufferT logBuffer[MAX_NUM_STREAM];
+       SaLogFileCreateAttributesT_2 logFileCreateAttributes[MAX_NUM_STREAM];
+       SaLogFileCreateAttributesT_2 *logFileCreateAttributes_ptr = NULL;
+       bool is_appl_stream = false;
+       
        srandom(getpid());
 
        if (gethostname(hostname, _POSIX_HOST_NAME_MAX) == -1) {
@@ -265,28 +379,15 @@ int main(int argc, char *argv[])
        sprintf((char *)logSvcUsrName.value, "%s.%u@%s", "saflogtest", 
getpid(), hostname);
        logSvcUsrName.length = strlen((char *)logSvcUsrName.value);
 
-       /* Setup default values */
-       strcpy((char *)logStreamName.value, SA_LOG_STREAM_SYSTEM);      /* 
system stream is default */
-       logRecord.logTimeStamp = SA_TIME_UNKNOWN;       /* LOG service should 
supply timestamp */
-       logRecord.logHdrType = SA_LOG_GENERIC_HEADER;
-       logRecord.logHeader.genericHdr.notificationClassId = NULL;
-       logRecord.logHeader.genericHdr.logSeverity = SA_LOG_SEV_INFO;
-       logRecord.logHeader.genericHdr.logSvcUsrName = &logSvcUsrName;
-       logRecord.logBuffer = NULL;
-       appLogFileCreateAttributes.logFilePathName = "saflogtest";
-       appLogFileCreateAttributes.maxLogFileSize = DEFAULT_APP_LOG_FILE_SIZE;
-       appLogFileCreateAttributes.maxLogRecordSize = DEFAULT_APP_LOG_REC_SIZE;
-       appLogFileCreateAttributes.haProperty = SA_TRUE;
-       appLogFileCreateAttributes.logFileFullAction = 
SA_LOG_FILE_FULL_ACTION_ROTATE;
-       appLogFileCreateAttributes.maxFilesRotated = DEFAULT_MAX_FILES_ROTATED;
-       appLogFileCreateAttributes.logFileFmt = DEFAULT_FORMAT_EXPRESSION;
-
        while (1) {
-               c = getopt_long(argc, argv, "ohklnya:b:s:i:c:", long_options, 
NULL);
+               c = getopt_long(argc, argv, "eohklnya:b:s:i:c:", long_options, 
NULL);
                if (c == -1) {
                        break;
                }
                switch (c) {
+               case 'e': /* Exit without closing any stream and without 
finalize */
+                       no_finalize_exit = true;
+                       break;
                case 'o': /* Open log stream and wait forever. Exit on Enter 
key */
                        do_not_exit_f = true;
                        break;
@@ -294,31 +395,85 @@ int main(int argc, char *argv[])
                        write_count = atoi(optarg);
                        break;
                case 'k':
-                       wait_for_ack = true;
+                       wait_for_ack = false;
                        break;
                case 'l':
-                       strcpy((char *)logStreamName.value, 
SA_LOG_STREAM_ALARM);
-                       logRecord.logHdrType = SA_LOG_NTF_HEADER;
+                       strcpy((char *) stream_info[0].logStreamName.value, 
SA_LOG_STREAM_ALARM);
+                       stream_info[0].logStreamName.length = 
strlen(SA_LOG_STREAM_ALARM);
+                       if (optind < argc) {
+                               log_message = argv[optind];
+                       } else {
+                               log_message = NULL;
+                       }
+                       create_log_record(&stream_info[0].logRecord, 
SA_LOG_NTF_HEADER, &logSvcUsrName,
+                                       &notificationClassId, log_message, 
&logBuffer[0]);
+                       stream_cnt = 1;
                        break;
                case 'n':
-                       strcpy((char *)logStreamName.value, 
SA_LOG_STREAM_NOTIFICATION);
-                       logRecord.logHdrType = SA_LOG_NTF_HEADER;
+                       strcpy((char *)stream_info[0].logStreamName.value, 
SA_LOG_STREAM_NOTIFICATION);
+                       stream_info[0].logStreamName.length = 
strlen(SA_LOG_STREAM_NOTIFICATION);
+                       if (optind < argc) {
+                               log_message = argv[optind];
+                       } else {
+                               log_message = NULL;
+                       }
+                       create_log_record(&stream_info[0].logRecord, 
SA_LOG_NTF_HEADER, &logSvcUsrName,
+                                       &notificationClassId, log_message, 
&logBuffer[0]);
+                       stream_cnt = 1;
                        break;
                case 'y':
-                       strcpy((char *)logStreamName.value, 
SA_LOG_STREAM_SYSTEM);
+                       strcpy((char *)stream_info[0].logStreamName.value, 
SA_LOG_STREAM_SYSTEM);
+                       stream_info[0].logStreamName.length = 
strlen(SA_LOG_STREAM_SYSTEM);
+                       if (optind < argc) {
+                               log_message = argv[optind];
+                       } else {
+                               log_message = NULL;
+                       }
+                       create_log_record(&stream_info[0].logRecord, 
SA_LOG_GENERIC_HEADER, &logSvcUsrName,
+                                       &notificationClassId, log_message, 
&logBuffer[0]);
+                       stream_cnt = 1;
                        break;
                case 'a':
-                       sprintf((char *)logStreamName.value, "safLgStr=%s", 
optarg);
-                       logFileCreateAttributes = &appLogFileCreateAttributes;
-                       appLogFileCreateAttributes.logFileName = strdup(optarg);
+                       if (stream_cnt >= MAX_NUM_STREAM) {
+                               printf("Max %d streams can be 
opened\n",MAX_NUM_STREAM);
+                               break;
+                       }
+                       is_appl_stream = true;
+                       
set_logFileCreateAttributes(&logFileCreateAttributes[stream_cnt],optarg);
                        logStreamOpenFlags = SA_LOG_STREAM_CREATE;
+                       sprintf((char 
*)stream_info[stream_cnt].logStreamName.value,
+                                       "safLgStr=%s", optarg);
+                       stream_info[stream_cnt].logStreamName.length = 
+                                       strlen((char 
*)stream_info[stream_cnt].logStreamName.value);
+                       if (optind < argc) {
+                               if (strcmp(argv[optind], "-a") != 0) {
+                                       log_message = argv[optind];
+                               } else {
+                                       log_message = NULL;
+                               }
+                       } else {
+                               log_message = NULL;
+                       }
+                       create_log_record(&stream_info[stream_cnt].logRecord,
+                                       SA_LOG_GENERIC_HEADER, &logSvcUsrName,
+                                       &notificationClassId, log_message, 
&logBuffer[stream_cnt]);
+                       stream_cnt++;
                        break;
                case 'b':
-                       sprintf((char *) logStreamName.value, "safLgStrCfg=%s", 
optarg);
-                       strcat((char *) logStreamName.value, 
",safApp=safLogService");
+                       sprintf((char *) stream_info[0].logStreamName.value, 
"safLgStrCfg=%s", optarg);
+                       strcat((char *) stream_info[0].logStreamName.value, 
",safApp=safLogService");
+                       stream_info[0].logStreamName.length = strlen((char *) 
stream_info[0].logStreamName.value);
+                       if (optind < argc) {
+                               log_message = argv[optind];
+                       } else {
+                               log_message = NULL;
+                       }
+                       create_log_record(&stream_info[0].logRecord, 
SA_LOG_GENERIC_HEADER, &logSvcUsrName,
+                                       &notificationClassId, log_message, 
&logBuffer[0]);
+                       stream_cnt = 1;
                        break;
                case 's':
-                       logRecord.logHeader.genericHdr.logSeverity = 
get_severity(optarg);
+                       logSeverity = get_severity(optarg);
                        break;
                case 'i':
                        interval = atoi(optarg);
@@ -331,31 +486,7 @@ int main(int argc, char *argv[])
                        break;
                }
        }
-
-       if (logRecord.logHdrType == SA_LOG_NTF_HEADER) {
-               /* Setup some valid values */
-               logRecord.logHeader.ntfHdr.notificationId = 
SA_NTF_IDENTIFIER_UNUSED;
-               logRecord.logHeader.ntfHdr.eventType = SA_NTF_ALARM_PROCESSING;
-               logRecord.logHeader.ntfHdr.notificationObject = &logSvcUsrName;
-               logRecord.logHeader.ntfHdr.notifyingObject = &logSvcUsrName;
-               logRecord.logHeader.ntfHdr.notificationClassId = 
&notificationClassId;
-               logRecord.logHeader.ntfHdr.eventTime = get_current_SaTime();
-       }
-
-       logStreamName.length = strlen((char *)logStreamName.value);
-
-       /* Create body of log record (if any) */
-       if (optind < argc) {
-               int sz;
-               char *logBuf = NULL;
-               sz = strlen(argv[optind]);
-               logBuf = malloc(sz + 64);       /* add space for index/id in 
periodic writes */
-               strcpy(logBuf, argv[optind]);
-               logBuffer.logBufSize = sz;
-               logBuffer.logBuf = (SaUint8T *)logBuf;
-               logRecord.logBuffer = &logBuffer;
-       }
-
+       
        error = saLogInitialize(&logHandle, &logCallbacks, &logVersion);
        if (error != SA_AIS_OK) {
                fprintf(stderr, "saLogInitialize FAILED: %u\n", error);
@@ -364,34 +495,73 @@ int main(int argc, char *argv[])
 
        error = saLogSelectionObjectGet(logHandle, &selectionObject);
        if (error != SA_AIS_OK) {
-               printf("saLogSelectionObjectGet FAILED: %u\n", error);
                exit(EXIT_FAILURE);
        }
 
-       error = saLogStreamOpen_2(logHandle, &logStreamName,
-                                 logFileCreateAttributes, logStreamOpenFlags,
-                                 SA_TIME_ONE_SECOND, &logStreamHandle);
-       if (error != SA_AIS_OK) {
-               fprintf(stderr, "saLogStreamOpen_2 FAILED: %u\n", error);
-               exit(EXIT_FAILURE);
-       }
+       int j;
+       for (j=0; j < stream_cnt; j++) {
+               if (stream_info[j].logRecord.logHdrType == 
SA_LOG_GENERIC_HEADER) {
+                       
stream_info[j].logRecord.logHeader.genericHdr.logSeverity = logSeverity;
+               }
+               
+               if (is_appl_stream) {
+                       logFileCreateAttributes_ptr = 
&logFileCreateAttributes[j];
+               } else {
+                       logFileCreateAttributes_ptr = NULL;
+               }
 
-       for (i = 0; i < write_count; i++) {
-               write_log_record(logHandle, logStreamHandle, selectionObject, 
&logRecord, wait_for_ack);
-               if (interval > 0)
-                       usleep(interval);
-       }
+               error = saLogStreamOpen_2(
+                               logHandle,
+                               &stream_info[j].logStreamName,
+                               logFileCreateAttributes_ptr,
+                               logStreamOpenFlags,
+                               SA_TIME_ONE_SECOND,
+                               &logStreamHandle);
+               if (error != SA_AIS_OK) {
+                       fprintf(stderr, "saLogStreamOpen_2 FAILED: %u\n", 
error);
+                       exit(EXIT_FAILURE);
+               }
+               free_logFileCreateAttributes(logFileCreateAttributes_ptr);
 
-       /* Open log stream and wait forever. Exit on any key */
+               if (stream_info[j].logRecord.logBuffer->logBuf != NULL) {
+                       for (i = 0; i < write_count; i++) {
+                               write_log_record(
+                                               logHandle,
+                                               logStreamHandle,
+                                               selectionObject,
+                                               &stream_info[j].logRecord,
+                                               wait_for_ack);
+                               if (interval > 0)
+                                       usleep(interval);
+                       }
+               }
+               
+               free_loc_record(&stream_info[j].logRecord);
+       } /* loop j < stream_cnt */
+
+       /* Wait for key press (any key) before closing stream(s) and or 
finalize */
        if (do_not_exit_f == true) {
+               printf("\nWaiting for any key to close stream(s) and 
exit...\n");
                (void) getchar();
                do_not_exit_f = false;
        }
+       
+       /* Exit without closing streams or finalize log API */
+       if (no_finalize_exit == true) {
+               printf("Exit witout stream close or finalize\n");
+               exit(EXIT_SUCCESS);
+       }
 
-       error = saLogStreamClose(logStreamHandle);
-       if (SA_AIS_OK != error) {
-               fprintf(stderr, "saLogStreamClose FAILED: %u\n", error);
-               exit(EXIT_FAILURE);
+       /* If only one stream is open it's closed before Finalize
+        * If there are several open streams, just Finalize (streams will be 
closed
+        * automatically)
+        */
+       if (stream_cnt == 1) {
+               error = saLogStreamClose(logStreamHandle);
+               if (SA_AIS_OK != error) {
+                       fprintf(stderr, "saLogStreamClose FAILED: %u\n", error);
+                       exit(EXIT_FAILURE);
+               }
        }
 
        error = saLogFinalize(logHandle);

------------------------------------------------------------------------------
Rapidly troubleshoot problems before they affect your business. Most IT 
organizations don't have a clear picture of how application performance 
affects their revenue. With AppDynamics, you get 100% visibility into your 
Java,.NET, & PHP application. Start your 15-day FREE TRIAL of AppDynamics Pro!
http://pubads.g.doubleclick.net/gampad/clk?id=84349831&iu=/4140/ostg.clktrk
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to