From 2bd0c63a932756f32423a4815fb2dce485abe67a Mon Sep 17 00:00:00 2001 From: Valery Antopol Date: Thu, 7 Oct 2021 20:04:54 +0300 Subject: [PATCH] Remove test sdk (#67) --- .circleci/config.yml | 7 +- Cargo.lock | 1419 +---------------- Cargo.toml | 50 +- README.md | 2 +- crates/marine-test-macro-impl/Cargo.toml | 29 - .../marine-test-macro-impl/src/attributes.rs | 56 - crates/marine-test-macro-impl/src/errors.rs | 68 - crates/marine-test-macro-impl/src/lib.rs | 36 - .../src/marine_test/config_utils.rs | 110 -- .../src/marine_test/glue_code_generator.rs | 245 --- .../src/marine_test/marine_test_impl.rs | 40 - .../src/marine_test/mod.rs | 24 - .../src/marine_test/modules_linker.rs | 195 --- .../src/marine_test/token_stream_generator.rs | 125 -- .../methods_generator.rs | 71 - .../methods_generator_utils.rs | 245 --- .../record_type_generator.rs | 71 - .../service_generation_utils.rs | 204 --- .../service_generator.rs | 110 -- .../src/marine_test/utils.rs | 62 - .../generation_tests/empty_func/Config.toml | 6 - .../empty_func/artifacts/greeting.wasm | Bin 56806 -> 0 bytes .../generation_tests/empty_func/expanded.rs | 128 -- .../empty_func/marine_test.rs | 1 - .../mounted_binary/Config.toml | 8 - .../mounted_binary/artifacts/greeting.wasm | Bin 64072 -> 0 bytes .../mounted_binary/expanded.rs | 167 -- .../mounted_binary/marine_test.rs | 3 - .../empty_func/Config.toml | 6 - .../empty_func/artifacts/greeting.wasm | Bin 56806 -> 0 bytes .../multi-service-multiple/expanded.rs | 504 ------ .../multi-service-multiple/marine_test.rs | 4 - .../mounted_binary/Config.toml | 8 - .../mounted_binary/artifacts/greeting.wasm | Bin 64072 -> 0 bytes .../empty_func/Config.toml | 6 - .../empty_func/artifacts/greeting.wasm | Bin 56806 -> 0 bytes .../multi-service-single/expanded.rs | 242 --- .../multi-service-single/marine_test.rs | 1 - .../multiple_modules/Config.toml | 10 - .../artifacts/call_parameters.wasm | Bin 81051 -> 0 bytes .../multiple_modules/artifacts/greeting.wasm | Bin 69525 -> 0 bytes .../multiple_modules/expanded.rs | 321 ---- .../multiple_modules/marine_test.rs | 29 - .../tests/generation_tests_runner.rs | 86 - crates/marine-test-macro-impl/tests/utils.rs | 97 -- crates/marine-test-macro/Cargo.toml | 26 - crates/marine-test-macro/src/lib.rs | 74 - sdk-test/CHANGELOG.md | 9 - sdk-test/Cargo.toml | 29 - sdk-test/src/lib.rs | 45 - sdk/Cargo.toml | 35 - {sdk/src => src}/call_parameters.rs | 0 {sdk/src => src}/lib.rs | 0 {sdk/src => src}/mounted_binary.rs | 0 .../export_functions/array_inner_refs.rs | 0 .../export_functions/array_inner_refs.stderr | 0 .../export_functions/arrays.rs | 0 .../export_functions/basic_types.rs | 0 .../export_functions/improper_types.rs | 0 .../export_functions/improper_types.stderr | 0 .../export_functions/inner_vec_refs.rs | 0 .../export_functions/inner_vec_refs.stderr | 0 .../export_functions/ref_arrays.rs | 0 .../export_functions/ref_basic_types.rs | 0 .../import_functions/arrays.rs | 0 .../import_functions/arrays_out_inner_refs.rs | 0 .../arrays_out_inner_refs.stderr | 0 .../import_functions/basic_ref_types.rs | 0 .../import_functions/basic_types.rs | 0 .../import_functions/improper_types.rs | 0 .../import_functions/improper_types.stderr | 0 .../import_functions/ref_arrays.rs | 0 .../import_functions/ref_basic_types.rs | 0 .../records/basic_structs.rs | 0 .../compilation_tests/records/empty_struct.rs | 0 .../records/struct_with_improper_types.rs | 0 .../records/struct_with_improper_types.stderr | 0 .../records/struct_with_private_fields.rs | 0 .../records/unnamed_structs.rs | 0 .../records/unnamed_structs.stderr | 0 .../compilation_tests_runner.rs | 0 81 files changed, 55 insertions(+), 4959 deletions(-) delete mode 100644 crates/marine-test-macro-impl/Cargo.toml delete mode 100644 crates/marine-test-macro-impl/src/attributes.rs delete mode 100644 crates/marine-test-macro-impl/src/errors.rs delete mode 100644 crates/marine-test-macro-impl/src/lib.rs delete mode 100644 crates/marine-test-macro-impl/src/marine_test/config_utils.rs delete mode 100644 crates/marine-test-macro-impl/src/marine_test/glue_code_generator.rs delete mode 100644 crates/marine-test-macro-impl/src/marine_test/marine_test_impl.rs delete mode 100644 crates/marine-test-macro-impl/src/marine_test/mod.rs delete mode 100644 crates/marine-test-macro-impl/src/marine_test/modules_linker.rs delete mode 100644 crates/marine-test-macro-impl/src/marine_test/token_stream_generator.rs delete mode 100644 crates/marine-test-macro-impl/src/marine_test/token_stream_generator/methods_generator.rs delete mode 100644 crates/marine-test-macro-impl/src/marine_test/token_stream_generator/methods_generator_utils.rs delete mode 100644 crates/marine-test-macro-impl/src/marine_test/token_stream_generator/record_type_generator.rs delete mode 100644 crates/marine-test-macro-impl/src/marine_test/token_stream_generator/service_generation_utils.rs delete mode 100644 crates/marine-test-macro-impl/src/marine_test/token_stream_generator/service_generator.rs delete mode 100644 crates/marine-test-macro-impl/src/marine_test/utils.rs delete mode 100644 crates/marine-test-macro-impl/tests/generation_tests/empty_func/Config.toml delete mode 100755 crates/marine-test-macro-impl/tests/generation_tests/empty_func/artifacts/greeting.wasm delete mode 100644 crates/marine-test-macro-impl/tests/generation_tests/empty_func/expanded.rs delete mode 100644 crates/marine-test-macro-impl/tests/generation_tests/empty_func/marine_test.rs delete mode 100644 crates/marine-test-macro-impl/tests/generation_tests/mounted_binary/Config.toml delete mode 100755 crates/marine-test-macro-impl/tests/generation_tests/mounted_binary/artifacts/greeting.wasm delete mode 100644 crates/marine-test-macro-impl/tests/generation_tests/mounted_binary/expanded.rs delete mode 100644 crates/marine-test-macro-impl/tests/generation_tests/mounted_binary/marine_test.rs delete mode 100644 crates/marine-test-macro-impl/tests/generation_tests/multi-service-multiple/empty_func/Config.toml delete mode 100755 crates/marine-test-macro-impl/tests/generation_tests/multi-service-multiple/empty_func/artifacts/greeting.wasm delete mode 100644 crates/marine-test-macro-impl/tests/generation_tests/multi-service-multiple/expanded.rs delete mode 100644 crates/marine-test-macro-impl/tests/generation_tests/multi-service-multiple/marine_test.rs delete mode 100644 crates/marine-test-macro-impl/tests/generation_tests/multi-service-multiple/mounted_binary/Config.toml delete mode 100755 crates/marine-test-macro-impl/tests/generation_tests/multi-service-multiple/mounted_binary/artifacts/greeting.wasm delete mode 100644 crates/marine-test-macro-impl/tests/generation_tests/multi-service-single/empty_func/Config.toml delete mode 100755 crates/marine-test-macro-impl/tests/generation_tests/multi-service-single/empty_func/artifacts/greeting.wasm delete mode 100644 crates/marine-test-macro-impl/tests/generation_tests/multi-service-single/expanded.rs delete mode 100644 crates/marine-test-macro-impl/tests/generation_tests/multi-service-single/marine_test.rs delete mode 100644 crates/marine-test-macro-impl/tests/generation_tests/multiple_modules/Config.toml delete mode 100755 crates/marine-test-macro-impl/tests/generation_tests/multiple_modules/artifacts/call_parameters.wasm delete mode 100755 crates/marine-test-macro-impl/tests/generation_tests/multiple_modules/artifacts/greeting.wasm delete mode 100644 crates/marine-test-macro-impl/tests/generation_tests/multiple_modules/expanded.rs delete mode 100644 crates/marine-test-macro-impl/tests/generation_tests/multiple_modules/marine_test.rs delete mode 100644 crates/marine-test-macro-impl/tests/generation_tests_runner.rs delete mode 100644 crates/marine-test-macro-impl/tests/utils.rs delete mode 100644 crates/marine-test-macro/Cargo.toml delete mode 100644 crates/marine-test-macro/src/lib.rs delete mode 100644 sdk-test/CHANGELOG.md delete mode 100644 sdk-test/Cargo.toml delete mode 100644 sdk-test/src/lib.rs delete mode 100644 sdk/Cargo.toml rename {sdk/src => src}/call_parameters.rs (100%) rename {sdk/src => src}/lib.rs (100%) rename {sdk/src => src}/mounted_binary.rs (100%) rename {sdk/tests => tests}/compilation_tests/export_functions/array_inner_refs.rs (100%) rename {sdk/tests => tests}/compilation_tests/export_functions/array_inner_refs.stderr (100%) rename {sdk/tests => tests}/compilation_tests/export_functions/arrays.rs (100%) rename {sdk/tests => tests}/compilation_tests/export_functions/basic_types.rs (100%) rename {sdk/tests => tests}/compilation_tests/export_functions/improper_types.rs (100%) rename {sdk/tests => tests}/compilation_tests/export_functions/improper_types.stderr (100%) rename {sdk/tests => tests}/compilation_tests/export_functions/inner_vec_refs.rs (100%) rename {sdk/tests => tests}/compilation_tests/export_functions/inner_vec_refs.stderr (100%) rename {sdk/tests => tests}/compilation_tests/export_functions/ref_arrays.rs (100%) rename {sdk/tests => tests}/compilation_tests/export_functions/ref_basic_types.rs (100%) rename {sdk/tests => tests}/compilation_tests/import_functions/arrays.rs (100%) rename {sdk/tests => tests}/compilation_tests/import_functions/arrays_out_inner_refs.rs (100%) rename {sdk/tests => tests}/compilation_tests/import_functions/arrays_out_inner_refs.stderr (100%) rename {sdk/tests => tests}/compilation_tests/import_functions/basic_ref_types.rs (100%) rename {sdk/tests => tests}/compilation_tests/import_functions/basic_types.rs (100%) rename {sdk/tests => tests}/compilation_tests/import_functions/improper_types.rs (100%) rename {sdk/tests => tests}/compilation_tests/import_functions/improper_types.stderr (100%) rename {sdk/tests => tests}/compilation_tests/import_functions/ref_arrays.rs (100%) rename {sdk/tests => tests}/compilation_tests/import_functions/ref_basic_types.rs (100%) rename {sdk/tests => tests}/compilation_tests/records/basic_structs.rs (100%) rename {sdk/tests => tests}/compilation_tests/records/empty_struct.rs (100%) rename {sdk/tests => tests}/compilation_tests/records/struct_with_improper_types.rs (100%) rename {sdk/tests => tests}/compilation_tests/records/struct_with_improper_types.stderr (100%) rename {sdk/tests => tests}/compilation_tests/records/struct_with_private_fields.rs (100%) rename {sdk/tests => tests}/compilation_tests/records/unnamed_structs.rs (100%) rename {sdk/tests => tests}/compilation_tests/records/unnamed_structs.stderr (100%) rename {sdk/tests => tests}/compilation_tests_runner.rs (100%) diff --git a/.circleci/config.yml b/.circleci/config.yml index b88b45f..ede3977 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -18,11 +18,10 @@ jobs: rustup target add wasm32-wasi rustup component add rustfmt rustup component add clippy - cargo fmt --all -- --check --color always - (cd sdk; cargo build -v --target wasm32-wasi --all-features) - (cd sdk; cargo clippy -v --target wasm32-wasi) - (cd sdk-test; cargo build) + cargo fmt --all -- --check --color always + cargo build -v --target wasm32-wasi --all-features + cargo clippy -v --target wasm32-wasi (cd crates/marine-macro-impl; cargo test) TARGET=wasm32-wasi cargo test -v --all-features diff --git a/Cargo.lock b/Cargo.lock index 0215ff4..8202964 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11,24 +11,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "anyhow" -version = "1.0.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61604a8f862e1d5c3229fdd78f8b02c68dcf73a4c4b05fd636d12240aaa242c1" - -[[package]] -name = "arrayref" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" - -[[package]] -name = "arrayvec" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" - [[package]] name = "atty" version = "0.2.14" @@ -46,71 +28,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "blake3" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b64485778c4f16a6a5a9d335e80d449ac6c70cdd6a06d2af18a6f6f775a125b3" -dependencies = [ - "arrayref", - "arrayvec", - "cc", - "cfg-if 0.1.10", - "constant_time_eq", - "crypto-mac", - "digest 0.9.0", -] - -[[package]] -name = "boolinator" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfa8873f51c92e232f9bac4065cddef41b714152812bfc5f7672ba16d6ef8cd9" - -[[package]] -name = "byteorder" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" - -[[package]] -name = "cargo_toml" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "513d17226888c7b8283ac02a1c1b0d8a9d4cbf6db65dfadb79f598f5d7966fe9" -dependencies = [ - "serde", - "serde_derive", - "toml", -] - -[[package]] -name = "cc" -version = "1.0.71" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79c2681d6594606957bbb8631c4b90a7fcaaa72cdb714743a437b156d6a7eedd" - -[[package]] -name = "cfg-if" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" - [[package]] name = "cfg-if" version = "1.0.0" @@ -130,21 +47,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "cloudabi" -version = "0.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" -dependencies = [ - "bitflags", -] - -[[package]] -name = "cmd_lib" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "475bd7aa7680b4ed8f6bb59745e882bcbaeb39326532bb79ffb1716480d9a274" - [[package]] name = "colored" version = "1.9.3" @@ -156,126 +58,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "constant_time_eq" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" - -[[package]] -name = "cranelift-bforest" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45a9c21f8042b9857bda93f6c1910b9f9f24100187a3d3d52f214a34e3dc5818" -dependencies = [ - "cranelift-entity", -] - -[[package]] -name = "cranelift-codegen" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7853f77a6e4a33c67a69c40f5e1bb982bd2dc5c4a22e17e67b65bbccf9b33b2e" -dependencies = [ - "byteorder", - "cranelift-bforest", - "cranelift-codegen-meta", - "cranelift-codegen-shared", - "cranelift-entity", - "gimli", - "log", - "smallvec", - "target-lexicon", - "thiserror", -] - -[[package]] -name = "cranelift-codegen-meta" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "084cd6d5fb0d1da28acd72c199471bfb09acc703ec8f3bf07b1699584272a3b9" -dependencies = [ - "cranelift-codegen-shared", - "cranelift-entity", -] - -[[package]] -name = "cranelift-codegen-shared" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "701b599783305a58c25027a4d73f2d6b599b2d8ef3f26677275f480b4d51e05d" - -[[package]] -name = "cranelift-entity" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b88e792b28e1ebbc0187b72ba5ba880dad083abe9231a99d19604d10c9e73f38" - -[[package]] -name = "cranelift-native" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32daf082da21c0c05d93394ff4842c2ab7c4991b1f3186a1d952f8ac660edd0b" -dependencies = [ - "cranelift-codegen", - "raw-cpuid", - "target-lexicon", -] - -[[package]] -name = "crossbeam-channel" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4" -dependencies = [ - "cfg-if 1.0.0", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e" -dependencies = [ - "cfg-if 1.0.0", - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec02e091aa634e2c3ada4a392989e7c3116673ef0ac5b72232439094d73b7fd" -dependencies = [ - "cfg-if 1.0.0", - "crossbeam-utils", - "lazy_static", - "memoffset", - "scopeguard", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d82cfc11ce7f2c3faef78d8a684447b40d503d9681acebed6cb728d45940c4db" -dependencies = [ - "cfg-if 1.0.0", - "lazy_static", -] - -[[package]] -name = "crypto-mac" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" -dependencies = [ - "generic-array 0.14.4", - "subtle", -] - [[package]] name = "ctor" version = "0.1.21" @@ -286,232 +68,21 @@ dependencies = [ "syn", ] -[[package]] -name = "darling" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f2c43f534ea4b0b049015d00269734195e6d3f0f6635cb692251aca6f9f8b3c" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e91455b86830a1c21799d94524df0845183fa55bafd9aa137b01c7d1065fa36" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn", -] - -[[package]] -name = "darling_macro" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29b5acf0dea37a7f66f7b25d2c5e93fd46f8f6968b1a5d7a3e02e97768afc95a" -dependencies = [ - "darling_core", - "quote", - "syn", -] - [[package]] name = "diff" version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e25ea47919b1560c4e3b7fe0aaab9becf5b84a10325ddf7db0f0ba5e1026499" -[[package]] -name = "digest" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" -dependencies = [ - "generic-array 0.12.4", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array 0.14.4", -] - -[[package]] -name = "either" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" - -[[package]] -name = "erased-serde" -version = "0.3.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3de9ad4541d99dc22b59134e7ff8dc3d6c988c89ecd7324bf10a8362b07a2afa" -dependencies = [ - "serde", -] - -[[package]] -name = "errno" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa68f2fb9cae9d37c9b2b3584aba698a2e97f72d7aef7b9f7aa71d8b54ce46fe" -dependencies = [ - "errno-dragonfly", - "libc", - "winapi", -] - -[[package]] -name = "errno-dragonfly" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "fluence-app-service" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58d92fd37b7673513efafb0d1e0c366b8d6f297b74e9bfcda27c452f400af70a" -dependencies = [ - "fluence-faas", - "log", - "maplit", - "serde", - "serde_derive", - "serde_json", - "toml", - "wasmer-wasi-fl", -] - -[[package]] -name = "fluence-faas" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fe120218635fd3055bdf3f7e4cf765e2e72866874818bd10f40e2abde882326" -dependencies = [ - "cmd_lib", - "itertools 0.9.0", - "log", - "marine-module-interface", - "marine-rs-sdk 0.6.13", - "marine-rs-sdk-main 0.6.13", - "marine-runtime", - "marine-utils", - "safe-transmute", - "serde", - "serde_derive", - "serde_json", - "thiserror", - "toml", - "wasmer-interface-types-fl", - "wasmer-runtime-core-fl", - "wasmer-runtime-fl", - "wasmer-wasi-fl", -] - -[[package]] -name = "fluence-it-types" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "047f670b4807cab8872550a607b1515daff08b3e3bb7576ce8f45971fd811a4e" -dependencies = [ - "it-to-bytes", - "nom", - "serde", - "variant_count", - "wast", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "generational-arena" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e1d3b771574f62d0548cee0ad9057857e9fc25d7a3335f140c84f6acd0bf601" -dependencies = [ - "cfg-if 0.1.10", - "serde", -] - -[[package]] -name = "generic-array" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" -dependencies = [ - "typenum", -] - -[[package]] -name = "generic-array" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - [[package]] name = "getrandom" version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "libc", - "wasi 0.10.0+wasi-snapshot-preview1", -] - -[[package]] -name = "ghost" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5bcf1bbeab73aa4cf2fde60a846858dc036163c7c33bec309f8d17de785479" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "gimli" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81dd6190aad0f05ddbbf3245c54ed14ca4aa6dd32f22312b70d8f168c3e3e633" -dependencies = [ - "byteorder", - "indexmap", + "wasi", ] [[package]] @@ -520,21 +91,6 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" -[[package]] -name = "hashbrown" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" - -[[package]] -name = "heck" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" -dependencies = [ - "unicode-segmentation", -] - [[package]] name = "hermit-abi" version = "0.1.19" @@ -544,93 +100,6 @@ dependencies = [ "libc", ] -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "id-arena" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005" - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "indexmap" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" -dependencies = [ - "autocfg", - "hashbrown", - "serde", -] - -[[package]] -name = "inventory" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f0f7efb804ec95e33db9ad49e4252f049e37e8b0a4652e3cd61f7999f2eff7f" -dependencies = [ - "ctor", - "ghost", - "inventory-impl", -] - -[[package]] -name = "inventory-impl" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75c094e94816723ab936484666968f5b58060492e880f3c8d00489a1e244fa51" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "it-lilo" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99ccf40e1e08f6f47ffbafe3cfb2e3adb721ddde80b178240f038d07dc9652fb" -dependencies = [ - "fluence-it-types", - "log", - "paste", - "thiserror", -] - -[[package]] -name = "it-to-bytes" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "729c74bb4236418898a219c6d96f14cba77456dd7c04a2e99e65e9c643709b56" - -[[package]] -name = "itertools" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69ddb889f9d0d08a67338271fa9b62996bc788c7796a5c18cf057420aaed5eaf" -dependencies = [ - "either", -] - [[package]] name = "itoa" version = "0.4.8" @@ -643,130 +112,26 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -[[package]] -name = "leb128" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" - -[[package]] -name = "lexical-core" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6607c62aa161d23d17a9072cc5da0be67cdfc89d3afb1e8d9c842bebc2525ffe" -dependencies = [ - "arrayvec", - "bitflags", - "cfg-if 1.0.0", - "ryu", - "static_assertions", -] - [[package]] name = "libc" version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd8f7255a17a627354f321ef0055d63b898c6fb27eff628af4d1b66b7331edf6" -[[package]] -name = "lock_api" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4da24a77a3d8a6d4862d95f72e6fdb9c09a643ecdb402d754004a557f2bec75" -dependencies = [ - "scopeguard", -] - [[package]] name = "log" version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "maplit" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" - -[[package]] -name = "marine-it-generator" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "890b228b9151e9dff213501986f564445a2f9ca5a706088b5d900f5ecf67f7e7" -dependencies = [ - "cargo_toml", - "it-lilo", - "marine-it-parser", - "marine-macro-impl 0.6.13", - "once_cell", - "serde", - "serde_json", - "thiserror", - "walrus", - "wasmer-interface-types-fl", -] - -[[package]] -name = "marine-it-interfaces" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42e229143e72ba20e754de4766ff0d02e0cf176001f7471593f82b16c72dc26d" -dependencies = [ - "multimap", - "wasmer-interface-types-fl", -] - -[[package]] -name = "marine-it-parser" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edd97bd85072fc540763769be153a7c8ee83391e668b37ef96d6c48decec2cd5" -dependencies = [ - "anyhow", - "itertools 0.10.1", - "marine-it-interfaces", - "marine-module-interface", - "nom", - "semver 0.11.0", - "serde", - "thiserror", - "walrus", - "wasmer-interface-types-fl", - "wasmer-runtime-core-fl", -] - -[[package]] -name = "marine-macro" -version = "0.6.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "679663e087698f1048f23fed9b51ed82f6fa75781d3747ce29ea2f3ad78a6534" -dependencies = [ - "marine-macro-impl 0.6.13", + "cfg-if", ] [[package]] name = "marine-macro" version = "0.6.14" dependencies = [ - "marine-macro-impl 0.6.14", -] - -[[package]] -name = "marine-macro-impl" -version = "0.6.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ba83fc29fec3b96374094a94396d3fe13c97468ffe196123b78555bdae1093e" -dependencies = [ - "proc-macro2", - "quote", - "serde", - "serde_json", - "syn", - "uuid", + "marine-macro-impl", ] [[package]] @@ -792,165 +157,28 @@ dependencies = [ "syn", ] -[[package]] -name = "marine-module-info-parser" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ec8f4ab2eeeb5c1d66d9b56fe6b0b5bf39820aa8cc2f1d7be42bdf95654d529" -dependencies = [ - "anyhow", - "chrono", - "marine-rs-sdk-main 0.6.13", - "semver 0.11.0", - "serde", - "thiserror", - "walrus", - "wasmer-runtime-core-fl", -] - -[[package]] -name = "marine-module-interface" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06bc36ef268bf7436916f1fa9b0c84104692a717ea5eef3c90b9f25c3407f6b7" -dependencies = [ - "anyhow", - "itertools 0.10.1", - "marine-it-interfaces", - "nom", - "semver 0.11.0", - "serde", - "thiserror", - "walrus", - "wasmer-interface-types-fl", - "wasmer-runtime-core-fl", -] - -[[package]] -name = "marine-rs-sdk" -version = "0.6.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8866fc6f24b92342f15d2816298d3de6377b685df245e38a36ddcde993c8f1d5" -dependencies = [ - "marine-macro 0.6.13", - "marine-rs-sdk-main 0.6.13", - "marine-timestamp-macro 0.6.13", - "serde", -] - [[package]] name = "marine-rs-sdk" version = "0.6.14" dependencies = [ - "marine-macro 0.6.14", - "marine-rs-sdk-main 0.6.14", - "marine-timestamp-macro 0.6.14", + "marine-macro", + "marine-rs-sdk-main", + "marine-timestamp-macro", "serde", "trybuild", ] -[[package]] -name = "marine-rs-sdk-main" -version = "0.6.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4980a0c01121844419c0146e776d24e35fdf7cb2e90a33d19ecf52756e400196" -dependencies = [ - "log", - "marine-macro 0.6.13", - "serde", -] - [[package]] name = "marine-rs-sdk-main" version = "0.6.14" dependencies = [ "lazy_static", "log", - "marine-macro 0.6.14", + "marine-macro", "serde", "simple_logger", ] -[[package]] -name = "marine-rs-sdk-test" -version = "0.3.0" -dependencies = [ - "fluence-app-service", - "marine-test-macro", - "serde", - "serde_json", - "trybuild", - "uuid", -] - -[[package]] -name = "marine-runtime" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "983262d394c59d4321b141e303eb55015bc412f319d54bbad7f253e4583253b2" -dependencies = [ - "anyhow", - "boolinator", - "it-lilo", - "log", - "marine-it-generator", - "marine-it-interfaces", - "marine-it-parser", - "marine-module-info-parser", - "marine-module-interface", - "marine-utils", - "multimap", - "once_cell", - "parity-wasm", - "paste", - "pwasm-utils", - "semver 0.11.0", - "serde", - "thiserror", - "wasmer-interface-types-fl", - "wasmer-runtime-core-fl", - "wasmer-runtime-fl", - "wasmer-wasi-fl", -] - -[[package]] -name = "marine-test-macro" -version = "0.3.0" -dependencies = [ - "marine-test-macro-impl", - "proc-macro-error", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "marine-test-macro-impl" -version = "0.3.0" -dependencies = [ - "darling", - "fluence-app-service", - "itertools 0.10.1", - "marine-it-parser", - "marine-macro-testing-utils", - "proc-macro-error", - "proc-macro2", - "quote", - "static_assertions", - "syn", - "thiserror", -] - -[[package]] -name = "marine-timestamp-macro" -version = "0.6.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5656745923b99d73f945e26cf191efa70e906c7f55b0d4c1fc176b4b8087e85b" -dependencies = [ - "chrono", - "quote", -] - [[package]] name = "marine-timestamp-macro" version = "0.6.14" @@ -959,70 +187,6 @@ dependencies = [ "quote", ] -[[package]] -name = "marine-utils" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dc5838acba84ce4d802d672afd0814fae0ae7098021ae5b06d975e70d09f812" - -[[package]] -name = "memchr" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" - -[[package]] -name = "memmap" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "memoffset" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59accc507f1338036a0477ef61afdae33cde60840f4dfe481319ce3ad116ddf9" -dependencies = [ - "autocfg", -] - -[[package]] -name = "multimap" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" -dependencies = [ - "serde", -] - -[[package]] -name = "nix" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2e0b4f3320ed72aaedb9a5ac838690a8047c7b275da22711fddff4f8a14229" -dependencies = [ - "bitflags", - "cc", - "cfg-if 0.1.10", - "libc", - "void", -] - -[[package]] -name = "nom" -version = "5.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb4262d26ed83a1c0a33a38fe2bb15797329c85770da05e6b828ddb782627af" -dependencies = [ - "lexical-core", - "memchr", - "version_check", -] - [[package]] name = "num-integer" version = "0.1.44" @@ -1042,22 +206,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "num_cpus" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "once_cell" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" - [[package]] name = "output_vt100" version = "0.1.2" @@ -1067,61 +215,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "page_size" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eebde548fbbf1ea81a99b128872779c437752fb99f217c45245e1a61dcd9edcd" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "parity-wasm" -version = "0.41.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddfc878dac00da22f8f61e7af3157988424567ab01d9920b962ef7dcbd7cd865" - -[[package]] -name = "parking_lot" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3a704eb390aafdc107b0e392f56a82b668e3a71366993b5340f5833fd62505e" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d58c7c768d4ba344e3e8d72518ac13e259d7c7ade24167003b8488e10b6740a3" -dependencies = [ - "cfg-if 0.1.10", - "cloudabi", - "libc", - "redox_syscall", - "smallvec", - "winapi", -] - -[[package]] -name = "paste" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf547ad0c65e31259204bd90935776d1c693cec2f4ff7abb7a1bbbd40dfe58" - -[[package]] -name = "pest" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53" -dependencies = [ - "ucd-trie", -] - [[package]] name = "pretty_assertions" version = "0.7.2" @@ -1134,29 +227,6 @@ dependencies = [ "output_vt100", ] -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - [[package]] name = "proc-macro2" version = "1.0.29" @@ -1166,17 +236,6 @@ dependencies = [ "unicode-xid", ] -[[package]] -name = "pwasm-utils" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f7a12f176deee919f4ba55326ee17491c8b707d0987aed822682c821b660192" -dependencies = [ - "byteorder", - "log", - "parity-wasm", -] - [[package]] name = "quote" version = "1.0.10" @@ -1186,108 +245,12 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "raw-cpuid" -version = "7.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "beb71f708fe39b2c5e98076204c3cc094ee5a4c12c4cdb119a2b72dc34164f41" -dependencies = [ - "bitflags", - "cc", - "rustc_version", -] - -[[package]] -name = "rayon" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06aca804d41dbc8ba42dfd964f0d01334eceb64314b9ecf7c5fad5188a06d90" -dependencies = [ - "autocfg", - "crossbeam-deque", - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d78120e2c850279833f1dd3582f730c4ab53ed95aeaaaa862a2a5c71b1656d8e" -dependencies = [ - "crossbeam-channel", - "crossbeam-deque", - "crossbeam-utils", - "lazy_static", - "num_cpus", -] - -[[package]] -name = "redox_syscall" -version = "0.1.57" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" - -[[package]] -name = "rustc_version" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -dependencies = [ - "semver 0.9.0", -] - [[package]] name = "ryu" version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" -[[package]] -name = "safe-transmute" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98a01dab6acf992653be49205bdd549f32f17cb2803e8eacf1560bf97259aae8" - -[[package]] -name = "scopeguard" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" - -[[package]] -name = "semver" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -dependencies = [ - "semver-parser 0.7.0", -] - -[[package]] -name = "semver" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" -dependencies = [ - "semver-parser 0.10.2", -] - -[[package]] -name = "semver-parser" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" - -[[package]] -name = "semver-parser" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" -dependencies = [ - "pest", -] - [[package]] name = "serde" version = "1.0.118" @@ -1297,25 +260,6 @@ dependencies = [ "serde_derive", ] -[[package]] -name = "serde-bench" -version = "0.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d733da87e79faaac25616e33d26299a41143fd4cd42746cbb0e91d8feea243fd" -dependencies = [ - "byteorder", - "serde", -] - -[[package]] -name = "serde_bytes" -version = "0.11.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16ae07dd2f88a366f15bd0632ba725227018c69a1c8550a927324f8eb8368bb9" -dependencies = [ - "serde", -] - [[package]] name = "serde_derive" version = "1.0.118" @@ -1351,30 +295,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "smallvec" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ecab6c735a6bb4139c0caafd0cc3635748bbb3acf4550e8138122099251f309" - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - -[[package]] -name = "subtle" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" - [[package]] name = "syn" version = "1.0.80" @@ -1386,12 +306,6 @@ dependencies = [ "unicode-xid", ] -[[package]] -name = "target-lexicon" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab0e7238dcc7b40a7be719a25365910f6807bd864f4cce6b2e6b873658e2b19d" - [[package]] name = "termcolor" version = "1.1.2" @@ -1401,26 +315,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "thiserror" -version = "1.0.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "602eca064b2d83369e2b2f34b09c70b605402801927c65c11071ac911d299b88" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bad553cc2c78e8de258400763a647e80e6d1b31ee237275d756f6836d204494c" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "time" version = "0.1.44" @@ -1428,7 +322,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" dependencies = [ "libc", - "wasi 0.10.0+wasi-snapshot-preview1", + "wasi", "winapi", ] @@ -1455,48 +349,6 @@ dependencies = [ "toml", ] -[[package]] -name = "typenum" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b63708a265f51345575b27fe43f9500ad611579e764c79edbc2037b1121959ec" - -[[package]] -name = "typetag" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "422619e1a7299befb977a1f6d8932c499f6151dbcafae715193570860cae8f07" -dependencies = [ - "erased-serde", - "inventory", - "lazy_static", - "serde", - "typetag-impl", -] - -[[package]] -name = "typetag-impl" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "504f9626fe6cc1c376227864781996668e15c1ff251d222f63ef17f310bf1fec" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "ucd-trie" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" - -[[package]] -name = "unicode-segmentation" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" - [[package]] name = "unicode-xid" version = "0.2.2" @@ -1509,266 +361,15 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" dependencies = [ - "getrandom 0.2.3", + "getrandom", ] -[[package]] -name = "variant_count" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aae2faf80ac463422992abf4de234731279c058aaf33171ca70277c98406b124" -dependencies = [ - "quote", - "syn", -] - -[[package]] -name = "version_check" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" - -[[package]] -name = "void" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" - -[[package]] -name = "walrus" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d470d0583e65f4cab21a1ff3c1ba3dd23ae49e68f516f0afceaeb001b32af39" -dependencies = [ - "anyhow", - "id-arena", - "leb128", - "log", - "walrus-macro", - "wasmparser 0.59.0", -] - -[[package]] -name = "walrus-macro" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7c2bb690b44cb1b0fdcc54d4998d21f8bdaf706b93775425e440b174f39ad16" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - [[package]] name = "wasi" version = "0.10.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" -[[package]] -name = "wasmer-clif-backend-fl" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "532fb6cef712d9cd1ec68f9fc561447df33313393926f9bdb91fc3d67eed918f" -dependencies = [ - "byteorder", - "cranelift-codegen", - "cranelift-entity", - "cranelift-native", - "libc", - "nix", - "rayon", - "serde", - "serde-bench", - "serde_bytes", - "serde_derive", - "target-lexicon", - "wasmer-clif-fork-frontend", - "wasmer-clif-fork-wasm", - "wasmer-runtime-core-fl", - "wasmer-win-exception-handler", - "wasmparser 0.51.4", - "winapi", -] - -[[package]] -name = "wasmer-clif-fork-frontend" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c23f2824f354a00a77e4b040eef6e1d4c595a8a3e9013bad65199cc8dade9a5a" -dependencies = [ - "cranelift-codegen", - "log", - "smallvec", - "target-lexicon", -] - -[[package]] -name = "wasmer-clif-fork-wasm" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a35e21d3aebc51cc6ebc0e830cf8458a9891c3482fb3c65ad18d408102929ae5" -dependencies = [ - "cranelift-codegen", - "cranelift-entity", - "log", - "thiserror", - "wasmer-clif-fork-frontend", - "wasmparser 0.51.4", -] - -[[package]] -name = "wasmer-interface-types-fl" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14ba3b5a07989987994b96bf5cc7ac2947005f9ff6123d71b7064232f07d28fa" -dependencies = [ - "fluence-it-types", - "it-lilo", - "it-to-bytes", - "itertools 0.10.1", - "log", - "nom", - "safe-transmute", - "semver 0.11.0", - "serde", - "serde_json", - "thiserror", - "wast", -] - -[[package]] -name = "wasmer-runtime-core" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "740161245998752cf1a567e860fd6355df0336fedca6be1940ec7aaa59643220" -dependencies = [ - "bincode", - "blake3", - "cc", - "digest 0.8.1", - "errno", - "hex", - "indexmap", - "lazy_static", - "libc", - "nix", - "page_size", - "parking_lot", - "rustc_version", - "serde", - "serde-bench", - "serde_bytes", - "serde_derive", - "smallvec", - "target-lexicon", - "wasmparser 0.51.4", - "winapi", -] - -[[package]] -name = "wasmer-runtime-core-fl" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0d5ac3e0603e5f0ffaf11cbd854eea7c3b609ab4b676f71968f2bc47f9e3c4a" -dependencies = [ - "bincode", - "blake3", - "cc", - "digest 0.8.1", - "errno", - "hex", - "indexmap", - "lazy_static", - "libc", - "nix", - "page_size", - "parking_lot", - "rustc_version", - "serde", - "serde-bench", - "serde_bytes", - "serde_derive", - "smallvec", - "target-lexicon", - "wasmparser 0.51.4", - "winapi", -] - -[[package]] -name = "wasmer-runtime-fl" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5688460204d9f644d846300d041632cf34c4b4f83a955c0a67e600030376d2ee" -dependencies = [ - "lazy_static", - "memmap", - "serde", - "serde_derive", - "wasmer-clif-backend-fl", - "wasmer-runtime-core-fl", -] - -[[package]] -name = "wasmer-wasi-fl" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e0f331ec6fb16590946f61b2418cd5295c4f3aa772c77eb054bea250a8fdb71" -dependencies = [ - "bincode", - "byteorder", - "generational-arena", - "getrandom 0.1.16", - "libc", - "log", - "serde", - "thiserror", - "time", - "typetag", - "wasmer-runtime-core-fl", - "winapi", -] - -[[package]] -name = "wasmer-win-exception-handler" -version = "0.17.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd39f3b2bd7964b28ea6f944a7eaa445cfbc91c4f2695d188103f2689bb37d9" -dependencies = [ - "cc", - "libc", - "wasmer-runtime-core", - "winapi", -] - -[[package]] -name = "wasmparser" -version = "0.51.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aeb1956b19469d1c5e63e459d29e7b5aa0f558d9f16fcef09736f8a265e6c10a" - -[[package]] -name = "wasmparser" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a950e6a618f62147fd514ff445b2a0b53120d382751960797f85f058c7eda9b9" - -[[package]] -name = "wast" -version = "8.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9df3d716118a503b2f6bbb6ff46b21997ab0cc167b01de7a188e45e4b01e8d" -dependencies = [ - "leb128", -] - [[package]] name = "winapi" version = "0.3.9" diff --git a/Cargo.toml b/Cargo.toml index 761da89..538280c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,11 +1,43 @@ +[package] +name = "marine-rs-sdk" +version = "0.6.14" # remember to update html_root_url +description = "Fluence backend SDK for developing backend applications for the Fluence network" +documentation = "https://docs.rs/fluence" +repository = "https://github.com/fluencelabs/marine-rs-sdk" +authors = ["Fluence Labs"] +keywords = ["fluence", "marine", "sdk", "webassembly"] +categories = ["api-bindings", "wasm"] +license = "Apache-2.0" +edition = "2018" + +[package.metadata.docs.rs] +all-features = true + +[lib] +path = "src/lib.rs" +doctest = false + +[dependencies] +marine-macro = { path = "crates/marine-macro", version = "=0.6.14" } +marine-rs-sdk-main = { path = "crates/main", version = "=0.6.14" } +marine-timestamp-macro = { path = "crates/timestamp-macro", version = "=0.6.14" } + +serde = { version = "1.0.118", features = ["derive"]} + +[dev-dependencies] +trybuild = "1.0" + +[features] +# Print some internal logs by log_utf8_string +debug = ["marine-rs-sdk-main/debug"] + +# Enable logger (this will cause log_utf8_string to appear in imports) +logger = ["marine-rs-sdk-main/logger"] + [workspace] members = [ - "crates/main", - "crates/marine-macro", - "crates/marine-macro-impl", - "crates/marine-test-macro", - "crates/marine-test-macro-impl", - "crates/timestamp-macro", - "sdk", - "sdk-test" - ] + "crates/main", + "crates/marine-macro", + "crates/marine-macro-impl", + "crates/timestamp-macro", + ] diff --git a/README.md b/README.md index 1a20c52..77f3f6a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -![crates.io version](https://img.shields.io/crates/v/fluence?color=green) +[![crates.io version](https://img.shields.io/crates/v/marine-rs-sdk?color=green)](https://crates.io/crates/marine-rs-sdk) ## Marine Rust SDK diff --git a/crates/marine-test-macro-impl/Cargo.toml b/crates/marine-test-macro-impl/Cargo.toml deleted file mode 100644 index e00da2a..0000000 --- a/crates/marine-test-macro-impl/Cargo.toml +++ /dev/null @@ -1,29 +0,0 @@ -[package] -name = "marine-test-macro-impl" -version = "0.3.0" # remember to update html_root_url -edition = "2018" -description = "Implementation of the `#[marine_test]` macro" -documentation = "https://docs.rs/fluence/marine-test-macro-impl" -repository = "https://github.com/fluencelabs/marine-rs-sdk/tree/master/crates/marine-test-macro-impl" -authors = ["Fluence Labs"] -keywords = ["fluence", "marine", "sdk", "webassembly", "procedural_macros"] -categories = ["api-bindings", "wasm", "development-tools::testing"] -license = "Apache-2.0" - -[package.metadata.docs.rs] -all-features = true - -[dependencies] -fluence-app-service = { version = "0.9.0", features = ["raw-module-api"] } -marine-it-parser = "0.6.5" -itertools = "0.10.1" -darling = "0.12.2" -quote = "1.0.9" -proc-macro2 = "1.0.26" -proc-macro-error = { version = "1.0.4", default-features = false } -syn = { version = '1.0.64', features = ['full'] } -thiserror = "1.0.24" -static_assertions = "1.1.0" - -[dev-dependencies] -marine-macro-testing-utils = {path = "../macro-testing-utils"} diff --git a/crates/marine-test-macro-impl/src/attributes.rs b/crates/marine-test-macro-impl/src/attributes.rs deleted file mode 100644 index 17a83f9..0000000 --- a/crates/marine-test-macro-impl/src/attributes.rs +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2020 Fluence Labs Limited - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -use darling::FromMeta; -use std::collections::HashMap; - -/// Describes attributes of `marine_test` macro. -#[derive(Debug, Clone)] -pub(crate) enum MTestAttributes { - SingleService(ServiceDescription), - MultipleServices(HashMap), -} - -#[derive(Debug, Default, Clone, FromMeta)] -pub(crate) struct ServiceDescription { - /// Path to a config file of a tested service. - pub(crate) config_path: String, - - /// Path to compiled modules of a service. - #[darling(default)] - pub(crate) modules_dir: Option, -} - -impl FromMeta for MTestAttributes { - fn from_list(items: &[syn::NestedMeta]) -> darling::Result { - let single_service = ServiceDescription::from_list(items); - let multiple_services = HashMap::::from_list(items); - match (single_service, multiple_services) { - (Ok(modules), Err(_)) => Ok(Self::SingleService(modules)), - (Err(_), Ok(services)) if !services.is_empty() => Ok(Self::MultipleServices(services)), - (Err(_), Ok(_)) => Err(darling::Error::custom( - r#"Need to specify "config_path" and "modules_dir" or several named services with these fields "#, - )), - (Err(error_single), Err(error_multiple)) => Err(darling::error::Error::multiple(vec![ - error_single, - error_multiple, - ])), - (Ok(_), Ok(_)) => Err(darling::Error::custom( - "internal sdk error: marine_test attributes are ambiguous", - )), - } - } -} diff --git a/crates/marine-test-macro-impl/src/errors.rs b/crates/marine-test-macro-impl/src/errors.rs deleted file mode 100644 index 48402db..0000000 --- a/crates/marine-test-macro-impl/src/errors.rs +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright 2020 Fluence Labs Limited - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -use marine_it_parser::ITParserError; -use fluence_app_service::AppServiceError; - -use darling::Error as DarlingError; -use syn::Error as SynError; -use thiserror::Error as ThisError; - -use std::path::PathBuf; - -#[derive(Debug, ThisError)] -pub enum TestGeneratorError { - #[error("Can't load Wasm modules into Marine: {0}")] - ITParserError(#[from] ITParserError), - - #[error("{0}")] - CorruptedITSection(#[from] CorruptedITSection), - - #[error("{0}")] - SynError(#[from] SynError), - - #[error("Can't load Wasm modules from the provided config: {0}")] - ConfigLoadError(#[from] AppServiceError), - - #[error("{0}")] - AttributesError(#[from] DarlingError), - - #[error( - "neither modules_dir attribute specified nor service config contains modules_dir, please specify one of them" - )] - ModulesDirUnspecified, - - #[error("a Wasm file compiled with newer version of sdk that supports multi-value")] - ManyFnOutputsUnsupported, - - #[error("{0} is invalid UTF8 path")] - InvalidUTF8Path(PathBuf), - - #[error(r#"a "self" argument found and it is not supported in test function"#)] - UnexpectedSelf, - - #[error("Duplicate module: {0}")] - DuplicateModuleName(String), - - #[error("No modules loaded for a service")] - NoModulesInService, -} - -#[derive(Debug, ThisError)] -pub enum CorruptedITSection { - #[error("record with {0} is absent in embedded IT section")] - AbsentRecord(u64), -} diff --git a/crates/marine-test-macro-impl/src/lib.rs b/crates/marine-test-macro-impl/src/lib.rs deleted file mode 100644 index ae3d902..0000000 --- a/crates/marine-test-macro-impl/src/lib.rs +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2020 Fluence Labs Limited - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#![deny( - dead_code, - nonstandard_style, - unused_imports, - unused_mut, - unused_variables, - unused_unsafe, - unreachable_patterns -)] -#![warn(rust_2018_idioms)] -#![recursion_limit = "1024"] - -mod attributes; -mod errors; -mod marine_test; - -pub use marine_test::marine_test_impl; -pub use errors::TestGeneratorError; - -pub(crate) type TResult = std::result::Result; diff --git a/crates/marine-test-macro-impl/src/marine_test/config_utils.rs b/crates/marine-test-macro-impl/src/marine_test/config_utils.rs deleted file mode 100644 index 7300ba7..0000000 --- a/crates/marine-test-macro-impl/src/marine_test/config_utils.rs +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright 2021 Fluence Labs Limited - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -use crate::{TResult, TestGeneratorError}; - -use fluence_app_service::TomlAppServiceConfig; -use marine_it_parser::module_it_interface; -use marine_it_parser::it_interface::IModuleInterface; - -use std::path::{PathBuf, Path}; - -#[derive(Debug, Clone, PartialEq, Eq)] -pub(super) struct Module<'m> { - pub name: &'m str, - pub interface: IModuleInterface, -} - -impl<'m> Module<'m> { - fn new(name: &'m str, interface: IModuleInterface) -> Self { - Self { name, interface } - } -} - -pub(crate) struct ConfigWrapper { - pub config: TomlAppServiceConfig, - pub resolved_modules_dir: PathBuf, -} - -pub(crate) fn load_config( - config_path: &str, - modules_dir: Option, - file_path: &Path, -) -> TResult { - let config_path_buf = file_path.join(&config_path); - - let marine_config = TomlAppServiceConfig::load(&config_path_buf)?; - let modules_dir = match resolve_modules_dir(&marine_config, modules_dir) { - Some(modules_dir) => modules_dir, - None => return Err(TestGeneratorError::ModulesDirUnspecified), - }; - - Ok(ConfigWrapper { - config: marine_config, - resolved_modules_dir: modules_dir, - }) -} - -/// Returns all modules the provided config consists of. -pub(super) fn collect_modules<'config>( - config: &'config TomlAppServiceConfig, - modules_dir: &Path, -) -> TResult>> { - let module_paths = collect_module_paths(config, &modules_dir); - - module_paths - .into_iter() - .map(|(name, path)| module_it_interface(path).map(|interface| Module::new(name, interface))) - .collect::, _>>() - .map_err(Into::into) -} - -fn collect_module_paths<'config>( - config: &'config TomlAppServiceConfig, - modules_dir: &Path, -) -> Vec<(&'config str, PathBuf)> { - config - .toml_faas_config - .module - .iter() - .map(|m| { - let module_file_name = m.file_name.as_ref().unwrap_or(&m.name); - let module_file_name = PathBuf::from(module_file_name); - // TODO: is it correct to always have .wasm extension? - let module_path = modules_dir.join(module_file_name).with_extension("wasm"); - - (m.name.as_str(), module_path) - }) - .collect::>() -} - -/// Tries to determine a dir with compiled Wasm modules according to the following rules: -/// - if the modules_dir attribute is specified (by user) it will be chosen, -/// - otherwise if modules_dir is specified in AppService config it will be chosen, -/// - otherwise None will be returned. -pub(super) fn resolve_modules_dir( - config: &TomlAppServiceConfig, - modules_dir: Option, -) -> Option { - match modules_dir { - Some(modules_dir) => Some(PathBuf::from(modules_dir)), - None => config - .toml_faas_config - .modules_dir - .as_ref() - .map(PathBuf::from), - } -} diff --git a/crates/marine-test-macro-impl/src/marine_test/glue_code_generator.rs b/crates/marine-test-macro-impl/src/marine_test/glue_code_generator.rs deleted file mode 100644 index efc6ca7..0000000 --- a/crates/marine-test-macro-impl/src/marine_test/glue_code_generator.rs +++ /dev/null @@ -1,245 +0,0 @@ -/* - * Copyright 2021 Fluence Labs Limited - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -use crate::attributes::{MTestAttributes, ServiceDescription}; -use crate::marine_test; -use crate::marine_test::{config_utils, token_stream_generator}; -use crate::TestGeneratorError; -use crate::TResult; - -use std::path::PathBuf; - -use proc_macro2::TokenStream; -use quote::quote; -use quote::ToTokens; -use syn::FnArg; -use std::collections::HashMap; - -/// Generates glue code for tests. -/// F.e. for this test for the greeting service -///```ignore -/// #[marine_test( -/// config_path = "/path/to/service/config/Config.toml", -/// modules_dir = "/path/to/modules/dir" -/// )] -/// fn test() { -/// let result = greeting.greeting("John".to_string()); -/// assert_eq(result.as_str(), "Hi, John!"); -/// } -/// ``` -/// -/// the following glue code would be generated: -///```ignore -/// // (0) -/// pub mod __m_generated_greeting { -/// struct MGeneratedStructgreeting { -/// marine: std::rc::Rc>, -/// } -/// -/// impl MGeneratedStructgreeting { -/// pub fn new(marine: std::rc::Rc>) -> Self { -/// Self { marine } -/// } -/// -/// pub fn greeting(&mut self, name: String) -> String { -/// use std::ops::DerefMut; -/// let arguments = marine_rs_sdk_test::internal::serde_json::json!([name]); -/// let result = self -/// .marine -/// .as_ref -/// .borrow_mut() -/// .call_with_module_name("greeting", "greeting", arguments, <_>::default()) -/// .expect("call to Marine failed"); -/// let result: String = marine_rs_sdk_test::internal::serde_json::from_value(result) -/// .expect("the default deserializer shouldn't fail"); -/// result -/// } -/// } -///} -/// // (1) -/// let tmp_dir = std::env::temp_dir(); -/// let service_id = marine_rs_sdk_test::internal::Uuid::new_v4().to_string(); -/// -/// let tmp_dir = tmp_dir.join(&service_id); -/// let tmp_dir = tmp_dir.to_string_lossy().to_string(); -/// std::fs::create_dir(&tmp_dir).expect("can't create a directory for service in tmp"); -/// -/// let mut __m_generated_marine_config = marine_rs_sdk_test::internal::TomlAppServiceConfig::load("/path/to/greeting/Config.toml".to_string()) -/// .unwrap_or_else(|e| { -/// panic!( -/// "app service located at `{}` config can't be loaded: {}", -/// "/path/to/greeting/Config.toml", e -/// ) -/// }); -/// -/// __m_generated_marine_config.service_base_dir = Some("/path/to/tmp".to_string()); -/// -/// let marine = marine_rs_sdk_test::internal::AppService::new_with_empty_facade( -/// __m_generated_marine_config, -/// "3640e972-92e3-47cb-b95f-4e3c5bcf0f14", -/// std::collections::HashMap::new(), -/// ).unwrap_or_else(|e| panic!("app service can't be created: {}", e)); -/// -/// let marine = std::rc::Rc::new(std::cell::RefCell::new(marine)); -/// -/// // (2) -/// -/// let mut greeting = __m_generated_greeting::MGeneratedStructgreeting::new(marine); -/// -/// // (3) -/// -/// let result = greeting.greeting("John".to_string()); -/// assert_eq(result.as_str(), "Hi, John!"); -/// -/// // (4) -///``` -/// -/// Example code above corresponds to the macro definition in the following way: -/// [(0), (1)] - module_definitions* -/// [(1), (2)] - app_service_ctor -/// [(2), (3)] - module_ctors* -/// [(3), (4)] - original_block -pub(super) fn generate_test_glue_code( - func_item: syn::ItemFn, - attrs: MTestAttributes, - test_file_path: PathBuf, -) -> TResult { - match attrs { - MTestAttributes::MultipleServices(services) => { - generate_test_glue_code_multiple_services(func_item, services, test_file_path) - } - MTestAttributes::SingleService(service) => { - generate_test_glue_code_single_service(func_item, service, test_file_path) - } - } -} - -fn generate_test_glue_code_single_service( - func_item: syn::ItemFn, - service: ServiceDescription, - test_file_path: PathBuf, -) -> TResult { - let config_wrapper = - config_utils::load_config(&service.config_path, service.modules_dir, &test_file_path)?; - let modules_dir_test_relative = test_file_path.join(&config_wrapper.resolved_modules_dir); - let module_interfaces = - config_utils::collect_modules(&config_wrapper.config, &modules_dir_test_relative)?; - let linked_modules = marine_test::modules_linker::link_modules( - module_interfaces - .iter() - .map(|module| (module.name, &module.interface)), - )?; - - let module_definitions = token_stream_generator::generate_module_definitions( - module_interfaces.iter(), - &linked_modules, - )?; - - let original_block = func_item.block; - let signature = func_item.sig; - let name = &signature.ident; - let inputs = &signature.inputs; - let arg_names = generate_arg_names(inputs.iter())?; - let module_ctors = generate_module_ctors(inputs.iter())?; - let app_service_ctor = token_stream_generator::generate_app_service_ctor( - &service.config_path, - &config_wrapper.resolved_modules_dir, - )?; - let glue_code = quote! { - #[test] - fn #name() { - // definitions for wasm modules specified in config - pub mod marine_test_env { - #(#module_definitions)* - } - // AppService constructor and instantiation to implicit `marine` variable - #app_service_ctor - - // constructors of all modules of the tested service - #(#module_ctors)* - - fn test_func(#inputs) { - #(let mut #arg_names = #arg_names;)* - // original test function as is - #original_block - } - - test_func(#(#arg_names,)*) - } - }; - - Ok(glue_code) -} - -fn generate_test_glue_code_multiple_services( - func_item: syn::ItemFn, - services: HashMap, - test_file_path: PathBuf, -) -> TResult { - let service_definitions = - token_stream_generator::generate_service_definitions(services, &test_file_path)?; - - let original_block = func_item.block; - let signature = func_item.sig; - let name = &signature.ident; - let glue_code = quote! { - #[test] - fn #name() { - // definitions for services specified in attributes - pub mod marine_test_env { - #(#service_definitions)* - } - - fn test_func() { - #original_block - } - - test_func() - } - }; - - Ok(glue_code) -} - -fn generate_module_ctors<'inputs>( - inputs: impl Iterator, -) -> TResult> { - inputs - .map(|x| -> TResult<_> { - match x { - FnArg::Receiver(_) => Err(TestGeneratorError::UnexpectedSelf), - FnArg::Typed(x) => { - let pat = &x.pat; - let ty = &x.ty; - Ok(quote! {let mut #pat = #ty::new(marine.clone());}) - } - } - }) - .collect::>() -} - -fn generate_arg_names<'inputs>( - inputs: impl Iterator, -) -> TResult> { - inputs - .map(|x| -> TResult<_> { - match x { - FnArg::Receiver(_) => Err(TestGeneratorError::UnexpectedSelf), - FnArg::Typed(x) => Ok(x.pat.to_token_stream()), - } - }) - .collect::>() -} diff --git a/crates/marine-test-macro-impl/src/marine_test/marine_test_impl.rs b/crates/marine-test-macro-impl/src/marine_test/marine_test_impl.rs deleted file mode 100644 index 832fc5a..0000000 --- a/crates/marine-test-macro-impl/src/marine_test/marine_test_impl.rs +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2021 Fluence Labs Limited - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -use crate::attributes::MTestAttributes; -use crate::TResult; -use crate::marine_test::glue_code_generator::generate_test_glue_code; - -use proc_macro2::TokenStream; -use darling::FromMeta; -use syn::parse::Parser; -use std::path::PathBuf; - -pub fn marine_test_impl( - attrs: TokenStream, - input: TokenStream, - file_path: PathBuf, -) -> TResult { - // from https://github.com/dtolnay/syn/issues/788 - let parser = syn::punctuated::Punctuated::::parse_terminated; - let attrs = parser.parse2(attrs)?; - let attrs: Vec = attrs.into_iter().collect(); - let attrs = MTestAttributes::from_list(&attrs)?; - - let func_item = syn::parse2::(input)?; - - generate_test_glue_code(func_item, attrs, file_path) -} diff --git a/crates/marine-test-macro-impl/src/marine_test/mod.rs b/crates/marine-test-macro-impl/src/marine_test/mod.rs deleted file mode 100644 index 7ca8eb2..0000000 --- a/crates/marine-test-macro-impl/src/marine_test/mod.rs +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 2021 Fluence Labs Limited - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -mod config_utils; -mod marine_test_impl; -mod glue_code_generator; -mod token_stream_generator; -mod utils; -mod modules_linker; - -pub use marine_test_impl::marine_test_impl; diff --git a/crates/marine-test-macro-impl/src/marine_test/modules_linker.rs b/crates/marine-test-macro-impl/src/marine_test/modules_linker.rs deleted file mode 100644 index 19b06eb..0000000 --- a/crates/marine-test-macro-impl/src/marine_test/modules_linker.rs +++ /dev/null @@ -1,195 +0,0 @@ -/* - * Copyright 2021 Fluence Labs Limited - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -use crate::{TResult, TestGeneratorError}; - -use marine_it_parser::it_interface::{IRecordTypes, IModuleInterface}; -use marine_it_parser::it_interface::it::{IType, IRecordType}; - -use itertools::zip; -use std::cmp::Ordering; -use std::collections::HashMap; -use std::hash::Hasher; -use std::rc::Rc; -use static_assertions::const_assert; - -pub(super) fn link_modules<'modules>( - modules: impl ExactSizeIterator, -) -> TResult> { - let mut all_record_types = HashMap::, &str>::new(); - let mut linked_modules = HashMap::<&str, LinkedModule<'_>>::new(); - - for (name, interface) in modules { - let mut linking_module = LinkedModule::default(); - for record_type in interface.record_types.values() { - let record_type_ex = - IRecordTypeClosed::new(record_type.clone(), &interface.record_types); - - let entry = match all_record_types.get(&record_type_ex) { - Some(owner_module) => RecordEntry::Use(UseDescription { - from: owner_module, - name: &record_type.name, - }), - None => { - all_record_types.insert(record_type_ex.clone(), name); - RecordEntry::Declare(record_type_ex) - } - }; - - linking_module.records.push(entry); - } - - if linked_modules.insert(name, linking_module).is_some() { - return Err(TestGeneratorError::DuplicateModuleName(name.to_string())); - } - } - - Ok(linked_modules) -} - -struct ITypeClosed<'r> { - ty: &'r IType, - records: &'r IRecordTypes, -} - -impl<'r> ITypeClosed<'r> { - fn new(ty: &'r IType, records: &'r IRecordTypes) -> Self { - Self { ty, records } - } -} - -impl PartialEq for ITypeClosed<'_> { - fn eq(&self, other: &Self) -> bool { - use IType::*; - // check if new variants require special handling in the match below - #[allow(unused)] - const LAST_VERIFIED_ITYPE_SIZE: usize = 17; - const_assert!(IType::VARIANT_COUNT == LAST_VERIFIED_ITYPE_SIZE); - - match (&self.ty, &other.ty) { - (Array(self_ty), Array(other_ty)) => { - ITypeClosed::new(self_ty, self.records) == ITypeClosed::new(other_ty, other.records) - } - (Record(self_record), Record(other_record)) => { - let self_record = self.records.get(self_record); - let other_record = other.records.get(other_record); - - // ID from Record(ID) potentially may not be in .records, if it happens comparision is always FALSE - match (self_record, other_record) { - (None, _) => false, - (_, None) => false, - (Some(self_record), Some(other_record)) => { - IRecordTypeClosed::new(self_record.clone(), self.records) - == IRecordTypeClosed::new(other_record.clone(), other.records) - } - } - } - (lhs, rhs) if lhs == rhs => true, - _ => false, - } - } -} - -#[derive(Clone)] -pub struct IRecordTypeClosed<'r> { - pub record_type: Rc, - pub records: &'r IRecordTypes, -} - -impl<'r> IRecordTypeClosed<'r> { - fn new(record_type: Rc, records: &'r IRecordTypes) -> Self { - Self { - record_type, - records, - } - } -} - -impl PartialEq for IRecordTypeClosed<'_> { - fn eq(&self, other: &Self) -> bool { - let names_are_equal = self.record_type.name == other.record_type.name; - names_are_equal && fields_are_equal(self, other) - } -} - -fn fields_are_equal(lhs: &IRecordTypeClosed<'_>, rhs: &IRecordTypeClosed<'_>) -> bool { - let same_fields_count = lhs.record_type.fields.len() == rhs.record_type.fields.len(); - same_fields_count - && zip(lhs.record_type.fields.iter(), rhs.record_type.fields.iter()).all( - |(lhs_field, rhs_field)| -> bool { - lhs_field.name == rhs_field.name - && ITypeClosed::new(&lhs_field.ty, lhs.records) - == ITypeClosed::new(&rhs_field.ty, rhs.records) - }, - ) -} - -impl PartialOrd for IRecordTypeClosed<'_> { - fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) - } -} - -impl Ord for IRecordTypeClosed<'_> { - fn cmp(&self, other: &Self) -> Ordering { - self.record_type.name.cmp(&other.record_type.name) - } -} - -impl Eq for IRecordTypeClosed<'_> {} - -impl std::hash::Hash for IRecordTypeClosed<'_> { - fn hash(&self, state: &mut H) { - self.record_type.name.hash(state); - } -} - -pub type LinkedModules<'r> = HashMap<&'r str, LinkedModule<'r>>; - -#[derive(Ord, PartialOrd, Eq, PartialEq, Hash)] -pub struct UseDescription<'r> { - pub from: &'r str, - pub name: &'r str, -} - -#[derive(PartialEq, Eq)] -pub enum RecordEntry<'r> { - Use(UseDescription<'r>), - Declare(IRecordTypeClosed<'r>), -} - -impl PartialOrd for RecordEntry<'_> { - fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) - } -} - -impl Ord for RecordEntry<'_> { - fn cmp(&self, other: &Self) -> Ordering { - use RecordEntry::*; - match (self, other) { - (Use(_), Declare(_)) => Ordering::Less, - (Declare(_), Use(_)) => Ordering::Greater, - (Use(lhs), Use(rhs)) => lhs.cmp(rhs), - (Declare(lhs), Declare(rhs)) => lhs.record_type.name.cmp(&rhs.record_type.name), - } - } -} - -#[derive(Default)] -pub struct LinkedModule<'all> { - pub records: Vec>, -} diff --git a/crates/marine-test-macro-impl/src/marine_test/token_stream_generator.rs b/crates/marine-test-macro-impl/src/marine_test/token_stream_generator.rs deleted file mode 100644 index 5396301..0000000 --- a/crates/marine-test-macro-impl/src/marine_test/token_stream_generator.rs +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright 2021 Fluence Labs Limited - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -mod methods_generator; -mod methods_generator_utils; -mod record_type_generator; -mod service_generator; -mod service_generation_utils; - -use crate::marine_test::config_utils::Module; -use crate::marine_test::modules_linker::{LinkedModule, LinkedModules, UseDescription}; -use crate::marine_test::utils; -use crate::TResult; - -pub(super) use service_generator::generate_service_definitions; -pub(super) use service_generation_utils::generate_app_service_ctor; - -use proc_macro2::TokenStream; -use quote::quote; -use crate::marine_test::utils::new_ident; - -/// Generates definitions of modules and records of this modules. -/// F.e. for the greeting service the following definitions would be generated: -///```ignore -/// pub mod __m_generated_greeting { -/// struct MGeneratedStructgreeting { -/// marine: std::rc::Rc>, -/// } -/// -/// impl MGeneratedStructgreeting { -/// pub fn new(marine: std::rc::Rc>) -> Self { -/// Self { marine } -/// } -/// -/// pub fn greeting(&mut self, name: String) -> String { -/// use std::ops::DerefMut; -/// let arguments = marine_rs_sdk_test::internal::serde_json::json!([name]); -/// let result = self -/// .marine -/// .as_ref -/// .borrow_mut() -/// .call_with_module_name("greeting", "greeting", arguments, <_>::default()) -/// .expect("call to Marine failed"); -/// let result: String = marine_rs_sdk_test::internal::serde_json::from_value(result) -/// .expect("the default deserializer shouldn't fail"); -/// result -/// } -/// } -/// } -///``` -pub(super) fn generate_module_definitions<'i>( - modules: impl ExactSizeIterator>, - linked_modules: &'i LinkedModules<'_>, -) -> TResult> { - modules - .into_iter() - .map(|value| { - // linked_modules are built from modules, so unwrap is safe - let content = generate_module_definition( - value, - linked_modules.get(&value.name).unwrap(), - module_import_generator, - )?; - let module_ident = new_ident(&value.name)?; - Ok(quote! { - pub mod #module_ident { - #content - } - }) - }) - .collect::>>() -} - -fn generate_module_definition( - module: &Module<'_>, - linked_module: &'_ LinkedModule<'_>, - import_generator: fn(info: &UseDescription<'_>) -> TResult, -) -> TResult { - let struct_ident = utils::new_ident("ModuleInterface")?; - let module_records = record_type_generator::generate_records(linked_module, import_generator)?; - let module_functions = methods_generator::generate_module_methods( - module.name, - module.interface.function_signatures.iter(), - &module.interface.record_types, - )?; - - let module_definition = quote! { - #(#module_records)* - - pub struct #struct_ident { - marine: std::rc::Rc, >, - } - - impl #struct_ident { - pub fn new(marine: std::rc::Rc, >) -> Self { - Self { marine } - } - } - - impl #struct_ident { - #(#module_functions)* - } - }; - - Ok(module_definition) -} - -fn module_import_generator(info: &UseDescription<'_>) -> TResult { - let from_module_ident = utils::new_ident(info.from)?; - let record_name_ident = utils::new_ident(info.name)?; - Ok(quote! {pub use super::#from_module_ident::#record_name_ident;}) -} diff --git a/crates/marine-test-macro-impl/src/marine_test/token_stream_generator/methods_generator.rs b/crates/marine-test-macro-impl/src/marine_test/token_stream_generator/methods_generator.rs deleted file mode 100644 index c458958..0000000 --- a/crates/marine-test-macro-impl/src/marine_test/token_stream_generator/methods_generator.rs +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2021 Fluence Labs Limited - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -use super::methods_generator_utils::*; -use crate::TResult; - -use marine_it_parser::it_interface::IFunctionSignature; -use marine_it_parser::it_interface::IRecordTypes; - -use itertools::Itertools; - -pub(super) fn generate_module_methods<'m, 'r>( - module_name: &str, - method_signatures: impl ExactSizeIterator, - records: &'r IRecordTypes, -) -> TResult> { - use CallParametersSettings::*; - - let methods_count = 2 * method_signatures.len(); - method_signatures - .sorted_by(|lhs, rhs| lhs.name.cmp(&rhs.name)) - .try_fold::<_, _, TResult<_>>( - Vec::with_capacity(methods_count), - |mut methods, signature| { - let default_cp = generate_module_method(module_name, &signature, Default, records)?; - let user_cp = - generate_module_method(module_name, &signature, UserDefined, records)?; - - methods.push(default_cp); - methods.push(user_cp); - - Ok(methods) - }, - ) -} - -pub fn generate_facade_methods<'m, 'r>( - method_signatures: impl ExactSizeIterator, - records: &'r IRecordTypes, -) -> TResult> { - use CallParametersSettings::*; - - let methods_count = 2 * method_signatures.len(); - method_signatures - .sorted_by(|lhs, rhs| lhs.name.cmp(&rhs.name)) - .try_fold::<_, _, TResult<_>>( - Vec::with_capacity(methods_count), - |mut methods, signature| { - let default_cp = generate_module_method_forward(&signature, Default, records)?; - let user_cp = generate_module_method_forward(&signature, UserDefined, records)?; - - methods.push(default_cp); - methods.push(user_cp); - - Ok(methods) - }, - ) -} diff --git a/crates/marine-test-macro-impl/src/marine_test/token_stream_generator/methods_generator_utils.rs b/crates/marine-test-macro-impl/src/marine_test/token_stream_generator/methods_generator_utils.rs deleted file mode 100644 index 91def5c..0000000 --- a/crates/marine-test-macro-impl/src/marine_test/token_stream_generator/methods_generator_utils.rs +++ /dev/null @@ -1,245 +0,0 @@ -/* - * Copyright 2021 Fluence Labs Limited - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -use crate::marine_test::utils::new_ident; -use crate::marine_test::utils::itype_to_tokens; -use crate::TResult; - -use marine_it_parser::it_interface::it::IType; -use marine_it_parser::it_interface::it::IFunctionArg; -use marine_it_parser::it_interface::IRecordTypes; -use marine_it_parser::it_interface::IFunctionSignature; - -use proc_macro2::TokenStream; -use quote::quote; - -#[derive(Clone, Copy)] -pub(super) enum CallParametersSettings { - Default, - UserDefined, -} - -pub(super) fn generate_module_method( - module_name: &str, - signature: &IFunctionSignature, - cp_setting: CallParametersSettings, - records: &IRecordTypes, -) -> TResult { - let arguments = generate_arguments(signature.arguments.iter(), records)?; - let output_type = generate_output_type(&signature.outputs, records)?; - let mcall = generate_marine_call(module_name, cp_setting, &signature, records)?; - - let (cp, func_name) = generate_call_parameters(&cp_setting, signature)?; - - let module_method = quote! { - pub fn #func_name(&mut self, #(#arguments),* #cp) #output_type { - #mcall - } - }; - - Ok(module_method) -} - -pub(super) fn generate_module_method_forward( - signature: &IFunctionSignature, - cp_setting: CallParametersSettings, - records: &IRecordTypes, -) -> TResult { - let arguments = generate_arguments(signature.arguments.iter(), records)?; - let output_type = generate_output_type(&signature.outputs, records)?; - let mcall = generate_forward_call(cp_setting, &signature)?; - - let (cp, func_name) = generate_call_parameters(&cp_setting, signature)?; - - let module_method = quote! { - pub fn #func_name(&mut self, #(#arguments),* #cp) #output_type { - #mcall - } - }; - - Ok(module_method) -} - -fn generate_marine_call( - module_name: &str, - cp_settings: CallParametersSettings, - method_signature: &IFunctionSignature, - records: &IRecordTypes, -) -> TResult { - let args = method_signature.arguments.iter().map(|a| a.name.as_str()); - let convert_arguments = generate_arguments_converter(args)?; - - let output_type = get_output_type(&method_signature.outputs)?; - let set_result = generate_set_result(&output_type); - let function_call = generate_function_call(module_name, &method_signature.name, cp_settings); - let convert_result_to_output_type = generate_convert_to_output(&output_type, records)?; - let ret = generate_ret(&output_type); - - let function_call = quote! { - use std::ops::DerefMut; - - #convert_arguments - - #set_result #function_call - - #convert_result_to_output_type - - #ret - }; - - Ok(function_call) -} - -fn generate_forward_call( - cp_settings: CallParametersSettings, - method_signature: &IFunctionSignature, -) -> TResult { - let mut args = method_signature - .arguments - .iter() - .map(|a| new_ident(a.name.as_str())) - .collect::>>()?; - - let method_name = if let CallParametersSettings::UserDefined = cp_settings { - args.push(new_ident("cp")?); - new_ident(format!("{}_cp", method_signature.name.as_str()).as_str())? - } else { - new_ident(method_signature.name.as_str())? - }; - - let function_call = quote! { - self.__facade.#method_name(#(#args,)*) - }; - - Ok(function_call) -} - -/// Generates type convertor to json because of AppService receives them in json. -fn generate_arguments_converter<'a>( - args: impl ExactSizeIterator, -) -> TResult { - let arg_idents: Vec = args.map(new_ident).collect::>()?; - - let args_converter = quote! { let arguments = marine_rs_sdk_test::internal::serde_json::json!([#(#arg_idents),*]); }; - - Ok(args_converter) -} - -fn generate_function_call( - module_name: &str, - method_name: &str, - cp_setting: CallParametersSettings, -) -> TokenStream { - let cp = match cp_setting { - CallParametersSettings::Default => quote! { <_>::default() }, - CallParametersSettings::UserDefined => quote! { cp }, - }; - - quote! { self.marine.as_ref().borrow_mut().call_module(#module_name, #method_name, arguments, #cp).expect("call to Marine failed"); } -} - -fn generate_set_result(output_type: &Option<&IType>) -> TokenStream { - match output_type { - Some(_) => quote! { let result = }, - None => TokenStream::new(), - } -} - -fn generate_convert_to_output( - output_type: &Option<&IType>, - records: &IRecordTypes, -) -> TResult { - let result_stream = match output_type { - Some(ty) => { - let ty = itype_to_tokens(ty, records)?; - quote! { - let result: #ty = marine_rs_sdk_test::internal::serde_json::from_value(result).expect("the default deserializer shouldn't fail"); - } - } - None => TokenStream::new(), - }; - - Ok(result_stream) -} - -fn generate_ret(output_type: &Option<&IType>) -> TokenStream { - match output_type { - Some(_) => quote! { result }, - None => TokenStream::new(), - } -} - -fn generate_arguments<'a, 'r>( - arguments: impl ExactSizeIterator, - records: &'r IRecordTypes, -) -> TResult> { - arguments - .map(|argument| -> TResult<_> { - let arg_name = new_ident(&argument.name)?; - let arg_type = itype_to_tokens(&argument.ty, records)?; - - let arg = quote! { #arg_name: #arg_type }; - Ok(arg) - }) - .collect::>>() -} - -fn generate_output_type(output_types: &[IType], records: &IRecordTypes) -> TResult { - let output_type = get_output_type(output_types)?; - match output_type { - None => Ok(TokenStream::new()), - Some(ty) => { - let output_type = itype_to_tokens(&ty, records)?; - let output_type = quote! { -> #output_type }; - - Ok(output_type) - } - } -} - -fn get_output_type(output_types: &[IType]) -> TResult> { - use crate::TestGeneratorError::ManyFnOutputsUnsupported; - - match output_types.len() { - 0 => Ok(None), - 1 => Ok(Some(&output_types[0])), - _ => Err(ManyFnOutputsUnsupported), - } -} - -fn generate_call_parameters( - cp_setting: &CallParametersSettings, - signature: &IFunctionSignature, -) -> TResult<(TokenStream, syn::Ident)> { - match cp_setting { - CallParametersSettings::Default => { - let func_name = new_ident(&signature.name)?; - Ok((TokenStream::new(), func_name)) - } - CallParametersSettings::UserDefined => { - let maybe_comma = if signature.arguments.is_empty() { - TokenStream::new() - } else { - quote! { , } - }; - - let cp = quote! { #maybe_comma cp: marine_rs_sdk_test::CallParameters }; - let func_name = format!("{}_cp", signature.name); - let func_name = new_ident(&func_name)?; - Ok((cp, func_name)) - } - } -} diff --git a/crates/marine-test-macro-impl/src/marine_test/token_stream_generator/record_type_generator.rs b/crates/marine-test-macro-impl/src/marine_test/token_stream_generator/record_type_generator.rs deleted file mode 100644 index 6dd0400..0000000 --- a/crates/marine-test-macro-impl/src/marine_test/token_stream_generator/record_type_generator.rs +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2021 Fluence Labs Limited - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -use crate::marine_test::utils; -use crate::TResult; - -use marine_it_parser::it_interface::it::IRecordFieldType; -use marine_it_parser::it_interface::IRecordTypes; - -use proc_macro2::TokenStream; -use quote::quote; - -use crate::marine_test::modules_linker::{LinkedModule, RecordEntry, UseDescription}; -use itertools::Itertools; - -pub(super) fn generate_records( - linked_module: &LinkedModule<'_>, - import_generator: fn(info: &UseDescription<'_>) -> TResult, -) -> TResult> { - linked_module.records - .iter() - .sorted() - .map(|record| -> TResult<_> { - use RecordEntry::*; - match record { - Use(use_info) => import_generator(use_info), - Declare(record) => { - let record_name_ident = utils::new_ident(&record.record_type.name)?; - let fields = prepare_field(record.record_type.fields.iter(), record.records)?; - - Ok(quote! { - #[derive(Clone, Debug, marine_rs_sdk_test::internal::serde::Serialize, marine_rs_sdk_test::internal::serde::Deserialize)] - #[serde(crate = "marine_rs_sdk_test::internal::serde")] - pub struct #record_name_ident { - #(pub #fields),* - } - }) - } - } - }) - .collect::>>() -} - -fn prepare_field<'f>( - fields: impl ExactSizeIterator, - records: &IRecordTypes, -) -> TResult> { - fields - .map(|field| -> TResult<_> { - let field_name = utils::new_ident(&field.name)?; - let field_type = utils::itype_to_tokens(&field.ty, records)?; - - let generated_field = quote! { #field_name: #field_type }; - - Ok(generated_field) - }) - .collect::>>() -} diff --git a/crates/marine-test-macro-impl/src/marine_test/token_stream_generator/service_generation_utils.rs b/crates/marine-test-macro-impl/src/marine_test/token_stream_generator/service_generation_utils.rs deleted file mode 100644 index 6d09490..0000000 --- a/crates/marine-test-macro-impl/src/marine_test/token_stream_generator/service_generation_utils.rs +++ /dev/null @@ -1,204 +0,0 @@ -use crate::TResult; -use crate::TestGeneratorError; -use crate::marine_test::config_utils::Module; -use crate::marine_test::utils::new_ident; -use crate::marine_test::{modules_linker, config_utils}; -use crate::marine_test::modules_linker::{LinkedModule, UseDescription}; -use super::service_generator::{ProcessedService, get_facace}; - -use proc_macro2::TokenStream; -use quote::quote; - -use std::path::Path; -use itertools::Itertools; - -pub(crate) fn generate_app_service_ctor( - config_path: &str, - modules_dir: &Path, -) -> TResult { - let modules_dir = modules_dir - .to_str() - .ok_or_else(|| TestGeneratorError::InvalidUTF8Path(modules_dir.to_path_buf()))?; - - let service_ctor = quote! { - let tmp_dir = std::env::temp_dir(); - let service_id = marine_rs_sdk_test::internal::Uuid::new_v4().to_string(); - - let tmp_dir = tmp_dir.join(&service_id); - let tmp_dir = tmp_dir.to_string_lossy().to_string(); - std::fs::create_dir(&tmp_dir).expect("can't create a directory for service in tmp"); - - let mut module_path = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")); - let mut file_path = std::path::Path::new(file!()).components(); - - let mut truncated_file_path = Vec::new(); - loop { - if module_path.ends_with(file_path.as_path()) { - break; - } - - let (file_path_, remainder) = match file_path.next_back().and_then(|p| match p { - std::path::Component::Normal(_) | std::path::Component::CurDir | std::path::Component::ParentDir => Some((file_path, p)), - _ => None, - }) { - Some(t) => t, - None => break, - }; - file_path = file_path_; - - truncated_file_path.push(remainder); - } - - for path in truncated_file_path.iter().rev() { - module_path.push(path); - } - - let _ = module_path.pop(); - - let config_path = module_path.join(#config_path); - let modules_dir = module_path.join(#modules_dir); - let modules_dir = modules_dir.to_str().expect("modules_dir contains invalid UTF8 string"); - - let mut __m_generated_marine_config = marine_rs_sdk_test::internal::TomlAppServiceConfig::load(&config_path) - .unwrap_or_else(|e| panic!("app service config located at `{:?}` can't be loaded: {}", config_path, e)); - __m_generated_marine_config.service_base_dir = Some(tmp_dir); - __m_generated_marine_config.toml_faas_config.modules_dir = Some(modules_dir.to_string()); - - let marine = marine_rs_sdk_test::internal::AppService::new_with_empty_facade(__m_generated_marine_config, service_id, std::collections::HashMap::new()) - .unwrap_or_else(|e| panic!("app service can't be created: {}", e)); - - let marine = std::rc::Rc::new(std::cell::RefCell::new(marine)); - }; - - Ok(service_ctor) -} - -pub(super) fn generate_service_definition( - service: &ProcessedService, - test_file_path: &Path, - linked_facade: &LinkedModule<'_>, -) -> TResult { - let modules_dir_test_relative = test_file_path.join(&service.config.resolved_modules_dir); - let modules = - config_utils::collect_modules(&service.config.config, &modules_dir_test_relative)?; - let linked_modules = modules_linker::link_modules( - modules - .iter() - .map(|module| (module.name, &module.interface)), - )?; - - let service_mod = new_ident(&service.name)?; - let module_definitions = super::generate_module_definitions(modules.iter(), &linked_modules)?; - - let facade = get_facace(&modules)?; - - let facade_interface = super::methods_generator::generate_facade_methods( - facade.interface.function_signatures.iter(), - &facade.interface.record_types, - )?; - - let facade_override = - super::generate_module_definition(facade, linked_facade, service_import_generator)?; - let facade_override_ident = new_ident("__facade_override")?; - let facade_structs = generate_facade_structs(facade, &facade_override_ident)?; - - let app_service_ctor = - generate_app_service_ctor(&service.config_path, &service.config.resolved_modules_dir)?; - let modules_type = generate_modules_type(&modules)?; - - let service_definition = quote! { - pub mod #service_mod { - pub mod modules { - #(#module_definitions)* - } - - pub mod #facade_override_ident { - #facade_override - } - - #(#facade_structs)* - - #modules_type - - pub struct ServiceInterface { - pub modules: __GeneratedModules, - __facade: #facade_override_ident::ModuleInterface, - marine: std::rc::Rc, > - } - - impl ServiceInterface { - pub fn new() -> Self { - #app_service_ctor - let modules = __GeneratedModules::new(marine.clone()); - let __facade = #facade_override_ident::ModuleInterface::new(marine.clone()); - Self { - marine, - modules, - __facade - } - } - - #(#facade_interface)* - } - } - }; - - Ok(service_definition) -} - -fn service_import_generator(info: &UseDescription<'_>) -> TResult { - let from_module_ident = new_ident(info.from)?; - let record_name_ident = new_ident(info.name)?; - Ok(quote! {pub use super::super::#from_module_ident::#record_name_ident;}) -} - -fn generate_facade_structs( - module: &Module<'_>, - module_name: &syn::Ident, -) -> TResult> { - module - .interface - .record_types - .iter() - .sorted_by_key(|(_, record)| &record.name) - .map(|(_, record)| -> TResult { - let record_name = new_ident(&record.name)?; - let result = quote! {pub use #module_name::#record_name;}; - Ok(result) - }) - .collect::>>() -} - -fn generate_modules_type(module_interfaces: &[Module<'_>]) -> TResult { - let fields = module_interfaces - .iter() - .map(|module| -> TResult { - let name = new_ident(module.name)?; - Ok(quote! {pub #name: modules::#name::ModuleInterface}) - }) - .collect::>>()?; - - let ctors = module_interfaces - .iter() - .map(|module| -> TResult { - let name = new_ident(module.name)?; - Ok(quote! {#name: modules::#name::ModuleInterface::new(marine.clone())}) - }) - .collect::>>()?; - - let ty = quote! { - pub struct __GeneratedModules { - #(#fields,)* - } - - impl __GeneratedModules { - fn new(marine: std::rc::Rc, >) -> Self { - Self { - #(#ctors,)* - } - } - } - }; - - Ok(ty) -} diff --git a/crates/marine-test-macro-impl/src/marine_test/token_stream_generator/service_generator.rs b/crates/marine-test-macro-impl/src/marine_test/token_stream_generator/service_generator.rs deleted file mode 100644 index ee2cf63..0000000 --- a/crates/marine-test-macro-impl/src/marine_test/token_stream_generator/service_generator.rs +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright 2021 Fluence Labs Limited - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -use crate::attributes::{ServiceDescription}; -use crate::TResult; -use crate::TestGeneratorError; -use crate::marine_test::config_utils::{Module, ConfigWrapper, load_config}; -use crate::marine_test::{modules_linker, config_utils}; -use crate::marine_test::modules_linker::LinkedModules; -use super::service_generation_utils::generate_service_definition; - -use marine_it_parser::it_interface::IModuleInterface; -use proc_macro2::TokenStream; -use itertools::{Itertools, zip}; - -use std::path::Path; -use std::collections::HashMap; - -pub(crate) fn generate_service_definitions( - services: HashMap, - file_path: &Path, -) -> TResult> { - let services = services - .into_iter() - .sorted_by(|lhs, rhs| lhs.0.cmp(&rhs.0)) // deterministic output required for tests - .map(|(name, service)| ProcessedService::new(service, name, file_path)) - .collect::>>()?; - - let service_modules = services - .iter() - .map(|service| { - let modules_dir_test_relative = file_path.join(&service.config.resolved_modules_dir); - let modules = - config_utils::collect_modules(&service.config.config, &modules_dir_test_relative)?; - Ok(modules) - }) - .collect::>>>>()?; - - let link_info = link_services(zip(&services, &service_modules))?; - services - .iter() - .map(|service| -> TResult { - // entry with service.name was added in link_services(...), so unwrap is safe - generate_service_definition( - &service, - file_path, - link_info.get::(&service.name).unwrap(), - ) - }) - .collect::>>() -} - -pub(super) fn get_facace<'modules, 'm>( - modules: &'modules [Module<'m>], -) -> TResult<&'modules Module<'m>> { - match modules.last() { - Some(module) => Ok(module), - None => Err(TestGeneratorError::NoModulesInService), - } -} - -pub(super) struct ProcessedService { - pub(super) config: ConfigWrapper, - pub(super) config_path: String, - pub(super) name: String, -} - -impl ProcessedService { - pub(crate) fn new( - service: ServiceDescription, - name: String, - file_path: &Path, - ) -> TResult { - let config_wrapper = load_config(&service.config_path, service.modules_dir, &file_path)?; - - Ok(Self { - config: config_wrapper, - config_path: service.config_path, - name, - }) - } -} - -fn link_services<'modules>( - services: impl ExactSizeIterator< - Item = (&'modules ProcessedService, &'modules Vec>), - >, -) -> TResult> { - let facade_modules = services - .map(|(service, modules)| { - let facade = get_facace(modules)?; - Ok((service.name.as_str(), &facade.interface)) - }) - .collect::>>()?; - - modules_linker::link_modules(facade_modules.iter().copied()) -} diff --git a/crates/marine-test-macro-impl/src/marine_test/utils.rs b/crates/marine-test-macro-impl/src/marine_test/utils.rs deleted file mode 100644 index 30eadfb..0000000 --- a/crates/marine-test-macro-impl/src/marine_test/utils.rs +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2021 Fluence Labs Limited - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -use crate::TResult; -use marine_it_parser::it_interface::IRecordTypes; -use marine_it_parser::it_interface::it::IType; - -use proc_macro2::TokenStream; -use quote::quote; - -pub(super) fn new_ident(ident_str: &str) -> TResult { - let ident_str = ident_str.replace('-', "_"); - syn::parse_str::(&ident_str).map_err(Into::into) -} - -pub(super) fn itype_to_tokens(itype: &IType, records: &IRecordTypes) -> TResult { - let token_stream = match itype { - IType::Record(record_id) => { - let record = records - .get(record_id) - .ok_or_else(|| crate::errors::CorruptedITSection::AbsentRecord(*record_id))?; - let record_name = new_ident(&record.name)?; - let token_stream = quote! { #record_name }; - token_stream - } - IType::Array(ty) => { - let inner_ty_token_stream = itype_to_tokens(ty, records)?; - let token_stream = quote! { Vec<#inner_ty_token_stream> }; - token_stream - } - IType::String => quote! { String }, - IType::ByteArray => quote! { Vec }, - IType::Boolean => quote! { bool }, - IType::S8 => quote! { i8 }, - IType::S16 => quote! { i16 }, - IType::S32 => quote! { i32 }, - IType::S64 => quote! { i64 }, - IType::U8 => quote! { u8 }, - IType::U16 => quote! { u16 }, - IType::U32 => quote! { u32 }, - IType::U64 => quote! { u64 }, - IType::I32 => quote! { i32 }, - IType::I64 => quote! { i64 }, - IType::F32 => quote! { f32 }, - IType::F64 => quote! { f64 }, - }; - - Ok(token_stream) -} diff --git a/crates/marine-test-macro-impl/tests/generation_tests/empty_func/Config.toml b/crates/marine-test-macro-impl/tests/generation_tests/empty_func/Config.toml deleted file mode 100644 index 2e740e3..0000000 --- a/crates/marine-test-macro-impl/tests/generation_tests/empty_func/Config.toml +++ /dev/null @@ -1,6 +0,0 @@ -modules_dir = "artifacts/" - -[[module]] - name = "greeting" - mem_pages_count = 1 - logger_enabled = false diff --git a/crates/marine-test-macro-impl/tests/generation_tests/empty_func/artifacts/greeting.wasm b/crates/marine-test-macro-impl/tests/generation_tests/empty_func/artifacts/greeting.wasm deleted file mode 100755 index 20cd5a21c399164aeb704b39ac9869f2c400597c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56806 zcmd?Sd0<^GR18vrPGDbfkInm2rZqL_ZXn{%1gG%y#F+gbhc;t?c4L5Bd@l2!1p}Q|C{CIWv{fy^Y(cDu|57Vj~_en@7xm{ z-U{|!ehFl-`vV@;K~kMW_8K6J8~muH#EYXG!K69E+)#HeYCbXGr2fdJGi)a zerfXHLi5N>^XNcfx-oflVP>i66;IQmx1u`MJr(nV)Pf zPTtmB@^YtXT1=Z-qwwbi+XH^s8Dw)EL9U}K2s=8ua~(PTzh*7J^VwXsBb&?ReEabV zVK!IrI)X44cI9$~LLoGJ0~X_wWZo*bFL8vxyi+)+QO3eGk&4AfB$^F z2K8@W13@Minu~|`!>KR+Z_?sdxyVfado4gUfXuV+T6Kzp}D`woRjlYv(5U_ zqW80Y=0I&`&by=Iw;d+2UmV(UbY|c9+~s>m3-9sI9X$Kz{rmlO7hgU9vYpMwn=aiw z^_mMWx#r+SuY8xk=lnBoz4@m7wVr`jZP+#WbAIQ0K6AGi_76jT@z{l4T-w*;Z}Ech z*y|1M{mgi`7kj1aj4=Cpg7`1I-MUi_U4t(?KHihjjh)A;!4r?uY3K6ty#RIGs|H`v zb>zo|+4$h0_#2=2+9$G$J()^Cr4Lqs|5FdW;`5^!uUgvpW0LrLjJ+>jdnh^O zY!i>a%iY;1h{ApGHH;Gb3k)PEdxNh&K3)m#)3gjM$Yv`dj05NC$Ht=|eoS}cQMwd^ z@l*ecnAyL!J0a}%9vkn;#wBi^DdKP}?%o7>!y`SJBY+bgn&{Sa{-G$d5c`XIwA7Px z$o2*v5Ef>|gkU_%^ah0d7objH7G+NF1DS?YFLH1>DgMyEMyw@mISIqT zQtAmIg%_{4c8En#jKWrHcnzbY%NkwV4>=i@cECUp*YHwGt zr%@q6p%_6}c-_@mjE|KAF#7y4%`62)E)O1Z>=og~d@P`*4&wq+tLqDxB8Z=P=9#>~ z%ai3FUo{(-OyZ>-y7S}(b_a=;ut%zI1m+9Ohfg~(gjCskOIIf~DkJ%SZj zh&RucixLP}V47z#R$Rp;GsNW(*qnr6zRm?L|HwXmU$AS_QaQ&ndv5GA6*sQ-WFzke zu+5fXR=E&m4MTUHDTiGl^oueHle1A4uIA$Nq`QD`oX_mqM3d~MvUr?{y{nll0wCj1 zi10IF5EWZyBFaMqaS3oR8>g3GghkdO_rk43J8jCs0ELk>w23EZ?=I)WNQnX90**;? zIa35nq-hfr0eqdHonU7;MFklEq`-_KJQ48_r41$(oOEF>3af;fo9)6}kT8SWiY@Bu zkVKh~!WbvaPC7*<6W5Hu&y=$Wvk85xoryX`Y6)}J33GuV6Cjbmz+88)3`%07xQB_0 zOFV$a?M4o+IE%xHvq3ZnXLZw>I%gq6#_g8p2+icTJcs;eV!w2P{i3-UT-3}#hW~_A z!K)>37H%wUHr1G*szFHA#wgFk*8M9uj}~UiiO{cZb0)4cc=u$4+M|RU<^RgWkALheThceh zNi1_1WfP3B?-3R|M_1;=7F^x!cjYw@gF~g(NEvH@0sy}QdzVZ$dJ2Jq_)7$1SrG^j zO^u>_l-;NK;Au}rFlP1<7&ySJVL8V{;ttWO`hZIoB%;tB&>_38blt`-6q`F5_v-E} zhRv*HUWZ&47(=G3@nMqO-oRLZkSRPx0}~?P){UN`YIp-q*huR;P&t4q_B4n`XB}%3 zDgjLo>JGgCGStlnA0Iclmlfa~;N3qxJBima7LL~(GChUaUER2cgva1vz10)XX#%GX zKnE&PVD1V>=8Xu8EXvkx7h=0;+To1$q(L@1_u0qCLqYq3f@}zKJ4CP;n{&c{i?JnY zSw+`y)f}8tZNc0gVxOSsNR&m^nJz^Z+q^D9NSKRrar$GDPjG@fxCv!oY(g{?f7dI! zA=(!suVqloq-TlaF)b&|-!e2%M}{U76_fdWNtcZ%5*IM}Ez%;mgmO6vT&kTZGu=@{ zl%#vRke3$M0z#k!CHbc3&}-Wzg#IQ0y}`&f@k%<-AD9=`%{7L*qQAe5+1@3v$KA^o?%O9h>3NG<&%(0=|Ve@NVrgIUh0s>9%gs&Bx z0*wpe8AkmDrGifL(}92|T54UPj#(NZ8Vb1rY-4*i{0ua7zy9E>($YpuP65bQfD!3H-zF%h$I z3%p8h*bPRN^~nQ3)-yPzA$XRDpB4k=XUlkjoamH^?<5aZB9QP}XRTZ+Oc+ZPp&YT5 zPFZrB@C`J5<(T+G$s@@UwnNEOX#U+aN+BC_D18cbP=bqKb#V|^oTK60`^8p0KbjXwO;DE^wk8K|2Za5|d}zgLa@Y05(V7PHG}hvBfco zu@F>Jk#h)|Z6o`Dq~J*m37$M=2t;xNhXgU92}VG#7@v8G@iQ*QCpy8>lyk^cu7^`g z+(LPa3?aLsa-an9090K3-b0v4j%PwxI|v88gRx{ z0Tak0&XLCx+#Fco&uFv-5rsTqoR{b#CUFLfhIO%YT!9F1t;nqbiBC`Dyd}BWL~^r| zT$Lu0Lcl7?6=OZJJtw(%vzFv~vM}-mB&h&_kV}F@AX^@&5d5Cu5Wl|GfL&Ssr zE5e(JH_SS@qO9c56S4}$h@X*PW=DQQC%-7~iu`hF@|zV?LMOk16%!+CdJ6evWI$Lw zqY5gTSQ=w>7qSPZNoFaKaM@O=7i5>+ko{LhKs7c+g@948DGhvM5@Rxn*<{BqaZPFo zvn=LNB4goQ63i*BVFIN!VBlgO&F9h@db(&M_0mb6WC3ajm6Ei=yjC%F0VbxKu{$YO zdK6{Ib0&d7PA(wIWBoG}#1Qwy{uj;u7iIqovi}xE-uNvei@;KE{+Bx*ndaD8pXHC-mH75SOi*m%zS zqh+Ue5+16y;v|rQmZ~WUY;zJ|D^=rw9~bZxmz;peXWMirT2fA-D~skH>)LcpZYvLVC|RKBm&go?i?a;p zJcJ>zfguvCgrl&g)yW#BfJELW94GGJ!gS2VrqVIholM7+=_WcxAmX_|gdj-lZl6%} z)4ZCH;iM}DVp?ZKN=(5FLD5|LFF`T|vp}gcm1#!m4K`y>Pa)G3{SYdX=?-L?B5zBg zJ58cHTM>B zmJT}^2isJlVVnz>#7-&CX-mk?g}4H8ly$y?z%&u)lS;@Y!f;IjjfHXI4eVAzhVrh2 z4AHFwqm)bqF&|gD1t~0k@0_56B}o>4mVKg_Ehti1mKj6#kc&<5s+@@sy7^h+NyX)?yF5$;3}+eP-NF8LblBXs1tOOEg#M zf@;{yS?_G=#?oEB=k(oyMnfog1qUcNN~5PgqIm>@n^7QiRf4THVn1VRq|6QvnAAF% zE&d@$IDCYG;CrwQzFztPy5Ni-<36XrSt=N z&7q;iiEp%u{m)|nhJU>q!$<&;7{N#&Dv1P+i6=AbODQqL`jaUzd`b$a%HqHr@kW?n zEFr+g!q>06ZVYBH0X7!f!=B#%5iXaeIUH<-881azXmg zrbFbav4;?cD2*vlqEFYV8o;=&`O0r8+!r1jUlV%1bbD>-USI1#%wO&#r&I0j67L-! z9j_uB9Xh|q&NTqn;cWcYLo65dn0R$aZ6#Q1^g{sNNj0!cxWFpGpLt~u-(b=)(Ve3= z^jBg{dujuQEb>Z~l7;|Yj5_0-fQ~vjE6he6QKzae8KWr6wTl|-pMP|8_K-xAWJ9-d z$*qNW`L4U~z5URpvZ}%iuts!Q6Lsz@v%P+iQx{JzZ^$fb1| zsS+64NYLXaL;wb!23S-q9dJP+Un=a2L4cc&V5Wlnt|%yVP-*Cly&axrRw&2xQc2oD z>GU5?T@xfF5#5BOZ|pN>$0OkQcH) z9FgEE^=fsn)Z@c=k=YW+$lv5vH6`;VlPXtaz`2999%tio@p}NxE@kMQqw02!>WbMI zcZzoF;Edm9^dA}HR>T?pgEJX>*~62aMB?diI1I8gMTS$HxFi5c)u8LVf;vBC5V4|Ht}#ic8kG--J7s% z0e(sAA76TGTw)yiJ9G+3ayz{KC}(wyH5La%!4B^Rqt%yF*9)Cb;fWGwoCFK+`|3k;UPvUfU7Vg{GdvCd0;^;~w;Vy~mv$&~px6@2G z=*EmG&zwA>D4secoQWrog4If#y1Ou^u7_qpcq*rK5^Pdo?2X8%953pAfq{a7yUlz0 z(~cty#i+;9t+MCXU=8P$ zt~H`ttZNSy8L%aUB_ZZ|w(#hQ2Uo)*RKlpru}A@Z>#7v8*Scxs==0 z>&Y#pT>MMx_4%}3Z|eh;=3RT$_bFH@>BKjY7j#Mam}5h-UZ8oY*C)_m*fqTp5LJM> zB46w8R_LeT;QCt{>XUw`YRV2PnkqwTU7_JgyYDUJrZ(kkppsCYf@Blt3#-+FoX9fT}owE7xO^K|rfDJ{;CL&>|>Sx>`%W z2w|qZ>+Wj}+0YEw!KG6nqLP->i?Oi5tJaWMonuIfUn_$`ZYM)mcZVW`&F)SRthG3g zV!1Wzpbi>3M3qtHFJDmiHYK>AF=Wyp=NM6n-pObJcA89E+`Hr_*dD*1ihdMbwy7M z)LLADayjNxSrJ8{porN#T|trA6g#$U7o(u4T^MaEPuZlP7%Wf~(#Bls_h@x{K~eV5 zRT6!6k0ol~s;apiKq4I023uxGhBElrN^~7uk;tUD=&PP?@vg6j!cW*5{wV0VOsooi z;41i(DKKp^`XL&#y1p2wzKDHNeUWw`mDCsEx!04G;l!|*tyw*%h^eVHC&L%Y37{%5 z3l@w=T8=m33r4A0;)dBRj2rHuC1(+-K>WBi(fB}!dGshZQWK-2Wpc^(;$rc)y8YZS zO+cnBnGm-#*amZqm+@lt*HolV@c|i;#yA4*1fHN?uyvgFoCrWtmiHx+$C&~~& zo9FElllG_fiOiAO8BVn^O<*xO%N3e_WrL-6@}4yFiQ3(13k%{8VvA2qxrJaWNrQ^4 z#KLP^?oJ=#0$IbR&MrMS*0S9K*0%XXAlQuXtt$0KCoNzkQi@N^rWN1SKGADm!$9tH zsZV75q~dF(=an@K9<0{_1{sq~jHO|=B49od*DN-tK2h~>Tf&Y_*5qJJ-5~~ImpDX| zkEG*j52&5z^aS-)9+2t<;wTT;8U^A481nO+9&lyMRUXidDFEBXL^MsMWQWX+!KzTM z(1|RfkgmZ4z7tGNT7tP^7<-;eFk2hW%?mn@CM7>PSVN1MBNa@|tJp9VOq+g1FoV+w zX0S>ygO^4yQ4J^p1Sbooh>m%3%O9(QwU%J6_I*LSV1jc?Fd6^Ug2@9DOz$MY#Mh*p zZ0BxEV&wY}D44HMCl%RKb&~H>?xSefm+e8+Q{U$ceT^yKC%3?wliUJ>JAa^U7e33P zV1wmksYez&@pc?q_83Z~zE9Z%uYnxt$vWSMv26K1^J^X`F=o_wEE@0OWK_dv??k+8Lv)w04vm?Daa=kw%+EIRk}P}m7qD6Clh zq@`=ElBqHik_q;3VGC>IAOg=eUkF%CBAH9-_+WUl`GSx@j_-si6;o(trewfEnJC^t z;u|E^+{`NNV80+#I#ewFMR!nORVTJOvUs%tK3@#no0aNG{xa)ws&xJkUrmwF7w4bP zKlu%naF5Qex!}yu_XGcQ|79uVe3Q|^_M3PexRQ&DOIll^(0oBT&yS}WLz`DioJSCG z(nB1=L%(p`)+6Z9L)@$_${e&0Aa6BiwZ`R|R_vp|4)(}1S)hVX_r#CSXD=!k2TRQL znXD$`>U_D^eEdi{!C6PjR==e>&r_lV(nhI9HooA7ZsuGC4I5#-L+tjWtp;g9dDao~ zVxL`^lAgjoaQ2zeeqFms;4yHSJt}1n*`OZ0tGkl{{P_5LL35j@)CD_(F|W+z7eC2sR?Evzc=wh&yGq6Q|4TTits>v&TqR&1Qp6WK&Z4X- zV;N<6nZ#Z8WqG-v3_chC#$PPX#=r4bm+kJ>V!&U&b7?mI>!Q2($Rk{QWP`i-&wtIu z8h6faSnp8$;io!xS*MTvtHZN#k9+h-@8LY@|ATu*ukBtF`@q9qhF`evI23>idFCk` zQ9(_Wc}U{L>^h`=tWvk%1OF^Of-umfLsaE(EyceqT^0Nl;=g4qZ7;^+l2YvM?toJt zBg5~6El=~zsuGM$C7#exDBpSsCPX=Yk`Z1if<5|ks|g0i@u!jWE(oS)FNk2JRRnWGuOirAz57KF?8iSZ zf^|P1g2Bv`VCp4x(VCgvMqR`^6ahO3MK6dSM9oT9qERSy{8)M+qY(e_{mCP?n3rN} z^06TPE)rC_3cH}vT6|gj1dJ%%pxCw5>eK$|Tb){0i*X2mf=hCVO+us)JIqr0FUqgU z_?f_4QP_axsh!b%4@*+l@VaZp4??yib?(FxJ@f88_mn&1f0l?aveva)_sv2?7>M{s z>0?$nRzL379g$D-P&<7-NTx-hAi?Tdhf+I(Ki1BtKHN zfJu(M)xcYO59hK}2k+5H0#V^Yd~qb#Ljui^HavWj#;k^}l=QIx!+H=tz|WxgA3Mp* zL^7>wNoCyolAhbvXFAF9TBId3i*?af#T*=bZen{$J#D#8k&U^GfOd2@GYNpcP58=22Hu$ zB9o`m8nZ-T>g3QUXRFK>-L*zC8uVmaT>04jwqD@YiT*rV)_pu@8xQ4$iRQzF45wx_0#Rw1#v*D561d#y%d-APD@g;JDu zBr7!MkukN)9^!8q>K|kXp(4~A%&Pu7MZuh*)Q&BZh zGMNl_cM?C{pOv$Z?CwJ1xQvYw!yCu^35da;0;dMC<$f|ftOiA?z! zK&HSA@B(c>VkBfPh@y+X+{wBSd%*hb0{{kD94wRrC4=8#F*Xdxopm_%?gJ=J*zuX&YYX&Ay#PaOB+vG{Ww6bHqBtm{kTr*-{Cu5CKl1&t^^B&-Vw zeu2U(t!YUS4N1q1uf_p=vH@fSw<@7;<*hzwg4`H>@Ymr-tRBbmdlW1D%4Nv{HuaWX34f(pJE>4Q22!-F?|DdQ|nJWkAnM7!Pju_JnM zx5bwBWe)-`EwL-QWQkoRAyrPuC{aIGi&fQu_i7H2Jo?%uiIbKU3VKN)+Ez z=~zLWw!S<@g03<$#jx;Rx@*Ptq^c?!7-3}Lv`}U>bozHX0(00`#{WR_w4ScraAgos zw*oNX7Tb%hJ$V&23Q>pK`~XXhup%v0R+c+fuPURFuD!2%I;~|m4N+T(V~!2wE}LKT z;zQM($!%9&p~q@kU`o2LdOC5CbEjBi^%sY`jAs%=Om^)g=jMp-dgC^>lkpllrWxJ6*Qseupe6v7>wEB$7~KSMGG|33yG?yy9Z|FBo)asy0Q6D%9e;l=ZaXceYIUIjQ6LM zJD)Mq59iQ{_dZ&(#5~1Rb!0M>QkscSt>>-0g=^NJ18cB}g2(NLOlrl@-J41sWk2#t z)GjGa5}SRd;CHeR36k!kKSon7iF0i0Ba&rRW^Q3%(GQiqAu-%u*CEzf+KrimW<0j) zni~V6m`xIBDoh!h(^J^ZcT-e#4PYq|d%3yY zWu65R(fF!E?Cz!glRn1Crf#)Y<;`u0&=f@I+dNP0EkEvvpYru}jV>F~I(DTKapESj z4Z6re(veq7I^(V-W;6tEvh}(U*XU+5$j1 zr3r;)!LW4D0$VySjojW;3<2q)02YEwsnw8zXwrr!+mjq!II&H+%m<$AGj-qsn1Vmo z?J1GRotIsKk+P=iuFXeLM}i^&oIVP&f?rM>0TSe-%m#GcxT-aC_`|zGj4efuc!5Nh z3VmhixRd7&_GK2V|d>dZ)jqLv4I7E%e)eEw!`r4f*0BuDHk^B2*ToYAkqvjA^|;YE_U!@@u@vW zJ$S#EJu9dsv83l4fhg&xBJCfcr<8%k3h^yLAW=9lWlFu!t(lWO5cZu7TWn@VGgVZ- zAP)6P)?`sR#&cpRQ{+Q$8E_QWu}i55r3~A7!`o52aYM9xF`>I+na z0$9&VKi_nJbqI zWOs&o^N7;0VbZUxsuEnsxYkA6ymh*Pr1JH4R^seNJJW{mYj~zzm!;Pt&e`}otzl0w zALGKB1gd0mHiK*O`+r7ce74E=v?h08bhW_HYtXB~5ci|>8%V}!i0i1xs=nD4=6cOehL#uEIW~7Fcgh>_&Bt zgIO`m8r5EhK+@%6HAZSn5n+$6v}-q~;N*1D0i!n#z@4F&MK%`L>|E91m^!TPv#e&X zM3|-_Ymz(ou(icsx63pB-ikn+EE@!M5(vp+r=9N1I&paPImKabOB|eFNEV%7Y~jqw zr(R8H7mOsgLRd+xp3VmB4Ay&q?jw+HxlF-?N(B-c_b&d`kT4WPkx{#BKekQOhbjgnkirGx7T<@BA&$kz#PBq|TV_proZ zZ{e#+jB&D`uGx~UpGW=(!M5!WV`q@>Rw>qJ}$VRm6g;1 zFmK*gSy+FO-H$qK(Ivi+%0!pG??R<9z7VGwhvmF|ET}YQ;>$hNcJeYs&+qjyy?$pe zmP5*?A0@4QInJO3W~R(SPM&%0|J3o;O9toMTh^;Q_KhPs4>jjgQ($GKE_t&|Y5m5S zw99TYf&m9}czMTm{KEw_2lvF$y&C8)Yydq3Ds(}xp%ZvAbXHqQyjOSI=VsyufB87F z0pTCh$rC_lm4IZ4Y*~mXKR50LD*zf3T{OVAezfTVcgD8dz`=_R1P!7FiHRON^m>DD zJT?xZ1`yQIeh%(1EdGRMVCq{1`P=Rs6N5F_;r)%ZVJJzUUdl5`OhiD%1HJW%55=#< zk9`u5S>^k9Hpsa*U|scdMHodd&qeO72sC{f@$HFBPhK)a9L`$0h79d3JAJ%Nt1RUG z{L8QfAdz$oFbKySGK=sW1Ym_hpO3Yc~efJ z%(Id$SrZMG{ct?M@*o2wNp5{lA0|=>AhI|0aI&0lN#a<9N#?}9G-JX>#B05@14(MY zS|?JXkOOG2qHc@NiBQ>^DhX-9pwcG;=)-~yuTYjzh6Ji)ZMMfg(r5r#wE=Rh0AvA; z#~LH5XjB7+rCC;BcSi3pE&`EALh_QLEfe42C`V(1eog3m0VY#lfh~9GIcRpx_E4+H z#1=qvCIccbMEru$VR^EwMJV3RU(W$|kK|a3*3kAU&Z?m`tcqH#VL4kFR!NA)+suJT ze1l-%IWVmvIGsgpbV$@jUC>S_$M;V8fRBjYiO#}Q!Ve|fMmX6U4Wr4-bF|aY;wimT z32Jl?6KOC0DC2k7>bx*g)b6^H<`~S3iPV*|CP7)~uLha;;kO@$sv2LJ5BDrNBEg7o zdKxJlk1#dKzMF(tEMUs&LVvTmq;qC^#yIae%ir&#VRFGaBx%L`2xA?(k-_mL;O#q`BzA&+ggccE83 zX|ux}u!cHer?bO=cCB99<*0ZD8PG;I3V)CRItWZ7OB-?+&^ACb01C3OS?(?;0I59W z0x>xdll_z|Dlzyd9eP1rt7$mU!lHi~yF3q7VMe<1@LIZa;46xl0iV+r=ZMR+_+az7 ztnoU1#?qRR#;#&;sSDxtOJ-27Z}DqgOHsOKnk{!D&ue-%WKZNttyw+NrG|UkSUUUFgUy?0pMdw z^0l3sZeLFaPM&eLQJ%p1waODAdx4~V?bDfhopL&cL-yG*h{a;D;fSH->KG6|K{Tyn zAT}6`w2pxSLLGe}pa-ifAw%9VjH~My0Gs4Yz}kktmg%X=C%(WJS{e_u*-C`uMOlC% z=1D*}VQ`yP#Y5_fyB+if8ubRPyMQlbDJNu5G!V5-j%|Q`j)y5~sEcYd*z#34b;SMh zTqohA4F&f0xvR)9I6De72k9IvLP9%>-_4})<8ktp0Kd!>XuAwu%k1HWHpGAS!Q*He zHn>d^%AU!9K3@%s#2(ftH8`JP3C6YJ#Bcd9g?5&B@jy2=kfgrzAvd5ltfyroG>`^? zh;a^Mv5?m#tx~<8;6*MXh~EbwdUYLt0R47&qdJ4-@*|vG5)i`ly0bzxj5rJ8bBLz( zUSWWlQfYz(D57{R9BxJ^@Ra@WW5Um>;KPpJ2|{Y=mp1FGvY{(kgP#14YF4&y%OKMm zK~w~YGac?Mtf#n3eWk5{wn2V5#SZ9%7TkD=&|<=N#JtlZMr{xZo^6IE0MHav(r6_+%>m=9sWeAV zXcZRqR!R}uo@FhfDhtpdr~c$57@APFQ`Hjo4;WNXL7kN8r#pWQ?6iwdmt-zioMjuJ zG8Z^SJV7g}UCEHE_S(^a2}ttX1c0A3ZVd*F=(|EH=g45(*FxVvhUp7ZM$p%tp7=ZR z*A%HggqdtEU+CxrEa-Kec2Xz-(M|<~$iCQN_qlZUG1=*T+YC$gyqr;ItFZ(-$;-?ZV`jDKg=g2hgf$qC@fLhJ z9MXP46#PX`uCO4rLOW|$a#WeafoIFvalLEBPkM#UZE z4{Bnv?CUQqNKtIyZGmOXtvGFS+E5lJS^3_~G`khbl5{w(MH{$^#+Gre%xY6aIkp`n zpM>D!QbplQILAz?WiWN@GqbL-NvwaFTqRDBab)?-rf*I*tOUt!6->HztKh!kr#~i# zMbM^yxOJI{0w2zD)=XYQb_Ty{YtNh|3k@qHEdPp)(B9Wbf-9G$0A%f)08+a_@n(f^ z3>P^A{7*r^Ukthv5TyM;fs>U&H;cIQ0l37x3-Ojk)bdZ?Y0qaV} z;vNU2x@p66HI21U%t(7>r5v>Jgo6lwu+?pU>uhi9tdR}{^qE8PhJ~K2-bao!uK&rN z95vV|cdu4S^?7VR9FLF-R~_Nis^p9>W+i7xd2&W}>NEQuA$EbYw_fqPfgdJ+r6`TE z%AOMm6AS*7ldWn55`r!WwoHZI*Ks*>13Z>LV5N51U(mi!UGev6p41hXa+N#MdfXj{ zWD3qZO5e=-$k8Zbg=W%4g?U7Hm}XrQ6CswgkXMo%xO8e|#_n{E<2EDZT-(jt4%Av} za>fysy-x*H3+5Dw?wGQN^WavJKsQMtRpIRk_nEI3Y#7_^$%Z;$O&|=&Ie5^q5!Xu# zptndv<w;tBfoS43TH&6Z2oZs< z2QkfvXlX3Y`Gyh_hVJMyd0V;hG^1*jP7SrBrf(?uob$0h+ufi!oG~D7NY-(4gn*=#qA5OB(uP`TE{Y^lS-zp9@I4nFzekkZ0K+5+&?U$B zZCX&|@GuELIeo`z<$*p#^=2A>!TP_RGf=sL;nlwq?6oto<{CRw7BFsSS_>Ve6{GQf zj21p~7)&UIEh?$5CXKgSC^)t9)~zUG43hZ~D4OlIB-T3^$ zej*66t%U$AOnkBP=9G0G_*3tV(tOr=a1z|dlm&4I`;qiQ2d3AWEK_oR>NCggjJ&r# zOa(#_7AwGWBx?Rr{PTAm_hyq_?|S0^G(U7~KX%czJE4WV0mA3)eCBt)zWueh&wLrv zuE-Xm=e6YUH{NxUc>{vs_!PJ9x6PV)mhl-y@)37x*Ws!$aQUlXmCsHZC@vQR`)4t4 zWEZZCp7x)OFOI@}r87)rv&tS&n>lww+r`p4v%QD##d!~{B%R@v*H_7i3sE2*`)3upQQc89CGCI zZm}Xv3Jl!gZ=>l!iOL);wz&cYXGwvA!nvvwl)Y7&P~hYW5(=`2DiXjYP;E5{&RaDJ z=oGOnUs0q2T$Pc+80EAa`*SZwWJj=CDvPU^8hL$TQ$25C{ag_6 zCrY)8fF&wvJpRyySLU%)E|Oo+!cF2A>=u4O3lr%rm3eHDE#Rj6Oso}}O4z_)n`hf< zkwz^PaBzXKUIjVv<9FfCz{#U;Uq-}=1|z)t6U6K63$g)!->vNnx>mZ_>Ga2qsZU;< zG^R6%?kzOc2^1E|(Yi%-cVP*i9@?Th5?N9fbpJ!gTPyl}Hqbo1Gn6|EZ;vwf7XNKP zeFxgPd{TOz{sT$3&_=9g`JduY2`>wFR4p=Q6KqzarwgrAM^q>xK!^|=;5vhyD!jmi z(vb88-PKwzXL`dzQ}NK&!1T9Xz)%G?TOUGGG&5GiBH#onOunGfU*WJPwo`*@10(lv z0~0ITY)i~cECb_`LVG7Koyp!F6$m^f9o3|ylDcd9YQV@WEmw3z0j}3;f%h&^wNu>gDI|~_>BvU5D-9YFhFBBzMst?BFE>&TCQ0q#nJqY_H z;ReRGPPQ3aLwfNy0BV(}NkNN`xV#_LWOEcQ7>1&9Rs@J2`RIyPvrk8rNgy|;V&dvV zk$@w_*(zaR%Tm@1msZ1cYN;R`L^l+nNHf37pb7<;B%5wDlHvu_Y|ygoCwFdmyS=OG z(m!52(?%>I;M7)1ZTig78766# zdv0R#H?^Dm7rHZw5X+`;#FkV--yQ{95x-WvfV(hztcQ-+L|^X2#Tvzb^j&g?NUg-i zKq^W(p@I8pP2;5~WH^KNKe-vD!)v>&o!LiHZL&4fhM%asRv3eE*lh zaQt%`+IU;MRJ`R*9%a*?)=XmMv%$D-J*MrVX3fwA!gP#UX>A!oS?g|2w8@l?E6wdK zA3t^W?v-B*E;cb4&_2p5L&D(ncS9+F!saj%@kZOYGC9(0!R1^Hs}`ZUSz{owf-uVg z@pnIToR2nf2M@KZoskdl%XUU48z$|E?U_7&+9yvWPrTy46yaE<5${Z#Mq&vqV%-qm z|1i|lnpInJYOm|2Q6NzzuLg=Ia`iHs;+vv^_tLd=o|F#8WMCoXO84X;d$LiUqfqvP zadVQcU}-UbSx(MRmff8Isja>1BoAX^LGsP8F0H1m(&{g}mD^RXUa5%a#7Hfka4lA$ zqxWf2n<&>6dsi2q^zonoX5jQ_ok7|H9`>CRq6^I~h>0j%Bkd0YYz3ok#Z=8DzQmJ@ za#;4q7m`1;ARJ;_MJNXhMyRrQ>UM@$#)Z7eTK!3b0i0W*q=6taAQJEhb{u%`m}|3x2&(-V>_Arfgd`~auzeGPxzwS| zl@3yglRG6mT|KjUXa~S5nEd2s3Y7~5z2Xo2);f*xSLA;{`>~ZyYx`{QA=zN9?ddl6 zdV?oFG+qhb*V+mG-j#O=IE_6qT+JSoXE2orxfcAa5b+mu)uvbdxurdejwD)!G-Hyn z8!H()Bd|%r)!^Ba9|ea1=8w-Rbj-*>FV<@L%pzcwLOh=OFy@G45{7L870-ge#TH5YHtJe)0Ewsa&rp@Ld0(kgX)%IlJbXAfGFBm+Zf+=j+(z zt~xs1vGu#a*;;7~XdSr(BaX*WT8TG%*|d&&9#(oJw0e!KzAbm2MX z(%h*TR2L{(u)(ffqB9~%KUy7bc=7js)iKXvFs=RF?UQ`-BBAn|8(qc3483d}+5w-^ zt#IBx_r4Q+$M_{%;fPg~Hbrb6K?mGEI3A;c9{b;JgxJBj)GYb15b(O~B^FDWA$ND;cOgnI_Sm#Xv44v*Leox2Ja9-c=-%OM3Z-PIBtz5vVQN3{1UB4}kM62AWY$8yodK8=?#ag~Tf0(yBn|T^6fA@xCiTBSDb{QX{<6N;B=< zE53$76>Y;ikt*3(Kc*L@o1~ZiOpJr^P+xd>mI2 zd#=SCC4siqB97>!ZJZNU%GC6EjZ?63UYQ87eL|S73ab;bg&c`I!UkNif@O(X8$0rX6u00e(e-t?Oi{%6!$mPCcmK2j# zfVqfqjGHKk1SbCQ+rd0ra(|`bS9Fmnb+rwIfjT8tWep@{;G3j(V`rk1r1m_35sCu) zyQ;&*2-zn7%(1oK%oEA-Z%A65EHjvsCBz7(>P-Hrbi45Z&MmH7z*x z7kvJYtc*}(B;;hgq$Q26-8Vp^! zO~Y_JrXvrQ4Hjiz%mBVYKV``+_4yIT31zX0*RK7tJh2(G-t#?HY2YzrTN=f3Sb3f4G07ztUgrAMGC-=pPsu7#tWH z7#sGMhC_Q`v(UG2M31+hX+RnD}&X+(ZR8y{-J@P!J(m{;h~YC%20J^bZBh2 ze|TVcaCm5Vcz9&EGF%-V9UdF$9~l@K92puJ9vK;_j8sQPN5(4sm4V7&WvDV-8L3n% z)yimPtlD24s18<#s>9WhYNcAOj#kG;`$q>x2SzHqpS&V8-EU5rVyYL>REu!f4^+i7w@$08|&Mz#? zAD!UWf;)Zn;U&BBygh40EzkQdeS~{@+;OlrH&fr&Y-o7y7ee>EaE7D7#oSB#ZswWh z+W|fHFE*DJ4mTtI^RDB*`m)p9EAx|H_j4|~pAz$_!!!FE&4oqKe^Xyy-%rr)tBh0R zczw5{MarkGT(9B&4vra)FXt$1(&uTvZ_)oE?q@S4ufVaJW3H{;)E!HyK1s#q=9i*c zRNq@$a0-YjUmndMf{Vz|;!FeNdevnyx-WF-hyUR}f9G$X@iObqxMX0sy5sUIcfaZx=*4Prv+~za_|8V^4QnKCx@}tKQOR-us>p{_-FG>6g3LT{5xzb&ck`-t%!9|Nb9- z>pOq@RQI}x-Hqn*z5nWSzy0~Ief_Ebe$U(9`OvTZ_UC{95B~JafB9F}yzk%t$ru0h z%e$|?;dO6#%j7$L?%kjHH^2G$-}&Mne0|;7=e+67fB!#!{LFIqfkXfKTWi){FgL&X zyvd)w^HZPxtp!LF;Xzv1<7eDhoGJoX#E|JAR3^Qr&-KNc3>y>$2&w@+Tw zxBcNy|K{ia;LBhC)(6Ia>3#k0zTo)p{OL2--|)sa2Gh$Ip1tWY68-%G~|R!lq1a-Cd8aS^o8r-s19;;kgArvpqAM z$@7Y2F2Anx#NeKFFWdePiYo z;kMA{izREjc4W?b*<^GeGyAgTFJblIfaH()bxHh~ZKU%mfd-pTzHWaq6+ZINp^4jJ5 zGk5>exy7^YdvA7o_VRqNW<$sFzuvagwfyHByRysAWS76y_5JSf-gkx7j=SExe)+S7 zoWkyU%?gSL{0Lyd76fyyn*){^LJ+Fn{jGo|nD+s^9-&Cc5xt7xfN} z?zrYv*WGyYt*@2P?Ws4X_buN3)5m`Hp-+7JvExsC>eF}p@!b3`yrt)-vLQU04*l(Y z%Xgm_4y@gr+0t=-_Ok3NGixqg{zPs|W=p2GFkJMPAGoX9adu~6`F&$yz0lErHXnf9 zl=a6)GuLLfXFBs8`SIxDOjk!G+>zaw=WW;H6NnrLWz*{+y2M zGv}{;#hP>Tow;iY7k3;kUKL-OyFA;Odri*Imcs1vJEzXSrqH?kYj5e9D0b$$&m7Bl zR<>qJ%g3*1+}w3dN9V4IP1h7|K5y)<{I1UP!mD>z!!?D@9IfuEoV)y+{@TIrdp;89S_VH?NN51q6dzSycbFnaY&aUMTtnYeV$GOWtbJx}3+jg!! z>uon)w*0ki;l@mG*TEfG|83s#*Dtv))0qkGS@+88u3Y}zD{_A3*6gO?;I1`WGmWm- zb}oNv^t|q^nGR$;xBP*7zES87yThffH{{Ww%qZ~p7J9C~>z1yw!Z4ffI5(f~2)px_ zEdSBVI`7S$ z$ND$dcKzM?AAQwRv$gAQnE&YYzx=uK4b887`v&hX%Qt#Ye)~23->%*Ky}$nGEl+&+ z+qXns->pyipT9MO59&pYuH{F^^!g^wU(Szr(93(^ z`J3KU+|kkDZ{X8KsA2Z9@aS4Us?t1Dz@X$iaUeU?Ia8oPXRy%^f-$r;!=~WSKR*cB zgUfZ62LAfsY;>8{j9l>ZVP|l@e>r`-=-JEQV__CW&$A|=F$E422D;uHi~(CZ$9euW ze#U2Lzu>>d5At1wDL?2a=3W(SVl>~cuJM^KTlBYd_|q9b2S~xWK_)C^c%wYX`D=ZG zrtrM*yx{y`Jn-`cKPYzi+rpzkkAEc01RZ`Z{43B0(!9nC3c1d}?_YOSrl0Gq-`ml} zMg@Nd;%g?sR(WSzxMyH ztjAYwvYFm6?D1kCvl`eETLqo(hl z?XSs)+21P&g>ytnxT98n@Lz!^$8l3|Ye9ErMFpNVL)e)0I{e^&z-wf{e}K6%e$?5U zGw$Squn!`8dC1`3bas%}Xg`@_0_co%X(}K1aVVaDRpvE12hU8lPzdtpXWkon)y!bQ zU*n&h_17}WIvXL2gl4?_fxNeeZ&vePD#NeiT(RhBwJ_1f$wqCdh9XWiZ=0EmuDDW> zY1FHeOQNHD$zv46&dl8w?NLm%D%Y`qY6%^RnCFfBwC7W;2-$+*?FX6%>U$TMXDf}B zM=6F^97u`7;>$BRZY6-yGu_vZV(zo}5gxt0om(&Yi8rmv!Or3S51D^I$5-%kAwS!1 zCEj1$ex$a)xo}5qZfXAD{Qm8I_1eO1^V=7|adC-cPifw5GfR69PxaO34{RG~*6WqQ zv9ZR~ShGGlIJEsh4HMPewy?Nuv9WL4f!fU6w*J0K-$1`h5SxpK_b-8qVAOxL{R_=n zQ?(avX?x+{-e38U#z=X)xYRJf z7VlV`1fK)*bK95p3Z%)Ix#@WTbyv|`?Lad+P`ksT=K4HF7?xv;n+r2!XLE=5?~g22 z*7%Ceg`Z-LeFo@Z8ab+QHsS_C%yxwP?@v z^K;ET5v(}eY>n~v*n5rPvax7sKDw5FP`bV+BOH{E*kEt5OrS6q9`P4O!x zt~fj=9yDIQbN==#8h6Y^@!TCan#UMdaIeth=)w#HIl6bAaiCFVC;%K1oz_N3?KwE;@=*M0-{PedWL& zjKYzbh55My&ABD`xiBN|E#5U|77y-6plZ=nt-fz*0bZfQPcp7}b05dox5mGD9_ec| z5xV`Pz6%rr4$LgU(ygbTc^Z-26RC7iizwkt%`ZZZbfUgaa_aiNl^Z)c6UJP8al#Cj z5np`q)~ItmG!QKq>_Cla7ow(8>=Vhl!o-%=oXF;d`FeA4Q6|xzv~!#BHHTzTKjMXI zBNy`1*&3!ct=a8z$Bx?mqcybF1g7_rt!XOFVZh?6JaDN zz~cDKJeqe4KPMvQNV6g{?Qkl0y#k%?=P0|Qoc6^2*p}@_Yl}16`}(#Yo?AS8@E{`I zY;4EoHE%}@>$N%M;tS3C;f2MSBTdX;t$yh641BgG*B{<*RgCs|mFKr#t4@*Hl$*@R zo@i6%qCJd~+7!iXsqV|JKD55%4RI9RHTKLLMs5+4FR?vXTiB=i)Kat6ZaZy+@7L)k zT~GUO32ryZjYfNHlF}4>)H{TN9GBNq;_~vV) zE3b@hy7l_&cVBgW$AX6zLk9jD)QwEw%D)8Xw4_`Le|TBTWUj#Mb>Hb$FM0|U+e z;j!k}biLlBYBV)SdAB(*SRWhQp3bvU%chQPyw)< z&M1r+VGQ}$Z-A%bwKP7F9?IsNEN=Ba7u)n+(l@g>IY&Iui=wvoQ+$zLONV7Izr;N9 z)BlO1YK8=l^9$G$mFR0$%cYd(LY1Vd+X;K(r#?;9e|^e49ser>=u2MSH-2|{*~`fH z`hTL+_xj#-lW)9!SQc$y2$Uz&D5NnssGF0EbG3tud*_!XP0X7|2S%qGlg6om>fX_* z>cG%QW2)8|pdvmzJ>i!oC#~B-yu)Pk_L-$%Lvkl^os)|*KiOPlnx*iJ6P|D{Q)uiz zVEAP(2d*I~KIR+-wtcW)axiJvlk(7$d*|o(0Y<%ldStLkg@2^pXpT-dCvv&Q{^^Bg zGv6)8jJKSu?>#)XudqwF4oq&j?v^bom2Npa*uSN=Xa~jVeSMU%`}$tloH~5lmaA{s zGQ=grS6EtT42}#`s{{4^>d4?kM^0h&wcg)p?rESBq4+H(O-UOWlbo6fk zShYFb9GM;)tq;})CyIH3QZccsPXK9ZO*OVF^~pmAp=fpQ^boOYZEBi$e0p$ndUT?D zu+^UUeV}4F#iaSfNeMK4#_B^;qy3Hksrq!I-W(j9SaZ{b856XJvLpP9-gXs;>9lSZln=GnJ1_Lvh-1i!CuC6DRrTM762P(?sQPF>KsGYte!2a0RfCeYLHv051z zZT64#R~iFD6X!^vSp?beIv^P7Z(&EoVuQZ!G()$@J<#vyEv=FSj8%r3)#;JZTCFxU zG*p>5cbb8#Lv5TjE$-`c%53Qw+@&zKn@sIAvnBYpAu=+C##Kg#tBuCM)X><_#70>S zQ>YcQF)-%rv1v$C>~(56IyF|W4ps)}SsiXRh9@@lr=6vZLo8QnWxp+ML$uLOO55O)ShG(E9P@;ko+W zrs8zLJ}@%Ps%v9xaH?MKADx;gzvV=lk2vLm^7~B=+6;kHDj97eetURW-lR<+s#D<9 zU!NMSO!rqFY)~obb3%Ay?T-EPwZ_SEm`E*Y z>#Li$9@NC6OSOH?$*K9L?8J5A}MsvDGp=Q!96K|1t z&fz+Kdz4l2W`BL8ULBoy*-K;rhNq`StHYJ4e(Y|wJ~cRT(MvRNb7-VFJUTW~V+o%v z0F8-@S9~H=a$($w)Z;&GzO8JZrb4-Sou4h%QyHMT5FTvnWvic){1#I<$pCg+x8IqgD221Zeip~e)2#%cvCI?qdG7(HZi!HiHC<l4H0xgeO(yN=*d!yxha$>wAdEsx|O&s_b$!OH6ydv!QG zFm?(9_MBom&|jTm_swXdGFBrdX-rgeP=@J78_ZBmf@2H5<_|9R_1UhKzP_83UyIqh z8@E4;i8@gRt5efR_}Eahzfr4K34O<^2_8czo=ZEbji#2v62pXPmZLyG`s+iYZ@pO= z8S0heYJB)X)H-?E$F_7#=nz$mT zaCyFdz*eeB6e5l1ho^_9Yt7Mtf!bIF!#6T<)y`9nGMwZBR5VT+V`u=sJzS}cO^r>B zj#Z~7#wAT7V{PG>^Fs@_9ad@6Wkjb)j84*ldUd4I7#glC0-GMGjZMVkr-W|MLFXWw zUtq6HieC*sIasUKs*S-Rc-KF%^H#z3B4W^0u}XcYHdPy$MwAAoo1?@16R#La0c(p4 zhgL;~@N8sYpg~$vn<96as!mT$yz-@i2EUBusSvl-s>AjEiHYY0O?{x!9331a?qXf0 z(wLgq^^!m{P@5W^8mOR`V?)DLqVua)1-_?>{DxQ!YW7opsSQ`~Ruk7eR}V7RL6Y76 zks)$NT<^s0pN9VJ$<3()u@eF?432r0lU?4kM`EKCg_=#$gW>-AbY-l6;#L2fl*0@o z9s`55VbW{17Y=Fr;@HHsG6&A&TMb}fFkVP}qT;m1!u-L>MK)a0cW9))IX&F$pK2)f zt=1>5%PdYU?0dD$<+>ZU zY`KY_S8TC3MS-o=A^Q5P;%Ytu5-{m#f3->313O+F9K$$IyylKolU7ffv^CKB zrKK-2BdFA>SVlILj!jpl>qCPRH_re-wPKdn08r(KG}vm!2>(jW+C^5v<@r^qMrtES zJ*A=%BJMGg`dijnxy%I#_)3iLtv~CxlYW3uOcL78@aG1qt%Y0k=zF!+KCV7oTWG8j zjf4*gFDTRwObv`pH>&l)Dsk_`Yg;yC#Ui`2NxYF{94kE47@2O$wM^G46R&$U&?^XP z58KCDm65^9IG4#+5+9~Wi|=KcIr#Pq;3n8();zXf21${1C{zWc&pT((C_Tc z>y4enfl7@OV(-q(&YpAT%sJor2Jm_X5~X*aZ#aZdLILO*>Oxgy-G1+CGP}|109zR4 zn7f8%z_UZe7_gdbj}5t*@Kxg)4oZw$X2vwOjhv3v?5+J zii#lJ@Q}?g-9vP1-=Yvb=x^SBYiH^6MEdb7Z8#CUB5)00xm?$%79`E9CwHU>z_4>WXT1v|yuEGUgHcikG08pjDuf zg>kX=(RkZs*l+5@07+v`=@c^8N}A`Mh9U@;1hIz$tJX$=NxmJv1tML1m0wX0=TrRiO}|ni09-%pCc$p(mteUim$7tr<<sWFHB~ z+P+gH9ESj?Vj@_ULq9}>y}nQT^Hr70Dr2FCkOm{!cTVMUVu2caC(DQL?t8kjuq-b? z4$3KGv2=Um0hIF}hXRT9$v}-=ffFy50rAV4-Q;+70Vy!kQ#ww1N(XvF(x&^Ci<&3O zPnIm(tt|gkk)HDq;3^dYjVmoGJdJ8P)E64U0U5>R;B?_^jop4BF)-GTDhJrhRW*c_ z`}XFG85T7lz{@7b3NmON=5p8}MQeY;W0rPUqM*w`VPH}>Z>{!t_RlPJHMPR#A zrpjZN_AS6!y_b`XX$=32@!mc_ugz4>JQ~GdN~sYS_ti zF6?_AI>s9=!j`mZuoH@%WYPJpq^~OE@solhPAq|nhYAglG?NK#-#;169h?o~={1SA z0G)IDOiD;!rU;l;JHFwx4)3)<8t#8sZ0gqFQsFV z?`b+wbu{R;JKd+!iP%>b-v2A9z)_B(w%(M`mxZDV%iz(zu7z$3m@734P7yvi<%3#?d_iq*^slZNLdUAbCIR zZyey!C<1iRC*&e6lGsGw!+qL|Xgmfrd)$0kmjjR$9O@A>JLk|Rs*4*Nz>nfIF|0-32ezQ3! z{e%B%v2+MF8}xmUZ|4>^fSUH*RUwtHfw@pRl9;mymc7A&ich!aWx3Aka)lJ_pOx#n zQD@67I+6!I(YcKBa)wSqE;GK&)bsQAK$z`!=h2PVS?Tvjcq((8=7_uDbOGCATX38= zD3BJxCBXchK^(`%N&HsL1($;Cq}Hfi0|MI#Y8Pt648ixQz0f2oLw0M8t=gMJ;jA@o zZl&Ei@CO9tqE&A|EnZUzUf)3A?qw zJsg()B1BPyYL!ivmS`S6HN1QSGxe~WI^SbMGi8D_>FzPxZLK^*C2PrG{1ZUzw zBC;ouwbITl(Yx2~+`Sz4D6RE+o887rj@G`COl1R4Nf_-bJ-8Qq1|zbwBJR7WHH+>_ z_M~K}bjiu)b(uFbwZYUnokZs5tBf@mEB!&Xb8d?5yiE*H9J;=av!yP^@9ntawzb~b zZZ-uF^v%1w8F)^gsLSEdG4_PL_eq0GC-MsEn%;G--T~_}O4fIK5}C{2k0HXdQ$%5>$<%M)tnyW;cP8DeZZ6?uQT&YUO z$2!Muduq3f)E(U}O2@XzpnNb{m(^;j`Sqas(%3qx9?I57RazW3+xa7T(;OS*WIABM zl&S|46R94~slHkrsnjqQ7Y@v4B(qYnxW6rGpDV=m2a4%KxsYE}O21Lyb7JK5aast} NAMoGXEjlm6{sp^<9NGW? diff --git a/crates/marine-test-macro-impl/tests/generation_tests/empty_func/expanded.rs b/crates/marine-test-macro-impl/tests/generation_tests/empty_func/expanded.rs deleted file mode 100644 index e48e13b..0000000 --- a/crates/marine-test-macro-impl/tests/generation_tests/empty_func/expanded.rs +++ /dev/null @@ -1,128 +0,0 @@ -#[test] -fn empty_string() { - pub mod marine_test_env { - pub mod greeting { - #[derive( - Clone, - Debug, - marine_rs_sdk_test :: internal :: serde :: Serialize, - marine_rs_sdk_test :: internal :: serde :: Deserialize - )] - #[serde(crate = "marine_rs_sdk_test::internal::serde")] - pub struct CallParameters { - pub init_peer_id: String, - pub service_id: String, - pub service_creator_peer_id: String, - pub host_id: String, - pub particle_id: String, - pub tetraplets: Vec> - } - #[derive( - Clone, - Debug, - marine_rs_sdk_test :: internal :: serde :: Serialize, - marine_rs_sdk_test :: internal :: serde :: Deserialize - )] - #[serde(crate = "marine_rs_sdk_test::internal::serde")] - pub struct MountedBinaryResult { - pub ret_code: i32, - pub error: String, - pub stdout: Vec, - pub stderr: Vec - } - #[derive( - Clone, - Debug, - marine_rs_sdk_test :: internal :: serde :: Serialize, - marine_rs_sdk_test :: internal :: serde :: Deserialize - )] - #[serde(crate = "marine_rs_sdk_test::internal::serde")] - pub struct MountedBinaryStringResult { - pub ret_code: i32, - pub error: String, - pub stdout: String, - pub stderr: String - } - #[derive( - Clone, - Debug, - marine_rs_sdk_test :: internal :: serde :: Serialize, - marine_rs_sdk_test :: internal :: serde :: Deserialize - )] - #[serde(crate = "marine_rs_sdk_test::internal::serde")] - pub struct SecurityTetraplet { - pub peer_pk: String, - pub service_id: String, - pub function_name: String, - pub json_path: String - } - pub struct ModuleInterface { - marine: - std::rc::Rc, >, - } - impl ModuleInterface { - pub fn new( - marine: std::rc::Rc< - std::cell::RefCell,> - ) -> Self { - Self { marine } - } - } - impl ModuleInterface {} - } - } - let tmp_dir = std::env::temp_dir(); - let service_id = marine_rs_sdk_test::internal::Uuid::new_v4().to_string(); - let tmp_dir = tmp_dir.join(&service_id); - let tmp_dir = tmp_dir.to_string_lossy().to_string(); - std::fs::create_dir(&tmp_dir).expect("can't create a directory for service in tmp"); - let mut module_path = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")); - let mut file_path = std::path::Path::new(file!()).components(); - let mut truncated_file_path = Vec::new(); - loop { - if module_path.ends_with(file_path.as_path()) { - break; - } - let (file_path_, remainder) = match file_path.next_back().and_then(|p| match p { - std::path::Component::Normal(_) - | std::path::Component::CurDir - | std::path::Component::ParentDir => Some((file_path, p)), - _ => None, - }) { - Some(t) => t, - None => break, - }; - file_path = file_path_; - truncated_file_path.push(remainder); - } - for path in truncated_file_path.iter().rev() { - module_path.push(path); - } - let _ = module_path.pop(); - let config_path = module_path.join("Config.toml"); - let modules_dir = module_path.join("artifacts"); - let modules_dir = modules_dir - .to_str() - .expect("modules_dir contains invalid UTF8 string"); - let mut __m_generated_marine_config = marine_rs_sdk_test::internal::TomlAppServiceConfig::load( - &config_path - ) - .unwrap_or_else(|e| - panic!( - "app service config located at `{:?}` can't be loaded: {}", - config_path, e - )); - __m_generated_marine_config.service_base_dir = Some(tmp_dir); - __m_generated_marine_config.toml_faas_config.modules_dir = Some(modules_dir.to_string()); - let marine = marine_rs_sdk_test::internal::AppService::new_with_empty_facade( - __m_generated_marine_config, - service_id, - std::collections::HashMap::new() - ) - .unwrap_or_else(|e| panic!("app service can't be created: {}", e)); - let marine = std::rc::Rc::new(std::cell::RefCell::new(marine)); - fn test_func() { - {} - } - test_func() -} diff --git a/crates/marine-test-macro-impl/tests/generation_tests/empty_func/marine_test.rs b/crates/marine-test-macro-impl/tests/generation_tests/empty_func/marine_test.rs deleted file mode 100644 index a8c58fd..0000000 --- a/crates/marine-test-macro-impl/tests/generation_tests/empty_func/marine_test.rs +++ /dev/null @@ -1 +0,0 @@ -fn empty_string() {} diff --git a/crates/marine-test-macro-impl/tests/generation_tests/mounted_binary/Config.toml b/crates/marine-test-macro-impl/tests/generation_tests/mounted_binary/Config.toml deleted file mode 100644 index a2db194..0000000 --- a/crates/marine-test-macro-impl/tests/generation_tests/mounted_binary/Config.toml +++ /dev/null @@ -1,8 +0,0 @@ -modules_dir = "artifacts/" - -[[module]] - name = "greeting" - mem_pages_count = 1 - logger_enabled = false - [module.mounted_binaries] - echo = "/usr/bin/curl" diff --git a/crates/marine-test-macro-impl/tests/generation_tests/mounted_binary/artifacts/greeting.wasm b/crates/marine-test-macro-impl/tests/generation_tests/mounted_binary/artifacts/greeting.wasm deleted file mode 100755 index 7f605b6be4eff3044ccf3ebc5a193c85167ea40e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64072 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 Pwt&zcASb0ux$OS{7*d%7 diff --git a/crates/marine-test-macro-impl/tests/generation_tests/mounted_binary/expanded.rs b/crates/marine-test-macro-impl/tests/generation_tests/mounted_binary/expanded.rs deleted file mode 100644 index 4b23eb7..0000000 --- a/crates/marine-test-macro-impl/tests/generation_tests/mounted_binary/expanded.rs +++ /dev/null @@ -1,167 +0,0 @@ -#[test] -fn test() { - pub mod marine_test_env { - pub mod greeting { - #[derive( - Clone, - Debug, - marine_rs_sdk_test :: internal :: serde :: Serialize, - marine_rs_sdk_test :: internal :: serde :: Deserialize - )] - #[serde(crate = "marine_rs_sdk_test::internal::serde")] - pub struct CallParameters { - pub init_peer_id: String, - pub service_id: String, - pub service_creator_peer_id: String, - pub host_id: String, - pub particle_id: String, - pub tetraplets: Vec> - } - #[derive( - Clone, - Debug, - marine_rs_sdk_test :: internal :: serde :: Serialize, - marine_rs_sdk_test :: internal :: serde :: Deserialize - )] - #[serde(crate = "marine_rs_sdk_test::internal::serde")] - pub struct MountedBinaryResult { - pub ret_code: i32, - pub error: String, - pub stdout: Vec, - pub stderr: Vec - } - #[derive( - Clone, - Debug, - marine_rs_sdk_test :: internal :: serde :: Serialize, - marine_rs_sdk_test :: internal :: serde :: Deserialize - )] - #[serde(crate = "marine_rs_sdk_test::internal::serde")] - pub struct MountedBinaryStringResult { - pub ret_code: i32, - pub error: String, - pub stdout: String, - pub stderr: String - } - #[derive( - Clone, - Debug, - marine_rs_sdk_test :: internal :: serde :: Serialize, - marine_rs_sdk_test :: internal :: serde :: Deserialize - )] - #[serde(crate = "marine_rs_sdk_test::internal::serde")] - pub struct SecurityTetraplet { - pub peer_pk: String, - pub service_id: String, - pub function_name: String, - pub json_path: String - } - pub struct ModuleInterface { - marine: - std::rc::Rc, >, - } - impl ModuleInterface { - pub fn new( - marine: std::rc::Rc< - std::cell::RefCell, - > - ) -> Self { - Self { marine } - } - } - impl ModuleInterface { - pub fn download(&mut self, url: String) -> String { - use std::ops::DerefMut; - let arguments = marine_rs_sdk_test::internal::serde_json::json!([url]); - let result = self - .marine - .as_ref() - .borrow_mut() - .call_module("greeting", "download", arguments, <_>::default()) - .expect("call to Marine failed"); - let result: String = - marine_rs_sdk_test::internal::serde_json::from_value(result) - .expect("the default deserializer shouldn't fail"); - result - } - pub fn download_cp( - &mut self, - url: String, - cp: marine_rs_sdk_test::CallParameters - ) -> String { - use std::ops::DerefMut; - let arguments = marine_rs_sdk_test::internal::serde_json::json!([url]); - let result = self - .marine - .as_ref() - .borrow_mut() - .call_module("greeting", "download", arguments, cp) - .expect("call to Marine failed"); - let result: String = - marine_rs_sdk_test::internal::serde_json::from_value(result) - .expect("the default deserializer shouldn't fail"); - result - } - } - } - } - let tmp_dir = std::env::temp_dir(); - let service_id = marine_rs_sdk_test::internal::Uuid::new_v4().to_string(); - let tmp_dir = tmp_dir.join(&service_id); - let tmp_dir = tmp_dir.to_string_lossy().to_string(); - std::fs::create_dir(&tmp_dir).expect("can't create a directory for service in tmp"); - let mut module_path = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")); - let mut file_path = std::path::Path::new(file!()).components(); - let mut truncated_file_path = Vec::new(); - loop { - if module_path.ends_with(file_path.as_path()) { - break; - } - let (file_path_, remainder) = match file_path.next_back().and_then(|p| match p { - std::path::Component::Normal(_) - | std::path::Component::CurDir - | std::path::Component::ParentDir => Some((file_path, p)), - _ => None, - }) { - Some(t) => t, - None => break, - }; - file_path = file_path_; - truncated_file_path.push(remainder); - } - for path in truncated_file_path.iter().rev() { - module_path.push(path); - } - let _ = module_path.pop(); - let config_path = module_path.join("Config.toml"); - let modules_dir = module_path.join("artifacts"); - let modules_dir = modules_dir - .to_str() - .expect("modules_dir contains invalid UTF8 string"); - let mut __m_generated_marine_config = marine_rs_sdk_test::internal::TomlAppServiceConfig::load( - &config_path - ) - .unwrap_or_else(|e| - panic!( - "app service config located at `{:?}` can't be loaded: {}", - config_path, e - ) - ); - __m_generated_marine_config.service_base_dir = Some(tmp_dir); - __m_generated_marine_config.toml_faas_config.modules_dir = Some(modules_dir.to_string()); - let marine = marine_rs_sdk_test::internal::AppService::new_with_empty_facade( - __m_generated_marine_config, - service_id, - std::collections::HashMap::new() - ) - .unwrap_or_else(|e| panic!("app service can't be created: {}", e)); - let marine = std::rc::Rc::new(std::cell::RefCell::new(marine)); - let mut greeting = marine_test_env::greeting::ModuleInterface::new(marine.clone()); - fn test_func(greeting: marine_test_env::greeting::ModuleInterface) { - let mut greeting = greeting; - { - let _ = greeting.download("duckduckgo.com"); - } - } - test_func(greeting,) -} diff --git a/crates/marine-test-macro-impl/tests/generation_tests/mounted_binary/marine_test.rs b/crates/marine-test-macro-impl/tests/generation_tests/mounted_binary/marine_test.rs deleted file mode 100644 index 47bb39c..0000000 --- a/crates/marine-test-macro-impl/tests/generation_tests/mounted_binary/marine_test.rs +++ /dev/null @@ -1,3 +0,0 @@ -fn test(greeting: marine_test_env::greeting::ModuleInterface) { - let _ = greeting.download("duckduckgo.com"); -} diff --git a/crates/marine-test-macro-impl/tests/generation_tests/multi-service-multiple/empty_func/Config.toml b/crates/marine-test-macro-impl/tests/generation_tests/multi-service-multiple/empty_func/Config.toml deleted file mode 100644 index cd6d314..0000000 --- a/crates/marine-test-macro-impl/tests/generation_tests/multi-service-multiple/empty_func/Config.toml +++ /dev/null @@ -1,6 +0,0 @@ -modules_dir = "artifacts/" - -[[module]] - name = "greeting" - mem_pages_count = 50 - logger_enabled = false diff --git a/crates/marine-test-macro-impl/tests/generation_tests/multi-service-multiple/empty_func/artifacts/greeting.wasm b/crates/marine-test-macro-impl/tests/generation_tests/multi-service-multiple/empty_func/artifacts/greeting.wasm deleted file mode 100755 index 20cd5a21c399164aeb704b39ac9869f2c400597c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56806 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 NAMoGXEjlm6{sp^<9NGW? diff --git a/crates/marine-test-macro-impl/tests/generation_tests/multi-service-multiple/expanded.rs b/crates/marine-test-macro-impl/tests/generation_tests/multi-service-multiple/expanded.rs deleted file mode 100644 index b9381a7..0000000 --- a/crates/marine-test-macro-impl/tests/generation_tests/multi-service-multiple/expanded.rs +++ /dev/null @@ -1,504 +0,0 @@ -#[test] -fn test() { - pub mod marine_test_env { - pub mod empty_func { - pub mod modules { - pub mod greeting { - #[derive( - Clone, - Debug, - marine_rs_sdk_test :: internal :: serde :: Serialize, - marine_rs_sdk_test :: internal :: serde :: Deserialize - )] - #[serde(crate = "marine_rs_sdk_test::internal::serde")] - pub struct CallParameters { - pub init_peer_id: String, - pub service_id: String, - pub service_creator_peer_id: String, - pub host_id: String, - pub particle_id: String, - pub tetraplets: Vec> - } - #[derive( - Clone, - Debug, - marine_rs_sdk_test :: internal :: serde :: Serialize, - marine_rs_sdk_test :: internal :: serde :: Deserialize - )] - #[serde(crate = "marine_rs_sdk_test::internal::serde")] - pub struct MountedBinaryResult { - pub ret_code: i32, - pub error: String, - pub stdout: Vec, - pub stderr: Vec - } - #[derive( - Clone, - Debug, - marine_rs_sdk_test :: internal :: serde :: Serialize, - marine_rs_sdk_test :: internal :: serde :: Deserialize - )] - #[serde(crate = "marine_rs_sdk_test::internal::serde")] - pub struct MountedBinaryStringResult { - pub ret_code: i32, - pub error: String, - pub stdout: String, - pub stderr: String - } - #[derive( - Clone, - Debug, - marine_rs_sdk_test :: internal :: serde :: Serialize, - marine_rs_sdk_test :: internal :: serde :: Deserialize - )] - #[serde(crate = "marine_rs_sdk_test::internal::serde")] - pub struct SecurityTetraplet { - pub peer_pk: String, - pub service_id: String, - pub function_name: String, - pub json_path: String - } - pub struct ModuleInterface { - marine: std::rc::Rc< - std::cell::RefCell, - >, - } - impl ModuleInterface { - pub fn new( - marine: std::rc::Rc< - std::cell::RefCell, - > - ) -> Self { - Self { marine } - } - } - impl ModuleInterface {} - } - } - pub mod __facade_override { - #[derive( - Clone, - Debug, - marine_rs_sdk_test :: internal :: serde :: Serialize, - marine_rs_sdk_test :: internal :: serde :: Deserialize - )] - #[serde(crate = "marine_rs_sdk_test::internal::serde")] - pub struct CallParameters { - pub init_peer_id: String, - pub service_id: String, - pub service_creator_peer_id: String, - pub host_id: String, - pub particle_id: String, - pub tetraplets: Vec> - } - #[derive( - Clone, - Debug, - marine_rs_sdk_test :: internal :: serde :: Serialize, - marine_rs_sdk_test :: internal :: serde :: Deserialize - )] - #[serde(crate = "marine_rs_sdk_test::internal::serde")] - pub struct MountedBinaryResult { - pub ret_code: i32, - pub error: String, - pub stdout: Vec, - pub stderr: Vec - } - #[derive( - Clone, - Debug, - marine_rs_sdk_test :: internal :: serde :: Serialize, - marine_rs_sdk_test :: internal :: serde :: Deserialize - )] - #[serde(crate = "marine_rs_sdk_test::internal::serde")] - pub struct MountedBinaryStringResult { - pub ret_code: i32, - pub error: String, - pub stdout: String, - pub stderr: String - } - #[derive( - Clone, - Debug, - marine_rs_sdk_test :: internal :: serde :: Serialize, - marine_rs_sdk_test :: internal :: serde :: Deserialize - )] - #[serde(crate = "marine_rs_sdk_test::internal::serde")] - pub struct SecurityTetraplet { - pub peer_pk: String, - pub service_id: String, - pub function_name: String, - pub json_path: String - } - pub struct ModuleInterface { - marine: - std::rc::Rc, - >, - } - impl ModuleInterface { - pub fn new( - marine: std::rc::Rc< - std::cell::RefCell, - > - ) -> Self { - Self { marine } - } - } - impl ModuleInterface {} - } - pub use __facade_override::CallParameters; - pub use __facade_override::MountedBinaryResult; - pub use __facade_override::MountedBinaryStringResult; - pub use __facade_override::SecurityTetraplet; - pub struct __GeneratedModules { - pub greeting: modules::greeting::ModuleInterface, - } - impl __GeneratedModules { - fn new( - marine: std::rc::Rc< - std::cell::RefCell, - > - ) -> Self { - Self { - greeting: modules::greeting::ModuleInterface::new(marine.clone()), - } - } - } - pub struct ServiceInterface { - pub modules: __GeneratedModules, - __facade: __facade_override::ModuleInterface, - marine: std::rc::Rc, > - } - impl ServiceInterface { - pub fn new() -> Self { - let tmp_dir = std::env::temp_dir(); - let service_id = marine_rs_sdk_test::internal::Uuid::new_v4().to_string(); - let tmp_dir = tmp_dir.join(&service_id); - let tmp_dir = tmp_dir.to_string_lossy().to_string(); - std::fs::create_dir(&tmp_dir) - .expect("can't create a directory for service in tmp"); - let mut module_path = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")); - let mut file_path = std::path::Path::new(file!()).components(); - let mut truncated_file_path = Vec::new(); - loop { - if module_path.ends_with(file_path.as_path()) { - break; - } - let (file_path_, remainder) = - match file_path.next_back().and_then(|p| match p { - std::path::Component::Normal(_) - | std::path::Component::CurDir - | std::path::Component::ParentDir => Some((file_path, p)), - _ => None, - }) { - Some(t) => t, - None => break, - }; - file_path = file_path_; - truncated_file_path.push(remainder); - } - for path in truncated_file_path.iter().rev() { - module_path.push(path); - } - let _ = module_path.pop(); - let config_path = module_path.join("empty_func/Config.toml"); - let modules_dir = module_path.join("empty_func/artifacts"); - let modules_dir = modules_dir - .to_str() - .expect("modules_dir contains invalid UTF8 string"); - let mut __m_generated_marine_config = - marine_rs_sdk_test::internal::TomlAppServiceConfig::load(&config_path) - .unwrap_or_else(|e| - panic!( - "app service config located at `{:?}` can't be loaded: {}", - config_path, e - ) - ); - __m_generated_marine_config.service_base_dir = Some(tmp_dir); - __m_generated_marine_config.toml_faas_config.modules_dir = - Some(modules_dir.to_string()); - let marine = marine_rs_sdk_test::internal::AppService::new_with_empty_facade( - __m_generated_marine_config, - service_id, - std::collections::HashMap::new() - ) - .unwrap_or_else(|e| panic!("app service can't be created: {}", e)); - let marine = std::rc::Rc::new(std::cell::RefCell::new(marine)); - let modules = __GeneratedModules::new(marine.clone()); - let __facade = __facade_override::ModuleInterface::new(marine.clone()); - Self { - marine, - modules, - __facade - } - } - } - } - pub mod mounted_binary { - pub mod modules { - pub mod greeting { - #[derive( - Clone, - Debug, - marine_rs_sdk_test :: internal :: serde :: Serialize, - marine_rs_sdk_test :: internal :: serde :: Deserialize - )] - #[serde(crate = "marine_rs_sdk_test::internal::serde")] - pub struct CallParameters { - pub init_peer_id: String, - pub service_id: String, - pub service_creator_peer_id: String, - pub host_id: String, - pub particle_id: String, - pub tetraplets: Vec> - } - #[derive( - Clone, - Debug, - marine_rs_sdk_test :: internal :: serde :: Serialize, - marine_rs_sdk_test :: internal :: serde :: Deserialize - )] - #[serde(crate = "marine_rs_sdk_test::internal::serde")] - pub struct MountedBinaryResult { - pub ret_code: i32, - pub error: String, - pub stdout: Vec, - pub stderr: Vec - } - #[derive( - Clone, - Debug, - marine_rs_sdk_test :: internal :: serde :: Serialize, - marine_rs_sdk_test :: internal :: serde :: Deserialize - )] - #[serde(crate = "marine_rs_sdk_test::internal::serde")] - pub struct MountedBinaryStringResult { - pub ret_code: i32, - pub error: String, - pub stdout: String, - pub stderr: String - } - #[derive( - Clone, - Debug, - marine_rs_sdk_test :: internal :: serde :: Serialize, - marine_rs_sdk_test :: internal :: serde :: Deserialize - )] - #[serde(crate = "marine_rs_sdk_test::internal::serde")] - pub struct SecurityTetraplet { - pub peer_pk: String, - pub service_id: String, - pub function_name: String, - pub json_path: String - } - pub struct ModuleInterface { - marine: std::rc::Rc< - std::cell::RefCell, - >, - } - impl ModuleInterface { - pub fn new( - marine: std::rc::Rc< - std::cell::RefCell, - > - ) -> Self { - Self { marine } - } - } - impl ModuleInterface { - pub fn download(&mut self, url: String) -> String { - use std::ops::DerefMut; - let arguments = marine_rs_sdk_test::internal::serde_json::json!([url]); - let result = self - .marine - .as_ref() - .borrow_mut() - .call_module("greeting", "download", arguments, <_>::default()) - .expect("call to Marine failed"); - let result: String = - marine_rs_sdk_test::internal::serde_json::from_value(result) - .expect("the default deserializer shouldn't fail"); - result - } - pub fn download_cp( - &mut self, - url: String, - cp: marine_rs_sdk_test::CallParameters - ) -> String { - use std::ops::DerefMut; - let arguments = marine_rs_sdk_test::internal::serde_json::json!([url]); - let result = self - .marine - .as_ref() - .borrow_mut() - .call_module("greeting", "download", arguments, cp) - .expect("call to Marine failed"); - let result: String = - marine_rs_sdk_test::internal::serde_json::from_value(result) - .expect("the default deserializer shouldn't fail"); - result - } - } - } - } - pub mod __facade_override { - pub use super::super::empty_func::CallParameters; - pub use super::super::empty_func::MountedBinaryResult; - pub use super::super::empty_func::MountedBinaryStringResult; - pub use super::super::empty_func::SecurityTetraplet; - pub struct ModuleInterface { - marine: - std::rc::Rc, - >, - } - impl ModuleInterface { - pub fn new( - marine: std::rc::Rc< - std::cell::RefCell, - > - ) -> Self { - Self { marine } - } - } - impl ModuleInterface { - pub fn download(&mut self, url: String) -> String { - use std::ops::DerefMut; - let arguments = marine_rs_sdk_test::internal::serde_json::json!([url]); - let result = self - .marine - .as_ref() - .borrow_mut() - .call_module("greeting", "download", arguments, <_>::default()) - .expect("call to Marine failed"); - let result: String = - marine_rs_sdk_test::internal::serde_json::from_value(result) - .expect("the default deserializer shouldn't fail"); - result - } - pub fn download_cp( - &mut self, - url: String, - cp: marine_rs_sdk_test::CallParameters - ) -> String { - use std::ops::DerefMut; - let arguments = marine_rs_sdk_test::internal::serde_json::json!([url]); - let result = self - .marine - .as_ref() - .borrow_mut() - .call_module("greeting", "download", arguments, cp) - .expect("call to Marine failed"); - let result: String = - marine_rs_sdk_test::internal::serde_json::from_value(result) - .expect("the default deserializer shouldn't fail"); - result - } - } - } - pub use __facade_override::CallParameters; - pub use __facade_override::MountedBinaryResult; - pub use __facade_override::MountedBinaryStringResult; - pub use __facade_override::SecurityTetraplet; - pub struct __GeneratedModules { - pub greeting: modules::greeting::ModuleInterface, - } - impl __GeneratedModules { - fn new( - marine: std::rc::Rc< - std::cell::RefCell, - > - ) -> Self { - Self { - greeting: modules::greeting::ModuleInterface::new(marine.clone()), - } - } - } - pub struct ServiceInterface { - pub modules: __GeneratedModules, - __facade: __facade_override::ModuleInterface, - marine: std::rc::Rc, > - } - impl ServiceInterface { - pub fn new() -> Self { - let tmp_dir = std::env::temp_dir(); - let service_id = marine_rs_sdk_test::internal::Uuid::new_v4().to_string(); - let tmp_dir = tmp_dir.join(&service_id); - let tmp_dir = tmp_dir.to_string_lossy().to_string(); - std::fs::create_dir(&tmp_dir) - .expect("can't create a directory for service in tmp"); - let mut module_path = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")); - let mut file_path = std::path::Path::new(file!()).components(); - let mut truncated_file_path = Vec::new(); - loop { - if module_path.ends_with(file_path.as_path()) { - break; - } - let (file_path_, remainder) = - match file_path.next_back().and_then(|p| match p { - std::path::Component::Normal(_) - | std::path::Component::CurDir - | std::path::Component::ParentDir => Some((file_path, p)), - _ => None, - }) { - Some(t) => t, - None => break, - }; - file_path = file_path_; - truncated_file_path.push(remainder); - } - for path in truncated_file_path.iter().rev() { - module_path.push(path); - } - let _ = module_path.pop(); - let config_path = module_path.join("mounted_binary/Config.toml"); - let modules_dir = module_path.join("mounted_binary/artifacts"); - let modules_dir = modules_dir - .to_str() - .expect("modules_dir contains invalid UTF8 string"); - let mut __m_generated_marine_config = - marine_rs_sdk_test::internal::TomlAppServiceConfig::load(&config_path) - .unwrap_or_else(|e| - panic!( - "app service config located at `{:?}` can't be loaded: {}", - config_path, e - ) - ); - __m_generated_marine_config.service_base_dir = Some(tmp_dir); - __m_generated_marine_config.toml_faas_config.modules_dir = - Some(modules_dir.to_string()); - let marine = marine_rs_sdk_test::internal::AppService::new_with_empty_facade( - __m_generated_marine_config, - service_id, - std::collections::HashMap::new() - ) - .unwrap_or_else(|e| panic!("app service can't be created: {}", e)); - let marine = std::rc::Rc::new(std::cell::RefCell::new(marine)); - let modules = __GeneratedModules::new(marine.clone()); - let __facade = __facade_override::ModuleInterface::new(marine.clone()); - Self { - marine, - modules, - __facade - } - } - pub fn download(&mut self, url: String) -> String { - self.__facade.download(url,) - } - pub fn download_cp( - &mut self, - url: String, - cp: marine_rs_sdk_test::CallParameters - ) -> String { - self.__facade.download_cp(url, cp,) - } - } - } - } - fn test_func() { - { - let mut greeting = marine_test_env::greeting::ServiceInterface::new(); - let _ = greeting.download("duckduckgo.com"); - } - } - test_func() -} diff --git a/crates/marine-test-macro-impl/tests/generation_tests/multi-service-multiple/marine_test.rs b/crates/marine-test-macro-impl/tests/generation_tests/multi-service-multiple/marine_test.rs deleted file mode 100644 index afff316..0000000 --- a/crates/marine-test-macro-impl/tests/generation_tests/multi-service-multiple/marine_test.rs +++ /dev/null @@ -1,4 +0,0 @@ -fn test() { - let mut greeting = marine_test_env::greeting::ServiceInterface::new(); - let _ = greeting.download("duckduckgo.com"); -} diff --git a/crates/marine-test-macro-impl/tests/generation_tests/multi-service-multiple/mounted_binary/Config.toml b/crates/marine-test-macro-impl/tests/generation_tests/multi-service-multiple/mounted_binary/Config.toml deleted file mode 100644 index f642154..0000000 --- a/crates/marine-test-macro-impl/tests/generation_tests/multi-service-multiple/mounted_binary/Config.toml +++ /dev/null @@ -1,8 +0,0 @@ -modules_dir = "artifacts/" - -[[module]] - name = "greeting" - mem_pages_count = 50 - logger_enabled = false - [module.mounted_binaries] - echo = "/usr/bin/curl" diff --git a/crates/marine-test-macro-impl/tests/generation_tests/multi-service-multiple/mounted_binary/artifacts/greeting.wasm b/crates/marine-test-macro-impl/tests/generation_tests/multi-service-multiple/mounted_binary/artifacts/greeting.wasm deleted file mode 100755 index 7f605b6be4eff3044ccf3ebc5a193c85167ea40e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64072 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 Pwt&zcASb0ux$OS{7*d%7 diff --git a/crates/marine-test-macro-impl/tests/generation_tests/multi-service-single/empty_func/Config.toml b/crates/marine-test-macro-impl/tests/generation_tests/multi-service-single/empty_func/Config.toml deleted file mode 100644 index cd6d314..0000000 --- a/crates/marine-test-macro-impl/tests/generation_tests/multi-service-single/empty_func/Config.toml +++ /dev/null @@ -1,6 +0,0 @@ -modules_dir = "artifacts/" - -[[module]] - name = "greeting" - mem_pages_count = 50 - logger_enabled = false diff --git a/crates/marine-test-macro-impl/tests/generation_tests/multi-service-single/empty_func/artifacts/greeting.wasm b/crates/marine-test-macro-impl/tests/generation_tests/multi-service-single/empty_func/artifacts/greeting.wasm deleted file mode 100755 index 20cd5a21c399164aeb704b39ac9869f2c400597c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56806 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 NAMoGXEjlm6{sp^<9NGW? diff --git a/crates/marine-test-macro-impl/tests/generation_tests/multi-service-single/expanded.rs b/crates/marine-test-macro-impl/tests/generation_tests/multi-service-single/expanded.rs deleted file mode 100644 index 4c3c7cc..0000000 --- a/crates/marine-test-macro-impl/tests/generation_tests/multi-service-single/expanded.rs +++ /dev/null @@ -1,242 +0,0 @@ -#[test] -fn empty_test() { - pub mod marine_test_env { - pub mod empty_func { - pub mod modules { - pub mod greeting { - #[derive( - Clone, - Debug, - marine_rs_sdk_test :: internal :: serde :: Serialize, - marine_rs_sdk_test :: internal :: serde :: Deserialize - )] - #[serde(crate = "marine_rs_sdk_test::internal::serde")] - pub struct CallParameters { - pub init_peer_id: String, - pub service_id: String, - pub service_creator_peer_id: String, - pub host_id: String, - pub particle_id: String, - pub tetraplets: Vec> - } - #[derive( - Clone, - Debug, - marine_rs_sdk_test :: internal :: serde :: Serialize, - marine_rs_sdk_test :: internal :: serde :: Deserialize - )] - #[serde(crate = "marine_rs_sdk_test::internal::serde")] - pub struct MountedBinaryResult { - pub ret_code: i32, - pub error: String, - pub stdout: Vec, - pub stderr: Vec - } - #[derive( - Clone, - Debug, - marine_rs_sdk_test :: internal :: serde :: Serialize, - marine_rs_sdk_test :: internal :: serde :: Deserialize - )] - #[serde(crate = "marine_rs_sdk_test::internal::serde")] - pub struct MountedBinaryStringResult { - pub ret_code: i32, - pub error: String, - pub stdout: String, - pub stderr: String - } - #[derive( - Clone, - Debug, - marine_rs_sdk_test :: internal :: serde :: Serialize, - marine_rs_sdk_test :: internal :: serde :: Deserialize - )] - #[serde(crate = "marine_rs_sdk_test::internal::serde")] - pub struct SecurityTetraplet { - pub peer_pk: String, - pub service_id: String, - pub function_name: String, - pub json_path: String - } - pub struct ModuleInterface { - marine: std::rc::Rc< - std::cell::RefCell, - >, - } - impl ModuleInterface { - pub fn new( - marine: std::rc::Rc< - std::cell::RefCell, - > - ) -> Self { - Self { marine } - } - } - impl ModuleInterface {} - } - } - pub mod __facade_override { - #[derive( - Clone, - Debug, - marine_rs_sdk_test :: internal :: serde :: Serialize, - marine_rs_sdk_test :: internal :: serde :: Deserialize - )] - #[serde(crate = "marine_rs_sdk_test::internal::serde")] - pub struct CallParameters { - pub init_peer_id: String, - pub service_id: String, - pub service_creator_peer_id: String, - pub host_id: String, - pub particle_id: String, - pub tetraplets: Vec> - } - #[derive( - Clone, - Debug, - marine_rs_sdk_test :: internal :: serde :: Serialize, - marine_rs_sdk_test :: internal :: serde :: Deserialize - )] - #[serde(crate = "marine_rs_sdk_test::internal::serde")] - pub struct MountedBinaryResult { - pub ret_code: i32, - pub error: String, - pub stdout: Vec, - pub stderr: Vec - } - #[derive( - Clone, - Debug, - marine_rs_sdk_test :: internal :: serde :: Serialize, - marine_rs_sdk_test :: internal :: serde :: Deserialize - )] - #[serde(crate = "marine_rs_sdk_test::internal::serde")] - pub struct MountedBinaryStringResult { - pub ret_code: i32, - pub error: String, - pub stdout: String, - pub stderr: String - } - #[derive( - Clone, - Debug, - marine_rs_sdk_test :: internal :: serde :: Serialize, - marine_rs_sdk_test :: internal :: serde :: Deserialize - )] - #[serde(crate = "marine_rs_sdk_test::internal::serde")] - pub struct SecurityTetraplet { - pub peer_pk: String, - pub service_id: String, - pub function_name: String, - pub json_path: String - } - pub struct ModuleInterface { - marine: - std::rc::Rc, - >, - } - impl ModuleInterface { - pub fn new( - marine: std::rc::Rc< - std::cell::RefCell, - > - ) -> Self { - Self { marine } - } - } - impl ModuleInterface {} - } - pub use __facade_override::CallParameters; - pub use __facade_override::MountedBinaryResult; - pub use __facade_override::MountedBinaryStringResult; - pub use __facade_override::SecurityTetraplet; - pub struct __GeneratedModules { - pub greeting: modules::greeting::ModuleInterface, - } - impl __GeneratedModules { - fn new( - marine: std::rc::Rc< - std::cell::RefCell, - > - ) -> Self { - Self { - greeting: modules::greeting::ModuleInterface::new(marine.clone()), - } - } - } - pub struct ServiceInterface { - pub modules: __GeneratedModules, - __facade: __facade_override::ModuleInterface, - marine: std::rc::Rc, > - } - impl ServiceInterface { - pub fn new() -> Self { - let tmp_dir = std::env::temp_dir(); - let service_id = marine_rs_sdk_test::internal::Uuid::new_v4().to_string(); - let tmp_dir = tmp_dir.join(&service_id); - let tmp_dir = tmp_dir.to_string_lossy().to_string(); - std::fs::create_dir(&tmp_dir) - .expect("can't create a directory for service in tmp"); - let mut module_path = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")); - let mut file_path = std::path::Path::new(file!()).components(); - let mut truncated_file_path = Vec::new(); - loop { - if module_path.ends_with(file_path.as_path()) { - break; - } - let (file_path_, remainder) = - match file_path.next_back().and_then(|p| match p { - std::path::Component::Normal(_) - | std::path::Component::CurDir - | std::path::Component::ParentDir => Some((file_path, p)), - _ => None, - }) { - Some(t) => t, - None => break, - }; - file_path = file_path_; - truncated_file_path.push(remainder); - } - for path in truncated_file_path.iter().rev() { - module_path.push(path); - } - let _ = module_path.pop(); - let config_path = module_path.join("empty_func/Config.toml"); - let modules_dir = module_path.join("empty_func/artifacts"); - let modules_dir = modules_dir - .to_str() - .expect("modules_dir contains invalid UTF8 string"); - let mut __m_generated_marine_config = - marine_rs_sdk_test::internal::TomlAppServiceConfig::load(&config_path) - .unwrap_or_else(|e| - panic!( - "app service config located at `{:?}` can't be loaded: {}", - config_path, e - ) - ); - __m_generated_marine_config.service_base_dir = Some(tmp_dir); - __m_generated_marine_config.toml_faas_config.modules_dir = - Some(modules_dir.to_string()); - let marine = marine_rs_sdk_test::internal::AppService::new_with_empty_facade( - __m_generated_marine_config, - service_id, - std::collections::HashMap::new() - ) - .unwrap_or_else(|e| panic!("app service can't be created: {}", e)); - let marine = std::rc::Rc::new(std::cell::RefCell::new(marine)); - let modules = __GeneratedModules::new(marine.clone()); - let __facade = __facade_override::ModuleInterface::new(marine.clone()); - Self { - marine, - modules, - __facade - } - } - } - } - } - fn test_func() { - {} - } - test_func() -} diff --git a/crates/marine-test-macro-impl/tests/generation_tests/multi-service-single/marine_test.rs b/crates/marine-test-macro-impl/tests/generation_tests/multi-service-single/marine_test.rs deleted file mode 100644 index 1444025..0000000 --- a/crates/marine-test-macro-impl/tests/generation_tests/multi-service-single/marine_test.rs +++ /dev/null @@ -1 +0,0 @@ -fn empty_test() {} diff --git a/crates/marine-test-macro-impl/tests/generation_tests/multiple_modules/Config.toml b/crates/marine-test-macro-impl/tests/generation_tests/multiple_modules/Config.toml deleted file mode 100644 index 3927911..0000000 --- a/crates/marine-test-macro-impl/tests/generation_tests/multiple_modules/Config.toml +++ /dev/null @@ -1,10 +0,0 @@ -modules_dir = "artifacts/" -[[module]] - name = "greeting" - mem_pages_count = 1 - logger_enabled = false - -[[module]] - name = "call_parameters" - mem_pages_count = 1 - logger_enabled = false diff --git a/crates/marine-test-macro-impl/tests/generation_tests/multiple_modules/artifacts/call_parameters.wasm b/crates/marine-test-macro-impl/tests/generation_tests/multiple_modules/artifacts/call_parameters.wasm deleted file mode 100755 index 27ec9a7abcc096a28cc07e5bac0de3b05a74abea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81051 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 EAAO2l6aWAK diff --git a/crates/marine-test-macro-impl/tests/generation_tests/multiple_modules/artifacts/greeting.wasm b/crates/marine-test-macro-impl/tests/generation_tests/multiple_modules/artifacts/greeting.wasm deleted file mode 100755 index cb5497009519040b03dc299c5c8b8e7a262d22ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69525 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 diff --git a/crates/marine-test-macro-impl/tests/generation_tests/multiple_modules/expanded.rs b/crates/marine-test-macro-impl/tests/generation_tests/multiple_modules/expanded.rs deleted file mode 100644 index 7c0a886..0000000 --- a/crates/marine-test-macro-impl/tests/generation_tests/multiple_modules/expanded.rs +++ /dev/null @@ -1,321 +0,0 @@ -#[test] -fn empty_string() { - pub mod marine_test_env { - pub mod greeting { - #[derive( - Clone, - Debug, - marine_rs_sdk_test :: internal :: serde :: Serialize, - marine_rs_sdk_test :: internal :: serde :: Deserialize - )] - #[serde(crate = "marine_rs_sdk_test::internal::serde")] - pub struct CallParameters { - pub init_peer_id: String, - pub service_id: String, - pub service_creator_peer_id: String, - pub host_id: String, - pub particle_id: String, - pub tetraplets: Vec> - } - #[derive( - Clone, - Debug, - marine_rs_sdk_test :: internal :: serde :: Serialize, - marine_rs_sdk_test :: internal :: serde :: Deserialize - )] - #[serde(crate = "marine_rs_sdk_test::internal::serde")] - pub struct MountedBinaryResult { - pub ret_code: i32, - pub error: String, - pub stdout: Vec, - pub stderr: Vec - } - #[derive( - Clone, - Debug, - marine_rs_sdk_test :: internal :: serde :: Serialize, - marine_rs_sdk_test :: internal :: serde :: Deserialize - )] - #[serde(crate = "marine_rs_sdk_test::internal::serde")] - pub struct MountedBinaryStringResult { - pub ret_code: i32, - pub error: String, - pub stdout: String, - pub stderr: String - } - #[derive( - Clone, - Debug, - marine_rs_sdk_test :: internal :: serde :: Serialize, - marine_rs_sdk_test :: internal :: serde :: Deserialize - )] - #[serde(crate = "marine_rs_sdk_test::internal::serde")] - pub struct SecurityTetraplet { - pub peer_pk: String, - pub service_id: String, - pub function_name: String, - pub json_path: String - } - pub struct ModuleInterface { - marine: std::rc::Rc, >, - } - impl ModuleInterface { - pub fn new( - marine: std::rc::Rc< - std::cell::RefCell, - > - ) -> Self { - Self { marine } - } - } - impl ModuleInterface { - pub fn greeting(&mut self, name: String) -> String { - use std::ops::DerefMut; - let arguments = marine_rs_sdk_test::internal::serde_json::json!([name]); - let result = self - .marine - .as_ref() - .borrow_mut() - .call_module("greeting", "greeting", arguments, <_>::default()) - .expect("call to Marine failed"); - let result: String = - marine_rs_sdk_test::internal::serde_json::from_value(result) - .expect("the default deserializer shouldn't fail"); - result - } - pub fn greeting_cp( - &mut self, - name: String, - cp: marine_rs_sdk_test::CallParameters - ) -> String { - use std::ops::DerefMut; - let arguments = marine_rs_sdk_test::internal::serde_json::json!([name]); - let result = self - .marine - .as_ref() - .borrow_mut() - .call_module("greeting", "greeting", arguments, cp) - .expect("call to Marine failed"); - let result: String = - marine_rs_sdk_test::internal::serde_json::from_value(result) - .expect("the default deserializer shouldn't fail"); - result - } - } - } - pub mod call_parameters { - pub use super::greeting::CallParameters; - pub use super::greeting::SecurityTetraplet; - pub struct ModuleInterface { - marine: std::rc::Rc, >, - } - impl ModuleInterface { - pub fn new( - marine: std::rc::Rc< - std::cell::RefCell, - > - ) -> Self { - Self { marine } - } - } - impl ModuleInterface { - pub fn call_parameters(&mut self, ) -> String { - use std::ops::DerefMut; - let arguments = marine_rs_sdk_test::internal::serde_json::json!([]); - let result = self - .marine - .as_ref() - .borrow_mut() - .call_module( - "call_parameters", - "call_parameters", - arguments, - <_>::default() - ) - .expect("call to Marine failed"); - let result: String = - marine_rs_sdk_test::internal::serde_json::from_value(result) - .expect("the default deserializer shouldn't fail"); - result - } - pub fn call_parameters_cp( - &mut self, - cp: marine_rs_sdk_test::CallParameters - ) -> String { - use std::ops::DerefMut; - let arguments = marine_rs_sdk_test::internal::serde_json::json!([]); - let result = self - .marine - .as_ref() - .borrow_mut() - .call_module("call_parameters", "call_parameters", arguments, cp) - .expect("call to Marine failed"); - let result: String = - marine_rs_sdk_test::internal::serde_json::from_value(result) - .expect("the default deserializer shouldn't fail"); - result - } - pub fn return_string(&mut self,) -> String { - use std::ops::DerefMut; - let arguments = marine_rs_sdk_test::internal::serde_json::json!([]); - let result = self - .marine - .as_ref() - .borrow_mut() - .call_module( - "call_parameters", - "return_string", - arguments, - <_>::default() - ) - .expect("call to Marine failed"); - let result: String = - marine_rs_sdk_test::internal::serde_json::from_value(result) - .expect("the default deserializer shouldn't fail"); - result - } - pub fn return_string_cp( - &mut self, - cp: marine_rs_sdk_test::CallParameters - ) -> String { - use std::ops::DerefMut; - let arguments = marine_rs_sdk_test::internal::serde_json::json!([]); - let result = self - .marine - .as_ref() - .borrow_mut() - .call_module("call_parameters", "return_string", arguments, cp) - .expect("call to Marine failed"); - let result: String = - marine_rs_sdk_test::internal::serde_json::from_value(result) - .expect("the default deserializer shouldn't fail"); - result - } - pub fn test_array_refs(&mut self, ) -> Vec { - use std::ops::DerefMut; - let arguments = marine_rs_sdk_test::internal::serde_json::json!([]); - let result = self - .marine - .as_ref() - .borrow_mut() - .call_module( - "call_parameters", - "test_array_refs", - arguments, - <_>::default() - ) - .expect("call to Marine failed"); - let result: Vec = - marine_rs_sdk_test::internal::serde_json::from_value(result) - .expect("the default deserializer shouldn't fail"); - result - } - pub fn test_array_refs_cp( - &mut self, - cp: marine_rs_sdk_test::CallParameters - ) -> Vec { - use std::ops::DerefMut; - let arguments = marine_rs_sdk_test::internal::serde_json::json!([]); - let result = self - .marine - .as_ref() - .borrow_mut() - .call_module("call_parameters", "test_array_refs", arguments, cp) - .expect("call to Marine failed"); - let result: Vec = - marine_rs_sdk_test::internal::serde_json::from_value(result) - .expect("the default deserializer shouldn't fail"); - result - } - } - } - } - let tmp_dir = std::env::temp_dir(); - let service_id = marine_rs_sdk_test::internal::Uuid::new_v4().to_string(); - let tmp_dir = tmp_dir.join(&service_id); - let tmp_dir = tmp_dir.to_string_lossy().to_string(); - std::fs::create_dir(&tmp_dir).expect("can't create a directory for service in tmp"); - let mut module_path = std::path::PathBuf::from(env!("CARGO_MANIFEST_DIR")); - let mut file_path = std::path::Path::new(file!()).components(); - let mut truncated_file_path = Vec::new(); - loop { - if module_path.ends_with(file_path.as_path()) { - break; - } - let (file_path_, remainder) = match file_path.next_back().and_then(|p| match p { - std::path::Component::Normal(_) - | std::path::Component::CurDir - | std::path::Component::ParentDir => Some((file_path, p)), - _ => None, - }) { - Some(t) => t, - None => break, - }; - file_path = file_path_; - truncated_file_path.push(remainder); - } - for path in truncated_file_path.iter().rev() { - module_path.push(path); - } - let _ = module_path.pop(); - let config_path = module_path.join("Config.toml"); - let modules_dir = module_path.join("artifacts"); - let modules_dir = modules_dir - .to_str() - .expect("modules_dir contains invalid UTF8 string"); - let mut __m_generated_marine_config = marine_rs_sdk_test::internal::TomlAppServiceConfig::load( - &config_path - ) - .unwrap_or_else(|e| - panic!( - "app service config located at `{:?}` can't be loaded: {}", - config_path, e - ) - ); - __m_generated_marine_config.service_base_dir = Some(tmp_dir); - __m_generated_marine_config.toml_faas_config.modules_dir = Some(modules_dir.to_string()); - let marine = marine_rs_sdk_test::internal::AppService::new_with_empty_facade( - __m_generated_marine_config, - service_id, - std::collections::HashMap::new() - ) - .unwrap_or_else(|e| panic!("app service can't be created: {}", e)); - let marine = std::rc::Rc::new(std::cell::RefCell::new(marine)); - let mut greeting_m = marine_test_env::greeting::ModuleInterface::new(marine.clone()); - let mut call_parameters_m = - marine_test_env::call_parameters::ModuleInterface::new(marine.clone()); - fn test_func( - greeting_m: marine_test_env::greeting::ModuleInterface, - call_parameters_m: marine_test_env::call_parameters::ModuleInterface - ) { - let mut greeting_m = greeting_m; - let mut call_parameters_m = call_parameters_m; - { - let init_peer_id = "init_peer_id"; - let service_id = "service_id"; - let service_creator_peer_id = "service_creator_peer_id"; - let host_id = "host_id"; - let particle_id = "particle_id"; - let greeting = greeting_m.greeting("asd"); - let mut tetraplet = SecurityTetraplet::default(); - tetraplet.function_name = "some_func_name".to_string(); - tetraplet.json_path = "some_json_path".to_string(); - let tetraplets = vec![vec![tetraplet]]; - let cp = CallParameters { - init_peer_id: init_peer_id.to_string(), - service_id: service_id.to_string(), - service_creator_peer_id: service_creator_peer_id.to_string(), - host_id: host_id.to_string(), - particle_id: particle_id.to_string(), - tetraplets: tetraplets.clone(), - }; - let actual = call_parameters_m.call_parameters_cp(cp); - let expected = format!( - "{}\n{}\n{}\n{}\n{}\n{:?}", - init_peer_id, service_id, service_creator_peer_id, host_id, particle_id, tetraplets - ); - assert_eq!(actual, expected); - } - } - test_func(greeting_m, call_parameters_m, ) -} diff --git a/crates/marine-test-macro-impl/tests/generation_tests/multiple_modules/marine_test.rs b/crates/marine-test-macro-impl/tests/generation_tests/multiple_modules/marine_test.rs deleted file mode 100644 index 07af15e..0000000 --- a/crates/marine-test-macro-impl/tests/generation_tests/multiple_modules/marine_test.rs +++ /dev/null @@ -1,29 +0,0 @@ -fn empty_string(greeting_m: marine_test_env::greeting::ModuleInterface, call_parameters_m: marine_test_env::call_parameters::ModuleInterface) { - let init_peer_id = "init_peer_id"; - let service_id = "service_id"; - let service_creator_peer_id = "service_creator_peer_id"; - let host_id = "host_id"; - let particle_id = "particle_id"; - - let greeting = greeting_m.greeting("asd"); - let mut tetraplet = SecurityTetraplet::default(); - tetraplet.function_name = "some_func_name".to_string(); - tetraplet.json_path = "some_json_path".to_string(); - let tetraplets = vec![vec![tetraplet]]; - - let cp = CallParameters { - init_peer_id: init_peer_id.to_string(), - service_id: service_id.to_string(), - service_creator_peer_id: service_creator_peer_id.to_string(), - host_id: host_id.to_string(), - particle_id: particle_id.to_string(), - tetraplets: tetraplets.clone(), - }; - - let actual = call_parameters_m.call_parameters_cp(cp); - let expected = format!( - "{}\n{}\n{}\n{}\n{}\n{:?}", - init_peer_id, service_id, service_creator_peer_id, host_id, particle_id, tetraplets - ); - assert_eq!(actual, expected); -} diff --git a/crates/marine-test-macro-impl/tests/generation_tests_runner.rs b/crates/marine-test-macro-impl/tests/generation_tests_runner.rs deleted file mode 100644 index 53221ea..0000000 --- a/crates/marine-test-macro-impl/tests/generation_tests_runner.rs +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright 2021 Fluence Labs Limited - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -mod utils; - -use utils::test_marine_test_token_streams; -use utils::TestServiceDescription; -use utils::test_marine_test_token_streams_multiservice; - -#[test] -fn test_empty_func() { - assert!(test_marine_test_token_streams( - "tests/generation_tests/empty_func/marine_test.rs", - "tests/generation_tests/empty_func/expanded.rs", - "Config.toml", - "artifacts" - )); -} - -#[test] -fn test_mounted_binary() { - assert!(test_marine_test_token_streams( - "tests/generation_tests/mounted_binary/marine_test.rs", - "tests/generation_tests/mounted_binary/expanded.rs", - "Config.toml", - "artifacts" - )); -} - -#[test] -fn test_multiple_modules() { - assert!(test_marine_test_token_streams( - "tests/generation_tests/multiple_modules/marine_test.rs", - "tests/generation_tests/multiple_modules/expanded.rs", - "Config.toml", - "artifacts" - )); -} - -#[test] -fn test_multiservice_single() { - let descriptions = vec![TestServiceDescription { - modules_dir: "empty_func/artifacts", - config_path: "empty_func/Config.toml", - name: "empty_func", - }]; - assert!(test_marine_test_token_streams_multiservice( - "tests/generation_tests/multi-service-single/marine_test.rs", - "tests/generation_tests/multi-service-single/expanded.rs", - descriptions - )); -} - -#[test] -fn test_multiservice_multiple() { - let descriptions = vec![ - TestServiceDescription { - modules_dir: "empty_func/artifacts", - config_path: "empty_func/Config.toml", - name: "empty_func", - }, - TestServiceDescription { - modules_dir: "mounted_binary/artifacts", - config_path: "mounted_binary/Config.toml", - name: "mounted_binary", - }, - ]; - assert!(test_marine_test_token_streams_multiservice( - "tests/generation_tests/multi-service-multiple/marine_test.rs", - "tests/generation_tests/multi-service-multiple/expanded.rs", - descriptions - )); -} diff --git a/crates/marine-test-macro-impl/tests/utils.rs b/crates/marine-test-macro-impl/tests/utils.rs deleted file mode 100644 index 1139659..0000000 --- a/crates/marine-test-macro-impl/tests/utils.rs +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright 2021 Fluence Labs Limited - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -use marine_test_macro_impl::marine_test_impl; - -use marine_macro_testing_utils::{items_from_file, stream_from_file, to_syn_item}; - -use std::path::Path; - -pub fn test_marine_test_token_streams( - marine_path: FP, - expanded_path: EP, - config_path: &str, - modules_dir: &str, -) -> bool -where - FP: AsRef, - EP: AsRef, -{ - let marine_item = stream_from_file(&marine_path); - let test_token_stream = quote::quote! { #marine_item }; - let buf = marine_path.as_ref().to_path_buf(); - let attrs = quote::quote! { - config_path = #config_path, - modules_dir = #modules_dir, - }; - let marine_token_streams = marine_test_impl( - attrs, - test_token_stream, - buf.parent().unwrap().to_path_buf(), - ) - .unwrap_or_else(|e| panic!("failed to apply the marine macro due {}", e)); - - let expanded_item = items_from_file(&expanded_path); - let marine_item = to_syn_item(marine_token_streams.clone()); - - marine_item == expanded_item -} - -pub struct TestServiceDescription { - pub config_path: &'static str, - pub modules_dir: &'static str, - pub name: &'static str, -} - -pub fn test_marine_test_token_streams_multiservice( - marine_path: FP, - expanded_path: EP, - services: Vec, -) -> bool -where - FP: AsRef, - EP: AsRef, -{ - let marine_item = stream_from_file(&marine_path); - let test_token_stream = quote::quote! { #marine_item }; - let buf = marine_path.as_ref().to_path_buf(); - let service_declarations = services - .iter() - .map(|desc| { - let config_path = desc.config_path; - let modules_dir = desc.modules_dir; - let name = syn::parse_str::(desc.name)?; - Ok(quote::quote! {#name(config_path = #config_path, modules_dir = #modules_dir)}) - }) - .collect::, syn::Error>>() - .unwrap_or_else(|e| panic!("failed to parse test arguments due to {}", e)); - - let attrs = quote::quote! { - #(#service_declarations,)* - }; - - let marine_token_streams = marine_test_impl( - attrs, - test_token_stream, - buf.parent().unwrap().to_path_buf(), - ) - .unwrap_or_else(|e| panic!("failed to apply the marine macro due {}", e)); - - let expanded_item = items_from_file(&expanded_path); - let marine_item = to_syn_item(marine_token_streams.clone()); - - marine_item == expanded_item -} diff --git a/crates/marine-test-macro/Cargo.toml b/crates/marine-test-macro/Cargo.toml deleted file mode 100644 index 74639a2..0000000 --- a/crates/marine-test-macro/Cargo.toml +++ /dev/null @@ -1,26 +0,0 @@ -[package] -name = "marine-test-macro" -version = "0.3.0" # remember to update html_root_url -edition = "2018" -description = "Definition of the `#[marine_test]` macro" -documentation = "https://docs.rs/fluence/marine-test-macro" -repository = "https://github.com/fluencelabs/marine-rs-sdk/tree/master/crates/marine-test-macro" -authors = ["Fluence Labs"] -keywords = ["fluence", "marine", "sdk", "webassembly", "procedural_macros"] -categories = ["api-bindings", "wasm", "development-tools::testing"] -license = "Apache-2.0" - -[package.metadata.docs.rs] -all-features = true - -[lib] -proc-macro = true -doctest = false - -[dependencies] -marine-test-macro-impl = { path = "../marine-test-macro-impl", version = "=0.3.0" } - -quote = "1.0.9" -proc-macro2 = "1.0.24" -proc-macro-error = { version = "1.0.4", default-features = false } -syn = { version = '1.0.64', features = ['full'] } diff --git a/crates/marine-test-macro/src/lib.rs b/crates/marine-test-macro/src/lib.rs deleted file mode 100644 index 4befd57..0000000 --- a/crates/marine-test-macro/src/lib.rs +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright 2020 Fluence Labs Limited - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#![doc(html_root_url = "https://docs.rs/sdk-test-macro/0.3.0")] -#![deny( - dead_code, - nonstandard_style, - unused_imports, - unused_mut, - unused_variables, - unused_unsafe, - unreachable_patterns -)] -#![feature(proc_macro_span)] -#![warn(rust_2018_idioms)] -#![recursion_limit = "1024"] - -use marine_test_macro_impl::marine_test_impl; -use proc_macro::TokenStream; -use proc_macro_error::proc_macro_error; -use syn::spanned::Spanned; - -/// This macro allows user to write tests for services in the following form: -///```rust -/// #[marine_test(config = "/path/to/Config.toml", modules_dir = "path/to/service/modules")] -/// fn test(greeting: marine_test_env::greeting::ModuleInterface) { -/// let service_result = greeting.greeting("John".to_string()); -/// assert_eq!(&service_result, "Hi, name!"); -/// } -///``` -#[proc_macro_error] -#[proc_macro_attribute] -pub fn marine_test(attrs: TokenStream, input: TokenStream) -> TokenStream { - let attrs: proc_macro2::TokenStream = attrs.into(); - let attrs_span = attrs.span(); - // here it obtains a path to the current file where macro is applied - let mut file_path = proc_macro::Span::call_site().source_file().path(); - let _ = file_path.pop(); - - match marine_test_impl(attrs, input.into(), file_path) { - Ok(stream) => stream.into(), - Err(e) => proc_macro_error::abort!(attrs_span, format!("{}", e)), - } -} - -// deprecated macro for backwards compatibility -#[deprecated(since = "0.6.2", note = "please use the #[marine] macro instead")] -#[proc_macro_error] -#[proc_macro_attribute] -pub fn fce_test(attrs: TokenStream, input: TokenStream) -> TokenStream { - let attrs: proc_macro2::TokenStream = attrs.into(); - let attrs_span = attrs.span(); - // here it obtains a path to the current file where macro is applied - let mut file_path = proc_macro::Span::call_site().source_file().path(); - let _ = file_path.pop(); - - match marine_test_impl(attrs, input.into(), file_path) { - Ok(stream) => stream.into(), - Err(e) => proc_macro_error::abort!(attrs_span, format!("{}", e)), - } -} diff --git a/sdk-test/CHANGELOG.md b/sdk-test/CHANGELOG.md deleted file mode 100644 index 6c436d9..0000000 --- a/sdk-test/CHANGELOG.md +++ /dev/null @@ -1,9 +0,0 @@ -## Version 0.3.0 (2021-10-04) -[PR 61](https://github.com/fluencelabs/marine-rs-sdk/pull/61): - -Implemented the first part of [Issue 57](https://github.com/fluencelabs/marine-rs-sdk/issues/57): `marine_test` now can take several named services in attributes, then define interface to the services in `marine_test_env`. - -## Version 0.2.0 (2021-09-01) -[PR 54](https://github.com/fluencelabs/marine-rs-sdk/pull/54): -- previously test function accessed module interfaces through externally defined variables, now module interfaces are passed as arguments. -- introduced generated module `marine_test_env` which provides interface for generated structs and functions. diff --git a/sdk-test/Cargo.toml b/sdk-test/Cargo.toml deleted file mode 100644 index 2024628..0000000 --- a/sdk-test/Cargo.toml +++ /dev/null @@ -1,29 +0,0 @@ -[package] -name = "marine-rs-sdk-test" -version = "0.3.0" # remember to update html_root_url -description = "Backend SDK that allows testing modules for the Marine runtime" -documentation = "https://docs.rs/marine-rs-sdk-test" -repository = "https://github.com/fluencelabs/marine-rs-sdk/tree/master/fluence-test" -authors = ["Fluence Labs"] -keywords = ["fluence", "marine", "sdk", "webassembly", "test"] -categories = ["api-bindings", "wasm", "development-tools::testing"] -license = "Apache-2.0" -edition = "2018" - -[package.metadata.docs.rs] -all-features = true - -[lib] -path = "src/lib.rs" -doctest = false - -[dev-dependencies] -trybuild = "1.0" - -[dependencies] -marine-test-macro = { path = "../crates/marine-test-macro", version = "=0.3.0" } -fluence-app-service = { version = "0.9.0", features = ["raw-module-api"] } - -serde = { version = "1.0.118", features = ["derive"] } -serde_json = "1.0.64" -uuid = { version = "0.8.2", features = ["v4"] } diff --git a/sdk-test/src/lib.rs b/sdk-test/src/lib.rs deleted file mode 100644 index 1d3b080..0000000 --- a/sdk-test/src/lib.rs +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2020 Fluence Labs Limited - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#![doc(html_root_url = "https://docs.rs/sdk-test/0.3.0")] -#![deny( - dead_code, - nonstandard_style, - unused_imports, - unused_mut, - unused_variables, - unused_unsafe, - unreachable_patterns -)] -#![warn(rust_2018_idioms)] - -pub use marine_test_macro::marine_test; -pub use marine_test_macro::fce_test; - -pub use fluence_app_service::CallParameters; -pub use fluence_app_service::SecurityTetraplet; - -/// These API functions are intended for internal usage in generated code. -/// Normally, you shouldn't use them. -pub mod internal { - pub use fluence_app_service::AppService; - pub use fluence_app_service::TomlAppServiceConfig; - - pub use serde; - pub use serde_json; - - pub use uuid::Uuid; -} diff --git a/sdk/Cargo.toml b/sdk/Cargo.toml deleted file mode 100644 index ee3a5cd..0000000 --- a/sdk/Cargo.toml +++ /dev/null @@ -1,35 +0,0 @@ -[package] -name = "marine-rs-sdk" -version = "0.6.14" # remember to update html_root_url -description = "Fluence backend SDK for developing backend applications for the Fluence network" -documentation = "https://docs.rs/fluence" -repository = "https://github.com/fluencelabs/marine-rs-sdk" -authors = ["Fluence Labs"] -keywords = ["fluence", "marine", "sdk", "webassembly"] -categories = ["api-bindings", "wasm"] -license = "Apache-2.0" -edition = "2018" - -[package.metadata.docs.rs] -all-features = true - -[lib] -path = "src/lib.rs" -doctest = false - -[dependencies] -marine-macro = { path = "../crates/marine-macro", version = "=0.6.14" } -marine-rs-sdk-main = { path = "../crates/main", version = "=0.6.14" } -marine-timestamp-macro = { path = "../crates/timestamp-macro", version = "=0.6.14" } - -serde = { version = "1.0.118", features = ["derive"]} - -[dev-dependencies] -trybuild = "1.0" - -[features] -# Print some internal logs by log_utf8_string -debug = ["marine-rs-sdk-main/debug"] - -# Enable logger (this will cause log_utf8_string to appear in imports) -logger = ["marine-rs-sdk-main/logger"] diff --git a/sdk/src/call_parameters.rs b/src/call_parameters.rs similarity index 100% rename from sdk/src/call_parameters.rs rename to src/call_parameters.rs diff --git a/sdk/src/lib.rs b/src/lib.rs similarity index 100% rename from sdk/src/lib.rs rename to src/lib.rs diff --git a/sdk/src/mounted_binary.rs b/src/mounted_binary.rs similarity index 100% rename from sdk/src/mounted_binary.rs rename to src/mounted_binary.rs diff --git a/sdk/tests/compilation_tests/export_functions/array_inner_refs.rs b/tests/compilation_tests/export_functions/array_inner_refs.rs similarity index 100% rename from sdk/tests/compilation_tests/export_functions/array_inner_refs.rs rename to tests/compilation_tests/export_functions/array_inner_refs.rs diff --git a/sdk/tests/compilation_tests/export_functions/array_inner_refs.stderr b/tests/compilation_tests/export_functions/array_inner_refs.stderr similarity index 100% rename from sdk/tests/compilation_tests/export_functions/array_inner_refs.stderr rename to tests/compilation_tests/export_functions/array_inner_refs.stderr diff --git a/sdk/tests/compilation_tests/export_functions/arrays.rs b/tests/compilation_tests/export_functions/arrays.rs similarity index 100% rename from sdk/tests/compilation_tests/export_functions/arrays.rs rename to tests/compilation_tests/export_functions/arrays.rs diff --git a/sdk/tests/compilation_tests/export_functions/basic_types.rs b/tests/compilation_tests/export_functions/basic_types.rs similarity index 100% rename from sdk/tests/compilation_tests/export_functions/basic_types.rs rename to tests/compilation_tests/export_functions/basic_types.rs diff --git a/sdk/tests/compilation_tests/export_functions/improper_types.rs b/tests/compilation_tests/export_functions/improper_types.rs similarity index 100% rename from sdk/tests/compilation_tests/export_functions/improper_types.rs rename to tests/compilation_tests/export_functions/improper_types.rs diff --git a/sdk/tests/compilation_tests/export_functions/improper_types.stderr b/tests/compilation_tests/export_functions/improper_types.stderr similarity index 100% rename from sdk/tests/compilation_tests/export_functions/improper_types.stderr rename to tests/compilation_tests/export_functions/improper_types.stderr diff --git a/sdk/tests/compilation_tests/export_functions/inner_vec_refs.rs b/tests/compilation_tests/export_functions/inner_vec_refs.rs similarity index 100% rename from sdk/tests/compilation_tests/export_functions/inner_vec_refs.rs rename to tests/compilation_tests/export_functions/inner_vec_refs.rs diff --git a/sdk/tests/compilation_tests/export_functions/inner_vec_refs.stderr b/tests/compilation_tests/export_functions/inner_vec_refs.stderr similarity index 100% rename from sdk/tests/compilation_tests/export_functions/inner_vec_refs.stderr rename to tests/compilation_tests/export_functions/inner_vec_refs.stderr diff --git a/sdk/tests/compilation_tests/export_functions/ref_arrays.rs b/tests/compilation_tests/export_functions/ref_arrays.rs similarity index 100% rename from sdk/tests/compilation_tests/export_functions/ref_arrays.rs rename to tests/compilation_tests/export_functions/ref_arrays.rs diff --git a/sdk/tests/compilation_tests/export_functions/ref_basic_types.rs b/tests/compilation_tests/export_functions/ref_basic_types.rs similarity index 100% rename from sdk/tests/compilation_tests/export_functions/ref_basic_types.rs rename to tests/compilation_tests/export_functions/ref_basic_types.rs diff --git a/sdk/tests/compilation_tests/import_functions/arrays.rs b/tests/compilation_tests/import_functions/arrays.rs similarity index 100% rename from sdk/tests/compilation_tests/import_functions/arrays.rs rename to tests/compilation_tests/import_functions/arrays.rs diff --git a/sdk/tests/compilation_tests/import_functions/arrays_out_inner_refs.rs b/tests/compilation_tests/import_functions/arrays_out_inner_refs.rs similarity index 100% rename from sdk/tests/compilation_tests/import_functions/arrays_out_inner_refs.rs rename to tests/compilation_tests/import_functions/arrays_out_inner_refs.rs diff --git a/sdk/tests/compilation_tests/import_functions/arrays_out_inner_refs.stderr b/tests/compilation_tests/import_functions/arrays_out_inner_refs.stderr similarity index 100% rename from sdk/tests/compilation_tests/import_functions/arrays_out_inner_refs.stderr rename to tests/compilation_tests/import_functions/arrays_out_inner_refs.stderr diff --git a/sdk/tests/compilation_tests/import_functions/basic_ref_types.rs b/tests/compilation_tests/import_functions/basic_ref_types.rs similarity index 100% rename from sdk/tests/compilation_tests/import_functions/basic_ref_types.rs rename to tests/compilation_tests/import_functions/basic_ref_types.rs diff --git a/sdk/tests/compilation_tests/import_functions/basic_types.rs b/tests/compilation_tests/import_functions/basic_types.rs similarity index 100% rename from sdk/tests/compilation_tests/import_functions/basic_types.rs rename to tests/compilation_tests/import_functions/basic_types.rs diff --git a/sdk/tests/compilation_tests/import_functions/improper_types.rs b/tests/compilation_tests/import_functions/improper_types.rs similarity index 100% rename from sdk/tests/compilation_tests/import_functions/improper_types.rs rename to tests/compilation_tests/import_functions/improper_types.rs diff --git a/sdk/tests/compilation_tests/import_functions/improper_types.stderr b/tests/compilation_tests/import_functions/improper_types.stderr similarity index 100% rename from sdk/tests/compilation_tests/import_functions/improper_types.stderr rename to tests/compilation_tests/import_functions/improper_types.stderr diff --git a/sdk/tests/compilation_tests/import_functions/ref_arrays.rs b/tests/compilation_tests/import_functions/ref_arrays.rs similarity index 100% rename from sdk/tests/compilation_tests/import_functions/ref_arrays.rs rename to tests/compilation_tests/import_functions/ref_arrays.rs diff --git a/sdk/tests/compilation_tests/import_functions/ref_basic_types.rs b/tests/compilation_tests/import_functions/ref_basic_types.rs similarity index 100% rename from sdk/tests/compilation_tests/import_functions/ref_basic_types.rs rename to tests/compilation_tests/import_functions/ref_basic_types.rs diff --git a/sdk/tests/compilation_tests/records/basic_structs.rs b/tests/compilation_tests/records/basic_structs.rs similarity index 100% rename from sdk/tests/compilation_tests/records/basic_structs.rs rename to tests/compilation_tests/records/basic_structs.rs diff --git a/sdk/tests/compilation_tests/records/empty_struct.rs b/tests/compilation_tests/records/empty_struct.rs similarity index 100% rename from sdk/tests/compilation_tests/records/empty_struct.rs rename to tests/compilation_tests/records/empty_struct.rs diff --git a/sdk/tests/compilation_tests/records/struct_with_improper_types.rs b/tests/compilation_tests/records/struct_with_improper_types.rs similarity index 100% rename from sdk/tests/compilation_tests/records/struct_with_improper_types.rs rename to tests/compilation_tests/records/struct_with_improper_types.rs diff --git a/sdk/tests/compilation_tests/records/struct_with_improper_types.stderr b/tests/compilation_tests/records/struct_with_improper_types.stderr similarity index 100% rename from sdk/tests/compilation_tests/records/struct_with_improper_types.stderr rename to tests/compilation_tests/records/struct_with_improper_types.stderr diff --git a/sdk/tests/compilation_tests/records/struct_with_private_fields.rs b/tests/compilation_tests/records/struct_with_private_fields.rs similarity index 100% rename from sdk/tests/compilation_tests/records/struct_with_private_fields.rs rename to tests/compilation_tests/records/struct_with_private_fields.rs diff --git a/sdk/tests/compilation_tests/records/unnamed_structs.rs b/tests/compilation_tests/records/unnamed_structs.rs similarity index 100% rename from sdk/tests/compilation_tests/records/unnamed_structs.rs rename to tests/compilation_tests/records/unnamed_structs.rs diff --git a/sdk/tests/compilation_tests/records/unnamed_structs.stderr b/tests/compilation_tests/records/unnamed_structs.stderr similarity index 100% rename from sdk/tests/compilation_tests/records/unnamed_structs.stderr rename to tests/compilation_tests/records/unnamed_structs.stderr diff --git a/sdk/tests/compilation_tests_runner.rs b/tests/compilation_tests_runner.rs similarity index 100% rename from sdk/tests/compilation_tests_runner.rs rename to tests/compilation_tests_runner.rs