Home | History | Annotate | Download | only in tests
      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