#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
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
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
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
{\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
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
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