mirror of
https://frontier.innolan.net/rainlance/c-ares.git
synced 2025-12-06 13:50:30 +00:00
The tests are written in C++11, using the GoogleTest and GoogleMock
frameworks. They have their own independent autoconf setup, so that
users of the library need not have a C++ compiler just to get c-ares
working (however, the test/configure.ac file does assume the use of
a shared top-level m4/ directory). However, this autoconf setup has
only been tested on Linux and OSX so far.
Run with "./arestest", or "./arestest -v" to see extra debug info.
The GoogleTest options for running specific tests are also
available (e.g. "./arestest --gtest_filter=*Live*").
The tests are nowhere near complete yet (currently hitting around
60% coverage as reported by gcov), but they do include examples
of a few different styles of testing:
- There are live tests (ares-test-live.cc), which assume that the
current machine has a valid DNS setup and connection to the
internet; these tests issue queries for real domains but don't
particularly check what gets returned. The tests will fail on
an offline machine.
- There a few mock tests (ares-test-mock.cc) that set up a fake DNS
server and inject its port into the c-ares library configuration.
These tests allow specific response messages to be crafted and
injected, and so are likely to be used for many more tests in
future.
- To make this generation/injection easier, the dns-proto.h file
includes C++ helper classes for building DNS packets.
- Other library entrypoints that don't require network activity
(e.g. ares_parse_*_reply) are tested directly.
- There are few tests of library-internal functions that are not
normally visible to API users (in ares-test-internal.cc).
- A couple of the tests use a helper method of the test fixture to
inject memory allocation failures, using the earlier change to the
library to allow override of malloc/realloc/free.
- There is also an entrypoint to allow Clang's libfuzzer to drive
the packet parsing code in ares_parse_*_reply, together with a
standalone wrapper for it (./aresfuzz) to allow use of afl-fuzz
for further fuzz testing.
34 lines
1.5 KiB
Makefile
34 lines
1.5 KiB
Makefile
# Where to find the c-ares source code; needed because the tests use library-internal headers
|
|
ARES_SRC_DIR = ..
|
|
# Where to find the built c-ares static library
|
|
ARES_BLD_DIR = ..
|
|
AUTOMAKE_OPTIONS = foreign
|
|
ACLOCAL_AMFLAGS = -I ../m4
|
|
GMOCK_DIR = gmock-1.7.0
|
|
GTEST_DIR = $(GMOCK_DIR)/gtest
|
|
# Note use of -isystem to force use of local gMock/gTest even if there's an installed version.
|
|
CPPFLAGS += -I$(ARES_SRC_DIR) -isystem $(GTEST_DIR)/include -isystem $(GMOCK_DIR)/include
|
|
CXXFLAGS += -Wall --std=c++11 -g $(PTHREAD_CFLAGS)
|
|
|
|
TESTS = arestest
|
|
|
|
noinst_PROGRAMS = arestest aresfuzz
|
|
arestest_SOURCES = ares-test-main.cc ares-test-init.cc ares-test.cc ares-test-parse.cc ares-test-misc.cc ares-test-live.cc ares-test-mock.cc ares-test-internal.cc dns-proto.cc dns-proto-test.cc ares-test.h dns-proto.h
|
|
arestest_LDADD = libgmock.la libgtest.la $(ARES_BLD_DIR)/libcares.la $(PTHREAD_LIBS)
|
|
|
|
# Not interested in coverage of test code, but linking the test binary needs the coverage option
|
|
@CODE_COVERAGE_RULES@
|
|
arestest_LDFLAGS = $(CODE_COVERAGE_LDFLAGS)
|
|
|
|
noinst_LTLIBRARIES = libgmock.la libgtest.la
|
|
|
|
libgmock_la_SOURCES = $(GMOCK_DIR)/src/gmock-all.cc
|
|
libgmock_la_CPPFLAGS = -isystem $(GTEST_DIR)/include -I$(GTEST_DIR) -isystem $(GMOCK_DIR)/include -I$(GMOCK_DIR)
|
|
libgtest_la_SOURCES = $(GTEST_DIR)/src/gtest-all.cc
|
|
libgtest_la_CPPFLAGS = -isystem $(GTEST_DIR)/include -I$(GTEST_DIR) -isystem $(GMOCK_DIR)/include -I$(GMOCK_DIR)
|
|
|
|
aresfuzz_SOURCES = ares-test-fuzz.cc ares-fuzz.cc
|
|
aresfuzz_LDADD = $(ARES_BLD_DIR)/libcares.la
|
|
|
|
test: check
|