Add a testcase for closing log stream in the destructor of a cpp object.
---
src/log/Makefile.am | 2 +-
...gStreamClose.c => tet_saLogStreamClose.cc} | 82 +++++++++++++++++++
2 files changed, 83 insertions(+), 1 deletion(-)
rename src/log/apitest/{tet_saLogStreamClose.c => tet_saLogStreamClose.cc}
(59%)
diff --git a/src/log/Makefile.am b/src/log/Makefile.am
index df061e6eb..0dad74bf6 100644
--- a/src/log/Makefile.am
+++ b/src/log/Makefile.am
@@ -218,7 +218,7 @@ bin_logtest_SOURCES = \
src/log/apitest/tet_saLogWriteLogAsync.c \
src/log/apitest/tet_saLogWriteLogCallbackT.c \
src/log/apitest/tet_saLogFilterSetCallbackT.c \
- src/log/apitest/tet_saLogStreamClose.c \
+ src/log/apitest/tet_saLogStreamClose.cc \
src/log/apitest/tet_saLogLimitGet.c \
src/log/apitest/tet_LogOiOps.c \
src/log/apitest/tet_Log_misc.c \
diff --git a/src/log/apitest/tet_saLogStreamClose.c
b/src/log/apitest/tet_saLogStreamClose.cc
similarity index 59%
rename from src/log/apitest/tet_saLogStreamClose.c
rename to src/log/apitest/tet_saLogStreamClose.cc
index 52ca3a259..895e8ab28 100644
--- a/src/log/apitest/tet_saLogStreamClose.c
+++ b/src/log/apitest/tet_saLogStreamClose.cc
@@ -15,7 +15,9 @@
*
*/
+extern "C" {
#include "logtest.h"
+}
/* Object to test: logStreamClose() API:
* Test: Test closing an open stream using an valid handle
@@ -81,6 +83,84 @@ void saLogStreamClose_with_uninitialized_handle(void)
test_validate(rc, SA_AIS_ERR_BAD_HANDLE);
}
+/* Object to test: logStreamClose() API:
+ * Test: Test closing an open stream inside a destructor
+ * step1: Create an object
+ * step2: Call logInitialize()
+ * step3: Call logStreamOpen()
+ * step4: Call saLogStreamClose() and logFinalize() in the
+ * destructor of the object.
+ * Result: Shall pass with the return code SA_AIS_OK
+ */
+class ClosingStreamInDestructor
+{
+public:
+ static ClosingStreamInDestructor* getInstance()
+ {
+ static ClosingStreamInDestructor me;
+ return &me;
+ }
+ void run()
+ {
+ SaAisErrorT 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);
+ }
+ }
+private:
+ ClosingStreamInDestructor()
+ {
+ };
+
+ ~ClosingStreamInDestructor()
+ {
+ SaAisErrorT rc = logStreamClose();
+ if (rc != SA_AIS_OK) {
+ exit(1);
+ }
+ rc = logFinalize();
+ if (rc != SA_AIS_OK) {
+ exit(1);
+ }
+ };
+};
+
+void saLogStreamCloseInDestructor(void)
+{
+ pid_t pid = fork();
+ if (pid == -1) {
+ test_validate(SA_AIS_ERR_LIBRARY, SA_AIS_OK);
+ } else if (pid == 0) {
+ // Child process
+ ClosingStreamInDestructor* obj =
+ ClosingStreamInDestructor::getInstance();
+ obj->run();
+ exit(0);
+ } else {
+ // Parent process
+ int status;
+ wait(&status);
+ if (WIFEXITED(status)) {
+ printf("Child process exited, status=%d\n",
+ WEXITSTATUS(status));
+ test_validate(WEXITSTATUS(status), 0);
+ } else if (WIFSIGNALED(status) && WCOREDUMP(status)) {
+ printf("Coredump in child process\n");
+ test_validate(SA_AIS_ERR_LIBRARY, SA_AIS_OK);
+ } else {
+ printf("Child process was stopped by a signal\n");
+ test_validate(SA_AIS_OK, SA_AIS_OK);
+ }
+ }
+}
+
__attribute__((constructor)) static void saLibraryLifeCycle_constructor(void)
{
test_case_add(2, saLogStreamClose_with_valid_handle,
@@ -89,4 +169,6 @@ __attribute__((constructor)) static void
saLibraryLifeCycle_constructor(void)
"saLogStreamClose with invalid handle");
test_case_add(2, saLogStreamClose_with_uninitialized_handle,
"saLogStreamClose with uninitialized handle");
+ test_case_add(2, saLogStreamCloseInDestructor,
+ "saLogStreamClose in a destructor");
}
--
2.25.1
_______________________________________________
Opensaf-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-devel