Skip to content

Commit caa864a

Browse files
committed
tests: Add unit tests for AT#XLISTEN and AT#XACCEPT
Basic unit tests for AT#XLISTEN and AT#XACCEPT. Signed-off-by: Markus Lassila <markus.lassila@nordicsemi.no>
1 parent d9069f5 commit caa864a

4 files changed

Lines changed: 122 additions & 27 deletions

File tree

app/tests/at_socket/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ target_sources(app PRIVATE
6666
../stubs/control_pin_stubs.c
6767
../stubs/pm_stubs.c
6868
../stubs/at_cmd_custom_stubs.c
69+
../stubs/kernel_stubs.c
6970
../../src/sm_util.c
7071
../../src/sm_at_socket.c
7172
../../src/sm_at_host.c

app/tests/at_socket/src/nrf_modem_at_wrapper.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ extern int handle_at_recvcfg_wrapper_xrecvcfg(char *buf, size_t len, char *at_cm
3838
extern int handle_at_socketopt_wrapper_xsocketopt(char *buf, size_t len, char *at_cmd);
3939
extern int handle_at_secure_socket_wrapper_xssocket(char *buf, size_t len, char *at_cmd);
4040
extern int handle_at_secure_socketopt_wrapper_xssocketopt(char *buf, size_t len, char *at_cmd);
41+
extern int handle_at_listen_wrapper_xlisten(char *buf, size_t len, char *at_cmd);
42+
extern int handle_at_accept_wrapper_xaccept(char *buf, size_t len, char *at_cmd);
4143

4244
/* Wrapper for nrf_modem_at_cmd that handles custom commands */
4345
int nrf_modem_at_cmd(void *buf, size_t buf_size, const char *fmt, ...)
@@ -73,6 +75,10 @@ int nrf_modem_at_cmd(void *buf, size_t buf_size, const char *fmt, ...)
7375
ret = handle_at_close_wrapper_xclose((char *)buf, buf_size, at_cmd);
7476
} else if (strncasecmp(at_cmd, "AT#XBIND", 8) == 0) {
7577
ret = handle_at_bind_wrapper_xbind((char *)buf, buf_size, at_cmd);
78+
} else if (strncasecmp(at_cmd, "AT#XLISTEN", 10) == 0) {
79+
ret = handle_at_listen_wrapper_xlisten((char *)buf, buf_size, at_cmd);
80+
} else if (strncasecmp(at_cmd, "AT#XACCEPT", 10) == 0) {
81+
ret = handle_at_accept_wrapper_xaccept((char *)buf, buf_size, at_cmd);
7682
} else if (strncasecmp(at_cmd, "AT#XCONNECT", 11) == 0) {
7783
ret = handle_at_connect_wrapper_xconnect((char *)buf, buf_size, at_cmd);
7884
} else if (strncasecmp(at_cmd, "AT#XSENDTO", 10) == 0) {

app/tests/at_socket/src/test_at_socket.c

Lines changed: 90 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,20 @@ static int mock_getsockopt_int_callback(int socket, int level, int option_name,
6565
return 0;
6666
}
6767

68+
static int mock_getsockopt_tcp_srv_sesstimeo_callback(int socket, int level, int option_name,
69+
void *option_value, net_socklen_t *option_len,
70+
int num_calls)
71+
{
72+
int *value = (int *)option_value;
73+
74+
/* Return 135 on first call, 0 on second call for SO_TCP_SRV_SESSTIMEO */
75+
if (*option_len >= sizeof(int)) {
76+
*value = (num_calls == 0) ? 135 : 0;
77+
*option_len = sizeof(int);
78+
}
79+
return 0;
80+
}
81+
6882
static int mock_getsockopt_hostname_callback(int socket, int level, int option_name,
6983
void *option_value, net_socklen_t *option_len,
7084
int num_calls)
@@ -80,6 +94,30 @@ static int mock_getsockopt_hostname_callback(int socket, int level, int option_n
8094
return 0;
8195
}
8296

97+
static char *mock_zsock_inet_ntop_192_168_0_100_callback(
98+
net_sa_family_t af, const void *src, char *dst, net_socklen_t size, int num_calls)
99+
{
100+
strcpy(dst, "192.168.0.100");
101+
return dst;
102+
}
103+
104+
static int mock_nrf_accept_with_peer_callback(int socket, struct nrf_sockaddr *restrict address,
105+
nrf_socklen_t *restrict address_len, int num_calls)
106+
{
107+
/* Populate the address structure with peer information */
108+
struct nrf_sockaddr_in *addr_in = (struct nrf_sockaddr_in *)address;
109+
110+
addr_in->sin_family = NRF_AF_INET;
111+
addr_in->sin_port = nrf_htons(5555); /* Port 5555 in network byte order */
112+
addr_in->sin_addr.s_addr = nrf_htonl(0xC0A80064); /* 192.168.0.100 */
113+
114+
if (address_len) {
115+
*address_len = sizeof(struct nrf_sockaddr_in);
116+
}
117+
118+
return 7; /* Return new socket fd */
119+
}
120+
83121
void setUp(void)
84122
{
85123
/* This is run before EACH test */
@@ -91,6 +129,8 @@ void tearDown(void)
91129
/* This is run after EACH test */
92130
/* Reset any stubs to prevent interference between tests */
93131
__cmock_nrf_getsockopt_Stub(NULL);
132+
__cmock_zsock_inet_ntop_Stub(NULL);
133+
__cmock_nrf_accept_Stub(NULL);
94134
}
95135

96136
/*
@@ -777,8 +817,6 @@ void test_xconnect_operation(void)
777817
}
778818

779819
/*
780-
<<<<<<< Updated upstream
781-
=======
782820
* Test: Socket listen operation via AT command
783821
* - Command: AT#XLISTEN=<handle>\r\n
784822
* - Tests: Putting a TCP socket into listening mode
@@ -1007,7 +1045,6 @@ void test_xaccept_not_listening(void)
10071045
}
10081046

10091047
/*
1010-
>>>>>>> Stashed changes
10111048
* Test: Send data via AT#XSEND with unformatted string
10121049
* - Command: AT#XSEND=<handle>,<mode>,<flags>,"<data>"\r\n
10131050
* - Tests: Sending unformatted string data over TCP socket
@@ -1815,13 +1852,6 @@ static char *mock_zsock_inet_ntop_10_0_0_1_callback(
18151852
return dst;
18161853
}
18171854

1818-
static char *mock_zsock_inet_ntop_192_168_0_100_callback(
1819-
net_sa_family_t af, const void *src, char *dst, net_socklen_t size, int num_calls)
1820-
{
1821-
strcpy(dst, "192.168.0.100");
1822-
return dst;
1823-
}
1824-
18251855
/* Helper callback for mocking nrf_recvfrom with data and address */
18261856
static ssize_t mock_nrf_recvfrom_callback(int socket, void *buffer, size_t length, int flags,
18271857
struct nrf_sockaddr *address, nrf_socklen_t *address_len,
@@ -2717,7 +2747,6 @@ void test_xssocket_read_operation(void)
27172747
__cmock_nrf_setsockopt_ExpectAnyArgsAndReturn(0); /* SO_SNDTIMEO */
27182748
__cmock_nrf_setsockopt_ExpectAnyArgsAndReturn(0); /* SO_SEC_TAG_LIST */
27192749
__cmock_nrf_setsockopt_ExpectAnyArgsAndReturn(0); /* SO_SEC_PEER_VERIFY */
2720-
__cmock_nrf_setsockopt_ExpectAnyArgsAndReturn(0); /* SO_SEC_ROLE */
27212750
__cmock_nrf_setsockopt_ExpectAnyArgsAndReturn(0); /* SO_POLLCB */
27222751
send_at_command("AT#XSSOCKET=2,1,1,42\r\n");
27232752
response = get_captured_response();
@@ -2888,26 +2917,11 @@ void test_xssocket_ipv4_tcp_server(void)
28882917
* 1. SO_SNDTIMEO (SOL_SOCKET)
28892918
* 2. SO_SEC_TAG_LIST (SOL_SECURE)
28902919
* 3. SO_SEC_PEER_VERIFY (SOL_SECURE)
2891-
* 4. SO_SEC_ROLE (SOL_SECURE) - server only, verified below
2892-
* 5. SO_POLLCB (SOL_SOCKET)
2920+
* 4. SO_POLLCB (SOL_SOCKET)
28932921
*/
28942922
__cmock_nrf_setsockopt_ExpectAnyArgsAndReturn(0); /* SO_SNDTIMEO */
28952923
__cmock_nrf_setsockopt_ExpectAnyArgsAndReturn(0); /* SO_SEC_TAG_LIST */
28962924
__cmock_nrf_setsockopt_ExpectAnyArgsAndReturn(0); /* SO_SEC_PEER_VERIFY */
2897-
2898-
/* Verify SO_SEC_ROLE is set to server (value 1) */
2899-
int expected_role = 1; /* NRF_SO_SEC_ROLE_SERVER */
2900-
2901-
__cmock_nrf_setsockopt_ExpectWithArrayAndReturn(
2902-
0, /* socket fd */
2903-
NRF_SOL_SECURE, /* level */
2904-
NRF_SO_SEC_ROLE, /* option_name */
2905-
&expected_role, /* option_value */
2906-
1, /* option_value array size */
2907-
sizeof(int), /* option_len */
2908-
0 /* return value */
2909-
);
2910-
29112925
__cmock_nrf_setsockopt_ExpectAnyArgsAndReturn(0); /* SO_POLLCB */
29122926

29132927
/* Send AT command: family=1(IPv4), type=1(STREAM), role=1(server), sec_tag=42 */
@@ -3102,6 +3116,55 @@ void test_xsocketopt_reuseaddr(void)
31023116
send_at_command("AT#XCLOSE=0\r\n");
31033117
}
31043118

3119+
/*
3120+
* Test: Set and get socket option SO_TCP_SRV_SESSTIMEO
3121+
* - Command: AT#XSOCKETOPT=<handle>,1,55,<value> (set)
3122+
* AT#XSOCKETOPT=<handle>,0,55 (get)
3123+
* - Tests: Setting and getting SO_TCP_SRV_SESSTIMEO option (option 55)
3124+
*/
3125+
void test_xsocketopt_tcp_srv_sesstimeo(void)
3126+
{
3127+
const char *response;
3128+
3129+
/* Create a TCP socket */
3130+
__cmock_nrf_socket_ExpectAndReturn(NRF_AF_INET, NRF_SOCK_STREAM, NRF_IPPROTO_TCP, 0);
3131+
__cmock_nrf_setsockopt_ExpectAnyArgsAndReturn(0); /* SO_SNDTIMEO */
3132+
__cmock_nrf_setsockopt_ExpectAnyArgsAndReturn(0); /* Bind to PDN */
3133+
send_at_command("AT#XSOCKET=1,1,0\r\n");
3134+
response = get_captured_response();
3135+
TEST_ASSERT_TRUE(strstr(response, "#XSOCKET: 0") != NULL);
3136+
TEST_ASSERT_TRUE(strstr(response, "OK") != NULL);
3137+
3138+
/* Set SO_TCP_SRV_SESSTIMEO (option 55) to 135 */
3139+
__cmock_nrf_setsockopt_ExpectAnyArgsAndReturn(0);
3140+
send_at_command("AT#XSOCKETOPT=0,1,55,135\r\n");
3141+
response = get_captured_response();
3142+
TEST_ASSERT_TRUE(strstr(response, "OK") != NULL);
3143+
3144+
/* Get SO_TCP_SRV_SESSTIMEO (option 55) - should return 135 */
3145+
__cmock_nrf_getsockopt_Stub(mock_getsockopt_tcp_srv_sesstimeo_callback);
3146+
send_at_command("AT#XSOCKETOPT=0,0,55\r\n");
3147+
response = get_captured_response();
3148+
TEST_ASSERT_TRUE(strstr(response, "#XSOCKETOPT: 0,135") != NULL);
3149+
TEST_ASSERT_TRUE(strstr(response, "OK") != NULL);
3150+
3151+
/* Set SO_TCP_SRV_SESSTIMEO (option 55) to 0 */
3152+
__cmock_nrf_setsockopt_ExpectAnyArgsAndReturn(0);
3153+
send_at_command("AT#XSOCKETOPT=0,1,55,0\r\n");
3154+
response = get_captured_response();
3155+
TEST_ASSERT_TRUE(strstr(response, "OK") != NULL);
3156+
3157+
/* Get SO_TCP_SRV_SESSTIMEO (option 55) - should return 0 */
3158+
send_at_command("AT#XSOCKETOPT=0,0,55\r\n");
3159+
response = get_captured_response();
3160+
TEST_ASSERT_TRUE(strstr(response, "#XSOCKETOPT: 0,0") != NULL);
3161+
TEST_ASSERT_TRUE(strstr(response, "OK") != NULL);
3162+
3163+
/* Close socket */
3164+
__cmock_nrf_close_ExpectAndReturn(0, 0);
3165+
send_at_command("AT#XCLOSE=0\r\n");
3166+
}
3167+
31053168
/*
31063169
* Test: Set and get secure socket options
31073170
* - Commands: AT#XSSOCKETOPT=<handle>,1,<name>,<value> (set)

app/tests/stubs/kernel_stubs.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/*
2+
* Copyright (c) 2025 Nordic Semiconductor ASA
3+
*
4+
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
5+
*/
6+
7+
/**
8+
* @file kernel_stubs.c
9+
* Stub implementations for kernel memory allocation functions
10+
*/
11+
12+
#include <zephyr/kernel.h>
13+
#include <stdlib.h>
14+
15+
/* Stub for k_malloc - use standard malloc for testing */
16+
void *k_malloc(size_t size)
17+
{
18+
return malloc(size);
19+
}
20+
21+
/* Stub for k_free - use standard free for testing */
22+
void k_free(void *ptr)
23+
{
24+
free(ptr);
25+
}

0 commit comments

Comments
 (0)