| /* |
| * Copyright 2021 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include <gtest/gtest.h> |
| |
| #include <future> |
| #include <map> |
| |
| #include "bta/include/bta_ag_api.h" |
| #include "bta/include/bta_av_api.h" |
| #include "bta/include/bta_hd_api.h" |
| #include "bta/include/bta_hf_client_api.h" |
| #include "bta/include/bta_hh_api.h" |
| #include "btcore/include/module.h" |
| #include "btif/include/btif_api.h" |
| #include "btif/include/btif_common.h" |
| #include "btif/include/btif_util.h" |
| #include "include/hardware/bluetooth.h" |
| #include "include/hardware/bt_av.h" |
| #include "test/common/core_interface.h" |
| #include "types/raw_address.h" |
| |
| void set_hal_cbacks(bt_callbacks_t* callbacks); |
| |
| uint8_t appl_trace_level = BT_TRACE_LEVEL_DEBUG; |
| uint8_t btif_trace_level = BT_TRACE_LEVEL_DEBUG; |
| uint8_t btu_trace_level = BT_TRACE_LEVEL_DEBUG; |
| |
| const tBTA_AG_RES_DATA tBTA_AG_RES_DATA::kEmpty = {}; |
| |
| module_t bt_utils_module; |
| module_t gd_controller_module; |
| module_t gd_shim_module; |
| module_t osi_module; |
| module_t rust_module; |
| |
| namespace { |
| |
| auto timeout_time = std::chrono::seconds(3); |
| |
| std::map<std::string, std::function<void()>> callback_map_; |
| #define TESTCB \ |
| if (callback_map_.find(__func__) != callback_map_.end()) \ |
| callback_map_[__func__](); |
| |
| void adapter_state_changed_callback(bt_state_t state) {} |
| void adapter_properties_callback(bt_status_t status, int num_properties, |
| bt_property_t* properties) {} |
| void remote_device_properties_callback(bt_status_t status, RawAddress* bd_addr, |
| int num_properties, |
| bt_property_t* properties) {} |
| void device_found_callback(int num_properties, bt_property_t* properties) {} |
| void discovery_state_changed_callback(bt_discovery_state_t state) {} |
| void pin_request_callback(RawAddress* remote_bd_addr, bt_bdname_t* bd_name, |
| uint32_t cod, bool min_16_digit) {} |
| void ssp_request_callback(RawAddress* remote_bd_addr, bt_bdname_t* bd_name, |
| uint32_t cod, bt_ssp_variant_t pairing_variant, |
| uint32_t pass_key) {} |
| void bond_state_changed_callback(bt_status_t status, RawAddress* remote_bd_addr, |
| bt_bond_state_t state, int fail_reason) {} |
| void address_consolidate_callback(RawAddress* main_bd_addr, |
| RawAddress* secondary_bd_addr) {} |
| void le_address_associate_callback(RawAddress* main_bd_addr, |
| RawAddress* secondary_bd_addr) {} |
| void acl_state_changed_callback(bt_status_t status, RawAddress* remote_bd_addr, |
| bt_acl_state_t state, int transport_link_type, |
| bt_hci_error_code_t hci_reason, |
| bt_conn_direction_t direction, |
| uint16_t acl_handle) {} |
| void link_quality_report_callback(uint64_t timestamp, int report_id, int rssi, |
| int snr, int retransmission_count, |
| int packets_not_receive_count, |
| int negative_acknowledgement_count) {} |
| void callback_thread_event(bt_cb_thread_evt evt) { TESTCB; } |
| void dut_mode_recv_callback(uint16_t opcode, uint8_t* buf, uint8_t len) {} |
| void le_test_mode_callback(bt_status_t status, uint16_t num_packets) {} |
| void energy_info_callback(bt_activity_energy_info* energy_info, |
| bt_uid_traffic_t* uid_data) {} |
| void generate_local_oob_data_callback(tBT_TRANSPORT transport, |
| bt_oob_data_t oob_data) {} |
| void switch_buffer_size_callback(bool is_low_latency_buffer_size) {} |
| void switch_codec_callback(bool is_low_latency_buffer_size) {} |
| #undef TESTCB |
| |
| bt_callbacks_t callbacks = { |
| .size = sizeof(bt_callbacks_t), |
| .adapter_state_changed_cb = adapter_state_changed_callback, |
| .adapter_properties_cb = adapter_properties_callback, |
| .remote_device_properties_cb = remote_device_properties_callback, |
| .device_found_cb = device_found_callback, |
| .discovery_state_changed_cb = discovery_state_changed_callback, |
| .pin_request_cb = pin_request_callback, |
| .ssp_request_cb = ssp_request_callback, |
| .bond_state_changed_cb = bond_state_changed_callback, |
| .address_consolidate_cb = address_consolidate_callback, |
| .le_address_associate_cb = le_address_associate_callback, |
| .acl_state_changed_cb = acl_state_changed_callback, |
| .thread_evt_cb = callback_thread_event, |
| .dut_mode_recv_cb = dut_mode_recv_callback, |
| .le_test_mode_cb = le_test_mode_callback, |
| .energy_info_cb = energy_info_callback, |
| .link_quality_report_cb = link_quality_report_callback, |
| .generate_local_oob_data_cb = generate_local_oob_data_callback, |
| .switch_buffer_size_cb = switch_buffer_size_callback, |
| .switch_codec_cb = switch_codec_callback, |
| }; |
| |
| } // namespace |
| |
| class BtifCoreTest : public ::testing::Test { |
| protected: |
| void SetUp() override { |
| callback_map_.clear(); |
| set_hal_cbacks(&callbacks); |
| auto promise = std::promise<void>(); |
| auto future = promise.get_future(); |
| callback_map_["callback_thread_event"] = [&promise]() { |
| promise.set_value(); |
| }; |
| InitializeCoreInterface(); |
| ASSERT_EQ(std::future_status::ready, future.wait_for(timeout_time)); |
| callback_map_.erase("callback_thread_event"); |
| } |
| |
| void TearDown() override { |
| auto promise = std::promise<void>(); |
| auto future = promise.get_future(); |
| callback_map_["callback_thread_event"] = [&promise]() { |
| promise.set_value(); |
| }; |
| CleanCoreInterface(); |
| ASSERT_EQ(std::future_status::ready, future.wait_for(timeout_time)); |
| callback_map_.erase("callback_thread_event"); |
| } |
| }; |
| |
| std::promise<int> promise0; |
| void callback0(int val) { promise0.set_value(val); } |
| |
| TEST_F(BtifCoreTest, test_post_on_bt_simple0) { |
| const int val = 123; |
| promise0 = std::promise<int>(); |
| std::future<int> future0 = promise0.get_future(); |
| post_on_bt_jni([=]() { callback0(val); }); |
| ASSERT_EQ(std::future_status::ready, future0.wait_for(timeout_time)); |
| ASSERT_EQ(val, future0.get()); |
| } |
| |
| TEST_F(BtifCoreTest, test_post_on_bt_jni_simple1) { |
| std::promise<void> promise; |
| std::future<void> future = promise.get_future(); |
| post_on_bt_jni([=, &promise]() { promise.set_value(); }); |
| ASSERT_EQ(std::future_status::ready, future.wait_for(timeout_time)); |
| } |
| |
| TEST_F(BtifCoreTest, test_post_on_bt_jni_simple2) { |
| std::promise<void> promise; |
| std::future<void> future = promise.get_future(); |
| BtJniClosure closure = [&promise]() { promise.set_value(); }; |
| post_on_bt_jni(closure); |
| ASSERT_EQ(std::future_status::ready, future.wait_for(timeout_time)); |
| } |
| |
| TEST_F(BtifCoreTest, test_post_on_bt_jni_simple3) { |
| const int val = 456; |
| std::promise<int> promise; |
| auto future = promise.get_future(); |
| BtJniClosure closure = [&promise, val]() { promise.set_value(val); }; |
| post_on_bt_jni(closure); |
| ASSERT_EQ(std::future_status::ready, future.wait_for(timeout_time)); |
| ASSERT_EQ(val, future.get()); |
| } |
| |
| extern const char* dump_av_sm_event_name(int event); |
| TEST_F(BtifCoreTest, dump_av_sm_event_name) { |
| std::vector<std::pair<int, std::string>> events = { |
| std::make_pair(BTA_AV_ENABLE_EVT, "BTA_AV_ENABLE_EVT"), |
| std::make_pair(BTA_AV_REGISTER_EVT, "BTA_AV_REGISTER_EVT"), |
| std::make_pair(BTA_AV_OPEN_EVT, "BTA_AV_OPEN_EVT"), |
| std::make_pair(BTA_AV_CLOSE_EVT, "BTA_AV_CLOSE_EVT"), |
| std::make_pair(BTA_AV_START_EVT, "BTA_AV_START_EVT"), |
| std::make_pair(BTA_AV_STOP_EVT, "BTA_AV_STOP_EVT"), |
| std::make_pair(BTA_AV_PROTECT_REQ_EVT, "BTA_AV_PROTECT_REQ_EVT"), |
| std::make_pair(BTA_AV_PROTECT_RSP_EVT, "BTA_AV_PROTECT_RSP_EVT"), |
| std::make_pair(BTA_AV_RC_OPEN_EVT, "BTA_AV_RC_OPEN_EVT"), |
| std::make_pair(BTA_AV_RC_CLOSE_EVT, "BTA_AV_RC_CLOSE_EVT"), |
| std::make_pair(BTA_AV_RC_BROWSE_OPEN_EVT, "BTA_AV_RC_BROWSE_OPEN_EVT"), |
| std::make_pair(BTA_AV_RC_BROWSE_CLOSE_EVT, "BTA_AV_RC_BROWSE_CLOSE_EVT"), |
| std::make_pair(BTA_AV_REMOTE_CMD_EVT, "BTA_AV_REMOTE_CMD_EVT"), |
| std::make_pair(BTA_AV_REMOTE_RSP_EVT, "BTA_AV_REMOTE_RSP_EVT"), |
| std::make_pair(BTA_AV_VENDOR_CMD_EVT, "BTA_AV_VENDOR_CMD_EVT"), |
| std::make_pair(BTA_AV_VENDOR_RSP_EVT, "BTA_AV_VENDOR_RSP_EVT"), |
| std::make_pair(BTA_AV_RECONFIG_EVT, "BTA_AV_RECONFIG_EVT"), |
| std::make_pair(BTA_AV_SUSPEND_EVT, "BTA_AV_SUSPEND_EVT"), |
| std::make_pair(BTA_AV_PENDING_EVT, "BTA_AV_PENDING_EVT"), |
| std::make_pair(BTA_AV_META_MSG_EVT, "BTA_AV_META_MSG_EVT"), |
| std::make_pair(BTA_AV_REJECT_EVT, "BTA_AV_REJECT_EVT"), |
| std::make_pair(BTA_AV_RC_FEAT_EVT, "BTA_AV_RC_FEAT_EVT"), |
| std::make_pair(BTA_AV_RC_PSM_EVT, "BTA_AV_RC_PSM_EVT"), |
| std::make_pair(BTA_AV_OFFLOAD_START_RSP_EVT, |
| "BTA_AV_OFFLOAD_START_RSP_EVT"), |
| }; |
| for (const auto& event : events) { |
| ASSERT_STREQ(event.second.c_str(), dump_av_sm_event_name(event.first)); |
| } |
| std::ostringstream oss; |
| oss << "UNKNOWN_EVENT"; |
| ASSERT_STREQ(oss.str().c_str(), |
| dump_av_sm_event_name(std::numeric_limits<int>::max())); |
| } |
| |
| TEST_F(BtifCoreTest, dump_dm_search_event) { |
| std::vector<std::pair<uint16_t, std::string>> events = { |
| std::make_pair(BTA_DM_INQ_RES_EVT, "BTA_DM_INQ_RES_EVT"), |
| std::make_pair(BTA_DM_INQ_CMPL_EVT, "BTA_DM_INQ_CMPL_EVT"), |
| std::make_pair(BTA_DM_DISC_RES_EVT, "BTA_DM_DISC_RES_EVT"), |
| std::make_pair(BTA_DM_GATT_OVER_LE_RES_EVT, |
| "BTA_DM_GATT_OVER_LE_RES_EVT"), |
| std::make_pair(BTA_DM_DISC_CMPL_EVT, "BTA_DM_DISC_CMPL_EVT"), |
| std::make_pair(BTA_DM_SEARCH_CANCEL_CMPL_EVT, |
| "BTA_DM_SEARCH_CANCEL_CMPL_EVT"), |
| std::make_pair(BTA_DM_GATT_OVER_SDP_RES_EVT, |
| "BTA_DM_GATT_OVER_SDP_RES_EVT"), |
| }; |
| for (const auto& event : events) { |
| ASSERT_STREQ(event.second.c_str(), dump_dm_search_event(event.first)); |
| } |
| std::ostringstream oss; |
| oss << "UNKNOWN MSG ID"; |
| ASSERT_STREQ(oss.str().c_str(), |
| dump_dm_search_event(std::numeric_limits<uint16_t>::max())); |
| } |
| |
| TEST_F(BtifCoreTest, dump_property_type) { |
| std::vector<std::pair<bt_property_type_t, std::string>> types = { |
| std::make_pair(BT_PROPERTY_BDNAME, "BT_PROPERTY_BDNAME"), |
| std::make_pair(BT_PROPERTY_BDADDR, "BT_PROPERTY_BDADDR"), |
| std::make_pair(BT_PROPERTY_UUIDS, "BT_PROPERTY_UUIDS"), |
| std::make_pair(BT_PROPERTY_CLASS_OF_DEVICE, |
| "BT_PROPERTY_CLASS_OF_DEVICE"), |
| std::make_pair(BT_PROPERTY_TYPE_OF_DEVICE, "BT_PROPERTY_TYPE_OF_DEVICE"), |
| std::make_pair(BT_PROPERTY_REMOTE_RSSI, "BT_PROPERTY_REMOTE_RSSI"), |
| std::make_pair(BT_PROPERTY_ADAPTER_DISCOVERABLE_TIMEOUT, |
| "BT_PROPERTY_ADAPTER_DISCOVERABLE_TIMEOUT"), |
| std::make_pair(BT_PROPERTY_ADAPTER_BONDED_DEVICES, |
| "BT_PROPERTY_ADAPTER_BONDED_DEVICES"), |
| std::make_pair(BT_PROPERTY_ADAPTER_SCAN_MODE, |
| "BT_PROPERTY_ADAPTER_SCAN_MODE"), |
| std::make_pair(BT_PROPERTY_REMOTE_FRIENDLY_NAME, |
| "BT_PROPERTY_REMOTE_FRIENDLY_NAME"), |
| }; |
| for (const auto& type : types) { |
| ASSERT_STREQ(type.second.c_str(), dump_property_type(type.first)); |
| } |
| std::ostringstream oss; |
| oss << "UNKNOWN PROPERTY ID"; |
| ASSERT_STREQ(oss.str().c_str(), |
| dump_property_type(static_cast<bt_property_type_t>( |
| std::numeric_limits<uint16_t>::max()))); |
| } |
| |
| TEST_F(BtifCoreTest, dump_dm_event) { |
| std::vector<std::pair<uint8_t, std::string>> events = { |
| std::make_pair(BTA_DM_PIN_REQ_EVT, "BTA_DM_PIN_REQ_EVT"), |
| std::make_pair(BTA_DM_AUTH_CMPL_EVT, "BTA_DM_AUTH_CMPL_EVT"), |
| std::make_pair(BTA_DM_LINK_UP_EVT, "BTA_DM_LINK_UP_EVT"), |
| std::make_pair(BTA_DM_LINK_DOWN_EVT, "BTA_DM_LINK_DOWN_EVT"), |
| std::make_pair(BTA_DM_BOND_CANCEL_CMPL_EVT, |
| "BTA_DM_BOND_CANCEL_CMPL_EVT"), |
| std::make_pair(BTA_DM_SP_CFM_REQ_EVT, "BTA_DM_SP_CFM_REQ_EVT"), |
| std::make_pair(BTA_DM_SP_KEY_NOTIF_EVT, "BTA_DM_SP_KEY_NOTIF_EVT"), |
| std::make_pair(BTA_DM_BLE_KEY_EVT, "BTA_DM_BLE_KEY_EVT"), |
| std::make_pair(BTA_DM_BLE_SEC_REQ_EVT, "BTA_DM_BLE_SEC_REQ_EVT"), |
| std::make_pair(BTA_DM_BLE_PASSKEY_NOTIF_EVT, |
| "BTA_DM_BLE_PASSKEY_NOTIF_EVT"), |
| std::make_pair(BTA_DM_BLE_PASSKEY_REQ_EVT, "BTA_DM_BLE_PASSKEY_REQ_EVT"), |
| std::make_pair(BTA_DM_BLE_OOB_REQ_EVT, "BTA_DM_BLE_OOB_REQ_EVT"), |
| std::make_pair(BTA_DM_BLE_SC_OOB_REQ_EVT, "BTA_DM_BLE_SC_OOB_REQ_EVT"), |
| std::make_pair(BTA_DM_BLE_LOCAL_IR_EVT, "BTA_DM_BLE_LOCAL_IR_EVT"), |
| std::make_pair(BTA_DM_BLE_LOCAL_ER_EVT, "BTA_DM_BLE_LOCAL_ER_EVT"), |
| std::make_pair(BTA_DM_BLE_AUTH_CMPL_EVT, "BTA_DM_BLE_AUTH_CMPL_EVT"), |
| std::make_pair(BTA_DM_DEV_UNPAIRED_EVT, "BTA_DM_DEV_UNPAIRED_EVT"), |
| std::make_pair(BTA_DM_ENER_INFO_READ, "BTA_DM_ENER_INFO_READ"), |
| }; |
| for (const auto& event : events) { |
| ASSERT_STREQ(event.second.c_str(), dump_dm_event(event.first)); |
| } |
| std::ostringstream oss; |
| oss << "UNKNOWN DM EVENT"; |
| ASSERT_STREQ(oss.str().c_str(), |
| dump_dm_event(std::numeric_limits<uint8_t>::max())); |
| } |
| |
| TEST_F(BtifCoreTest, dump_hf_event) { |
| std::vector<std::pair<uint8_t, std::string>> events = { |
| std::make_pair(BTA_AG_ENABLE_EVT, "BTA_AG_ENABLE_EVT"), |
| std::make_pair(BTA_AG_REGISTER_EVT, "BTA_AG_REGISTER_EVT"), |
| std::make_pair(BTA_AG_OPEN_EVT, "BTA_AG_OPEN_EVT"), |
| std::make_pair(BTA_AG_CLOSE_EVT, "BTA_AG_CLOSE_EVT"), |
| std::make_pair(BTA_AG_CONN_EVT, "BTA_AG_CONN_EVT"), |
| std::make_pair(BTA_AG_AUDIO_OPEN_EVT, "BTA_AG_AUDIO_OPEN_EVT"), |
| std::make_pair(BTA_AG_AUDIO_CLOSE_EVT, "BTA_AG_AUDIO_CLOSE_EVT"), |
| std::make_pair(BTA_AG_SPK_EVT, "BTA_AG_SPK_EVT"), |
| std::make_pair(BTA_AG_MIC_EVT, "BTA_AG_MIC_EVT"), |
| std::make_pair(BTA_AG_AT_CKPD_EVT, "BTA_AG_AT_CKPD_EVT"), |
| std::make_pair(BTA_AG_DISABLE_EVT, "BTA_AG_DISABLE_EVT"), |
| std::make_pair(BTA_AG_CODEC_EVT, "BTA_AG_CODEC_EVT"), |
| std::make_pair(BTA_AG_AT_A_EVT, "BTA_AG_AT_A_EVT"), |
| std::make_pair(BTA_AG_AT_D_EVT, "BTA_AG_AT_D_EVT"), |
| std::make_pair(BTA_AG_AT_CHLD_EVT, "BTA_AG_AT_CHLD_EVT"), |
| std::make_pair(BTA_AG_AT_CHUP_EVT, "BTA_AG_AT_CHUP_EVT"), |
| std::make_pair(BTA_AG_AT_CIND_EVT, "BTA_AG_AT_CIND_EVT"), |
| std::make_pair(BTA_AG_AT_VTS_EVT, "BTA_AG_AT_VTS_EVT"), |
| std::make_pair(BTA_AG_AT_BINP_EVT, "BTA_AG_AT_BINP_EVT"), |
| std::make_pair(BTA_AG_AT_BLDN_EVT, "BTA_AG_AT_BLDN_EVT"), |
| std::make_pair(BTA_AG_AT_BVRA_EVT, "BTA_AG_AT_BVRA_EVT"), |
| std::make_pair(BTA_AG_AT_NREC_EVT, "BTA_AG_AT_NREC_EVT"), |
| std::make_pair(BTA_AG_AT_CNUM_EVT, "BTA_AG_AT_CNUM_EVT"), |
| std::make_pair(BTA_AG_AT_BTRH_EVT, "BTA_AG_AT_BTRH_EVT"), |
| std::make_pair(BTA_AG_AT_CLCC_EVT, "BTA_AG_AT_CLCC_EVT"), |
| std::make_pair(BTA_AG_AT_COPS_EVT, "BTA_AG_AT_COPS_EVT"), |
| std::make_pair(BTA_AG_AT_UNAT_EVT, "BTA_AG_AT_UNAT_EVT"), |
| std::make_pair(BTA_AG_AT_CBC_EVT, "BTA_AG_AT_CBC_EVT"), |
| std::make_pair(BTA_AG_AT_BAC_EVT, "BTA_AG_AT_BAC_EVT"), |
| std::make_pair(BTA_AG_AT_BCS_EVT, "BTA_AG_AT_BCS_EVT"), |
| std::make_pair(BTA_AG_AT_BIND_EVT, "BTA_AG_AT_BIND_EVT"), |
| std::make_pair(BTA_AG_AT_BIEV_EVT, "BTA_AG_AT_BIEV_EVT"), |
| std::make_pair(BTA_AG_AT_BIA_EVT, "BTA_AG_AT_BIA_EVT"), |
| }; |
| for (const auto& event : events) { |
| ASSERT_STREQ(event.second.c_str(), dump_hf_event(event.first)); |
| } |
| std::ostringstream oss; |
| oss << "UNKNOWN MSG ID"; |
| ASSERT_STREQ(oss.str().c_str(), |
| dump_hf_event(std::numeric_limits<uint8_t>::max())); |
| } |
| |
| TEST_F(BtifCoreTest, dump_hf_client_event) { |
| std::vector<std::pair<int, std::string>> events = { |
| std::make_pair(BTA_HF_CLIENT_ENABLE_EVT, "BTA_HF_CLIENT_ENABLE_EVT"), |
| std::make_pair(BTA_HF_CLIENT_REGISTER_EVT, "BTA_HF_CLIENT_REGISTER_EVT"), |
| std::make_pair(BTA_HF_CLIENT_OPEN_EVT, "BTA_HF_CLIENT_OPEN_EVT"), |
| std::make_pair(BTA_HF_CLIENT_CLOSE_EVT, "BTA_HF_CLIENT_CLOSE_EVT"), |
| std::make_pair(BTA_HF_CLIENT_CONN_EVT, "BTA_HF_CLIENT_CONN_EVT"), |
| std::make_pair(BTA_HF_CLIENT_AUDIO_OPEN_EVT, |
| "BTA_HF_CLIENT_AUDIO_OPEN_EVT"), |
| std::make_pair(BTA_HF_CLIENT_AUDIO_MSBC_OPEN_EVT, |
| "BTA_HF_CLIENT_AUDIO_MSBC_OPEN_EVT"), |
| std::make_pair(BTA_HF_CLIENT_AUDIO_CLOSE_EVT, |
| "BTA_HF_CLIENT_AUDIO_CLOSE_EVT"), |
| std::make_pair(BTA_HF_CLIENT_SPK_EVT, "BTA_HF_CLIENT_SPK_EVT"), |
| std::make_pair(BTA_HF_CLIENT_MIC_EVT, "BTA_HF_CLIENT_MIC_EVT"), |
| std::make_pair(BTA_HF_CLIENT_DISABLE_EVT, "BTA_HF_CLIENT_DISABLE_EVT"), |
| std::make_pair(BTA_HF_CLIENT_IND_EVT, "BTA_HF_CLIENT_IND_EVT"), |
| std::make_pair(BTA_HF_CLIENT_VOICE_REC_EVT, |
| "BTA_HF_CLIENT_VOICE_REC_EVT"), |
| std::make_pair(BTA_HF_CLIENT_OPERATOR_NAME_EVT, |
| "BTA_HF_CLIENT_OPERATOR_NAME_EVT"), |
| std::make_pair(BTA_HF_CLIENT_CLIP_EVT, "BTA_HF_CLIENT_CLIP_EVT"), |
| std::make_pair(BTA_HF_CLIENT_CCWA_EVT, "BTA_HF_CLIENT_CCWA_EVT"), |
| std::make_pair(BTA_HF_CLIENT_AT_RESULT_EVT, |
| "BTA_HF_CLIENT_AT_RESULT_EVT"), |
| std::make_pair(BTA_HF_CLIENT_CLCC_EVT, "BTA_HF_CLIENT_CLCC_EVT"), |
| std::make_pair(BTA_HF_CLIENT_CNUM_EVT, "BTA_HF_CLIENT_CNUM_EVT"), |
| std::make_pair(BTA_HF_CLIENT_BTRH_EVT, "BTA_HF_CLIENT_BTRH_EVT"), |
| std::make_pair(BTA_HF_CLIENT_BSIR_EVT, "BTA_HF_CLIENT_BSIR_EVT"), |
| std::make_pair(BTA_HF_CLIENT_BINP_EVT, "BTA_HF_CLIENT_BINP_EVT"), |
| std::make_pair(BTA_HF_CLIENT_RING_INDICATION, |
| "BTA_HF_CLIENT_RING_INDICATION"), |
| }; |
| for (const auto& event : events) { |
| ASSERT_STREQ(event.second.c_str(), dump_hf_client_event(event.first)); |
| } |
| std::ostringstream oss; |
| oss << "UNKNOWN MSG ID"; |
| ASSERT_STREQ(oss.str().c_str(), |
| dump_hf_client_event(std::numeric_limits<uint16_t>::max())); |
| } |
| |
| TEST_F(BtifCoreTest, dump_hh_event) { |
| std::vector<std::pair<int, std::string>> events = { |
| std::make_pair(BTA_HH_ENABLE_EVT, "BTA_HH_ENABLE_EVT"), |
| std::make_pair(BTA_HH_DISABLE_EVT, "BTA_HH_DISABLE_EVT"), |
| std::make_pair(BTA_HH_OPEN_EVT, "BTA_HH_OPEN_EVT"), |
| std::make_pair(BTA_HH_CLOSE_EVT, "BTA_HH_CLOSE_EVT"), |
| std::make_pair(BTA_HH_GET_DSCP_EVT, "BTA_HH_GET_DSCP_EVT"), |
| std::make_pair(BTA_HH_GET_PROTO_EVT, "BTA_HH_GET_PROTO_EVT"), |
| std::make_pair(BTA_HH_GET_RPT_EVT, "BTA_HH_GET_RPT_EVT"), |
| std::make_pair(BTA_HH_GET_IDLE_EVT, "BTA_HH_GET_IDLE_EVT"), |
| std::make_pair(BTA_HH_SET_PROTO_EVT, "BTA_HH_SET_PROTO_EVT"), |
| std::make_pair(BTA_HH_SET_RPT_EVT, "BTA_HH_SET_RPT_EVT"), |
| std::make_pair(BTA_HH_SET_IDLE_EVT, "BTA_HH_SET_IDLE_EVT"), |
| std::make_pair(BTA_HH_VC_UNPLUG_EVT, "BTA_HH_VC_UNPLUG_EVT"), |
| std::make_pair(BTA_HH_ADD_DEV_EVT, "BTA_HH_ADD_DEV_EVT"), |
| std::make_pair(BTA_HH_RMV_DEV_EVT, "BTA_HH_RMV_DEV_EVT"), |
| std::make_pair(BTA_HH_API_ERR_EVT, "BTA_HH_API_ERR_EVT"), |
| }; |
| for (const auto& event : events) { |
| ASSERT_STREQ(event.second.c_str(), dump_hh_event(event.first)); |
| } |
| std::ostringstream oss; |
| oss << "UNKNOWN MSG ID"; |
| ASSERT_STREQ(oss.str().c_str(), |
| dump_hh_event(std::numeric_limits<uint16_t>::max())); |
| } |
| |
| TEST_F(BtifCoreTest, dump_hd_event) { |
| std::vector<std::pair<uint16_t, std::string>> events = { |
| std::make_pair(BTA_HD_ENABLE_EVT, "BTA_HD_ENABLE_EVT"), |
| std::make_pair(BTA_HD_DISABLE_EVT, "BTA_HD_DISABLE_EVT"), |
| std::make_pair(BTA_HD_REGISTER_APP_EVT, "BTA_HD_REGISTER_APP_EVT"), |
| std::make_pair(BTA_HD_UNREGISTER_APP_EVT, "BTA_HD_UNREGISTER_APP_EVT"), |
| std::make_pair(BTA_HD_OPEN_EVT, "BTA_HD_OPEN_EVT"), |
| std::make_pair(BTA_HD_CLOSE_EVT, "BTA_HD_CLOSE_EVT"), |
| std::make_pair(BTA_HD_GET_REPORT_EVT, "BTA_HD_GET_REPORT_EVT"), |
| std::make_pair(BTA_HD_SET_REPORT_EVT, "BTA_HD_SET_REPORT_EVT"), |
| std::make_pair(BTA_HD_SET_PROTOCOL_EVT, "BTA_HD_SET_PROTOCOL_EVT"), |
| std::make_pair(BTA_HD_INTR_DATA_EVT, "BTA_HD_INTR_DATA_EVT"), |
| std::make_pair(BTA_HD_VC_UNPLUG_EVT, "BTA_HD_VC_UNPLUG_EVT"), |
| std::make_pair(BTA_HD_CONN_STATE_EVT, "BTA_HD_CONN_STATE_EVT"), |
| std::make_pair(BTA_HD_API_ERR_EVT, "BTA_HD_API_ERR_EVT"), |
| }; |
| for (const auto& event : events) { |
| ASSERT_STREQ(event.second.c_str(), dump_hd_event(event.first)); |
| } |
| std::ostringstream oss; |
| oss << "UNKNOWN MSG ID"; |
| ASSERT_STREQ(oss.str().c_str(), |
| dump_hd_event(std::numeric_limits<uint16_t>::max())); |
| } |
| |
| TEST_F(BtifCoreTest, dump_thread_evt) { |
| std::vector<std::pair<bt_cb_thread_evt, std::string>> events = { |
| std::make_pair(ASSOCIATE_JVM, "ASSOCIATE_JVM"), |
| std::make_pair(DISASSOCIATE_JVM, "DISASSOCIATE_JVM"), |
| }; |
| for (const auto& event : events) { |
| ASSERT_STREQ(event.second.c_str(), dump_thread_evt(event.first)); |
| } |
| std::ostringstream oss; |
| oss << "unknown thread evt"; |
| ASSERT_STREQ(oss.str().c_str(), dump_thread_evt(static_cast<bt_cb_thread_evt>( |
| std::numeric_limits<uint16_t>::max()))); |
| } |
| |
| TEST_F(BtifCoreTest, dump_av_conn_state) { |
| std::vector<std::pair<uint16_t, std::string>> events = { |
| std::make_pair(BTAV_CONNECTION_STATE_DISCONNECTED, |
| "BTAV_CONNECTION_STATE_DISCONNECTED"), |
| std::make_pair(BTAV_CONNECTION_STATE_CONNECTING, |
| "BTAV_CONNECTION_STATE_CONNECTING"), |
| std::make_pair(BTAV_CONNECTION_STATE_CONNECTED, |
| "BTAV_CONNECTION_STATE_CONNECTED"), |
| std::make_pair(BTAV_CONNECTION_STATE_DISCONNECTING, |
| "BTAV_CONNECTION_STATE_DISCONNECTING"), |
| }; |
| for (const auto& event : events) { |
| ASSERT_STREQ(event.second.c_str(), dump_av_conn_state(event.first)); |
| } |
| std::ostringstream oss; |
| oss << "UNKNOWN MSG ID"; |
| ASSERT_STREQ(oss.str().c_str(), |
| dump_av_conn_state(std::numeric_limits<uint16_t>::max())); |
| } |
| |
| TEST_F(BtifCoreTest, dump_av_audio_state) { |
| std::vector<std::pair<uint16_t, std::string>> events = { |
| std::make_pair(BTAV_AUDIO_STATE_REMOTE_SUSPEND, |
| "BTAV_AUDIO_STATE_REMOTE_SUSPEND"), |
| std::make_pair(BTAV_AUDIO_STATE_STOPPED, "BTAV_AUDIO_STATE_STOPPED"), |
| std::make_pair(BTAV_AUDIO_STATE_STARTED, "BTAV_AUDIO_STATE_STARTED"), |
| }; |
| for (const auto& event : events) { |
| ASSERT_STREQ(event.second.c_str(), dump_av_audio_state(event.first)); |
| } |
| std::ostringstream oss; |
| oss << "UNKNOWN MSG ID"; |
| ASSERT_STREQ(oss.str().c_str(), |
| dump_av_audio_state(std::numeric_limits<uint16_t>::max())); |
| } |
| |
| TEST_F(BtifCoreTest, dump_adapter_scan_mode) { |
| std::vector<std::pair<bt_scan_mode_t, std::string>> events = { |
| std::make_pair(BT_SCAN_MODE_NONE, "BT_SCAN_MODE_NONE"), |
| std::make_pair(BT_SCAN_MODE_CONNECTABLE, "BT_SCAN_MODE_CONNECTABLE"), |
| std::make_pair(BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE, |
| "BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE"), |
| }; |
| for (const auto& event : events) { |
| ASSERT_STREQ(event.second.c_str(), dump_adapter_scan_mode(event.first)); |
| } |
| std::ostringstream oss; |
| oss << "unknown scan mode"; |
| ASSERT_STREQ(oss.str().c_str(), |
| dump_adapter_scan_mode(static_cast<bt_scan_mode_t>( |
| std::numeric_limits<int>::max()))); |
| } |
| |
| TEST_F(BtifCoreTest, dump_bt_status) { |
| std::vector<std::pair<bt_status_t, std::string>> events = { |
| std::make_pair(BT_STATUS_SUCCESS, "BT_STATUS_SUCCESS"), |
| std::make_pair(BT_STATUS_FAIL, "BT_STATUS_FAIL"), |
| std::make_pair(BT_STATUS_NOT_READY, "BT_STATUS_NOT_READY"), |
| std::make_pair(BT_STATUS_NOMEM, "BT_STATUS_NOMEM"), |
| std::make_pair(BT_STATUS_BUSY, "BT_STATUS_BUSY"), |
| std::make_pair(BT_STATUS_UNSUPPORTED, "BT_STATUS_UNSUPPORTED"), |
| }; |
| for (const auto& event : events) { |
| ASSERT_STREQ(event.second.c_str(), dump_bt_status(event.first)); |
| } |
| std::ostringstream oss; |
| oss << "unknown scan mode"; |
| ASSERT_STREQ(oss.str().c_str(), dump_bt_status(static_cast<bt_status_t>( |
| std::numeric_limits<int>::max()))); |
| } |
| |
| TEST_F(BtifCoreTest, dump_rc_event) { |
| std::vector<std::pair<uint8_t, std::string>> events = { |
| std::make_pair(BTA_AV_RC_OPEN_EVT, "BTA_AV_RC_OPEN_EVT"), |
| std::make_pair(BTA_AV_RC_CLOSE_EVT, "BTA_AV_RC_CLOSE_EVT"), |
| std::make_pair(BTA_AV_RC_BROWSE_OPEN_EVT, "BTA_AV_RC_BROWSE_OPEN_EVT"), |
| std::make_pair(BTA_AV_RC_BROWSE_CLOSE_EVT, "BTA_AV_RC_BROWSE_CLOSE_EVT"), |
| std::make_pair(BTA_AV_REMOTE_CMD_EVT, "BTA_AV_REMOTE_CMD_EVT"), |
| std::make_pair(BTA_AV_REMOTE_RSP_EVT, "BTA_AV_REMOTE_RSP_EVT"), |
| std::make_pair(BTA_AV_VENDOR_CMD_EVT, "BTA_AV_VENDOR_CMD_EVT"), |
| std::make_pair(BTA_AV_VENDOR_RSP_EVT, "BTA_AV_VENDOR_RSP_EVT"), |
| std::make_pair(BTA_AV_META_MSG_EVT, "BTA_AV_META_MSG_EVT"), |
| std::make_pair(BTA_AV_RC_FEAT_EVT, "BTA_AV_RC_FEAT_EVT"), |
| std::make_pair(BTA_AV_RC_PSM_EVT, "BTA_AV_RC_PSM_EVT"), |
| }; |
| for (const auto& event : events) { |
| ASSERT_STREQ(event.second.c_str(), dump_rc_event(event.first)); |
| } |
| std::ostringstream oss; |
| oss << "UNKNOWN_EVENT"; |
| ASSERT_STREQ(oss.str().c_str(), |
| dump_rc_event(std::numeric_limits<uint8_t>::max())); |
| } |
| |
| TEST_F(BtifCoreTest, dump_rc_notification_event_id) { |
| std::vector<std::pair<uint8_t, std::string>> events = { |
| std::make_pair(AVRC_EVT_PLAY_STATUS_CHANGE, |
| "AVRC_EVT_PLAY_STATUS_CHANGE"), |
| std::make_pair(AVRC_EVT_TRACK_CHANGE, "AVRC_EVT_TRACK_CHANGE"), |
| std::make_pair(AVRC_EVT_TRACK_REACHED_END, "AVRC_EVT_TRACK_REACHED_END"), |
| std::make_pair(AVRC_EVT_TRACK_REACHED_START, |
| "AVRC_EVT_TRACK_REACHED_START"), |
| std::make_pair(AVRC_EVT_PLAY_POS_CHANGED, "AVRC_EVT_PLAY_POS_CHANGED"), |
| std::make_pair(AVRC_EVT_BATTERY_STATUS_CHANGE, |
| "AVRC_EVT_BATTERY_STATUS_CHANGE"), |
| std::make_pair(AVRC_EVT_SYSTEM_STATUS_CHANGE, |
| "AVRC_EVT_SYSTEM_STATUS_CHANGE"), |
| std::make_pair(AVRC_EVT_APP_SETTING_CHANGE, |
| "AVRC_EVT_APP_SETTING_CHANGE"), |
| std::make_pair(AVRC_EVT_VOLUME_CHANGE, "AVRC_EVT_VOLUME_CHANGE"), |
| std::make_pair(AVRC_EVT_ADDR_PLAYER_CHANGE, |
| "AVRC_EVT_ADDR_PLAYER_CHANGE"), |
| std::make_pair(AVRC_EVT_AVAL_PLAYERS_CHANGE, |
| "AVRC_EVT_AVAL_PLAYERS_CHANGE"), |
| std::make_pair(AVRC_EVT_NOW_PLAYING_CHANGE, |
| "AVRC_EVT_NOW_PLAYING_CHANGE"), |
| std::make_pair(AVRC_EVT_UIDS_CHANGE, "AVRC_EVT_UIDS_CHANGE"), |
| }; |
| for (const auto& event : events) { |
| ASSERT_STREQ(event.second.c_str(), |
| dump_rc_notification_event_id(event.first)); |
| } |
| std::ostringstream oss; |
| oss << "Unhandled Event ID"; |
| ASSERT_STREQ(oss.str().c_str(), dump_rc_notification_event_id( |
| std::numeric_limits<uint8_t>::max())); |
| } |
| |
| TEST_F(BtifCoreTest, dump_rc_pdu) { |
| std::vector<std::pair<uint8_t, std::string>> pdus = { |
| std::make_pair(AVRC_PDU_LIST_PLAYER_APP_ATTR, |
| "AVRC_PDU_LIST_PLAYER_APP_ATTR"), |
| std::make_pair(AVRC_PDU_LIST_PLAYER_APP_VALUES, |
| "AVRC_PDU_LIST_PLAYER_APP_VALUES"), |
| std::make_pair(AVRC_PDU_GET_CUR_PLAYER_APP_VALUE, |
| "AVRC_PDU_GET_CUR_PLAYER_APP_VALUE"), |
| std::make_pair(AVRC_PDU_SET_PLAYER_APP_VALUE, |
| "AVRC_PDU_SET_PLAYER_APP_VALUE"), |
| std::make_pair(AVRC_PDU_GET_PLAYER_APP_ATTR_TEXT, |
| "AVRC_PDU_GET_PLAYER_APP_ATTR_TEXT"), |
| std::make_pair(AVRC_PDU_GET_PLAYER_APP_VALUE_TEXT, |
| "AVRC_PDU_GET_PLAYER_APP_VALUE_TEXT"), |
| std::make_pair(AVRC_PDU_INFORM_DISPLAY_CHARSET, |
| "AVRC_PDU_INFORM_DISPLAY_CHARSET"), |
| std::make_pair(AVRC_PDU_INFORM_BATTERY_STAT_OF_CT, |
| "AVRC_PDU_INFORM_BATTERY_STAT_OF_CT"), |
| std::make_pair(AVRC_PDU_GET_ELEMENT_ATTR, "AVRC_PDU_GET_ELEMENT_ATTR"), |
| std::make_pair(AVRC_PDU_GET_PLAY_STATUS, "AVRC_PDU_GET_PLAY_STATUS"), |
| std::make_pair(AVRC_PDU_REGISTER_NOTIFICATION, |
| "AVRC_PDU_REGISTER_NOTIFICATION"), |
| std::make_pair(AVRC_PDU_REQUEST_CONTINUATION_RSP, |
| "AVRC_PDU_REQUEST_CONTINUATION_RSP"), |
| std::make_pair(AVRC_PDU_ABORT_CONTINUATION_RSP, |
| "AVRC_PDU_ABORT_CONTINUATION_RSP"), |
| std::make_pair(AVRC_PDU_SET_ABSOLUTE_VOLUME, |
| "AVRC_PDU_SET_ABSOLUTE_VOLUME"), |
| std::make_pair(AVRC_PDU_SET_ADDRESSED_PLAYER, |
| "AVRC_PDU_SET_ADDRESSED_PLAYER"), |
| std::make_pair(AVRC_PDU_CHANGE_PATH, "AVRC_PDU_CHANGE_PATH"), |
| std::make_pair(AVRC_PDU_GET_CAPABILITIES, "AVRC_PDU_GET_CAPABILITIES"), |
| std::make_pair(AVRC_PDU_SET_BROWSED_PLAYER, |
| "AVRC_PDU_SET_BROWSED_PLAYER"), |
| std::make_pair(AVRC_PDU_GET_FOLDER_ITEMS, "AVRC_PDU_GET_FOLDER_ITEMS"), |
| std::make_pair(AVRC_PDU_GET_ITEM_ATTRIBUTES, |
| "AVRC_PDU_GET_ITEM_ATTRIBUTES"), |
| std::make_pair(AVRC_PDU_PLAY_ITEM, "AVRC_PDU_PLAY_ITEM"), |
| std::make_pair(AVRC_PDU_SEARCH, "AVRC_PDU_SEARCH"), |
| std::make_pair(AVRC_PDU_ADD_TO_NOW_PLAYING, |
| "AVRC_PDU_ADD_TO_NOW_PLAYING"), |
| std::make_pair(AVRC_PDU_GET_TOTAL_NUM_OF_ITEMS, |
| "AVRC_PDU_GET_TOTAL_NUM_OF_ITEMS"), |
| std::make_pair(AVRC_PDU_GENERAL_REJECT, "AVRC_PDU_GENERAL_REJECT"), |
| }; |
| for (const auto& pdu : pdus) { |
| ASSERT_STREQ(pdu.second.c_str(), dump_rc_pdu(pdu.first)); |
| } |
| std::ostringstream oss; |
| oss << "Unknown PDU"; |
| ASSERT_STREQ(oss.str().c_str(), |
| dump_rc_pdu(std::numeric_limits<uint8_t>::max())); |
| } |