Add initial scaffold for unit testing via doctest

This commit is contained in:
Dominik Charousset 2019-10-29 14:52:09 +01:00
parent 75588956fc
commit f6407a4e0f
6 changed files with 126 additions and 10 deletions

View file

@ -19,6 +19,13 @@ include(cmake/FindClangTidy.cmake)
######################################################################## ########################################################################
## Project/Build Configuration ## Project/Build Configuration
if (ENABLE_ZEEK_UNIT_TESTS)
enable_testing()
else ()
add_definitions(-DDOCTEST_CONFIG_DISABLE)
endif ()
if ( ENABLE_CCACHE ) if ( ENABLE_CCACHE )
find_program(CCACHE_PROGRAM ccache) find_program(CCACHE_PROGRAM ccache)

4
configure vendored
View file

@ -47,6 +47,7 @@ Usage: $0 [OPTION]... [VAR=VALUE]...
--enable-jemalloc link against jemalloc --enable-jemalloc link against jemalloc
--enable-static-broker build Broker statically (ignored if --with-broker is specified) --enable-static-broker build Broker statically (ignored if --with-broker is specified)
--enable-static-binpac build binpac statically (ignored if --with-binpac is specified) --enable-static-binpac build binpac statically (ignored if --with-binpac is specified)
--enable-cpp-tests build Zeek's C++ unit tests
--disable-zeekctl don't install ZeekControl --disable-zeekctl don't install ZeekControl
--disable-auxtools don't build or install auxiliary tools --disable-auxtools don't build or install auxiliary tools
--disable-python don't try to build python bindings for Broker --disable-python don't try to build python bindings for Broker
@ -245,6 +246,9 @@ while [ $# -ne 0 ]; do
--enable-static-binpac) --enable-static-binpac)
append_cache_entry BUILD_STATIC_BINPAC BOOL true append_cache_entry BUILD_STATIC_BINPAC BOOL true
;; ;;
--enable-cpp-tests)
append_cache_entry ENABLE_ZEEK_UNIT_TESTS BOOL true
;;
--disable-zeekctl) --disable-zeekctl)
append_cache_entry INSTALL_ZEEKCTL BOOL false append_cache_entry INSTALL_ZEEKCTL BOOL false
;; ;;

@ -1 +1 @@
Subproject commit ceaa6346378cbeda8ce4e2be95f75b60865d113e Subproject commit 6411b6cc3df2c647aff9af887e0ee52e55915885

View file

@ -433,3 +433,25 @@ add_clang_tidy_files(${MAIN_SRCS})
# (*.pac.cc) files, and most of the generated code for BIFs (not including # (*.pac.cc) files, and most of the generated code for BIFs (not including
# *.bif.register.cc) # *.bif.register.cc)
create_clang_tidy_target() create_clang_tidy_target()
########################################################################
## CTest setup.
# Scan all .cc files for TEST_CASE macros and generate CTest targets.
if (ENABLE_ZEEK_UNIT_TESTS)
file(GLOB_RECURSE all_cc_files "*.cc")
set(test_cases "")
foreach (cc_file ${all_cc_files})
file (STRINGS ${cc_file} test_case_lines REGEX "TEST_CASE")
foreach (line ${test_case_lines})
string(REGEX REPLACE "TEST_CASE\\(\"(.+)\"\\)" "\\1" test_case "${line}")
list(APPEND test_cases "${test_case}")
endforeach ()
endforeach ()
list(LENGTH test_cases num_test_cases)
MESSAGE(STATUS "-- Found ${num_test_cases} test cases for CTest")
foreach (test_case ${test_cases})
add_test(NAME "\"${test_case}\""
COMMAND zeek --testing "--test-case=${test_case}")
endforeach ()
endif ()

View file

@ -1,5 +1,6 @@
#include "Data.h" #include "Data.h"
#include "File.h" #include "File.h"
#include "3rdparty/doctest.h"
#include "broker/data.bif.h" #include "broker/data.bif.h"
#include <broker/error.hh> #include <broker/error.hh>
@ -35,6 +36,16 @@ static broker::port::protocol to_broker_port_proto(TransportProto tp)
} }
} }
TEST_CASE("converting Zeek to Broker protocol constants")
{
CHECK_EQ(to_broker_port_proto(TRANSPORT_TCP), broker::port::protocol::tcp);
CHECK_EQ(to_broker_port_proto(TRANSPORT_UDP), broker::port::protocol::udp);
CHECK_EQ(to_broker_port_proto(TRANSPORT_ICMP),
broker::port::protocol::icmp);
CHECK_EQ(to_broker_port_proto(TRANSPORT_UNKNOWN),
broker::port::protocol::unknown);
}
TransportProto bro_broker::to_bro_port_proto(broker::port::protocol tp) TransportProto bro_broker::to_bro_port_proto(broker::port::protocol tp)
{ {
switch ( tp ) { switch ( tp ) {
@ -50,6 +61,16 @@ TransportProto bro_broker::to_bro_port_proto(broker::port::protocol tp)
} }
} }
TEST_CASE("converting Broker to Zeek protocol constants")
{
using bro_broker::to_bro_port_proto;
CHECK_EQ(to_bro_port_proto(broker::port::protocol::tcp), TRANSPORT_TCP);
CHECK_EQ(to_bro_port_proto(broker::port::protocol::udp), TRANSPORT_UDP);
CHECK_EQ(to_bro_port_proto(broker::port::protocol::icmp), TRANSPORT_ICMP);
CHECK_EQ(to_bro_port_proto(broker::port::protocol::unknown),
TRANSPORT_UNKNOWN);
}
struct val_converter { struct val_converter {
using result_type = Val*; using result_type = Val*;

View file

@ -60,6 +60,9 @@ extern "C" {
#include "3rdparty/sqlite3.h" #include "3rdparty/sqlite3.h"
#define DOCTEST_CONFIG_IMPLEMENT
#include "3rdparty/doctest.h"
Brofiler brofiler; Brofiler brofiler;
#ifndef HAVE_STRSEP #ifndef HAVE_STRSEP
@ -401,15 +404,74 @@ int main(int argc, char** argv)
{ {
std::set_new_handler(bro_new_handler); std::set_new_handler(bro_new_handler);
double time_start = current_time(true); auto copy_bro_args = [argc, argv]
{
brofiler.ReadStats();
bro_argc = argc; bro_argc = argc;
bro_argv = new char* [argc]; bro_argv = new char* [argc];
for ( int i = 0; i < argc; i++ ) for ( int i = 0; i < argc; i++ )
bro_argv[i] = copy_string(argv[i]); bro_argv[i] = copy_string(argv[i]);
};
#ifndef DOCTEST_CONFIG_DISABLE
doctest::Context context;
// When running unit tests, the first argument on the command line must be
// --testing, followed by doctest options. Optionally, users can use "--" as
// separator to pass Zeek options afterwards:
//
// zeek --testing [doctest-options] -- [zeek-options]
if (argc > 1 && strcmp(argv[1], "--testing") == 0)
{
// Deal with CLI arguments (copy Zeek part over to bro_argv).
auto is_separator = [](const char* cstr)
{
return strcmp(cstr, "--") == 0;
};
auto first = argv;
auto last = argv + argc;
auto separator = std::find_if(first, last, is_separator);
if ( separator == last )
{
bro_argc = 1;
bro_argv = new char*[1];
bro_argv[0] = copy_string(argv[0]);
}
else
{
auto first_zeek_arg = std::next(separator);
bro_argc = 1 + std::distance(first_zeek_arg, last);
bro_argv = new char*[bro_argc];
bro_argv[0] = copy_string(argv[0]);
auto bro_argv_iter = std::next(bro_argv);
for ( auto i = first_zeek_arg; i != last; ++i )
*bro_argv_iter++ = copy_string(*i);
}
context.applyCommandLine(std::distance(first, separator), argv);
// Run queries/tests and exit.
return context.run();
}
else
{
copy_bro_args();
}
#else // DOCTEST_CONFIG_DISABLE
copy_bro_args();
#endif // DOCTEST_CONFIG_DISABLE
double time_start = current_time(true);
brofiler.ReadStats();
name_list interfaces; name_list interfaces;
name_list read_files; name_list read_files;
@ -509,7 +571,7 @@ int main(int argc, char** argv)
#endif #endif
int op; int op;
while ( (op = getopt_long(argc, argv, opts, long_opts, &long_optsind)) != EOF ) while ( (op = getopt_long(bro_argc, bro_argv, opts, long_opts, &long_optsind)) != EOF )
switch ( op ) { switch ( op ) {
case 'a': case 'a':
parse_only = true; parse_only = true;
@ -721,7 +783,7 @@ int main(int argc, char** argv)
plugin_mgr->SearchDynamicPlugins(bro_plugin_path()); plugin_mgr->SearchDynamicPlugins(bro_plugin_path());
if ( optind == argc && if ( optind == bro_argc &&
read_files.length() == 0 && read_files.length() == 0 &&
interfaces.length() == 0 && interfaces.length() == 0 &&
! id_name && ! command_line_policy && ! print_plugins ) ! id_name && ! command_line_policy && ! print_plugins )
@ -730,7 +792,7 @@ int main(int argc, char** argv)
// Process remaining arguments. X=Y arguments indicate script // Process remaining arguments. X=Y arguments indicate script
// variable/parameter assignments. X::Y arguments indicate plugins to // variable/parameter assignments. X::Y arguments indicate plugins to
// activate/query. The remainder are treated as scripts to load. // activate/query. The remainder are treated as scripts to load.
while ( optind < argc ) while ( optind < bro_argc )
{ {
if ( strchr(argv[optind], '=') ) if ( strchr(argv[optind], '=') )
params.push_back(argv[optind++]); params.push_back(argv[optind++]);