Files
1261Nat/test/src/TestTinsNetworkCard.cpp
2017-05-27 01:33:17 +02:00

84 lines
3.2 KiB
C++

#include "fakeit.hpp"
#include <chrono>
#include <thread>
#include "tins/ethernetII.h"
#include <tins/ip.h>
#include <tins/ipv6.h>
#include <tins/ip_address.h>
#include <tins/ipv6_address.h>
#include <tins/tcp.h>
#include <tins/sniffer.h>
#include "TinsNetworkInterfaceCard.h"
using namespace fakeit;
namespace TestTinsNetworkInterfaceCard
{
Tins::PDU * currentInputPdu = nullptr;
int foundPduCount;
struct MockPacketHandler : IPacketHandler
{
virtual bool handle(IN const Tins::PDU & pdu, IN IPacketHandler * callBackHandler = nullptr) override
{
const Tins::IP * ip1 = pdu.find_pdu<Tins::IP>();
const Tins::IP * ip2 = currentInputPdu->find_pdu<Tins::IP>();
if(ip1 != nullptr && (ip1->dst_addr() == ip2->dst_addr()))
{
foundPduCount++;
}
return true;
}
};
}
TEST_CASE( "test send and receive Packet", "[TinsNetworkInterfaceCard_SendRec]" )
{
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;
ptrPacketSniffer->getHandlerList().push_back(sptrMockHandler);
Tins::EthernetII pkt = Tins::EthernetII("11:22:33:44:55:66", "66:55:44:33:22:11") / Tins::IP("1.2.3.4", "4.3.2.1") / Tins::TCP();
TestTinsNetworkInterfaceCard::currentInputPdu = &pkt;
std::thread sniffThread(&TinsNetworkInterfaceCard::startListen, ptrPacketSniffer.get());
std::this_thread::sleep_for(std::chrono::seconds(2));
ptrPacketSender->sendPacket(pkt);
ptrPacketSender->sendPacket(pkt);
ptrPacketSender->sendPacket(pkt);
std::this_thread::sleep_for(std::chrono::seconds(2));
ptrPacketSniffer->stopListen();
ptrPacketSender->sendPacket(pkt);
ptrPacketSender->sendPacket(pkt);
ptrPacketSender->sendPacket(pkt);
sniffThread.join();
REQUIRE(TestTinsNetworkInterfaceCard::foundPduCount == 3);
std::thread sniffThread2(&TinsNetworkInterfaceCard::startListen, ptrPacketSniffer.get());
std::this_thread::sleep_for(std::chrono::seconds(2));
ptrPacketSniffer->sendPacket(pkt);
ptrPacketSniffer->sendPacket(pkt);
ptrPacketSniffer->sendPacket(pkt);
std::this_thread::sleep_for(std::chrono::seconds(2));
ptrPacketSniffer->stopListen();
ptrPacketSniffer->sendPacket(pkt);
ptrPacketSniffer->sendPacket(pkt);
ptrPacketSniffer->sendPacket(pkt);
sniffThread2.join();
REQUIRE(TestTinsNetworkInterfaceCard::foundPduCount == 3);
std::thread sniffThread3(&TinsNetworkInterfaceCard::startListen, ptrPacketSniffer.get());
std::this_thread::sleep_for(std::chrono::seconds(2));
ptrPacketSniffer->sendPacket(pkt);
ptrPacketSender->sendPacket(pkt);
ptrPacketSniffer->sendPacket(pkt);
std::this_thread::sleep_for(std::chrono::seconds(2));
ptrPacketSniffer->stopListen();
sniffThread3.join();
REQUIRE(TestTinsNetworkInterfaceCard::foundPduCount == 4);
}