1 /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2 /*
3  *     Copyright 2019 Couchbase, Inc
4  *
5  *   Licensed under the Apache License, Version 2.0 (the "License");
6  *   you may not use this file except in compliance with the License.
7  *   You may obtain a copy of the License at
8  *
9  *       http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *   Unless required by applicable law or agreed to in writing, software
12  *   distributed under the License is distributed on an "AS IS" BASIS,
13  *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *   See the License for the specific language governing permissions and
15  *   limitations under the License.
16  */
17 #pragma once
18 
19 #include <folly/portability/GMock.h>
20 #include <memcached/dcp.h>
21 #include <memcached/durability_spec.h>
22 #include <memcached/engine.h>
23 
24 class Item;
25 
26 /**
27  * Mock of dcp_messsage_producers, using GoogleMock to mock.
28  */
29 class GMockDcpMsgProducers : public dcp_message_producers {
30 public:
31     MOCK_METHOD2(get_failover_log,
32                  ENGINE_ERROR_CODE(uint32_t opaque, Vbid vbucket));
33 
34     MOCK_METHOD9(stream_req,
35                  ENGINE_ERROR_CODE(uint32_t opaque,
36                                    Vbid vbucket,
37                                    uint32_t flags,
38                                    uint64_t start_seqno,
39                                    uint64_t end_seqno,
40                                    uint64_t vbucket_uuid,
41                                    uint64_t snap_start_seqno,
42                                    uint64_t snap_end_seqno,
43                                    const std::string& request_value));
44 
45     MOCK_METHOD3(add_stream_rsp,
46                  ENGINE_ERROR_CODE(uint32_t opaque,
47                                    uint32_t stream_opaque,
48                                    cb::mcbp::Status status));
49 
50     MOCK_METHOD2(marker_rsp,
51                  ENGINE_ERROR_CODE(uint32_t opaque, cb::mcbp::Status status));
52 
53     MOCK_METHOD2(set_vbucket_state_rsp,
54                  ENGINE_ERROR_CODE(uint32_t opaque, cb::mcbp::Status status));
55 
56     MOCK_METHOD4(stream_end,
57                  ENGINE_ERROR_CODE(uint32_t opaque,
58                                    Vbid vbucket,
59                                    uint32_t flags,
60                                    cb::mcbp::DcpStreamId sid));
61 
62     MOCK_METHOD8(
63             marker,
64             ENGINE_ERROR_CODE(uint32_t opaque,
65                               Vbid vbucket,
66                               uint64_t start_seqno,
67                               uint64_t end_seqno,
68                               uint32_t flags,
69                               boost::optional<uint64_t> high_completed_seqno,
70                               boost::optional<uint64_t> maxVisibleSeqno,
71                               cb::mcbp::DcpStreamId sid));
72 
73     MOCK_METHOD8(mutation,
74                  ENGINE_ERROR_CODE(uint32_t opaque,
75                                    Item* itm,
76                                    Vbid vbucket,
77                                    uint64_t by_seqno,
78                                    uint64_t rev_seqno,
79                                    uint32_t lock_time,
80                                    uint8_t nru,
81                                    cb::mcbp::DcpStreamId sid));
82 
83     MOCK_METHOD6(deletion,
84                  ENGINE_ERROR_CODE(uint32_t opaque,
85                                    Item* itm,
86                                    Vbid vbucket,
87                                    uint64_t by_seqno,
88                                    uint64_t rev_seqno,
89                                    cb::mcbp::DcpStreamId sid));
90 
91     MOCK_METHOD7(deletionV2,
92                  ENGINE_ERROR_CODE(uint32_t opaque,
93                                    Item* itm,
94                                    Vbid vbucket,
95                                    uint64_t by_seqno,
96                                    uint64_t rev_seqno,
97                                    uint32_t delete_time,
98                                    cb::mcbp::DcpStreamId sid));
99 
100     MOCK_METHOD7(expiration,
101                  ENGINE_ERROR_CODE(uint32_t opaque,
102                                    Item* itm,
103                                    Vbid vbucket,
104                                    uint64_t by_seqno,
105                                    uint64_t rev_seqno,
106                                    uint32_t delete_time,
107                                    cb::mcbp::DcpStreamId sid));
108 
109     MOCK_METHOD3(set_vbucket_state,
110                  ENGINE_ERROR_CODE(uint32_t opaque,
111                                    Vbid vbucket,
112                                    vbucket_state_t state));
113 
114     MOCK_METHOD1(noop, ENGINE_ERROR_CODE(uint32_t opaque));
115 
116     MOCK_METHOD3(buffer_acknowledgement,
117                  ENGINE_ERROR_CODE(uint32_t opaque,
118                                    Vbid vbucket,
119                                    uint32_t buffer_bytes));
120 
121     MOCK_METHOD3(control,
122                  ENGINE_ERROR_CODE(uint32_t opaque,
123                                    cb::const_char_buffer key,
124                                    cb::const_char_buffer value));
125 
126     MOCK_METHOD8(system_event,
127                  ENGINE_ERROR_CODE(uint32_t opaque,
128                                    Vbid vbucket,
129                                    mcbp::systemevent::id event,
130                                    uint64_t bySeqno,
131                                    mcbp::systemevent::version version,
132                                    cb::const_byte_buffer key,
133                                    cb::const_byte_buffer eventData,
134                                    cb::mcbp::DcpStreamId sid));
135 
136     MOCK_METHOD2(get_error_map,
137                  ENGINE_ERROR_CODE(uint32_t opaque, uint16_t version));
138 
139     MOCK_METHOD9(prepare,
140                  ENGINE_ERROR_CODE(uint32_t opaque,
141                                    Item* itm,
142                                    Vbid vbucket,
143                                    uint64_t by_seqno,
144                                    uint64_t rev_seqno,
145                                    uint32_t lock_time,
146                                    uint8_t nru,
147                                    DocumentState document_state,
148                                    cb::durability::Level level));
149 
150     MOCK_METHOD3(seqno_acknowledged,
151                  ENGINE_ERROR_CODE(uint32_t opaque,
152                                    Vbid vbucket,
153                                    uint64_t prepared_seqno));
154 
155     MOCK_METHOD5(commit,
156                  ENGINE_ERROR_CODE(uint32_t opaque,
157                                    Vbid vbucket,
158                                    const DocKey& key,
159                                    uint64_t prepare_seqno,
160                                    uint64_t commit_seqno));
161 
162     MOCK_METHOD5(abort,
163                  ENGINE_ERROR_CODE(uint32_t opaque,
164                                    Vbid vbucket,
165                                    const DocKey& key,
166                                    uint64_t prepared_seqno,
167                                    uint64_t abort_seqno));
168 
169     // Current version of GMock doesn't support move-only types (e.g.
170     // std::unique_ptr) for mocked function arguments. Workaround directly
171     // implementing the affected methods (without GMock) and have them delegate
172     // to a GMock method which takes a raw Item ptr.
mutation(uint32_t opaque, cb::unique_item_ptr itm, Vbid vbucket, uint64_t by_seqno, uint64_t rev_seqno, uint32_t lock_time, uint8_t nru, cb::mcbp::DcpStreamId sid)173     ENGINE_ERROR_CODE mutation(uint32_t opaque,
174                                cb::unique_item_ptr itm,
175                                Vbid vbucket,
176                                uint64_t by_seqno,
177                                uint64_t rev_seqno,
178                                uint32_t lock_time,
179                                uint8_t nru,
180                                cb::mcbp::DcpStreamId sid) {
181         return mutation(opaque,
182                         reinterpret_cast<Item*>(itm.get()),
183                         vbucket,
184                         by_seqno,
185                         rev_seqno,
186                         lock_time,
187                         nru,
188                         sid);
189     }
190 
deletion(uint32_t opaque, cb::unique_item_ptr itm, Vbid vbucket, uint64_t by_seqno, uint64_t rev_seqno, cb::mcbp::DcpStreamId sid)191     ENGINE_ERROR_CODE deletion(uint32_t opaque,
192                                cb::unique_item_ptr itm,
193                                Vbid vbucket,
194                                uint64_t by_seqno,
195                                uint64_t rev_seqno,
196                                cb::mcbp::DcpStreamId sid) {
197         return deletion(opaque,
198                         reinterpret_cast<Item*>(itm.get()),
199                         vbucket,
200                         by_seqno,
201                         rev_seqno,
202                         sid);
203     }
204 
deletion_v2(uint32_t opaque, cb::unique_item_ptr itm, Vbid vbucket, uint64_t by_seqno, uint64_t rev_seqno, uint32_t delete_time, cb::mcbp::DcpStreamId sid)205     ENGINE_ERROR_CODE deletion_v2(uint32_t opaque,
206                                   cb::unique_item_ptr itm,
207                                   Vbid vbucket,
208                                   uint64_t by_seqno,
209                                   uint64_t rev_seqno,
210                                   uint32_t delete_time,
211                                   cb::mcbp::DcpStreamId sid) {
212         return deletionV2(opaque,
213                           reinterpret_cast<Item*>(itm.get()),
214                           vbucket,
215                           by_seqno,
216                           rev_seqno,
217                           delete_time,
218                           sid);
219     }
220 
expiration(uint32_t opaque, cb::unique_item_ptr itm, Vbid vbucket, uint64_t by_seqno, uint64_t rev_seqno, uint32_t delete_time, cb::mcbp::DcpStreamId sid)221     ENGINE_ERROR_CODE expiration(uint32_t opaque,
222                                  cb::unique_item_ptr itm,
223                                  Vbid vbucket,
224                                  uint64_t by_seqno,
225                                  uint64_t rev_seqno,
226                                  uint32_t delete_time,
227                                  cb::mcbp::DcpStreamId sid) {
228         return expiration(opaque,
229                           reinterpret_cast<Item*>(itm.get()),
230                           vbucket,
231                           by_seqno,
232                           rev_seqno,
233                           delete_time,
234                           sid);
235     }
236 
prepare(uint32_t opaque, cb::unique_item_ptr itm, Vbid vbucket, uint64_t by_seqno, uint64_t rev_seqno, uint32_t lock_time, uint8_t nru, DocumentState document_state, cb::durability::Level level)237     ENGINE_ERROR_CODE prepare(uint32_t opaque,
238                               cb::unique_item_ptr itm,
239                               Vbid vbucket,
240                               uint64_t by_seqno,
241                               uint64_t rev_seqno,
242                               uint32_t lock_time,
243                               uint8_t nru,
244                               DocumentState document_state,
245                               cb::durability::Level level) {
246         return prepare(opaque,
247                        reinterpret_cast<Item*>(itm.get()),
248                        vbucket,
249                        by_seqno,
250                        rev_seqno,
251                        lock_time,
252                        nru,
253                        document_state,
254                        level);
255     }
256 };
257