# 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) # 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 $ $ #< This contains the private headers #< which are currently under src, and #< should be removed or renamed $ $ ) 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 $ $ #< This contains the private headers #< which are currently under src, and #< should be removed or renamed $ $ ) 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 Logging app. add_subdirectory(${CCF_DIR}/samples/apps/logging) # Add NoBuiltins app add_subdirectory(${CCF_DIR}/samples/apps/nobuiltins) 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( 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 )