普通文本  |  192行  |  5.39 KB

/* 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;

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_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();
}