普通文本  |  155行  |  4.12 KB

// Copyright 2016 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 <stdio.h>
#include <gtest/gtest.h>

extern "C" {
#include "cras_device_monitor.c"
#include "cras_iodev.h"
#include "cras_main_message.h"
}

static enum CRAS_MAIN_MESSAGE_TYPE type_set;
static struct cras_device_monitor_message *sent_msg;
static int enable_dev_called;
static cras_iodev *enable_dev;
static int disable_dev_called;
static cras_iodev *disable_dev;
static int set_mute_called;
static cras_iodev *mute_dev;

void ResetStubData() {
  type_set = (enum CRAS_MAIN_MESSAGE_TYPE)0;
  enable_dev_called = 0;
  enable_dev = NULL;
  disable_dev_called = 0;
  disable_dev = NULL;
  set_mute_called = 0;
  mute_dev = NULL;
}

namespace {

TEST(DeviceMonitorTestSuite, Init) {
  ResetStubData();

  cras_device_monitor_init();

  EXPECT_EQ(type_set, CRAS_MAIN_MONITOR_DEVICE);
}

TEST(DeviceMonitorTestSuite, ResetDevice) {
  struct cras_iodev dev;
  ResetStubData();
  // sent_msg will be filled with message content in cras_main_message_send.
  sent_msg = (struct cras_device_monitor_message *)calloc(1, sizeof(*sent_msg));

  cras_device_monitor_reset_device(&dev);

  EXPECT_EQ(sent_msg->header.type, CRAS_MAIN_MONITOR_DEVICE);
  EXPECT_EQ(sent_msg->header.length, sizeof(*sent_msg));
  EXPECT_EQ(sent_msg->message_type, RESET_DEVICE);
  EXPECT_EQ(sent_msg->iodev, &dev);

  free(sent_msg);
}

TEST(DeviceMonitorTestSuite, HandleResetDevice) {
  struct cras_iodev dev;
  struct cras_device_monitor_message msg;
  struct cras_main_message *main_message =
      reinterpret_cast<struct cras_main_message *>(&msg);

  ResetStubData();

  // Filled msg with message content for resetting device.
  init_device_msg(&msg, RESET_DEVICE, &dev);
  // Assume the pipe works fine and main message handler receives the same
  // message.
  handle_device_message(main_message, NULL);

  // Verify that disable/enable functions are called with correct device.
  EXPECT_EQ(enable_dev_called, 1);
  EXPECT_EQ(enable_dev, &dev);
  EXPECT_EQ(disable_dev_called, 1);
  EXPECT_EQ(disable_dev, &dev);
}

TEST(DeviceMonitorTestSuite, MuteDevice) {
  struct cras_iodev dev;
  ResetStubData();
  // sent_msg will be filled with message content in cras_main_message_send.
  sent_msg = (struct cras_device_monitor_message *)calloc(1, sizeof(*sent_msg));

  cras_device_monitor_set_device_mute_state(&dev);

  EXPECT_EQ(sent_msg->header.type, CRAS_MAIN_MONITOR_DEVICE);
  EXPECT_EQ(sent_msg->header.length, sizeof(*sent_msg));
  EXPECT_EQ(sent_msg->message_type, SET_MUTE_STATE);
  EXPECT_EQ(sent_msg->iodev, &dev);

  free(sent_msg);
}

TEST(DeviceMonitorTestSuite, HandleMuteDevice) {
  struct cras_iodev dev;
  struct cras_device_monitor_message msg;
  struct cras_main_message *main_message =
      reinterpret_cast<struct cras_main_message *>(&msg);

  ResetStubData();

  // Filled msg with message content for device mute/unmute.
  init_device_msg(&msg, SET_MUTE_STATE, &dev);
  // Assume the pipe works fine and main message handler receives the same
  // message.
  handle_device_message(main_message, NULL);

  // Verify that cras_iodev_set_mute is called with correct device.
  EXPECT_EQ(set_mute_called, 1);
  EXPECT_EQ(mute_dev, &dev);
}

extern "C" {

int cras_main_message_add_handler(enum CRAS_MAIN_MESSAGE_TYPE type,
                                  cras_message_callback callback,
                                  void *callback_data) {
  type_set = type;
  return 0;
}

int cras_main_message_send(struct cras_main_message *msg) {
  // Copy the sent message so we can examine it in the test later.
  memcpy(sent_msg, msg, sizeof(*sent_msg));
  return 0;
};

void cras_iodev_list_enable_dev(struct cras_iodev *dev) {
  enable_dev_called++;
  enable_dev = dev;
}

void cras_iodev_list_disable_dev(struct cras_iodev *dev, bool force) {
  disable_dev_called++;
  disable_dev = dev;
}

int cras_iodev_set_mute(struct cras_iodev *dev) {
  set_mute_called++;
  mute_dev = dev;
  return 0;
}

}  // extern "C"
}  // namespace

int main(int argc, char **argv) {
  ::testing::InitGoogleTest(&argc, argv);
  int rc = RUN_ALL_TESTS();

  return rc;
}