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