diff --git a/src/tmx/TmxUtils/test/MockSNMPClient.h b/src/tmx/TmxUtils/src/MockSNMPClient.h similarity index 100% rename from src/tmx/TmxUtils/test/MockSNMPClient.h rename to src/tmx/TmxUtils/src/MockSNMPClient.h diff --git a/src/tmx/TmxUtils/src/MockUdpServer.h b/src/tmx/TmxUtils/src/MockUdpServer.h index 533965711..0197f54bb 100644 --- a/src/tmx/TmxUtils/src/MockUdpServer.h +++ b/src/tmx/TmxUtils/src/MockUdpServer.h @@ -24,6 +24,6 @@ namespace tmx::utils { MOCK_METHOD(std::string, GetAddress, (), (const, override)); MOCK_METHOD(int, Receive, (char *msg, size_t maxSize), (override)); MOCK_METHOD(int, GetSocket, (), (override, const)); + MOCK_METHOD(std::string, stringTimedReceive, (int maxWait_ms), (override)); }; - } \ No newline at end of file diff --git a/src/tmx/TmxUtils/test/test_SNMPClient.cpp b/src/tmx/TmxUtils/test/test_SNMPClient.cpp index 3e775945c..55871477d 100644 --- a/src/tmx/TmxUtils/test/test_SNMPClient.cpp +++ b/src/tmx/TmxUtils/test/test_SNMPClient.cpp @@ -1,7 +1,7 @@ -#include "MockSNMPClient.h" -#include "gtest/gtest.h" -#include "RSU_MIB_4_1.h" +#include +#include +#include using namespace tmx::utils; using namespace std; diff --git a/src/v2i-hub/SpatPlugin/CMakeLists.txt b/src/v2i-hub/SpatPlugin/CMakeLists.txt index d75cd037c..202a952d9 100644 --- a/src/v2i-hub/SpatPlugin/CMakeLists.txt +++ b/src/v2i-hub/SpatPlugin/CMakeLists.txt @@ -11,7 +11,8 @@ target_link_libraries(${PROJECT_NAME} tmxutils ::carma-clock jsoncpp) -add_library(${PROJECT_NAME}_lib src/NTCIP1202.cpp) +add_library(${PROJECT_NAME}_lib src/NTCIP1202.cpp + src/SignalControllerConnection.cpp) target_link_libraries(${PROJECT_NAME}_lib PUBLIC tmxutils ::carma-clock ) ############# diff --git a/src/v2i-hub/SpatPlugin/src/SignalControllerConnection.cpp b/src/v2i-hub/SpatPlugin/src/SignalControllerConnection.cpp index e7854ad29..a69c238e8 100644 --- a/src/v2i-hub/SpatPlugin/src/SignalControllerConnection.cpp +++ b/src/v2i-hub/SpatPlugin/src/SignalControllerConnection.cpp @@ -12,7 +12,7 @@ namespace SpatPlugin { return scSNMPClient->process_snmp_request("1.3.6.1.4.1.1206.3.5.2.9.44.1.0", tmx::utils::request_type::SET, resp); }; - void SignalControllerConnection::receiveBinarySPAT(std::shared_ptr spat, uint64_t timeMs ) { + void SignalControllerConnection::receiveBinarySPAT(std::shared_ptr &spat, uint64_t timeMs ) { FILE_LOG(tmx::utils::logDEBUG) << "Receiving binary SPAT ..." << std::endl; char buf[1000]; auto numBytes = spatPacketReceiver->TimedReceive(buf, 1000, 1000); @@ -30,8 +30,8 @@ namespace SpatPlugin { } } - void SignalControllerConnection::receiveUPERSPAT(std::shared_ptr spatEncoded_ptr) { - FILE_LOG(tmx::utils::logDEBUG) << "Receiving J2725 HEX SPAT ..." << std::endl; + void SignalControllerConnection::receiveUPERSPAT(std::shared_ptr &spatEncoded_ptr) { + FILE_LOG(tmx::utils::logDEBUG1) << "Receiving J2725 HEX SPAT ..." << std::endl; auto payload = spatPacketReceiver->stringTimedReceive( 1000 ); auto index = payload.find("Payload="); if ( index != std::string::npos ) { @@ -40,7 +40,7 @@ namespace SpatPlugin { // Remove new lines and empty space hex.erase(std::remove(hex.begin(), hex.end(), '\n'), hex.end()); hex.erase(std::remove(hex.begin(), hex.end(), ' '), hex.end()); - FILE_LOG(tmx::utils::logDEBUG) << "Reading HEX String " << hex << std::endl; + FILE_LOG(tmx::utils::logDEBUG1) << "Reading HEX String " << hex << std::endl; // Convert to byte stream tmx::byte_stream bytes = tmx::byte_stream_decode(hex); // Read SpateEncodedMessage from bytes diff --git a/src/v2i-hub/SpatPlugin/src/SignalControllerConnection.h b/src/v2i-hub/SpatPlugin/src/SignalControllerConnection.h index 0da434fba..521caa0be 100644 --- a/src/v2i-hub/SpatPlugin/src/SignalControllerConnection.h +++ b/src/v2i-hub/SpatPlugin/src/SignalControllerConnection.h @@ -8,6 +8,8 @@ #include #include #include +#include + namespace SpatPlugin { enum class SPAT_MODE @@ -20,21 +22,23 @@ namespace SpatPlugin { { private: // UDP Server socket listening for SPAT - std::unique_ptr spatPacketReceiver; + std::shared_ptr spatPacketReceiver; - std::unique_ptr scSNMPClient; + std::shared_ptr scSNMPClient; std::string signalGroupMapping; std::string intersectionName; unsigned int intersectionId; + friend class TestSignalControllerConnection; + FRIEND_TEST(TestSignalControllerConnection, initialize); public: SignalControllerConnection(const std::string &localIp, unsigned int localPort, const std::string &signalGroupMapping, const std::string &scIp, unsigned int scSNMPPort, const std::string &intersectionName, unsigned int intersectionID); + bool initializeSignalControllerConnection(); - tmx::messages::SpatEncodedMessage receiveSPAT(SPAT *spat, uint64_t timeMs , const SPAT_MODE &spat_mode = SPAT_MODE::BINARY); - void receiveBinarySPAT(std::shared_ptr spat, uint64_t timeMs); + void receiveBinarySPAT(std::shared_ptr &spat, uint64_t timeMs); - void receiveUPERSPAT(std::shared_ptr spatEncoded_ptr); + void receiveUPERSPAT(std::shared_ptr &spatEncoded_ptr); }; } \ No newline at end of file diff --git a/src/v2i-hub/SpatPlugin/test/TestSignalControllerConnection.cpp b/src/v2i-hub/SpatPlugin/test/TestSignalControllerConnection.cpp index e69de29bb..22b50a704 100644 --- a/src/v2i-hub/SpatPlugin/test/TestSignalControllerConnection.cpp +++ b/src/v2i-hub/SpatPlugin/test/TestSignalControllerConnection.cpp @@ -0,0 +1,312 @@ +#include +#include +#include +#include +#include + +using testing::_; +using testing::Action; +using testing::DoDefault; +using testing::Return; +using testing::SetArgReferee; +using testing::Throw; +namespace SpatPlugin { + class TestSignalControllerConnection : public ::testing::Test + { + public: + TestSignalControllerConnection() { + + } + void SetUp() { + std::string signalGroupMapping = R"( + {\"SignalGroups\": + [ + {\"SignalGroupId\":1,\"Phase\":1,\"Type\":\"vehicle\"}, + {\"SignalGroupId\":2,\"Phase\":2,\"Type\":\"vehicle\"}, + {\"SignalGroupId\":3,\"Phase\":3,\"Type\":\"vehicle\"}, + {\"SignalGroupId\":4,\"Phase\":4,\"Type\":\"vehicle\"}, + {\"SignalGroupId\":5,\"Phase\":5,\"Type\":\"vehicle\"}, + {\"SignalGroupId\":6,\"Phase\":6,\"Type\":\"vehicle\"}, + {\"SignalGroupId\":7,\"Phase\":7,\"Type\":\"vehicle\"}, + {\"SignalGroupId\":8,\"Phase\":8,\"Type\":\"vehicle\"}, + {\"SignalGroupId\":22,\"Phase\":2,\"Type\":\"pedestrian\"}, + {\"SignalGroupId\":24,\"Phase\":4,\"Type\":\"pedestrian\"}, + {\"SignalGroupId\":26,\"Phase\":6,\"Type\":\"pedestrian\"}, + {\"SignalGroupId\":28,\"Phase\":8,\"Type\":\"pedestrian\"} + ] + } + )"; + signalControllerConnection = std::make_unique("127.0.0.1", 5000, signalGroupMapping, "", 5020, "someIntersection", 9001); + mockSnmpClient = std::make_shared("127.0.0.1", 6045, "administrator", "", "", ""); + mockUdpServer = std::make_shared(); + signalControllerConnection->scSNMPClient = mockSnmpClient; + signalControllerConnection->spatPacketReceiver = mockUdpServer; + } + + std::shared_ptr mockSnmpClient; + std::shared_ptr mockUdpServer; + + std::unique_ptr signalControllerConnection; + }; + + TEST_F(TestSignalControllerConnection, initialize) { + tmx::utils::snmp_response_obj set_value; + set_value.type = tmx::utils::snmp_response_obj::response_type::INTEGER; + set_value.val_int = 2; + EXPECT_CALL(*mockSnmpClient, process_snmp_request("1.3.6.1.4.1.1206.3.5.2.9.44.1.0", tmx::utils::request_type::SET, set_value)).WillOnce(testing::DoAll(SetArgReferee<2>(set_value), Return(true))); + EXPECT_TRUE(signalControllerConnection->initializeSignalControllerConnection()); + } + + TEST_F(TestSignalControllerConnection, receiveBinarySPAT) { + } + + TEST_F(TestSignalControllerConnection, receiveUPERSPAT) { + std::string uper_hex = R"( + Version=0.7 + Type=SPAT + PSID=0x8002 + Priority=7 + TxMode=CONT + TxChannel=172 + TxInterval=0 + DeliveryStart= + DeliveryStop= + Signature=True + Encryption=False + Payload=00136b4457f20180000000208457f2c7c20b0010434162bc650001022a0b0be328000c10d058af194000808682c578ca00050434162bc650003022a0b0be328001c10d058af194001008682c578ca000904341617c650005021a0b15e328002c10d0585f194001808682c578ca00 + )"; + EXPECT_CALL(*mockUdpServer, stringTimedReceive(1000)).WillOnce(testing::DoAll(Return(uper_hex))); + + /** + * + 284658 + + + + 0 + + 0 + + 0000001000001000 + + 284658 + 51138 + + + 1 + + + + + 11351 + 36000 + + + + + + 2 + + + + + 11311 + 36000 + + + + + + 3 + + + + + 11351 + 36000 + + + + + + 4 + + + + + 11351 + 36000 + + + + + + 5 + + + + + 11351 + 36000 + + + + + + 6 + + + + + 11311 + 36000 + + + + + + 7 + + + + + 11351 + 36000 + + + + + + 8 + + + + + 11351 + 36000 + + + + + + 9 + + + + + 11311 + 36000 + + + + + + 10 + + + + + 11351 + 36000 + + + + + + 11 + + + + + 11311 + 36000 + + + + + + 12 + + + + + 11351 + 36000 + + + + + + + + + */ + auto spatEncoded_ptr = std::make_shared(); + signalControllerConnection->receiveUPERSPAT(spatEncoded_ptr); + auto spat = spatEncoded_ptr->decode_j2735_message().get_j2735_data(); + EXPECT_EQ(284658L, *spat->timeStamp); + EXPECT_EQ(0, spat->intersections.list.array[0]->id.id); + EXPECT_EQ(284658L, *spat->intersections.list.array[0]->moy); + EXPECT_EQ(51138, *spat->intersections.list.array[0]->timeStamp); + // Signal Group 1 + EXPECT_EQ(1, spat->intersections.list.array[0]->states.list.array[0]->signalGroup); + EXPECT_EQ(3, spat->intersections.list.array[0]->states.list.array[0]->state_time_speed.list.array[0]->eventState); + EXPECT_EQ(11351, spat->intersections.list.array[0]->states.list.array[0]->state_time_speed.list.array[0]->timing->minEndTime); + EXPECT_EQ(36000, *spat->intersections.list.array[0]->states.list.array[0]->state_time_speed.list.array[0]->timing->maxEndTime); + // Signal Group 2 + EXPECT_EQ(2, spat->intersections.list.array[0]->states.list.array[1]->signalGroup); + EXPECT_EQ(5, spat->intersections.list.array[0]->states.list.array[1]->state_time_speed.list.array[0]->eventState); + EXPECT_EQ(11311, spat->intersections.list.array[0]->states.list.array[1]->state_time_speed.list.array[0]->timing->minEndTime); + EXPECT_EQ(36000, *spat->intersections.list.array[0]->states.list.array[1]->state_time_speed.list.array[0]->timing->maxEndTime); + // Signal Group 3 + EXPECT_EQ(3, spat->intersections.list.array[0]->states.list.array[2]->signalGroup); + EXPECT_EQ(3, spat->intersections.list.array[0]->states.list.array[2]->state_time_speed.list.array[0]->eventState); + EXPECT_EQ(11351, spat->intersections.list.array[0]->states.list.array[2]->state_time_speed.list.array[0]->timing->minEndTime); + EXPECT_EQ(36000, *spat->intersections.list.array[0]->states.list.array[2]->state_time_speed.list.array[0]->timing->maxEndTime); + // Signal Group 4 + EXPECT_EQ(4, spat->intersections.list.array[0]->states.list.array[3]->signalGroup); + EXPECT_EQ(3, spat->intersections.list.array[0]->states.list.array[3]->state_time_speed.list.array[0]->eventState); + EXPECT_EQ(11351, spat->intersections.list.array[0]->states.list.array[3]->state_time_speed.list.array[0]->timing->minEndTime); + EXPECT_EQ(36000, *spat->intersections.list.array[0]->states.list.array[3]->state_time_speed.list.array[0]->timing->maxEndTime); + // Signal Group 5 + EXPECT_EQ(5, spat->intersections.list.array[0]->states.list.array[4]->signalGroup); + EXPECT_EQ(3, spat->intersections.list.array[0]->states.list.array[4]->state_time_speed.list.array[0]->eventState); + EXPECT_EQ(11351, spat->intersections.list.array[0]->states.list.array[4]->state_time_speed.list.array[0]->timing->minEndTime); + EXPECT_EQ(36000, *spat->intersections.list.array[0]->states.list.array[4]->state_time_speed.list.array[0]->timing->maxEndTime); + // Signal Group 6 + EXPECT_EQ(6, spat->intersections.list.array[0]->states.list.array[5]->signalGroup); + EXPECT_EQ(5, spat->intersections.list.array[0]->states.list.array[5]->state_time_speed.list.array[0]->eventState); + EXPECT_EQ(11311, spat->intersections.list.array[0]->states.list.array[5]->state_time_speed.list.array[0]->timing->minEndTime); + EXPECT_EQ(36000, *spat->intersections.list.array[0]->states.list.array[5]->state_time_speed.list.array[0]->timing->maxEndTime); + // Signal Group 7 + EXPECT_EQ(7, spat->intersections.list.array[0]->states.list.array[6]->signalGroup); + EXPECT_EQ(3, spat->intersections.list.array[0]->states.list.array[6]->state_time_speed.list.array[0]->eventState); + EXPECT_EQ(11351, spat->intersections.list.array[0]->states.list.array[6]->state_time_speed.list.array[0]->timing->minEndTime); + EXPECT_EQ(36000, *spat->intersections.list.array[0]->states.list.array[6]->state_time_speed.list.array[0]->timing->maxEndTime); + // Signal Group 8 + EXPECT_EQ(8, spat->intersections.list.array[0]->states.list.array[7]->signalGroup); + EXPECT_EQ(3, spat->intersections.list.array[0]->states.list.array[7]->state_time_speed.list.array[0]->eventState); + EXPECT_EQ(11351, spat->intersections.list.array[0]->states.list.array[7]->state_time_speed.list.array[0]->timing->minEndTime); + EXPECT_EQ(36000, *spat->intersections.list.array[0]->states.list.array[7]->state_time_speed.list.array[0]->timing->maxEndTime); + // Signal Group 9 + EXPECT_EQ(9, spat->intersections.list.array[0]->states.list.array[8]->signalGroup); + EXPECT_EQ(3, spat->intersections.list.array[0]->states.list.array[8]->state_time_speed.list.array[0]->eventState); + EXPECT_EQ(11311, spat->intersections.list.array[0]->states.list.array[8]->state_time_speed.list.array[0]->timing->minEndTime); + EXPECT_EQ(36000, *spat->intersections.list.array[0]->states.list.array[8]->state_time_speed.list.array[0]->timing->maxEndTime); + // Signal Group 10 + EXPECT_EQ(10, spat->intersections.list.array[0]->states.list.array[9]->signalGroup); + EXPECT_EQ(3, spat->intersections.list.array[0]->states.list.array[9]->state_time_speed.list.array[0]->eventState); + EXPECT_EQ(11351, spat->intersections.list.array[0]->states.list.array[9]->state_time_speed.list.array[0]->timing->minEndTime); + EXPECT_EQ(36000, *spat->intersections.list.array[0]->states.list.array[9]->state_time_speed.list.array[0]->timing->maxEndTime); + // Signal Group 11 + EXPECT_EQ(11, spat->intersections.list.array[0]->states.list.array[10]->signalGroup); + EXPECT_EQ(3, spat->intersections.list.array[0]->states.list.array[10]->state_time_speed.list.array[0]->eventState); + EXPECT_EQ(11311, spat->intersections.list.array[0]->states.list.array[10]->state_time_speed.list.array[0]->timing->minEndTime); + EXPECT_EQ(36000, *spat->intersections.list.array[0]->states.list.array[10]->state_time_speed.list.array[0]->timing->maxEndTime); + // Signal Group 12 + EXPECT_EQ(12, spat->intersections.list.array[0]->states.list.array[11]->signalGroup); + EXPECT_EQ(3, spat->intersections.list.array[0]->states.list.array[11]->state_time_speed.list.array[0]->eventState); + EXPECT_EQ(11351, spat->intersections.list.array[0]->states.list.array[11]->state_time_speed.list.array[0]->timing->minEndTime); + EXPECT_EQ(36000, *spat->intersections.list.array[0]->states.list.array[11]->state_time_speed.list.array[0]->timing->maxEndTime); + } +} \ No newline at end of file