| /* 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 <dbus/dbus.h> |
| #include <gtest/gtest.h> |
| #include <stdio.h> |
| #include <sys/socket.h> |
| |
| #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; |
| static int cras_bt_transport_fill_properties_called; |
| |
| 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<struct cras_bt_transport*>(0x321); |
| cras_bt_transport_fill_properties_called = 0; |
| 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(1, cras_bt_transport_fill_properties_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; |
| } |
| |
| void cras_bt_transport_fill_properties(struct cras_bt_transport *transport, |
| int fd, const char *uuid) |
| { |
| cras_bt_transport_fill_properties_called++; |
| /* Close the duplicated fd */ |
| close(fd); |
| } |
| } // extern "C" |
| |
| int main(int argc, char **argv) { |
| ::testing::InitGoogleTest(&argc, argv); |
| return RUN_ALL_TESTS(); |
| } |