1 /*
2  * SPDX-License-Identifier: Apache-2.0
3  *
4  * Copyright (C) 2025, Joakim Andersson
5  */
6 
7 /**
8  * @addtogroup t_modem_driver
9  * @{
10  * @defgroup t_modem_socket test_modem_socket
11  * @}
12  */
13 
14 #include <zephyr/ztest.h>
15 #include "modem_socket.h"
16 
17 #define MODEM_SOCKETS_MAX 3
18 #define MODEM_SOCKETS_BASE_NUM 0
19 struct modem_socket_config socket_config;
20 struct modem_socket sockets[MODEM_SOCKETS_MAX];
21 
22 static const struct socket_op_vtable socket_fd_op_vtable = {
23 };
24 
ZTEST(modem_socket,test_modem_socket_init_fd_zero)25 ZTEST(modem_socket, test_modem_socket_init_fd_zero)
26 {
27 	struct modem_socket *sock;
28 	int ret;
29 
30 	ret = modem_socket_init(&socket_config, sockets, MODEM_SOCKETS_MAX, MODEM_SOCKETS_BASE_NUM,
31 				false, &socket_fd_op_vtable);
32 	zassert_ok(ret);
33 
34 	/* Check that fd 0 does not return a modem socket object. */
35 	sock = modem_socket_from_fd(&socket_config, 0);
36 
37 	zassert_is_null(sock);
38 }
39 
ZTEST(modem_socket,test_modem_socket_init_not_allocated)40 ZTEST(modem_socket, test_modem_socket_init_not_allocated)
41 {
42 	int ret;
43 
44 	ret = modem_socket_init(&socket_config, sockets, MODEM_SOCKETS_MAX, MODEM_SOCKETS_BASE_NUM,
45 				false, &socket_fd_op_vtable);
46 	zassert_ok(ret);
47 
48 	for (int i = 0; i < ARRAY_SIZE(sockets); i++) {
49 		bool result;
50 
51 		result = modem_socket_is_allocated(&socket_config, &sockets[i]);
52 		zassert_false(result);
53 	}
54 }
55 
ZTEST(modem_socket,test_modem_socket_init_not_assigned)56 ZTEST(modem_socket, test_modem_socket_init_not_assigned)
57 {
58 	int ret;
59 
60 	ret = modem_socket_init(&socket_config, sockets, MODEM_SOCKETS_MAX, MODEM_SOCKETS_BASE_NUM,
61 				false, &socket_fd_op_vtable);
62 	zassert_ok(ret);
63 
64 	for (int i = 0; i < ARRAY_SIZE(sockets); i++) {
65 		bool result;
66 
67 		result = modem_socket_id_is_assigned(&socket_config, &sockets[i]);
68 		zassert_false(result);
69 	}
70 }
71 
ZTEST(modem_socket,test_modem_socket_init_not_assigned_dynamic)72 ZTEST(modem_socket, test_modem_socket_init_not_assigned_dynamic)
73 {
74 	int ret;
75 
76 	ret = modem_socket_init(&socket_config, sockets, MODEM_SOCKETS_MAX, MODEM_SOCKETS_BASE_NUM,
77 				true, &socket_fd_op_vtable);
78 	zassert_ok(ret);
79 
80 	for (int i = 0; i < ARRAY_SIZE(sockets); i++) {
81 		bool result;
82 
83 		result = modem_socket_id_is_assigned(&socket_config, &sockets[i]);
84 		zassert_false(result);
85 	}
86 }
87 
test_modem_get_put_all(void)88 static void test_modem_get_put_all(void)
89 {
90 	int fds[ARRAY_SIZE(sockets)];
91 
92 	for (int i = 0; i < ARRAY_SIZE(sockets); i++) {
93 		fds[i] = modem_socket_get(&socket_config, NET_AF_INET, NET_SOCK_DGRAM,
94 					  NET_IPPROTO_TCP);
95 		zassert_false(fds[i] < 0);
96 	}
97 
98 	for (int i = 0; i < ARRAY_SIZE(sockets); i++) {
99 		modem_socket_put(&socket_config, fds[i]);
100 		/* Returned file description is freed by zsock_close, so we need to free it here. */
101 		zvfs_free_fd(fds[i]);
102 	}
103 }
104 
ZTEST(modem_socket,test_modem_socket_get_put_fd_zero)105 ZTEST(modem_socket, test_modem_socket_get_put_fd_zero)
106 {
107 	struct modem_socket *sock;
108 	int ret;
109 
110 	ret = modem_socket_init(&socket_config, sockets, MODEM_SOCKETS_MAX, MODEM_SOCKETS_BASE_NUM,
111 				false, &socket_fd_op_vtable);
112 	zassert_ok(ret);
113 
114 	test_modem_get_put_all();
115 
116 	/* Check that fd 0 does not return a modem socket object. */
117 	sock = modem_socket_from_fd(&socket_config, 0);
118 	zassert_is_null(sock);
119 }
120 
ZTEST(modem_socket,test_modem_socket_get_put_not_allocated)121 ZTEST(modem_socket, test_modem_socket_get_put_not_allocated)
122 {
123 	int ret;
124 
125 	ret = modem_socket_init(&socket_config, sockets, MODEM_SOCKETS_MAX, MODEM_SOCKETS_BASE_NUM,
126 				false, &socket_fd_op_vtable);
127 	zassert_ok(ret);
128 
129 	test_modem_get_put_all();
130 
131 	for (int i = 0; i < ARRAY_SIZE(sockets); i++) {
132 		bool result;
133 
134 		result = modem_socket_is_allocated(&socket_config, &sockets[i]);
135 		zassert_false(result);
136 	}
137 }
138 
ZTEST(modem_socket,test_modem_socket_get_put_not_assigned)139 ZTEST(modem_socket, test_modem_socket_get_put_not_assigned)
140 {
141 	int ret;
142 
143 	ret = modem_socket_init(&socket_config, sockets, MODEM_SOCKETS_MAX, MODEM_SOCKETS_BASE_NUM,
144 				false, &socket_fd_op_vtable);
145 	zassert_ok(ret);
146 
147 	test_modem_get_put_all();
148 
149 	for (int i = 0; i < ARRAY_SIZE(sockets); i++) {
150 		bool result;
151 
152 		result = modem_socket_id_is_assigned(&socket_config, &sockets[i]);
153 		zassert_false(result);
154 	}
155 }
156 
ZTEST(modem_socket,test_modem_socket_get_put_not_assigned_dynamic)157 ZTEST(modem_socket, test_modem_socket_get_put_not_assigned_dynamic)
158 {
159 	int ret;
160 
161 	test_modem_get_put_all();
162 
163 	ret = modem_socket_init(&socket_config, sockets, MODEM_SOCKETS_MAX, MODEM_SOCKETS_BASE_NUM,
164 				true, &socket_fd_op_vtable);
165 	zassert_ok(ret);
166 
167 	for (int i = 0; i < ARRAY_SIZE(sockets); i++) {
168 		bool result;
169 
170 		result = modem_socket_id_is_assigned(&socket_config, &sockets[i]);
171 		zassert_false(result);
172 	}
173 }
174 
175 ZTEST_SUITE(modem_socket, NULL, NULL, NULL, NULL, NULL);
176