From 728eaa80b5d224650ca42f16b655685d6f2a8a4e Mon Sep 17 00:00:00 2001 From: Teemu Ollakka Date: Wed, 19 Dec 2018 15:19:05 +0200 Subject: [PATCH] Added test cases for donor transitions. Replaced all references to provider_ in server_state methods to provider() call which is virtual and can be overridden by test classes. Provider pointer may not be initialized during unit tests yet. --- src/server_state.cpp | 16 ++++++++-------- test/server_context_test.cpp | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/src/server_state.cpp b/src/server_state.cpp index 62b0a7c..cdb1c1a 100644 --- a/src/server_state.cpp +++ b/src/server_state.cpp @@ -377,7 +377,7 @@ wsrep::server_state::~server_state() std::vector wsrep::server_state::status() const { - return provider_->status(); + return provider().status(); } @@ -394,7 +394,7 @@ wsrep::seqno wsrep::server_state::pause() ++pause_count_; assert(pause_seqno_.is_undefined()); lock.unlock(); - pause_seqno_ = provider_->pause(); + pause_seqno_ = provider().pause(); lock.lock(); if (pause_seqno_.is_undefined()) { @@ -409,7 +409,7 @@ void wsrep::server_state::resume() wsrep::log_info() << "resume"; assert(pause_seqno_.is_undefined() == false); assert(pause_count_ == 1); - if (provider_->resume()) + if (provider().resume()) { throw wsrep::runtime_error("Failed to resume provider"); } @@ -512,7 +512,7 @@ void wsrep::server_state::sst_sent(const wsrep::gtid& gtid, int error) wsrep::unique_lock lock(mutex_); state(lock, s_joined); lock.unlock(); - if (provider_->sst_sent(gtid, error)) + if (provider().sst_sent(gtid, error)) { server_service_.log_message(wsrep::log::warning, "Provider sst_sent() returned an error"); @@ -624,13 +624,13 @@ enum wsrep::provider::status wsrep::server_state::wait_for_gtid(const wsrep::gtid& gtid, int timeout) const { - return provider_->wait_for_gtid(gtid, timeout); + return provider().wait_for_gtid(gtid, timeout); } std::pair wsrep::server_state::causal_read(int timeout) const { - return provider_->causal_read(timeout); + return provider().causal_read(timeout); } void wsrep::server_state::on_connect(const wsrep::view& view) @@ -1045,7 +1045,7 @@ int wsrep::server_state::desync(wsrep::unique_lock& lock) assert(lock.owns_lock()); ++desync_count_; lock.unlock(); - int ret(provider_->desync()); + int ret(provider().desync()); lock.lock(); if (ret) { @@ -1062,7 +1062,7 @@ void wsrep::server_state::resync(wsrep::unique_lock& if (desync_count_ > 0) { --desync_count_; - if (provider_->resync()) + if (provider().resync()) { throw wsrep::runtime_error("Failed to resync"); } diff --git a/test/server_context_test.cpp b/test/server_context_test.cpp index ac71910..02507b5 100644 --- a/test/server_context_test.cpp +++ b/test/server_context_test.cpp @@ -481,3 +481,35 @@ BOOST_FIXTURE_TEST_CASE( ss.on_sync(); BOOST_REQUIRE(ss.state() == wsrep::server_state::s_synced); } + +///////////////////////////////////////////////////////////////////////////// +// Donor state transitions // +///////////////////////////////////////////////////////////////////////////// + +BOOST_FIXTURE_TEST_CASE( + server_state_sst_first_donate_success, + sst_first_server_fixture) +{ + bootstrap(); + BOOST_REQUIRE(ss.state() == wsrep::server_state::s_synced); + ss.start_sst("", wsrep::gtid(cluster_id, wsrep::seqno(2)), false); + BOOST_REQUIRE(ss.state() == wsrep::server_state::s_donor); + ss.sst_sent(wsrep::gtid(cluster_id, wsrep::seqno(2)), 0); + BOOST_REQUIRE(ss.state() == wsrep::server_state::s_joined); + ss.on_sync(); + BOOST_REQUIRE(ss.state() == wsrep::server_state::s_synced); +} + +BOOST_FIXTURE_TEST_CASE( + server_state_sst_first_donate_error, + sst_first_server_fixture) +{ + bootstrap(); + BOOST_REQUIRE(ss.state() == wsrep::server_state::s_synced); + ss.start_sst("", wsrep::gtid(cluster_id, wsrep::seqno(2)), false); + BOOST_REQUIRE(ss.state() == wsrep::server_state::s_donor); + ss.sst_sent(wsrep::gtid(cluster_id, wsrep::seqno(2)), 1); + BOOST_REQUIRE(ss.state() == wsrep::server_state::s_joined); + ss.on_sync(); + BOOST_REQUIRE(ss.state() == wsrep::server_state::s_synced); +}