summaryrefslogtreecommitdiff
path: root/cras/src/tests/bt_device_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'cras/src/tests/bt_device_unittest.cc')
-rw-r--r--cras/src/tests/bt_device_unittest.cc781
1 files changed, 0 insertions, 781 deletions
diff --git a/cras/src/tests/bt_device_unittest.cc b/cras/src/tests/bt_device_unittest.cc
deleted file mode 100644
index ccb581cc..00000000
--- a/cras/src/tests/bt_device_unittest.cc
+++ /dev/null
@@ -1,781 +0,0 @@
-// Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include <gtest/gtest.h>
-
-extern "C" {
-#include "cras_bt_constants.h"
-#include "cras_bt_device.h"
-#include "cras_bt_io.h"
-#include "cras_bt_log.h"
-#include "cras_iodev.h"
-#include "cras_main_message.h"
-
-#define FAKE_OBJ_PATH "/obj/path"
-}
-
-static const unsigned int CONN_WATCH_MAX_RETRIES = 30;
-
-static struct cras_iodev* cras_bt_io_create_profile_ret;
-static struct cras_iodev* cras_bt_io_append_btio_val;
-static struct cras_ionode* cras_bt_io_get_profile_ret;
-static unsigned int cras_bt_io_create_called;
-static unsigned int cras_bt_io_append_called;
-static unsigned int cras_bt_io_remove_called;
-static unsigned int cras_bt_io_destroy_called;
-static enum cras_bt_device_profile cras_bt_io_create_profile_val;
-static enum cras_bt_device_profile cras_bt_io_append_profile_val;
-static unsigned int cras_bt_io_try_remove_ret;
-
-static cras_main_message* cras_main_message_send_msg;
-static cras_message_callback cras_main_message_add_handler_callback;
-static void* cras_main_message_add_handler_callback_data;
-static int cras_tm_create_timer_called;
-static int cras_tm_cancel_timer_called;
-static int cras_a2dp_start_called;
-static int cras_a2dp_suspend_connected_device_called;
-static int cras_hfp_ag_remove_conflict_called;
-static int cras_hfp_ag_start_called;
-static int cras_hfp_ag_suspend_connected_device_called;
-static void (*cras_tm_create_timer_cb)(struct cras_timer* t, void* data);
-static void* cras_tm_create_timer_cb_data;
-static int dbus_message_new_method_call_called;
-static const char* dbus_message_new_method_call_method;
-static struct cras_bt_device* cras_a2dp_connected_device_ret;
-static struct cras_bt_device* cras_a2dp_suspend_connected_device_dev;
-static struct cras_timer* cras_tm_cancel_timer_arg;
-static struct cras_timer* cras_tm_create_timer_ret;
-static size_t cras_iodev_set_node_plugged_called;
-static int cras_iodev_set_node_plugged_value;
-
-struct MockDBusMessage {
- int type;
- void* value;
- MockDBusMessage* next;
- MockDBusMessage* recurse;
-};
-
-void ResetStubData() {
- cras_bt_io_get_profile_ret = NULL;
- cras_bt_io_create_called = 0;
- cras_bt_io_append_called = 0;
- cras_bt_io_remove_called = 0;
- cras_bt_io_destroy_called = 0;
- cras_bt_io_try_remove_ret = 0;
- cras_main_message_send_msg = NULL;
- cras_tm_create_timer_called = 0;
- cras_tm_cancel_timer_called = 0;
- cras_a2dp_start_called = 0;
- cras_a2dp_suspend_connected_device_called = 0;
- cras_hfp_ag_remove_conflict_called = 0;
- cras_hfp_ag_start_called = 0;
- cras_hfp_ag_suspend_connected_device_called = 0;
- dbus_message_new_method_call_method = NULL;
- dbus_message_new_method_call_called = 0;
- cras_a2dp_connected_device_ret = NULL;
- cras_iodev_set_node_plugged_called = 0;
-}
-
-static void FreeMockDBusMessage(MockDBusMessage* head) {
- if (head->next != NULL)
- FreeMockDBusMessage(head->next);
- if (head->recurse != NULL)
- FreeMockDBusMessage(head->recurse);
- if (head->type == DBUS_TYPE_STRING)
- free((char*)head->value);
- delete head;
-}
-
-static struct MockDBusMessage* NewMockDBusConnectedMessage(long connected) {
- MockDBusMessage* msg = new MockDBusMessage{DBUS_TYPE_ARRAY, NULL};
- MockDBusMessage* dict =
- new MockDBusMessage{DBUS_TYPE_STRING, (void*)strdup("Connected")};
- MockDBusMessage* variant =
- new MockDBusMessage{DBUS_TYPE_BOOLEAN, (void*)connected};
-
- msg->recurse = dict;
- dict->next = new MockDBusMessage{DBUS_TYPE_INVALID, NULL};
- dict->next->recurse = variant;
- return msg;
-}
-
-namespace {
-
-class BtDeviceTestSuite : public testing::Test {
- protected:
- virtual void SetUp() {
- ResetStubData();
- bt_iodev1.direction = CRAS_STREAM_OUTPUT;
- bt_iodev1.update_active_node = update_active_node;
- bt_iodev2.direction = CRAS_STREAM_INPUT;
- bt_iodev2.update_active_node = update_active_node;
- d1_.direction = CRAS_STREAM_OUTPUT;
- d1_.update_active_node = update_active_node;
- d2_.direction = CRAS_STREAM_OUTPUT;
- d2_.update_active_node = update_active_node;
- d3_.direction = CRAS_STREAM_INPUT;
- d3_.update_active_node = update_active_node;
- btlog = cras_bt_event_log_init();
- }
-
- virtual void TearDown() {
- if (cras_main_message_send_msg)
- free(cras_main_message_send_msg);
- cras_bt_event_log_deinit(btlog);
- }
-
- static void update_active_node(struct cras_iodev* iodev,
- unsigned node_idx,
- unsigned dev_enabled) {}
-
- struct cras_iodev bt_iodev1;
- struct cras_iodev bt_iodev2;
- struct cras_iodev d3_;
- struct cras_iodev d2_;
- struct cras_iodev d1_;
-};
-
-TEST(BtDeviceSuite, CreateBtDevice) {
- struct cras_bt_device* device;
-
- device = cras_bt_device_create(NULL, FAKE_OBJ_PATH);
- EXPECT_NE((void*)NULL, device);
-
- device = cras_bt_device_get(FAKE_OBJ_PATH);
- EXPECT_NE((void*)NULL, device);
-
- cras_bt_device_remove(device);
- device = cras_bt_device_get(FAKE_OBJ_PATH);
- EXPECT_EQ((void*)NULL, device);
-}
-
-TEST_F(BtDeviceTestSuite, AppendRmIodev) {
- struct cras_bt_device* device;
- device = cras_bt_device_create(NULL, FAKE_OBJ_PATH);
- bt_iodev1.nodes = reinterpret_cast<struct cras_ionode*>(0x123);
- cras_bt_io_create_profile_ret = &bt_iodev1;
- cras_bt_device_append_iodev(device, &d1_, CRAS_BT_DEVICE_PROFILE_A2DP_SOURCE);
- EXPECT_EQ(1, cras_bt_io_create_called);
- EXPECT_EQ(0, cras_bt_io_append_called);
- EXPECT_EQ(CRAS_BT_DEVICE_PROFILE_A2DP_SOURCE, cras_bt_io_create_profile_val);
- cras_bt_device_set_active_profile(device, CRAS_BT_DEVICE_PROFILE_A2DP_SOURCE);
-
- cras_bt_device_append_iodev(device, &d2_,
- CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY);
- EXPECT_EQ(1, cras_bt_io_create_called);
- EXPECT_EQ(1, cras_bt_io_append_called);
- EXPECT_EQ(CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY,
- cras_bt_io_append_profile_val);
- EXPECT_EQ(&bt_iodev1, cras_bt_io_append_btio_val);
-
- /* Test HFP disconnected and switch to A2DP. */
- cras_bt_io_get_profile_ret = bt_iodev1.nodes;
- cras_bt_io_try_remove_ret = CRAS_BT_DEVICE_PROFILE_A2DP_SOURCE;
- cras_bt_device_set_active_profile(device,
- CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY);
- cras_bt_device_rm_iodev(device, &d2_);
- EXPECT_EQ(1, cras_bt_io_remove_called);
- EXPECT_EQ(1, cras_iodev_set_node_plugged_called);
- EXPECT_EQ(0, cras_iodev_set_node_plugged_value);
-
- /* Test A2DP disconnection will cause bt_io destroy. */
- cras_bt_io_try_remove_ret = 0;
- cras_bt_device_rm_iodev(device, &d1_);
- EXPECT_EQ(1, cras_bt_io_remove_called);
- EXPECT_EQ(1, cras_bt_io_destroy_called);
- EXPECT_EQ(0, cras_bt_device_get_active_profile(device));
- EXPECT_EQ(2, cras_iodev_set_node_plugged_called);
- EXPECT_EQ(0, cras_iodev_set_node_plugged_value);
- cras_bt_device_remove(device);
-}
-
-TEST_F(BtDeviceTestSuite, SwitchProfile) {
- struct cras_bt_device* device;
-
- ResetStubData();
- device = cras_bt_device_create(NULL, FAKE_OBJ_PATH);
- cras_bt_io_create_profile_ret = &bt_iodev1;
- cras_bt_device_append_iodev(device, &d1_, CRAS_BT_DEVICE_PROFILE_A2DP_SOURCE);
- cras_bt_io_create_profile_ret = &bt_iodev2;
- cras_bt_device_append_iodev(device, &d3_,
- CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY);
-
- cras_bt_device_start_monitor();
- cras_bt_device_switch_profile_enable_dev(device, &bt_iodev1);
-
- /* Two bt iodevs were all active. */
- cras_main_message_add_handler_callback(
- cras_main_message_send_msg, cras_main_message_add_handler_callback_data);
-
- /* One bt iodev was active, the other was not. */
- cras_bt_device_switch_profile_enable_dev(device, &bt_iodev2);
- cras_main_message_add_handler_callback(
- cras_main_message_send_msg, cras_main_message_add_handler_callback_data);
-
- /* Output bt iodev wasn't active, close the active input iodev. */
- cras_bt_device_switch_profile(device, &bt_iodev2);
- cras_main_message_add_handler_callback(
- cras_main_message_send_msg, cras_main_message_add_handler_callback_data);
- cras_bt_device_remove(device);
-}
-
-TEST_F(BtDeviceTestSuite, SetDeviceConnectedA2dpOnly) {
- struct cras_bt_device* device;
- struct MockDBusMessage *msg_root, *cur;
- ResetStubData();
-
- device = cras_bt_device_create(NULL, FAKE_OBJ_PATH);
- EXPECT_NE((void*)NULL, device);
-
- cras_bt_device_set_supported_profiles(device,
- CRAS_BT_DEVICE_PROFILE_A2DP_SINK);
-
- cur = msg_root = NewMockDBusConnectedMessage(1);
- cras_bt_device_update_properties(device, (DBusMessageIter*)&cur, NULL);
- EXPECT_EQ(1, cras_tm_create_timer_called);
- EXPECT_NE((void*)NULL, cras_tm_create_timer_cb);
-
- /* Schedule another timer, if A2DP not yet configured. */
- cras_tm_create_timer_cb(NULL, cras_tm_create_timer_cb_data);
- EXPECT_EQ(2, cras_tm_create_timer_called);
-
- /* ConnectProfile must not be called, since this is A2DP only case. */
- EXPECT_EQ(0, dbus_message_new_method_call_called);
-
- cras_bt_device_a2dp_configured(device);
-
- /* Prepate the iodev created by cras_a2dp_start. */
- cras_bt_io_create_profile_ret = &bt_iodev1;
- cras_bt_device_append_iodev(device, &d1_, CRAS_BT_DEVICE_PROFILE_A2DP_SOURCE);
-
- cras_tm_create_timer_cb(NULL, cras_tm_create_timer_cb_data);
- EXPECT_EQ(2, cras_tm_create_timer_called);
- EXPECT_EQ(1, cras_hfp_ag_remove_conflict_called);
- EXPECT_EQ(1, cras_a2dp_start_called);
- EXPECT_EQ(1, cras_iodev_set_node_plugged_called);
- EXPECT_EQ(1, cras_iodev_set_node_plugged_value);
-
- cras_bt_device_remove(device);
- FreeMockDBusMessage(msg_root);
-}
-
-TEST_F(BtDeviceTestSuite, SetDeviceConnectedHfpHspOnly) {
- struct cras_bt_device* device;
- struct MockDBusMessage *msg_root, *cur;
-
- ResetStubData();
-
- device = cras_bt_device_create(NULL, FAKE_OBJ_PATH);
- EXPECT_NE((void*)NULL, device);
-
- cras_bt_device_set_supported_profiles(
- device, CRAS_BT_DEVICE_PROFILE_HSP_HEADSET |
- CRAS_BT_DEVICE_PROFILE_HFP_HANDSFREE);
-
- cur = msg_root = NewMockDBusConnectedMessage(1);
- cras_bt_device_update_properties(device, (DBusMessageIter*)&cur, NULL);
- EXPECT_EQ(1, cras_tm_create_timer_called);
- EXPECT_NE((void*)NULL, cras_tm_create_timer_cb);
-
- /* Schedule another timer, if HFP AG not yet intialized. */
- cras_tm_create_timer_cb(NULL, cras_tm_create_timer_cb_data);
- EXPECT_EQ(2, cras_tm_create_timer_called);
-
- /* ConnectProfile must not be called, since this is HFP only case. */
- EXPECT_EQ(0, dbus_message_new_method_call_called);
-
- cras_bt_device_audio_gateway_initialized(device);
-
- /* Prepate the iodev created by ag initialization. */
- cras_bt_io_create_profile_ret = &bt_iodev2;
- cras_bt_device_append_iodev(device, &d3_,
- CRAS_BT_DEVICE_PROFILE_HFP_AUDIOGATEWAY);
-
- cras_tm_create_timer_cb(NULL, cras_tm_create_timer_cb_data);
- EXPECT_EQ(2, cras_tm_create_timer_called);
- EXPECT_EQ(1, cras_hfp_ag_remove_conflict_called);
- EXPECT_EQ(1, cras_hfp_ag_start_called);
- EXPECT_EQ(1, cras_iodev_set_node_plugged_called);
- EXPECT_EQ(1, cras_iodev_set_node_plugged_value);
-
- cras_bt_device_remove(device);
- FreeMockDBusMessage(msg_root);
-}
-
-TEST_F(BtDeviceTestSuite, SetDeviceConnectedA2dpHfpHsp) {
- struct cras_bt_device* device;
- struct MockDBusMessage *msg_root, *cur;
-
- ResetStubData();
-
- device = cras_bt_device_create(NULL, FAKE_OBJ_PATH);
- EXPECT_NE((void*)NULL, device);
-
- cras_bt_device_set_supported_profiles(
- device, CRAS_BT_DEVICE_PROFILE_A2DP_SINK |
- CRAS_BT_DEVICE_PROFILE_HSP_HEADSET |
- CRAS_BT_DEVICE_PROFILE_HFP_HANDSFREE);
-
- cur = msg_root = NewMockDBusConnectedMessage(1);
- cras_bt_device_update_properties(device, (DBusMessageIter*)&cur, NULL);
- EXPECT_EQ(1, cras_tm_create_timer_called);
- EXPECT_NE((void*)NULL, cras_tm_create_timer_cb);
-
- /* Schedule another timer, if not HFP nor A2DP is ready. */
- cras_tm_create_timer_cb(NULL, cras_tm_create_timer_cb_data);
- EXPECT_EQ(2, cras_tm_create_timer_called);
-
- /* ConnectProfile must not be called, since the first profile connection
- * should be initiated by Bluez.
- */
- EXPECT_EQ(0, dbus_message_new_method_call_called);
-
- cras_bt_device_audio_gateway_initialized(device);
-
- /* Schedule another timer, because A2DP is not ready. */
- cras_tm_create_timer_cb(NULL, cras_tm_create_timer_cb_data);
- EXPECT_EQ(3, cras_tm_create_timer_called);
- EXPECT_EQ(0, cras_hfp_ag_start_called);
-
- /* ConnectProfile should be called to connect A2DP, since HFP is connected */
- EXPECT_EQ(1, dbus_message_new_method_call_called);
- EXPECT_STREQ("ConnectProfile", dbus_message_new_method_call_method);
-
- cras_bt_device_a2dp_configured(device);
-
- cras_tm_create_timer_cb(NULL, cras_tm_create_timer_cb_data);
- EXPECT_EQ(3, cras_tm_create_timer_called);
- EXPECT_EQ(1, cras_hfp_ag_remove_conflict_called);
- EXPECT_EQ(1, cras_a2dp_start_called);
- EXPECT_EQ(1, cras_hfp_ag_start_called);
-
- cras_bt_device_remove(device);
- FreeMockDBusMessage(msg_root);
-}
-
-TEST_F(BtDeviceTestSuite, DevConnectedConflictCheck) {
- struct cras_bt_device* device;
- struct MockDBusMessage *msg_root, *cur;
-
- ResetStubData();
-
- device = cras_bt_device_create(NULL, FAKE_OBJ_PATH);
- EXPECT_NE((void*)NULL, device);
-
- cras_bt_device_set_supported_profiles(
- device, CRAS_BT_DEVICE_PROFILE_A2DP_SINK |
- CRAS_BT_DEVICE_PROFILE_HSP_HEADSET |
- CRAS_BT_DEVICE_PROFILE_HFP_HANDSFREE);
-
- cur = msg_root = NewMockDBusConnectedMessage(1);
- cras_bt_device_update_properties(device, (DBusMessageIter*)&cur, NULL);
- cras_bt_device_audio_gateway_initialized(device);
- cras_bt_device_a2dp_configured(device);
- EXPECT_EQ(1, cras_tm_create_timer_called);
-
- /* Fake that a different device already connected with A2DP */
- cras_a2dp_connected_device_ret =
- reinterpret_cast<struct cras_bt_device*>(0x99);
- cras_tm_create_timer_cb(NULL, cras_tm_create_timer_cb_data);
- EXPECT_EQ(1, cras_tm_create_timer_called);
-
- /* Expect check conflict in HFP AG and A2DP. */
- EXPECT_EQ(1, cras_hfp_ag_remove_conflict_called);
- EXPECT_EQ(1, cras_a2dp_suspend_connected_device_called);
- EXPECT_EQ(cras_a2dp_suspend_connected_device_dev,
- cras_a2dp_connected_device_ret);
-
- EXPECT_EQ(1, cras_a2dp_start_called);
- EXPECT_EQ(1, cras_hfp_ag_start_called);
-
- cras_bt_device_remove(device);
- FreeMockDBusMessage(msg_root);
-}
-
-TEST_F(BtDeviceTestSuite, A2dpDropped) {
- struct cras_bt_device* device;
- struct MockDBusMessage *msg_root, *cur;
-
- ResetStubData();
-
- device = cras_bt_device_create(NULL, FAKE_OBJ_PATH);
- EXPECT_NE((void*)NULL, device);
-
- cras_bt_device_set_supported_profiles(
- device, CRAS_BT_DEVICE_PROFILE_A2DP_SINK |
- CRAS_BT_DEVICE_PROFILE_HSP_HEADSET |
- CRAS_BT_DEVICE_PROFILE_HFP_HANDSFREE);
-
- cur = msg_root = NewMockDBusConnectedMessage(1);
- cras_bt_device_update_properties(device, (DBusMessageIter*)&cur, NULL);
- cras_bt_device_audio_gateway_initialized(device);
- cras_bt_device_a2dp_configured(device);
- EXPECT_EQ(1, cras_tm_create_timer_called);
- EXPECT_NE((void*)NULL, cras_tm_create_timer_cb);
-
- cras_bt_device_notify_profile_dropped(device,
- CRAS_BT_DEVICE_PROFILE_A2DP_SINK);
- EXPECT_EQ(2, cras_tm_create_timer_called);
-
- /* Expect suspend timer is scheduled. */
- cras_tm_create_timer_cb(NULL, cras_tm_create_timer_cb_data);
- EXPECT_EQ(1, cras_a2dp_suspend_connected_device_called);
- EXPECT_EQ(1, cras_hfp_ag_suspend_connected_device_called);
- EXPECT_EQ(1, dbus_message_new_method_call_called);
- EXPECT_STREQ("Disconnect", dbus_message_new_method_call_method);
-
- cras_bt_device_remove(device);
- FreeMockDBusMessage(msg_root);
-}
-
-TEST_F(BtDeviceTestSuite, DevConnectDisconnectBackToBack) {
- struct cras_bt_device* device;
- struct MockDBusMessage *msg_root, *cur;
-
- ResetStubData();
-
- device = cras_bt_device_create(NULL, FAKE_OBJ_PATH);
- EXPECT_NE((void*)NULL, device);
-
- cras_bt_device_set_supported_profiles(
- device, CRAS_BT_DEVICE_PROFILE_A2DP_SINK |
- CRAS_BT_DEVICE_PROFILE_HSP_HEADSET |
- CRAS_BT_DEVICE_PROFILE_HFP_HANDSFREE);
-
- cur = msg_root = NewMockDBusConnectedMessage(1);
- cras_bt_device_update_properties(device, (DBusMessageIter*)&cur, NULL);
- EXPECT_EQ(1, cras_tm_create_timer_called);
- EXPECT_NE((void*)NULL, cras_tm_create_timer_cb);
- FreeMockDBusMessage(msg_root);
-
- cras_bt_device_a2dp_configured(device);
- cras_bt_device_audio_gateway_initialized(device);
-
- /* Expect suspend timer is scheduled. */
- cras_tm_create_timer_ret = reinterpret_cast<struct cras_timer*>(0x101);
- cras_bt_device_notify_profile_dropped(device,
- CRAS_BT_DEVICE_PROFILE_A2DP_SINK);
- EXPECT_EQ(2, cras_tm_create_timer_called);
- /* Another profile drop won't schedule another timer because one is
- * already armed. */
- EXPECT_NE((void*)NULL, cras_tm_create_timer_cb);
- cras_bt_device_notify_profile_dropped(device,
- CRAS_BT_DEVICE_PROFILE_HFP_HANDSFREE);
- EXPECT_EQ(2, cras_tm_create_timer_called);
-
- cur = msg_root = NewMockDBusConnectedMessage(0);
- cras_bt_device_update_properties(device, (DBusMessageIter*)&cur, NULL);
-
- /* When BlueZ reports headset disconnection, cancel the pending timer. */
- EXPECT_EQ(cras_tm_cancel_timer_called, 1);
- EXPECT_EQ(cras_tm_cancel_timer_arg, (void*)0x101);
- FreeMockDBusMessage(msg_root);
-
- /* Headset connects again. */
- cur = msg_root = NewMockDBusConnectedMessage(1);
- cras_bt_device_update_properties(device, (DBusMessageIter*)&cur, NULL);
- EXPECT_EQ(3, cras_tm_create_timer_called);
- EXPECT_NE((void*)NULL, cras_tm_create_timer_cb);
- FreeMockDBusMessage(msg_root);
-
- /* Headset disconnects, later profile drop events shouldn't trigger
- * suspend timer because headset is already in disconnected stats.
- */
- cur = msg_root = NewMockDBusConnectedMessage(0);
- cras_bt_device_update_properties(device, (DBusMessageIter*)&cur, NULL);
- FreeMockDBusMessage(msg_root);
-
- cras_tm_create_timer_called = 0;
- cras_bt_device_notify_profile_dropped(device,
- CRAS_BT_DEVICE_PROFILE_A2DP_SINK);
- EXPECT_EQ(0, cras_tm_create_timer_called);
- cras_bt_device_notify_profile_dropped(device,
- CRAS_BT_DEVICE_PROFILE_HFP_HANDSFREE);
- EXPECT_EQ(0, cras_tm_create_timer_called);
-
- cras_bt_device_remove(device);
-}
-
-TEST_F(BtDeviceTestSuite, ConnectionWatchTimeout) {
- struct cras_bt_device* device;
- struct MockDBusMessage *msg_root, *cur;
-
- ResetStubData();
-
- device = cras_bt_device_create(NULL, FAKE_OBJ_PATH);
- EXPECT_NE((void*)NULL, device);
-
- cras_bt_device_set_supported_profiles(
- device, CRAS_BT_DEVICE_PROFILE_A2DP_SINK |
- CRAS_BT_DEVICE_PROFILE_HSP_HEADSET |
- CRAS_BT_DEVICE_PROFILE_HFP_HANDSFREE);
-
- cur = msg_root = NewMockDBusConnectedMessage(1);
- cras_bt_device_update_properties(device, (DBusMessageIter*)&cur, NULL);
- EXPECT_EQ(1, cras_tm_create_timer_called);
- EXPECT_NE((void*)NULL, cras_tm_create_timer_cb);
-
- cras_bt_device_a2dp_configured(device);
-
- for (unsigned int i = 0; i < CONN_WATCH_MAX_RETRIES; i++) {
- cras_tm_create_timer_cb(NULL, cras_tm_create_timer_cb_data);
- EXPECT_EQ(i + 2, cras_tm_create_timer_called);
- EXPECT_EQ(0, cras_a2dp_start_called);
- EXPECT_EQ(0, cras_hfp_ag_start_called);
- EXPECT_EQ(0, cras_hfp_ag_remove_conflict_called);
- }
-
- dbus_message_new_method_call_called = 0;
-
- /* Expect suspend timer is scheduled. */
- cras_tm_create_timer_cb(NULL, cras_tm_create_timer_cb_data);
- EXPECT_EQ(1, cras_a2dp_suspend_connected_device_called);
- EXPECT_EQ(1, cras_hfp_ag_suspend_connected_device_called);
- EXPECT_EQ(1, dbus_message_new_method_call_called);
- EXPECT_STREQ("Disconnect", dbus_message_new_method_call_method);
-
- cras_bt_device_remove(device);
- FreeMockDBusMessage(msg_root);
-}
-
-/* Stubs */
-extern "C" {
-
-struct cras_bt_event_log* btlog;
-
-/* From bt_io */
-struct cras_iodev* cras_bt_io_create(struct cras_bt_device* device,
- struct cras_iodev* dev,
- enum cras_bt_device_profile profile) {
- cras_bt_io_create_called++;
- cras_bt_io_create_profile_val = profile;
- return cras_bt_io_create_profile_ret;
-}
-void cras_bt_io_destroy(struct cras_iodev* bt_iodev) {
- cras_bt_io_destroy_called++;
-}
-struct cras_ionode* cras_bt_io_get_profile(
- struct cras_iodev* bt_iodev,
- enum cras_bt_device_profile profile) {
- return cras_bt_io_get_profile_ret;
-}
-int cras_bt_io_append(struct cras_iodev* bt_iodev,
- struct cras_iodev* dev,
- enum cras_bt_device_profile profile) {
- cras_bt_io_append_called++;
- cras_bt_io_append_profile_val = profile;
- cras_bt_io_append_btio_val = bt_iodev;
- return 0;
-}
-int cras_bt_io_on_profile(struct cras_iodev* bt_iodev,
- enum cras_bt_device_profile profile) {
- return 0;
-}
-unsigned int cras_bt_io_try_remove(struct cras_iodev* bt_iodev,
- struct cras_iodev* dev) {
- return cras_bt_io_try_remove_ret;
-}
-int cras_bt_io_remove(struct cras_iodev* bt_iodev, struct cras_iodev* dev) {
- cras_bt_io_remove_called++;
- return 0;
-}
-
-/* From bt_adapter */
-struct cras_bt_adapter* cras_bt_adapter_get(const char* object_path) {
- return NULL;
-}
-const char* cras_bt_adapter_address(const struct cras_bt_adapter* adapter) {
- return NULL;
-}
-
-int cras_bt_adapter_on_usb(struct cras_bt_adapter* adapter) {
- return 1;
-}
-
-/* From bt_profile */
-void cras_bt_profile_on_device_disconnected(struct cras_bt_device* device) {}
-
-/* From hfp_ag_profile */
-struct hfp_slc_handle* cras_hfp_ag_get_slc(struct cras_bt_device* device) {
- return NULL;
-}
-
-void cras_hfp_ag_suspend_connected_device(struct cras_bt_device* device) {
- cras_hfp_ag_suspend_connected_device_called++;
-}
-
-void cras_a2dp_suspend_connected_device(struct cras_bt_device* device) {
- cras_a2dp_suspend_connected_device_called++;
- cras_a2dp_suspend_connected_device_dev = device;
-}
-
-void cras_a2dp_start(struct cras_bt_device* device) {
- cras_a2dp_start_called++;
-}
-
-struct cras_bt_device* cras_a2dp_connected_device() {
- return cras_a2dp_connected_device_ret;
-}
-
-int cras_hfp_ag_remove_conflict(struct cras_bt_device* device) {
- cras_hfp_ag_remove_conflict_called++;
- return 0;
-}
-
-int cras_hfp_ag_start(struct cras_bt_device* device) {
- cras_hfp_ag_start_called++;
- return 0;
-}
-
-void cras_hfp_ag_suspend() {}
-
-/* From hfp_slc */
-int hfp_event_speaker_gain(struct hfp_slc_handle* handle, int gain) {
- return 0;
-}
-
-/* From iodev_list */
-
-int cras_iodev_open(struct cras_iodev* dev,
- unsigned int cb_level,
- const struct cras_audio_format* fmt) {
- return 0;
-}
-
-int cras_iodev_close(struct cras_iodev* dev) {
- return 0;
-}
-
-void cras_iodev_set_node_plugged(struct cras_ionode* ionode, int plugged) {
- cras_iodev_set_node_plugged_called++;
- cras_iodev_set_node_plugged_value = plugged;
-}
-
-int cras_iodev_list_dev_is_enabled(const struct cras_iodev* dev) {
- return 0;
-}
-
-void cras_iodev_list_suspend_dev(struct cras_iodev* dev) {}
-
-void cras_iodev_list_resume_dev(struct cras_iodev* dev) {}
-
-void cras_iodev_list_notify_node_volume(struct cras_ionode* node) {}
-
-int cras_main_message_send(struct cras_main_message* msg) {
- // cras_main_message is a local variable from caller, we should allocate
- // memory from heap and copy its data
- if (cras_main_message_send_msg)
- free(cras_main_message_send_msg);
- cras_main_message_send_msg =
- (struct cras_main_message*)calloc(1, msg->length);
- memcpy((void*)cras_main_message_send_msg, (void*)msg, msg->length);
- return 0;
-}
-
-int cras_main_message_add_handler(enum CRAS_MAIN_MESSAGE_TYPE type,
- cras_message_callback callback,
- void* callback_data) {
- cras_main_message_add_handler_callback = callback;
- cras_main_message_add_handler_callback_data = callback_data;
- return 0;
-}
-
-/* From cras_system_state */
-struct cras_tm* cras_system_state_get_tm() {
- return NULL;
-}
-
-/* From cras_tm */
-struct cras_timer* cras_tm_create_timer(struct cras_tm* tm,
- unsigned int ms,
- void (*cb)(struct cras_timer* t,
- void* data),
- void* cb_data) {
- cras_tm_create_timer_called++;
- cras_tm_create_timer_cb = cb;
- cras_tm_create_timer_cb_data = cb_data;
- return cras_tm_create_timer_ret;
-}
-
-void cras_tm_cancel_timer(struct cras_tm* tm, struct cras_timer* t) {
- cras_tm_cancel_timer_called++;
- cras_tm_cancel_timer_arg = t;
-}
-
-DBusMessage* dbus_message_new_method_call(const char* destination,
- const char* path,
- const char* iface,
- const char* method) {
- dbus_message_new_method_call_called++;
- dbus_message_new_method_call_method = method;
- return reinterpret_cast<DBusMessage*>(0x456);
-}
-
-void dbus_message_unref(DBusMessage* message) {}
-
-dbus_bool_t dbus_message_append_args(DBusMessage* message,
- int first_arg_type,
- ...) {
- return true;
-}
-
-dbus_bool_t dbus_connection_send_with_reply(DBusConnection* connection,
- DBusMessage* message,
- DBusPendingCall** pending_return,
- int timeout_milliseconds) {
- return true;
-}
-
-dbus_bool_t dbus_pending_call_set_notify(DBusPendingCall* pending,
- DBusPendingCallNotifyFunction function,
- void* user_data,
- DBusFreeFunction free_user_data) {
- return true;
-}
-
-void dbus_message_iter_recurse(DBusMessageIter* iter, DBusMessageIter* sub) {
- MockDBusMessage* msg = *(MockDBusMessage**)iter;
- MockDBusMessage** cur = (MockDBusMessage**)sub;
- *cur = msg->recurse;
-}
-
-dbus_bool_t dbus_message_iter_next(DBusMessageIter* iter) {
- MockDBusMessage** cur = (MockDBusMessage**)iter;
- MockDBusMessage* msg = *cur;
- *cur = msg->next;
- return true;
-}
-
-int dbus_message_iter_get_arg_type(DBusMessageIter* iter) {
- MockDBusMessage* msg;
-
- if (iter == NULL)
- return DBUS_TYPE_INVALID;
-
- msg = *(MockDBusMessage**)iter;
- if (msg == NULL)
- return DBUS_TYPE_INVALID;
-
- return msg->type;
-}
-
-void dbus_message_iter_get_basic(DBusMessageIter* iter, void* value) {
- MockDBusMessage* msg = *(MockDBusMessage**)iter;
- switch (msg->type) {
- case DBUS_TYPE_BOOLEAN:
- memcpy(value, &msg->value, sizeof(int));
- break;
- case DBUS_TYPE_STRING:
- memcpy(value, &msg->value, sizeof(char*));
- break;
- }
-}
-
-} // extern "C"
-} // namespace
-
-int main(int argc, char** argv) {
- ::testing::InitGoogleTest(&argc, argv);
- return RUN_ALL_TESTS();
-}