From a6c7f355cc8bb472fcd2ace5a3057ef77d3cd77d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9goire=20Henry?= Date: Wed, 5 Apr 2017 18:24:26 +0200 Subject: [PATCH] Test: simplify Makefile --- .dockerignore | 22 +- .gitignore | 26 +- .gitlab-ci.yml | 102 ++--- src/Makefile | 499 +++------------------ src/Makefile.files | 398 ++++++++++++++++ test/.merlin | 28 -- test/Makefile | 367 +-------------- test/Makefile.shared | 90 ++++ test/attic/test_p2p.ml | 151 ------- test/generate_hash.ml | 63 --- test/launch.sh | 9 - test/launch_daemon.sh | 19 - test/lib/.merlin | 23 + test/lib/Makefile | 32 ++ test/lib/assert.ml | 47 +- test/lib/assert.mli | 23 +- test/lib/node_helpers.ml | 70 +++ test/lib/node_helpers.mli | 16 + test/lib/process.ml | 1 + test/lib/test.ml | 2 +- test/p2p/.merlin | 17 + test/p2p/Makefile | 77 ++++ test/{ => p2p}/test_p2p_connection.ml | 14 +- test/{ => p2p}/test_p2p_connection_pool.ml | 2 +- test/{ => p2p}/test_p2p_io_scheduler.ml | 6 +- test/shell/.merlin | 23 + test/shell/Makefile | 74 +++ test/{ => shell}/test_context.ml | 12 +- test/{ => shell}/test_state.ml | 50 ++- test/{ => shell}/test_store.ml | 17 +- test/test_basic.ml | 212 --------- test/utils/.merlin | 13 + test/utils/Makefile | 73 +++ test/{ => utils}/test_data_encoding.ml | 1 - test/{ => utils}/test_lwt_pipe.ml | 0 test/{ => utils}/test_merkle.ml | 0 36 files changed, 1160 insertions(+), 1419 deletions(-) create mode 100644 src/Makefile.files delete mode 100644 test/.merlin create mode 100644 test/Makefile.shared delete mode 100644 test/attic/test_p2p.ml delete mode 100644 test/generate_hash.ml delete mode 100755 test/launch.sh delete mode 100755 test/launch_daemon.sh create mode 100644 test/lib/.merlin create mode 100644 test/lib/Makefile create mode 100644 test/lib/node_helpers.ml create mode 100644 test/lib/node_helpers.mli create mode 100644 test/p2p/.merlin create mode 100644 test/p2p/Makefile rename test/{ => p2p}/test_p2p_connection.ml (95%) rename test/{ => p2p}/test_p2p_connection_pool.ml (98%) rename test/{ => p2p}/test_p2p_io_scheduler.ml (97%) create mode 100644 test/shell/.merlin create mode 100644 test/shell/Makefile rename test/{ => shell}/test_context.ml (95%) rename test/{ => shell}/test_state.ml (94%) rename test/{ => shell}/test_store.ml (97%) delete mode 100644 test/test_basic.ml create mode 100644 test/utils/.merlin create mode 100644 test/utils/Makefile rename test/{ => utils}/test_data_encoding.ml (99%) rename test/{ => utils}/test_lwt_pipe.ml (100%) rename test/{ => utils}/test_merkle.ml (100%) diff --git a/.dockerignore b/.dockerignore index fdf919702..ce2f76e9d 100644 --- a/.dockerignore +++ b/.dockerignore @@ -36,17 +36,21 @@ src/client/embedded/alpha/webclient/static/main.js src/client/embedded/alpha/webclient/webclient_proto_static.ml test/.depend +test/lib/.depend +test/utils/.depend +test/p2p/.depend +test/shell/.depend test/reports -test/test-store -test/test-state -test/test-context -test/test-basic -test/test-data-encoding -test/test-p2p-io-scheduler -test/test-p2p-connection -test/test-p2p-connection-pool -test/LOG +test/utils/test-data-encoding +test/utils/test-merkle +test/utils/test-lwt-pipe +test/p2p/test-p2p-io-scheduler +test/p2p/test-p2p-connection +test/p2p/test-p2p-connection-pool +test/shell/test-store +test/shell/test-state +test/shell/test-context **/*~ **/\#*\# diff --git a/.gitignore b/.gitignore index 33c57dea5..df3951328 100644 --- a/.gitignore +++ b/.gitignore @@ -35,19 +35,21 @@ /src/client/embedded/alpha/webclient/webclient_proto_static.ml /test/.depend +/test/lib/.depend +/test/utils/.depend +/test/p2p/.depend +/test/shell/.depend /test/reports -/test/test-store -/test/test-state -/test/test-context -/test/test-basic -/test/test-data-encoding -/test/test-merkle -/test/test-p2p-io-scheduler -/test/test-p2p-connection -/test/test-p2p-connection-pool -/test/generate_hash -/test/LOG +/test/utils/test-data-encoding +/test/utils/test-merkle +/test/utils/test-lwt-pipe +/test/p2p/test-p2p-io-scheduler +/test/p2p/test-p2p-connection +/test/p2p/test-p2p-connection-pool +/test/shell/test-store +/test/shell/test-state +/test/shell/test-context *~ \#*\# @@ -68,4 +70,4 @@ bisect*.out *.rej -*.orig \ No newline at end of file +*.orig diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8b68dff2d..1b5581d98 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -27,44 +27,81 @@ build: script: - echo "PRODUCTION=yes" > src/Makefile.local - make -C src -j4 - - make -C test -j4 build-test + - make -C test build artifacts: expire_in: 1 week untracked: true -test:store: + +test:utils:data-encoding: stage: test tags: - tezos_builder script: - - make -C test run-test-store + - make -C test/utils run-test-data-encoding dependencies: - build -test:context: +test:utils:merkle: stage: test tags: - tezos_builder script: - - make -C test run-test-context + - make -C test/utils run-test-merkle dependencies: - build -test:state: +test:shell:store: stage: test tags: - tezos_builder script: - - make -C test run-test-state + - make -C test/shell run-test-store dependencies: - build -test:basic: +test:shell:context: stage: test tags: - tezos_builder script: - - make -C test run-test-basic + - make -C test/shell run-test-context + dependencies: + - build + +test:shell:state: + stage: test + tags: + - tezos_builder + script: + - make -C test/shell run-test-state + dependencies: + - build + +test:p2p:io-scheduler: + stage: test + tags: + - tezos_builder + script: + - make -C test/p2p run-test-p2p-io-scheduler + dependencies: + - build + +test:p2p:connection: + stage: test + tags: + - tezos_builder + script: + - make -C test/p2p run-test-p2p-connection + dependencies: + - build + +test:p2p:connection-pool: + stage: test + tags: + - tezos_builder + script: + - make -C test/p2p run-test-p2p-connection-pool dependencies: - build @@ -73,52 +110,7 @@ test:basic.sh: tags: - tezos_builder script: - - make -C test run-test-basic.sh - dependencies: - - build - -test:data-encoding: - stage: test - tags: - - tezos_builder - script: - - make -C test run-test-data-encoding - dependencies: - - build - -test:merkle: - stage: test - tags: - - tezos_builder - script: - - make -C test run-test-merkle - dependencies: - - build - -test:p2p-io-scheduler: - stage: test - tags: - - tezos_builder - script: - - make -C test run-test-p2p-io-scheduler - dependencies: - - build - -test:p2p-connection: - stage: test - tags: - - tezos_builder - script: - - make -C test run-test-p2p-connection - dependencies: - - build - -test:p2p-connection-pool: - stage: test - tags: - - tezos_builder - script: - - make -C test run-test-p2p-connection-pool + - make -C test run-basic.sh dependencies: - build diff --git a/src/Makefile b/src/Makefile index 5cff833b9..fb010fe50 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,6 +1,7 @@ -include Makefile.local include Makefile.config +include Makefile.files TZCOMPILER=../tezos-protocol-compiler TZNODE=../tezos-node @@ -10,45 +11,12 @@ TZATTACKER=../tezos-attacker all: ${TZCOMPILER} ${TZNODE} ${TZCLIENT} # ${TZWEBCLIENT} ${TZATTACKER} - NODEPS := ############################################################################ ## Protocol environment ############################################################################ -PROTOCOL_ENV_INTFS := \ -$(addprefix proto/environment/, \ - pervasives.mli \ - compare.mli \ - \ - array.mli list.mli bytes.mli string.mli \ - set.mli map.mli \ - int32.mli int64.mli \ - buffer.mli \ - format.mli \ - \ - lwt_sequence.mli lwt.mli lwt_list.mli \ - \ - mBytes.mli \ - hex_encode.mli \ - \ - uri.mli \ - data_encoding.mli \ - error_monad.mli \ - logging.mli \ - time.mli \ - base58.mli \ - hash.mli \ - ed25519.mli \ - persist.mli \ - fitness.mli \ - context.mli \ - RPC.mli \ - \ - updater.mli \ -) - .INTERMEDIATE: compiler/environment_gen .SECONDARY: node/updater/proto_environment.mli @@ -79,32 +47,16 @@ partial-clean:: ############################################################################ -COMPILER_EMBEDDED_CMIS := \ - compiler/sigs/camlinternalFormatBasics.cmi \ - compiler/sigs/proto_environment.cmi \ - compiler/sigs/register.cmi - compiler/sigs/register.cmi: EXTRA_OCAMLFLAGS = -opaque -COMPILER_PRECOMPILED_INTFS := \ - compiler/sigs/tezos_compiler.mli \ - compiler/sigs/fitness.mli \ - compiler/sigs/persist.mli \ - compiler/sigs/store_sigs.mli \ - compiler/sigs/store.mli \ - compiler/sigs/context.mli \ - compiler/sigs/protocol.mli \ - compiler/sigs/proto_environment.mli \ - compiler/sigs/register.mli - COMPILER_PRECOMPILED_OBJS := \ ${COMPILER_PRECOMPILED_INTFS:.mli=.cmi} \ ${COMPILER_PRECOMPILED_INTFS:.mli=.mli.deps} -${COMPILER_PRECOMPILED_OBJS}: PACKAGES=${MINUTILS_PACKAGES} ${UTILS_PACKAGES} -${COMPILER_PRECOMPILED_OBJS}: SOURCE_DIRECTORIES=minutils utils compiler/sigs/ +${COMPILER_PRECOMPILED_OBJS}: PACKAGES=${COMPILER_PRECOMPILED_PACKAGES} +${COMPILER_PRECOMPILED_OBJS}: SOURCE_DIRECTORIES=${COMPILER_PRECOMPILED_SOURCE_DIRECTORIES} ${COMPILER_PRECOMPILED_OBJS}: TARGET="(embedded_cmis.cmx)" -${COMPILER_PRECOMPILED_OBJS}: OPENED_MODULES=Error_monad Hash Utils +${COMPILER_PRECOMPILED_OBJS}: OPENED_MODULES=${COMPILER_PRECOMPILED_OPENED_MODULES} compiler/sigs/camlinternalFormatBasics.cmi: ln -sf $(shell ocamlc -where)/camlinternalFormatBasics.cmi $@ @@ -156,36 +108,13 @@ node/db/context.cmi: compiler/sigs/context.cmi ## Minimal utils library compatible with js_of_ocaml ############################################################################ -MINUTILS_LIB_INTFS := \ - minutils/mBytes.mli \ - minutils/hex_encode.mli \ - minutils/utils.mli \ - minutils/compare.mli \ - minutils/data_encoding.mli \ - minutils/RPC.mli \ - -MINUTILS_LIB_IMPLS := \ - minutils/mBytes.ml \ - minutils/hex_encode.ml \ - minutils/utils.ml \ - minutils/compare.ml \ - minutils/data_encoding.ml \ - minutils/RPC.ml \ - -MINUTILS_PACKAGES := \ - cstruct \ - lwt \ - ocplib-json-typed.bson \ - ocplib-resto.directory \ - $(COVERAGEPKG) \ - MINUTILS_OBJS := \ ${MINUTILS_LIB_IMPLS:.ml=.cmx} ${MINUTILS_LIB_IMPLS:.ml=.ml.deps} \ ${MINUTILS_LIB_INTFS:.mli=.cmi} ${MINUTILS_LIB_INTFS:.mli=.mli.deps} ${MINUTILS_OBJS}: PACKAGES=${MINUTILS_PACKAGES} -${MINUTILS_OBJS}: SOURCE_DIRECTORIES=minutils +${MINUTILS_OBJS}: SOURCE_DIRECTORIES=${MINUTILS_SOURCE_DIRECTORIES} ${MINUTILS_OBJS}: TARGET="(minutils.cmxa)" -${MINUTILS_OBJS}: OPENED_MODULES= +${MINUTILS_OBJS}: OPENED_MODULES=${MINUTILS_OPENED_MODULES} minutils.cmxa: ${MINUTILS_LIB_IMPLS:.ml=.cmx} @echo LINK $(notdir $@) @@ -194,9 +123,9 @@ minutils.cmxa: ${MINUTILS_LIB_IMPLS:.ml=.cmx} MINUTILS_OBJS_BYTECODE := \ ${MINUTILS_LIB_IMPLS:.ml=.cmo} ${MINUTILS_LIB_IMPLS:.ml=.ml.deps.byte} ${MINUTILS_OBJS_BYTECODE}: PACKAGES=${MINUTILS_PACKAGES} -${MINUTILS_OBJS_BYTECODE}: SOURCE_DIRECTORIES=minutils +${MINUTILS_OBJS_BYTECODE}: SOURCE_DIRECTORIES=${MINUTILS_SOURCE_DIRECTORIES} ${MINUTILS_OBJS_BYTECODE}: TARGET="(minutils.cma)" -${MINUTILS_OBJS_BYTECODE}: OPENED_MODULES= +${MINUTILS_OBJS_BYTECODE}: OPENED_MODULES=${MINUTILS_OPENED_MODULES} minutils.cma: ${MINUTILS_LIB_IMPLS:.ml=.cmo} @echo LINK $(notdir $@) @@ -206,61 +135,13 @@ minutils.cma: ${MINUTILS_LIB_IMPLS:.ml=.cmo} ## Utils library ############################################################################ -UTILS_LIB_INTFS := \ - utils/base58.mli \ - utils/cli_entries.mli \ - utils/data_encoding_ezjsonm.mli \ - utils/crypto_box.mli \ - utils/time.mli \ - utils/hash.mli \ - utils/error_monad.mli \ - utils/lwt_exit.mli \ - utils/logging.mli \ - utils/lwt_utils.mli \ - utils/lwt_pipe.mli \ - utils/IO.mli \ - utils/moving_average.mli \ - utils/ring.mli \ - utils/watcher.mli \ - -UTILS_LIB_IMPLS := \ - utils/base58.ml \ - utils/error_monad_sig.ml \ - utils/error_monad.ml \ - utils/cli_entries.ml \ - utils/data_encoding_ezjsonm.ml \ - utils/time.ml \ - utils/hash.ml \ - utils/crypto_box.ml \ - utils/lwt_exit.ml \ - utils/logging.ml \ - utils/lwt_utils.ml \ - utils/lwt_pipe.ml \ - utils/IO.ml \ - utils/moving_average.ml \ - utils/ring.ml \ - utils/watcher.ml \ - -UTILS_PACKAGES := \ - ${MINUTILS_PACKAGES} \ - base64 \ - calendar \ - ezjsonm \ - ipaddr.unix \ - lwt.unix \ - mtime.os \ - nocrypto \ - sodium \ - zarith \ - $(COVERAGEPKG) \ - UTILS_OBJS := \ ${UTILS_LIB_IMPLS:.ml=.cmx} ${UTILS_LIB_IMPLS:.ml=.ml.deps} \ ${UTILS_LIB_INTFS:.mli=.cmi} ${UTILS_LIB_INTFS:.mli=.mli.deps} ${UTILS_OBJS}: PACKAGES=${UTILS_PACKAGES} -${UTILS_OBJS}: SOURCE_DIRECTORIES=minutils utils +${UTILS_OBJS}: SOURCE_DIRECTORIES=${UTILS_SOURCE_DIRECTORIES} ${UTILS_OBJS}: TARGET="(utils.cmxa)" -${UTILS_OBJS}: OPENED_MODULES= +${UTILS_OBJS}: OPENED_MODULES=${UTILS_OPENED_MODULES} utils.cmxa: ${UTILS_LIB_IMPLS:.ml=.cmx} @echo LINK $(notdir $@) @@ -276,35 +157,15 @@ utils.top: ## Node protocol compiler (also embedded in the main program) ############################################################################ -COMPILER_LIB_INTFS := \ - compiler/tezos_compiler.mli \ - compiler/embedded_cmis.mli \ - -COMPILER_LIB_IMPLS := \ - compiler/embedded_cmis.ml \ - compiler/tezos_compiler.ml \ - -COMPILER_IMPLS := \ - compiler_main.ml \ - -COMPILER_PACKAGES := \ - ${UTILS_PACKAGES} \ - compiler-libs.optcomp \ - lwt.unix \ - ocplib-endian \ - ocplib-ocamlres \ - unix \ - COMPILER_OBJS := \ ${COMPILER_IMPLS:.ml=.cmx} ${COMPILER_IMPLS:.ml=.ml.deps} \ ${COMPILER_LIB_IMPLS:.ml=.cmx} ${COMPILER_LIB_IMPLS:.ml=.ml.deps} \ ${COMPILER_LIB_INTFS:.mli=.cmi} ${COMPILER_LIB_INTFS:.mli=.mli.deps} \ ${TZCOMPILER} ${COMPILER_OBJS}: PACKAGES=${COMPILER_PACKAGES} -${COMPILER_OBJS}: SOURCE_DIRECTORIES=utils minutils compiler +${COMPILER_OBJS}: SOURCE_DIRECTORIES=${COMPILER_SOURCE_DIRECTORIES} ${COMPILER_OBJS}: TARGET="(compiler.cmxa)" -${COMPILER_OBJS}: \ - OPENED_MODULES=Error_monad Hash Utils +${COMPILER_OBJS}: OPENED_MODULES=${COMPILER_OPENED_MODULES} compiler.cmxa: ${COMPILER_LIB_IMPLS:.ml=.cmx} @echo LINK $(notdir $@) @@ -317,134 +178,10 @@ ${TZCOMPILER}: minutils.cmxa utils.cmxa compiler.cmxa ${COMPILER_IMPLS:.ml=.cmx} clean:: rm -f ${TZCOMPILER} - ############################################################################ ## Node program ############################################################################ -NODE_LIB_INTFS := \ - \ - node/net/p2p_types.mli \ - node/net/p2p_io_scheduler.mli \ - node/net/p2p_connection.mli \ - node/net/p2p_connection_pool_types.mli \ - node/net/p2p_connection_pool.mli \ - node/net/p2p_welcome.mli \ - node/net/p2p_discovery.mli \ - node/net/p2p_maintenance.mli \ - node/net/p2p.mli \ - node/net/RPC_server.mli \ - \ - node/updater/fitness.mli \ - \ - node/db/store_sigs.mli \ - node/db/raw_store.mli \ - node/db/store_sigs.mli \ - node/db/store_helpers.mli \ - node/db/store.mli \ - \ - node/db/ir_funview.mli \ - node/db/persist.mli \ - node/db/context.mli \ - \ - node/updater/protocol.mli \ - node/updater/updater.mli \ - node/updater/proto_environment.mli \ - node/updater/register.mli \ - \ - node/shell/state.mli \ - node/shell/distributed_db_functors.mli \ - node/shell/distributed_db_message.mli \ - node/shell/distributed_db_metadata.mli \ - node/shell/distributed_db.mli \ - node/shell/prevalidator.mli \ - node/shell/validator.mli \ - \ - node/shell/node_rpc_services.mli \ - node/shell/node.mli \ - node/shell/node_rpc.mli \ - -FULL_NODE_LIB_IMPLS := \ - \ - compiler/node_compiler_main.ml \ - \ - node/net/p2p_types.ml \ - node/net/p2p_io_scheduler.ml \ - node/net/p2p_connection.ml \ - node/net/p2p_connection_pool_types.ml \ - node/net/p2p_connection_pool.ml \ - node/net/p2p_welcome.ml \ - node/net/p2p_discovery.ml \ - node/net/p2p_maintenance.ml \ - node/net/p2p.ml \ - \ - node/net/RPC_server.ml \ - \ - node/updater/fitness.ml \ - \ - node/db/raw_store.ml \ - node/db/store_sigs.mli \ - node/db/store_helpers.ml \ - node/db/store.ml \ - \ - node/db/ir_funview.ml \ - node/db/persist.ml \ - node/db/context.ml \ - \ - node/updater/protocol.mli \ - node/updater/updater.ml \ - node/updater/environment.ml \ - node/updater/proto_environment.ml \ - node/updater/register.ml \ - \ - node/shell/state.ml \ - node/shell/distributed_db_functors.ml \ - node/shell/distributed_db_message.ml \ - node/shell/distributed_db_metadata.ml \ - node/shell/distributed_db.ml \ - node/shell/prevalidator.ml \ - node/shell/validator.ml \ - \ - node/shell/node_rpc_services.ml \ - node/shell/node.ml \ - node/shell/node_rpc.ml \ - -NODE_LIB_IMPLS := $(filter-out ${NODE_LIB_INTFS}, ${FULL_NODE_LIB_IMPLS}) - -NODE_INTFS := \ - node/main/node_identity_file.mli \ - node/main/node_config_file.mli \ - node/main/node_shared_arg.mli \ - node/main/node_run_command.mli \ - node/main/node_config_command.mli \ - node/main/node_identity_command.mli \ - -NODE_IMPLS := \ - node/main/node_identity_file.ml \ - node/main/node_config_file.ml \ - node/main/node_shared_arg.ml \ - node/main/node_run_command.ml \ - node/main/node_config_command.ml \ - node/main/node_identity_command.ml \ - node_main.ml \ - -NODE_PACKAGES := \ - $(COMPILER_PACKAGES) \ - calendar \ - cmdliner \ - cohttp.lwt \ - dynlink \ - git \ - ipv6-multicast \ - irmin.unix \ - ocplib-resto.directory \ - - -EMBEDDED_NODE_PROTOCOLS := \ - $(patsubst proto/%/,proto/embedded_proto_%.cmxa, \ - $(filter-out proto/environment/, \ - $(subst TEZOS_PROTOCOL,,$(shell ls proto/*/TEZOS_PROTOCOL)))) - NODE_OBJS := \ ${NODE_IMPLS:.ml=.cmx} ${NODE_IMPLS:.ml=.ml.deps} \ ${NODE_INTFS:.mli=.cmi} ${NODE_INTFS:.mli=.mli.deps} \ @@ -452,9 +189,9 @@ NODE_OBJS := \ ${NODE_LIB_INTFS:.mli=.cmi} ${NODE_LIB_INTFS:.mli=.mli.deps} \ ${TZNODE} ${NODE_OBJS}: PACKAGES=${NODE_PACKAGES} -${NODE_OBJS}: SOURCE_DIRECTORIES=minutils utils compiler node/db node/net node/updater node/shell node/main +${NODE_OBJS}: SOURCE_DIRECTORIES=${NODE_SOURCE_DIRECTORIES} ${NODE_OBJS}: TARGET="(node.cmxa)" -${NODE_OBJS}: OPENED_MODULES=Error_monad Hash Utils +${NODE_OBJS}: OPENED_MODULES=${NODE_OPENED_MODULES} node/updater/environment.cmi: node/updater/environment.cmx @@ -462,7 +199,7 @@ node.cmxa: ${NODE_LIB_IMPLS:.ml=.cmx} @echo LINK $(notdir $@) @${OCAMLOPT} ${OCAMLFLAGS} -a -o $@ $^ - ${NODE_IMPLS:.ml=.cmx}: ${EMBEDDED_CLIENT_PROTOCOLS} + ${NODE_IMPLS:.ml=.cmx}: ${EMBEDDED_NODE_PROTOCOLS} ${TZNODE}: minutils.cmxa utils.cmxa compiler.cmxa node.cmxa ${EMBEDDED_NODE_PROTOCOLS} ${NODE_IMPLS:.ml=.cmx} @echo LINK $(notdir $@) @${OCAMLOPT} -linkall -linkpkg ${OCAMLFLAGS} -o $@ $^ @@ -485,96 +222,25 @@ clean:: ## Client program ############################################################################ -CLIENT_LIB_INTFS := \ - client/client_rpcs.mli \ - client/client_node_rpcs.mli \ - client/client_commands.mli \ - client/client_generic_rpcs.mli \ - client/client_helpers.mli \ - client/client_aliases.mli \ - client/client_tags.mli \ - client/client_keys.mli \ - client/client_protocols.mli \ - client/client_blocks.mli \ - client/client_network.mli \ - -CLIENT_LIB_IMPLS := \ - client/client_rpcs.ml \ - client/client_node_rpcs.ml \ - client/client_commands.ml \ - client/client_config.ml \ - client/client_generic_rpcs.ml \ - client/client_helpers.ml \ - client/client_aliases.ml \ - client/client_tags.ml \ - client/client_keys.ml \ - client/client_protocols.ml \ - client/client_blocks.ml \ - client/client_network.ml \ - -WEBCLIENT_LIB_INTFS := \ - -WEBCLIENT_LIB_IMPLS := \ - client/webclient_version.ml \ - -CLIENT_IMPLS := \ - client_main.ml - -WEBCLIENT_IMPLS := \ - webclient_static.ml \ - webclient_main.ml - -CLIENT_PACKAGES := \ - ${NODE_PACKAGES} \ - magic-mime \ - -EMBEDDED_CLIENT_PROTOCOLS := \ - $(patsubst client/embedded/%/, \ - proto/client_embedded_proto_%.cmxa, \ - $(shell ls -d client/embedded/*/)) - -EMBEDDED_CLIENT_VERSIONS := \ - $(patsubst client/embedded/%/, \ - client/embedded/client_%.cmx, \ - $(shell ls -d client/embedded/*/)) - -EMBEDDED_WEBCLIENT_VERSIONS := \ - $(patsubst client/embedded/%/, \ - client/embedded/webclient_%.cmx, \ - $(shell ls -d client/embedded/*/)) - CLIENT_OBJS := \ ${CLIENT_IMPLS:.ml=.cmx} ${CLIENT_IMPLS:.ml=.ml.deps} \ - ${WEBCLIENT_IMPLS:.ml=.cmx} ${WEBCLIENT_IMPLS:.ml=.ml.deps} \ ${CLIENT_LIB_IMPLS:.ml=.cmx} ${CLIENT_LIB_IMPLS:.ml=.ml.deps} \ ${CLIENT_LIB_INTFS:.mli=.cmi} ${CLIENT_LIB_INTFS:.mli=.mli.deps} \ - ${WEBCLIENT_LIB_IMPLS:.ml=.cmx} ${WEBCLIENT_LIB_IMPLS:.ml=.ml.deps} \ - ${WEBCLIENT_LIB_INTFS:.mli=.cmi} ${WEBCLIENT_LIB_INTFS:.mli=.mli.deps} \ - ${TZCLIENT} \ - ${TZWEBCLIENT} + ${TZCLIENT} ${CLIENT_OBJS}: PACKAGES=${CLIENT_PACKAGES} -${CLIENT_OBJS}: SOURCE_DIRECTORIES=client client/embedded minutils utils node/net node/shell node/updater node/db compiler -${CLIENT_OBJS}: OPENED_MODULES=Error_monad Hash Utils +${CLIENT_OBJS}: SOURCE_DIRECTORIES=${CLIENT_SOURCE_DIRECTORIES} +${CLIENT_OBJS}: OPENED_MODULES=${CLIENT_OPENED_MODULES} ${CLIENT_LIB_IMPLS:.ml=.cmx} ${CLIENT_LIB_IMPLS:.ml=.ml.deps}: TARGET="(client.cmxa)" ${CLIENT_LIB_INTFS:.mli=.cmi} ${CLIENT_LIB_INTFS:.mli=.mli.deps}: TARGET="(client.cmxa)" -${WEBCLIENT_LIB_IMPLS:.ml=.cmx} ${WEBCLIENT_LIB_IMPLS:.ml=.ml.deps}: TARGET="(webclient.cmxa)" -${WEBCLIENT_LIB_INTFS:.mli=.cmi} ${WEBCLIENT_LIB_INTFS:.mli=.mli.deps}: TARGET="(webclient.cmxa)" client.cmxa: ${CLIENT_LIB_IMPLS:.ml=.cmx} @echo LINK $(notdir $@) @${OCAMLOPT} ${OCAMLFLAGS} -a -o $@ $^ -webclient.cmxa: ${WEBCLIENT_LIB_IMPLS:.ml=.cmx} client.cmxa - @echo LINK $(notdir $@) - ${OCAMLOPT} ${OCAMLFLAGS} -a -o $@ ${WEBCLIENT_LIB_IMPLS:.ml=.cmx} - -${EMBEDDED_CLIENT_VERSIONS}: client.cmxa +${EMBEDDED_CLIENT_VERSIONS}: client.cmxa ${EMBEDDED_CLIENT_PROTOCOLS} ${CLIENT_IMPLS:.ml=.cmx}: ${EMBEDDED_CLIENT_VERSIONS} -${EMBEDDED_WEBCLIENT_VERSIONS}: webclient.cmxa -${WEBCLIENT_IMPLS:.ml=.cmx}: ${EMBEDDED_CLIENT_VERSIONS} ${EMBEDDED_WEBCLIENT_VERSIONS} - ${TZCLIENT}: minutils.cmxa utils.cmxa compiler.cmxa node.cmxa \ client.cmxa \ ${EMBEDDED_CLIENT_PROTOCOLS} \ @@ -583,6 +249,32 @@ ${TZCLIENT}: minutils.cmxa utils.cmxa compiler.cmxa node.cmxa \ @echo LINK $(notdir $@) @${OCAMLOPT} -linkpkg ${OCAMLFLAGS} -o $@ $^ +clean:: + -rm -f ${TZCLIENT} + +############################################################################ +## Webclient program +############################################################################ + +WEBCLIENT_OBJS := \ + ${WEBCLIENT_IMPLS:.ml=.cmx} ${WEBCLIENT_IMPLS:.ml=.ml.deps} \ + ${WEBCLIENT_LIB_IMPLS:.ml=.cmx} ${WEBCLIENT_LIB_IMPLS:.ml=.ml.deps} \ + ${WEBCLIENT_LIB_INTFS:.mli=.cmi} ${WEBCLIENT_LIB_INTFS:.mli=.mli.deps} \ + ${TZWEBCLIENT} +${WEBCLIENT_OBJS}: PACKAGES=${WEBCLIENT_PACKAGES} +${WEBCLIENT_OBJS}: SOURCE_DIRECTORIES=${WEBCLIENT_SOURCE_DIRECTORIES} +${WEBCLIENT_OBJS}: OPENED_MODULES=${WEBCLIENT_OPENED_MODULES} + +${WEBCLIENT_LIB_IMPLS:.ml=.cmx} ${WEBCLIENT_LIB_IMPLS:.ml=.ml.deps}: TARGET="(webclient.cmxa)" +${WEBCLIENT_LIB_INTFS:.mli=.cmi} ${WEBCLIENT_LIB_INTFS:.mli=.mli.deps}: TARGET="(webclient.cmxa)" + +${EMBEDDED_WEBCLIENT_VERSIONS}: webclient.cmxa +${WEBCLIENT_IMPLS:.ml=.cmx}: ${EMBEDDED_CLIENT_VERSIONS} ${EMBEDDED_WEBCLIENT_VERSIONS} + +webclient.cmxa: ${WEBCLIENT_LIB_IMPLS:.ml=.cmx} client.cmxa + @echo LINK $(notdir $@) + ${OCAMLOPT} ${OCAMLFLAGS} -a -o $@ ${WEBCLIENT_LIB_IMPLS:.ml=.cmx} + ${TZWEBCLIENT}: minutils.cmxa utils.cmxa compiler.cmxa node.cmxa \ client.cmxa webclient.cmxa \ ${EMBEDDED_CLIENT_PROTOCOLS} \ @@ -592,81 +284,14 @@ ${TZWEBCLIENT}: minutils.cmxa utils.cmxa compiler.cmxa node.cmxa \ @echo LINK $(notdir $@) @${OCAMLOPT} -linkpkg ${OCAMLFLAGS} -o $@ $^ +clean:: + -rm -f ${TZCLIENT} + webclient_static.ml: $(shell find webclient_static/) ocp-ocamlres webclient_static -o $@ -clean:: - -rm -f ${TZCLIENT} $(TZWEBCLIENT) - -rm -f webclient_static.ml - -## Embedded client protocol modules - -.SECONDEXPANSION: - -client/embedded/client_%.cmx: \ - $(patsubst %.ml, %.cmx, $(NODE_LIB_IMPLS) $(CLIENT_LIB_IMPLS)) \ - proto/client_embedded_proto_%.cmxa \ - $$(shell find client/embedded/% -name webclient -prune -name \*.ml -or -name \*.mli) - @$(MAKE) -C client/embedded/$* ../client_$*.cmx - -client/embedded/webclient_%.cmx: \ - client/embedded/client_%.cmx \ - minutils.cma \ - $$(shell find client/embedded/%/webclient -name \*.ml -or -name \*.mli 2>/dev/null) \ - $$(shell find client/embedded/%/webclient/static/ 2>/dev/null) - @$(MAKE) -C client/embedded/$* ../webclient_$*.cmx - partial-clean:: - -for d in $$(ls -d client/embedded/*/) ; do make clean -C $$d ; done - -rm -f client/embedded/*.cm* client/embedded/*.o - - -############################################################################ -## Attacker program -############################################################################ - -ATTACKER_LIB_INTFS := \ - attacker/attacker_minimal.mli \ - -ATTACKER_LIB_IMPLS := \ - attacker/attacker_minimal.ml \ - -ATTACKER_IMPLS := \ - attacker_main.ml - -ATTACKER_PACKAGES := \ - ${NODE_PACKAGES} - -EMBEDDED_ATTACKER_PROTOCOLS := \ - $(patsubst client/embedded/%/, \ - proto/client_embedded_proto_%.cmxa, \ - $(shell ls -d client/embedded/*/)) - -ATTACKER_OBJS := \ - ${ATTACKER_IMPLS:.ml=.cmx} ${ATTACKER_IMPLS:.ml=.ml.deps} \ - ${ATTACKER_LIB_IMPLS:.ml=.cmx} ${ATTACKER_LIB_IMPLS:.ml=.ml.deps} \ - ${ATTACKER_LIB_INTFS:.mli=.cmi} ${ATTACKER_LIB_INTFS:.mli=.mli.deps} \ - ${TZATTACKER} -${ATTACKER_OBJS}: PACKAGES=${ATTACKER_PACKAGES} -${ATTACKER_OBJS}: SOURCE_DIRECTORIES=attacker proto client/embedded minutils utils node/net node/shell node/updater node/db compiler -${ATTACKER_OBJS}: TARGET="(attacker.cmxa)" -${ATTACKER_OBJS}: OPENED_MODULES=Error_monad Hash Utils - -attacker.cmxa: ${ATTACKER_LIB_IMPLS:.ml=.cmx} - @echo LINK $(notdir $@) - @${OCAMLOPT} ${OCAMLFLAGS} -a -o $@ $^ - -${ATTACKER_LIB_IMPLS:.ml=.cmx} ${ATTACKER_IMPLS:.ml=.cmx}: \ - ${EMBEDDED_ATTACKER_PROTOCOLS} - -${TZATTACKER}: minutils.cmxa utils.cmxa compiler.cmxa node.cmxa \ - ${EMBEDDED_ATTACKER_PROTOCOLS} attacker.cmxa \ - ${ATTACKER_IMPLS:.ml=.cmx} - @echo LINK $(notdir $@) - @${OCAMLOPT} -linkpkg ${OCAMLFLAGS} -o $@ $^ - -clean:: - -rm -f ${TZATTACKER} + -rm -f webclient_static.ml ############################################################################ ## Generic rules @@ -765,6 +390,8 @@ proto/client_embedded_proto_%.cmxa: \ ${TZCOMPILER} \ node/updater/environment.cmi \ node/updater/environment.cmx \ + node/updater/proto_environment.cmi \ + node/updater/proto_environment.cmx \ proto/%/TEZOS_PROTOCOL \ $$(wildcard proto/%/*.ml) \ $$(wildcard proto/%/*.mli) @@ -773,11 +400,29 @@ proto/client_embedded_proto_%.cmxa: \ $(addprefix -I , ${CLIENT_PROTO_INCLUDES}) \ $@ proto/$* -proto/client_embedded_proto_genesis.cmxa: proto/client_embedded_proto_alpha.cmxa - -clean:: +partial-clean:: -rm -rf $(patsubst proto/embedded_proto_%.cmxa,proto/%/_tzbuild, \ ${EMBEDDED_NODE_PROTOCOLS}) -rm -f $(patsubst proto/client_embedded_proto_%.cmxa, \ proto/register_client_embedded_proto_%.ml, \ ${EMBEDDED_CLIENT_PROTOCOLS}) + +## Embedded client protocol modules + +client/embedded/client_%.cmx: \ + $(patsubst %.ml, %.cmx, $(NODE_LIB_IMPLS) $(CLIENT_LIB_IMPLS)) \ + proto/client_embedded_proto_%.cmxa \ + $$(shell find client/embedded/% \( -name webclient -or -name _tzbuild \) -prune -or \( -name \*.ml -print -or -name \*.mli -print \)) + @echo $^ + @$(MAKE) -C client/embedded/$* ../client_$*.cmx + +client/embedded/webclient_%.cmx: \ + client/embedded/client_%.cmx \ + minutils.cma \ + $$(shell find client/embedded/%/webclient -name \*.ml -or -name \*.mli 2>/dev/null) \ + $$(shell find client/embedded/%/webclient/static/ 2>/dev/null) + @$(MAKE) -C client/embedded/$* ../webclient_$*.cmx + +partial-clean:: + -for d in $$(ls -d client/embedded/*/) ; do make clean -C $$d ; done + -rm -f client/embedded/*.cm* client/embedded/*.o diff --git a/src/Makefile.files b/src/Makefile.files new file mode 100644 index 000000000..6b8376184 --- /dev/null +++ b/src/Makefile.files @@ -0,0 +1,398 @@ + +SRCDIR ?= . + +PROTOCOL_ENV_INTFS := \ +$(addprefix proto/environment/, \ + pervasives.mli \ + compare.mli \ + \ + array.mli list.mli bytes.mli string.mli \ + set.mli map.mli \ + int32.mli int64.mli \ + buffer.mli \ + format.mli \ + \ + lwt_sequence.mli lwt.mli lwt_list.mli \ + \ + mBytes.mli \ + hex_encode.mli \ + \ + uri.mli \ + data_encoding.mli \ + error_monad.mli \ + logging.mli \ + time.mli \ + base58.mli \ + hash.mli \ + ed25519.mli \ + persist.mli \ + fitness.mli \ + context.mli \ + RPC.mli \ + \ + updater.mli \ +) + +############################################################################ +## Minimal utils library compatible with js_of_ocaml +############################################################################ + +MINUTILS_SOURCE_DIRECTORIES := \ + ${SRCDIR}/minutils + +MINUTILS_OPENED_MODULES := + +MINUTILS_LIB_INTFS := \ + minutils/mBytes.mli \ + minutils/hex_encode.mli \ + minutils/utils.mli \ + minutils/compare.mli \ + minutils/data_encoding.mli \ + minutils/RPC.mli \ + +MINUTILS_LIB_IMPLS := \ + minutils/mBytes.ml \ + minutils/hex_encode.ml \ + minutils/utils.ml \ + minutils/compare.ml \ + minutils/data_encoding.ml \ + minutils/RPC.ml \ + +MINUTILS_PACKAGES := \ + cstruct \ + lwt \ + ocplib-json-typed.bson \ + ocplib-resto.directory \ + $(COVERAGEPKG) \ + +############################################################################ +## Utils library +############################################################################ + +UTILS_SOURCE_DIRECTORIES := \ + ${MINUTILS_SOURCE_DIRECTORIES} \ + ${SRCDIR}/utils + +UTILS_OPENED_MODULES := + +UTILS_LIB_INTFS := \ + utils/base58.mli \ + utils/cli_entries.mli \ + utils/data_encoding_ezjsonm.mli \ + utils/crypto_box.mli \ + utils/time.mli \ + utils/hash.mli \ + utils/error_monad.mli \ + utils/lwt_exit.mli \ + utils/logging.mli \ + utils/lwt_utils.mli \ + utils/lwt_pipe.mli \ + utils/IO.mli \ + utils/moving_average.mli \ + utils/ring.mli \ + utils/watcher.mli \ + +UTILS_LIB_IMPLS := \ + utils/base58.ml \ + utils/error_monad_sig.ml \ + utils/error_monad.ml \ + utils/cli_entries.ml \ + utils/data_encoding_ezjsonm.ml \ + utils/time.ml \ + utils/hash.ml \ + utils/crypto_box.ml \ + utils/lwt_exit.ml \ + utils/logging.ml \ + utils/lwt_utils.ml \ + utils/lwt_pipe.ml \ + utils/IO.ml \ + utils/moving_average.ml \ + utils/ring.ml \ + utils/watcher.ml \ + +UTILS_PACKAGES := \ + ${MINUTILS_PACKAGES} \ + base64 \ + calendar \ + ezjsonm \ + ipaddr.unix \ + lwt.unix \ + mtime.os \ + nocrypto \ + sodium \ + zarith \ + $(COVERAGEPKG) \ + +############################################################################ +## Node protocol compiler (also embedded in the main program) +############################################################################ + +COMPILER_SOURCE_DIRECTORIES := \ + ${UTILS_SOURCE_DIRECTORIES} \ + ${SRCDIR}/compiler + +COMPILER_OPENED_MODULES := Error_monad Hash Utils + +COMPILER_EMBEDDED_CMIS := \ + compiler/sigs/camlinternalFormatBasics.cmi \ + compiler/sigs/proto_environment.cmi \ + compiler/sigs/register.cmi + +COMPILER_PRECOMPILED_INTFS := \ + compiler/sigs/tezos_compiler.mli \ + compiler/sigs/fitness.mli \ + compiler/sigs/persist.mli \ + compiler/sigs/store_sigs.mli \ + compiler/sigs/store.mli \ + compiler/sigs/context.mli \ + compiler/sigs/protocol.mli \ + compiler/sigs/proto_environment.mli \ + compiler/sigs/register.mli + +COMPILER_PRECOMPILED_PACKAGES := \ + ${MINUTILS_PACKAGES} ${UTILS_PACKAGES} + +COMPILER_PRECOMPILED_SOURCE_DIRECTORIES := \ + ${UTILS_SOURCE_DIRECTORIES} compiler/sigs/ + +COMPILER_PRECOMPILED_OPENED_MODULES := Error_monad Hash Utils + +COMPILER_LIB_INTFS := \ + compiler/tezos_compiler.mli \ + compiler/embedded_cmis.mli \ + +COMPILER_LIB_IMPLS := \ + compiler/embedded_cmis.ml \ + compiler/tezos_compiler.ml \ + +COMPILER_IMPLS := \ + compiler_main.ml \ + +COMPILER_PACKAGES := \ + ${UTILS_PACKAGES} \ + compiler-libs.optcomp \ + lwt.unix \ + ocplib-endian \ + ocplib-ocamlres \ + unix \ + + +############################################################################ +## Node program +############################################################################ + +NODE_LIB_SOURCE_DIRECTORIES := \ + ${COMPILER_SOURCE_DIRECTORIES} \ + ${SRCDIR}/node/db ${SRCDIR}/node/net \ + ${SRCDIR}/node/updater ${SRCDIR}/node/shell \ + +NODE_SOURCE_DIRECTORIES := \ + ${NODE_LIB_SOURCE_DIRECTORIES} \ + ${SRCDIR}/node/main + +NODE_OPENED_MODULES := Error_monad Hash Utils + +NODE_LIB_INTFS := \ + \ + node/net/p2p_types.mli \ + node/net/p2p_io_scheduler.mli \ + node/net/p2p_connection.mli \ + node/net/p2p_connection_pool_types.mli \ + node/net/p2p_connection_pool.mli \ + node/net/p2p_welcome.mli \ + node/net/p2p_discovery.mli \ + node/net/p2p_maintenance.mli \ + node/net/p2p.mli \ + node/net/RPC_server.mli \ + \ + node/updater/fitness.mli \ + \ + node/db/store_sigs.mli \ + node/db/raw_store.mli \ + node/db/store_sigs.mli \ + node/db/store_helpers.mli \ + node/db/store.mli \ + \ + node/db/ir_funview.mli \ + node/db/persist.mli \ + node/db/context.mli \ + \ + node/updater/protocol.mli \ + node/updater/updater.mli \ + node/updater/proto_environment.mli \ + node/updater/register.mli \ + \ + node/shell/state.mli \ + node/shell/distributed_db_functors.mli \ + node/shell/distributed_db_message.mli \ + node/shell/distributed_db_metadata.mli \ + node/shell/distributed_db.mli \ + node/shell/prevalidator.mli \ + node/shell/validator.mli \ + \ + node/shell/node_rpc_services.mli \ + node/shell/node.mli \ + node/shell/node_rpc.mli \ + +# this includes single .mli for `node.top` +FULL_NODE_LIB_IMPLS := \ + \ + compiler/node_compiler_main.ml \ + \ + node/net/p2p_types.ml \ + node/net/p2p_io_scheduler.ml \ + node/net/p2p_connection.ml \ + node/net/p2p_connection_pool_types.ml \ + node/net/p2p_connection_pool.ml \ + node/net/p2p_welcome.ml \ + node/net/p2p_discovery.ml \ + node/net/p2p_maintenance.ml \ + node/net/p2p.ml \ + \ + node/net/RPC_server.ml \ + \ + node/updater/fitness.ml \ + \ + node/db/raw_store.ml \ + node/db/store_sigs.mli \ + node/db/store_helpers.ml \ + node/db/store.ml \ + \ + node/db/ir_funview.ml \ + node/db/persist.ml \ + node/db/context.ml \ + \ + node/updater/protocol.mli \ + node/updater/updater.ml \ + node/updater/environment.ml \ + node/updater/proto_environment.ml \ + node/updater/register.ml \ + \ + node/shell/state.ml \ + node/shell/distributed_db_functors.ml \ + node/shell/distributed_db_message.ml \ + node/shell/distributed_db_metadata.ml \ + node/shell/distributed_db.ml \ + node/shell/prevalidator.ml \ + node/shell/validator.ml \ + \ + node/shell/node_rpc_services.ml \ + node/shell/node.ml \ + node/shell/node_rpc.ml \ + +# this only includes .ml +NODE_LIB_IMPLS := $(filter-out ${NODE_LIB_INTFS}, ${FULL_NODE_LIB_IMPLS}) + +NODE_INTFS := \ + node/main/node_identity_file.mli \ + node/main/node_config_file.mli \ + node/main/node_shared_arg.mli \ + node/main/node_run_command.mli \ + node/main/node_config_command.mli \ + node/main/node_identity_command.mli \ + +NODE_IMPLS := \ + node/main/node_identity_file.ml \ + node/main/node_config_file.ml \ + node/main/node_shared_arg.ml \ + node/main/node_run_command.ml \ + node/main/node_config_command.ml \ + node/main/node_identity_command.ml \ + node_main.ml \ + +NODE_PACKAGES := \ + $(COMPILER_PACKAGES) \ + calendar \ + cmdliner \ + cohttp.lwt \ + dynlink \ + git \ + ipv6-multicast \ + irmin.unix \ + ocplib-resto.directory \ + +EMBEDDED_NODE_PROTOCOLS := \ + $(patsubst ${SRCDIR}/proto/%/,${SRCDIR}/proto/embedded_proto_%.cmxa, \ + $(filter-out ${SRCDIR}/proto/environment/, \ + $(subst TEZOS_PROTOCOL,,$(shell ls ${SRCDIR}/proto/*/TEZOS_PROTOCOL)))) + +############################################################################ +## Client program +############################################################################ + +# we do not include 'node/main' +CLIENT_SOURCE_DIRECTORIES := \ + ${NODE_LIB_SOURCE_DIRECTORIES} \ + ${SRCDIR}/client ${SRCDIR}/client/embedded + +CLIENT_OPENED_MODULES := Error_monad Hash Utils + +CLIENT_LIB_INTFS := \ + client/client_rpcs.mli \ + client/client_node_rpcs.mli \ + client/client_commands.mli \ + client/client_generic_rpcs.mli \ + client/client_helpers.mli \ + client/client_aliases.mli \ + client/client_tags.mli \ + client/client_keys.mli \ + client/client_protocols.mli \ + client/client_blocks.mli \ + client/client_network.mli \ + +CLIENT_LIB_IMPLS := \ + client/client_rpcs.ml \ + client/client_node_rpcs.ml \ + client/client_commands.ml \ + client/client_config.ml \ + client/client_generic_rpcs.ml \ + client/client_helpers.ml \ + client/client_aliases.ml \ + client/client_tags.ml \ + client/client_keys.ml \ + client/client_protocols.ml \ + client/client_blocks.ml \ + client/client_network.ml \ + +CLIENT_IMPLS := \ + client_main.ml + +CLIENT_PACKAGES := \ + ${NODE_PACKAGES} \ + magic-mime \ + +EMBEDDED_CLIENT_PROTOCOLS := \ + $(patsubst ${SRCDIR}/client/embedded/%/, \ + ${SRCDIR}/proto/client_embedded_proto_%.cmxa, \ + $(shell ls -d ${SRCDIR}/client/embedded/*/)) + +EMBEDDED_CLIENT_VERSIONS := \ + $(patsubst ${SRCDIR}/client/embedded/%/, \ + ${SRCDIR}/client/embedded/client_%.cmx, \ + $(shell ls -d ${SRCDIR}/client/embedded/*/)) + +############################################################################ +## Web-Client program +############################################################################ + +# we do not include 'node/main' +WEBCLIENT_SOURCE_DIRECTORIES := \ + ${NODE_LIB_SOURCE_DIRECTORIES} \ + ${SRCDIR}/client ${SRCDIR}/client/embedded + +WEBCLIENT_OPENED_MODULES := Error_monad Hash Utils + +WEBCLIENT_LIB_INTFS := \ + +WEBCLIENT_LIB_IMPLS := \ + client/webclient_version.ml \ + +WEBCLIENT_IMPLS := \ + webclient_static.ml \ + webclient_main.ml + +EMBEDDED_WEBCLIENT_VERSIONS := \ + $(patsubst ${SRCDIR}/client/embedded/%/, \ + ${SRCDIR}/client/embedded/webclient_%.cmx, \ + $(shell ls -d ${SRCDIR}/client/embedded/*/)) + diff --git a/test/.merlin b/test/.merlin deleted file mode 100644 index ce4f056ca..000000000 --- a/test/.merlin +++ /dev/null @@ -1,28 +0,0 @@ -REC -S . -B . -S ../src/minutils -B ../src/minutils -S ../src/utils -B ../src/utils -S ../src/node/db -B ../src/node/db -S ../src/node/net -B ../src/node/net -S ../src/node/updater -B ../src/node/updater -S ../src/node/shell -B ../src/node/shell -S ../src/proto -B ../src/proto -S ../src/client -B ../src/client -S ../src/client/embedded -B ../src/client/embedded -S ./lib -B ./lib -FLG -w -40 -PKG lwt -PKG sodium -PKG kaputt -PKG ipaddr \ No newline at end of file diff --git a/test/Makefile b/test/Makefile index ad1e869b5..38aa1ea52 100644 --- a/test/Makefile +++ b/test/Makefile @@ -1,353 +1,28 @@ -TESTS := \ - merkle \ - data-encoding \ - store context state \ - basic basic.sh \ - p2p-io-scheduler \ - p2p-connection \ - p2p-connection-pool - -all: test - -INCLUDES = $(patsubst %, -I %, $(SOURCE_DIRECTORIES) lib) -OCAMLFLAGS = \ - -g -safe-string -w -40 \ - ${INCLUDES} \ - $(patsubst %, -package %, $(PACKAGES)) \ - ${EXTRA_OCAMLFLAGS} - -SOURCE_DIRECTORIES := \ - lib \ -$(addprefix ../src/, \ - minutils \ +DIR := \ utils \ - compiler \ - node/db \ - node/net \ - node/updater \ - node/shell \ - proto \ -) + shell \ + p2p -PACKAGES := \ - base64 \ - calendar \ - cohttp.lwt \ - compiler-libs.optcomp \ - cstruct \ - dynlink \ - ezjsonm \ - git \ - ipv6-multicast \ - irmin.unix \ - lwt \ - lwt.unix \ - mtime.os \ - ocplib-endian \ - ocplib-ocamlres \ - ocplib-json-typed.bson \ - ocplib-resto.directory \ - sodium \ - unix \ - kaputt \ +all: build run -ifeq ($(strip ${COVERAGE}),yes) -PACKAGES += bisect_ppx.runtime -endif +.PHONY: build run test +build: + ${MAKE} -C lib build + ${MAKE} ${addprefix build-,${DIR}} +run: + ${MAKE} ${addprefix run-,${DIR}} + ${MAKE} run-basic.sh +clean: + ${MAKE} -C lib clean + ${MAKE} ${addprefix clean-,${DIR}} -############################################################################ -## External packages +${addprefix build-,${DIR}}: build-%: + ${MAKE} -C $* build +${addprefix run-,${DIR}}: run-%: + ${MAKE} -C $* run +${addprefix clean-,${DIR}}: clean-%: + ${MAKE} -C $* clean -NODELIB := \ - ../src/minutils.cmxa ../src/utils.cmxa \ - ../src/compiler.cmxa ../src/node.cmxa -CLIENTLIB := ../src/client.cmxa \ - $(patsubst ../src/client/embedded/%/, \ - ../src/proto/client_embedded_proto_%.cmxa, \ - $(shell ls -d ../src/client/embedded/*/)) \ - $(patsubst ../src/client/embedded/%/, \ - ../src/client/embedded/client_%.cmx, \ - $(shell ls -d ../src/client/embedded/*/)) - -${NODELIB} ${CLIENTLIB}: - ${MAKE} -C ../src $@ - -.PHONY: build-test run-test test -build-test: ${addprefix build-test-,${TESTS}} -run-test: - @$(patsubst %,${MAKE} run-test-% && , ${TESTS}) \ - echo && echo "Success" && echo -test: - @${MAKE} --no-print-directory build-test - @${MAKE} --no-print-directory run-test - -############################################################################ -## Store test program - -.PHONY:build-test-store run-test-store -build-test-store: test-store -run-test-store: - ./test-store - -TEST_STORE_INTFS = - -TEST_STORE_IMPLS = \ - lib/assert.ml \ - lib/test.ml \ - test_store.ml - -${TEST_STORE_IMPLS:.ml=.cmx}: ${NODELIB} -test-store: ${NODELIB} ${TEST_STORE_IMPLS:.ml=.cmx} - ocamlfind ocamlopt -linkall -linkpkg ${OCAMLFLAGS} -o $@ $^ - -clean:: - rm -f test-store - - -############################################################################ -## Context test program - -.PHONY:build-test-context run-test-context -build-test-context: test-context -run-test-context: - ./test-context - -TEST_CONTEXT_INTFS = - -TEST_CONTEXT_IMPLS = \ - lib/assert.ml \ - lib/test.ml \ - test_context.ml - -${TEST_CONTEXT_IMPLS:.ml=.cmx}: ${NODELIB} -test-context: ${NODELIB} ${TEST_CONTEXT_IMPLS:.ml=.cmx} - ocamlfind ocamlopt -linkall -linkpkg ${OCAMLFLAGS} -o $@ $^ - -clean:: - rm -f test-context - - -############################################################################ -## State test program - -.PHONY:build-test-state run-test-state -build-test-state: test-state -run-test-state: - ./test-state - -TEST_STATE_INTFS = - -TEST_STATE_IMPLS = \ - lib/assert.ml \ - lib/test.ml \ - test_state.ml - -${TEST_STATE_IMPLS:.ml=.cmx}: ${NODELIB} -test-state: ${NODELIB} ../src/proto/embedded_proto_demo.cmxa ${TEST_STATE_IMPLS:.ml=.cmx} - ocamlfind ocamlopt -linkall -linkpkg ${OCAMLFLAGS} -o $@ $^ - -clean:: - rm -f test-state - - -############################################################################ -## Basic-client-functionality test program - -.PHONY:build-test-basic.sh run-test-basic.sh -build-test-basic.sh: -run-test-basic.sh: +run-basic.sh: ./test-basic.sh - -.PHONY:build-test-basic run-test-basic -build-test-basic: test-basic -run-test-basic: - ./test-basic - -TEST_BASIC_INTFS = - -TEST_BASIC_IMPLS = \ - lib/assert.ml \ - lib/test.ml \ - test_basic.ml - -test-basic \ -${TEST_BASIC_IMPLS:.ml=.cmx}: \ - SOURCE_DIRECTORIES+=../src/client ../src/client/embedded/ - -${TEST_BASIC_IMPLS:.ml=.cmx}: ${NODELIB} ${CLIENTLIB} -test-basic: ${NODELIB} ${CLIENTLIB} ${TEST_BASIC_IMPLS:.ml=.cmx} - ocamlfind ocamlopt -linkall -linkpkg ${OCAMLFLAGS} -o $@ $^ - -clean:: - rm -f test-basic - -############################################################################ -## p2p test program - -.PHONY:build-test-p2p-io-scheduler run-test-p2p-io-scheduler -build-test-p2p-io-scheduler: test-p2p-io-scheduler -run-test-p2p-io-scheduler: - ./test-p2p-io-scheduler \ - --delay 20 --clients 8 \ - --max-upload-speed $$((1 << 18)) \ - --max-download-speed $$((1 << 20)) - -.PHONY:build-test-p2p-connection run-test-p2p-connection -build-test-p2p-connection: test-p2p-connection -run-test-p2p-connection: - ./test-p2p-connection - -.PHONY:build-test-p2p-connection-pool run-test-p2p-connection-pool -build-test-p2p-connection-pool: test-p2p-connection-pool -run-test-p2p-connection-pool: - ./test-p2p-connection-pool --clients 10 --repeat 5 - -TEST_P2P_IO_SCHEDULER_IMPLS = \ - lib/process.ml \ - test_p2p_io_scheduler.ml - -TEST_P2P_CONNECTION_IMPLS = \ - lib/process.ml \ - test_p2p_connection.ml - -TEST_P2P_CONNECTION_POOL_IMPLS = \ - lib/process.ml \ - test_p2p_connection_pool.ml - -${TEST_P2P_IO_SCHEDULER_IMPLS:.ml=.cmx}: ${NODELIB} -test-p2p-io-scheduler: ${NODELIB} ${TEST_P2P_IO_SCHEDULER_IMPLS:.ml=.cmx} - ocamlfind ocamlopt -linkall -linkpkg ${OCAMLFLAGS} -o $@ $^ - -${TEST_P2P_CONNECTION_IMPLS:.ml=.cmx}: ${NODELIB} -test-p2p-connection: ${NODELIB} ${TEST_P2P_CONNECTION_IMPLS:.ml=.cmx} - ocamlfind ocamlopt -linkall -linkpkg ${OCAMLFLAGS} -o $@ $^ - -${TEST_P2P_CONNECTION_POOL_IMPLS:.ml=.cmx}: ${NODELIB} -test-p2p-connection-pool: ${NODELIB} ${TEST_P2P_CONNECTION_POOL_IMPLS:.ml=.cmx} - ocamlfind ocamlopt -linkall -linkpkg ${OCAMLFLAGS} -o $@ $^ - -clean:: - -rm -f test-p2p-io_scheduler - -rm -f test-p2p-connection - -rm -f test-p2p-connection-pool - -############################################################################ -## lwt pipe test program - -build-test-lwt-pipe: test-lwt-pipe - -TEST_PIPE_IMPLS = \ - test_lwt_pipe.ml - -${TEST_BASIC_IMPLS:.ml=.cmx}: ${NODELIB} -test-lwt-pipe: ${NODELIB} ${TEST_PIPE_IMPLS:.ml=.cmx} - ocamlfind ocamlopt -linkall -linkpkg ${OCAMLFLAGS} -o $@ $^ - -clean:: - rm -f test-p2p - -############################################################################ -## Merkle test program - -.PHONY:build-test-merkle run-test-merkle -build-test-merkle: test-merkle -run-test-merkle: - ./test-merkle - -TEST_MERKLE_INTFS = - -TEST_MERKLE_IMPLS = \ - lib/assert.ml \ - lib/test.ml \ - test_merkle.ml - -${TEST_MERKLE_IMPLS:.ml=.cmx}: ${NODELIB} -test-merkle: ${NODELIB} ${TEST_MERKLE_IMPLS:.ml=.cmx} - ocamlfind ocamlopt -linkall -linkpkg ${OCAMLFLAGS} -o $@ $^ - -clean:: - rm -f test-merkle - - -############################################################################ -## data encoding test program - -.PHONY:build-test-data-encoding run-test-data-encoding -build-test-data-encoding: test-data-encoding -run-test-data-encoding: - ./test-data-encoding - -TEST_DATA_ENCODING_INTFS = - -TEST_DATA_ENCODING_IMPLS = \ - lib/assert.ml \ - lib/test.ml \ - test_data_encoding.ml - -${TEST_DATA_ENCODING_IMPLS:.ml=.cmx}: ${NODELIB} -test-data-encoding: ${NODELIB} ${TEST_DATA_ENCODING_IMPLS:.ml=.cmx} - ocamlfind ocamlopt -linkall -linkpkg ${OCAMLFLAGS} -o $@ $^ - -clean:: - rm -f test-data-encoding - -COVERAGESRCDIR= \ - -I ../src \ - -I ../src/client \ - -I ../src/client/embedded \ - -I ../src/client/embedded/alpha \ - -I ../src/client/embedded/alpha/mining \ - -I ../src/compiler \ - -I ../src/node \ - -I ../src/node/db \ - -I ../src/node/updater \ - -I ../src/node/net \ - -I ../src/node/shell \ - -I ../src/proto \ - -I ../src/proto/alpha \ - -I ../src/proto/demo \ - -I ../src/minutils \ - -I ../src/utils - -bisect: - bisect-ppx-report $(COVERAGESRCDIR) \ - -ignore-missing-files -html reports bisect*.out - -##### - -generate_hash: ../src/minutils/utils.cmx ../src/minutils/compare.cmx ../src/minutils/mBytes.cmx ../src/utils/base58.cmx ../src/minutils/hex_encode.cmx ../src/minutils/data_encoding.cmx ../src/utils/cli_entries.cmx ../src/utils/hash.cmx generate_hash.ml - ocamlfind ocamlopt -o $@ -linkpkg -package cstruct -package zarith -package ezjsonm -package sodium -package ocplib-json-typed.bson -package lwt.unix -package nocrypto -I ../src/utils/ -I ../src/minutils $^ - - -##### - -lib/assert.cmx: lib/assert.cmi -lib/assert.cmi: ../src/node/db/persist.cmi - -lib/process.cmx: lib/process.cmi -lib/test.cmx: lib/test.cmi - -############################################################################ -## Generic rules - -test.cmx: test.cmi - -%.cmx: %.ml - ocamlfind ocamlopt ${OCAMLFLAGS} -c $< - -%.cmo: %.ml - ocamlfind ocamlc ${OCAMLFLAGS} -c $< - -%.cmi: %.mli - ocamlfind ocamlc ${OCAMLFLAGS} -c $< - -clean:: - -rm -f *.cm* lib/*.cm* *.out *.o - --include .depend -.depend: $(wildcard *.ml *.mli lib/*.ml lib/*.mli) - ocamldep -I lib $^ > .depend - -clean:: - -rm .depend diff --git a/test/Makefile.shared b/test/Makefile.shared new file mode 100644 index 000000000..1b73ac005 --- /dev/null +++ b/test/Makefile.shared @@ -0,0 +1,90 @@ + +ifeq ($(strip ${SRCDIR}),) +$(error "Undefined value for $${SRCDIR}") +endif + +.PHONY: build run + +all: + @${MAKE} --no-print-directory build + @${MAKE} --no-print-directory run + +build: ${addprefix test-,${TESTS}} + +run: + @$(patsubst %,${MAKE} --no-print-directory run-test-% && , ${TESTS}) \ + echo && echo "Success" && echo + +############################################################################ + +-include ${SRCDIR}/Makefile.local +include ${SRCDIR}/Makefile.config +include ${SRCDIR}/Makefile.files + +COVERAGESRCDIR=$(patsubst %, -I %, $(SOURCE_DIRECTORIES)) + +############################################################################ +## External packages +############################################################################ + +TESTLIB := ${SRCDIR}/../test/lib/testlib.cmxa + +${TESTLIB}: $(shell find ${SRCDIR}/../test/lib -name \*.ml -or -name \*.mli) + ${MAKE} -C ${SRCDIR}/../test/lib testlib.cmxa + +############################################################################ +## External packages +############################################################################ + +MINUTILSLIB := ${SRCDIR}/minutils.cmxa +UTILSLIB := ${SRCDIR}/utils.cmxa +COMPILERLIB := ${SRCDIR}/compiler.cmxa +NODELIB := ${SRCDIR}/node.cmxa + +CLIENTLIB := ${SRCDIR}/client.cmxa \ + $(patsubst ${SRCDIR}/client/embedded/%/, \ + ${SRCDIR}/proto/client_embedded_proto_%.cmxa, \ + $(shell ls -d ${SRCDIR}/client/embedded/*/)) \ + $(patsubst ${SRCDIR}/client/embedded/%/, \ + ${SRCDIR}/client/embedded/client_%.cmx, \ + $(shell ls -d ${SRCDIR}/client/embedded/*/)) + +${MINUTILSLIB} ${UTILSLIB} ${COMPILERLIB} ${NODELIB} ${CLIENTLIB}: + ${MAKE} -C ${SRCDIR} $@ + +${SRCDIR}/minutils/%: ${MINUTILSLIB} +${SRCDIR}/utils/%: ${UTILSLIB} +${SRCDIR}/compiler/%: ${COMPILERLIB} +${SRCDIR}/node/%: ${NODELIB} +${SRCDIR}/client/%: ${CLIENTLIB} + +############################################################################ +## Generic rules +############################################################################ + +%.cmx: %.ml + @echo OCAMLOPT ${TARGET} $(notdir $@) + @$(OCAMLOPT) ${OCAMLFLAGS} -c $< + +%.cmo: %.ml + @echo OCAMLC ${TARGET} $(notdir $@) + @$(OCAMLC) ${OCAMLFLAGS} -c $< + +%.cmi: %.mli + @echo OCAMLOPT ${TARGET} $(notdir $@) + @$(OCAMLOPT) ${OCAMLFLAGS} -c $< + +## Cleaning + +.PHONY: clean partial-clean +clean:: partial-clean +partial-clean:: + -find \( -name \*.cm\* -or -name \*.cmp -or -name \*.out -or -name \*~ -or -name \*.o -or -name \*.a \) -delete + +-include .depend +.depend: $(shell find -name \*.ml -or -name \*.ml) + @echo OCAMLDEP "(test/$(notdir $(shell echo $$PWD)))" + @$(OCAMLDEP) -native $(INCLUDES) $^ > .depend + +clean:: + -rm .depend diff --git a/test/attic/test_p2p.ml b/test/attic/test_p2p.ml deleted file mode 100644 index 5d642cf2e..000000000 --- a/test/attic/test_p2p.ml +++ /dev/null @@ -1,151 +0,0 @@ -(* -ocamlfind ocamlopt \ - -package 'lwt,lwt.unix,lwt.log,ezjsonm,ocplib-endian,config-file,cstruct' \ - ../core/utils.cmx ../core/logs.cmx ../core/mMBytes.cmx ../core/json.cmx \ - netbits.cmx p2p.cmx test_p2p.ml -linkpkg \ - -o test_p2p && ./test_p2p -*) - -open Lwt -open P2p -open Netbits -open Printf - -let interval min max cb = - let rec loop acc n = - if n > max then List.rev acc - else loop ((n, cb n) :: acc) (n + 1) in - loop [] min - -let rec join_map acc = function - | [] -> return (List.rev acc) - | (i, t) :: ts -> t >>= fun v -> join_map ((i, v) :: acc) ts - -let show_peers creds net = - Printf.printf " - Network of %s\n%!" creds ; - let peers = peers net in - peers |> List.iter @@ fun peer -> - let addr, port, _ = peer_info peer net in - Printf.printf " * %s @ %s:%i\n%!" creds addr port - - -(* launch 15 peers who originally know all the others, make everyone - send toto, and wait for everyone to receive one toto *) -let toto () = - let known_peers = - interval 0 15 (fun i -> ("127.0.0.1", 4440 + i)) |> List.split |> snd - in - let net i = - bootstrap - { incoming_port = Some (4440 + i) ; - discovery_port = None ; - supported_versions = [ "TEST", 0, 0 ] ; - known_peers; - peers_file = sprintf "test_peers_toto_%d.json" i } - { max_packet_size = 10_000 ; - peer_answer_timeout = 2. ; - expected_connections = 5 ; - min_connections = 2 ; - max_connections = 20 ; - blacklist_time = 30. } - in - let nets = interval 0 15 (fun i -> net i) in - printf "---- Networks created\n%!" ; - join_map [] nets >>= fun nets -> - printf "---- Networks bootstrapped\n%!" ; - List.iter (fun (_, net) -> broadcast [ B (MBytes.of_string "TOTO") ] net) nets ; - printf "---- Messages sent\n%!" ; - let recv (i, net) = i, recv net >>= fun (_, m) -> - Printf.printf "user_%d received %s\n%!" i (Netbits.to_string m) ; - return m - in - let receptions = List.map recv nets in - join_map [] receptions >>= fun msgs -> - printf "---- Messages received\n%!" ; - let shutdowns = List.map (fun (i, net) -> i, shutdown net) nets in - join_map [] shutdowns >>= fun _ -> - printf "---- Networks shutdown\n%!" ; - return () - -(* launch 15 peers who originally know only one another, make everyone - connect to at least 10 others *) -let boot () = - let net i = - bootstrap - { incoming_port = Some (4440 + i) ; - discovery_port = None ; - supported_versions = [ "TEST", 0, 0 ] ; - known_peers = [ "127.0.0.1", 4440 + ((i + 1) mod 16) ] ; - peers_file = sprintf "test_peers_boot_%d.json" i } - { max_packet_size = 10_000 ; - peer_answer_timeout = 2. ; - expected_connections = 10 ; - min_connections = 2 ; - max_connections = 20 ; - blacklist_time = 30. } - in - let nets = interval 0 15 (fun i -> net i) in - printf "---- Networks created\n%!" ; - join_map [] nets >>= fun nets -> - printf "---- Networks bootstrapped\n%!" ; - List.iter (fun (i, net) -> show_peers (sprintf "user_%d" i) net) nets ; - let shutdowns = List.map (fun (i, net) -> i, shutdown net) nets in - join_map [] shutdowns >>= fun _ -> - printf "---- Networks shutdown\n%!" ; - return () - -(* the same as above, but five nodes have no input port, and some - known addresses are bad ones *) -let boot_with_unreachable () = - let net i = - bootstrap - { incoming_port = if i > 10 then None else Some (4440 + i) ; - discovery_port = None ; - supported_versions = [ "TEST", 0, 0 ] ; - known_peers = [ "127.0.0.1", 4440 + ((i + 1) mod 10) ; - "127.0.0.1", 9999 ] ; - peers_file = sprintf "test_peers_boot_%d.json" i } - { max_packet_size = 10_000 ; - peer_answer_timeout = 2. ; - expected_connections = 10 ; - min_connections = 5 ; - max_connections = 15 ; - blacklist_time = 30. } - in - let nets = interval 0 15 (fun i -> net i) in - printf "---- Networks created\n%!" ; - join_map [] nets >>= fun nets -> - printf "---- Networks bootstrapped\n%!" ; - List.iter (fun (i, net) -> show_peers (sprintf "user_%d" i) net) nets ; - let shutdowns = List.map (fun (i, net) -> i, shutdown net) nets in - join_map [] shutdowns >>= fun _ -> - printf "---- Networks shutdown\n%!" ; - return () - -(* connect to ten peers, only by using local discovery *) -let boot_by_discovery () = - let net i = - bootstrap - { incoming_port = Some (4440 + i) ; - discovery_port = Some 121212 ; - supported_versions = [ "TEST", 0, 0 ] ; - known_peers = [] ; - peers_file = sprintf "test_peers_boot_%d.json" i } - { max_packet_size = 10_000 ; - peer_answer_timeout = 2. ; - expected_connections = 10 ; - min_connections = 5 ; - max_connections = 15 ; - blacklist_time = 30. } - in - let nets = interval 0 15 (fun i -> net i) in - printf "---- Networks created\n%!" ; - join_map [] nets >>= fun nets -> - printf "---- Networks bootstrapped\n%!" ; - List.iter (fun (i, net) -> show_peers (sprintf "user_%d" i) net) nets ; - let shutdowns = List.map (fun (i, net) -> i, shutdown net) nets in - join_map [] shutdowns >>= fun _ -> - printf "---- Networks shutdown\n%!" ; - return () - -let _ = Lwt_main.run (boot_by_discovery ()) diff --git a/test/generate_hash.ml b/test/generate_hash.ml deleted file mode 100644 index 59b02413a..000000000 --- a/test/generate_hash.ml +++ /dev/null @@ -1,63 +0,0 @@ - -open Base58 -open Hash -open Lwt.Infix - -type generator = - Generator : { - encoding: 'h encoding ; - generator: string -> 'h list ; - } -> generator - -let generators = ref [] - -let register_generator - (type a) - (encoding : a encoding) - (generator : string -> a list) = - generators := Generator { encoding ; generator } :: !generators - -let register (type t) (enc: t Base58.encoding) = - register_generator enc - (fun s -> - match - enc.of_raw - (s ^ - Sodium.Random.Bytes.generate (enc.length - String.length s)) with - | Some x -> [x] - | None -> []) - -let generate ?alphabet request = - let rec find s = function - | [] -> [] - | Generator { encoding ; generator } :: generators -> - if not (Utils.has_prefix ~prefix:encoding.encoded_prefix s) then - find s generators - else - let prefix = - partial_decode ?alphabet request encoding.encoded_length in - let len = String.length prefix in - let ignored = String.length encoding.prefix in - if len <= ignored then - [] - else begin - (* assert (String.sub prefix 0 ignored = encoding.prefix) ; *) - let msg = String.sub prefix ignored (len - ignored) in - let msgs = generator msg in - List.map - (fun msg -> simple_encode encoding ?alphabet msg) - msgs - end in - find request !generators - - -let () = - register Hash.Block_hash.b58check_encoding ; - register Hash.Protocol_hash.b58check_encoding ; - if not (!Sys.interactive) then begin - for i = 1 to Array.length Sys.argv - 1 do - List.iter - (Format.printf "%S@.") - (generate Sys.argv.(i)) - done - end diff --git a/test/launch.sh b/test/launch.sh deleted file mode 100755 index 698af4b94..000000000 --- a/test/launch.sh +++ /dev/null @@ -1,9 +0,0 @@ -COMMAND='gnome-terminal' -COUNT=2 -for i in $(seq 1 $COUNT) -do - SUBCOMMAND="./tezos-node --net-addr :::$((9900 + i)) --local-discovery :::7732 --rpc-addr :::$((8800 + i)) --expected-connections $(($COUNT - 1)) --data-dir /tmp/tezos_$i" - COMMAND="$COMMAND --tab -e '$SUBCOMMAND'" -done -echo $COMMAND -eval $COMMAND diff --git a/test/launch_daemon.sh b/test/launch_daemon.sh deleted file mode 100755 index 0c9f348b8..000000000 --- a/test/launch_daemon.sh +++ /dev/null @@ -1,19 +0,0 @@ -#! /bin/sh - -set -e - -DIR=$(dirname "$0") -cd "${DIR}" - -CLIENT_DIR=$(mktemp -d /tmp/tezos_client.XXXXXXXXXX) - -cleanup() { - rm -fr ${CLIENT_DIR} -} -trap cleanup EXIT QUIT INT - -# export LWT_LOG="client.endorsement -> info; client.mining -> info" - -CLIENT="../tezos-client -base-dir ${CLIENT_DIR}" -${CLIENT} bootstrap -${CLIENT} launch daemon $@ diff --git a/test/lib/.merlin b/test/lib/.merlin new file mode 100644 index 000000000..3a9326627 --- /dev/null +++ b/test/lib/.merlin @@ -0,0 +1,23 @@ +REC +S . +B . +S ../../src/minutils +B ../../src/minutils +S ../../src/utils +B ../../src/utils +S ../../src/node/net +B ../../src/node/net +S ../../src/node/db +B ../../src/node/db +S ../../src/node/updater +B ../../src/node/updater +S ../../src/node/shell +B ../../src/node/shell +S ../lib +B ../lib +FLG -open Error_monad -open Hash -open Utils +FLG -w -40 +PKG lwt +PKG sodium +PKG kaputt +PKG ipaddr diff --git a/test/lib/Makefile b/test/lib/Makefile new file mode 100644 index 000000000..d7ed5a6b3 --- /dev/null +++ b/test/lib/Makefile @@ -0,0 +1,32 @@ + +SRCDIR=../../src + +build: testlib.cmxa + +TESTS := +include ../Makefile.shared + +SOURCE_DIRECTORIES := ${NODE_SOURCE_DIRECTORIES} ../lib + +PACKAGES := \ + ${NODE_PACKAGES} \ + kaputt \ + +OPENED_MODULES := ${NODE_OPENED_MODULES} + +TESTLIB_INTFS := \ + process.mli \ + test.mli \ + assert.mli \ + node_helpers.mli \ + +TESTLIB_IMPLS := \ + process.ml \ + test.ml \ + assert.ml \ + node_helpers.ml \ + +${TESTLIB_IMPLS:.ml=.cmx} ${TESTLIB_INTFS:.mli=.cmi}: TARGET="(testlib.cmxa)" +testlib.cmxa: ${TESTLIB_IMPLS:.ml=.cmx} + @echo LINK $(notdir $@) + @${OCAMLOPT} ${OCAMLFLAGS} -a -o $@ $^ diff --git a/test/lib/assert.ml b/test/lib/assert.ml index 9a1925f9f..ee804e544 100644 --- a/test/lib/assert.ml +++ b/test/lib/assert.ml @@ -7,24 +7,31 @@ (* *) (**************************************************************************) +open Error_monad open Hash -open Kaputt.Abbreviations include Kaputt.Assertion +module Assert = Kaputt.Abbreviations.Assert + let format_msg = function None -> None | Some msg -> Some (msg ^ "\n") -let is_error ?(msg="") x = - match x with +let is_error ?(msg="") = function | Error _ -> () | Ok _ -> fail "Error _" "Ok _" msg -let is_ok ?(msg="") x = - match x with +let contain_error ?(msg="") ~f = function + | Ok _ -> fail "Error _" "Ok _" msg + | Error error when not (List.exists f error) -> + let error_str = Format.asprintf "%a" pp_print_error error in + fail "" error_str msg + | _ -> () + +let is_ok ?(msg="") = function | Ok _ -> () | Error _ -> fail "Ok _" "Error _" msg -let equal_persist_list ?msg l1 l2 = +let equal_string_list_list ?msg l1 l2 = let msg = format_msg msg in let pr_persist l = let res = @@ -71,38 +78,12 @@ let equal_block_map ?msg ~eq map1 map2 = (fun (h1, _) -> Block_hash.to_string h1) b1 b2 -let equal_operation ?msg op1 op2 = - let msg = format_msg msg in - let eq op1 op2 = - match op1, op2 with - | None, None -> true - | Some op1, Some op2 -> - Store.Operation.equal op1 op2 - | _ -> false in - let prn = function - | None -> "none" - | Some op -> Hash.Operation_hash.to_hex (Store.Operation.hash op) in - Assert.equal ?msg ~prn ~eq op1 op2 - -let equal_block ?msg st1 st2 = - let msg = format_msg msg in - let eq st1 st2 = - match st1, st2 with - | None, None -> true - | Some st1, Some st2 -> Store.Block_header.equal st1 st2 - | _ -> false in - let prn = function - | None -> "none" - | Some st -> - Hash.Block_hash.to_hex (Store.Block_header.hash st) in - Assert.equal ?msg ~prn ~eq st1 st2 - let equal_result ?msg r1 r2 ~equal_ok ~equal_err = let msg = format_msg msg in match r1, r2 with | Ok r1, Ok r2 -> equal_ok ?msg r1 r2 | Error e1, Error e2 -> equal_err ?msg e1 e2 - | Ok r, Error e | Error e, Ok r -> + | Ok _, Error _ | Error _, Ok _ -> Assert.fail_msg "Results are not the same" let equal_exn ?msg exn1 exn2 = diff --git a/test/lib/assert.mli b/test/lib/assert.mli index a2917b304..1f4e15249 100644 --- a/test/lib/assert.mli +++ b/test/lib/assert.mli @@ -9,24 +9,27 @@ open Hash open Error_monad -include (module type of struct include Kaputt.Assertion end) +include module type of Kaputt.Assertion + +val format_msg : string option -> string option val is_ok : ?msg:string -> 'a tzresult -> unit val is_error : ?msg:string -> 'a tzresult -> unit +val contain_error : ?msg:string -> f:(error -> bool) -> 'a tzresult -> unit val fail_msg : ('a, Format.formatter, unit, 'b) format4 -> 'a val fail : string -> string -> ('a, Format.formatter, unit, 'b) format4 -> 'a -val equal_persist_list : - ?msg:string -> Persist.key list -> Persist.key list -> unit - val equal_block_hash_list : ?msg:string -> Block_hash.t list -> Block_hash.t list -> unit val equal_string_list : ?msg:string -> string list -> string list -> unit +val equal_string_list_list : + ?msg:string -> string list list -> string list list -> unit + val equal_string_option : ?msg:string -> string option -> string option -> unit val equal_error_monad : @@ -39,18 +42,6 @@ val equal_block_map : ?msg:string -> eq:('a -> 'a -> bool) -> 'a Block_hash.Map.t -> 'a Block_hash.Map.t -> unit -val equal_operation : - ?msg:string -> - State.Operation.t option -> - State.Operation.t option -> - unit - -val equal_block : - ?msg:string -> - Store.Block_header.t option -> - Store.Block_header.t option -> - unit - val equal_result : ?msg:string -> ('a, 'b) result -> diff --git a/test/lib/node_helpers.ml b/test/lib/node_helpers.ml new file mode 100644 index 000000000..576fd9fdd --- /dev/null +++ b/test/lib/node_helpers.ml @@ -0,0 +1,70 @@ +(**************************************************************************) +(* *) +(* Copyright (c) 2014 - 2016. *) +(* Dynamic Ledger Solutions, Inc. *) +(* *) +(* All rights reserved. No warranty, explicit or implicit, provided. *) +(* *) +(**************************************************************************) + +exception Node_exited_prematurely + +let handle_error res log_file_name = + match res with + | 0, _ -> + () + | pid, Unix.WEXITED x -> + Printf.eprintf "Wait: %d, exit %d\n\nDumping log:\n\n%!" pid x ; + ignore (Sys.command (Printf.sprintf "cat %s" log_file_name) : int) ; + raise Node_exited_prematurely + | pid, Unix.WSIGNALED x -> + Printf.eprintf "Wait: %d, signaled %d\n\nDumping log:\n\n%!" pid x ; + ignore (Sys.command (Printf.sprintf "cat %s" log_file_name) : int) ; + raise Node_exited_prematurely + | pid, Unix.WSTOPPED x -> + Printf.eprintf "Wait: %d, stopped %d\n\nDumping log:\n\n%!" pid x ; + ignore (Sys.command (Printf.sprintf "cat %s" log_file_name) : int) ; + raise Node_exited_prematurely + + +let fork_node ?(timeout = 4) ?(port = 18732) ?sandbox () = + let data_dir = + Printf.sprintf + "%s/tezos_node_%6X" + (Filename.get_temp_dir_name ()) + (Random.int 0xFF_FF_FF) in + let log_file_name, log_file = + Filename.open_temp_file "tezos_node_" ".log" in + let log_fd = Unix.descr_of_out_channel log_file in + let null_fd = Unix.(openfile "/dev/null" [O_RDONLY] 0o644) in + let pid = + Unix.create_process + Filename.(concat (dirname (Sys.getcwd ())) "tezos-node") + [| "tezos-node" ; + "run" ; + "--data-dir"; data_dir ; + (match sandbox with + | None -> "--sandbox" + | Some path -> "--sandbox=" ^ path); + "--rpc-addr"; "[::]:" ^ string_of_int port |] + null_fd log_fd log_fd in + Printf.printf "Created node, pid: %d, log: %s\n%!" pid log_file_name ; + Printf.printf "Waiting %d seconds for its initialisation\n%!" timeout ; + Unix.sleep timeout ; + match Unix.waitpid [Unix.WNOHANG] pid with + | 0, _ -> + Pervasives.at_exit begin fun () -> + begin + match Unix.waitpid [Unix.WNOHANG] pid with + | 0, _ -> + Unix.kill pid Sys.sigkill ; + Unix.sleep 1 + | res -> + handle_error res log_file_name + end ; + ignore (Sys.command (Printf.sprintf "rm -fr \"%s\"" data_dir)) + end ; + pid + | res -> + handle_error res log_file_name ; + 0 diff --git a/test/lib/node_helpers.mli b/test/lib/node_helpers.mli new file mode 100644 index 000000000..802439978 --- /dev/null +++ b/test/lib/node_helpers.mli @@ -0,0 +1,16 @@ +(**************************************************************************) +(* *) +(* Copyright (c) 2014 - 2016. *) +(* Dynamic Ledger Solutions, Inc. *) +(* *) +(* All rights reserved. No warranty, explicit or implicit, provided. *) +(* *) +(**************************************************************************) + +val fork_node: + ?timeout:int -> ?port:int -> ?sandbox:string -> unit -> int +(** [fork_node ()] forks a node in sandbox mode listening to rpc on + `localhost:port` (where the default port is 18732) and returns the + PID of the forked process. It waits `timeout` seconds (default 4) + before to return and it may fails with an exception whenever the node + died during the wait. *) diff --git a/test/lib/process.ml b/test/lib/process.ml index 5a314237d..979f741c1 100644 --- a/test/lib/process.ml +++ b/test/lib/process.ml @@ -74,3 +74,4 @@ let rec wait processes = (fun () -> Lwt.join processes) (fun _ -> Lwt.return_unit) >>= fun () -> Pervasives.exit 2) + diff --git a/test/lib/test.ml b/test/lib/test.ml index 3ca2d85c6..ebd78d6a4 100644 --- a/test/lib/test.ml +++ b/test/lib/test.ml @@ -7,7 +7,7 @@ (* *) (**************************************************************************) -open Kaputt.Abbreviations +module Test = Kaputt.Abbreviations.Test let keep_dir = try ignore (Sys.getenv "KEEPDIR") ; true with _ -> false diff --git a/test/p2p/.merlin b/test/p2p/.merlin new file mode 100644 index 000000000..13537fd39 --- /dev/null +++ b/test/p2p/.merlin @@ -0,0 +1,17 @@ +REC +S . +B . +S ../../src/minutils +B ../../src/minutils +S ../../src/utils +B ../../src/utils +S ../../src/node/net +B ../../src/node/net +S ../lib +B ../lib +FLG -open Error_monad -open Hash -open Utils +FLG -w -40 +PKG lwt +PKG sodium +PKG kaputt +PKG ipaddr diff --git a/test/p2p/Makefile b/test/p2p/Makefile new file mode 100644 index 000000000..0523a3392 --- /dev/null +++ b/test/p2p/Makefile @@ -0,0 +1,77 @@ + +SRCDIR=../../src + +TESTS := \ + p2p-connection \ + p2p-connection-pool \ + p2p-io-scheduler \ + +include ../Makefile.shared + +SOURCE_DIRECTORIES := ${NODE_SOURCE_DIRECTORIES} ../lib + +LIB := ${MINUTILSLIB} ${UTILSLIB} ${COMPILERLIB} ${NODELIB} ${TESTLIB} + +PACKAGES := \ + ${NODE_PACKAGES} \ + kaputt \ + +OPENED_MODULES := ${NODE_OPENED_MODULES} + +############################################################################ +## P2p_connection + +.PHONY:run-test-p2p-connection +run-test-p2p-connection: + @echo + ./test-p2p-connection + +TEST_CONNECTION_IMPLS := \ + test_p2p_connection.ml + +test-p2p-connection: ${LIB} ${TEST_CONNECTION_IMPLS:.ml=.cmx} + @echo LINK $(notdir $@) + @${OCAMLOPT} -linkall -linkpkg ${OCAMLFLAGS} -o $@ $^ + +clean:: + rm -f test-p2p-connection + +############################################################################ +## P2p_connection_pool + +.PHONY:run-test-p2p-connection-pool +run-test-p2p-connection-pool: + @echo + ./test-p2p-connection-pool --clients 10 --repeat 5 + +TEST_CONNECTION_POOL_IMPLS := \ + test_p2p_connection_pool.ml + +test-p2p-connection-pool: ${LIB} ${TEST_CONNECTION_POOL_IMPLS:.ml=.cmx} + @echo LINK $(notdir $@) + @${OCAMLOPT} -linkall -linkpkg ${OCAMLFLAGS} -o $@ $^ + +clean:: + rm -f test-p2p-connection-pool + +############################################################################ +## P2p_io_scheduler + +.PHONY:run-test-p2p-io-scheduler +run-test-p2p-io-scheduler: + @echo + ./test-p2p-io-scheduler \ + --delay 5 --clients 8 \ + --max-upload-speed $$((1 << 18)) \ + --max-download-speed $$((1 << 20)) + +TEST_IO_SCHEDULER_IMPLS := \ + test_p2p_io_scheduler.ml + +test-p2p-io-scheduler: ${LIB} ${TEST_IO_SCHEDULER_IMPLS:.ml=.cmx} + @echo LINK $(notdir $@) + @${OCAMLOPT} -linkall -linkpkg ${OCAMLFLAGS} -o $@ $^ + +clean:: + rm -f test-p2p-io-scheduler + diff --git a/test/test_p2p_connection.ml b/test/p2p/test_p2p_connection.ml similarity index 95% rename from test/test_p2p_connection.ml rename to test/p2p/test_p2p_connection.ml index 396292630..0a14e6f8b 100644 --- a/test/test_p2p_connection.ml +++ b/test/p2p/test_p2p_connection.ml @@ -99,7 +99,7 @@ let bytes_encoding = Data_encoding.Variable.bytes let server main_socket = let sched = P2p_io_scheduler.create ~read_buffer_size:(1 lsl 12) () in (* Low-level test. *) - raw_accept sched main_socket >>= fun (fd, point) -> + raw_accept sched main_socket >>= fun (fd, _point) -> lwt_log_notice "Low_level" >>= fun () -> P2p_io_scheduler.write fd simple_msg >>=? fun () -> P2p_io_scheduler.close fd >>=? fun _ -> @@ -112,26 +112,26 @@ let server main_socket = P2p_connection.kick auth_fd >>= fun () -> lwt_log_notice "Kick OK" >>= fun () -> (* Let's be rejected. *) - accept sched main_socket >>=? fun (info, auth_fd) -> + accept sched main_socket >>=? fun (_info, auth_fd) -> P2p_connection.accept auth_fd bytes_encoding >>= fun conn -> assert (is_rejected conn) ; lwt_log_notice "Kicked OK" >>= fun () -> (* Accept and send a single message. *) - accept sched main_socket >>=? fun (info, auth_fd) -> + accept sched main_socket >>=? fun (_info, auth_fd) -> lwt_log_notice "Single" >>= fun () -> P2p_connection.accept auth_fd bytes_encoding >>=? fun conn -> P2p_connection.write_sync conn simple_msg >>=? fun () -> P2p_connection.close conn >>= fun _stat -> lwt_log_notice "Single OK" >>= fun () -> (* Accept and send a single message, while the client expected 2. *) - accept sched main_socket >>=? fun (info, auth_fd) -> + accept sched main_socket >>=? fun (_info, auth_fd) -> lwt_log_notice "Early close (read)" >>= fun () -> P2p_connection.accept auth_fd bytes_encoding >>=? fun conn -> P2p_connection.write_sync conn simple_msg >>=? fun () -> P2p_connection.close conn >>= fun _stat -> lwt_log_notice "Early close (read) OK" >>= fun () -> (* Accept and wait for the client to close the connection. *) - accept sched main_socket >>=? fun (info, auth_fd) -> + accept sched main_socket >>=? fun (_info, auth_fd) -> lwt_log_notice "Early close (write)" >>= fun () -> P2p_connection.accept auth_fd bytes_encoding >>=? fun conn -> P2p_connection.close conn >>= fun _stat -> @@ -161,14 +161,14 @@ let client addr port = (* let's exchange a simple message. *) connect sched addr port id2 >>=? fun auth_fd -> P2p_connection.accept auth_fd bytes_encoding >>=? fun conn -> - P2p_connection.read conn >>=? fun (msg_size, msg) -> + P2p_connection.read conn >>=? fun (_msg_size, msg) -> assert (MBytes.compare simple_msg msg = 0) ; P2p_connection.close conn >>= fun _stat -> lwt_log_notice "Simple OK" >>= fun () -> (* let's detect a closed connection on `read`. *) connect sched addr port id2 >>=? fun auth_fd -> P2p_connection.accept auth_fd bytes_encoding >>=? fun conn -> - P2p_connection.read conn >>=? fun (msg_size, msg) -> + P2p_connection.read conn >>=? fun (_msg_size, msg) -> assert (MBytes.compare simple_msg msg = 0) ; P2p_connection.read conn >>= fun msg -> assert (is_connection_closed msg) ; diff --git a/test/test_p2p_connection_pool.ml b/test/p2p/test_p2p_connection_pool.ml similarity index 98% rename from test/test_p2p_connection_pool.ml rename to test/p2p/test_p2p_connection_pool.ml index 01f9bd2f0..9d1206f17 100644 --- a/test/test_p2p_connection_pool.ml +++ b/test/p2p/test_p2p_connection_pool.ml @@ -190,7 +190,7 @@ let spec = Arg.[ let main () = let open Utils in Logging.init Stderr >>= fun () -> - let anon_fun num_peers = raise (Arg.Bad "No anonymous argument.") in + let anon_fun _num_peers = raise (Arg.Bad "No anonymous argument.") in let usage_msg = "Usage: %s .\nArguments are:" in Arg.parse spec anon_fun usage_msg ; let ports = !port -- (!port + !clients - 1) in diff --git a/test/test_p2p_io_scheduler.ml b/test/p2p/test_p2p_io_scheduler.ml similarity index 97% rename from test/test_p2p_io_scheduler.ml rename to test/p2p/test_p2p_io_scheduler.ml index 2319964a7..ce6ba7872 100644 --- a/test/test_p2p_io_scheduler.ml +++ b/test/p2p/test_p2p_io_scheduler.ml @@ -34,7 +34,7 @@ let rec listen ?port addr = end let accept main_socket = - Lwt_unix.accept main_socket >>= fun (fd, sockaddr) -> + Lwt_unix.accept main_socket >>= fun (fd, _sockaddr) -> return fd let rec accept_n main_socket n = @@ -121,7 +121,7 @@ let rec send conn nb_simple_msgs = P2p_io_scheduler.write conn msg >>=? fun () -> send conn nb_simple_msgs -let client ?max_upload_speed ?write_queue_size addr port time n = +let client ?max_upload_speed ?write_queue_size addr port time _n = let sched = P2p_io_scheduler.create ?max_upload_speed ?write_queue_size ~read_buffer_size:(1 lsl 12) () in @@ -215,7 +215,7 @@ let spec = ] let () = - let anon_fun num_peers = raise (Arg.Bad "No anonymous argument.") in + let anon_fun _num_peers = raise (Arg.Bad "No anonymous argument.") in let usage_msg = "Usage: %s .\nArguments are:" in Arg.parse spec anon_fun usage_msg diff --git a/test/shell/.merlin b/test/shell/.merlin new file mode 100644 index 000000000..3a9326627 --- /dev/null +++ b/test/shell/.merlin @@ -0,0 +1,23 @@ +REC +S . +B . +S ../../src/minutils +B ../../src/minutils +S ../../src/utils +B ../../src/utils +S ../../src/node/net +B ../../src/node/net +S ../../src/node/db +B ../../src/node/db +S ../../src/node/updater +B ../../src/node/updater +S ../../src/node/shell +B ../../src/node/shell +S ../lib +B ../lib +FLG -open Error_monad -open Hash -open Utils +FLG -w -40 +PKG lwt +PKG sodium +PKG kaputt +PKG ipaddr diff --git a/test/shell/Makefile b/test/shell/Makefile new file mode 100644 index 000000000..bff9b58aa --- /dev/null +++ b/test/shell/Makefile @@ -0,0 +1,74 @@ + +SRCDIR=../../src + +TESTS := \ + store \ + state \ + context \ + +include ../Makefile.shared + +SOURCE_DIRECTORIES := ${NODE_SOURCE_DIRECTORIES} ../lib + +LIB := ${MINUTILSLIB} ${UTILSLIB} ${COMPILERLIB} ${NODELIB} ${EMBEDDED_NODE_PROTOCOLS} ${TESTLIB} + +PACKAGES := \ + ${NODE_PACKAGES} \ + kaputt \ + +OPENED_MODULES := ${NODE_OPENED_MODULES} + +############################################################################ +## Store + +.PHONY:run-test-store +run-test-store: + @echo + ./test-store + +TEST_STORE_IMPLS := \ + test_store.ml + +test-store: ${LIB} ${TEST_STORE_IMPLS:.ml=.cmx} + @echo LINK $(notdir $@) + @${OCAMLOPT} -linkall -linkpkg ${OCAMLFLAGS} -o $@ $^ + +clean:: + rm -f test-store + +############################################################################ +## State + +.PHONY:run-test-state +run-test-state: + @echo + ./test-state + +TEST_STATE_IMPLS := \ + test_state.ml + +test-state: ${LIB} ${TEST_STATE_IMPLS:.ml=.cmx} + @echo LINK $(notdir $@) + @${OCAMLOPT} -linkall -linkpkg ${OCAMLFLAGS} -o $@ $^ + +clean:: + rm -f test-state + +############################################################################ +## Context + +.PHONY:run-test-context +run-test-context: + @echo + ./test-context + +TEST_CONTEXT_IMPLS := \ + test_context.ml + +test-context: ${LIB} ${TEST_CONTEXT_IMPLS:.ml=.cmx} + @echo LINK $(notdir $@) + @${OCAMLOPT} -linkall -linkpkg ${OCAMLFLAGS} -o $@ $^ + +clean:: + rm -f test-context + diff --git a/test/test_context.ml b/test/shell/test_context.ml similarity index 95% rename from test/test_context.ml rename to test/shell/test_context.ml index 0e36c908e..f0afffe63 100644 --- a/test/test_context.ml +++ b/test/shell/test_context.ml @@ -178,18 +178,18 @@ let test_list idx = set ctxt ["f";] (MBytes.of_string "Avril") >>= fun ctxt -> set ctxt ["g"; "h"] (MBytes.of_string "Avril") >>= fun ctxt -> list ctxt [[]] >>= fun l -> - Assert.equal_persist_list ~msg:__LOC__ [["a"];["f"];["g"]] l ; + Assert.equal_string_list_list ~msg:__LOC__ [["a"];["f"];["g"]] l ; list ctxt [["a"]] >>= fun l -> - Assert.equal_persist_list + Assert.equal_string_list_list ~msg:__LOC__ [["a";"b"]; ["a";"c"]; ["a";"d"]] l ; list ctxt [["f"]] >>= fun l -> - Assert.equal_persist_list ~msg:__LOC__ [] l ; + Assert.equal_string_list_list ~msg:__LOC__ [] l ; list ctxt [["g"]] >>= fun l -> - Assert.equal_persist_list ~msg:__LOC__ [["g";"h"]] l ; + Assert.equal_string_list_list ~msg:__LOC__ [["g";"h"]] l ; list ctxt [["i"]] >>= fun l -> - Assert.equal_persist_list ~msg:__LOC__ [] l ; + Assert.equal_string_list_list ~msg:__LOC__ [] l ; list ctxt [["a"];["g"]] >>= fun l -> - Assert.equal_persist_list ~msg:__LOC__ + Assert.equal_string_list_list ~msg:__LOC__ [["a"; "b"]; ["a"; "c"]; ["a"; "d"]; ["g"; "h"]] l ; Lwt.return () diff --git a/test/test_state.ml b/test/shell/test_state.ml similarity index 94% rename from test/test_state.ml rename to test/shell/test_state.ml index 9b14159d3..56c6e52df 100644 --- a/test/test_state.ml +++ b/test/shell/test_state.ml @@ -61,7 +61,7 @@ let operation op = op, Data_encoding.Binary.to_bytes Store.Operation.encoding op -let block state ?(operations = []) pred_hash pred name : Store.Block_header.t = +let block _state ?(operations = []) pred_hash pred name : Store.Block_header.t = let operations = Operation_list_list_hash.compute [Operation_list_hash.compute operations] in @@ -74,15 +74,41 @@ let block state ?(operations = []) pred_hash pred name : Store.Block_header.t = proto = MBytes.of_string name ; } +let equal_operation ?msg op1 op2 = + let msg = Assert.format_msg msg in + let eq op1 op2 = + match op1, op2 with + | None, None -> true + | Some op1, Some op2 -> + Store.Operation.equal op1 op2 + | _ -> false in + let prn = function + | None -> "none" + | Some op -> Hash.Operation_hash.to_hex (Store.Operation.hash op) in + Assert.equal ?msg ~prn ~eq op1 op2 + +let equal_block ?msg st1 st2 = + let msg = Assert.format_msg msg in + let eq st1 st2 = + match st1, st2 with + | None, None -> true + | Some st1, Some st2 -> Store.Block_header.equal st1 st2 + | _ -> false in + let prn = function + | None -> "none" + | Some st -> + Hash.Block_hash.to_hex (Store.Block_header.hash st) in + Assert.equal ?msg ~prn ~eq st1 st2 + let build_chain state tbl otbl pred names = Lwt_list.fold_left_s (fun (pred_hash, pred) name -> begin - let oph, op, bytes = operation name in + let oph, op, _bytes = operation name in State.Operation.store state oph op >>= fun created -> Assert.is_true ~msg:__LOC__ created ; State.Operation.read_opt state oph >>= fun op' -> - Assert.equal_operation ~msg:__LOC__ (Some op) op' ; + equal_operation ~msg:__LOC__ (Some op) op' ; State.Operation.mark_invalid state oph [] >>= fun store_invalid -> Assert.is_true ~msg:__LOC__ store_invalid ; Hashtbl.add otbl name (oph, Error []) ; @@ -91,7 +117,7 @@ let build_chain state tbl otbl pred names = State.Block_header.store state hash block >>= fun created -> Assert.is_true ~msg:__LOC__ created ; State.Block_header.read_opt state hash >>= fun block' -> - Assert.equal_block ~msg:__LOC__ (Some block) block' ; + equal_block ~msg:__LOC__ (Some block) block' ; State.Block_header.mark_invalid state hash [] >>= fun store_invalid -> Assert.is_true ~msg:__LOC__ store_invalid ; Hashtbl.add tbl name (hash, block) ; @@ -105,7 +131,7 @@ let build_chain state tbl otbl pred names = names >>= fun _ -> Lwt.return () -let block state ?(operations = []) (pred: State.Valid_block.t) name +let block _state ?(operations = []) (pred: State.Valid_block.t) name : State.Block_header.t = let operations = Operation_list_list_hash.compute @@ -122,11 +148,11 @@ let build_valid_chain state tbl vtbl otbl pred names = Lwt_list.fold_left_s (fun pred name -> begin - let oph, op, bytes = operation name in + let oph, op, _bytes = operation name in State.Operation.store state oph op >>= fun created -> Assert.is_true ~msg:__LOC__ created ; State.Operation.read_opt state oph >>= fun op' -> - Assert.equal_operation ~msg:__LOC__ (Some op) op' ; + equal_operation ~msg:__LOC__ (Some op) op' ; Hashtbl.add otbl name (oph, Ok op) ; let block = block state ~operations:[oph] pred name in let hash = Store.Block_header.hash block in @@ -134,7 +160,7 @@ let build_valid_chain state tbl vtbl otbl pred names = Assert.is_true ~msg:__LOC__ created ; State.Operation_list.store_all state hash [[oph]] >>= fun () -> State.Block_header.read_opt state hash >>= fun block' -> - Assert.equal_block ~msg:__LOC__ (Some block) block' ; + equal_block ~msg:__LOC__ (Some block) block' ; Hashtbl.add tbl name (hash, block) ; Lwt.return (Proto.parse_block block pred.timestamp) >>=? fun block -> Proto.apply pred.context block [] >>=? fun ctxt -> @@ -168,10 +194,10 @@ let build_example_tree net = let chain = [ "C1" ; "C2" ; "C3" ; "C4" ; "C5" ; "C6" ; "C7" ; "C8" ] in build_chain net tbl otbl b7 chain >>= fun () -> let pending_op = "PP" in - let oph, op, bytes = operation pending_op in + let oph, op, _bytes = operation pending_op in State.Operation.store net oph op >>= fun _ -> State.Operation.read_opt net oph >>= fun op' -> - Assert.equal_operation ~msg:__LOC__ (Some op) op' ; + equal_operation ~msg:__LOC__ (Some op) op' ; Hashtbl.add otbl pending_op (oph, Ok op) ; Lwt.return (tbl, vtbl, otbl) @@ -221,11 +247,11 @@ let wrap_state_init f base_dir = init () >>=? fun state -> State.Net.create state genesis >>= fun net -> build_example_tree net >>= fun (block, vblock, operation) -> - f { state ; net ; block ; vblock ; operation ; init } >>=? fun s -> + f { state ; net ; block ; vblock ; operation ; init } >>=? fun () -> return () end -let test_init (s: state) = +let test_init (_ : state) = return () let test_read_operation (s: state) = diff --git a/test/test_store.ml b/test/shell/test_store.ml similarity index 97% rename from test/test_store.ml rename to test/shell/test_store.ml index daff9c572..9a057e2f2 100644 --- a/test/test_store.ml +++ b/test/shell/test_store.ml @@ -116,7 +116,7 @@ let bh3' = let check_block s h b = Block_header.Contents.read_opt (s, h) >>= function | Some b' when Store.Block_header.equal b b' -> Lwt.return_unit - | Some b' -> + | Some _ -> Printf.eprintf "Error while reading block %s\n%!" (Block_hash.to_hex h); exit 1 | None -> @@ -192,19 +192,19 @@ let test_generic_list (type t) Store.store s ["f";] (MBytes.of_string "Avril") >>= fun () -> Store.store s ["g"; "h"] (MBytes.of_string "Avril") >>= fun () -> list (module Store) s [] >>= fun l -> - Assert.equal_persist_list ~msg:__LOC__ + Assert.equal_string_list_list ~msg:__LOC__ [["a";"b"];["a";"c"];["a";"d";"e"];["f"];["g";"h"]] (List.sort compare l) ; list (module Store) s ["a"] >>= fun l -> - Assert.equal_persist_list + Assert.equal_string_list_list ~msg:__LOC__ [["a";"b"]; ["a";"c"]; ["a";"d";"e"]] (List.sort compare l) ; list (module Store) s ["f"] >>= fun l -> - Assert.equal_persist_list ~msg:__LOC__ [] l ; + Assert.equal_string_list_list ~msg:__LOC__ [] l ; list (module Store) s ["g"] >>= fun l -> - Assert.equal_persist_list ~msg:__LOC__ [["g";"h"]] (List.sort compare l) ; + Assert.equal_string_list_list ~msg:__LOC__ [["g";"h"]] (List.sort compare l) ; list (module Store) s ["i"] >>= fun l -> - Assert.equal_persist_list ~msg:__LOC__ [] l ; + Assert.equal_string_list_list ~msg:__LOC__ [] l ; Lwt.return_unit (** HashSet *) @@ -291,7 +291,7 @@ let test_single (type t) Assert.is_true ~msg:__LOC__ known ; Single.read_opt s >>= fun v' -> Assert.equal ~msg:__LOC__ (Some v) v' ; - Single.remove s >>= fun v' -> + Single.remove s >>= fun () -> Single.known s >>= fun known -> Assert.is_false ~msg:__LOC__ known ; Single.read_opt s >>= fun v' -> @@ -355,8 +355,9 @@ let test_subblock s = and v2 = (12, "Beurk.") in SubBlocksMap.store s bh1 v1 >>= fun () -> SubBlocksMap.store s bh2 v2 >>= fun () -> - SubBlocksMap.read_opt s bh1 >>= fun v1' -> SubBlocksMap.known s bh1 >>= fun known -> + SubBlocksMap.read_opt s bh1 >>= fun v1' -> + Assert.equal ~msg:__LOC__ (Some v1) v1' ; Assert.is_true ~msg:__LOC__ known ; let map = Block_hash.Map.empty diff --git a/test/test_basic.ml b/test/test_basic.ml deleted file mode 100644 index 8e3faa367..000000000 --- a/test/test_basic.ml +++ /dev/null @@ -1,212 +0,0 @@ -(**************************************************************************) -(* *) -(* Copyright (c) 2014 - 2016. *) -(* Dynamic Ledger Solutions, Inc. *) -(* *) -(* All rights reserved. No warranty, explicit or implicit, provided. *) -(* *) -(**************************************************************************) - -open Client_embedded_proto_alpha -open Client_alpha -open Tezos_context -open Error_monad -open Hash - -let () = - Random.self_init () ; - Unix.chdir (Filename.dirname Sys.executable_name) - -let cctxt = - let log channel msg = match channel with - | "stdout" -> - print_endline msg ; - Lwt.return () - | "stderr" -> - prerr_endline msg ; - Lwt.return () - | _ -> Lwt.return () in - Client_commands.make_context log - -let should_fail f t = - t >>= function - | Ok _ -> failwith "Expected error found success." - | Error error -> - if not (List.exists f error) then - failwith "@[Unexpected error@ %a@]" pp_print_error error - else - return () - -let fork_node () = - let init_timeout = 4 in - let data_dir = - Printf.sprintf - "%s/tezos_node_%6X" - (Filename.get_temp_dir_name ()) - (Random.int 0xFF_FF_FF) in - let log_file_name, log_file = Filename.open_temp_file "tezos_node_" ".log" in - let log_fd = Unix.descr_of_out_channel log_file in - let null_fd = Unix.(openfile "/dev/null" [O_RDONLY] 0o644) in - let pid = - Unix.create_process - Filename.(concat (dirname (Sys.getcwd ())) "tezos-node") - [| "tezos-node" ; - "run" ; - "--data-dir"; data_dir ; - "--sandbox"; "./sandbox.json"; - "--rpc-addr"; "[::]:8732" |] - null_fd log_fd log_fd in - Printf.printf "Created node, pid: %d, log: %s\n%!" pid log_file_name ; - at_exit - (fun () -> - Unix.kill pid Sys.sigkill; - ignore (Sys.command (Printf.sprintf "rm -fr \"%s\"" data_dir))) ; - Printf.printf "Waiting %d seconds for its initialisation\n%!" init_timeout; - Unix.sleep init_timeout ; - match Unix.waitpid [Unix.WNOHANG] pid with - | 0, _ -> () - | pid, Unix.WEXITED x -> Printf.eprintf "Wait: %d, exit %d\n%!" pid x - | pid, Unix.WSIGNALED x -> Printf.eprintf "Wait: %d, signaled %d\n%!" pid x - | pid, Unix.WSTOPPED x -> Printf.eprintf "Wait: %d, stopped %d \n%!" pid x - -type account = { - name : string ; - secret_key : Sodium.secret Sodium.Sign.key ; - public_key : Sodium.public Sodium.Sign.key ; - public_key_hash : public_key_hash ; - contract : Contract.t ; -} - -let genesis_sk = - Environment.Ed25519.Secret_key.of_b58check_exn - "edskRhxswacLW6jF6ULavDdzwqnKJVS4UcDTNiCyiH6H8ZNnn2pmNviL7pRNz9kRxxaWQFzEQEcZExGHKbwmuaAcoMegj5T99z" - -let bootstrap1_pk = - Environment.Ed25519.Public_key.of_b58check_exn - "edpkuBknW28nW72KG6RoHtYW7p12T6GKc7nAbwYX5m8Wd9sDVC9yav" -let bootstrap2_pk = - Environment.Ed25519.Public_key.of_b58check_exn - "edpktzNbDAUjUk697W7gYg2CRuBQjyPxbEg8dLccYYwKSKvkPvjtV9" -let bootstrap3_pk = - Environment.Ed25519.Public_key.of_b58check_exn - "edpkuTXkJDGcFd5nh6VvMz8phXxU3Bi7h6hqgywNFi1vZTfQNnS1RV" -let bootstrap4_pk = - Environment.Ed25519.Public_key.of_b58check_exn - "edpkuFrRoDSEbJYgxRtLx2ps82UdaYc1WwfS9sE11yhauZt5DgCHbU" -let bootstrap5_pk = - Environment.Ed25519.Public_key.of_b58check_exn - "edpkv8EUUH68jmo3f7Um5PezmfGrRF24gnfLpH3sVNwJnV5bVCxL2n" -let bootstrap1_sk = - Environment.Ed25519.Secret_key.of_b58check_exn - "edskRuR1azSfboG86YPTyxrQgosh5zChf5bVDmptqLTb5EuXAm9rsnDYfTKhq7rDQujdn5WWzwUMeV3agaZ6J2vPQT58jJAJPi" -let bootstrap2_sk = - Environment.Ed25519.Secret_key.of_b58check_exn - "edskRkJz4Rw2rM5NtabEWMbbg2bF4b1nfFajaqEuEk4SgU7eeDbym9gVQtBTbYo32WUg2zb5sNBkD1whRN7zX43V9bftBbtaKc" -let bootstrap3_sk = - Environment.Ed25519.Secret_key.of_b58check_exn - "edskS3qsqsNgdjUqeMsVcEwBn8dkZ5iDRz6aF21KhcCtRiAkWBypUSbicccR4Vgqm9UdW2Vabuos6seezqgbXTrmcbLUG4rdAC" -let bootstrap4_sk = - Environment.Ed25519.Secret_key.of_b58check_exn - "edskRg9qcPqaVQa6jXWNMU5p71tseSuR7NzozgqZ9URsVDi81wTyPJdFSBdeakobyHUi4Xgu61jgKRQvkhXrPmEdEUfiqfiJFL" -let bootstrap5_sk = - Environment.Ed25519.Secret_key.of_b58check_exn - "edskS7rLN2Df3nbS1EYvwJbWo4umD7yPM1SUeX7gp1WhCVpMFXjcCyM58xs6xsnTsVqHQmJQ2RxoAjJGedWfvFmjQy6etA3dgZ" - -let switch_protocol () = - let fitness = - Client_embedded_proto_alpha.Fitness_repr.from_int64 0L in - Client_genesis.Client_proto_main.mine cctxt `Genesis - (Activate Client_alpha.Client_proto_main.protocol) - fitness genesis_sk >>=? fun () -> - Lwt_unix.sleep 2.0 >>= fun () -> - return () - -let bootstrap_accounts () = - let cpt = ref 0 in - Lwt.return - (List.map - (fun (public_key, secret_key) -> - incr cpt ; - let name = Printf.sprintf "bootstrap%d" !cpt in - let public_key_hash = Environment.Ed25519.Public_key.hash public_key in - { name ; contract = Contract.default_contract public_key_hash; - public_key_hash ; public_key ; secret_key }) - [ bootstrap1_pk, bootstrap1_sk; - bootstrap2_pk, bootstrap2_sk; - bootstrap3_pk, bootstrap3_sk; - bootstrap4_pk, bootstrap4_sk; - bootstrap5_pk, bootstrap5_sk; ]) - -let create_account name = - let secret_key, public_key = Sodium.Sign.random_keypair () in - let public_key_hash = Environment.Ed25519.Public_key.hash public_key in - let contract = Contract.default_contract public_key_hash in - Lwt.return { name ; contract ; public_key_hash ; public_key ; secret_key } - -let transfer ?(block = `Prevalidation) ?(fee = 5L) ~src ~target amount = - let fee = - let fee = Tez.of_cents fee in - Assert.is_some ~msg:__LOC__ fee ; - match fee with - | Some x -> x - | None -> assert false in (* will be captured by the previous assert *) - let amount = - let amount = Tez.of_cents amount in - Assert.is_some ~msg:__LOC__ amount ; - match amount with - | Some x -> x - | None -> assert false in (* will be captured by the previous assert *) - Client_proto_context.transfer cctxt - block - ~source:src.contract - ~src_pk:src.public_key - ~src_sk:src.secret_key - ~destination:target.contract - ~amount ~fee () - -let check_balance ?(block = `Prevalidation) account expected = - Client_proto_rpcs.Context.Contract.balance cctxt.rpc_config - block account.contract >>=? fun balance -> - let balance = Tez.to_cents balance in - Assert.equal_int64 ~msg:__LOC__ expected balance ; - return () - -let mine contract = - let block = `Head 0 in - Client_proto_rpcs.Context.level cctxt.rpc_config block >>=? fun level -> - let seed_nonce = Client_mining_forge.generate_seed_nonce () in - Client_mining_forge.forge_block cctxt.rpc_config - ~timestamp:(Time.now ()) ~seed_nonce ~src_sk:contract.secret_key - block ~priority:(`Auto (contract.public_key_hash, None)) () >>=? fun block_hash -> - return () - -let ecoproto_error f = function - | Register_client_embedded_proto_alpha.Ecoproto_error errors -> - List.exists f errors - | _ -> false - -let main () = - fork_node () ; - switch_protocol () >>=? fun () -> - bootstrap_accounts () >>= fun bootstrap_accounts -> - let bootstrap = List.hd bootstrap_accounts in - create_account "foo" >>= fun foo -> - create_account "bar" >>= fun bar -> - transfer ~src:bootstrap ~target:foo 1000_00L >>=? fun contracts -> - Assert.equal_int ~msg:__LOC__ 0 (List.length contracts) ; - transfer ~src:bootstrap ~target:bar 2000_00L >>=? fun contracts -> - Assert.equal_int ~msg:__LOC__ 0 (List.length contracts) ; - check_balance foo 1000_00L >>=? fun () -> - transfer ~src:bar ~target:foo 999_95L >>=? fun contracts -> - Assert.equal_int ~msg:__LOC__ 0 (List.length contracts) ; - check_balance foo 1999_95L >>=? fun () -> - check_balance bar 1000_00L >>=? fun () -> - should_fail - (ecoproto_error (function Contract.Balance_too_low _ -> true | _ -> false)) - @@ transfer ~src:bar ~target:foo 1000_00L >>=? fun () -> - mine bootstrap - -let tests = [ "main", fun _ -> main () ] - -let () = - Test.run "basic." tests diff --git a/test/utils/.merlin b/test/utils/.merlin new file mode 100644 index 000000000..2236dda06 --- /dev/null +++ b/test/utils/.merlin @@ -0,0 +1,13 @@ +REC +S . +B . +S ../../src/minutils +B ../../src/minutils +S ../../src/utils +B ../../src/utils +S ../lib +B ../lib +FLG -open Error_monad -open Hash -open Utils +FLG -w -40 +PKG lwt +PKG kaputt diff --git a/test/utils/Makefile b/test/utils/Makefile new file mode 100644 index 000000000..0fde9adf7 --- /dev/null +++ b/test/utils/Makefile @@ -0,0 +1,73 @@ + +SRCDIR=../../src + +TESTS := \ + merkle \ + data-encoding \ + # lwt-pipe + +include ../Makefile.shared + +SOURCE_DIRECTORIES := ${UTILS_SOURCE_DIRECTORIES} ../lib + +LIB := ${MINUTILSLIB} ${UTILSLIB} ${TESTLIB} + +PACKAGES := \ + ${UTILS_PACKAGES} \ + kaputt \ + +OPENED_MODULES := ${NODE_OPENED_MODULES} + +############################################################################ +## Lwt_pipe + +.PHONY:run-test-lwt-pipe +run-test-lwt-pipe: + @echo + ./test-lwt-pipe + +TEST_PIPE_IMPLS := \ + test_lwt_pipe.ml + +test-lwt-pipe: ${LIB} ${TEST_PIPE_IMPLS:.ml=.cmx} + @echo LINK $(notdir $@) + @${OCAMLOPT} -linkall -linkpkg ${OCAMLFLAGS} -o $@ $^ + +clean:: + rm -f test-lwt-pipe + +############################################################################ +## Merkle + +.PHONY:run-test-merkle +run-test-merkle: + @echo + ./test-merkle + +TEST_MERKLE_IMPLS := \ + test_merkle.ml + +test-merkle: ${LIB} ${TEST_MERKLE_IMPLS:.ml=.cmx} + @echo LINK $(notdir $@) + @${OCAMLOPT} -linkall -linkpkg ${OCAMLFLAGS} -o $@ $^ + +clean:: + rm -f test-merkle + +############################################################################ +## Data_encoding + +.PHONY:run-test-data-encoding +run-test-data-encoding: + @echo + ./test-data-encoding + +TEST_DATA_ENCODING_IMPLS := \ + test_data_encoding.ml + +test-data-encoding: ${LIB} ${TEST_DATA_ENCODING_IMPLS:.ml=.cmx} + @echo LINK $(notdir $@) + @${OCAMLOPT} -linkall -linkpkg ${OCAMLFLAGS} -o $@ $^ + +clean:: + rm -f test-data-encoding diff --git a/test/test_data_encoding.ml b/test/utils/test_data_encoding.ml similarity index 99% rename from test/test_data_encoding.ml rename to test/utils/test_data_encoding.ml index ddd6f1403..98ace12be 100644 --- a/test/test_data_encoding.ml +++ b/test/utils/test_data_encoding.ml @@ -1,5 +1,4 @@ open Data_encoding -open Context open Hash open Error_monad diff --git a/test/test_lwt_pipe.ml b/test/utils/test_lwt_pipe.ml similarity index 100% rename from test/test_lwt_pipe.ml rename to test/utils/test_lwt_pipe.ml diff --git a/test/test_merkle.ml b/test/utils/test_merkle.ml similarity index 100% rename from test/test_merkle.ml rename to test/utils/test_merkle.ml