You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by ma...@apache.org on 2020/08/06 11:52:23 UTC

[incubator-nuttx-apps] 04/05: apps/examples/usrsocktest: Add test scenario of recv

This is an automated email from the ASF dual-hosted git repository.

masayuki pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx-apps.git

commit f29c0dabd4435ead6fd56ba0b9af8383b73aa276
Author: SPRESENSE <41...@users.noreply.github.com>
AuthorDate: Thu Aug 6 10:50:56 2020 +0900

    apps/examples/usrsocktest: Add test scenario of recv
    
    Add test scenario of recv for MSG_PEEK flag.
---
 examples/usrsocktest/usrsocktest_block_recv.c | 143 ++++++++++++++++++++++++++
 1 file changed, 143 insertions(+)

diff --git a/examples/usrsocktest/usrsocktest_block_recv.c b/examples/usrsocktest/usrsocktest_block_recv.c
index 54827d7..99da504 100644
--- a/examples/usrsocktest/usrsocktest_block_recv.c
+++ b/examples/usrsocktest/usrsocktest_block_recv.c
@@ -404,6 +404,134 @@ static void ReceiveTimeout(FAR struct usrsocktest_daemon_conf_s *dconf)
   TEST_ASSERT_EQUAL(0, usrsocktest_dcmd_malloc_cnt);
 }
 
+
+/****************************************************************************
+ * Name: PeekReceive
+ *
+ * Description:
+ *   Blocking connect and receive with MSG_PEEK flag
+ *
+ * Input Parameters:
+ *   dconf - socket daemon configuration
+ *
+ * Returned Value:
+ *   None
+ *
+ * Assumptions/Limitations:
+ *   None
+ *
+ ****************************************************************************/
+
+static void PeekReceive(FAR struct usrsocktest_daemon_conf_s *dconf)
+{
+  ssize_t ret;
+  size_t datalen;
+  void *data;
+  struct sockaddr_in addr;
+  char databuf[5];
+
+  /* Start test daemon. */
+
+  dconf->endpoint_addr = "127.0.0.1";
+  dconf->endpoint_port = 255;
+  dconf->endpoint_block_connect = true;
+  dconf->endpoint_block_send = true;
+  dconf->endpoint_recv_avail_from_start = false;
+  dconf->endpoint_recv_avail = 7;
+  TEST_ASSERT_EQUAL(OK, usrsocktest_daemon_start(dconf));
+  started = true;
+  TEST_ASSERT_EQUAL(0, usrsocktest_daemon_get_num_active_sockets());
+
+  /* Open socket */
+
+  sd = socket(AF_INET, SOCK_STREAM, 0);
+  TEST_ASSERT_TRUE(sd >= 0);
+  TEST_ASSERT_EQUAL(1, usrsocktest_daemon_get_num_active_sockets());
+  TEST_ASSERT_EQUAL(0, usrsocktest_daemon_get_num_connected_sockets());
+  TEST_ASSERT_EQUAL(0, usrsocktest_daemon_get_num_waiting_connect_sockets());
+  TEST_ASSERT_EQUAL(1, usrsocktest_daemon_get_num_recv_empty_sockets());
+
+  /* Do connect, should succeed (after connect block released). */
+
+  inet_pton(AF_INET, "127.0.0.1", &addr.sin_addr.s_addr);
+  addr.sin_family = AF_INET;
+  addr.sin_port = htons(255);
+  TEST_ASSERT_TRUE(usrsocktest_send_delayed_command('E', 100));
+  ret = connect(sd, (FAR const struct sockaddr *)&addr, sizeof(addr));
+  TEST_ASSERT_EQUAL(0, ret);
+  TEST_ASSERT_EQUAL(1, usrsocktest_daemon_get_num_active_sockets());
+  TEST_ASSERT_EQUAL(1, usrsocktest_daemon_get_num_connected_sockets());
+  TEST_ASSERT_EQUAL(0, usrsocktest_daemon_get_num_waiting_connect_sockets());
+  TEST_ASSERT_EQUAL(1, usrsocktest_daemon_get_num_recv_empty_sockets());
+
+  /* Receive data from remote with MSG_PEEK flag */
+
+  data = databuf;
+  datalen = sizeof(databuf);
+  TEST_ASSERT_TRUE(usrsocktest_send_delayed_command('r', 100));
+  ret = recvfrom(sd, data, datalen, MSG_PEEK, NULL, 0);
+  TEST_ASSERT_EQUAL(datalen, ret);
+  TEST_ASSERT_EQUAL(5, ret);
+  TEST_ASSERT_EQUAL_UINT8_ARRAY("abcde", data, 5);
+  TEST_ASSERT_EQUAL(1, usrsocktest_daemon_get_num_connected_sockets());
+  TEST_ASSERT_EQUAL(1, usrsocktest_daemon_get_num_active_sockets());
+  TEST_ASSERT_EQUAL(5, usrsocktest_daemon_get_recv_bytes());
+  TEST_ASSERT_EQUAL(0, usrsocktest_daemon_get_num_recv_empty_sockets());
+
+  /* Receive data from remote */
+
+  data = databuf;
+  datalen = sizeof(databuf);
+  ret = recvfrom(sd, data, datalen, 0, NULL, 0);
+  TEST_ASSERT_EQUAL(datalen, ret);
+  TEST_ASSERT_EQUAL(5, ret);
+  TEST_ASSERT_EQUAL_UINT8_ARRAY("abcde", data, 5);
+  TEST_ASSERT_EQUAL(1, usrsocktest_daemon_get_num_connected_sockets());
+  TEST_ASSERT_EQUAL(1, usrsocktest_daemon_get_num_active_sockets());
+  TEST_ASSERT_EQUAL(10, usrsocktest_daemon_get_recv_bytes());
+  TEST_ASSERT_EQUAL(0, usrsocktest_daemon_get_num_recv_empty_sockets());
+
+  /* Receive data from remote with MSG_PEEK flag */
+
+  data = databuf;
+  datalen = sizeof(databuf);
+  ret = recvfrom(sd, data, datalen, MSG_PEEK, NULL, 0);
+  TEST_ASSERT_EQUAL(2, ret);
+  TEST_ASSERT_EQUAL_UINT8_ARRAY("ab", data, 2);
+  TEST_ASSERT_EQUAL(1, usrsocktest_daemon_get_num_connected_sockets());
+  TEST_ASSERT_EQUAL(1, usrsocktest_daemon_get_num_active_sockets());
+  TEST_ASSERT_EQUAL(12, usrsocktest_daemon_get_recv_bytes());
+  TEST_ASSERT_EQUAL(0, usrsocktest_daemon_get_num_recv_empty_sockets());
+
+  /* Receive data from remote */
+
+  data = databuf;
+  datalen = sizeof(databuf);
+  ret = recvfrom(sd, data, datalen, 0, NULL, 0);
+  TEST_ASSERT_EQUAL(2, ret);
+  TEST_ASSERT_EQUAL_UINT8_ARRAY("ab", data, 2);
+  TEST_ASSERT_EQUAL(1, usrsocktest_daemon_get_num_connected_sockets());
+  TEST_ASSERT_EQUAL(1, usrsocktest_daemon_get_num_active_sockets());
+  TEST_ASSERT_EQUAL(14, usrsocktest_daemon_get_recv_bytes());
+  TEST_ASSERT_EQUAL(1, usrsocktest_daemon_get_num_recv_empty_sockets());
+
+  /* Close socket */
+
+  TEST_ASSERT_TRUE(close(sd) >= 0);
+  sd = -1;
+  TEST_ASSERT_EQUAL(0, usrsocktest_daemon_get_num_active_sockets());
+  TEST_ASSERT_EQUAL(0, usrsocktest_daemon_get_num_connected_sockets());
+
+  /* Stopping daemon should succeed. */
+
+  TEST_ASSERT_EQUAL(OK, usrsocktest_daemon_stop());
+  started = false;
+  TEST_ASSERT_EQUAL(-ENODEV, usrsocktest_daemon_get_num_active_sockets());
+  TEST_ASSERT_EQUAL(-ENODEV, usrsocktest_daemon_get_num_connected_sockets());
+  TEST_ASSERT_EQUAL(0, usrsocktest_endp_malloc_cnt);
+  TEST_ASSERT_EQUAL(0, usrsocktest_dcmd_malloc_cnt);
+}
+
 /****************************************************************************
  * Name: BlockRecv test group setup
  *
@@ -498,6 +626,19 @@ TEST(BlockRecv, ReceiveTimeoutDelay)
   ReceiveTimeout(&usrsocktest_daemon_config);
 }
 
+TEST(BlockRecv, PeekReceive)
+{
+  usrsocktest_daemon_config = usrsocktest_daemon_defconf;
+  PeekReceive(&usrsocktest_daemon_config);
+}
+
+TEST(BlockRecv, PeekReceiveDelay)
+{
+  usrsocktest_daemon_config = usrsocktest_daemon_defconf;
+  usrsocktest_daemon_config.delay_all_responses = true;
+  PeekReceive(&usrsocktest_daemon_config);
+}
+
 /****************************************************************************
  * Public Functions
  ****************************************************************************/
@@ -510,4 +651,6 @@ TEST_GROUP(BlockRecv)
   RUN_TEST_CASE(BlockRecv, NoBlockConnectDelay);
   RUN_TEST_CASE(BlockRecv, ReceiveTimeout);
   RUN_TEST_CASE(BlockRecv, ReceiveTimeoutDelay);
+  RUN_TEST_CASE(BlockRecv, PeekReceive);
+  RUN_TEST_CASE(BlockRecv, PeekReceiveDelay);
 }