#include "fakeit.hpp" #include #include #include "tins/ethernetII.h" #include #include #include #include #include #include #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(); const Tins::IP * ip2 = currentInputPdu->find_pdu(); 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(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; 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); }