From eb8c6073e5b913574e9311a4bcfe162b19c352a4 Mon Sep 17 00:00:00 2001 From: Shannon Weyrick Date: Sun, 21 Mar 2021 09:53:19 -0400 Subject: [PATCH 1/3] add google benchmark, first dns benchmarks --- conanfile.txt | 1 + src/handlers/dns/CMakeLists.txt | 14 +---------- src/handlers/dns/tests/CMakeLists.txt | 23 ++++++++++++++++++ src/handlers/dns/tests/benchmark_dns.cpp | 31 ++++++++++++++++++++++++ src/handlers/dns/tests/test_dns.cpp | 2 -- 5 files changed, 56 insertions(+), 15 deletions(-) create mode 100644 src/handlers/dns/tests/CMakeLists.txt create mode 100644 src/handlers/dns/tests/benchmark_dns.cpp diff --git a/conanfile.txt b/conanfile.txt index 96a82ccd0..d82a00be1 100644 --- a/conanfile.txt +++ b/conanfile.txt @@ -7,6 +7,7 @@ nlohmann_json/3.9.1 cpp-httplib/0.8.0 corrade/2020.06 pcapplusplus/20.08@bincrafters/stable +benchmark/1.5.2 [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..7bac3dc4c --- /dev/null +++ b/src/handlers/dns/tests/benchmark_dns.cpp @@ -0,0 +1,31 @@ +/* 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 + +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); + +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" From e5d443571580c86bcd675bf4bd173073d3d3faa7 Mon Sep 17 00:00:00 2001 From: Shannon Weyrick Date: Sun, 21 Mar 2021 20:17:34 -0400 Subject: [PATCH 2/3] pcap read and parse benchmarks --- src/handlers/dns/tests/benchmark_dns.cpp | 50 ++++++++++++++++++++++++ src/inputs/pcap/PcapInputStream.cpp | 3 +- 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/src/handlers/dns/tests/benchmark_dns.cpp b/src/handlers/dns/tests/benchmark_dns.cpp index 7bac3dc4c..c347a6dbd 100644 --- a/src/handlers/dns/tests/benchmark_dns.cpp +++ b/src/handlers/dns/tests/benchmark_dns.cpp @@ -4,6 +4,15 @@ #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; @@ -28,4 +37,45 @@ static void BM_aggregateDomainLong(benchmark::State &state) 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/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 != "") { From 041360b20e2a7f19cdeb9f356248d651762a77a8 Mon Sep 17 00:00:00 2001 From: Shannon Weyrick Date: Mon, 22 Mar 2021 09:30:20 -0400 Subject: [PATCH 3/3] use build_requires section --- conanfile.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/conanfile.txt b/conanfile.txt index d82a00be1..288f481af 100644 --- a/conanfile.txt +++ b/conanfile.txt @@ -1,13 +1,15 @@ [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