# Copyright (c) Microsoft Corporation. All rights reserved. # Licensed under the Apache 2.0 License. cmake_minimum_required(VERSION 3.16) set(ALLOWED_TARGETS "sgx;snp;virtual") set(COMPILE_TARGET "sgx" CACHE STRING "Target compilation platforms, Choose from: ${ALLOWED_TARGETS}" ) 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}") # 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() include(${CCF_DIR}/cmake/cpack_settings.cmake) 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) # 3.0 temporary way to identify platform from Debian package file(WRITE ${CMAKE_BINARY_DIR}/PLATFORM "${COMPILE_TARGET}") install(FILES ${CMAKE_BINARY_DIR}/PLATFORM DESTINATION share) 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 ) set(CONSENSUSES cft) set(CONSENSUS_FILTER cft) option(BUILD_TESTS "Build tests" ON) option(BUILD_UNIT_TESTS "Build unit tests" ON) option(CLIENT_PROTOCOLS_TEST "Test client protocols (TLS, HTTP/2)" 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(COMPILE_TARGET STREQUAL "sgx") # 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 http_parser.enclave sss.enclave ccf_endpoints.enclave ccfcrypto.enclave ccf_kv.enclave nghttp2.enclave ) add_lvi_mitigations(ccf.enclave) install( TARGETS ccf.enclave EXPORT ccf DESTINATION lib ) add_dependencies(ccf ccf.enclave) # Same as virtual for the time being but will diverge soon elseif(COMPILE_TARGET STREQUAL "snp") # SNP version add_library(ccf.snp STATIC ${CCF_IMPL_SOURCE}) target_compile_definitions( ccf.snp PUBLIC INSIDE_ENCLAVE VIRTUAL_ENCLAVE _LIBCPP_HAS_THREAD_API_PTHREAD PLATFORM_SNP ) target_compile_options(ccf.snp PUBLIC ${COMPILE_LIBCXX}) add_warning_checks(ccf.snp) target_include_directories( ccf.snp SYSTEM PUBLIC $ $ #< This contains the private headers #< which are currently under src, and #< should be removed or renamed $ $ ) target_link_libraries( ccf.snp PUBLIC ${LINK_LIBCXX} -lgcc http_parser.snp quickjs.snp sss.snp ccf_endpoints.snp ccfcrypto.snp ccf_kv.snp nghttp2.snp ${OE_HOST_LIBRARY} ${CMAKE_THREAD_LIBS_INIT} ) set_property(TARGET ccf.snp PROPERTY POSITION_INDEPENDENT_CODE ON) add_san(ccf.snp) install( TARGETS ccf.snp EXPORT ccf DESTINATION lib ) add_dependencies(ccf ccf.snp) elseif(COMPILE_TARGET STREQUAL "virtual") # 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 PLATFORM_VIRTUAL ) 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 http_parser.host quickjs.host sss.host ccf_endpoints.host ccfcrypto.host ccf_kv.host nghttp2.host ${OE_HOST_LIBRARY} ${CMAKE_THREAD_LIBS_INIT} ) 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" PATTERN "*.inc" ) # 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(PROGRAMS tests/docker_wrap.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) # Add external_executor app add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/src/apps/external_executor) 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/nonstd.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(js_test ${CMAKE_CURRENT_SOURCE_DIR}/src/js/test/js.cpp) target_link_libraries( js_test PRIVATE quickjs.host ccf_kv.host ccf_endpoints.host ccfcrypto.host http_parser.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 ) if(ENABLE_QUICTLS) add_unit_test( quic_test ${CMAKE_CURRENT_SOURCE_DIR}/src/quic/test/main.cpp ) target_include_directories(quic_test PUBLIC ${QUICTLS_INCLUDE_DIRS}) target_link_libraries(quic_test PUBLIC ${QUICTLS_LIBRARIES}) endif() 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 ${CCF_DIR}/src/node/quote.cpp ) target_link_libraries( frontend_test PRIVATE ${CMAKE_THREAD_LIBS_INIT} http_parser.host sss.host ccf_endpoints.host ccfcrypto.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 ccfcrypto.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 ${CCF_DIR}/src/node/quote.cpp ) target_link_libraries( node_frontend_test PRIVATE ${CMAKE_THREAD_LIBS_INIT} http_parser.host sss.host ccf_endpoints.host ccfcrypto.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} ) 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 --jinja-templates-path ${CMAKE_SOURCE_DIR}/samples/templates ) 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 --jinja-templates-path ${CMAKE_SOURCE_DIR}/samples/templates ) 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 --jinja-templates-path ${CMAKE_SOURCE_DIR}/samples/templates ) 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 commit_latency PYTHON_SCRIPT ${CMAKE_SOURCE_DIR}/tests/commit_latency.py CONSENSUS cft LABEL perf ) 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 ) 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(LONG_TESTS) 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 ) endif() 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(CLIENT_PROTOCOLS_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 e2e_logging_http2 PYTHON_SCRIPT ${CMAKE_SOURCE_DIR}/tests/e2e_logging.py CONSENSUS cft ADDITIONAL_ARGS --js-app-bundle ${CMAKE_SOURCE_DIR}/samples/apps/logging/js --http2 ) 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(CLIENT_PROTOCOLS_TEST) add_e2e_test( NAME client_protocols PYTHON_SCRIPT ${CMAKE_SOURCE_DIR}/tests/client_protocols.py CONSENSUS cft LABEL protocolstest ) 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} ) add_e2e_test( NAME acme_endorsement_test PYTHON_SCRIPT ${CMAKE_SOURCE_DIR}/tests/acme_endorsement.py LABEL ACME CONSENSUS cft ) 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 text ) add_perf_test( NAME pi_ls PYTHON_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/tests/infra/piccolo_driver.py CONSENSUS cft CLIENT_BIN ./submit ADDITIONAL_ARGS --package "samples/apps/logging/liblogging" --max-writes-ahead 1000 --repetitions 10000 ) 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 pi_ls_jwt PYTHON_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/tests/infra/piccolo_driver.py CONSENSUS cft CLIENT_BIN ./submit ADDITIONAL_ARGS --package "samples/apps/logging/liblogging" --max-writes-ahead 1000 --repetitions 1000 --use-jwt ) 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 ) 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 ) 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 ) add_e2e_test( NAME external_executor_test PYTHON_SCRIPT ${CMAKE_SOURCE_DIR}/tests/external_executor/external_executor.py CONSENSUS ${CONSENSUS_FILTER} ) 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 ) # Perf tool executable include(${CCF_DIR}/tests/perf-system/submitter/CMakeLists.txt)