[Test] connect to local
authorJaeyun <jy1210.jung@samsung.com>
Mon, 11 Jul 2022 05:17:23 +0000 (14:17 +0900)
committerjaeyun-jung <39614140+jaeyun-jung@users.noreply.github.com>
Wed, 20 Jul 2022 11:35:49 +0000 (20:35 +0900)
Add testcase for edge connection and data transfer between local server and client.

Signed-off-by: Jaeyun <jy1210.jung@samsung.com>
tests/unittest_nnstreamer-edge.cc

index 74fc42c55b6e522c6e9d831213c6cee09fcc76ab..b3af41b760cd77fe7787a2eefe5e71e01a49dce3 100644 (file)
 #include "nnstreamer-edge-internal.h"\r
 \r
 /**\r
- * @brief Data struct for event callback test.\r
+ * @brief Data struct for unittest.\r
  */\r
 typedef struct\r
 {\r
-  bool callback_released;\r
-} ne_event_cb_test_s;\r
+  GMainLoop *loop;\r
+  nns_edge_h handle;\r
+  bool running;\r
+  bool is_server;\r
+  bool event_cb_released;\r
+  unsigned int received;\r
+} ne_test_data_s;\r
+\r
+/**\r
+ * @brief Allocate and initialize test data.\r
+ */\r
+static ne_test_data_s *\r
+_get_test_data (bool is_server)\r
+{\r
+  ne_test_data_s *_td;\r
+\r
+  _td = (ne_test_data_s *) malloc (sizeof (ne_test_data_s));\r
+  memset (_td, 0, sizeof (ne_test_data_s));\r
+\r
+  _td->loop = g_main_loop_new (NULL, FALSE);\r
+  _td->is_server = is_server;\r
+\r
+  return _td;\r
+}\r
+\r
+/**\r
+ * @brief Release test data.\r
+ */\r
+static void\r
+_free_test_data (ne_test_data_s *_td)\r
+{\r
+  if (!_td)\r
+    return;\r
+\r
+  if (_td->loop) {\r
+    if (g_main_loop_is_running (_td->loop))\r
+      g_main_loop_quit (_td->loop);\r
+\r
+    g_main_loop_unref (_td->loop);\r
+    _td->loop = NULL;\r
+  }\r
+\r
+  free (_td);\r
+}\r
 \r
 /**\r
  * @brief Edge event callback for test.\r
@@ -26,19 +68,53 @@ typedef struct
 static int\r
 _test_edge_event_cb (nns_edge_event_h event_h, void *user_data)\r
 {\r
+  ne_test_data_s *_td = (ne_test_data_s *) user_data;\r
   nns_edge_event_e event = NNS_EDGE_EVENT_UNKNOWN;\r
-  ne_event_cb_test_s *event_data = (ne_event_cb_test_s *) user_data;\r
+  nns_edge_data_h data_h;\r
+  void *data;\r
+  size_t data_len;\r
+  unsigned int i, count;\r
+  int ret;\r
 \r
-  if (!event_data) {\r
+  if (!_td) {\r
     /* Cannot update event status. */\r
     return NNS_EDGE_ERROR_NONE;\r
   }\r
 \r
-  nns_edge_event_get_type (event_h, &event);\r
+  ret = nns_edge_event_get_type (event_h, &event);\r
+  EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);\r
 \r
   switch (event) {\r
     case NNS_EDGE_EVENT_CALLBACK_RELEASED:\r
-      event_data->callback_released = true;\r
+      _td->event_cb_released = true;\r
+      break;\r
+    case NNS_EDGE_EVENT_NEW_DATA_RECEIVED:\r
+      _td->received++;\r
+\r
+      ret = nns_edge_event_parse_new_data (event_h, &data_h);\r
+      EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);\r
+\r
+      if (_td->is_server) {\r
+        /**\r
+         * @note This is test code, responding to client.\r
+         * Recommend not to call edge API in event callback.\r
+         */\r
+        ret = nns_edge_respond (_td->handle, data_h);\r
+        EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);\r
+      } else {\r
+        /* Compare received data */\r
+        ret = nns_edge_data_get_count (data_h, &count);\r
+        EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);\r
+        ret = nns_edge_data_get (data_h, 0, &data, &data_len);\r
+        EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);\r
+\r
+        EXPECT_EQ (count, 1U);\r
+        for (i = 0; i < 10U; i++)\r
+          EXPECT_EQ (((unsigned int *) data)[i], i);\r
+      }\r
+\r
+      ret = nns_edge_data_destroy (data_h);\r
+      EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);\r
       break;\r
     default:\r
       break;\r
@@ -47,6 +123,151 @@ _test_edge_event_cb (nns_edge_event_h event_h, void *user_data)
   return NNS_EDGE_ERROR_NONE;\r
 }\r
 \r
+/**\r
+ * @brief Edge thread for test.\r
+ */\r
+static void *\r
+_test_edge_thread (void *data)\r
+{\r
+  ne_test_data_s *_td = (ne_test_data_s *) data;\r
+  int ret;\r
+\r
+  ret = nns_edge_start (_td->handle, _td->is_server);\r
+  EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);\r
+\r
+  _td->running = true;\r
+  g_main_loop_run (_td->loop);\r
+  _td->running = false;\r
+\r
+  return NULL;\r
+}\r
+\r
+/**\r
+ * @brief Connect to local host, multiple clients.\r
+ */\r
+TEST(edge, connectLocal)\r
+{\r
+  nns_edge_h server_h, client1_h, client2_h;\r
+  ne_test_data_s *_td_server, *_td_client1, *_td_client2;\r
+  nns_edge_data_h data_h;\r
+  pthread_t server_thread, client1_thread, client2_thread;\r
+  pthread_attr_t attr;\r
+  size_t data_len;\r
+  void *data;\r
+  unsigned int i, retry;\r
+  int ret, port;\r
+  char *val;\r
+\r
+  _td_server = _get_test_data (true);\r
+  _td_client1 = _get_test_data (false);\r
+  _td_client2 = _get_test_data (false);\r
+  port = nns_edge_get_available_port ();\r
+\r
+  /* Prepare server (127.0.0.1:port) */\r
+  val = nns_edge_strdup_printf ("%d", port);\r
+  nns_edge_create_handle ("temp-server", "temp-topic", &server_h);\r
+  nns_edge_set_event_callback (server_h, _test_edge_event_cb, _td_server);\r
+  nns_edge_set_info (server_h, "IP", "127.0.0.1");\r
+  nns_edge_set_info (server_h, "PORT", val);\r
+  nns_edge_set_info (server_h, "CAPS", "test server");\r
+  _td_server->handle = server_h;\r
+  nns_edge_free (val);\r
+\r
+  /* Prepare client */\r
+  nns_edge_create_handle ("temp-client1", "temp-topic", &client1_h);\r
+  nns_edge_set_event_callback (client1_h, _test_edge_event_cb, _td_client1);\r
+  nns_edge_set_info (client1_h, "CAPS", "test client1");\r
+  _td_client1->handle = client1_h;\r
+\r
+  nns_edge_create_handle ("temp-client2", "temp-topic", &client2_h);\r
+  nns_edge_set_event_callback (client2_h, _test_edge_event_cb, _td_client2);\r
+  nns_edge_set_info (client2_h, "CAPS", "test client2");\r
+  _td_client2->handle = client2_h;\r
+\r
+  /* Start server/client thread */\r
+  pthread_attr_init (&attr);\r
+  pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);\r
+  pthread_create (&server_thread, &attr, _test_edge_thread, _td_server);\r
+  pthread_create (&client1_thread, &attr, _test_edge_thread, _td_client1);\r
+  pthread_create (&client2_thread, &attr, _test_edge_thread, _td_client2);\r
+  pthread_attr_destroy (&attr);\r
+\r
+  /* Wait for server/client thread */\r
+  do {\r
+    usleep (20000);\r
+  } while (!g_main_loop_is_running (_td_server->loop));\r
+\r
+  do {\r
+    usleep (20000);\r
+  } while (!g_main_loop_is_running (_td_client1->loop));\r
+\r
+  do {\r
+    usleep (20000);\r
+  } while (!g_main_loop_is_running (_td_client2->loop));\r
+\r
+  ret = nns_edge_connect (client1_h, NNS_EDGE_PROTOCOL_TCP, "127.0.0.1", port);\r
+  EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);\r
+  usleep (10000);\r
+  ret = nns_edge_connect (client2_h, NNS_EDGE_PROTOCOL_TCP, "127.0.0.1", port);\r
+  EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);\r
+\r
+  sleep (2);\r
+\r
+  /* Send request to server */\r
+  data_len = 10U * sizeof (unsigned int);\r
+  data = malloc (data_len);\r
+  ASSERT_TRUE (data != NULL);\r
+\r
+  for (i = 0; i < 10U; i++)\r
+    ((unsigned int *) data)[i] = i;\r
+\r
+  ret = nns_edge_data_create (&data_h);\r
+  EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);\r
+\r
+  ret = nns_edge_data_add (data_h, data, data_len, nns_edge_free);\r
+  EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);\r
+\r
+  for (i = 0; i < 5U; i++) {\r
+    ret = nns_edge_request (client1_h, data_h);\r
+    EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);\r
+    usleep (10000);\r
+    ret = nns_edge_request (client2_h, data_h);\r
+    EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);\r
+\r
+    usleep (100000);\r
+  }\r
+\r
+  ret = nns_edge_data_destroy (data_h);\r
+  EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);\r
+\r
+  /* Wait for responding data (20 seconds) */\r
+  retry = 0U;\r
+  do {\r
+    usleep (100000);\r
+    if (_td_client1->received > 0 && _td_client2->received > 0)\r
+      break;\r
+  } while (retry++ < 200U);\r
+\r
+  g_main_loop_quit (_td_server->loop);\r
+  g_main_loop_quit (_td_client1->loop);\r
+  g_main_loop_quit (_td_client2->loop);\r
+\r
+  ret = nns_edge_release_handle (server_h);\r
+  EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);\r
+  ret = nns_edge_release_handle (client1_h);\r
+  EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);\r
+  ret = nns_edge_release_handle (client2_h);\r
+  EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);\r
+\r
+  EXPECT_TRUE (_td_server->received > 0);\r
+  EXPECT_TRUE (_td_client1->received > 0);\r
+  EXPECT_TRUE (_td_client2->received > 0);\r
+\r
+  _free_test_data (_td_server);\r
+  _free_test_data (_td_client1);\r
+  _free_test_data (_td_client2);\r
+}\r
+\r
 /**\r
  * @brief Create edge handle - invalid param.\r
  */\r
@@ -182,28 +403,27 @@ TEST(edge, releaseHandleInvalidParam02_n)
 TEST(edge, setEventCbSetNullCallback)\r
 {\r
   nns_edge_h edge_h;\r
-  ne_event_cb_test_s *event_data;\r
+  ne_test_data_s *_td;\r
   int ret;\r
 \r
-  event_data = (ne_event_cb_test_s *) malloc (sizeof (ne_event_cb_test_s));\r
-  memset (event_data, 0, sizeof (ne_event_cb_test_s));\r
+  _td = _get_test_data (false);\r
 \r
   ret = nns_edge_create_handle ("temp-id", "temp-topic", &edge_h);\r
   EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);\r
 \r
-  ret = nns_edge_set_event_callback (edge_h, _test_edge_event_cb, event_data);\r
+  ret = nns_edge_set_event_callback (edge_h, _test_edge_event_cb, _td);\r
   EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);\r
 \r
   /* Set null param to clear event callback. */\r
   ret = nns_edge_set_event_callback (edge_h, NULL, NULL);\r
   EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);\r
 \r
-  EXPECT_TRUE (event_data->callback_released);\r
+  EXPECT_TRUE (_td->event_cb_released);\r
 \r
   ret = nns_edge_release_handle (edge_h);\r
   EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);\r
 \r
-  free (event_data);\r
+  _free_test_data (_td);\r
 }\r
 \r
 /**\r
@@ -224,11 +444,10 @@ TEST(edge, setEventCbInvalidParam02_n)
 {\r
   nns_edge_h edge_h;\r
   nns_edge_handle_s *eh;\r
-  ne_event_cb_test_s *event_data;\r
+  ne_test_data_s *_td;\r
   int ret;\r
 \r
-  event_data = (ne_event_cb_test_s *) malloc (sizeof (ne_event_cb_test_s));\r
-  memset (event_data, 0, sizeof (ne_event_cb_test_s));\r
+  _td = _get_test_data (false);\r
 \r
   ret = nns_edge_create_handle ("temp-id", "temp-topic", &edge_h);\r
   EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);\r
@@ -236,7 +455,7 @@ TEST(edge, setEventCbInvalidParam02_n)
   eh = (nns_edge_handle_s *) edge_h;\r
   eh->magic = NNS_EDGE_MAGIC_DEAD;\r
 \r
-  ret = nns_edge_set_event_callback (edge_h, _test_edge_event_cb, event_data);\r
+  ret = nns_edge_set_event_callback (edge_h, _test_edge_event_cb, _td);\r
   EXPECT_NE (ret, NNS_EDGE_ERROR_NONE);\r
 \r
   eh->magic = NNS_EDGE_MAGIC;\r
@@ -244,7 +463,7 @@ TEST(edge, setEventCbInvalidParam02_n)
   ret = nns_edge_release_handle (edge_h);\r
   EXPECT_EQ (ret, NNS_EDGE_ERROR_NONE);\r
 \r
-  free (event_data);\r
+  _free_test_data (_td);\r
 }\r
 \r
 /**\r