trace test cases

This commit is contained in:
Richard Holland
2023-01-10 16:04:10 +00:00
parent e299f099d8
commit 98d8efdb6a
3 changed files with 133 additions and 62 deletions

View File

@@ -177,31 +177,6 @@
return bytes_written;\
}
#define RETURN_HOOK_TRACE(read_ptr, read_len, t)\
{\
if (j.trace())\
{\
int rl = read_len;\
if (rl > 1024)\
rl = 1024;\
if (NOT_IN_BOUNDS(read_ptr, read_len, memory_length))\
return OUT_OF_BOUNDS;\
std::string out;\
out.reserve(rl);\
if (!(read_ptr == 0 && read_len == 0))\
{\
out = std::string((const char*)(memory + read_ptr), (size_t)rl);\
/* replace all nul chars with spaces */\
for (char* ptr = out.data(); ptr < out.data() + out.size(); ++ptr)\
if (*ptr == '\0') *ptr = ' ';\
}\
j.trace()\
<< "HookTrace[" << HC_ACC() << "]: "\
<< out << (out.empty() ? "" : " ")\
<< t;\
}\
return 0;\
}
// ptr = pointer inside the wasm memory space
#define NOT_IN_BOUNDS(ptr, len, memory_length)\
((static_cast<uint64_t>(ptr) > static_cast<uint64_t>(memory_length)) || \

View File

@@ -1052,8 +1052,26 @@ DEFINE_HOOK_FUNCTION(
HOOK_SETUP(); // populates memory_ctx, memory, memory_length, applyCtx on current stack
if (NOT_IN_BOUNDS(read_ptr, read_len, memory_length))
return OUT_OF_BOUNDS;
if (!j.trace())
return 0;
RETURN_HOOK_TRACE(read_ptr, read_len, number);
if (read_len > 128)
read_len = 128;
if (read_len > 0)
{
j.trace()
<< "HookTrace[" << HC_ACC() << "]: "
<< std::string_view((const char*)memory + read_ptr, read_len)
<< " " << number;
return 0;
}
j.trace()
<< "HookTrace[" << HC_ACC() << "]: "
<< number;
return 0;
}
@@ -1120,8 +1138,14 @@ DEFINE_HOOK_FUNCTION(
}
}
RETURN_HOOK_TRACE(mread_ptr, mread_len,
std::string((const char*)output_storage, out_len));
if (out_len > 0)
{
j.trace()
<< "HookTrace[" << HC_ACC() << "]: "
<< std::string_view((const char*)output_storage, out_len);
}
return 0;
}
@@ -1311,7 +1335,6 @@ DEFINE_HOOK_FUNCTION(
// update or create a hook state object
// read_ptr = data to set, kread_ptr = key
// RH NOTE passing 0 size causes a delete operation which is as-intended
// RH TODO: check reserve
/*
uint32_t write_ptr, uint32_t write_len,
uint32_t kread_ptr, uint32_t kread_len, // key
@@ -4133,22 +4156,41 @@ DEFINE_HOOK_FUNCTION(
int64_t float1)
{
HOOK_SETUP(); // populates memory_ctx, memory, memory_length, applyCtx on current stack
if (!j.trace())
return 0;
if (NOT_IN_BOUNDS(read_ptr, read_len, memory_length))
return OUT_OF_BOUNDS;
if (float1 == 0)
RETURN_HOOK_TRACE(read_ptr, read_len, "Float 0*10^(0) <ZERO>");
if (!j.trace())
return 0;
if (read_len > 128)
read_len = 128;
if (float1 == 0)
{
j.trace()
<< "HookTrace[" << HC_ACC() << "]:"
<< (read_len == 0 ? "" : std::string_view((const char*)memory + read_ptr, read_len))
<< " Float 0*10^(0) <ZERO>";
return 0;
}
uint64_t man = get_mantissa(float1);
int32_t exp = get_exponent(float1);
bool neg = is_negative(float1);
if (man < minMantissa || man > maxMantissa || exp < minExponent || exp > maxExponent)
RETURN_HOOK_TRACE(read_ptr, read_len, "Float <INVALID>");
{
j.trace()
<< "HookTrace[" << HC_ACC() << "]:"
<< (read_len == 0 ? "" : std::string_view((const char*)memory + read_ptr, read_len))
<< " Float <INVALID>";
return 0;
}
RETURN_HOOK_TRACE(read_ptr, read_len, "Float " << (neg ? "-" : "") << man << "*10^(" << exp << ")");
j.trace()
<< "HookTrace[" << HC_ACC() << "]:"
<< (read_len == 0 ? "" : std::string_view((const char*)memory + read_ptr, read_len))
<< " Float " << (neg ? "-" : "") << man << "*10^(" << exp << ")";
return 0;
}
DEFINE_HOOK_FUNCTION(

View File

@@ -9053,28 +9053,6 @@ public:
env(pay(bob, alice, XRP(1)), M("test sto_validate"), fee(XRP(1)));
}
/*
void
test_str_compare()
{
}
void
test_str_concat()
{
}
void
test_str_find()
{
}
void
test_str_replace()
{
}
*/
void
test_trace()
{
@@ -9129,13 +9107,89 @@ public:
void
test_trace_float()
{
// TODO
testcase("Test trace_float");
using namespace jtx;
Env env{*this, supported_amendments()};
auto const alice = Account{"alice"};
auto const bob = Account{"bob"};
env.fund(XRP(10000), alice);
env.fund(XRP(10000), bob);
TestHook hook = wasm[R"[test.hook](
#include <stdint.h>
extern int32_t _g (uint32_t id, uint32_t maxiter);
#define GUARD(maxiter) _g((1ULL << 31U) + __LINE__, (maxiter)+1)
extern int64_t accept (uint32_t read_ptr, uint32_t read_len, int64_t error_code);
extern int64_t rollback (uint32_t read_ptr, uint32_t read_len, int64_t error_code);
extern int64_t trace_float (uint32_t, uint32_t, int64_t);
#define OUT_OF_BOUNDS -1
#define ASSERT(x)\
if (!(x))\
rollback((uint32_t)#x, sizeof(#x), __LINE__);
int64_t hook(uint32_t reservmaed )
{
_g(1,1);
// Test out of bounds check
ASSERT(trace_float(1000000, 10, 0) == OUT_OF_BOUNDS);
ASSERT(trace_float(0, 1000000, 0) == OUT_OF_BOUNDS);
return accept(0,0,0);
}
)[test.hook]"];
// install the hook on alice
env(ripple::test::jtx::hook(alice, {{hso(hook, overrideFlag)}}, 0),
M("set trace_float"),
HSFEE);
env.close();
// invoke the hook
env(pay(bob, alice, XRP(1)), M("test trace_float"), fee(XRP(1)));
}
void
test_trace_num()
{
// TODO
testcase("Test trace_num");
using namespace jtx;
Env env{*this, supported_amendments()};
auto const alice = Account{"alice"};
auto const bob = Account{"bob"};
env.fund(XRP(10000), alice);
env.fund(XRP(10000), bob);
TestHook hook = wasm[R"[test.hook](
#include <stdint.h>
extern int32_t _g (uint32_t id, uint32_t maxiter);
#define GUARD(maxiter) _g((1ULL << 31U) + __LINE__, (maxiter)+1)
extern int64_t accept (uint32_t read_ptr, uint32_t read_len, int64_t error_code);
extern int64_t rollback (uint32_t read_ptr, uint32_t read_len, int64_t error_code);
extern int64_t trace_num (uint32_t, uint32_t, int64_t);
#define OUT_OF_BOUNDS -1
#define ASSERT(x)\
if (!(x))\
rollback((uint32_t)#x, sizeof(#x), __LINE__);
int64_t hook(uint32_t r )
{
_g(1,1);
// Test out of bounds check
ASSERT(trace_num(1000000, 10, 0) == OUT_OF_BOUNDS);
ASSERT(trace_num(0, 1000000, 0) == OUT_OF_BOUNDS);
return accept(0,0,0);
}
)[test.hook]"];
// install the hook on alice
env(ripple::test::jtx::hook(alice, {{hso(hook, overrideFlag)}}, 0),
M("set trace_num"),
HSFEE);
env.close();
// invoke the hook
env(pay(bob, alice, XRP(1)), M("test trace_num"), fee(XRP(1)));
}
void
@@ -11020,8 +11074,8 @@ public:
test_sto_validate(); //
test_trace(); //
test_trace_float();
test_trace_num();
test_trace_float(); //
test_trace_num(); //
test_util_accid(); //
test_util_keylet(); //