Hi Thien,
Ack with comments inline.
Regards, Vu
On 1/20/20 2:59 PM, thien.m.huynh wrote:
Adding 05 new test case into a new testsuite 22
---
src/log/Makefile.am | 7 +-
src/log/apitest/log_server.cc | 43 +++
src/log/apitest/log_server.h | 35 +++
.../apitest/tet_saLogStreamConfigFacilityId.c | 273 ++++++++++++++++++
src/log/tests/lgs_dest_test.cc | 3 +
5 files changed, 359 insertions(+), 2 deletions(-)
create mode 100644 src/log/apitest/log_server.cc
create mode 100644 src/log/apitest/log_server.h
create mode 100644 src/log/apitest/tet_saLogStreamConfigFacilityId.c
diff --git a/src/log/Makefile.am b/src/log/Makefile.am
index a2a98baec..2dad3cfb1 100644
--- a/src/log/Makefile.am
+++ b/src/log/Makefile.am
@@ -190,7 +190,8 @@ bin_PROGRAMS += bin/logtest bin/saflogtest bin/logtestfr
noinst_HEADERS += \
src/log/apitest/logtest.h \
src/log/apitest/logutil.h \
- src/log/apitest/imm_tstutil.h
+ src/log/apitest/imm_tstutil.h \
+ src/log/apitest/log_server.h
bin_logtest_CFLAGS = $(AM_CFLAGS) -Wformat=1
@@ -227,7 +228,9 @@ bin_logtest_SOURCES = \
src/log/apitest/tet_Log_clm.c \
src/log/apitest/tet_cfg_destination.c \
src/log/apitest/tet_multiple_thread.c \
- src/log/apitest/tet_saLogWriteLogAsync_cache.c
+ src/log/apitest/tet_saLogWriteLogAsync_cache.c \
+ src/log/apitest/tet_saLogStreamConfigFacilityId.c \
+ src/log/apitest/log_server.cc
bin_logtest_LDADD = \
lib/libapitest.la \
diff --git a/src/log/apitest/log_server.cc b/src/log/apitest/log_server.cc
new file mode 100644
index 000000000..25f7894e0
--- /dev/null
+++ b/src/log/apitest/log_server.cc
@@ -0,0 +1,43 @@
+/* -*- OpenSAF -*-
+ *
+ * Copyright Ericsson AB 2020 - All Rights Reserved.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed
+ * under the GNU Lesser General Public License Version 2.1, February 1999.
+ * The complete license can be accessed from the following location:
+ * http://opensource.org/licenses/lgpl-license.php
+ * See the Copying file included with the OpenSAF distribution for full
+ * licensing terms.
+ *
+ * Author(s): Ericsson AB
+ *
+ */
+
+#include "log/apitest/log_server.h"
+#include "base/unix_server_socket.h"
+
+static base::UnixServerSocket* server = nullptr;
+
+void StartUnixServer() {
+ server = new base::UnixServerSocket("/tmp/test.sock",
+ base::UnixSocket::kBlocking, 0777);
+ server->fd();
+}
+
+bool FindPRI(const char* pri_field, const char* msg) {
+ char buf[1024];
+ bool found = false;
+ do {
+ memset(buf, 0, sizeof(buf));
+ size_t len = server->Recv(buf, 1024);
+ buf[len] = '\0';
+ if (!strncmp(buf, pri_field, strlen(pri_field))) {
+ found = true;
+ }
+ } while (!strstr(buf, msg));
+ return found;
+}
[Vu] The while loop may be blocked forever. Should add a mechanism to
break the loop based on number of retries.
+
+void StopUnixServer() { delete server; }
diff --git a/src/log/apitest/log_server.h b/src/log/apitest/log_server.h
new file mode 100644
index 000000000..e36f885fa
--- /dev/null
+++ b/src/log/apitest/log_server.h
@@ -0,0 +1,35 @@
+/* -*- OpenSAF -*-
+ *
+ * Copyright Ericsson AB 2020 - All Rights Reserved.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed
+ * under the GNU Lesser General Public License Version 2.1, February 1999.
+ * The complete license can be accessed from the following location:
+ * http://opensource.org/licenses/lgpl-license.php
+ * See the Copying file included with the OpenSAF distribution for full
+ * licensing terms.
+ *
+ * Author(s): Ericsson AB
+ *
+ */
+
+#ifndef LOG_APITEST_LOG_SERVER_H_
+#define LOG_APITEST_LOG_SERVER_H_
+
+#include <stdbool.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void StartUnixServer();
+bool FindPRI(const char* pri_field, const char* msg);
+void StopUnixServer();
+
+#ifdef __cplusplus
+} // closing brace for extern "C"
+#endif
+
+#endif // LOG_APITEST_LOG_SERVER_H_
diff --git a/src/log/apitest/tet_saLogStreamConfigFacilityId.c
b/src/log/apitest/tet_saLogStreamConfigFacilityId.c
new file mode 100644
index 000000000..276642d69
--- /dev/null
+++ b/src/log/apitest/tet_saLogStreamConfigFacilityId.c
@@ -0,0 +1,273 @@
+/* -*- OpenSAF -*-
+ *
+ * Copyright Ericsson AB 2020 - All Rights Reserved.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. This file and program are licensed
+ * under the GNU Lesser General Public License Version 2.1, February 1999.
+ * The complete license can be accessed from the following location:
+ * http://opensource.org/licenses/lgpl-license.php
+ * See the Copying file included with the OpenSAF distribution for full
+ * licensing terms.
+ *
+ * Author(s): Ericsson AB
+ *
+ */
+
+#include "log/apitest/log_server.h"
+#include "log/apitest/logtest.h"
+
+typedef enum { ACTIVE_NODE = 0, STANDBY_NODE = 1, PAYLOAD = 2 } role;
[Vu] remove typedef, using:
enum Role {
ACTIVE_NODE = 0,
STANDBY_NODE,
PAYLOAD_NODE // keep the name consistent with the others.
...
};
+
+static bool set_facility_id(uint32_t value)
+{
+ char command[1000] = {0};
+ sprintf(command, "immcfg -a saLogStreamFacilityId=%d %s 2>/dev/null",
+ value, SA_LOG_STREAM_SYSTEM);
[Vu] snprintf(command, sizeof(command), ""); This commend is for all
below sprintf().
+ return systemCall(command) == EXIT_SUCCESS;
+}
+
+static void restore_facility_id()
+{
+ const char *command =
+ "immcfg -a saLogStreamFacilityId= " SA_LOG_STREAM_SYSTEM;
+ (void)systemCall(command);
+}
+
+static void enable_streaming()
+{
+ const char dest[] = "test;UNIX_SOCKET;/tmp/test.sock";
[Vu] Using const char* to keep consistent with the other places.
const char* dest = "";
+ char command[1000];
+
+ memset(command, 0, sizeof(command));
+ sprintf(
+ command,
+ "immcfg -a logRecordDestinationConfiguration=\"%s\" %s 2>/dev/null",
+ dest, SA_LOG_CONFIGURATION_OBJECT);
+ (void)systemCall(command);
+
+ memset(command, 0, sizeof(command));
+ sprintf(command, "immcfg -a saLogRecordDestination=test %s 2>/dev/null",
+ SA_LOG_STREAM_SYSTEM);
+ (void)systemCall(command);
+}
+
+static void stop_streaming()
[Vu] the proper pair should be: enable/disable, start/stop. So, naming
this function to 'disable_streaming'.
+{
+ char command[1000];
+ /* Restore the value back to the default value */
+ memset(command, 0, sizeof(command));
+ sprintf(command, "immcfg -a saLogRecordDestination= %s 2>/dev/null",
+ SA_LOG_STREAM_SYSTEM);
+ (void)systemCall(command);
+
+ memset(command, 0, sizeof(command));
+ sprintf(command,
+ "immcfg -a logRecordDestinationConfiguration= %s 2>/dev/null",
+ SA_LOG_CONFIGURATION_OBJECT);
+ (void)systemCall(command);
+ restore_facility_id();
+}
+
+static void switch_over()
+{
+ const char *command =
+ "amf-adm si-swap safSi=SC-2N,safApp=OpenSAF 2>/dev/null";
+ (void)systemCall(command);
+}
+
+static uint8_t get_role()
+{
+ char node[256];
+ sprintf(node, "SC-%d", get_active_sc());
+ if (strncmp("PL", hostname(), 2) == 0) {
+ return PAYLOAD;
+ } else {
[Vu] This 'else' is unnecessary.
if (strncmp("PL" ...) return PAYLOAD_NODE;
if (strcmp(node, hostname()) == 0) return ACTIVE_NODE;
return STANDBY_NODE;
+ if (strcmp(node, hostname()) == 0)
+ return ACTIVE_NODE;
+ return STANDBY_NODE;
+ }
+}
+
+//>
+// 02 test cases about configuring `saLogStreamFacilityId`:
+// 1) try to set a valid value, expect getting OK.
+// 2) try to set an invalid value, expect getting NOK.
+//<
+
+// TC#1: Set a valid value to `saLogStreamFacilityId`
+void config_saLogStreamFacilityId_1()
+{
+ test_validate(set_facility_id(4), true);
+ restore_facility_id();
+}
+
+// TC#2: Set an invalid value to `saLogStreamFacilityId`
+void config_saLogStreamFacilityId_2()
+{
+ test_validate(set_facility_id(24), false);
+}
+
+//>
+// TC#3: Verify if PRI = 38 (saLogStreamFacilityId * 8 + severity) in package
+// RFC5424 format.The test must run on active node.
+//
+// Change `saLogStreamFacilityId = 4` and send the log record with severity = 6
+//<
+void streaming_log_record_then_verify_PRI_1()
+{
+ if (get_role() != ACTIVE_NODE) {
+ test_validate(true, true);
+ return;
+ }
+
+ enable_streaming();
+ set_facility_id(4);
+ StartUnixServer();
+
+ strcpy((char *)genLogRecord.logBuffer->logBuf, __FUNCTION__);
+ genLogRecord.logBuffer->logBufSize = strlen(__FUNCTION__);
+ genLogRecord.logHeader.genericHdr.logSeverity = SA_LOG_SEV_INFO;
+
+ rc = logInitialize();
+ if (rc != SA_AIS_OK) {
+ test_validate(rc, SA_AIS_OK);
+ goto done;
+ }
+
+ rc = logStreamOpen(&systemStreamName);
+ if (rc != SA_AIS_OK) {
+ test_validate(rc, SA_AIS_OK);
+ goto done;
+ }
+
+ rc = logWriteAsync(&genLogRecord);
+ if (rc != SA_AIS_OK) {
+ test_validate(rc, SA_AIS_OK);
+ goto done;
+ }
+
+ test_validate(FindPRI("<38>", (char *)__FUNCTION__), true);
+
+done:
+ stop_streaming();
+ logStreamClose();
+ logFinalize();
+ StopUnixServer();
[Vu] Wrong order. Should be:
StopUnixServer()
Restore facility Id
Disable streaming
log finalize()
This comment applies to other places.
+}
+
+//>
+// TC#4: Verify if PRI = 134 (saLogStreamFacilityId (16)* 8 + severity) in
+// package RFC5424 format.The test must run on active node.
+//
+// Delete attribute `saLogStreamFacilityId` and send the log record with
+// severity = 6(information message)
+//<
+void streaming_log_record_then_verify_PRI_2()
+{
+ if (get_role() != ACTIVE_NODE) {
+ test_validate(true, true);
+ return;
+ }
+
+ enable_streaming();
+ restore_facility_id();
+ StartUnixServer();
+
+ strcpy((char *)genLogRecord.logBuffer->logBuf, __FUNCTION__);
+ genLogRecord.logBuffer->logBufSize = strlen(__FUNCTION__);
+ genLogRecord.logHeader.genericHdr.logSeverity = SA_LOG_SEV_INFO;
+
+ rc = logInitialize();
+ if (rc != SA_AIS_OK) {
+ test_validate(rc, SA_AIS_OK);
+ goto done;
+ }
+
+ rc = logStreamOpen(&systemStreamName);
+ if (rc != SA_AIS_OK) {
+ test_validate(rc, SA_AIS_OK);
+ goto done;
+ }
+
+ rc = logWriteAsync(&genLogRecord);
+ if (rc != SA_AIS_OK) {
+ test_validate(rc, SA_AIS_OK);
+ goto done;
+ }
+
+ test_validate(FindPRI("<134>", (char *)__FUNCTION__), true);
+
+done:
+ stop_streaming();
+ logStreamClose();
+ logFinalize();
+ StopUnixServer();
+}
+
+//>
+// TC#5: This test case verify if the PRI=38 after trigger switch-over and
+// streaming log record ('PRI'field in package RFC5425 ).The test must run
+// on standby node.
+//<
+void streaming_log_record_then_verify_PRI_3()
+{
+ if (get_role() != STANDBY_NODE) {
+ test_validate(true, true);
+ return;
+ }
+
+ enable_streaming();
+ set_facility_id(4);
+ switch_over();
+ StartUnixServer();
+
+ strcpy((char *)genLogRecord.logBuffer->logBuf, __FUNCTION__);
+ genLogRecord.logBuffer->logBufSize = strlen(__FUNCTION__);
+ genLogRecord.logHeader.genericHdr.logSeverity = SA_LOG_SEV_INFO;
+
+ rc = logInitialize();
+ if (rc != SA_AIS_OK) {
+ test_validate(rc, SA_AIS_OK);
+ goto done;
+ }
+
+ rc = logStreamOpen(&systemStreamName);
+ if (rc != SA_AIS_OK) {
+ test_validate(rc, SA_AIS_OK);
+ goto done;
+ }
+
+ rc = logWriteAsync(&genLogRecord);
+ if (rc != SA_AIS_OK) {
+ test_validate(rc, SA_AIS_OK);
+ goto done;
+ }
+
+ test_validate(FindPRI("<38>", (char *)__FUNCTION__), true);
+
+done:
+ stop_streaming();
+ logStreamClose();
+ logFinalize();
+ StopUnixServer();
+}
+
+__attribute__((constructor)) static void saLibraryLifeCycle_constructor(void)
+{
+ test_suite_add(22, "Test log stream config facility id");
+ test_case_add(22, config_saLogStreamFacilityId_1,
+ "Set a valid value to saLogStreamFacilityId");
+ test_case_add(22, config_saLogStreamFacilityId_2,
+ "Set a invalid value to saLogStreamFacilityId");
+ test_case_add(22, streaming_log_record_then_verify_PRI_1,
+ "Streaming with configure saLogStreamFacilityId=4 and "
+ "verify PRI field");
+ test_case_add(
+ 22, streaming_log_record_then_verify_PRI_2,
+ "Delelte attribute saLogStreamFacilityId and verify PRI field");
+ test_case_add(22, streaming_log_record_then_verify_PRI_3,
+ "Trigger switch-over then verify PRI field in package "
+ "RFC5424 format");
+}
diff --git a/src/log/tests/lgs_dest_test.cc b/src/log/tests/lgs_dest_test.cc
index 3f1b90e57..6ef27ac0d 100644
--- a/src/log/tests/lgs_dest_test.cc
+++ b/src/log/tests/lgs_dest_test.cc
@@ -147,6 +147,7 @@ static const char rec[] = "hello world";
static const char hostname[] = "sc-1";
static const char networkname[] = "networkA";
static const uint16_t sev = 3;
+static const uint32_t facilityId = 4;
static const char appname[] = "lgs_dest_test";
static const char dn[] = "safLgStrCfg=test";
static const char msgid[] = "testC";
@@ -162,6 +163,7 @@ void initData(RecordData* data) {
data->recordId = 1;
data->sev = 3;
data->time = base::ReadRealtimeClock();
+ data->facilityId = facilityId;
[Vu] Add other test case for the facility change. Don't touch the
current one.
}
// No destination name & no destination configuration exist
@@ -258,6 +260,7 @@ TEST(WriteToDestination, HaveDestNameAndDestCfg) {
info.severity = data.sev;
info.time = data.time;
info.origin = origin.c_str();
+ info.facilityId = data.facilityId;
WriteToDestination(data, {"test"});
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel