summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorPhilip Withnall <philip.withnall@collabora.co.uk>2015-06-24 14:06:05 +0100
committerOlivier CrĂȘte <olivier.crete@collabora.com>2016-06-03 18:28:33 -0400
commita72a93e51dba5d239e0607380bb4799cf1b0caca (patch)
tree5bb94d94d26732dd6e5b5612a75c7ba278189a6f /tests
parent02699917641922c9f1d337e3102f13a1ea1d83c4 (diff)
downloadlibnice-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.c38
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);