From d202fdc7787ed60e5f31887dfbf7077985bab945 Mon Sep 17 00:00:00 2001 From: stubbfel Date: Sat, 27 May 2017 01:33:17 +0200 Subject: [PATCH] write testmain --- .gitmodules | 3 + CMakeLists.txt | 13 +++- lib/jsoncpp | 1 + src/IpVersionRouter.cpp | 10 +++ src/IpVersionRouter.h | 8 ++- src/Main.cpp | 107 ++++++++++++++++++++++++----- test/CMakeLists.txt | 5 +- test/src/TestMain.cpp | 111 +++++++++++++++++++++++++++++++ test/src/TestTinsNetworkCard.cpp | 4 +- test/src/test_config.json | 32 +++++++++ 10 files changed, 270 insertions(+), 24 deletions(-) create mode 160000 lib/jsoncpp create mode 100644 test/src/TestMain.cpp create mode 100644 test/src/test_config.json diff --git a/.gitmodules b/.gitmodules index fd743ab..8d0a465 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "lib/libtins"] path = lib/libtins url = git@github.com:stubbfel/libtins.git +[submodule "lib/jsoncpp"] + path = lib/jsoncpp + url = https://github.com/open-source-parsers/jsoncpp.git diff --git a/CMakeLists.txt b/CMakeLists.txt index d9d5212..74879cd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,6 +8,15 @@ endif () project (1261nat) set(CMAKE_BUILD_TYPE Debug) SET(BUILD_SHARED_LIBS ON) + +SET(JSONCPP_WITH_TESTS OFF CACHE BOOL "test8") +SET(JSONCPP_WITH_POST_BUILD_UNITTEST OFF CACHE BOOL "tes9") +SET(JSONCPP_WITH_PKGCONFIG_SUPPORT OFF CACHE BOOL "test10") +SET(JSONCPP_WITH_CMAKE_PACKAGE OFF CACHE BOOL "test11") +SET(BUILD_SHARED_LIBS OFF CACHE BOOL "test12") +SET(BUILD_STATIC_LIBS ON CACHE BOOL "test13") +ADD_SUBDIRECTORY(lib/jsoncpp) + SET(LIBTINS_BUILD_SHARED OFF CACHE BOOL "test") SET(LIBTINS_ENABLE_CXX11 ON CACHE BOOL "test2") SET(LIBTINS_ENABLE_WPA2 OFF CACHE BOOL "test3") @@ -20,9 +29,9 @@ SET(PCAP_ROOT_DIR /usr/ CACHE PATH "test14") SET(PCAP_LIBRARY /usr/lib64/libpcap.so CACHE FILEPATH "test14") ADD_SUBDIRECTORY(lib/libtins) -INCLUDE_DIRECTORIES(lib/libtins/include) +INCLUDE_DIRECTORIES(lib/libtins/include lib/jsoncpp/include) file(GLOB_RECURSE 1261nat_src_files "src/*.h" "src/*.cpp") add_executable(1261nat ${1261nat_src_files} ) -target_link_libraries (1261nat pthread tins) +target_link_libraries (1261nat pthread tins jsoncpp_lib_static) ADD_SUBDIRECTORY(test) diff --git a/lib/jsoncpp b/lib/jsoncpp new file mode 160000 index 0000000..d7347a2 --- /dev/null +++ b/lib/jsoncpp @@ -0,0 +1 @@ +Subproject commit d7347a2623707d71f8b21b18a46a1281ab79d45c diff --git a/src/IpVersionRouter.cpp b/src/IpVersionRouter.cpp index d4adb29..d4fa038 100644 --- a/src/IpVersionRouter.cpp +++ b/src/IpVersionRouter.cpp @@ -36,3 +36,13 @@ bool IpVersionRouter::handle(IN const Tins::PDU & pdu, IN IPacketHandler * /* ca ipv4Card->sendPacket(pdu); return true; } + +INetworkInterfaceCard & IpVersionRouter::getIpv4Card() const +{ + return *ipv4Card; +} + +INetworkInterfaceCard & IpVersionRouter::getIpv6Card() const +{ + return *ipv6Card; +} diff --git a/src/IpVersionRouter.h b/src/IpVersionRouter.h index 71eee11..d3ed00a 100644 --- a/src/IpVersionRouter.h +++ b/src/IpVersionRouter.h @@ -11,10 +11,14 @@ public: virtual ~IpVersionRouter(); virtual bool handle(IN const Tins::PDU & pdu, IN IPacketHandler * callBackHandler = nullptr) override; + INetworkInterfaceCard & getIpv6Card() const; + + INetworkInterfaceCard & getIpv4Card() const; + private: - SPtrINetworkInterfaceCard ipv6Card; - SPtrINetworkInterfaceCard ipv4Card; + SPtrINetworkInterfaceCard ipv6Card; + SPtrINetworkInterfaceCard ipv4Card; }; #endif // ABSTRACTROUTER_H diff --git a/src/Main.cpp b/src/Main.cpp index 79ac236..7c7419c 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -1,27 +1,102 @@ #include "Main_t.h" -#include "ForwardPacketHandler.h" +#include "pdutypeforwardpackethandler.h" +#include "ArpToNdpPacketHandler.h" +#include "Icmp4ToIcmp6PacketHandler.h" +#include "Icmp6ToIcmp4PacketHandler.h" #include "Ip4ToIp6PacketHandler.h" #include "Ip6ToIp4PacketHandler.h" #include "IpVersionRouter.h" #include "TinsNetworkInterfaceCard.h" +#include #include #include +#include +#include +#include -int main() +int main(int argc, char** argv) { - SPtrTinsNetworkInterfaceCard ipv4Netcard = std::make_shared("eth0"); - SPtrTinsNetworkInterfaceCard ipv6Netcard = std::make_shared("eth1"); - Tins::IPv6Address prefix("1::"); - SPtrIPacketHandler ip4ToIp6Handler = std::make_shared(prefix); - SPtrIPacketHandler ip6ToIp4Handler = std::make_shared(); - SPtrIRouter router = std::make_shared(ipv4Netcard, ipv6Netcard); - SPtrIPacketHandler nat4to6ForwardHandler = std::make_shared(ip4ToIp6Handler, router); - SPtrIPacketHandler nat6to4ForwardHandler = std::make_shared(ip6ToIp4Handler, router); - ipv4Netcard->getHandlerList().push_back(nat4to6ForwardHandler); - ipv6Netcard->getHandlerList().push_back(nat6to4ForwardHandler); + if (argc < 2){ + return -1; + } - std::thread ipv4Thread(&TinsNetworkInterfaceCard::startListen, ipv4Netcard.get()); - std::thread ipv6Thread(&TinsNetworkInterfaceCard::startListen, ipv6Netcard.get()); - ipv4Thread.join(); - ipv6Thread.join(); + std::ifstream config_doc(argv[1], std::ifstream::binary); + Json::Value root; + config_doc >> root; + const Json::Value natpairs = root; + + SPtrIPacketHandlerList routerList; + std::vector threadPool; + for (Json::Value natpair : natpairs) + { + const std::string pairname = natpair["name"].asString(); + const Json::Value natPairItems = natpair["items"]; + SPtrTinsNetworkInterfaceCard ipv4Netcard; + SPtrTinsNetworkInterfaceCard ipv6Netcard; + Tins::IPv6Address prefix; + for (Json::Value natPairItem : natPairItems) + { + const int itemtype = natPairItem["type"].asInt(); + const std::string netcardName = natPairItem["nic-name"].asString(); + SPtrTinsNetworkInterfaceCard netcard = std::make_shared(netcardName); + switch (itemtype) + { + case 4: + ipv4Netcard = netcard; + break; + case 6: + ipv6Netcard = netcard; + prefix = natPairItem["prefix"].asString(); + break; + default: + return -1; + } + } + + SPtrIPacketHandler ip4ToIp6Handler = std::make_shared(prefix); + SPtrIPacketHandler ip6ToIp4Handler = std::make_shared(); + SPtrIPacketHandler icmp4ToIcmp6Handler = std::make_shared(prefix); + SPtrIPacketHandler icmp6ToIcmp4Handler = std::make_shared(); + SPtrIPacketHandler arpToNdpHandler = std::make_shared(prefix); + + SPtrIRouter router = std::make_shared(ipv4Netcard, ipv6Netcard); + SPtrPduTypeForwardPacketHandler nat4to6ForwardHandler = std::make_shared(router); + nat4to6ForwardHandler->getHandlerQueue().push_back(PduTypeHandlerMapEntry(Tins::PDU::ARP, arpToNdpHandler)); + nat4to6ForwardHandler->getHandlerQueue().push_back(PduTypeHandlerMapEntry(Tins::PDU::ICMP, icmp4ToIcmp6Handler)); + nat4to6ForwardHandler->getHandlerQueue().push_back(PduTypeHandlerMapEntry(Tins::PDU::IP, ip4ToIp6Handler)); + + SPtrPduTypeForwardPacketHandler nat6to4ForwardHandler = std::make_shared(router); + nat6to4ForwardHandler->getHandlerQueue().push_back(PduTypeHandlerMapEntry(Tins::PDU::ICMPv6, icmp6ToIcmp4Handler)); + nat6to4ForwardHandler->getHandlerQueue().push_back(PduTypeHandlerMapEntry(Tins::PDU::IPv6, ip6ToIp4Handler)); + ipv4Netcard->getHandlerList().push_back(nat4to6ForwardHandler); + ipv6Netcard->getHandlerList().push_back(nat6to4ForwardHandler); + + std::thread * ipv4Thread = new std::thread(&TinsNetworkInterfaceCard::startListen, ipv4Netcard.get()); + std::thread * ipv6Thread = new std::thread(&TinsNetworkInterfaceCard::startListen, ipv6Netcard.get()); + routerList.push_back(router); + threadPool.push_back(ipv4Thread); + threadPool.push_back(ipv6Thread); + } + + std::this_thread::sleep_for(std::chrono::seconds(2)); + for (SPtrIPacketHandler routerHandle : routerList) + { + IpVersionRouter * versionRouter = dynamic_cast(routerHandle.get()); + if (versionRouter == nullptr) + { + continue; + } + + //versionRouter->getIpv4Card().stopListen(); + //versionRouter->getIpv6Card().stopListen(); + } + + for (std::thread * ptrThread : threadPool) + { + ptrThread->join(); + delete ptrThread; + } + + routerList.clear(); + threadPool.clear(); } diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 9026cd5..10ee3cb 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -12,10 +12,11 @@ endif(COMMAND cmake_policy) project(test_1261nat) set(CMAKE_BUILD_TYPE Debug) -INCLUDE_DIRECTORIES(../lib/libtins/include) +INCLUDE_DIRECTORIES(../lib/libtins/include ../lib/jsoncpp/include) include_directories("lib/FakeIt/") include_directories("../src") +file(COPY src/test_config.json DESTINATION ${CMAKE_BINARY_DIR}/test ) file(GLOB_RECURSE test_1261nat_src_files "../src/*.h" "../src/*.cpp" "src/*.cpp" "lib/FakeIt/single_header/catch/fakeit.hpp") list(REMOVE_ITEM test_1261nat_src_files ${CMAKE_CURRENT_SOURCE_DIR}/../src/Main.cpp) add_executable(test_1261nat ${test_1261nat_src_files} ) -target_link_libraries (test_1261nat pthread tins) +target_link_libraries (test_1261nat pthread tins jsoncpp_lib_static) diff --git a/test/src/TestMain.cpp b/test/src/TestMain.cpp new file mode 100644 index 0000000..af8daa1 --- /dev/null +++ b/test/src/TestMain.cpp @@ -0,0 +1,111 @@ +#include "Main_t.h" +#include +#include +#include "pdutypeforwardpackethandler.h" +#include "ArpToNdpPacketHandler.h" +#include "Icmp4ToIcmp6PacketHandler.h" +#include "Icmp6ToIcmp4PacketHandler.h" +#include "Ip4ToIp6PacketHandler.h" +#include "Ip6ToIp4PacketHandler.h" +#include "IpVersionRouter.h" +#include "TinsNetworkInterfaceCard.h" +#include +#include +#include +#include +#include +#include + +TEST_CASE( "test main setup", "[test_main]" ) +{ + + std::ifstream config_doc("test_config.json", std::ifstream::binary); + Json::Value root; + config_doc >> root; + const Json::Value natpairs = root; + + SPtrIPacketHandlerList routerList; + std::vector threadPool; + for (Json::Value natpair : natpairs) + { + const std::string pairname = natpair["name"].asString(); + REQUIRE(pairname == "foo"); + const Json::Value natPairItems = natpair["items"]; + SPtrTinsNetworkInterfaceCard ipv4Netcard; + SPtrTinsNetworkInterfaceCard ipv6Netcard; + Tins::IPv6Address prefix; + for (Json::Value natPairItem : natPairItems) + { + const std::string itemname = natPairItem["nic-name"].asString(); + REQUIRE(itemname == "lo"); + const int itemtype = natPairItem["type"].asInt(); + bool result = itemtype == 4 || itemtype == 6; + REQUIRE(result); + if (itemtype == 6) + { + REQUIRE(natPairItem["prefix"].asString() == "42::"); + } + + const std::string netcardName = natPairItem["nic-name"].asString(); + SPtrTinsNetworkInterfaceCard netcard = std::make_shared(netcardName); + switch (itemtype) + { + case 4: + ipv4Netcard = netcard; + break; + case 6: + ipv6Netcard = netcard; + prefix = natPairItem["prefix"].asString(); + break; + default: + return; + } + } + + SPtrIPacketHandler ip4ToIp6Handler = std::make_shared(prefix); + SPtrIPacketHandler ip6ToIp4Handler = std::make_shared(); + SPtrIPacketHandler icmp4ToIcmp6Handler = std::make_shared(prefix); + SPtrIPacketHandler icmp6ToIcmp4Handler = std::make_shared(); + SPtrIPacketHandler arpToNdpHandler = std::make_shared(prefix); + + SPtrIRouter router = std::make_shared(ipv4Netcard, ipv6Netcard); + SPtrPduTypeForwardPacketHandler nat4to6ForwardHandler = std::make_shared(router); + nat4to6ForwardHandler->getHandlerQueue().push_back(PduTypeHandlerMapEntry(Tins::PDU::ARP, arpToNdpHandler)); + nat4to6ForwardHandler->getHandlerQueue().push_back(PduTypeHandlerMapEntry(Tins::PDU::ICMP, icmp4ToIcmp6Handler)); + nat4to6ForwardHandler->getHandlerQueue().push_back(PduTypeHandlerMapEntry(Tins::PDU::IP, ip4ToIp6Handler)); + + SPtrPduTypeForwardPacketHandler nat6to4ForwardHandler = std::make_shared(router); + nat6to4ForwardHandler->getHandlerQueue().push_back(PduTypeHandlerMapEntry(Tins::PDU::ICMPv6, icmp6ToIcmp4Handler)); + nat6to4ForwardHandler->getHandlerQueue().push_back(PduTypeHandlerMapEntry(Tins::PDU::IPv6, ip6ToIp4Handler)); + ipv4Netcard->getHandlerList().push_back(nat4to6ForwardHandler); + ipv6Netcard->getHandlerList().push_back(nat6to4ForwardHandler); + + std::thread * ipv4Thread = new std::thread(&TinsNetworkInterfaceCard::startListen, ipv4Netcard.get()); + std::thread * ipv6Thread = new std::thread(&TinsNetworkInterfaceCard::startListen, ipv6Netcard.get()); + routerList.push_back(router); + threadPool.push_back(ipv4Thread); + threadPool.push_back(ipv6Thread); + } + + std::this_thread::sleep_for(std::chrono::seconds(2)); + for (SPtrIPacketHandler routerHandle : routerList) + { + IpVersionRouter * versionRouter = dynamic_cast(routerHandle.get()); + if (versionRouter == nullptr) + { + continue; + } + + versionRouter->getIpv4Card().stopListen(); + versionRouter->getIpv6Card().stopListen(); + } + + for (std::thread * ptrThread : threadPool) + { + ptrThread->join(); + delete ptrThread; + } + + routerList.clear(); + threadPool.clear(); +} diff --git a/test/src/TestTinsNetworkCard.cpp b/test/src/TestTinsNetworkCard.cpp index 1b8d905..13fafbe 100644 --- a/test/src/TestTinsNetworkCard.cpp +++ b/test/src/TestTinsNetworkCard.cpp @@ -37,8 +37,8 @@ namespace TestTinsNetworkInterfaceCard TEST_CASE( "test send and receive Packet", "[TinsNetworkInterfaceCard_SendRec]" ) { - SPtrTinsNetworkInterfaceCard ptrPacketSender = std::make_shared(); - SPtrTinsNetworkInterfaceCard ptrPacketSniffer = std::make_shared(); + SPtrTinsNetworkInterfaceCard ptrPacketSender = std::make_shared(Tins::IPv4Address("127.0.0.1")); + SPtrTinsNetworkInterfaceCard ptrPacketSniffer = std::make_shared(Tins::IPv4Address("127.0.0.1")); SPtrIPacketHandler sptrMockHandler = std::make_shared(); Mock mockHandler(*sptrMockHandler); TestTinsNetworkInterfaceCard::foundPduCount = 0; diff --git a/test/src/test_config.json b/test/src/test_config.json new file mode 100644 index 0000000..2a87f56 --- /dev/null +++ b/test/src/test_config.json @@ -0,0 +1,32 @@ +[ + { + "name" : "foo", + "items": + [ + { + "nic-name": "lo", + "type": 4 + }, + { + "nic-name": "lo", + "type": 6, + "prefix": "42::" + } + ] + }, + { + "name" : "foo", + "items": + [ + { + "nic-name": "lo", + "type": 4 + }, + { + "nic-name": "lo", + "type": 6, + "prefix": "42::" + } + ] + } +]