From 088e811da49a6e5d3222adf78d0df0a5d6a89c22 Mon Sep 17 00:00:00 2001 From: James Rouzier Date: Wed, 25 Oct 2017 20:56:12 -0400 Subject: [PATCH] Add test case for txn try --- test/cases.cc | 1 + test/config.h | 2 +- test/test.cc | 5 +++++ test/test.h | 11 +++++++++++ test/try.cc | 38 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 test/try.cc diff --git a/test/cases.cc b/test/cases.cc index 1311f12e..a1953f53 100644 --- a/test/cases.cc +++ b/test/cases.cc @@ -67,6 +67,7 @@ void testcase_setup(const char *casename, actor_params ¶ms, configure_actor(last_space_id, ac_hill, nullptr, params); configure_actor(last_space_id, ac_jitter, nullptr, params); configure_actor(last_space_id, ac_hill, nullptr, params); + configure_actor(last_space_id, ac_try, nullptr, params); log_notice("<<< testcase_setup(%s): done", casename); } else { failure("unknown testcase `%s`", casename); diff --git a/test/config.h b/test/config.h index 483fe9b5..aecfcd3e 100644 --- a/test/config.h +++ b/test/config.h @@ -20,7 +20,7 @@ #define ACTOR_ID_MAX INT16_MAX -enum actor_testcase { ac_none, ac_hill, ac_deadread, ac_deadwrite, ac_jitter }; +enum actor_testcase { ac_none, ac_hill, ac_deadread, ac_deadwrite, ac_jitter, ac_try }; enum actor_status { as_unknown, diff --git a/test/test.cc b/test/test.cc index 52cec87d..6bb17735 100644 --- a/test/test.cc +++ b/test/test.cc @@ -29,6 +29,8 @@ const char *testcase2str(const actor_testcase testcase) { return "deadwrite"; case ac_jitter: return "jitter"; + case ac_try: + return "try"; } } @@ -443,6 +445,9 @@ bool test_execute(const actor_config &config) { case ac_jitter: test.reset(new testcase_jitter(config, pid)); break; + case ac_try: + test.reset(new testcase_try(config, pid)); + break; default: test.reset(new testcase(config, pid)); break; diff --git a/test/test.h b/test/test.h index 44f7d4bd..500caef0 100644 --- a/test/test.h +++ b/test/test.h @@ -190,3 +190,14 @@ public: bool run(); bool teardown(); }; + +class testcase_try : public testcase { + typedef testcase inherited; + +public: + testcase_try(const actor_config &config, const mdbx_pid_t pid) + : testcase(config, pid) {} + bool setup(); + bool run(); + bool teardown(); +}; diff --git a/test/try.cc b/test/try.cc new file mode 100644 index 00000000..4071c24c --- /dev/null +++ b/test/try.cc @@ -0,0 +1,38 @@ +#include "test.h" + +bool testcase_try::setup() { + log_trace(">> setup"); + if (!inherited::setup()) + return false; + + log_trace("<< setup"); + return true; +} + +bool testcase_try::run() { + db_open(); + assert(!txn_guard); + + MDBX_txn *txn = nullptr; + MDBX_txn *txn2 = nullptr; + int rc = + mdbx_txn_begin(db_guard.get(), nullptr, 0, &txn); + if (unlikely(rc != MDBX_SUCCESS)) + failure_perror("mdbx_txn_begin(MDBX_TRYTXN)", rc); + else { + rc = mdbx_txn_begin(db_guard.get(), nullptr, MDBX_TRYTXN, &txn2); + if (unlikely(rc != MDBX_BUSY)) + failure_perror("mdbx_txn_begin(MDBX_TRYTXN)", rc); + } + + txn_guard.reset(txn); + return true; +} + +bool testcase_try::teardown() { + log_trace(">> teardown"); + cursor_guard.release(); + txn_guard.release(); + db_guard.release(); + return inherited::teardown(); +}