]> git.proxmox.com Git - mirror_frr.git/blame - pceplib/pcep_socket_comm_mock.c
Merge pull request #13649 from donaldsharp/unlock_the_node_or_else
[mirror_frr.git] / pceplib / pcep_socket_comm_mock.c
CommitLineData
acddc0ed 1// SPDX-License-Identifier: LGPL-2.1-or-later
74971473
JG
2/*
3 * This file is part of the PCEPlib, a PCEP protocol library.
4 *
5 * Copyright (C) 2020 Volta Networks https://voltanet.io/
6 *
74971473
JG
7 * Author : Brady Johnson <brady@voltanet.io>
8 *
9 */
10
11
12/*
13 * This module is built into a separate library, and is used by several
14 * other modules for unit testing, so that real sockets dont have to be
15 * created.
16 */
17
1f8031f7
DL
18#ifdef HAVE_CONFIG_H
19#include "config.h"
20#endif
21
74971473
JG
22#include <netinet/in.h>
23#include <stdbool.h>
24#include <stdlib.h>
25#include <string.h>
26
27#include <CUnit/CUnit.h>
28
29#include "pcep_socket_comm.h"
30#include "pcep_socket_comm_mock.h"
31#include "pcep_utils_queue.h"
32
33/* reset_mock_socket_comm_info() should be used before each test */
34mock_socket_comm_info mock_socket_metadata;
35
36void setup_mock_socket_comm_info(void)
37{
38 mock_socket_metadata.socket_comm_session_initialize_times_called = 0;
39 mock_socket_metadata.socket_comm_session_initialize_src_times_called =
40 0;
41 mock_socket_metadata.socket_comm_session_teardown_times_called = 0;
42 mock_socket_metadata.socket_comm_session_connect_tcp_times_called = 0;
43 mock_socket_metadata.socket_comm_session_send_message_times_called = 0;
44 mock_socket_metadata
45 .socket_comm_session_close_tcp_after_write_times_called = 0;
46 mock_socket_metadata.socket_comm_session_close_tcp_times_called = 0;
47 mock_socket_metadata.destroy_socket_comm_loop_times_called = 0;
48 mock_socket_metadata.send_message_save_message = false;
49 mock_socket_metadata.sent_message_list = dll_initialize();
50}
51
52void teardown_mock_socket_comm_info(void)
53{
54 dll_destroy(mock_socket_metadata.sent_message_list);
55}
56
57void reset_mock_socket_comm_info(void)
58{
59 teardown_mock_socket_comm_info();
60 setup_mock_socket_comm_info();
61}
62
63mock_socket_comm_info *get_mock_socket_comm_info(void)
64{
65 return &mock_socket_metadata;
66}
67
68void verify_socket_comm_times_called(int initialized, int teardown, int connect,
69 int send_message,
70 int close_tcp_after_write, int close_tcp,
71 int destroy)
72{
73 CU_ASSERT_EQUAL(initialized,
74 mock_socket_metadata
75 .socket_comm_session_initialize_times_called);
76 CU_ASSERT_EQUAL(
77 teardown,
78 mock_socket_metadata.socket_comm_session_teardown_times_called);
79 CU_ASSERT_EQUAL(connect,
80 mock_socket_metadata
81 .socket_comm_session_connect_tcp_times_called);
82 CU_ASSERT_EQUAL(send_message,
83 mock_socket_metadata
84 .socket_comm_session_send_message_times_called);
85 CU_ASSERT_EQUAL(
86 close_tcp_after_write,
87 mock_socket_metadata
88 .socket_comm_session_close_tcp_after_write_times_called);
89 CU_ASSERT_EQUAL(close_tcp,
90 mock_socket_metadata
91 .socket_comm_session_close_tcp_times_called);
92 CU_ASSERT_EQUAL(
93 destroy,
94 mock_socket_metadata.destroy_socket_comm_loop_times_called);
95}
96
97
98/*
99 * Mock the socket_comm functions used by session_logic for Unit Testing
100 */
101
102bool initialize_socket_comm_external_infra(
103 void *external_infra_data, ext_socket_read socket_read_cb,
104 ext_socket_write socket_write_cb,
105 ext_socket_pthread_create_callback thread_create_func)
106{
107 (void)external_infra_data;
108 (void)socket_read_cb;
109 (void)socket_write_cb;
110 (void)thread_create_func;
111
112 mock_socket_metadata
113 .socket_comm_initialize_external_infra_times_called++;
114
115 return true;
116}
117
118bool destroy_socket_comm_loop()
119{
120 mock_socket_metadata.destroy_socket_comm_loop_times_called++;
121
122 return false;
123}
124
125pcep_socket_comm_session *
126socket_comm_session_initialize(message_received_handler msg_rcv_handler,
127 message_ready_to_read_handler msg_ready_handler,
128 message_sent_notifier msg_sent_notifier,
129 connection_except_notifier notifier,
130 struct in_addr *dst_ip, short dst_port,
131 uint32_t connect_timeout_millis,
132 const char *tcp_authentication_str,
133 bool is_tcp_auth_md5, void *session_data)
134{
135 (void)msg_sent_notifier;
136 (void)tcp_authentication_str;
137 (void)is_tcp_auth_md5;
138
139 mock_socket_metadata.socket_comm_session_initialize_times_called++;
140
141 pcep_socket_comm_session *comm_session =
142 malloc(sizeof(pcep_socket_comm_session));
143 memset(comm_session, 0, sizeof(pcep_socket_comm_session));
144
145 comm_session->message_handler = msg_rcv_handler;
146 comm_session->message_ready_to_read_handler = msg_ready_handler;
147 comm_session->conn_except_notifier = notifier;
148 comm_session->message_queue = queue_initialize();
149 comm_session->session_data = session_data;
150 comm_session->close_after_write = false;
151 comm_session->connect_timeout_millis = connect_timeout_millis;
152 comm_session->is_ipv6 = false;
153 comm_session->dest_sock_addr.dest_sock_addr_ipv4.sin_family = AF_INET;
154 comm_session->dest_sock_addr.dest_sock_addr_ipv4.sin_port =
155 htons(dst_port);
156 comm_session->dest_sock_addr.dest_sock_addr_ipv4.sin_addr.s_addr =
157 dst_ip->s_addr;
158
159 return comm_session;
160}
161
162pcep_socket_comm_session *socket_comm_session_initialize_ipv6(
163 message_received_handler msg_rcv_handler,
164 message_ready_to_read_handler msg_ready_handler,
165 message_sent_notifier msg_sent_notifier,
166 connection_except_notifier notifier, struct in6_addr *dst_ip,
167 short dst_port, uint32_t connect_timeout_millis,
168 const char *tcp_authentication_str, bool is_tcp_auth_md5,
169 void *session_data)
170{
171 (void)msg_sent_notifier;
172 (void)tcp_authentication_str;
173 (void)is_tcp_auth_md5;
174
175 mock_socket_metadata.socket_comm_session_initialize_times_called++;
176
177 pcep_socket_comm_session *comm_session =
178 malloc(sizeof(pcep_socket_comm_session));
179 memset(comm_session, 0, sizeof(pcep_socket_comm_session));
180
181 comm_session->message_handler = msg_rcv_handler;
182 comm_session->message_ready_to_read_handler = msg_ready_handler;
183 comm_session->conn_except_notifier = notifier;
184 comm_session->message_queue = queue_initialize();
185 comm_session->session_data = session_data;
186 comm_session->close_after_write = false;
187 comm_session->connect_timeout_millis = connect_timeout_millis;
188 comm_session->is_ipv6 = true;
189 comm_session->dest_sock_addr.dest_sock_addr_ipv6.sin6_family = AF_INET6;
190 comm_session->dest_sock_addr.dest_sock_addr_ipv6.sin6_port =
191 htons(dst_port);
192 memcpy(&comm_session->dest_sock_addr.dest_sock_addr_ipv6.sin6_addr,
193 dst_ip, sizeof(struct in6_addr));
194
195 return comm_session;
196}
197
198pcep_socket_comm_session *socket_comm_session_initialize_with_src(
199 message_received_handler msg_rcv_handler,
200 message_ready_to_read_handler msg_ready_handler,
201 message_sent_notifier msg_sent_notifier,
202 connection_except_notifier notifier, struct in_addr *src_ip,
203 short src_port, struct in_addr *dst_ip, short dst_port,
204 uint32_t connect_timeout_millis, const char *tcp_authentication_str,
205 bool is_tcp_auth_md5, void *session_data)
206{
207 (void)msg_sent_notifier;
208 (void)tcp_authentication_str;
209 (void)is_tcp_auth_md5;
210
211 mock_socket_metadata.socket_comm_session_initialize_src_times_called++;
212
213 pcep_socket_comm_session *comm_session =
214 malloc(sizeof(pcep_socket_comm_session));
215 memset(comm_session, 0, sizeof(pcep_socket_comm_session));
216
217 comm_session->message_handler = msg_rcv_handler;
218 comm_session->message_ready_to_read_handler = msg_ready_handler;
219 comm_session->conn_except_notifier = notifier;
220 comm_session->message_queue = queue_initialize();
221 comm_session->session_data = session_data;
222 comm_session->close_after_write = false;
223 comm_session->connect_timeout_millis = connect_timeout_millis;
224 comm_session->is_ipv6 = false;
225 comm_session->src_sock_addr.src_sock_addr_ipv4.sin_family = AF_INET;
226 comm_session->src_sock_addr.src_sock_addr_ipv4.sin_port =
227 htons(src_port);
228 comm_session->src_sock_addr.src_sock_addr_ipv4.sin_addr.s_addr =
229 ((src_ip == NULL) ? INADDR_ANY : src_ip->s_addr);
230 comm_session->dest_sock_addr.dest_sock_addr_ipv4.sin_family = AF_INET;
231 comm_session->dest_sock_addr.dest_sock_addr_ipv4.sin_port =
232 htons(dst_port);
233 comm_session->dest_sock_addr.dest_sock_addr_ipv4.sin_addr.s_addr =
234 dst_ip->s_addr;
235
236 return comm_session;
237}
238
239pcep_socket_comm_session *socket_comm_session_initialize_with_src_ipv6(
240 message_received_handler msg_rcv_handler,
241 message_ready_to_read_handler msg_ready_handler,
242 message_sent_notifier msg_sent_notifier,
243 connection_except_notifier notifier, struct in6_addr *src_ip,
244 short src_port, struct in6_addr *dst_ip, short dst_port,
245 uint32_t connect_timeout_millis, const char *tcp_authentication_str,
246 bool is_tcp_auth_md5, void *session_data)
247{
248 (void)msg_sent_notifier;
249 (void)tcp_authentication_str;
250 (void)is_tcp_auth_md5;
251
252 mock_socket_metadata.socket_comm_session_initialize_src_times_called++;
253
254 pcep_socket_comm_session *comm_session =
255 malloc(sizeof(pcep_socket_comm_session));
256 memset(comm_session, 0, sizeof(pcep_socket_comm_session));
257
258 comm_session->message_handler = msg_rcv_handler;
259 comm_session->message_ready_to_read_handler = msg_ready_handler;
260 comm_session->conn_except_notifier = notifier;
261 comm_session->message_queue = queue_initialize();
262 comm_session->session_data = session_data;
263 comm_session->close_after_write = false;
264 comm_session->connect_timeout_millis = connect_timeout_millis;
265 comm_session->is_ipv6 = true;
266 comm_session->src_sock_addr.src_sock_addr_ipv6.sin6_family = AF_INET6;
267 comm_session->src_sock_addr.src_sock_addr_ipv6.sin6_port =
268 htons(src_port);
269 if (src_ip == NULL) {
270 comm_session->src_sock_addr.src_sock_addr_ipv6.sin6_addr =
271 in6addr_any;
272 } else {
273 memcpy(&comm_session->src_sock_addr.src_sock_addr_ipv6
274 .sin6_addr,
275 src_ip, sizeof(struct in6_addr));
276 }
277 comm_session->dest_sock_addr.dest_sock_addr_ipv6.sin6_family = AF_INET6;
278 comm_session->dest_sock_addr.dest_sock_addr_ipv6.sin6_port =
279 htons(dst_port);
280 memcpy(&comm_session->dest_sock_addr.dest_sock_addr_ipv6.sin6_addr,
281 dst_ip, sizeof(struct in6_addr));
282
283 return comm_session;
284}
285
286bool socket_comm_session_teardown(pcep_socket_comm_session *socket_comm_session)
287{
288 mock_socket_metadata.socket_comm_session_teardown_times_called++;
289
290 if (socket_comm_session != NULL) {
291 queue_destroy(socket_comm_session->message_queue);
292 free(socket_comm_session);
293 }
294
295 return true;
296}
297
298
299bool socket_comm_session_connect_tcp(
300 pcep_socket_comm_session *socket_comm_session)
301{
302 (void)socket_comm_session;
303
304 mock_socket_metadata.socket_comm_session_connect_tcp_times_called++;
305
306 return true;
307}
308
309
310void socket_comm_session_send_message(
311 pcep_socket_comm_session *socket_comm_session,
312 const char *encoded_message, unsigned int msg_length,
313 bool delete_after_send)
314{
315 (void)socket_comm_session;
316 (void)msg_length;
317
318 mock_socket_metadata.socket_comm_session_send_message_times_called++;
319
320 if (mock_socket_metadata.send_message_save_message == true) {
321 /* the caller/test case is responsible for freeing the message
322 */
323 dll_append(mock_socket_metadata.sent_message_list,
324 (char *)encoded_message);
325 } else {
326 if (delete_after_send == true) {
327 free((void *)encoded_message);
328 }
329 }
330
331 return;
332}
333
334
335bool socket_comm_session_close_tcp_after_write(
336 pcep_socket_comm_session *socket_comm_session)
337{
338 (void)socket_comm_session;
339
340 mock_socket_metadata
341 .socket_comm_session_close_tcp_after_write_times_called++;
342
343 return true;
344}
345
346
347bool socket_comm_session_close_tcp(
348 pcep_socket_comm_session *socket_comm_session)
349{
350 (void)socket_comm_session;
351
352 mock_socket_metadata.socket_comm_session_close_tcp_times_called++;
353
354 return true;
355}