Loading system/bta/Android.bp +7 −1 Original line number Diff line number Diff line Loading @@ -174,12 +174,13 @@ cc_test { "BluetoothGeneratedPackets_h", ], srcs: [ ":OsiCompatSources", ":TestCommonMainHandler", ":TestMockBtif", ":TestMockDevice", ":TestMockMainShim", ":TestMockOsi", ":TestMockStack", ":TestStubOsi", "ar/bta_ar.cc", "dm/bta_dm_api.cc", "dm/bta_dm_act.cc", Loading Loading @@ -219,6 +220,11 @@ cc_test { "libbtcore", "libgmock", ], sanitize: { address: true, cfi: true, misc_undefined: ["bounds"], }, } // bta hf client add record tests for target Loading system/bta/test/bta_dm_test.cc +59 −8 Original line number Diff line number Diff line Loading @@ -20,13 +20,17 @@ #include "bta/dm/bta_dm_int.h" #include "bta/hf_client/bta_hf_client_int.h" #include "bta/include/bta_dm_api.h" #include "bta/include/bta_hf_client_api.h" #include "bta/test/common/fake_osi.h" #include "btif/include/stack_manager.h" #include "common/message_loop_thread.h" #include "test/mock/mock_osi_alarm.h" #include "test/mock/mock_stack_acl.h" std::map<std::string, int> mock_function_count_map; extern struct btm_client_interface_s btm_client_interface; void LogMsg(uint32_t trace_set_mask, const char* fmt_str, ...) {} namespace base { Loading @@ -37,10 +41,21 @@ namespace { constexpr uint8_t kUnusedTimer = BTA_ID_MAX; } // namespace struct alarm_t { alarm_t(const char* name){}; int any_value; }; class BtaDmTest : public testing::Test { protected: void SetUp() override { mock_function_count_map.clear(); test::mock::osi_alarm::alarm_new.body = [](const char* name) -> alarm_t* { return new alarm_t(name); }; test::mock::osi_alarm::alarm_free.body = [](alarm_t* alarm) { delete alarm; }; bta_dm_init_cb(); Loading @@ -50,7 +65,11 @@ class BtaDmTest : public testing::Test { } } } void TearDown() override { bta_dm_deinit_cb(); } void TearDown() override { bta_dm_deinit_cb(); test::mock::osi_alarm::alarm_new = {}; test::mock::osi_alarm::alarm_free = {}; } }; TEST_F(BtaDmTest, nop) { Loading @@ -58,21 +77,31 @@ TEST_F(BtaDmTest, nop) { ASSERT_EQ(true, status); } extern struct fake_osi_alarm_set_on_mloop fake_osi_alarm_set_on_mloop_; TEST_F(BtaDmTest, disable_no_acl_links) { bta_dm_cb.disabling = true; alarm_callback_t alarm_callback; void* alarm_data{nullptr}; test::mock::osi_alarm::alarm_set_on_mloop.body = [&alarm_callback, &alarm_data](alarm_t* alarm, uint64_t interval_ms, alarm_callback_t cb, void* data) { ASSERT_TRUE(alarm != nullptr); alarm_callback = cb; alarm_data = data; }; bta_dm_disable(); // Waiting for all ACL connections to drain ASSERT_EQ(0, mock_function_count_map["btm_remove_acl"]); ASSERT_EQ(1, mock_function_count_map["alarm_set_on_mloop"]); // Execute timer callback fake_osi_alarm_set_on_mloop_.cb(fake_osi_alarm_set_on_mloop_.data); alarm_callback(alarm_data); ASSERT_EQ(1, mock_function_count_map["alarm_set_on_mloop"]); ASSERT_EQ(0, mock_function_count_map["BTIF_dm_disable"]); ASSERT_EQ(1, mock_function_count_map["future_ready"]); ASSERT_TRUE(!bta_dm_cb.disabling); test::mock::osi_alarm::alarm_set_on_mloop = {}; } TEST_F(BtaDmTest, disable_first_pass_with_acl_links) { Loading @@ -84,18 +113,29 @@ TEST_F(BtaDmTest, disable_first_pass_with_acl_links) { // ACL link is open bta_dm_cb.device_list.count = 1; alarm_callback_t alarm_callback; void* alarm_data{nullptr}; test::mock::osi_alarm::alarm_set_on_mloop.body = [&alarm_callback, &alarm_data](alarm_t* alarm, uint64_t interval_ms, alarm_callback_t cb, void* data) { ASSERT_TRUE(alarm != nullptr); alarm_callback = cb; alarm_data = data; }; bta_dm_disable(); // Waiting for all ACL connections to drain ASSERT_EQ(1, mock_function_count_map["alarm_set_on_mloop"]); ASSERT_EQ(0, mock_function_count_map["BTIF_dm_disable"]); links_up = 0; // First disable pass fake_osi_alarm_set_on_mloop_.cb(fake_osi_alarm_set_on_mloop_.data); alarm_callback(alarm_data); ASSERT_EQ(1, mock_function_count_map["alarm_set_on_mloop"]); ASSERT_EQ(1, mock_function_count_map["BTIF_dm_disable"]); ASSERT_TRUE(!bta_dm_cb.disabling); test::mock::stack_acl::BTM_GetNumAclLinks = {}; test::mock::osi_alarm::alarm_set_on_mloop = {}; } TEST_F(BtaDmTest, disable_second_pass_with_acl_links) { Loading @@ -107,20 +147,31 @@ TEST_F(BtaDmTest, disable_second_pass_with_acl_links) { // ACL link is open bta_dm_cb.device_list.count = 1; alarm_callback_t alarm_callback; void* alarm_data{nullptr}; test::mock::osi_alarm::alarm_set_on_mloop.body = [&alarm_callback, &alarm_data](alarm_t* alarm, uint64_t interval_ms, alarm_callback_t cb, void* data) { ASSERT_TRUE(alarm != nullptr); alarm_callback = cb; alarm_data = data; }; bta_dm_disable(); // Waiting for all ACL connections to drain ASSERT_EQ(1, mock_function_count_map["alarm_set_on_mloop"]); ASSERT_EQ(0, mock_function_count_map["BTIF_dm_disable"]); // First disable pass fake_osi_alarm_set_on_mloop_.cb(fake_osi_alarm_set_on_mloop_.data); alarm_callback(alarm_data); ASSERT_EQ(2, mock_function_count_map["alarm_set_on_mloop"]); ASSERT_EQ(0, mock_function_count_map["BTIF_dm_disable"]); ASSERT_EQ(1, mock_function_count_map["btm_remove_acl"]); // Second disable pass fake_osi_alarm_set_on_mloop_.cb(fake_osi_alarm_set_on_mloop_.data); alarm_callback(alarm_data); ASSERT_EQ(1, mock_function_count_map["BTIF_dm_disable"]); ASSERT_TRUE(!bta_dm_cb.disabling); test::mock::stack_acl::BTM_GetNumAclLinks = {}; test::mock::osi_alarm::alarm_set_on_mloop = {}; } Loading
system/bta/Android.bp +7 −1 Original line number Diff line number Diff line Loading @@ -174,12 +174,13 @@ cc_test { "BluetoothGeneratedPackets_h", ], srcs: [ ":OsiCompatSources", ":TestCommonMainHandler", ":TestMockBtif", ":TestMockDevice", ":TestMockMainShim", ":TestMockOsi", ":TestMockStack", ":TestStubOsi", "ar/bta_ar.cc", "dm/bta_dm_api.cc", "dm/bta_dm_act.cc", Loading Loading @@ -219,6 +220,11 @@ cc_test { "libbtcore", "libgmock", ], sanitize: { address: true, cfi: true, misc_undefined: ["bounds"], }, } // bta hf client add record tests for target Loading
system/bta/test/bta_dm_test.cc +59 −8 Original line number Diff line number Diff line Loading @@ -20,13 +20,17 @@ #include "bta/dm/bta_dm_int.h" #include "bta/hf_client/bta_hf_client_int.h" #include "bta/include/bta_dm_api.h" #include "bta/include/bta_hf_client_api.h" #include "bta/test/common/fake_osi.h" #include "btif/include/stack_manager.h" #include "common/message_loop_thread.h" #include "test/mock/mock_osi_alarm.h" #include "test/mock/mock_stack_acl.h" std::map<std::string, int> mock_function_count_map; extern struct btm_client_interface_s btm_client_interface; void LogMsg(uint32_t trace_set_mask, const char* fmt_str, ...) {} namespace base { Loading @@ -37,10 +41,21 @@ namespace { constexpr uint8_t kUnusedTimer = BTA_ID_MAX; } // namespace struct alarm_t { alarm_t(const char* name){}; int any_value; }; class BtaDmTest : public testing::Test { protected: void SetUp() override { mock_function_count_map.clear(); test::mock::osi_alarm::alarm_new.body = [](const char* name) -> alarm_t* { return new alarm_t(name); }; test::mock::osi_alarm::alarm_free.body = [](alarm_t* alarm) { delete alarm; }; bta_dm_init_cb(); Loading @@ -50,7 +65,11 @@ class BtaDmTest : public testing::Test { } } } void TearDown() override { bta_dm_deinit_cb(); } void TearDown() override { bta_dm_deinit_cb(); test::mock::osi_alarm::alarm_new = {}; test::mock::osi_alarm::alarm_free = {}; } }; TEST_F(BtaDmTest, nop) { Loading @@ -58,21 +77,31 @@ TEST_F(BtaDmTest, nop) { ASSERT_EQ(true, status); } extern struct fake_osi_alarm_set_on_mloop fake_osi_alarm_set_on_mloop_; TEST_F(BtaDmTest, disable_no_acl_links) { bta_dm_cb.disabling = true; alarm_callback_t alarm_callback; void* alarm_data{nullptr}; test::mock::osi_alarm::alarm_set_on_mloop.body = [&alarm_callback, &alarm_data](alarm_t* alarm, uint64_t interval_ms, alarm_callback_t cb, void* data) { ASSERT_TRUE(alarm != nullptr); alarm_callback = cb; alarm_data = data; }; bta_dm_disable(); // Waiting for all ACL connections to drain ASSERT_EQ(0, mock_function_count_map["btm_remove_acl"]); ASSERT_EQ(1, mock_function_count_map["alarm_set_on_mloop"]); // Execute timer callback fake_osi_alarm_set_on_mloop_.cb(fake_osi_alarm_set_on_mloop_.data); alarm_callback(alarm_data); ASSERT_EQ(1, mock_function_count_map["alarm_set_on_mloop"]); ASSERT_EQ(0, mock_function_count_map["BTIF_dm_disable"]); ASSERT_EQ(1, mock_function_count_map["future_ready"]); ASSERT_TRUE(!bta_dm_cb.disabling); test::mock::osi_alarm::alarm_set_on_mloop = {}; } TEST_F(BtaDmTest, disable_first_pass_with_acl_links) { Loading @@ -84,18 +113,29 @@ TEST_F(BtaDmTest, disable_first_pass_with_acl_links) { // ACL link is open bta_dm_cb.device_list.count = 1; alarm_callback_t alarm_callback; void* alarm_data{nullptr}; test::mock::osi_alarm::alarm_set_on_mloop.body = [&alarm_callback, &alarm_data](alarm_t* alarm, uint64_t interval_ms, alarm_callback_t cb, void* data) { ASSERT_TRUE(alarm != nullptr); alarm_callback = cb; alarm_data = data; }; bta_dm_disable(); // Waiting for all ACL connections to drain ASSERT_EQ(1, mock_function_count_map["alarm_set_on_mloop"]); ASSERT_EQ(0, mock_function_count_map["BTIF_dm_disable"]); links_up = 0; // First disable pass fake_osi_alarm_set_on_mloop_.cb(fake_osi_alarm_set_on_mloop_.data); alarm_callback(alarm_data); ASSERT_EQ(1, mock_function_count_map["alarm_set_on_mloop"]); ASSERT_EQ(1, mock_function_count_map["BTIF_dm_disable"]); ASSERT_TRUE(!bta_dm_cb.disabling); test::mock::stack_acl::BTM_GetNumAclLinks = {}; test::mock::osi_alarm::alarm_set_on_mloop = {}; } TEST_F(BtaDmTest, disable_second_pass_with_acl_links) { Loading @@ -107,20 +147,31 @@ TEST_F(BtaDmTest, disable_second_pass_with_acl_links) { // ACL link is open bta_dm_cb.device_list.count = 1; alarm_callback_t alarm_callback; void* alarm_data{nullptr}; test::mock::osi_alarm::alarm_set_on_mloop.body = [&alarm_callback, &alarm_data](alarm_t* alarm, uint64_t interval_ms, alarm_callback_t cb, void* data) { ASSERT_TRUE(alarm != nullptr); alarm_callback = cb; alarm_data = data; }; bta_dm_disable(); // Waiting for all ACL connections to drain ASSERT_EQ(1, mock_function_count_map["alarm_set_on_mloop"]); ASSERT_EQ(0, mock_function_count_map["BTIF_dm_disable"]); // First disable pass fake_osi_alarm_set_on_mloop_.cb(fake_osi_alarm_set_on_mloop_.data); alarm_callback(alarm_data); ASSERT_EQ(2, mock_function_count_map["alarm_set_on_mloop"]); ASSERT_EQ(0, mock_function_count_map["BTIF_dm_disable"]); ASSERT_EQ(1, mock_function_count_map["btm_remove_acl"]); // Second disable pass fake_osi_alarm_set_on_mloop_.cb(fake_osi_alarm_set_on_mloop_.data); alarm_callback(alarm_data); ASSERT_EQ(1, mock_function_count_map["BTIF_dm_disable"]); ASSERT_TRUE(!bta_dm_cb.disabling); test::mock::stack_acl::BTM_GetNumAclLinks = {}; test::mock::osi_alarm::alarm_set_on_mloop = {}; }