// // Copyright (C) 2018 Codership Oy // #include "mock_server_state.hpp" #include namespace { struct applying_server_fixture { applying_server_fixture() : sc("s1", "s1", wsrep::server_state::rm_sync) , cc(sc, wsrep::client_id(1), wsrep::client_state::m_high_priority) , ws_handle(1, (void*)1) , ws_meta(wsrep::gtid(wsrep::id("1"), wsrep::seqno(1)), wsrep::stid(wsrep::id("1"), 1, 1), wsrep::seqno(0), wsrep::provider::flag::start_transaction | wsrep::provider::flag::commit) { cc.open(cc.id()); } wsrep::mock_server_state sc; wsrep::mock_client cc; wsrep::ws_handle ws_handle; wsrep::ws_meta ws_meta; }; } // Test on_apply() method for 1pc BOOST_FIXTURE_TEST_CASE(server_state_applying_1pc, applying_server_fixture) { char buf[1] = { 1 }; BOOST_REQUIRE(sc.on_apply(cc, ws_handle, ws_meta, wsrep::const_buffer(buf, 1)) == 0); const wsrep::transaction& txc(cc.transaction()); // ::abort(); BOOST_REQUIRE_MESSAGE( txc.state() == wsrep::transaction::s_committed, "Transaction state " << txc.state() << " not committed"); } // Test on_apply() method for 2pc BOOST_FIXTURE_TEST_CASE(server_state_applying_2pc, applying_server_fixture) { char buf[1] = { 1 }; BOOST_REQUIRE(sc.on_apply(cc, ws_handle, ws_meta, wsrep::const_buffer(buf, 1)) == 0); const wsrep::transaction& txc(cc.transaction()); BOOST_REQUIRE(txc.state() == wsrep::transaction::s_committed); } // Test on_apply() method for 1pc transaction which // fails applying and rolls back BOOST_FIXTURE_TEST_CASE(server_state_applying_1pc_rollback, applying_server_fixture) { cc.fail_next_applying_ = true; char buf[1] = { 1 }; BOOST_REQUIRE(sc.on_apply(cc, ws_handle, ws_meta, wsrep::const_buffer(buf, 1)) == 1); const wsrep::transaction& txc(cc.transaction()); BOOST_REQUIRE(txc.state() == wsrep::transaction::s_aborted); } // Test on_apply() method for 2pc transaction which // fails applying and rolls back BOOST_FIXTURE_TEST_CASE(server_state_applying_2pc_rollback, applying_server_fixture) { cc.fail_next_applying_ = true; char buf[1] = { 1 }; BOOST_REQUIRE(sc.on_apply(cc, ws_handle, ws_meta, wsrep::const_buffer(buf, 1)) == 1); const wsrep::transaction& txc(cc.transaction()); BOOST_REQUIRE(txc.state() == wsrep::transaction::s_aborted); } BOOST_AUTO_TEST_CASE(server_state_streaming) { wsrep::mock_server_state sc("s1", "s1", wsrep::server_state::rm_sync); wsrep::mock_client cc(sc, wsrep::client_id(1), wsrep::client_state::m_high_priority); wsrep::ws_handle ws_handle(1, (void*)1); wsrep::ws_meta ws_meta(wsrep::gtid(wsrep::id("1"), wsrep::seqno(1)), wsrep::stid(wsrep::id("1"), 1, 1), wsrep::seqno(0), wsrep::provider::flag::start_transaction); cc.open(cc.id()); BOOST_REQUIRE(sc.on_apply(cc, ws_handle, ws_meta, wsrep::const_buffer("1", 1)) == 0); BOOST_REQUIRE(sc.find_streaming_applier( ws_meta.server_id(), ws_meta.transaction_id())); ws_meta = wsrep::ws_meta(wsrep::gtid(wsrep::id("1"), wsrep::seqno(2)), wsrep::stid(wsrep::id("1"), 1, 1), wsrep::seqno(1), 0); BOOST_REQUIRE(sc.on_apply(cc, ws_handle, ws_meta, wsrep::const_buffer("1", 1)) == 0); ws_meta = wsrep::ws_meta(wsrep::gtid(wsrep::id("1"), wsrep::seqno(2)), wsrep::stid(wsrep::id("1"), 1, 1), wsrep::seqno(1), wsrep::provider::flag::commit); BOOST_REQUIRE(sc.on_apply(cc, ws_handle, ws_meta, wsrep::const_buffer("1", 1)) == 0); BOOST_REQUIRE(sc.find_streaming_applier( ws_meta.server_id(), ws_meta.transaction_id()) == 0); } BOOST_AUTO_TEST_CASE(server_state_state_strings) { BOOST_REQUIRE(wsrep::to_string( wsrep::server_state::s_disconnected) == "disconnected"); BOOST_REQUIRE(wsrep::to_string( wsrep::server_state::s_initializing) == "initializing"); BOOST_REQUIRE(wsrep::to_string( wsrep::server_state::s_initialized) == "initialized"); BOOST_REQUIRE(wsrep::to_string( wsrep::server_state::s_connected) == "connected"); BOOST_REQUIRE(wsrep::to_string( wsrep::server_state::s_joiner) == "joiner"); BOOST_REQUIRE(wsrep::to_string( wsrep::server_state::s_joined) == "joined"); BOOST_REQUIRE(wsrep::to_string( wsrep::server_state::s_donor) == "donor"); BOOST_REQUIRE(wsrep::to_string( wsrep::server_state::s_synced) == "synced"); BOOST_REQUIRE(wsrep::to_string( wsrep::server_state::s_disconnecting) == "disconnecting"); BOOST_REQUIRE(wsrep::to_string( static_cast(0xff)) == "unknown"); }