diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 74dbc94..d2dc08c 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -11,6 +11,7 @@ add_executable(wsrep-lib_test gtid_test.cpp id_test.cpp server_context_test.cpp + toi_test.cpp transaction_test.cpp transaction_test_2pc.cpp transaction_test_xa.cpp diff --git a/test/mock_provider.hpp b/test/mock_provider.hpp index 2146426..7f1e403 100644 --- a/test/mock_provider.hpp +++ b/test/mock_provider.hpp @@ -80,12 +80,11 @@ namespace wsrep WSREP_OVERRIDE { ws_handle = wsrep::ws_handle(ws_handle.transaction_id(), (void*)1); - wsrep::log_info() << "provider certify: " - << "client: " << client_id.get() - << " flags: " << std::hex << flags - << std::dec - << " certify_status: " << certify_result_; - + wsrep::log_debug() << "provider certify: " + << "client: " << client_id.get() + << " flags: " << std::hex << flags + << std::dec + << " certify_status: " << certify_result_; if (certify_result_) { return certify_result_; @@ -235,13 +234,26 @@ namespace wsrep return wsrep::provider::success; } - enum wsrep::provider::status enter_toi(wsrep::client_id, + enum wsrep::provider::status enter_toi(wsrep::client_id client_id, const wsrep::key_array&, const wsrep::const_buffer&, - wsrep::ws_meta&, + wsrep::ws_meta& toi_meta, int) WSREP_OVERRIDE - { return wsrep::provider::success; } + { + ++group_seqno_; + wsrep::gtid gtid(group_id_, wsrep::seqno(group_seqno_)); + wsrep::stid stid(server_id_, + wsrep::transaction_id::undefined(), + client_id); + toi_meta = wsrep::ws_meta(gtid, stid, + wsrep::seqno(group_seqno_ - 1), + wsrep::provider::flag::start_transaction | + wsrep::provider::flag::commit); + + return wsrep::provider::success; + } + enum wsrep::provider::status leave_toi(wsrep::client_id, const wsrep::mutable_buffer&) WSREP_OVERRIDE diff --git a/test/toi_test.cpp b/test/toi_test.cpp new file mode 100644 index 0000000..7d6d653 --- /dev/null +++ b/test/toi_test.cpp @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2019 Codership Oy + * + * This file is part of wsrep-lib. + * + * Wsrep-lib is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * Wsrep-lib is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with wsrep-lib. If not, see . + */ + +#include "wsrep/client_state.hpp" + +#include "client_state_fixture.hpp" + +#include + +BOOST_FIXTURE_TEST_CASE(test_toi_mode, + replicating_client_fixture_sync_rm) +{ + BOOST_REQUIRE(cc.mode() == wsrep::client_state::m_local); + wsrep::key key(wsrep::key::exclusive); + key.append_key_part("k1", 2); + key.append_key_part("k2", 2); + wsrep::key_array keys{key}; + wsrep::const_buffer buf("toi", 3); + BOOST_REQUIRE(cc.enter_toi(keys, buf, + wsrep::provider::flag::start_transaction | + wsrep::provider::flag::commit) == 0); + BOOST_REQUIRE(cc.mode() == wsrep::client_state::m_toi); + BOOST_REQUIRE(cc.in_toi()); + BOOST_REQUIRE(cc.toi_mode() == wsrep::client_state::m_local); + BOOST_REQUIRE(cc.leave_toi() == 0); + BOOST_REQUIRE(cc.mode() == wsrep::client_state::m_local); +} + +BOOST_FIXTURE_TEST_CASE(test_toi_applying, + applying_client_fixture) +{ + // Fixture opens a transaction, commit it first + BOOST_REQUIRE((cc.before_commit() || cc.ordered_commit() || + cc.after_commit()) == 0); + cc.after_applying(); + + wsrep::ws_meta ws_meta(wsrep::gtid(wsrep::id("1"), wsrep::seqno(2)), + wsrep::stid(sc.id(), + wsrep::transaction_id::undefined(), + cc.id()), + wsrep::seqno(1), + wsrep::provider::flag::start_transaction | + wsrep::provider::flag::commit); + BOOST_REQUIRE(cc.enter_toi(ws_meta) == 0); + BOOST_REQUIRE(cc.in_toi()); + BOOST_REQUIRE(cc.toi_mode() == wsrep::client_state::m_high_priority); + BOOST_REQUIRE(cc.leave_toi() == 0); + cc.after_applying(); +}