LE CoC: Add unit test for L2CAP_LE type socket connection 66/272066/2 accepted/tizen/unified/20220318.133054 submit/tizen/20220313.220938 submit/tizen/20220314.225934 submit/tizen/20220316.003414 submit/tizen/20220317.013237
authorAyush Garg <ayush.garg@samsung.com>
Mon, 7 Mar 2022 13:06:15 +0000 (18:36 +0530)
committerAyush Garg <ayush.garg@samsung.com>
Tue, 8 Mar 2022 10:29:18 +0000 (15:59 +0530)
This patch adds the following unit test for L2CAP_LE type socket:
- create socket
- destroy socket
- listen socket
- connect socket
- Accept and Reject socket connection
- get psm of listening socket

Change-Id: Ic6adf2738155b3334ce77dbff149b3e04a78a94f
Signed-off-by: Ayush Garg <ayush.garg@samsung.com>
tests/test/bt_unit_test.c
tests/test/bt_unit_test.h

index f74ccc2..9f7299d 100644 (file)
@@ -83,6 +83,10 @@ static int custom_client_fd;
 static int ipsp_server_sock = 0;
 static int ipsp_client_sock = 0;
 
+static int l2cap_psm;
+static int l2cap_le_server_fd;
+static int l2cap_le_client_fd;
+
 static int bt_onoff_cnt = 0;
 static int bt_onoff_cnt_success = 0;
 static int bt_onoff_cnt_fail = 0;
@@ -484,6 +488,34 @@ tc_table_t tc_socket[] = {
                , BT_UNIT_TEST_FUNCTION_SOCKET_SET_CONNECTION_STATE_CHANGED_CB},
        {"bt_socket_unset_connection_state_changed_cb"
                , BT_UNIT_TEST_FUNCTION_SOCKET_UNSET_CONNECTION_STATE_CHANGED_CB},
+       {"bt_socket_create_l2cap_channel"
+               , BT_UNIT_TEST_FUNCTION_SOCKET_CREATE_L2CAP_CHANNEL},
+       {"bt_socket_destroy_l2cap_channel"
+               , BT_UNIT_TEST_FUNCTION_SOCKET_DESTROY_L2CAP_CHANNEL},
+       {"bt_socket_listen_and_accept_l2cap_channel"
+               , BT_UNIT_TEST_FUNCTION_SOCKET_LISTEN_AND_ACCEPT_L2CAP_CHANNEL},
+       {"bt_socket_listen_l2cap_channel"
+               , BT_UNIT_TEST_FUNCTION_SOCKET_LISTEN_L2CAP_CHANNEL},
+       {"bt_socket_accept_l2cap_channel"
+               , BT_UNIT_TEST_FUNCTION_SOCKET_ACCEPT_L2CAP_CHANNEL},
+       {"bt_socket_reject_l2cap_channel"
+               , BT_UNIT_TEST_FUNCTION_SOCKET_REJECT_L2CAP_CHANNEL},
+       {"bt_socket_connect_l2cap_channel"
+               , BT_UNIT_TEST_FUNCTION_SOCKET_CONNECT_L2CAP_CHANNEL},
+       {"bt_socket_disconnect_l2cap_channel"
+               , BT_UNIT_TEST_FUNCTION_SOCKET_DISCONNECT_L2CAP_CHANNEL},
+       {"bt_socket_send_data_l2cap_channel"
+               , BT_UNIT_TEST_FUNCTION_SOCKET_SEND_DATA_L2CAP_CHANNEL},
+       {"bt_socket_get_l2cap_psm"
+               , BT_UNIT_TEST_FUNCTION_SOCKET_GET_L2CAP_PSM},
+       {"bt_socket_set_l2cap_channel_connection_requested_cb"
+               , BT_UNIT_TEST_FUNCTION_SOCKET_SET_L2CAP_CHANNEL_CONNECTION_REQUESTED_CB},
+       {"bt_socket_unset_l2cap_channel_connection_requested_cb"
+               , BT_UNIT_TEST_FUNCTION_SOCKET_UNSET_L2CAP_CHANNEL_CONNECTION_REQUESTED_CB},
+       {"bt_socket_set_l2cap_channel_connection_state_changed_cb"
+               , BT_UNIT_TEST_FUNCTION_SOCKET_SET_L2CAP_CHANNEL_CONNECTION_STATE_CHANGED_CB},
+       {"bt_socket_unset_l2cap_channel_connection_state_changed_cb"
+               , BT_UNIT_TEST_FUNCTION_SOCKET_UNSET_L2CAP_CHANNEL_CONNECTION_STATE_CHANGED_CB},
        {"Select this menu to set parameters and then select the function again."
                , BT_UNIT_TEST_FUNCTION_ACTIVATE_FLAG_TO_SET_PARAMETERS},
        {NULL                                   , 0x0000},
@@ -2122,6 +2154,27 @@ static void __bt_socket_connection_state_changed_cb(int result,
        }
 }
 
+static void __bt_socket_l2cap_channel_connection_state_changed_cb(int result,
+               bt_socket_connection_state_e connection_state,
+               bt_socket_l2cap_le_connection_s *connection,
+               void *user_data)
+{
+       TC_PRT("result: %s", __bt_get_error_message(result));
+       TC_PRT("connection_state: %d", connection_state);
+
+       if (connection == NULL) {
+               TC_PRT("No connection data!");
+               return;
+       }
+
+       TC_PRT("socket fd: %d", connection->socket_fd);
+       TC_PRT("server socket fd: %d", connection->server_fd);
+       TC_PRT("role: %d", connection->local_role);
+       TC_PRT("remote address: %s", connection->remote_address);
+       TC_PRT("PSM: %d", connection->psm);
+       l2cap_le_client_fd = connection->socket_fd;
+}
+
 static void __bt_adapter_le_state_changed_cb(int result,
                bt_adapter_le_state_e adapter_le_state, void *user_data)
 {
@@ -3621,7 +3674,7 @@ int test_set_params(int test_id, char *param)
                        break;
                case BT_UNIT_TEST_FUNCTION_ADAPTER_LE_ADD_ADVERTISING_DATA:
                        param_count = 1;
-                       TC_PRT("Select advertising data \n (0 : Service uuid, 1: Service solicitation 2 : Appearance & Tx power, 3 : All, 4 : ANCS, 6: Multiple service data, 7: Transport discovery data");
+                       TC_PRT("Select advertising data \n (0 : Service uuid, 1: Service solicitation 2 : Appearance & Tx power, 3 : All, 4 : ANCS, 6: Multiple service data, 7: Transport discovery data, 8: L2CAP CoC PSM data");
                        TC_PRT("\t (Default scan response : Service Data &Local name & Manufacturer data)");
                        break;
                case BT_UNIT_TEST_FUNCTION_ADAPTER_LE_SET_ADVERTISING_MODE:
@@ -3746,6 +3799,9 @@ int test_set_params(int test_id, char *param)
                case BT_UNIT_TEST_FUNCTION_SOCKET_CREATE_RFCOMM_CUSTOM_UUID:
                case BT_UNIT_TEST_FUNCTION_SOCKET_CONNECT_RFCOMM_CUSTOM_UUID:
                case BT_UNIT_TEST_FUNCTION_SOCKET_SEND_DATA:
+               case BT_UNIT_TEST_FUNCTION_SOCKET_CREATE_L2CAP_CHANNEL:
+               case BT_UNIT_TEST_FUNCTION_SOCKET_CONNECT_L2CAP_CHANNEL:
+               case BT_UNIT_TEST_FUNCTION_SOCKET_SEND_DATA_L2CAP_CHANNEL:
                        param_count = 1;
                        param_type = BT_UNIT_TEST_PARAM_TYPE_STRING;
                        TC_PRT("Input param(%d) type:%s", param_index + 1, param_type);
@@ -4905,6 +4961,9 @@ int test_input_callback(void *data)
                        const char *ams_uuid_128 = "89D3502B-0F36-433A-8EF4-C502AD55F8DC";
                        int appearance = 192;  /* 192 is generic watch */
                        const char *hid_svc_uuid_16 = "1812";
+                       char l2cap_le_service_data[1];
+                       const char *l2cap_le_custom_uuid_16 = "c0c1";
+                       l2cap_le_service_data[0] = l2cap_psm;
 
                        advertiser = advertiser_list[advertiser_index];
 
@@ -5085,6 +5144,19 @@ int test_input_callback(void *data)
                                        TC_PRT("set transport discovery data [0x%04x]", ret);
                                }
                                return 0;
+                       case 8: /* L2cap CoC socket data */
+                               ret = bt_adapter_le_add_advertising_service_uuid(advertiser,
+                                               BT_ADAPTER_LE_PACKET_ADVERTISING, l2cap_le_custom_uuid_16);
+                               if (ret != BT_ERROR_NONE)
+                                       TC_PRT("add service_uuid [0x%04x]", ret);
+
+                               ret = bt_adapter_le_add_advertising_service_data(advertiser,
+                                       BT_ADAPTER_LE_PACKET_ADVERTISING, l2cap_le_custom_uuid_16,
+                                       l2cap_le_service_data, sizeof(l2cap_le_service_data));
+                               if (ret != BT_ERROR_NONE)
+                                       TC_PRT("add service_data [0x%04x]", ret);
+
+                               return 0;
                        default:
                                TC_PRT("No adv data");
                                break;
@@ -6093,6 +6165,118 @@ int test_input_callback(void *data)
                        ret = bt_socket_unset_connection_state_changed_cb();
                        TC_PRT("returns %s\n", __bt_get_error_message(ret));
                        break;
+               case BT_UNIT_TEST_FUNCTION_SOCKET_CREATE_L2CAP_CHANNEL: {
+                       int socket_fd = 0;
+                       l2cap_psm = 37;
+
+                       if (g_test_param.param_count > 0) {
+                               l2cap_psm = atoi(g_test_param.params[0]);
+                               ret = bt_socket_create_l2cap_channel(l2cap_psm, &socket_fd);
+                               __bt_free_test_param(&g_test_param);
+                       } else {
+                               ret = bt_socket_create_l2cap_channel(l2cap_psm, &socket_fd);
+                       }
+
+                       if (ret < BT_ERROR_NONE) {
+                               TC_PRT("returns %s\n", __bt_get_error_message(ret));
+                       } else {
+                               TC_PRT("socket_fd: %d", socket_fd);
+                               l2cap_le_server_fd = socket_fd;
+                       }
+                       break;
+               }
+               case BT_UNIT_TEST_FUNCTION_SOCKET_DESTROY_L2CAP_CHANNEL:
+                       ret = bt_socket_destroy_l2cap_channel(l2cap_le_server_fd);
+                       TC_PRT("returns %s\n", __bt_get_error_message(ret));
+                       break;
+               case BT_UNIT_TEST_FUNCTION_SOCKET_LISTEN_AND_ACCEPT_L2CAP_CHANNEL:
+                       ret = bt_socket_listen_and_accept_l2cap_channel(l2cap_le_server_fd, 1);
+                       TC_PRT("returns %s\n", __bt_get_error_message(ret));
+                       break;
+               case BT_UNIT_TEST_FUNCTION_SOCKET_LISTEN_L2CAP_CHANNEL:
+                       ret = bt_socket_listen_l2cap_channel(l2cap_le_server_fd, 1);
+                       TC_PRT("returns %s\n", __bt_get_error_message(ret));
+                       break;
+               case BT_UNIT_TEST_FUNCTION_SOCKET_ACCEPT_L2CAP_CHANNEL: {
+                       int socket_fd = 0;
+
+                       ret = bt_socket_accept_l2cap_channel(l2cap_le_server_fd);
+                       if (ret < BT_ERROR_NONE) {
+                               TC_PRT("returns %s\n", __bt_get_error_message(ret));
+                       } else {
+                               TC_PRT("socket_fd: %d", socket_fd);
+                               l2cap_le_client_fd = socket_fd;
+                       }
+                       break;
+               }
+               case BT_UNIT_TEST_FUNCTION_SOCKET_REJECT_L2CAP_CHANNEL:
+                       ret = bt_socket_reject_l2cap_channel(l2cap_le_server_fd);
+                       TC_PRT("returns %s\n", __bt_get_error_message(ret));
+                       break;
+               case BT_UNIT_TEST_FUNCTION_SOCKET_CONNECT_L2CAP_CHANNEL: {
+                       l2cap_psm = 37;
+
+                       if (g_test_param.param_count > 0) {
+                               l2cap_psm = atoi(g_test_param.params[0]);
+                               ret = bt_socket_connect_l2cap_channel(remote_addr, l2cap_psm);
+                               __bt_free_test_param(&g_test_param);
+                       } else {
+                               ret = bt_socket_connect_l2cap_channel(remote_addr, l2cap_psm);
+                       }
+
+                       TC_PRT("returns %s\n", __bt_get_error_message(ret));
+                       break;
+               }
+               case BT_UNIT_TEST_FUNCTION_SOCKET_DISCONNECT_L2CAP_CHANNEL:
+                       ret = bt_socket_disconnect_l2cap_channel(l2cap_le_client_fd);
+                       TC_PRT("returns %s\n", __bt_get_error_message(ret));
+                       break;
+               case BT_UNIT_TEST_FUNCTION_SOCKET_SEND_DATA_L2CAP_CHANNEL: {
+                       char data[] = "Sending some test data";
+
+                       if (g_test_param.param_count > 0) {
+                               ret = bt_socket_send_data_l2cap_channel(l2cap_le_client_fd,
+                                       g_test_param.params[0],
+                                       strlen(g_test_param.params[0]) + 1);
+
+                               __bt_free_test_param(&g_test_param);
+                       } else {
+                               ret = bt_socket_send_data_l2cap_channel(l2cap_le_client_fd,
+                                       data, sizeof(data));
+                       }
+
+                       TC_PRT("returns %d %s\n", ret, __bt_get_error_message(ret));
+                       break;
+               }
+               case BT_UNIT_TEST_FUNCTION_SOCKET_GET_L2CAP_PSM: {
+                       int psm = -1;
+                       ret = bt_socket_get_l2cap_psm(l2cap_le_server_fd, &psm);
+                       if (ret < BT_ERROR_NONE) {
+                               TC_PRT("returns %s\n", __bt_get_error_message(ret));
+                       } else {
+                               TC_PRT("psm %d\n", psm);
+                               l2cap_psm = psm;
+                       }
+                       break;
+               }
+               case BT_UNIT_TEST_FUNCTION_SOCKET_SET_L2CAP_CHANNEL_CONNECTION_REQUESTED_CB:
+                       ret = bt_socket_set_l2cap_channel_connection_requested_cb(
+                               __bt_socket_connection_requested_cb, NULL);
+                       TC_PRT("returns %s\n", __bt_get_error_message(ret));
+                       break;
+               case BT_UNIT_TEST_FUNCTION_SOCKET_UNSET_L2CAP_CHANNEL_CONNECTION_REQUESTED_CB:
+                       ret = bt_socket_unset_l2cap_channel_connection_requested_cb();
+                       TC_PRT("returns %s\n", __bt_get_error_message(ret));
+                       break;
+               case BT_UNIT_TEST_FUNCTION_SOCKET_SET_L2CAP_CHANNEL_CONNECTION_STATE_CHANGED_CB:
+                       ret = bt_socket_set_l2cap_channel_connection_state_changed_cb(
+                               __bt_socket_l2cap_channel_connection_state_changed_cb, NULL);
+                       TC_PRT("returns %s\n", __bt_get_error_message(ret));
+                       break;
+               case BT_UNIT_TEST_FUNCTION_SOCKET_UNSET_L2CAP_CHANNEL_CONNECTION_STATE_CHANGED_CB:
+                       ret = bt_socket_unset_l2cap_channel_connection_state_changed_cb();
+                       TC_PRT("returns %s\n", __bt_get_error_message(ret));
+                       break;
 
                case BT_UNIT_TEST_FUNCTION_ACTIVATE_FLAG_TO_SET_PARAMETERS:
                        need_to_set_params = true;
index 3a60323..4edecf5 100644 (file)
@@ -202,6 +202,20 @@ typedef enum {
        BT_UNIT_TEST_FUNCTION_SOCKET_UNSET_CONNECTION_REQUESTED_CB,
        BT_UNIT_TEST_FUNCTION_SOCKET_SET_CONNECTION_STATE_CHANGED_CB,
        BT_UNIT_TEST_FUNCTION_SOCKET_UNSET_CONNECTION_STATE_CHANGED_CB,
+       BT_UNIT_TEST_FUNCTION_SOCKET_CREATE_L2CAP_CHANNEL,
+       BT_UNIT_TEST_FUNCTION_SOCKET_DESTROY_L2CAP_CHANNEL,
+       BT_UNIT_TEST_FUNCTION_SOCKET_LISTEN_AND_ACCEPT_L2CAP_CHANNEL,
+       BT_UNIT_TEST_FUNCTION_SOCKET_LISTEN_L2CAP_CHANNEL,
+       BT_UNIT_TEST_FUNCTION_SOCKET_ACCEPT_L2CAP_CHANNEL,
+       BT_UNIT_TEST_FUNCTION_SOCKET_REJECT_L2CAP_CHANNEL,
+       BT_UNIT_TEST_FUNCTION_SOCKET_CONNECT_L2CAP_CHANNEL,
+       BT_UNIT_TEST_FUNCTION_SOCKET_DISCONNECT_L2CAP_CHANNEL,
+       BT_UNIT_TEST_FUNCTION_SOCKET_SEND_DATA_L2CAP_CHANNEL,
+       BT_UNIT_TEST_FUNCTION_SOCKET_GET_L2CAP_PSM,
+       BT_UNIT_TEST_FUNCTION_SOCKET_SET_L2CAP_CHANNEL_CONNECTION_REQUESTED_CB,
+       BT_UNIT_TEST_FUNCTION_SOCKET_UNSET_L2CAP_CHANNEL_CONNECTION_REQUESTED_CB,
+       BT_UNIT_TEST_FUNCTION_SOCKET_SET_L2CAP_CHANNEL_CONNECTION_STATE_CHANGED_CB,
+       BT_UNIT_TEST_FUNCTION_SOCKET_UNSET_L2CAP_CHANNEL_CONNECTION_STATE_CHANGED_CB,
        BT_UNIT_TEST_FUNCTION_OPP_CLIENT_INITIALIZE = 1,
        BT_UNIT_TEST_FUNCTION_OPP_CLIENT_DEINITIALIZE,
        BT_UNIT_TEST_FUNCTION_OPP_CLIENT_ADD_FILE,