cmake: Build test_bitcoin executable

This commit is contained in:
Hennadii Stepanov 2024-08-10 11:06:36 +01:00
parent b27bf9700d
commit 959370bd76
No known key found for this signature in database
GPG Key ID: 410108112E7EA81F
8 changed files with 272 additions and 1 deletions

View File

@ -68,6 +68,8 @@ list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/module)
option(BUILD_DAEMON "Build bitcoind executable." ON)
option(BUILD_CLI "Build bitcoin-cli executable." ON)
option(BUILD_TESTS "Build test_bitcoin executable." ON)
option(WITH_CCACHE "Attempt to use ccache for compiling." ON)
set(configure_warnings)
@ -194,7 +196,7 @@ target_link_libraries(core_interface INTERFACE
include(AddBoostIfNeeded)
add_boost_if_needed()
if(BUILD_DAEMON OR BUILD_CLI)
if(BUILD_DAEMON OR BUILD_CLI OR BUILD_TESTS)
find_package(Libevent 2.1.8 MODULE REQUIRED)
endif()
@ -230,6 +232,8 @@ message("=================")
message("Executables:")
message(" bitcoind ............................ ${BUILD_DAEMON}")
message(" bitcoin-cli ......................... ${BUILD_CLI}")
message("Tests:")
message(" test_bitcoin ........................ ${BUILD_TESTS}")
message("")
message("C++ compiler .......................... ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}, ${CMAKE_CXX_COMPILER}")
include(FlagsSummary)

View File

@ -64,4 +64,15 @@ function(add_boost_if_needed)
set(CMAKE_REQUIRED_DEFINITIONS)
endif()
if(BUILD_TESTS)
# Some package managers, such as vcpkg, vendor Boost.Test separately
# from the rest of the headers, so we have to check for it individually.
list(APPEND CMAKE_REQUIRED_DEFINITIONS -DBOOST_TEST_NO_MAIN)
include(CheckIncludeFileCXX)
check_include_file_cxx(boost/test/included/unit_test.hpp HAVE_BOOST_INCLUDED_UNIT_TEST_H)
if(NOT HAVE_BOOST_INCLUDED_UNIT_TEST_H)
message(FATAL_ERROR "Building test_bitcoin executable requested but boost/test/included/unit_test.hpp header not available.")
endif()
endif()
endfunction()

View File

@ -0,0 +1,21 @@
# Copyright (c) 2023-present The Bitcoin Core developers
# Distributed under the MIT software license, see the accompanying
# file COPYING or https://opensource.org/license/mit/.
function(generate_header_from_json json_source_relpath)
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${json_source_relpath}.h
COMMAND ${CMAKE_COMMAND} -DJSON_SOURCE_PATH=${CMAKE_CURRENT_SOURCE_DIR}/${json_source_relpath} -DHEADER_PATH=${CMAKE_CURRENT_BINARY_DIR}/${json_source_relpath}.h -P ${PROJECT_SOURCE_DIR}/cmake/script/GenerateHeaderFromJson.cmake
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${json_source_relpath} ${PROJECT_SOURCE_DIR}/cmake/script/GenerateHeaderFromJson.cmake
VERBATIM
)
endfunction()
function(generate_header_from_raw raw_source_relpath)
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${raw_source_relpath}.h
COMMAND ${CMAKE_COMMAND} -DRAW_SOURCE_PATH=${CMAKE_CURRENT_SOURCE_DIR}/${raw_source_relpath} -DHEADER_PATH=${CMAKE_CURRENT_BINARY_DIR}/${raw_source_relpath}.h -P ${PROJECT_SOURCE_DIR}/cmake/script/GenerateHeaderFromRaw.cmake
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${raw_source_relpath} ${PROJECT_SOURCE_DIR}/cmake/script/GenerateHeaderFromRaw.cmake
VERBATIM
)
endfunction()

View File

@ -0,0 +1,24 @@
# Copyright (c) 2023-present The Bitcoin Core developers
# Distributed under the MIT software license, see the accompanying
# file COPYING or https://opensource.org/license/mit/.
file(READ ${JSON_SOURCE_PATH} hex_content HEX)
string(REGEX MATCHALL "([A-Za-z0-9][A-Za-z0-9])" bytes "${hex_content}")
file(WRITE ${HEADER_PATH} "#include <string>\n")
file(APPEND ${HEADER_PATH} "namespace json_tests{\n")
get_filename_component(json_source_basename ${JSON_SOURCE_PATH} NAME_WE)
file(APPEND ${HEADER_PATH} "static const std::string ${json_source_basename}{\n")
set(i 0)
foreach(byte ${bytes})
math(EXPR i "${i} + 1")
math(EXPR remainder "${i} % 8")
if(remainder EQUAL 0)
file(APPEND ${HEADER_PATH} "0x${byte},\n")
else()
file(APPEND ${HEADER_PATH} "0x${byte}, ")
endif()
endforeach()
file(APPEND ${HEADER_PATH} "\n};};")

View File

@ -0,0 +1,22 @@
# Copyright (c) 2023-present The Bitcoin Core developers
# Distributed under the MIT software license, see the accompanying
# file COPYING or https://opensource.org/license/mit/.
file(READ ${RAW_SOURCE_PATH} hex_content HEX)
string(REGEX MATCHALL "([A-Za-z0-9][A-Za-z0-9])" bytes "${hex_content}")
get_filename_component(raw_source_basename ${RAW_SOURCE_PATH} NAME_WE)
file(WRITE ${HEADER_PATH} "static unsigned const char ${raw_source_basename}_raw[] = {\n")
set(i 0)
foreach(byte ${bytes})
math(EXPR i "${i} + 1")
math(EXPR remainder "${i} % 8")
if(remainder EQUAL 0)
file(APPEND ${HEADER_PATH} "0x${byte},\n")
else()
file(APPEND ${HEADER_PATH} "0x${byte}, ")
endif()
endforeach()
file(APPEND ${HEADER_PATH} "\n};")

View File

@ -286,3 +286,9 @@ if(BUILD_CLI)
$<TARGET_NAME_IF_EXISTS:libevent::libevent>
)
endif()
add_subdirectory(test/util)
if(BUILD_TESTS)
add_subdirectory(test)
endif()

155
src/test/CMakeLists.txt Normal file
View File

@ -0,0 +1,155 @@
# Copyright (c) 2023-present The Bitcoin Core developers
# Distributed under the MIT software license, see the accompanying
# file COPYING or https://opensource.org/license/mit/.
include(GenerateHeaders)
generate_header_from_json(data/base58_encode_decode.json)
generate_header_from_json(data/bip341_wallet_vectors.json)
generate_header_from_json(data/blockfilters.json)
generate_header_from_json(data/key_io_invalid.json)
generate_header_from_json(data/key_io_valid.json)
generate_header_from_json(data/script_tests.json)
generate_header_from_json(data/sighash.json)
generate_header_from_json(data/tx_invalid.json)
generate_header_from_json(data/tx_valid.json)
generate_header_from_raw(data/asmap.raw)
# Do not use generator expressions in test sources because the
# SOURCES property is processed to gather test suite macros.
add_executable(test_bitcoin
main.cpp
$<TARGET_OBJECTS:bitcoin_consensus>
${CMAKE_CURRENT_BINARY_DIR}/data/asmap.raw.h
${CMAKE_CURRENT_BINARY_DIR}/data/base58_encode_decode.json.h
${CMAKE_CURRENT_BINARY_DIR}/data/bip341_wallet_vectors.json.h
${CMAKE_CURRENT_BINARY_DIR}/data/blockfilters.json.h
${CMAKE_CURRENT_BINARY_DIR}/data/key_io_invalid.json.h
${CMAKE_CURRENT_BINARY_DIR}/data/key_io_valid.json.h
${CMAKE_CURRENT_BINARY_DIR}/data/script_tests.json.h
${CMAKE_CURRENT_BINARY_DIR}/data/sighash.json.h
${CMAKE_CURRENT_BINARY_DIR}/data/tx_invalid.json.h
${CMAKE_CURRENT_BINARY_DIR}/data/tx_valid.json.h
addrman_tests.cpp
allocator_tests.cpp
amount_tests.cpp
argsman_tests.cpp
arith_uint256_tests.cpp
banman_tests.cpp
base32_tests.cpp
base58_tests.cpp
base64_tests.cpp
bech32_tests.cpp
bip32_tests.cpp
bip324_tests.cpp
blockchain_tests.cpp
blockencodings_tests.cpp
blockfilter_index_tests.cpp
blockfilter_tests.cpp
blockmanager_tests.cpp
bloom_tests.cpp
bswap_tests.cpp
checkqueue_tests.cpp
cluster_linearize_tests.cpp
coins_tests.cpp
coinscachepair_tests.cpp
coinstatsindex_tests.cpp
common_url_tests.cpp
compilerbug_tests.cpp
compress_tests.cpp
crypto_tests.cpp
cuckoocache_tests.cpp
dbwrapper_tests.cpp
denialofservice_tests.cpp
descriptor_tests.cpp
disconnected_transactions.cpp
feefrac_tests.cpp
flatfile_tests.cpp
fs_tests.cpp
getarg_tests.cpp
hash_tests.cpp
headers_sync_chainwork_tests.cpp
httpserver_tests.cpp
i2p_tests.cpp
interfaces_tests.cpp
key_io_tests.cpp
key_tests.cpp
logging_tests.cpp
mempool_tests.cpp
merkle_tests.cpp
merkleblock_tests.cpp
miner_tests.cpp
miniminer_tests.cpp
miniscript_tests.cpp
minisketch_tests.cpp
multisig_tests.cpp
net_peer_connection_tests.cpp
net_peer_eviction_tests.cpp
net_tests.cpp
netbase_tests.cpp
node_warnings_tests.cpp
orphanage_tests.cpp
peerman_tests.cpp
pmt_tests.cpp
policy_fee_tests.cpp
policyestimator_tests.cpp
pool_tests.cpp
pow_tests.cpp
prevector_tests.cpp
raii_event_tests.cpp
random_tests.cpp
rbf_tests.cpp
rest_tests.cpp
result_tests.cpp
reverselock_tests.cpp
rpc_tests.cpp
sanity_tests.cpp
scheduler_tests.cpp
script_p2sh_tests.cpp
script_parse_tests.cpp
script_segwit_tests.cpp
script_standard_tests.cpp
script_tests.cpp
scriptnum_tests.cpp
serfloat_tests.cpp
serialize_tests.cpp
settings_tests.cpp
sighash_tests.cpp
sigopcount_tests.cpp
skiplist_tests.cpp
sock_tests.cpp
span_tests.cpp
streams_tests.cpp
sync_tests.cpp
system_tests.cpp
timeoffsets_tests.cpp
torcontrol_tests.cpp
transaction_tests.cpp
translation_tests.cpp
txindex_tests.cpp
txpackage_tests.cpp
txreconciliation_tests.cpp
txrequest_tests.cpp
txvalidation_tests.cpp
txvalidationcache_tests.cpp
uint256_tests.cpp
util_tests.cpp
util_threadnames_tests.cpp
validation_block_tests.cpp
validation_chainstate_tests.cpp
validation_chainstatemanager_tests.cpp
validation_flush_tests.cpp
validation_tests.cpp
validationinterface_tests.cpp
versionbits_tests.cpp
)
target_link_libraries(test_bitcoin
core_interface
test_util
bitcoin_cli
bitcoin_node
minisketch
secp256k1
Boost::headers
$<TARGET_NAME_IF_EXISTS:libevent::libevent>
)

View File

@ -0,0 +1,28 @@
# Copyright (c) 2023-present The Bitcoin Core developers
# Distributed under the MIT software license, see the accompanying
# file COPYING or https://opensource.org/license/mit/.
add_library(test_util STATIC EXCLUDE_FROM_ALL
blockfilter.cpp
coins.cpp
index.cpp
json.cpp
logging.cpp
mining.cpp
net.cpp
random.cpp
script.cpp
setup_common.cpp
str.cpp
transaction_utils.cpp
txmempool.cpp
validation.cpp
)
target_link_libraries(test_util
PRIVATE
core_interface
Boost::headers
PUBLIC
univalue
)