From 69035fb621984a38bd9f888ba1927c5a2a5ea534 Mon Sep 17 00:00:00 2001 From: ben Date: Sun, 1 Sep 2024 15:05:56 +0300 Subject: [PATCH] Fix UT and Win build --- main.cpp | 36 +++++++++++++++++++++++++++++-- sh_mem/ClientProcCommunicator.cpp | 17 +++++++++------ sh_mem/ServerProcCommunicator.cpp | 6 ++++++ unit_tests/MessagingTest.cpp | 31 +++++++++++++------------- 4 files changed, 67 insertions(+), 23 deletions(-) diff --git a/main.cpp b/main.cpp index 5610419..33bff82 100644 --- a/main.cpp +++ b/main.cpp @@ -6,7 +6,14 @@ #include "AmApi.h" #include "sh_mem/ServerProcCommunicator.h" +#include "sh_mem/ClientProcCommunicator.h" #include + +#include +#include +#include +#include + enum State : size_t { UNKNOWN = 0, @@ -95,12 +102,37 @@ struct ConnectionsInfo std::unique_ptr amApi; std::vector clients; }; +const std::string shared_memory_name{"/_shmem1107"}; +std::unique_ptr slave; +void handleSignal(int signal) +{ + std::cout << "Received SIGTERM signal (" << signal << "). Cleaning up and exiting...\n"; + slave.reset(); + + exit(0); // Exit the program with status code 0 +} int main(int argc, char *argv[]) { - const std::string shared_memory_name{"/_shmem1103"}; + struct sigaction sa; + sa.sa_handler = handleSignal; // Set the handler function + sa.sa_flags = 0; // No special flags + sigemptyset(&sa.sa_mask); // No additional signals blocked during handler execution + + // Set up handlers for SIGTERM and SIGINT + if (sigaction(SIGTERM, &sa, nullptr) == -1) + { + std::cerr << "Error setting up SIGTERM handler\n"; + return 1; + } + if (sigaction(SIGINT, &sa, nullptr) == -1) + { + std::cerr << "Error setting up SIGINT handler\n"; + return 1; + } + bool isStopRequested{false}, connectionConfirmed{false}; - std::unique_ptr slave = std::make_unique(shared_memory_name); + slave = std::make_unique(shared_memory_name); am::configuration::Configuration default_conf{75, 10, 1, 50, 5, 10.0}; std::unique_ptr amApi = std::make_unique(default_conf); diff --git a/sh_mem/ClientProcCommunicator.cpp b/sh_mem/ClientProcCommunicator.cpp index 46b0e83..c98dd48 100644 --- a/sh_mem/ClientProcCommunicator.cpp +++ b/sh_mem/ClientProcCommunicator.cpp @@ -1,18 +1,23 @@ #include "ClientProcCommunicator.h" +#include +#include +#include ClientProcCommunicator::ClientProcCommunicator( const std::string &shMemName) : ProcCommunicator(shMemName) { + printf("1 \n"); m_sender = std::make_unique( m_master_mem_name.c_str()); + printf("2 \n"); m_receiver = std::make_unique(m_slave_mem_name.c_str()); - + printf("3 \n"); #ifndef _WIN32 m_master_received = sem_open(m_master_received_s.c_str(), O_CREAT, 0666, SEMAPHORE_DISABLED); m_slave_received = sem_open(m_slave_received_s.c_str(), O_CREAT, 0666, SEMAPHORE_DISABLED); m_master_sent = sem_open(m_master_sent_s.c_str(), O_CREAT, 0666, SEMAPHORE_DISABLED); m_slave_sent = sem_open(m_slave_sent_s.c_str(), O_CREAT, 0666, SEMAPHORE_DISABLED); m_slave_ready = sem_open(m_slave_ready_s.c_str(), O_CREAT, 0666, SEMAPHORE_ENABLED); - + printf("4 \n"); if (m_master_received == SEM_FAILED || m_slave_received == SEM_FAILED || m_master_sent == SEM_FAILED || m_slave_sent == SEM_FAILED || m_slave_ready == SEM_FAILED || m_slave_ready == SEM_FAILED) { @@ -22,11 +27,11 @@ ClientProcCommunicator::ClientProcCommunicator( #else std::wstring wshMemName(shMemName.begin(), shMemName.end()); - m_master_received = CreateSemaphoreW(NULL, SEMAPHORE_DISABLED, MAXLONG, (wshMemName + L"_m_rsem").c_str())); - m_slave_received = CreateSemaphoreW(NULL, SEMAPHORE_DISABLED, MAXLONG, (wshMemName + L"_s_rsem").c_str())); + m_master_received = CreateSemaphoreW(NULL, SEMAPHORE_DISABLED, MAXLONG, (wshMemName + L"_m_rsem").c_str()); + m_slave_received = CreateSemaphoreW(NULL, SEMAPHORE_DISABLED, MAXLONG, (wshMemName + L"_s_rsem").c_str()); m_master_sent = CreateSemaphoreW(NULL, SEMAPHORE_DISABLED, MAXLONG, (wshMemName + L"_m_sent").c_str()); - m_slave_sent = CreateSemaphoreW(NULL, SEMAPHORE_DISABLED, MAXLONG, (wshMemName + L"_s_sent").c_str())); - m_slave_ready = CreateSemaphoreW(NULL, SEMAPHORE_ENABLED, MAXLONG, (wshMemName + L"_s_ready").c_str())); + m_slave_sent = CreateSemaphoreW(NULL, SEMAPHORE_DISABLED, MAXLONG, (wshMemName + L"_s_sent").c_str()); + m_slave_ready = CreateSemaphoreW(NULL, SEMAPHORE_ENABLED, MAXLONG, (wshMemName + L"_s_ready").c_str()); if (m_master_received == NULL || m_slave_received == NULL || m_master_sent == NULL || m_slave_sent == NULL || m_slave_ready == NULL) diff --git a/sh_mem/ServerProcCommunicator.cpp b/sh_mem/ServerProcCommunicator.cpp index a0031f7..8fb8941 100644 --- a/sh_mem/ServerProcCommunicator.cpp +++ b/sh_mem/ServerProcCommunicator.cpp @@ -1,4 +1,7 @@ #include "ServerProcCommunicator.h" +#include +#include +#include ServerProcCommunicator::ServerProcCommunicator( const std::string &shMemName) : ProcCommunicator(shMemName) @@ -38,9 +41,11 @@ ServerProcCommunicator::ServerProcCommunicator( } #endif + } ServerProcCommunicator::~ServerProcCommunicator() { +#ifndef _WIN32 if (sem_unlink(m_master_received_s.c_str()) == -1) { perror("Failed to unlink m_master_received semaphore"); @@ -65,6 +70,7 @@ ServerProcCommunicator::~ServerProcCommunicator() { perror("Failed to unlink m_slave_ready semaphore"); } +#endif } #ifndef _WIN32 diff --git a/unit_tests/MessagingTest.cpp b/unit_tests/MessagingTest.cpp index fe9c945..7ce0060 100644 --- a/unit_tests/MessagingTest.cpp +++ b/unit_tests/MessagingTest.cpp @@ -1,4 +1,5 @@ -#include "ProcCommunicator.h" +#include "ServerProcCommunicator.h" +#include "ClientProcCommunicator.h" #include #include #include @@ -10,17 +11,17 @@ static const std::string shared_mem_name{"/shmem_test"}; void backgroundTask() { std::cout << "Background task starts.\n"; - Message msg_hand{2, MessageType::HANDSHAKE}; - ProcCommunicator master(true, true, shared_mem_name); + Message request{1, MessageType::HANDSHAKE}; + Message response{666, MessageType::HANDSHAKE}; + ClientProcCommunicator master(shared_mem_name); int counter = 0; while (counter < 10) { //each client must receive its id - master.send(&msg_hand); - auto msg_resp = master.receive(); - EXPECT_EQ(msg_resp->id, 2); - master.ackNotify(); + master.sendRequestGetResponse(&request, response); + EXPECT_EQ(response.id, 1); + EXPECT_EQ(response.type, MessageType::HANDSHAKE_OK); counter++; } @@ -30,17 +31,17 @@ void backgroundTask() void backgroundTaskMasterMaster() { std::cout << "Background Master task started...\n"; - ProcCommunicator master(true, true, shared_mem_name); - Message msg_hand{1, MessageType::HANDSHAKE}; - + ClientProcCommunicator master( shared_mem_name); + Message request{2, MessageType::HANDSHAKE}; + Message response{666, MessageType::HANDSHAKE}; int counter = 0; while (counter < 10) { - master.send(&msg_hand); - auto msg_resp = master.receive(); - EXPECT_EQ(msg_resp->id, 1); - master.ackNotify(); + //each client must receive its id + master.sendRequestGetResponse(&request, response); + EXPECT_EQ(response.id, 2); + EXPECT_EQ(response.type, MessageType::HANDSHAKE_OK); counter++; } @@ -49,7 +50,7 @@ void backgroundTaskMasterMaster() TEST(MessagingTest, TestMultiMasterMode) { std::cout << "Server starts...\n"; - ProcCommunicator *slave = new ProcCommunicator(false, true, shared_mem_name); + ServerProcCommunicator *slave = new ServerProcCommunicator(shared_mem_name); Message *res = nullptr; int counter = 0;