84 lines
3.2 KiB
C++
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);
|
|
}
|