/* Copyright (c) 2013 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 #include #include #include #include "dbus_test.h" extern "C" { #include "cras_bt_constants.h" #include "cras_bt_profile.h" } namespace { static struct cras_bt_profile fake_profile; static struct cras_bt_transport* fake_transport; static int profile_release_called; static struct cras_bt_profile* profile_release_arg_value; static int profile_new_connection_called; static struct cras_bt_transport* profile_new_connection_arg_value; static int profile_request_disconnection_called; static struct cras_bt_transport* profile_request_disconnection_arg_value; static int profile_cancel_called; static struct cras_bt_profile* profile_cancel_arg_value; static int cras_bt_transport_get_called; static const char* cras_bt_transport_get_arg_value; void fake_profile_release(struct cras_bt_profile* profile); void fake_profile_new_connection(struct cras_bt_profile* profile, struct cras_bt_transport* transport); void fake_profile_request_disconnection(struct cras_bt_profile* profile, struct cras_bt_transport* transport); void fake_profile_cancel(struct cras_bt_profile* profile); class BtProfileTestSuite : public DBusTest { virtual void SetUp() { DBusTest::SetUp(); profile_release_called = 0; profile_new_connection_called = 0; profile_request_disconnection_called = 0; profile_cancel_called = 0; fake_profile.name = "fake"; fake_profile.object_path = "/fake"; fake_profile.uuid = "0"; fake_profile.version = 0; fake_profile.role = NULL; fake_profile.features = 0; fake_profile.release = fake_profile_release; fake_profile.new_connection = fake_profile_new_connection; fake_profile.request_disconnection = fake_profile_request_disconnection; fake_profile.cancel = fake_profile_cancel; fake_transport = reinterpret_cast(0x321); cras_bt_transport_get_called = 0; } }; TEST_F(BtProfileTestSuite, RegisterProfile) { struct cras_bt_profile* profile; ExpectMethodCall(PROFILE_MANAGER_OBJ_PATH, BLUEZ_PROFILE_MGMT_INTERFACE, "RegisterProfile") .WithObjectPath("/fake") .SendReply(); cras_bt_add_profile(conn_, &fake_profile); cras_bt_register_profiles(conn_); WaitForMatches(); profile = cras_bt_profile_get("/fake"); EXPECT_TRUE(profile == &fake_profile); } TEST_F(BtProfileTestSuite, ResetProfile) { cras_bt_add_profile(conn_, &fake_profile); cras_bt_profile_reset(); ASSERT_EQ(1, profile_release_called); } TEST_F(BtProfileTestSuite, HandleMessage) { ExpectMethodCall(PROFILE_MANAGER_OBJ_PATH, BLUEZ_PROFILE_MGMT_INTERFACE, "RegisterProfile") .WithObjectPath("/fake") .SendReply(); cras_bt_add_profile(conn_, &fake_profile); cras_bt_register_profiles(conn_); WaitForMatches(); /* Use stdin as mock fd */ CreateMessageCall("/fake", "org.bluez.Profile1", "NewConnection") .WithString("device") .WithUnixFd(0) .Send(); WaitForMatches(); ASSERT_EQ(1, profile_new_connection_called); ASSERT_STREQ("device", cras_bt_transport_get_arg_value); ASSERT_EQ(1, cras_bt_transport_get_called); ASSERT_EQ(fake_transport, profile_new_connection_arg_value); CreateMessageCall("/fake", "org.bluez.Profile1", "RequestDisconnection") .WithString("device") .Send(); WaitForMatches(); ASSERT_EQ(2, cras_bt_transport_get_called); ASSERT_EQ(1, profile_request_disconnection_called); ASSERT_EQ(fake_transport, profile_request_disconnection_arg_value); CreateMessageCall("/fake", "org.bluez.Profile1", "Release").Send(); WaitForMatches(); ASSERT_EQ(1, profile_release_called); ASSERT_EQ(&fake_profile, profile_release_arg_value); CreateMessageCall("/fake", "org.bluez.Profile1", "Cancel").Send(); WaitForMatches(); ASSERT_EQ(1, profile_cancel_called); ASSERT_EQ(&fake_profile, profile_cancel_arg_value); } void fake_profile_release(struct cras_bt_profile* profile) { profile_release_arg_value = profile; profile_release_called++; } void fake_profile_new_connection(struct cras_bt_profile* profile, struct cras_bt_transport* transport) { profile_new_connection_arg_value = transport; profile_new_connection_called++; } void fake_profile_request_disconnection(struct cras_bt_profile* profile, struct cras_bt_transport* transport) { profile_request_disconnection_arg_value = transport; profile_request_disconnection_called++; } void fake_profile_cancel(struct cras_bt_profile* profile) { profile_cancel_arg_value = profile; profile_cancel_called++; } } // namespace extern "C" { dbus_bool_t append_key_value(DBusMessageIter* iter, const char* key, int type, const char* type_string, void* value) { return TRUE; } struct cras_bt_transport* cras_bt_transport_get(const char* object_path) { cras_bt_transport_get_called++; cras_bt_transport_get_arg_value = object_path; return fake_transport; } void cras_bt_transport_destroy(struct cras_bt_transport* transport) {} struct cras_bt_transport* cras_bt_transport_create(DBusConnection* conn, const char* object_path) { return fake_transport; } } // extern "C" int main(int argc, char** argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }