write testmain
This commit is contained in:
3
.gitmodules
vendored
3
.gitmodules
vendored
@@ -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
|
||||
|
||||
@@ -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
1
lib/jsoncpp
Submodule
Submodule lib/jsoncpp added at d7347a2623
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
107
src/Main.cpp
107
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 <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::");
|
||||
SPtrIPacketHandler ip4ToIp6Handler = std::make_shared<Ip4ToIp6PacketHandler>(prefix);
|
||||
SPtrIPacketHandler ip6ToIp4Handler = std::make_shared<Ip6ToIp4PacketHandler>();
|
||||
SPtrIRouter router = std::make_shared<IpVersionRouter>(ipv4Netcard, ipv6Netcard);
|
||||
SPtrIPacketHandler nat4to6ForwardHandler = std::make_shared<ForwardPacketHandler>(ip4ToIp6Handler, router);
|
||||
SPtrIPacketHandler nat6to4ForwardHandler = std::make_shared<ForwardPacketHandler>(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<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);
|
||||
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();
|
||||
}
|
||||
|
||||
@@ -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
111
test/src/TestMain.cpp
Normal 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();
|
||||
}
|
||||
@@ -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
32
test/src/test_config.json
Normal 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::"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
Reference in New Issue
Block a user