Create a test case that the process running log agent is forked to a new process. --- src/log/apitest/tet_saLogStreamOpen_2.c | 41 ++++++++++ src/log/apitest/tet_saLogWriteLogCallbackT.c | 86 ++++++++++++++++++++ 2 files changed, 127 insertions(+)
diff --git a/src/log/apitest/tet_saLogStreamOpen_2.c b/src/log/apitest/tet_saLogStreamOpen_2.c index 7f0e74f69..835b9b5da 100644 --- a/src/log/apitest/tet_saLogStreamOpen_2.c +++ b/src/log/apitest/tet_saLogStreamOpen_2.c @@ -1002,6 +1002,40 @@ void saLogMultiThreadMultiInit(void) test_validate(rc, SA_AIS_OK); } +/* + * Ticket 3322 + * Verify that logInitialize in forked process + * OK + */ +void saLogInitializeInForkedProcess(void) +{ + int pid = -1; + // Call an api function of log agent to create the LogAgent object + // indirectly + SaAisErrorT rc = logStreamOpen(&systemStreamName); + if (rc == SA_AIS_OK) + { + test_validate(rc, SA_AIS_ERR_LIBRARY); + return; + } + // Fork current process then exit the child process + pid = fork(); + if (pid < 0) { + exit(1); + } else if (pid == 0) { + exit(0); + } + // Initialize the log agent + rc = logInitialize(); + if (rc != SA_AIS_OK) + { + test_validate(rc, SA_AIS_OK); + return; + } + // Finalize the log agent + logFinalize(); +} + // // This test to verify Open call gets BAD_OPERATION or not during si-swap // @@ -1141,6 +1175,7 @@ extern void saLogStreamOpenCallbackT_01(void); extern void saLogWriteLog_01(void); extern void saLogWriteLogCallbackT_01(void); extern void saLogWriteLogCallbackT_02(void); +extern void saLogWriteLogCallbackT_03(void); __attribute__((constructor)) static void saLibraryLifeCycle_constructor(void) { @@ -1206,6 +1241,9 @@ __attribute__((constructor)) static void saLibraryLifeCycle_constructor(void) "saLogWriteLogCallbackT() SA_DISPATCH_ONE"); test_case_add(2, saLogWriteLogCallbackT_02, "saLogWriteLogCallbackT() SA_DISPATCH_ALL"); + test_case_add(2, saLogWriteLogCallbackT_03, + "saLogWriteLogCallbackT()," + " fork process after initialization"); test_case_add(2, saLogStreamOpen_2_46, "saLogStreamOpen_2 with maxFilesRotated = 0, ERR"); test_case_add(2, saLogStreamOpen_2_47, @@ -1230,4 +1268,7 @@ __attribute__((constructor)) static void saLibraryLifeCycle_constructor(void) test_case_add( 2, saLogMultiThreadMultiInit, "saLogInitialize() then saLogFinalize() multiple times in multiple threads, OK"); + test_case_add( + 2, saLogInitializeInForkedProcess, + "saLogInitialize() in the forked process, OK"); } diff --git a/src/log/apitest/tet_saLogWriteLogCallbackT.c b/src/log/apitest/tet_saLogWriteLogCallbackT.c index 738507256..2d96e2046 100644 --- a/src/log/apitest/tet_saLogWriteLogCallbackT.c +++ b/src/log/apitest/tet_saLogWriteLogCallbackT.c @@ -216,3 +216,89 @@ write_log: done: logFinalize(); } + +void saLogWriteLogCallbackT_03(void) +{ + SaInvocationT invocation; + struct pollfd fds[1]; + int ret; + + invocation = random(); + logCallbacks.saLogWriteLogCallback = logWriteLogCallbackT; + rc = logInitialize(); + if (rc != SA_AIS_OK) { + test_validate(rc, SA_AIS_OK); + return; + } + pid_t pid = fork(); + if (pid < 0) { + fprintf(stderr, "fork failed: %s \n", strerror(errno)); + test_validate(SA_AIS_ERR_LIBRARY, SA_AIS_OK); + } else if (pid == 0) { + // While exiting this process, the destructor of log agent + // will be called. + exit(0); + } else { + sleep(2); /* Sleep to make sure the child process exited. */ + rc = saLogSelectionObjectGet(logHandle, &selectionObject); + if (rc != SA_AIS_OK) { + fprintf(stderr, + "saLogSelectionObjectGet failed: %d \n", + (int)rc); + test_validate(rc, SA_AIS_OK); + goto done; + } + rc = logStreamOpen(&systemStreamName); + if (rc != SA_AIS_OK) { + test_validate(rc, SA_AIS_OK); + goto done; + } + strcpy((char *)genLogRecord.logBuffer->logBuf, __FUNCTION__); + genLogRecord.logBuffer->logBufSize = strlen(__FUNCTION__) + 1; + + struct timespec timeout_time; + osaf_set_millis_timeout(2 * kWaitTime, &timeout_time); + + write_log: + cb_index = 0; + rc = logWrite(invocation, SA_LOG_RECORD_WRITE_ACK, + &genLogRecord); + if (rc != SA_AIS_OK) { + test_validate(rc, SA_AIS_OK); + goto done; + } + + fds[0].fd = (int)selectionObject; + fds[0].events = POLLIN; + ret = poll(fds, 1, 6000); + if (ret != 1) { + fprintf(stderr, "poll log callback failed: %d \n", + ret); + test_validate(ret, 1); + goto done; + } + rc = saLogDispatch(logHandle, SA_DISPATCH_ONE); + if (rc != SA_AIS_OK) { + fprintf(stderr, "saLogDispatch failed: %d \n", + (int)rc); + test_validate(rc, SA_AIS_OK); + goto done; + } + + if (cb_error[0] == SA_AIS_ERR_TRY_AGAIN && + !osaf_is_timeout(&timeout_time)) { + osaf_nanosleep(&kHundredMilliseconds); + printf("Get try again error, re-write \n"); + goto write_log; + } + + if (cb_invocation[0] == invocation) { + test_validate(cb_error[0], SA_AIS_OK); + } else { + test_validate(SA_AIS_ERR_LIBRARY, SA_AIS_OK); + } + + done: + logFinalize(); + } +} -- 2.25.1 _______________________________________________ Opensaf-devel mailing list Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel