@@ -32,6 +32,9 @@ namespace
32
32
static const int WAIT2RECV_TIMEOUT = 1000 ; // [ms]
33
33
static const int RETRIES = 2 ;
34
34
35
+ static const double EXPECTED_LOSS_RATIO = 0.0 ;
36
+ static const double TOLERATED_LOSS_RATIO = 0.3 ;
37
+
35
38
UDPSocket sock;
36
39
Semaphore tx_sem (0 , 1 );
37
40
@@ -61,6 +64,8 @@ void UDPSOCKET_ECHOTEST()
61
64
int recvd;
62
65
int sent;
63
66
int s_idx = 0 ;
67
+ int packets_sent = 0 ;
68
+ int packets_recv = 0 ;
64
69
for (int pkt_s = pkt_sizes[s_idx]; s_idx < PKTS; pkt_s = ++s_idx) {
65
70
pkt_s = pkt_sizes[s_idx];
66
71
@@ -69,6 +74,9 @@ void UDPSOCKET_ECHOTEST()
69
74
for (int retry_cnt = 0 ; retry_cnt <= 2 ; retry_cnt++) {
70
75
memset (rx_buffer, 0 , BUFF_SIZE);
71
76
sent = sock.sendto (udp_addr, tx_buffer, pkt_s);
77
+ if (sent > 0 ) {
78
+ packets_sent++;
79
+ }
72
80
if (sent != pkt_s) {
73
81
printf (" [Round#%02d - Sender] error, returned %d\n " , s_idx, sent);
74
82
continue ;
@@ -78,7 +86,15 @@ void UDPSOCKET_ECHOTEST()
78
86
break ;
79
87
}
80
88
}
81
- TEST_ASSERT_EQUAL (0 , memcmp (tx_buffer, rx_buffer, pkt_s));
89
+ if (memcmp (tx_buffer, rx_buffer, pkt_s) == 0 ) {
90
+ packets_recv++;
91
+ }
92
+ }
93
+ // Packet loss up to 30% tolerated
94
+ if (packets_sent > 0 ) {
95
+ double loss_ratio = 1 - ((double )packets_recv / (double )packets_sent);
96
+ printf (" Packets sent: %d, packets received %d, loss ratio %.2lf\r\n " , packets_sent, packets_recv, loss_ratio);
97
+ TEST_ASSERT_DOUBLE_WITHIN (TOLERATED_LOSS_RATIO, EXPECTED_LOSS_RATIO, loss_ratio);
82
98
}
83
99
TEST_ASSERT_EQUAL (NSAPI_ERROR_OK, sock.close ());
84
100
}
@@ -98,7 +114,6 @@ void udpsocket_echotest_nonblock_receiver(void *receive_bytes)
98
114
}
99
115
}
100
116
101
- TEST_ASSERT_EQUAL (0 , memcmp (tx_buffer, rx_buffer, expt2recv));
102
117
drop_bad_packets (sock, -1 ); // timeout equivalent to set_blocking(false)
103
118
104
119
tx_sem.release ();
@@ -116,6 +131,8 @@ void UDPSOCKET_ECHOTEST_NONBLOCK()
116
131
117
132
int sent;
118
133
int s_idx = 0 ;
134
+ int packets_sent = 0 ;
135
+ int packets_recv = 0 ;
119
136
Thread *thread;
120
137
unsigned char *stack_mem = (unsigned char *)malloc (OS_STACK_SIZE);
121
138
TEST_ASSERT_NOT_NULL (stack_mem);
@@ -133,6 +150,9 @@ void UDPSOCKET_ECHOTEST_NONBLOCK()
133
150
fill_tx_buffer_ascii (tx_buffer, pkt_s);
134
151
135
152
sent = sock.sendto (udp_addr, tx_buffer, pkt_s);
153
+ if (sent > 0 ) {
154
+ packets_sent++;
155
+ }
136
156
if (sent == NSAPI_ERROR_WOULD_BLOCK) {
137
157
if (osSignalWait (SIGNAL_SIGIO, SIGIO_TIMEOUT).status == osEventTimeout) {
138
158
continue ;
@@ -149,7 +169,16 @@ void UDPSOCKET_ECHOTEST_NONBLOCK()
149
169
}
150
170
thread->join ();
151
171
delete thread;
172
+ if (memcmp (tx_buffer, rx_buffer, pkt_s) == 0 ) {
173
+ packets_recv++;
174
+ }
152
175
}
153
176
free (stack_mem);
177
+ // Packet loss up to 30% tolerated
178
+ if (packets_sent > 0 ) {
179
+ double loss_ratio = 1 - ((double )packets_recv / (double )packets_sent);
180
+ printf (" Packets sent: %d, packets received %d, loss ratio %.2lf\r\n " , packets_sent, packets_recv, loss_ratio);
181
+ TEST_ASSERT_DOUBLE_WITHIN (TOLERATED_LOSS_RATIO, EXPECTED_LOSS_RATIO, loss_ratio);
182
+ }
154
183
TEST_ASSERT_EQUAL (NSAPI_ERROR_OK, sock.close ());
155
184
}
0 commit comments