CCF/CMakeLists.txt

988 строки
28 KiB
CMake

# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the Apache 2.0 License.
cmake_minimum_required(VERSION 3.16)
set(CCF_DIR ${CMAKE_CURRENT_SOURCE_DIR})
include(${CCF_DIR}/cmake/preproject.cmake)
include(${CCF_DIR}/cmake/version.cmake)
project(
${CCF_PROJECT}
VERSION ${CCF_RELEASE_VERSION}
LANGUAGES C CXX
)
message(STATUS "CCF version = ${CCF_VERSION}")
message(STATUS "CCF release version = ${CCF_RELEASE_VERSION}")
message(STATUS "CCF version suffix = ${CCF_VERSION_SUFFIX}")
include(${CCF_DIR}/cmake/cpack_settings.cmake)
# Set the default install prefix for CCF. Users may override this value with the
# cmake command. For example:
#
# $ cmake -DCMAKE_INSTALL_PREFIX=/opt/myplace ..
#
if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
set(CMAKE_INSTALL_PREFIX
"/opt/${CCF_PROJECT}"
CACHE PATH "Default install prefix" FORCE
)
endif()
message(STATUS "CMAKE_INSTALL_PREFIX is '${CMAKE_INSTALL_PREFIX}'")
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/cmake/preproject.cmake
DESTINATION cmake
)
include(GNUInstallDirs)
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/common.cmake)
set(CMAKE_GENERATED_COMMENT
"This file was auto-generated by CMake from a corresponding *.in file. DO NOT EDIT"
)
configure_file(
${CCF_DIR}/src/common/version.h.in ${CCF_DIR}/include/ccf/version.h @ONLY
)
configure_file(
${CCF_DIR}/python/version.py.in ${CCF_DIR}/python/version.py @ONLY
)
install(FILES ${CCF_DIR}/include/ccf/version.h DESTINATION include/ccf)
file(READ ${CCF_DIR}/doc/host_config_schema/cchost_config.json
HOST_CONFIG_SCHEMA
)
configure_file(
${CCF_DIR}/src/host/config_schema.h.in ${CCF_DIR}/src/host/config_schema.h
@ONLY
)
if(ENABLE_BFT AND (WORKER_THREADS EQUAL 0))
set(CONSENSUSES cft bft)
set(CONSENSUS_FILTER all)
else()
set(CONSENSUSES cft)
set(CONSENSUS_FILTER cft)
endif()
option(BUILD_TESTS "Build tests" ON)
option(BUILD_UNIT_TESTS "Build unit tests" ON)
option(TLS_TEST "TLS Test using https://github.com/drwetter/testssl.sh" OFF)
option(BUILD_TPCC "Build TPPC sample app and clients" OFF)
option(
FORCE_ENABLE_XAPIC_MITIGATION
"Always enable aligned reads from host-memory to mitigate xAPIC stale data read vulnerability. When this setting is off, the mitigation is enabled at run-time when vulnerable hardware is detected"
OFF
)
# Allow framework code to use LOG_*_FMT macros. These will be removed from
# public headers in future
add_compile_definitions(CCF_LOGGER_NO_DEPRECATE)
# Build common library for CCF enclaves
add_custom_target(ccf ALL)
set(CCF_IMPL_SOURCE
${CCF_DIR}/src/enclave/main.cpp ${CCF_DIR}/src/enclave/enclave_time.cpp
${CCF_DIR}/src/enclave/thread_local.cpp ${CCF_DIR}/src/js/wrap.cpp
${CCF_DIR}/src/node/quote.cpp
)
if("sgx" IN_LIST COMPILE_TARGETS)
# enclave version
add_enclave_library(
ccf.enclave ${CCF_IMPL_SOURCE} ${CCF_GENERATED_DIR}/ccf_t.cpp
)
add_warning_checks(ccf.enclave)
target_include_directories(
ccf.enclave SYSTEM
PUBLIC
$<BUILD_INTERFACE:${CCF_GENERATED_DIR}>
$<INSTALL_INTERFACE:include/ccf/> #< This contains the private headers
#< which are currently under src, and
#< should be removed or renamed
$<INSTALL_INTERFACE:include/>
$<INSTALL_INTERFACE:include/3rdparty/>
)
target_link_libraries(
ccf.enclave PUBLIC quickjs.enclave ccfcrypto.enclave http_parser.enclave
sss.enclave ccf_endpoints.enclave ccf_kv.enclave
)
if(ENABLE_HTTP2)
target_link_libraries(ccf.enclave PUBLIC nghttp2.enclave)
endif()
enable_quote_code(ccf.enclave)
add_lvi_mitigations(ccf.enclave)
install(
TARGETS ccf.enclave
EXPORT ccf
DESTINATION lib
)
add_dependencies(ccf ccf.enclave)
endif()
if("virtual" IN_LIST COMPILE_TARGETS)
# virtual version
add_library(ccf.virtual STATIC ${CCF_IMPL_SOURCE})
target_compile_definitions(
ccf.virtual PUBLIC INSIDE_ENCLAVE VIRTUAL_ENCLAVE
_LIBCPP_HAS_THREAD_API_PTHREAD
)
target_compile_options(ccf.virtual PUBLIC ${COMPILE_LIBCXX})
add_warning_checks(ccf.virtual)
target_include_directories(
ccf.virtual SYSTEM
PUBLIC
$<BUILD_INTERFACE:${CCF_GENERATED_DIR}>
$<INSTALL_INTERFACE:include/ccf/> #< This contains the private headers
#< which are currently under src, and
#< should be removed or renamed
$<INSTALL_INTERFACE:include/>
$<INSTALL_INTERFACE:include/3rdparty/>
)
target_link_libraries(
ccf.virtual
PUBLIC ${LINK_LIBCXX}
-lgcc
ccfcrypto.host
http_parser.host
quickjs.host
sss.host
ccf_endpoints.host
ccf_kv.host
openenclave::oehost
${CMAKE_THREAD_LIBS_INIT}
)
if(ENABLE_HTTP2)
target_link_libraries(ccf.virtual PUBLIC nghttp2.host)
endif()
set_property(TARGET ccf.virtual PROPERTY POSITION_INDEPENDENT_CODE ON)
add_san(ccf.virtual)
install(
TARGETS ccf.virtual
EXPORT ccf
DESTINATION lib
)
add_dependencies(ccf ccf.virtual)
endif()
install(
EXPORT ccf
DESTINATION cmake
FILE ccf-targets.cmake
)
# Install exported 3rd-party library includes
install(
DIRECTORY 3rdparty/exported/
DESTINATION include/3rdparty
FILES_MATCHING
PATTERN "*.h"
PATTERN "*.hpp"
)
# Install all private CCF headers, which may still be needed
install(
DIRECTORY src/
DESTINATION include/ccf/_private
FILES_MATCHING
PATTERN "*.h"
PATTERN "*/test*" EXCLUDE
)
# Install all public CCF headers
install(
DIRECTORY include/
DESTINATION include
FILES_MATCHING
PATTERN "*.h"
)
# Install CCF Python infrastructure
install(
DIRECTORY tests/infra/
DESTINATION bin/infra
FILES_MATCHING
PATTERN "*.py"
PATTERN "*/__pycache__*" EXCLUDE
)
install(PROGRAMS tests/sandbox/sandbox.sh DESTINATION bin)
install(FILES samples/constitutions/default/actions.js DESTINATION bin)
install(FILES samples/constitutions/default/validate.js DESTINATION bin)
install(FILES samples/constitutions/sandbox/resolve.js DESTINATION bin)
install(FILES samples/constitutions/default/apply.js DESTINATION bin)
install(FILES tests/start_network.py DESTINATION bin)
install(FILES tests/requirements.txt DESTINATION bin)
# Generate an ephemeral signing key
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/signing_key.pem
COMMAND openssl genrsa -out ${CMAKE_CURRENT_BINARY_DIR}/signing_key.pem -3
3072
)
add_custom_target(
signing_key ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/signing_key.pem
)
# Add sample apps
add_subdirectory(${CCF_DIR}/samples)
if(BUILD_TESTS)
enable_testing()
# Unit tests
if(BUILD_UNIT_TESTS)
add_unit_test(map_test ${CMAKE_CURRENT_SOURCE_DIR}/src/ds/test/map_test.cpp)
add_unit_test(
json_schema ${CMAKE_CURRENT_SOURCE_DIR}/src/ds/test/json_schema.cpp
)
add_unit_test(
logger_test ${CMAKE_CURRENT_SOURCE_DIR}/src/ds/test/logger.cpp
)
add_unit_test(
openapi_test ${CMAKE_CURRENT_SOURCE_DIR}/src/ds/test/openapi.cpp
)
target_link_libraries(openapi_test PRIVATE http_parser.host)
add_unit_test(
logger_json_test
${CMAKE_CURRENT_SOURCE_DIR}/src/ds/test/logger_json_test.cpp
)
target_compile_definitions(logger_json_test PUBLIC VERBOSE_LOGGING)
add_unit_test(
kv_test
${CMAKE_CURRENT_SOURCE_DIR}/src/kv/test/kv_test.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/kv/test/kv_contention.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/kv/test/kv_serialisation.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/kv/test/kv_snapshot.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/kv/test/kv_dynamic_tables.cpp
)
target_link_libraries(
kv_test PRIVATE ${CMAKE_THREAD_LIBS_INIT} http_parser.host ccf_kv.host
)
add_unit_test(
ds_test
${CMAKE_CURRENT_SOURCE_DIR}/src/ds/test/ring_buffer.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/ds/test/messaging.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/ds/test/oversized.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/ds/test/typed_messages.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/ds/test/serializer.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/ds/test/hash.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/ds/test/thread_messaging.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/ds/test/lru.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/ds/test/hex.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/ds/test/contiguous_set.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/ds/test/unit_strings.cpp
)
target_link_libraries(ds_test PRIVATE ${CMAKE_THREAD_LIBS_INIT})
add_unit_test(
ledger_test ${CMAKE_CURRENT_SOURCE_DIR}/src/host/test/ledger.cpp
)
add_unit_test(
raft_test ${CMAKE_CURRENT_SOURCE_DIR}/src/consensus/aft/test/main.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/consensus/aft/test/view_history.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/consensus/aft/test/committable_suffix.cpp
)
target_link_libraries(raft_test PRIVATE ccfcrypto.host)
add_unit_test(
raft_enclave_test
${CMAKE_CURRENT_SOURCE_DIR}/src/consensus/aft/test/enclave.cpp
)
target_include_directories(raft_enclave_test PRIVATE ${CCFCRYPTO_INC})
target_link_libraries(raft_enclave_test PRIVATE ccfcrypto.host)
add_unit_test(
crypto_test ${CMAKE_CURRENT_SOURCE_DIR}/src/crypto/test/crypto.cpp
)
target_include_directories(crypto_test PRIVATE ${CCFCRYPTO_INC})
target_link_libraries(crypto_test PRIVATE ccfcrypto.host)
add_unit_test(
key_exchange_test
${CMAKE_CURRENT_SOURCE_DIR}/src/crypto/test/key_exchange.cpp
)
target_link_libraries(key_exchange_test PRIVATE)
add_unit_test(
history_test ${CMAKE_CURRENT_SOURCE_DIR}/src/node/test/history.cpp
)
target_link_libraries(
history_test PRIVATE ccfcrypto.host http_parser.host ccf_kv.host
)
add_unit_test(
secret_sharing_test
${CMAKE_CURRENT_SOURCE_DIR}/src/node/test/secret_share.cpp
)
target_link_libraries(secret_sharing_test PRIVATE sss.host)
add_unit_test(
encryptor_test ${CMAKE_CURRENT_SOURCE_DIR}/src/node/test/encryptor.cpp
)
target_link_libraries(encryptor_test PRIVATE ccfcrypto.host ccf_kv.host)
add_unit_test(
historical_queries_test
${CMAKE_CURRENT_SOURCE_DIR}/src/node/test/historical_queries.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/node/test/receipt.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/node/receipt.cpp
)
target_link_libraries(
historical_queries_test PRIVATE http_parser.host sss.host ccf_kv.host
)
add_unit_test(
indexing_test ${CMAKE_CURRENT_SOURCE_DIR}/src/indexing/test/indexing.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/indexing/test/lfs.cpp
)
target_link_libraries(
indexing_test PRIVATE ccf_endpoints.host sss.host ccf_kv.host
)
add_unit_test(
snapshot_test ${CMAKE_CURRENT_SOURCE_DIR}/src/node/test/snapshot.cpp
)
target_link_libraries(snapshot_test PRIVATE ccf_kv.host)
add_unit_test(
snapshotter_test
${CMAKE_CURRENT_SOURCE_DIR}/src/node/test/snapshotter.cpp
)
target_link_libraries(
snapshotter_test PRIVATE ccf_kv.host ccf_endpoints.host
)
add_unit_test(
node_info_json_test
${CMAKE_CURRENT_SOURCE_DIR}/src/node/test/node_info_json.cpp
)
add_unit_test(tls_test ${CMAKE_CURRENT_SOURCE_DIR}/src/tls/test/main.cpp)
target_link_libraries(tls_test PRIVATE ${CMAKE_THREAD_LIBS_INIT})
add_unit_test(
base64_test ${CMAKE_CURRENT_SOURCE_DIR}/src/crypto/test/base64.cpp
)
target_link_libraries(base64_test PRIVATE ${CMAKE_THREAD_LIBS_INIT})
add_test_bin(
kp_cert_test ${CMAKE_CURRENT_SOURCE_DIR}/src/crypto/test/kp_cert.cpp
)
target_link_libraries(kp_cert_test PRIVATE ${CMAKE_THREAD_LIBS_INIT})
add_unit_test(
channels_test ${CMAKE_CURRENT_SOURCE_DIR}/src/node/test/channels.cpp
)
target_link_libraries(channels_test PRIVATE)
add_unit_test(
http_test ${CMAKE_CURRENT_SOURCE_DIR}/src/http/test/http_test.cpp
)
target_link_libraries(http_test PRIVATE http_parser.host)
add_unit_test(
frontend_test ${CMAKE_CURRENT_SOURCE_DIR}/src/js/wrap.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/node/rpc/test/frontend_test.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/enclave/enclave_time.cpp
)
target_link_libraries(
frontend_test PRIVATE ${CMAKE_THREAD_LIBS_INIT} http_parser.host sss.host
ccf_endpoints.host ccf_kv.host quickjs.host
)
add_unit_test(
tx_status_test
${CMAKE_CURRENT_SOURCE_DIR}/src/node/rpc/test/tx_status_test.cpp
)
add_unit_test(
proposal_id_test ${CMAKE_CURRENT_SOURCE_DIR}/src/js/wrap.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/node/rpc/test/proposal_id_test.cpp
)
target_link_libraries(
proposal_id_test
PRIVATE ${CMAKE_THREAD_LIBS_INIT} http_parser.host sss.host
ccf_endpoints.host quickjs.host ccf_kv.host
)
add_unit_test(
node_frontend_test ${CMAKE_CURRENT_SOURCE_DIR}/src/js/wrap.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/node/rpc/test/node_frontend_test.cpp
)
target_link_libraries(
node_frontend_test
PRIVATE ${CMAKE_THREAD_LIBS_INIT} http_parser.host sss.host
ccf_endpoints.host ccf_kv.host quickjs.host
)
add_unit_test(
merkle_test ${CMAKE_CURRENT_SOURCE_DIR}/src/node/test/merkle_test.cpp
)
# Merkle Tree memory test
add_executable(merkle_mem src/node/test/merkle_mem.cpp)
target_compile_options(merkle_mem PRIVATE ${COMPILE_LIBCXX})
target_link_libraries(
merkle_mem PRIVATE ${CMAKE_THREAD_LIBS_INIT} ${LINK_LIBCXX} crypto
)
# Raft driver and scenario test
add_executable(
raft_driver ${CMAKE_CURRENT_SOURCE_DIR}/src/consensus/aft/test/driver.cpp
)
target_link_libraries(raft_driver PRIVATE ccfcrypto.host)
target_include_directories(raft_driver PRIVATE src/aft)
add_test(
NAME raft_scenario_test
COMMAND
${PYTHON} ${CMAKE_SOURCE_DIR}/tests/raft_scenarios_runner.py
--gen-scenarios ./raft_driver ${CMAKE_SOURCE_DIR}/tests/raft_scenarios/
)
set_property(TEST raft_scenario_test PROPERTY LABELS raft_scenario)
add_test(NAME csr_test COMMAND ${PYTHON} ${CMAKE_SOURCE_DIR}/tests/certs.py
./kp_cert_test
)
set_property(
TEST csr_test
APPEND
PROPERTY LABELS unit_test
)
if(NOT UNSAFE_VERSION)
# Unsafe builds do not follow normal version conventions
add_test(NAME versionifier_test
COMMAND ${PYTHON}
${CMAKE_SOURCE_DIR}/python/ccf/_versionifier.py
)
add_test(NAME github_version_lts_test
COMMAND ${PYTHON} ${CMAKE_SOURCE_DIR}/tests/infra/github.py
)
endif()
endif()
# Picobench benchmarks
add_picobench(map_bench SRCS src/ds/test/map_bench.cpp)
add_picobench(logger_bench SRCS src/ds/test/logger_bench.cpp)
target_compile_definitions(logger_bench PUBLIC VERBOSE_LOGGING)
add_picobench(json_bench SRCS src/ds/test/json_bench.cpp)
add_picobench(ring_buffer_bench SRCS src/ds/test/ring_buffer_bench.cpp)
add_picobench(
crypto_bench
SRCS src/crypto/test/bench.cpp
LINK_LIBS
)
add_picobench(
history_bench
SRCS src/node/test/history_bench.cpp
LINK_LIBS ccf_kv.host
)
if(LONG_TESTS)
add_picobench(
kv_bench
SRCS src/kv/test/kv_bench.cpp src/enclave/thread_local.cpp
LINK_LIBS ccf_kv.host
)
add_picobench(merkle_bench SRCS src/node/test/merkle_bench.cpp)
add_picobench(hash_bench SRCS src/ds/test/hash_bench.cpp)
endif()
set(CONSTITUTION_ARGS
--constitution
${CCF_DIR}/samples/constitutions/default/actions.js
--constitution
${CCF_DIR}/samples/constitutions/test/test_actions.js
--constitution
${CCF_DIR}/samples/constitutions/default/validate.js
--constitution
${CCF_DIR}/samples/constitutions/test/resolve.js
--constitution
${CCF_DIR}/samples/constitutions/default/apply.js
)
if(LONG_TESTS)
set(ADDITIONAL_RECOVERY_ARGS --with-load)
endif()
add_e2e_test(
NAME recovery_test_cft
PYTHON_SCRIPT ${CMAKE_SOURCE_DIR}/tests/recovery.py
CONSENSUS cft
ADDITIONAL_ARGS ${ADDITIONAL_RECOVERY_ARGS}
)
if(LONG_TESTS)
add_e2e_test(
NAME recovery_test_curve_256
PYTHON_SCRIPT ${CMAKE_SOURCE_DIR}/tests/recovery.py
CONSENSUS cft
ADDITIONAL_ARGS --curve-id secp256r1
)
endif()
add_e2e_test(
NAME recovery_test_suite
PYTHON_SCRIPT ${CMAKE_SOURCE_DIR}/tests/e2e_suite.py
CONSENSUS cft
LABEL suite
ADDITIONAL_ARGS --test-duration 150 --test-suite rekey_recovery
--test-suite membership_recovery
)
add_e2e_test(
NAME reconfiguration_test_suite
PYTHON_SCRIPT ${CMAKE_SOURCE_DIR}/tests/e2e_suite.py
CONSENSUS cft
LABEL suite
ADDITIONAL_ARGS --test-duration 200 --test-suite reconfiguration
)
add_e2e_test(
NAME full_test_suite
PYTHON_SCRIPT ${CMAKE_SOURCE_DIR}/tests/e2e_suite.py
CONSENSUS cft
LABEL suite
ADDITIONAL_ARGS
--oe-binary
${OE_BINDIR}
--ledger-recovery-timeout
20
--test-duration
200
--test-suite
all
)
add_e2e_test(
NAME committable_suffix_test
PYTHON_SCRIPT ${CMAKE_SOURCE_DIR}/tests/committable.py
CONSENSUS cft
ADDITIONAL_ARGS --sig-ms-interval 100
)
add_e2e_test(
NAME js_batched_stress_test
PYTHON_SCRIPT ${CMAKE_SOURCE_DIR}/tests/e2e_batched.py
CONSENSUS cft
ADDITIONAL_ARGS
--js-app-bundle
${CMAKE_SOURCE_DIR}/src/apps/batched
--election-timeout-ms
10000 # Larger election timeout as recording large JS applications may
# trigger leadership changes
)
add_e2e_test(
NAME modules_test
PYTHON_SCRIPT ${CMAKE_SOURCE_DIR}/tests/js-modules/modules.py
CONSENSUS cft
ADDITIONAL_ARGS
--package libjs_generic --election-timeout-ms
10000 # Larger election timeout as recording
# large JS applications may trigger leadership changes
)
if(ENABLE_V8)
add_e2e_test(
NAME modules_v8_test
PYTHON_SCRIPT ${CMAKE_SOURCE_DIR}/tests/js-modules/modules.py
CONSENSUS cft
ADDITIONAL_ARGS
--package libjs_v8 --election-timeout-ms 10000 # Larger election timeout
# as recording
# large JS applications may trigger leadership changes
)
endif()
add_e2e_test(
NAME auth
PYTHON_SCRIPT
${CMAKE_SOURCE_DIR}/tests/js-custom-authorization/custom_authorization.py
CONSENSUS cft
ADDITIONAL_ARGS --package libjs_generic --js-app-bundle
${CMAKE_SOURCE_DIR}/tests
)
if(ENABLE_V8)
add_e2e_test(
NAME auth_v8
PYTHON_SCRIPT
${CMAKE_SOURCE_DIR}/tests/js-custom-authorization/custom_authorization.py
CONSENSUS cft
ADDITIONAL_ARGS --package libjs_v8 --js-app-bundle
${CMAKE_SOURCE_DIR}/tests
)
endif()
add_e2e_test(
NAME launch_host_process_test
PYTHON_SCRIPT
${CMAKE_SOURCE_DIR}/tests/js-launch-host-process/host_process.py
CONSENSUS cft
ADDITIONAL_ARGS --js-app-bundle
${CMAKE_SOURCE_DIR}/tests/js-launch-host-process
)
add_e2e_test(
NAME governance_test
PYTHON_SCRIPT ${CMAKE_SOURCE_DIR}/tests/governance.py
CONSENSUS cft
CONSTITUTION ${CONSTITUTION_ARGS}
ADDITIONAL_ARGS
--oe-binary ${OE_BINDIR} --initial-operator-count 1
--jinja-templates-path ${CMAKE_SOURCE_DIR}/samples/templates
)
add_e2e_test(
NAME jwt_test
PYTHON_SCRIPT ${CMAKE_SOURCE_DIR}/tests/jwt_test.py
CONSENSUS cft
)
add_e2e_test(
NAME code_update_test
PYTHON_SCRIPT ${CMAKE_SOURCE_DIR}/tests/code_update.py
CONSENSUS cft
ADDITIONAL_ARGS --oe-binary ${OE_BINDIR} --js-app-bundle
${CMAKE_SOURCE_DIR}/samples/apps/logging/js
)
if(BUILD_TPCC)
include(${CMAKE_CURRENT_SOURCE_DIR}/src/apps/tpcc/tpcc.cmake)
endif()
if(TLS_TEST)
add_custom_command(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/testssl/testssl.sh
COMMAND
rm -rf ${CMAKE_CURRENT_BINARY_DIR}/testssl && git clone --depth 1
--branch v3.0.7 --single-branch https://github.com/drwetter/testssl.sh
${CMAKE_CURRENT_BINARY_DIR}/testssl
)
add_custom_target(
testssl ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/testssl/testssl.sh
)
endif()
add_e2e_test(
NAME e2e_logging_cft
PYTHON_SCRIPT ${CMAKE_SOURCE_DIR}/tests/e2e_logging.py
CONSENSUS cft
CONTAINER_NODES TRUE
ADDITIONAL_ARGS --js-app-bundle ${CMAKE_SOURCE_DIR}/samples/apps/logging/js
)
add_e2e_test(
NAME membership
PYTHON_SCRIPT ${CMAKE_SOURCE_DIR}/tests/membership.py
CONSENSUS cft
)
set(PARTITIONS_TEST_ARGS
# Higher snapshot interval as the test currently assumes that no
# transactions
# are emitted while partitions are up. To be removed when
# https://github.com/microsoft/CCF/issues/2577 is implemented
--snapshot-tx-interval 10000
)
if(ENABLE_2TX_RECONFIG)
list(APPEND PARTITIONS_TEST_ARGS --include-2tx-reconfig)
endif()
add_e2e_test(
NAME partitions_cft
PYTHON_SCRIPT ${CMAKE_SOURCE_DIR}/tests/partitions_test.py
CONSENSUS cft
LABEL partitions
CONFIGURATIONS partitions
ADDITIONAL_ARGS ${PARTITIONS_TEST_ARGS}
)
add_e2e_test(
NAME connections_cft
PYTHON_SCRIPT ${CMAKE_SOURCE_DIR}/tests/connections.py
CONSENSUS cft
)
if(TLS_TEST)
add_e2e_test(
NAME tlstest_cft
PYTHON_SCRIPT ${CMAKE_SOURCE_DIR}/tests/tlstest.py
CONSENSUS cft
LABEL tlstest
)
endif()
add_e2e_test(
NAME schema_test_cft
PYTHON_SCRIPT ${CMAKE_SOURCE_DIR}/tests/schema.py
CONSENSUS cft
ADDITIONAL_ARGS
--schema-dir
${CMAKE_SOURCE_DIR}/doc/schemas
--ledger-tutorial
${CMAKE_SOURCE_DIR}/python/ledger_tutorial.py
--config-samples-dir
${CMAKE_SOURCE_DIR}/samples/config
--config-file-1x
${CMAKE_SOURCE_DIR}/python/config_1_x.ini
)
list(APPEND LTS_TEST_ARGS --oe-binary ${OE_BINDIR} --ccf-version
${CCF_VERSION}
)
if(LONG_TESTS)
list(APPEND LTS_TEST_ARGS --check-ledger-compatibility
--check-2tx-reconfig-migration
)
endif()
if(NOT UNSAFE_VERSION)
# Unsafe builds do not follow normal version conventions
add_e2e_test(
NAME lts_compatibility
PYTHON_SCRIPT ${CMAKE_SOURCE_DIR}/tests/lts_compatibility.py
CONSENSUS cft
LABEL e2e
ADDITIONAL_ARGS ${LTS_TEST_ARGS}
)
endif()
if(LONG_TESTS)
set(ROTATION_TEST_ARGS --rotation-retirements 10)
endif()
add_e2e_test(
NAME rotation_test_cft
PYTHON_SCRIPT ${CMAKE_SOURCE_DIR}/tests/rotation.py
CONSENSUS cft
LABEL rotation
ADDITIONAL_ARGS ${ROTATION_TEST_ARGS}
)
set(RECONFIG_TEST_ARGS --ccf-version ${CCF_VERSION})
if(ENABLE_2TX_RECONFIG)
list(APPEND RECONFIG_TEST_ARGS --include-2tx-reconfig)
endif()
add_e2e_test(
NAME reconfiguration_test_cft
PYTHON_SCRIPT ${CMAKE_SOURCE_DIR}/tests/reconfiguration.py
CONSENSUS cft
ADDITIONAL_ARGS ${RECONFIG_TEST_ARGS}
)
add_e2e_test(
NAME election_test
PYTHON_SCRIPT ${CMAKE_SOURCE_DIR}/tests/election.py
CONSENSUS ${CONSENSUS_FILTER}
)
foreach(CONSENSUS ${CONSENSUSES})
add_e2e_test(
NAME vegeta_stress_${CONSENSUS}
PYTHON_SCRIPT ${CMAKE_SOURCE_DIR}/tests/vegeta_stress.py
CONSENSUS ${CONSENSUS}
LABEL vegeta
ADDITIONAL_ARGS -p "samples/apps/logging/liblogging"
)
add_e2e_test(
NAME vegeta_long_stress_${CONSENSUS}
PYTHON_SCRIPT ${CMAKE_SOURCE_DIR}/tests/vegeta_stress.py
CONSENSUS ${CONSENSUS}
LABEL vegeta
CONFIGURATIONS long_stress
ADDITIONAL_ARGS -p "samples/apps/logging/liblogging" --duration 45m
)
endforeach()
add_perf_test(
NAME ls
PYTHON_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/tests/infra/perfclient.py
CONSENSUS cft
CLIENT_BIN ./scenario_perf_client
ADDITIONAL_ARGS
--package
"samples/apps/logging/liblogging"
--scenario-file
${CMAKE_CURRENT_LIST_DIR}/tests/perf_logging_scenario_100txs.json
--max-writes-ahead
1000
--repetitions
10000
--msg-ser-fmt
msgpack
)
add_perf_test(
NAME ls_jwt
PYTHON_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/tests/infra/perfclient.py
CONSENSUS cft
CLIENT_BIN ./scenario_perf_client
ADDITIONAL_ARGS
--package
"samples/apps/logging/liblogging"
--scenario-file
${CMAKE_CURRENT_LIST_DIR}/tests/perf_logging_scenario_100txs.json
--max-writes-ahead
1000
--repetitions
1000
--use-jwt
--msg-ser-fmt
msgpack
)
add_perf_test(
NAME ls_js
PYTHON_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/tests/infra/perfclient.py
CONSENSUS cft
CLIENT_BIN ./scenario_perf_client
ADDITIONAL_ARGS
--js-app-bundle
${CMAKE_SOURCE_DIR}/samples/apps/logging/js_perf
--scenario-file
${CMAKE_CURRENT_LIST_DIR}/tests/perf_logging_scenario_100txs.json
--max-writes-ahead
1000
--repetitions
1000
--msg-ser-fmt
text
)
if(ENABLE_V8)
add_perf_test(
NAME ls_v8
PYTHON_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/tests/infra/perfclient.py
CONSENSUS cft
CLIENT_BIN ./scenario_perf_client
ADDITIONAL_ARGS
--package
libjs_v8
--js-app-bundle
${CMAKE_SOURCE_DIR}/samples/apps/logging/js_perf
--scenario-file
${CMAKE_CURRENT_LIST_DIR}/tests/perf_logging_scenario_100txs.json
--max-writes-ahead
1000
--repetitions
1000
--msg-ser-fmt
text
)
endif()
add_perf_test(
NAME ls_full_js
PYTHON_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/tests/infra/perfclient.py
CONSENSUS cft
CLIENT_BIN ./scenario_perf_client
ADDITIONAL_ARGS
--js-app-bundle
${CMAKE_SOURCE_DIR}/samples/apps/logging/js
--scenario-file
${CMAKE_CURRENT_LIST_DIR}/tests/perf_logging_scenario_100txs.json
--max-writes-ahead
1000
--repetitions
1000
--msg-ser-fmt
text
)
if(ENABLE_V8)
add_perf_test(
NAME ls_full_v8
PYTHON_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/tests/infra/perfclient.py
CONSENSUS cft
CLIENT_BIN ./scenario_perf_client
ADDITIONAL_ARGS
--package
libjs_v8
--js-app-bundle
${CMAKE_SOURCE_DIR}/samples/apps/logging/js
--scenario-file
${CMAKE_CURRENT_LIST_DIR}/tests/perf_logging_scenario_100txs.json
--max-writes-ahead
1000
--repetitions
1000
--msg-ser-fmt
text
)
endif()
add_perf_test(
NAME ls_js_jwt
PYTHON_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/tests/infra/perfclient.py
CONSENSUS cft
CLIENT_BIN ./scenario_perf_client
ADDITIONAL_ARGS
--js-app-bundle
${CMAKE_SOURCE_DIR}/samples/apps/logging/js_perf
--scenario-file
${CMAKE_CURRENT_LIST_DIR}/tests/perf_logging_scenario_100txs.json
--max-writes-ahead
1000
--repetitions
700
--use-jwt
--msg-ser-fmt
text
)
add_e2e_test(
NAME historical_query_perf_test
PYTHON_SCRIPT ${CMAKE_SOURCE_DIR}/tests/historical_query_perf.py
CONSENSUS cft
LABEL perf
)
endif()
# Generate and install CMake export file for consumers using CMake
include(CMakePackageConfigHelpers)
configure_package_config_file(
${CMAKE_CURRENT_SOURCE_DIR}/cmake/${CCF_PROJECT}-config.cmake.in
${CMAKE_BINARY_DIR}/cmake/${CCF_PROJECT}-config.cmake
INSTALL_DESTINATION ${CMAKE_INSTALL_PREFIX}/cmake
PATH_VARS CMAKE_INSTALL_LIBDIR CMAKE_INSTALL_BINDIR CMAKE_INSTALL_INCLUDEDIR
)
write_basic_package_version_file(
${CMAKE_BINARY_DIR}/cmake/${CCF_PROJECT}-config-version.cmake
COMPATIBILITY SameMajorVersion
)
install(FILES ${CMAKE_BINARY_DIR}/cmake/${CCF_PROJECT}-config.cmake
${CMAKE_BINARY_DIR}/cmake/${CCF_PROJECT}-config-version.cmake
DESTINATION ${CMAKE_INSTALL_PREFIX}/cmake
)