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