diff options
author | Philip Withnall <philip.withnall@collabora.co.uk> | 2015-06-24 14:06:05 +0100 |
---|---|---|
committer | Olivier CrĂȘte <olivier.crete@collabora.com> | 2016-06-03 18:28:33 -0400 |
commit | a72a93e51dba5d239e0607380bb4799cf1b0caca (patch) | |
tree | 5bb94d94d26732dd6e5b5612a75c7ba278189a6f /tests | |
parent | 02699917641922c9f1d337e3102f13a1ea1d83c4 (diff) | |
download | libnice-a72a93e51dba5d239e0607380bb4799cf1b0caca.tar.gz |
pseudotcp: Fix pseudo_tcp_socket_recv() in state TCP_CLOSE_WAIT
Previously, pseudo_tcp_socket_recv() would start returning 0 (EOS) as
soon as a FIN segment was received from the peer, even if there was
unread data already in the receive buffer.
Instead, the unread data should all be accessible before
pseudo_tcp_socket_recv() starts returning 0.
Diffstat (limited to 'tests')
-rw-r--r-- | tests/test-pseudotcp-fin.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/tests/test-pseudotcp-fin.c b/tests/test-pseudotcp-fin.c index 96e6d30..4cc88aa 100644 --- a/tests/test-pseudotcp-fin.c +++ b/tests/test-pseudotcp-fin.c @@ -1141,6 +1141,41 @@ pseudotcp_compatibility (void) data_clear (&data); } + +/* Check that after receiving a FIN, queued data can still be read */ +static void +pseudotcp_close_recv_queued (void) +{ + Data data = { 0, }; + guint8 buf[100]; + + /* Establish a connection. */ + establish_connection (&data); + + g_assert_cmpint (pseudo_tcp_socket_send (data.left, "foo", 3), ==, 3); + expect_data (data.left, data.left_sent, 7, 7, 3); + forward_segment_ltr (&data); + + increment_time_both (&data, 100); /* Delayed ACK */ + expect_ack (data.right, data.right_sent, 7, 10); + forward_segment_rtl (&data); + + close_socket (data.left); + expect_fin (data.left, data.left_sent, 10, 7); + forward_segment_ltr (&data); + + expect_ack (data.right, data.right_sent, 7, 11); + forward_segment_rtl (&data); + + /* Check that the data can be read */ + g_assert_cmpint (pseudo_tcp_socket_recv (data.right, (char *) buf, sizeof (buf)), ==, 3); + + /* Now the socket should be empty */ + g_assert_cmpint (pseudo_tcp_socket_recv (data.right, (char *) buf, sizeof (buf)), ==, 0); + + data_clear (&data); +} + int main (int argc, char *argv[]) { @@ -1209,6 +1244,9 @@ main (int argc, char *argv[]) g_test_add_func ("/pseudotcp/close/rst-afterwards", pseudotcp_close_rst_afterwards); + g_test_add_func ("/pseudotcp/close/recv-queued", + pseudotcp_close_recv_queued); + g_test_add_func ("/pseudotcp/compatibility", pseudotcp_compatibility); |