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 Opensaf-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/opensaf-devel