write testmain

This commit is contained in:
stubbfel
2017-05-27 01:33:17 +02:00
parent 008f67e1f1
commit d202fdc778
10 changed files with 270 additions and 24 deletions

3
.gitmodules vendored
View File

@@ -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

View File

@@ -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)

1
lib/jsoncpp Submodule

Submodule lib/jsoncpp added at d7347a2623

View File

@@ -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;
}

View File

@@ -11,6 +11,10 @@ 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;

View File

@@ -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 <tins/ip_address.h>
#include <tins/ipv6_address.h>
#include <thread>
#include <json/json.h>
#include <json/value.h>
#include <fstream>
int main()
int main(int argc, char** argv)
{
SPtrTinsNetworkInterfaceCard ipv4Netcard = std::make_shared<TinsNetworkInterfaceCard>("eth0");
SPtrTinsNetworkInterfaceCard ipv6Netcard = std::make_shared<TinsNetworkInterfaceCard>("eth1");
Tins::IPv6Address prefix("1::");
if (argc < 2){
return -1;
}
std::ifstream config_doc(argv[1], std::ifstream::binary);
Json::Value root;
config_doc >> root;
const Json::Value natpairs = root;
SPtrIPacketHandlerList routerList;
std::vector<std::thread *> 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<TinsNetworkInterfaceCard>(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<Ip4ToIp6PacketHandler>(prefix);
SPtrIPacketHandler ip6ToIp4Handler = std::make_shared<Ip6ToIp4PacketHandler>();
SPtrIPacketHandler icmp4ToIcmp6Handler = std::make_shared<Icmp4ToIcmp6PacketHandler>(prefix);
SPtrIPacketHandler icmp6ToIcmp4Handler = std::make_shared<Icmp6ToIcmp4PacketHandler>();
SPtrIPacketHandler arpToNdpHandler = std::make_shared<ArpToNdpPacketHandler>(prefix);
SPtrIRouter router = std::make_shared<IpVersionRouter>(ipv4Netcard, ipv6Netcard);
SPtrIPacketHandler nat4to6ForwardHandler = std::make_shared<ForwardPacketHandler>(ip4ToIp6Handler, router);
SPtrIPacketHandler nat6to4ForwardHandler = std::make_shared<ForwardPacketHandler>(ip6ToIp4Handler, router);
SPtrPduTypeForwardPacketHandler nat4to6ForwardHandler = std::make_shared<PduTypeForwardPacketHandler>(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<PduTypeForwardPacketHandler>(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(&TinsNetworkInterfaceCard::startListen, ipv4Netcard.get());
std::thread ipv6Thread(&TinsNetworkInterfaceCard::startListen, ipv6Netcard.get());
ipv4Thread.join();
ipv6Thread.join();
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<IpVersionRouter *>(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();
}

View File

@@ -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)

111
test/src/TestMain.cpp Normal file
View File

@@ -0,0 +1,111 @@
#include "Main_t.h"
#include <fakeit.hpp>
#include <chrono>
#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 <tins/ip_address.h>
#include <tins/ipv6_address.h>
#include <thread>
#include <json/json.h>
#include <json/value.h>
#include <fstream>
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<std::thread *> 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<TinsNetworkInterfaceCard>(netcardName);
switch (itemtype)
{
case 4:
ipv4Netcard = netcard;
break;
case 6:
ipv6Netcard = netcard;
prefix = natPairItem["prefix"].asString();
break;
default:
return;
}
}
SPtrIPacketHandler ip4ToIp6Handler = std::make_shared<Ip4ToIp6PacketHandler>(prefix);
SPtrIPacketHandler ip6ToIp4Handler = std::make_shared<Ip6ToIp4PacketHandler>();
SPtrIPacketHandler icmp4ToIcmp6Handler = std::make_shared<Icmp4ToIcmp6PacketHandler>(prefix);
SPtrIPacketHandler icmp6ToIcmp4Handler = std::make_shared<Icmp6ToIcmp4PacketHandler>();
SPtrIPacketHandler arpToNdpHandler = std::make_shared<ArpToNdpPacketHandler>(prefix);
SPtrIRouter router = std::make_shared<IpVersionRouter>(ipv4Netcard, ipv6Netcard);
SPtrPduTypeForwardPacketHandler nat4to6ForwardHandler = std::make_shared<PduTypeForwardPacketHandler>(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<PduTypeForwardPacketHandler>(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<IpVersionRouter *>(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();
}

View File

@@ -37,8 +37,8 @@ namespace TestTinsNetworkInterfaceCard
TEST_CASE( "test send and receive Packet", "[TinsNetworkInterfaceCard_SendRec]" )
{
SPtrTinsNetworkInterfaceCard ptrPacketSender = std::make_shared<TinsNetworkInterfaceCard>();
SPtrTinsNetworkInterfaceCard ptrPacketSniffer = std::make_shared<TinsNetworkInterfaceCard>();
SPtrTinsNetworkInterfaceCard ptrPacketSender = std::make_shared<TinsNetworkInterfaceCard>(Tins::IPv4Address("127.0.0.1"));
SPtrTinsNetworkInterfaceCard ptrPacketSniffer = std::make_shared<TinsNetworkInterfaceCard>(Tins::IPv4Address("127.0.0.1"));
SPtrIPacketHandler sptrMockHandler = std::make_shared<TestTinsNetworkInterfaceCard::MockPacketHandler>();
Mock<IPacketHandler> mockHandler(*sptrMockHandler);
TestTinsNetworkInterfaceCard::foundPduCount = 0;

32
test/src/test_config.json Normal file
View File

@@ -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::"
}
]
}
]