From fe16bb3694fc96675bdd73a409370b3214f75525 Mon Sep 17 00:00:00 2001 From: Marcela Melara Date: Thu, 2 Apr 2020 16:19:21 -0700 Subject: [PATCH] Add wawaka memory stress test Signed-off-by: Marcela Melara --- .travis.yml | 3 +- build/tests/wawaka/memory-test.json | 236 ++++++++++++++++++ .../memory-test/fast-interp-memory-test.json | 59 +++++ .../memory-test/interp-stack-corruption.json | 10 + contracts/wawaka/memory-test/memory-test.cpp | 27 +- contracts/wawaka/memory-test/test-short.json | 4 +- docker/Dockerfile.pdo-build | 4 + docker/sawtooth-pdo.yaml | 1 + 8 files changed, 341 insertions(+), 3 deletions(-) create mode 100644 build/tests/wawaka/memory-test.json create mode 100644 contracts/wawaka/memory-test/fast-interp-memory-test.json create mode 100644 contracts/wawaka/memory-test/interp-stack-corruption.json diff --git a/.travis.yml b/.travis.yml index 2fb31bcd..eca2e6b4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -27,4 +27,5 @@ script: # - gipsy/scheme - PDO_INTERPRETER=gipsy make -C docker test # - wawaka/wasm - - PDO_INTERPRETER=wawaka make -C docker test # replace with test once integration tests also work with wawaka + - PDO_INTERPRETER=wawaka WASM_MODE=INTERP make -C docker test + - PDO_INTERPRETER=wawaka WASM_MODE=INTERP_OPT make -C docker test diff --git a/build/tests/wawaka/memory-test.json b/build/tests/wawaka/memory-test.json new file mode 100644 index 00000000..d68a740e --- /dev/null +++ b/build/tests/wawaka/memory-test.json @@ -0,0 +1,236 @@ +[ + { + "description" : "deep recursion test {KeywordParameters}", + "MethodName": "deep_recursion_test", + "KeywordParameters": { + "levels" : 1000 + }, + "expected":"1000" + }, + { + "description" : "deep recursion test {KeywordParameters}", + "MethodName": "deep_recursion_test", + "KeywordParameters": { + "levels" : 10000 + }, + "expected":"10000" + }, + { + "description" : "deep recursion test {KeywordParameters}", + "MethodName": "deep_recursion_test", + "KeywordParameters": { + "levels" : 15000 + }, + "expected":"15000" + }, + { + "description" : "deep recursion test {KeywordParameters}", + "MethodName": "deep_recursion_test", + "KeywordParameters": { + "levels" : 20000 + }, + "expected":"20000" + }, + { + "description" : "deep recursion test {KeywordParameters}", + "MethodName": "deep_recursion_test", + "KeywordParameters": { + "levels" : 50000 + }, + "expected":"50000" + }, + { + "description" : "deep recursion test {KeywordParameters}", + "MethodName": "deep_recursion_test", + "KeywordParameters": { + "levels" : 100000 + }, + "expected":"100000" + }, + { + "description" : "deep recursion test 2^31 levels", + "MethodName": "deep_recursion_test", + "KeywordParameters": { "levels" : 2147483647 }, + "expected":"2147483647" + }, + { + "description" : "deep recursion test 2^32 levels should {invert}", + "MethodName": "deep_recursion_test", + "KeywordParameters": { "levels" : 2147483648 }, + "invert": "fail", + "expected": "method evaluation failed" + }, + { + "description" : "deep recursion test 10G levels should {invert}", + "MethodName": "deep_recursion_test", + "KeywordParameters": { "levels" : 10000000000 }, + "invert": "fail", + "expected": "method evaluation failed" + }, + { + "description" : "deep recursion test {KeywordParameters}", + "MethodName": "deep_recursion_test", + "KeywordParameters": { + "levels" : 1000 + }, + "expected":"1000" + }, + { + "description" : "big value test {KeywordParameters}", + "MethodName": "big_value_test", + "KeywordParameters": { + "num_chars" : 2000 + }, + "expected": "2000" + }, + { + "description" : "big value test {KeywordParameters}", + "MethodName": "big_value_test", + "KeywordParameters": { + "num_chars" : 4000 + }, + "expected": "4000" + }, + { + "description" : "big value test {KeywordParameters}", + "MethodName": "big_value_test", + "KeywordParameters": { + "num_chars" : 8000 + }, + "expected": "8000" + }, + { + "description" : "big value test {KeywordParameters}", + "MethodName": "big_value_test", + "KeywordParameters": { + "num_chars" : 16000 + }, + "expected": "16000" + }, + { + "description" : "big value test 64 KB should {invert} with \"out of memory\" exception", + "MethodName": "big_value_test", + "KeywordParameters": { + "num_chars" : 64000 + }, + "invert": "fail", + "expected": "internal pdo error" + }, + { + "description" : "deep recursion test {KeywordParameters}", + "MethodName": "deep_recursion_test", + "KeywordParameters": { + "levels" : 1000 + }, + "expected":"1000" + }, + { + "description" : "big key test {KeywordParameters}", + "MethodName": "big_key_test", + "KeywordParameters": { + "num_chars" : 2000 + }, + "expected": "2000" + }, + { + "description" : "big key test {KeywordParameters}", + "MethodName": "big_key_test", + "KeywordParameters": { + "num_chars" : 4000 + }, + "expected": "4000" + }, + { + "description" : "big key test 32 KB should {invert} with \"out of memory\" exception", + "MethodName": "big_key_test", + "KeywordParameters": { + "num_chars" : 32000 + }, + "invert": "fail", + "expected": "internal pdo error" + }, + { + "description" : "big key test 64 KB should {invert} with \"out of memory\" exception", + "MethodName": "big_key_test", + "KeywordParameters": { + "num_chars" : 64000 + }, + "invert": "fail", + "expected": "internal pdo error" + }, + { + "description" : "deep recursion test {KeywordParameters}", + "MethodName": "deep_recursion_test", + "KeywordParameters": { + "levels" : 1000 + }, + "expected":"1000" + }, + { + "description" : "many keys test 1K", + "MethodName": "many_keys_test", + "KeywordParameters": { + "num_keys" : 1000 + }, + "expected": "1000" + }, + { + "description" : "many keys test 2K", + "MethodName": "many_keys_test", + "KeywordParameters": { + "num_keys" : 2000 + }, + "expected": "2000" + }, + { + "description" : "many keys test 4K", + "MethodName": "many_keys_test", + "KeywordParameters": { + "num_keys" : 4000 + }, + "expected": "4000" + }, + { + "description" : "deep recursion test {KeywordParameters}", + "MethodName": "deep_recursion_test", + "KeywordParameters": { + "levels" : 1000 + }, + "expected":"1000" + }, + { + "description" : "many KV pairs test 100 * 100", + "MethodName": "many_kv_pairs_test", + "KeywordParameters": { + "num_keys" : 100, + "num_chars" : 100 + }, + "expected": "10000" + }, + { + "description" : "many KV pairs test 64 * 1K", + "MethodName": "many_kv_pairs_test", + "KeywordParameters": { + "num_keys" : 64, + "num_chars" : 1000 + }, + "expected": "64000" + }, + { + "description" : "many KV pairs test 100 * 1K", + "MethodName": "many_kv_pairs_test", + "KeywordParameters": { + "num_keys" : 100, + "num_chars" : 1000 + }, + "expected": "100000" + }, + { + "description" : "deep recursion test {KeywordParameters}", + "MethodName": "deep_recursion_test", + "KeywordParameters": { + "levels" : 1000 + }, + "expected":"1000" + } +] diff --git a/contracts/wawaka/memory-test/fast-interp-memory-test.json b/contracts/wawaka/memory-test/fast-interp-memory-test.json new file mode 100644 index 00000000..61c01cc6 --- /dev/null +++ b/contracts/wawaka/memory-test/fast-interp-memory-test.json @@ -0,0 +1,59 @@ +[ + { + "description" : "big key test 8 KB", + "MethodName": "big_key_test", + "KeywordParameters": { + "num_chars" : 8000 + }, + "expected": "8000" + }, + { + "description" : "big key test 16 KB", + "MethodName": "big_key_test", + "KeywordParameters": { + "num_chars" : 16000 + }, + "expected": "16000" + }, + { + "description" : "many keys test 8K", + "MethodName": "many_keys_test", + "KeywordParameters": { + "num_keys" : 8000 + }, + "expected": "8000" + }, + { + "description" : "many keys test 16K", + "MethodName": "many_keys_test", + "KeywordParameters": { + "num_keys" : 16000 + }, + "expected": "16000" + }, + { + "description" : "many keys test 32K", + "MethodName": "many_keys_test", + "KeywordParameters": { + "num_keys" : 32000 + }, + "expected": "32000" + }, + { + "description" : "many keys test 64K", + "MethodName": "many_keys_test", + "KeywordParameters": { + "num_keys" : 64000 + }, + "expected": "64000" + }, + { + "description" : "many KV pairs test 1K * 1K", + "MethodName": "many_kv_pairs_test", + "KeywordParameters": { + "num_keys" : 1000, + "num_chars" : 1000 + }, + "expected": "1000000" + } +] diff --git a/contracts/wawaka/memory-test/interp-stack-corruption.json b/contracts/wawaka/memory-test/interp-stack-corruption.json new file mode 100644 index 00000000..cf2e3746 --- /dev/null +++ b/contracts/wawaka/memory-test/interp-stack-corruption.json @@ -0,0 +1,10 @@ +[ + { + "description" : "FIXME: big value test 32 KB causes stack corruption in INTERP mode", + "MethodName": "big_value_test", + "KeywordParameters": { + "num_chars" : 32000 + }, + "expected": "32000" + } +] diff --git a/contracts/wawaka/memory-test/memory-test.cpp b/contracts/wawaka/memory-test/memory-test.cpp index 8edd9595..4f01c053 100644 --- a/contracts/wawaka/memory-test/memory-test.cpp +++ b/contracts/wawaka/memory-test/memory-test.cpp @@ -104,6 +104,31 @@ bool big_value_test(const Message& msg, const Environment& env, Response& rsp) return rsp.value(v, true); } +// ----------------------------------------------------------------- +// NAME: many_kv_pair_test +// ----------------------------------------------------------------- +bool many_kv_pairs_test(const Message& msg, const Environment& env, Response& rsp) +{ + int num_chars((int)msg.get_number("num_chars")); + int num_keys((int)msg.get_number("num_keys")); + + int i = 0; + StringArray value(num_chars); + for (i = 0; i < num_chars; i++) { + value.set((char)*default_val.value_, i); + } + + for (i = 0; i < num_keys; i++) { + StringArray key(12); + sprintf((char *)key.value_, "%d", i); + if (!meta_store.set(key, value)) + return rsp.error("failed to store value"); + } + + ww::value::Number v((double)(i*value.size())); + return rsp.value(v, true); +} + static int simple_recursive_function(int n) { if (n > 0) { return simple_recursive_function(n-1) + 1; @@ -111,7 +136,6 @@ static int simple_recursive_function(int n) { return 0; } - bool deep_recursion_test(const Message& msg, const Environment& env, Response& rsp) { int levels((int)msg.get_number("levels")); @@ -129,6 +153,7 @@ contract_method_reference_t contract_method_dispatch_table[] = { CONTRACT_METHOD(many_keys_test), CONTRACT_METHOD(big_key_test), CONTRACT_METHOD(big_value_test), + CONTRACT_METHOD(many_kv_pairs_test), CONTRACT_METHOD(deep_recursion_test), { NULL, NULL } }; diff --git a/contracts/wawaka/memory-test/test-short.json b/contracts/wawaka/memory-test/test-short.json index 1696eb72..7e091c76 100644 --- a/contracts/wawaka/memory-test/test-short.json +++ b/contracts/wawaka/memory-test/test-short.json @@ -6,5 +6,7 @@ { "MethodName" : "big_value_test", "KeywordParameters": { "num_chars" : 5 }, "expected": "5" }, { "MethodName" : "big_value_test", "KeywordParameters": { "num_chars" : 500 }, "expected": "500" }, { "MethodName" : "deep_recursion_test", "KeywordParameters": { "levels" : 5 }, "expected": "5" }, - { "MethodName" : "deep_recursion_test", "KeywordParameters": { "levels" : 500 }, "expected": "500" } + { "MethodName" : "deep_recursion_test", "KeywordParameters": { "levels" : 500 }, "expected": "500" }, + { "MethodName" : "many_kv_pairs_test", "KeywordParameters": { "num_keys" : 5, "num_chars" : 100 }, "expected": "500" }, + { "MethodName" : "many_kv_pairs_test", "KeywordParameters": { "num_keys" : 500, "num_chars" : 100 }, "expected": "50000" } ] diff --git a/docker/Dockerfile.pdo-build b/docker/Dockerfile.pdo-build index a01a3b07..697a2a7d 100644 --- a/docker/Dockerfile.pdo-build +++ b/docker/Dockerfile.pdo-build @@ -25,6 +25,7 @@ # - pdo repo branch to use: PDO_REPO_BRANCH (default: master) # - build in debug mode: PDO_DEBUG_BUILD (default: 0) # - contract interpreter (gipsy or wawaka): PDO_INTERPRETER (default: gipsy) +# - Wawaka runtime mode: WASM_MODE (default: INTERP) # - wamr version: WAMR (default: WAMR-03-30-2020) # Build: @@ -102,6 +103,9 @@ ENV PDO_DEBUG_BUILD=${PDO_DEBUG_BUILD} ARG PDO_INTERPRETER=gipsy ENV PDO_INTERPRETER=${PDO_INTERPRETER} +ARG WASM_MODE=INTERP +ENV WASM_MODE=${WASM_MODE} + # - web-assembly/wasm/wawaka # - Configure WAMR source ARG WAMR=WAMR-03-30-2020 diff --git a/docker/sawtooth-pdo.yaml b/docker/sawtooth-pdo.yaml index b0904c08..294a1f4c 100644 --- a/docker/sawtooth-pdo.yaml +++ b/docker/sawtooth-pdo.yaml @@ -55,6 +55,7 @@ services: PDO_REPO_BRANCH: ${PDO_REPO_BRANCH:-master} SGX_MODE: SIM PDO_INTERPRETER: ${PDO_INTERPRETER:-gipsy} + WASM_MODE: ${WASM_MODE:-INTERP} container_name: sawtooth-pdo-sim-build hostname: sawtooth-pdo-build depends_on: