1 /* Copyright (c) 2013 The Chromium OS Authors. All rights reserved. 2 * Use of this source code is governed by a BSD-style license that can be 3 * found in the LICENSE file. 4 */ 5 6 #include <dbus/dbus.h> 7 #include <gtest/gtest.h> 8 #include <stdio.h> 9 #include <sys/socket.h> 10 11 #include "dbus_test.h" 12 13 extern "C" { 14 #include "cras_bt_constants.h" 15 #include "cras_bt_profile.h" 16 } 17 18 namespace { 19 20 static struct cras_bt_profile fake_profile; 21 static struct cras_bt_transport *fake_transport; 22 static int profile_release_called; 23 static struct cras_bt_profile *profile_release_arg_value; 24 static int profile_new_connection_called; 25 static struct cras_bt_transport *profile_new_connection_arg_value; 26 static int profile_request_disconnection_called; 27 static struct cras_bt_transport *profile_request_disconnection_arg_value; 28 static int profile_cancel_called; 29 static struct cras_bt_profile *profile_cancel_arg_value; 30 static int cras_bt_transport_get_called; 31 static const char *cras_bt_transport_get_arg_value; 32 33 void fake_profile_release(struct cras_bt_profile *profile); 34 void fake_profile_new_connection(struct cras_bt_profile *profile, 35 struct cras_bt_transport *transport); 36 void fake_profile_request_disconnection(struct cras_bt_profile *profile, 37 struct cras_bt_transport *transport); 38 void fake_profile_cancel(struct cras_bt_profile *profile); 39 40 class BtProfileTestSuite : public DBusTest { 41 virtual void SetUp() { 42 DBusTest::SetUp(); 43 44 profile_release_called = 0; 45 profile_new_connection_called = 0; 46 profile_request_disconnection_called = 0; 47 profile_cancel_called = 0; 48 49 fake_profile.name = "fake"; 50 fake_profile.object_path = "/fake"; 51 fake_profile.uuid = "0"; 52 fake_profile.version = 0; 53 fake_profile.role = NULL; 54 fake_profile.features = 0; 55 fake_profile.release = fake_profile_release; 56 fake_profile.new_connection = fake_profile_new_connection; 57 fake_profile.request_disconnection = fake_profile_request_disconnection; 58 fake_profile.cancel = fake_profile_cancel; 59 60 fake_transport = reinterpret_cast<struct cras_bt_transport*>(0x321); 61 cras_bt_transport_get_called = 0; 62 } 63 }; 64 65 TEST_F(BtProfileTestSuite, RegisterProfile) { 66 struct cras_bt_profile *profile; 67 68 ExpectMethodCall(PROFILE_MANAGER_OBJ_PATH, BLUEZ_PROFILE_MGMT_INTERFACE, 69 "RegisterProfile") 70 .WithObjectPath("/fake") 71 .SendReply(); 72 73 cras_bt_add_profile(conn_, &fake_profile); 74 cras_bt_register_profiles(conn_); 75 76 WaitForMatches(); 77 profile = cras_bt_profile_get("/fake"); 78 79 EXPECT_TRUE(profile == &fake_profile); 80 } 81 82 TEST_F(BtProfileTestSuite, ResetProfile) { 83 cras_bt_add_profile(conn_, &fake_profile); 84 cras_bt_profile_reset(); 85 86 ASSERT_EQ(1, profile_release_called); 87 } 88 89 TEST_F(BtProfileTestSuite, HandleMessage) { 90 ExpectMethodCall(PROFILE_MANAGER_OBJ_PATH, BLUEZ_PROFILE_MGMT_INTERFACE, 91 "RegisterProfile") 92 .WithObjectPath("/fake") 93 .SendReply(); 94 95 cras_bt_add_profile(conn_, &fake_profile); 96 cras_bt_register_profiles(conn_); 97 98 WaitForMatches(); 99 100 /* Use stdin as mock fd */ 101 CreateMessageCall("/fake", "org.bluez.Profile1", "NewConnection") 102 .WithString("device") 103 .WithUnixFd(0) 104 .Send(); 105 106 WaitForMatches(); 107 ASSERT_EQ(1, profile_new_connection_called); 108 ASSERT_STREQ("device", cras_bt_transport_get_arg_value); 109 ASSERT_EQ(1, cras_bt_transport_get_called); 110 ASSERT_EQ(fake_transport, profile_new_connection_arg_value); 111 112 CreateMessageCall("/fake", "org.bluez.Profile1", "RequestDisconnection") 113 .WithString("device") 114 .Send(); 115 WaitForMatches(); 116 ASSERT_EQ(2, cras_bt_transport_get_called); 117 ASSERT_EQ(1, profile_request_disconnection_called); 118 ASSERT_EQ(fake_transport, profile_request_disconnection_arg_value); 119 120 CreateMessageCall("/fake", "org.bluez.Profile1", "Release") 121 .Send(); 122 WaitForMatches(); 123 ASSERT_EQ(1, profile_release_called); 124 ASSERT_EQ(&fake_profile, profile_release_arg_value); 125 126 CreateMessageCall("/fake", "org.bluez.Profile1", "Cancel") 127 .Send(); 128 WaitForMatches(); 129 ASSERT_EQ(1, profile_cancel_called); 130 ASSERT_EQ(&fake_profile, profile_cancel_arg_value); 131 } 132 133 void fake_profile_release(struct cras_bt_profile *profile) 134 { 135 profile_release_arg_value = profile; 136 profile_release_called++; 137 } 138 139 void fake_profile_new_connection(struct cras_bt_profile *profile, 140 struct cras_bt_transport *transport) 141 { 142 profile_new_connection_arg_value = transport; 143 profile_new_connection_called++; 144 } 145 146 void fake_profile_request_disconnection(struct cras_bt_profile *profile, 147 struct cras_bt_transport *transport) 148 { 149 profile_request_disconnection_arg_value = transport; 150 profile_request_disconnection_called++; 151 } 152 153 void fake_profile_cancel(struct cras_bt_profile *profile) 154 { 155 profile_cancel_arg_value = profile; 156 profile_cancel_called++; 157 } 158 159 } // namespace 160 161 extern "C" { 162 dbus_bool_t append_key_value(DBusMessageIter *iter, const char *key, 163 int type, const char *type_string, 164 void *value) 165 { 166 return TRUE; 167 } 168 169 struct cras_bt_transport *cras_bt_transport_get(const char *object_path) 170 { 171 cras_bt_transport_get_called++; 172 cras_bt_transport_get_arg_value = object_path; 173 return fake_transport; 174 } 175 176 void cras_bt_transport_destroy(struct cras_bt_transport *transport) 177 { 178 } 179 180 struct cras_bt_transport *cras_bt_transport_create(DBusConnection *conn, 181 const char *object_path) 182 { 183 return fake_transport; 184 } 185 186 } // extern "C" 187 188 int main(int argc, char **argv) { 189 ::testing::InitGoogleTest(&argc, argv); 190 return RUN_ALL_TESTS(); 191 } 192