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, AF_INET, SOCK_DGRAM, IPPROTO_TCP);
94 		zassert_false(fds[i] < 0);
95 	}
96 
97 	for (int i = 0; i < ARRAY_SIZE(sockets); i++) {
98 		modem_socket_put(&socket_config, fds[i]);
99 		/* Returned file description is freed by zsock_close, so we need to free it here. */
100 		zvfs_free_fd(fds[i]);
101 	}
102 }
103 
ZTEST(modem_socket,test_modem_socket_get_put_fd_zero)104 ZTEST(modem_socket, test_modem_socket_get_put_fd_zero)
105 {
106 	struct modem_socket *sock;
107 	int ret;
108 
109 	ret = modem_socket_init(&socket_config, sockets, MODEM_SOCKETS_MAX, MODEM_SOCKETS_BASE_NUM,
110 				false, &socket_fd_op_vtable);
111 	zassert_ok(ret);
112 
113 	test_modem_get_put_all();
114 
115 	/* Check that fd 0 does not return a modem socket object. */
116 	sock = modem_socket_from_fd(&socket_config, 0);
117 	zassert_is_null(sock);
118 }
119 
ZTEST(modem_socket,test_modem_socket_get_put_not_allocated)120 ZTEST(modem_socket, test_modem_socket_get_put_not_allocated)
121 {
122 	int ret;
123 
124 	ret = modem_socket_init(&socket_config, sockets, MODEM_SOCKETS_MAX, MODEM_SOCKETS_BASE_NUM,
125 				false, &socket_fd_op_vtable);
126 	zassert_ok(ret);
127 
128 	test_modem_get_put_all();
129 
130 	for (int i = 0; i < ARRAY_SIZE(sockets); i++) {
131 		bool result;
132 
133 		result = modem_socket_is_allocated(&socket_config, &sockets[i]);
134 		zassert_false(result);
135 	}
136 }
137 
ZTEST(modem_socket,test_modem_socket_get_put_not_assigned)138 ZTEST(modem_socket, test_modem_socket_get_put_not_assigned)
139 {
140 	int ret;
141 
142 	ret = modem_socket_init(&socket_config, sockets, MODEM_SOCKETS_MAX, MODEM_SOCKETS_BASE_NUM,
143 				false, &socket_fd_op_vtable);
144 	zassert_ok(ret);
145 
146 	test_modem_get_put_all();
147 
148 	for (int i = 0; i < ARRAY_SIZE(sockets); i++) {
149 		bool result;
150 
151 		result = modem_socket_id_is_assigned(&socket_config, &sockets[i]);
152 		zassert_false(result);
153 	}
154 }
155 
ZTEST(modem_socket,test_modem_socket_get_put_not_assigned_dynamic)156 ZTEST(modem_socket, test_modem_socket_get_put_not_assigned_dynamic)
157 {
158 	int ret;
159 
160 	test_modem_get_put_all();
161 
162 	ret = modem_socket_init(&socket_config, sockets, MODEM_SOCKETS_MAX, MODEM_SOCKETS_BASE_NUM,
163 				true, &socket_fd_op_vtable);
164 	zassert_ok(ret);
165 
166 	for (int i = 0; i < ARRAY_SIZE(sockets); i++) {
167 		bool result;
168 
169 		result = modem_socket_id_is_assigned(&socket_config, &sockets[i]);
170 		zassert_false(result);
171 	}
172 }
173 
174 ZTEST_SUITE(modem_socket, NULL, NULL, NULL, NULL, NULL);
175