From 7a07a2901180734fecdb4aca935c70cf8a76c87d Mon Sep 17 00:00:00 2001 From: Ayush Garg Date: Mon, 7 Mar 2022 18:36:15 +0530 Subject: [PATCH] LE CoC: Add unit test for L2CAP_LE type socket connection 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 To avoid build conflict please merge this patch after merging framework patch: (Icf4d8a51acc444765a9b61224a3a5d3fd26bfa65) Change-Id: Ic6adf2738155b3334ce77dbff149b3e04a78a94f Signed-off-by: Ayush Garg Signed-off-by: Anuj Jain --- tests/test/bt_unit_test.c | 188 +++++++++++++++++++++++++++++++++++++- tests/test/bt_unit_test.h | 14 +++ 2 files changed, 201 insertions(+), 1 deletion(-) diff --git a/tests/test/bt_unit_test.c b/tests/test/bt_unit_test.c index 8f0bd16..b0fe75a 100644 --- a/tests/test/bt_unit_test.c +++ b/tests/test/bt_unit_test.c @@ -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; @@ -478,6 +482,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}, @@ -2115,6 +2147,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) { @@ -3612,7 +3665,8 @@ 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"); + // TC_PRT("Select advertising data \n (0 : Service uuid, 1: Service solicitation 2 : Appearance & Tx power, 3 : All, 4 : ANCS, 6: Multiple service 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: @@ -3726,6 +3780,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); @@ -4885,6 +4942,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]; @@ -5053,6 +5113,20 @@ int test_input_callback(void *data) 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; @@ -6000,6 +6074,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; diff --git a/tests/test/bt_unit_test.h b/tests/test/bt_unit_test.h index 5bdc38a..d73efeb 100644 --- a/tests/test/bt_unit_test.h +++ b/tests/test/bt_unit_test.h @@ -199,6 +199,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, -- 2.34.1