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