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

Reply via email to