1 /* 2 * Copyright (C) 2018 Codership Oy <info@codership.com> 3 * 4 * This file is part of wsrep-lib. 5 * 6 * Wsrep-lib is free software: you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation, either version 2 of the License, or 9 * (at your option) any later version. 10 * 11 * Wsrep-lib is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with wsrep-lib. If not, see <https://www.gnu.org/licenses/>. 18 */ 19 20 #ifndef WSREP_TEST_CLIENT_CONTEXT_FIXTURE_HPP 21 #define WSREP_TEST_CLIENT_CONTEXT_FIXTURE_HPP 22 23 #include "mock_server_state.hpp" 24 #include "mock_client_state.hpp" 25 26 27 #include <boost/test/unit_test.hpp> 28 29 namespace 30 { 31 struct replicating_client_fixture_sync_rm 32 { replicating_client_fixture_sync_rm__anon84a58e320111::replicating_client_fixture_sync_rm33 replicating_client_fixture_sync_rm() 34 : server_service(sc) 35 , sc("s1", wsrep::server_state::rm_sync, server_service) 36 , cc(sc, wsrep::client_id(1), 37 wsrep::client_state::m_local) 38 , tc(cc.transaction()) 39 { 40 sc.mock_connect(); 41 cc.open(cc.id()); 42 BOOST_REQUIRE(cc.before_command() == 0); 43 BOOST_REQUIRE(cc.before_statement() == 0); 44 // Verify initial state 45 BOOST_REQUIRE(tc.active() == false); 46 BOOST_REQUIRE(tc.state() == wsrep::transaction::s_executing); 47 } 48 wsrep::mock_server_service server_service; 49 wsrep::mock_server_state sc; 50 wsrep::mock_client cc; 51 const wsrep::transaction& tc; 52 }; 53 54 struct replicating_two_clients_fixture_sync_rm 55 { replicating_two_clients_fixture_sync_rm__anon84a58e320111::replicating_two_clients_fixture_sync_rm56 replicating_two_clients_fixture_sync_rm() 57 : server_service(sc) 58 , sc("s1", wsrep::server_state::rm_sync, server_service) 59 , cc1(sc, wsrep::client_id(1), 60 wsrep::client_state::m_local) 61 , cc2(sc, wsrep::client_id(2), 62 wsrep::client_state::m_local) 63 , tc(cc1.transaction()) 64 { 65 sc.mock_connect(); 66 cc1.open(cc1.id()); 67 BOOST_REQUIRE(cc1.before_command() == 0); 68 BOOST_REQUIRE(cc1.before_statement() == 0); 69 cc2.open(cc2.id()); 70 BOOST_REQUIRE(cc2.before_command() == 0); 71 BOOST_REQUIRE(cc2.before_statement() == 0); 72 // Verify initial state 73 BOOST_REQUIRE(tc.active() == false); 74 BOOST_REQUIRE(tc.state() == wsrep::transaction::s_executing); 75 } 76 wsrep::mock_server_service server_service; 77 wsrep::mock_server_state sc; 78 wsrep::mock_client cc1; 79 wsrep::mock_client cc2; 80 const wsrep::transaction& tc; 81 }; 82 83 struct replicating_client_fixture_async_rm 84 { replicating_client_fixture_async_rm__anon84a58e320111::replicating_client_fixture_async_rm85 replicating_client_fixture_async_rm() 86 : server_service(sc) 87 , sc("s1", wsrep::server_state::rm_async, server_service) 88 , cc(sc, wsrep::client_id(1), 89 wsrep::client_state::m_local) 90 , tc(cc.transaction()) 91 { 92 sc.mock_connect(); 93 cc.open(cc.id()); 94 BOOST_REQUIRE(cc.before_command() == 0); 95 BOOST_REQUIRE(cc.before_statement() == 0); 96 // Verify initial state 97 BOOST_REQUIRE(tc.active() == false); 98 BOOST_REQUIRE(tc.state() == wsrep::transaction::s_executing); 99 } 100 wsrep::mock_server_service server_service; 101 wsrep::mock_server_state sc; 102 wsrep::mock_client cc; 103 const wsrep::transaction& tc; 104 }; 105 106 struct replicating_client_fixture_2pc 107 { replicating_client_fixture_2pc__anon84a58e320111::replicating_client_fixture_2pc108 replicating_client_fixture_2pc() 109 : server_service(sc) 110 , sc("s1", wsrep::server_state::rm_sync, server_service) 111 , cc(sc, wsrep::client_id(1), 112 wsrep::client_state::m_local) 113 , tc(cc.transaction()) 114 { 115 sc.mock_connect(); 116 cc.open(cc.id()); 117 cc.do_2pc_ = true; 118 BOOST_REQUIRE(cc.before_command() == 0); 119 BOOST_REQUIRE(cc.before_statement() == 0); 120 // Verify initial state 121 BOOST_REQUIRE(tc.active() == false); 122 BOOST_REQUIRE(tc.state() == wsrep::transaction::s_executing); 123 } 124 wsrep::mock_server_service server_service; 125 wsrep::mock_server_state sc; 126 wsrep::mock_client cc; 127 const wsrep::transaction& tc; 128 }; 129 130 struct replicating_client_fixture_autocommit 131 { replicating_client_fixture_autocommit__anon84a58e320111::replicating_client_fixture_autocommit132 replicating_client_fixture_autocommit() 133 : server_service(sc) 134 , sc("s1", wsrep::server_state::rm_sync, server_service) 135 , cc(sc, wsrep::client_id(1), 136 wsrep::client_state::m_local) 137 , tc(cc.transaction()) 138 { 139 sc.mock_connect(); 140 cc.open(cc.id()); 141 cc.is_autocommit_ = true; 142 BOOST_REQUIRE(cc.before_command() == 0); 143 BOOST_REQUIRE(cc.before_statement() == 0); 144 // Verify initial state 145 BOOST_REQUIRE(tc.active() == false); 146 BOOST_REQUIRE(tc.state() == wsrep::transaction::s_executing); 147 } 148 wsrep::mock_server_service server_service; 149 wsrep::mock_server_state sc; 150 wsrep::mock_client cc; 151 const wsrep::transaction& tc; 152 }; 153 154 struct applying_client_fixture 155 { applying_client_fixture__anon84a58e320111::applying_client_fixture156 applying_client_fixture() 157 : server_service(sc) 158 , sc("s1", 159 wsrep::server_state::rm_async, server_service) 160 , cc(sc, 161 wsrep::client_id(1), 162 wsrep::client_state::m_high_priority) 163 , tc(cc.transaction()) 164 { 165 sc.mock_connect(); 166 cc.open(cc.id()); 167 BOOST_REQUIRE(cc.before_command() == 0); 168 BOOST_REQUIRE(cc.before_statement() == 0); 169 } start_transaction__anon84a58e320111::applying_client_fixture170 void start_transaction(wsrep::transaction_id id, 171 wsrep::seqno seqno) 172 { 173 wsrep::ws_handle ws_handle(id, (void*)1); 174 wsrep::ws_meta ws_meta(wsrep::gtid(wsrep::id("1"), seqno), 175 wsrep::stid(sc.id(), 176 wsrep::transaction_id(1), 177 cc.id()), 178 wsrep::seqno(0), 179 wsrep::provider::flag::start_transaction | 180 wsrep::provider::flag::commit); 181 BOOST_REQUIRE(cc.start_transaction(ws_handle, ws_meta) == 0); 182 BOOST_REQUIRE(tc.active() == true); 183 BOOST_REQUIRE(tc.certified() == true); 184 BOOST_REQUIRE(tc.ordered() == true); 185 } 186 187 wsrep::mock_server_service server_service; 188 wsrep::mock_server_state sc; 189 wsrep::mock_client cc; 190 const wsrep::transaction& tc; 191 }; 192 193 struct applying_client_fixture_2pc 194 { applying_client_fixture_2pc__anon84a58e320111::applying_client_fixture_2pc195 applying_client_fixture_2pc() 196 : server_service(sc) 197 , sc("s1", 198 wsrep::server_state::rm_async, server_service) 199 , cc(sc, 200 wsrep::client_id(1), 201 wsrep::client_state::m_high_priority) 202 , tc(cc.transaction()) 203 { 204 sc.mock_connect(); 205 cc.open(cc.id()); 206 cc.do_2pc_ = true; 207 BOOST_REQUIRE(cc.before_command() == 0); 208 BOOST_REQUIRE(cc.before_statement() == 0); 209 wsrep::ws_handle ws_handle(wsrep::transaction_id(1), (void*)1); 210 wsrep::ws_meta ws_meta(wsrep::gtid(wsrep::id("1"), wsrep::seqno(1)), 211 wsrep::stid(sc.id(), 212 wsrep::transaction_id(1), 213 cc.id()), 214 wsrep::seqno(0), 215 wsrep::provider::flag::start_transaction | 216 wsrep::provider::flag::commit); 217 BOOST_REQUIRE(cc.start_transaction(ws_handle, ws_meta) == 0); 218 BOOST_REQUIRE(tc.active() == true); 219 BOOST_REQUIRE(tc.certified() == true); 220 BOOST_REQUIRE(tc.ordered() == true); 221 } 222 wsrep::mock_server_service server_service; 223 wsrep::mock_server_state sc; 224 wsrep::mock_client cc; 225 const wsrep::transaction& tc; 226 }; 227 228 struct streaming_client_fixture_row 229 { streaming_client_fixture_row__anon84a58e320111::streaming_client_fixture_row230 streaming_client_fixture_row() 231 : server_service(sc) 232 , sc("s1", wsrep::server_state::rm_sync, server_service) 233 , cc(sc, 234 wsrep::client_id(1), 235 wsrep::client_state::m_local) 236 , tc(cc.transaction()) 237 { 238 sc.mock_connect(); 239 cc.open(cc.id()); 240 BOOST_REQUIRE(cc.before_command() == 0); 241 BOOST_REQUIRE(cc.before_statement() == 0); 242 // Verify initial state 243 BOOST_REQUIRE(tc.active() == false); 244 BOOST_REQUIRE(tc.state() == wsrep::transaction::s_executing); 245 cc.enable_streaming(wsrep::streaming_context::row, 1); 246 } 247 248 wsrep::mock_server_service server_service; 249 wsrep::mock_server_state sc; 250 wsrep::mock_client cc; 251 const wsrep::transaction& tc; 252 }; 253 254 struct streaming_client_fixture_byte 255 { streaming_client_fixture_byte__anon84a58e320111::streaming_client_fixture_byte256 streaming_client_fixture_byte() 257 : server_service(sc) 258 , sc("s1", wsrep::server_state::rm_sync, server_service) 259 , cc(sc, 260 wsrep::client_id(1), 261 wsrep::client_state::m_local) 262 , tc(cc.transaction()) 263 { 264 sc.mock_connect(); 265 cc.open(cc.id()); 266 BOOST_REQUIRE(cc.before_command() == 0); 267 BOOST_REQUIRE(cc.before_statement() == 0); 268 // Verify initial state 269 BOOST_REQUIRE(tc.active() == false); 270 BOOST_REQUIRE(tc.state() == wsrep::transaction::s_executing); 271 cc.enable_streaming(wsrep::streaming_context::bytes, 1); 272 } 273 wsrep::mock_server_service server_service; 274 wsrep::mock_server_state sc; 275 wsrep::mock_client cc; 276 const wsrep::transaction& tc; 277 }; 278 279 struct streaming_client_fixture_statement 280 { streaming_client_fixture_statement__anon84a58e320111::streaming_client_fixture_statement281 streaming_client_fixture_statement() 282 : server_service(sc) 283 , sc("s1", wsrep::server_state::rm_sync, server_service) 284 , cc(sc, 285 wsrep::client_id(1), 286 wsrep::client_state::m_local) 287 , tc(cc.transaction()) 288 { 289 sc.mock_connect(); 290 cc.open(cc.id()); 291 BOOST_REQUIRE(cc.before_command() == 0); 292 BOOST_REQUIRE(cc.before_statement() == 0); 293 // Verify initial state 294 BOOST_REQUIRE(tc.active() == false); 295 BOOST_REQUIRE(tc.state() == wsrep::transaction::s_executing); 296 cc.enable_streaming(wsrep::streaming_context::statement, 1); 297 } 298 299 wsrep::mock_server_service server_service; 300 wsrep::mock_server_state sc; 301 wsrep::mock_client cc; 302 const wsrep::transaction& tc; 303 }; 304 } 305 #endif // WSREP_TEST_CLIENT_CONTEXT_FIXTURE_HPP 306