diff --git a/conanfile.txt b/conanfile.txt index 96a82ccd0..288f481af 100644 --- a/conanfile.txt +++ b/conanfile.txt @@ -1,13 +1,16 @@ [requires] spdlog/1.8.2 sigslot/1.2.0 -catch2/2.13.4 docopt.cpp/0.6.3 nlohmann_json/3.9.1 cpp-httplib/0.8.0 corrade/2020.06 pcapplusplus/20.08@bincrafters/stable +[build_requires] +benchmark/1.5.2 +catch2/2.13.4 + [options] corrade:with_pluginmanager=True diff --git a/src/handlers/dns/CMakeLists.txt b/src/handlers/dns/CMakeLists.txt index 826ed8bc8..867d0b4d6 100644 --- a/src/handlers/dns/CMakeLists.txt +++ b/src/handlers/dns/CMakeLists.txt @@ -28,16 +28,4 @@ target_link_libraries(VisorHandlerDns set(VISOR_STATIC_PLUGINS ${VISOR_STATIC_PLUGINS} Visor::Handler::Dns PARENT_SCOPE) -## TEST SUITE -add_executable(unit-tests-handler-dns - tests/main.cpp - tests/test_dns.cpp - tests/test_dns_layer.cpp - ) - -target_link_libraries(unit-tests-handler-dns PRIVATE Visor::Handler::Dns) - -add_test(NAME unit-tests-handler-dns - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/src/tests - COMMAND unit-tests-handler-dns - ) \ No newline at end of file +add_subdirectory(tests) \ No newline at end of file diff --git a/src/handlers/dns/tests/CMakeLists.txt b/src/handlers/dns/tests/CMakeLists.txt new file mode 100644 index 000000000..5f83bcfbb --- /dev/null +++ b/src/handlers/dns/tests/CMakeLists.txt @@ -0,0 +1,23 @@ + +# Unit +add_executable(unit-tests-handler-dns + main.cpp + test_dns.cpp + test_dns_layer.cpp + ) + +target_link_libraries(unit-tests-handler-dns PRIVATE Visor::Handler::Dns) + +add_test(NAME unit-tests-handler-dns + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/src/tests + COMMAND unit-tests-handler-dns + ) + +# Benchmark +add_executable(benchmark-handler-dns + benchmark_dns.cpp + ) + +target_link_libraries(benchmark-handler-dns PRIVATE + Visor::Handler::Dns + ${CONAN_LIBS_BENCHMARK}) diff --git a/src/handlers/dns/tests/benchmark_dns.cpp b/src/handlers/dns/tests/benchmark_dns.cpp new file mode 100644 index 000000000..c347a6dbd --- /dev/null +++ b/src/handlers/dns/tests/benchmark_dns.cpp @@ -0,0 +1,81 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +#include "../dns.h" +#include +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wold-style-cast" +#pragma GCC diagnostic ignored "-Wunused-parameter" +#pragma clang diagnostic ignored "-Wc99-extensions" +#pragma GCC diagnostic ignored "-Wpedantic" +#include +#include +#include +#pragma GCC diagnostic pop + +using namespace visor::handler::dns; + +static void BM_aggregateDomain(benchmark::State &state) +{ + AggDomainResult result; + std::string domain{"biz.foo.bar.com"}; + for (auto _ : state) { + result = aggregateDomain(domain); + } +} +BENCHMARK(BM_aggregateDomain); + +static void BM_aggregateDomainLong(benchmark::State &state) +{ + AggDomainResult result; + std::string domain{"long1.long2.long3.long4.long5.long6.long7.long8.biz.foo.bar.com"}; + for (auto _ : state) { + result = aggregateDomain(domain); + } +} + +BENCHMARK(BM_aggregateDomainLong); + +static void BM_pcapReadNoParse(benchmark::State &state) +{ + + for (auto _ : state) { + auto reader = pcpp::IFileReaderDevice::getReader("fixtures/dns_udp_tcp_random.pcap"); + + if (!reader->open()) { + throw std::runtime_error("Cannot open pcap/pcapng file"); + } + + pcpp::RawPacket rawPacket; + while (reader->getNextPacket(rawPacket)) { + } + + reader->close(); + delete reader; + } +} +BENCHMARK(BM_pcapReadNoParse); + +static void BM_pcapReadParse1(benchmark::State &state) +{ + + for (auto _ : state) { + auto reader = pcpp::IFileReaderDevice::getReader("fixtures/dns_udp_tcp_random.pcap"); + + if (!reader->open()) { + throw std::runtime_error("Cannot open pcap/pcapng file"); + } + + pcpp::RawPacket rawPacket; + while (reader->getNextPacket(rawPacket)) { + pcpp::Packet packet(&rawPacket, pcpp::OsiModelTransportLayer); + } + + reader->close(); + delete reader; + } +} +BENCHMARK(BM_pcapReadParse1); + +BENCHMARK_MAIN(); \ No newline at end of file diff --git a/src/handlers/dns/tests/test_dns.cpp b/src/handlers/dns/tests/test_dns.cpp index 0bece9393..a41e7df16 100644 --- a/src/handlers/dns/tests/test_dns.cpp +++ b/src/handlers/dns/tests/test_dns.cpp @@ -1,6 +1,4 @@ -#include #include -#include #include "dns.h" diff --git a/src/inputs/pcap/PcapInputStream.cpp b/src/inputs/pcap/PcapInputStream.cpp index 00f739bf2..292ca95ca 100644 --- a/src/inputs/pcap/PcapInputStream.cpp +++ b/src/inputs/pcap/PcapInputStream.cpp @@ -254,8 +254,9 @@ void PcapInputStream::_open_pcap(const std::string &fileName, const std::string auto reader = pcpp::IFileReaderDevice::getReader(fileName.c_str()); // try to open the file device - if (!reader->open()) + if (!reader->open()) { throw PcapException("Cannot open pcap/pcapng file"); + } // set BPF filter if set by the user if (bpfFilter != "") {