Hi Hieu, Ack. -----Original Message----- From: Hieu Hong Hoang <hieu.h.ho...@dektech.com.au> Sent: Friday, November 11, 2022 6:13 PM To: Thang Duc Nguyen <thang.d.ngu...@dektech.com.au>; Minh Hon Chau <minh.c...@dektech.com.au>; Thien Minh Huynh <thien.m.hu...@dektech.com.au> Cc: opensaf-devel@lists.sourceforge.net; Hieu Hong Hoang <hieu.h.ho...@dektech.com.au> Subject: [PATCH 2/2] log: Create a test case for forked processes [#3322]
Create a test case that the process running log agent is forked to a new process. --- src/log/apitest/tet_saLogStreamOpen_2.c | 3 + src/log/apitest/tet_saLogWriteLogCallbackT.c | 86 ++++++++++++++++++++ 2 files changed, 89 insertions(+) diff --git a/src/log/apitest/tet_saLogStreamOpen_2.c b/src/log/apitest/tet_saLogStreamOpen_2.c index 7f0e74f69..037ce8188 100644 --- a/src/log/apitest/tet_saLogStreamOpen_2.c +++ b/src/log/apitest/tet_saLogStreamOpen_2.c @@ -1141,6 +1141,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 +1207,8 @@ __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() forked process"); 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_saLogWriteLogCallbackT.c b/src/log/apitest/tet_saLogWriteLogCallbackT.c index 738507256..bd565c46e 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 (fork < 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