chromium/extensions/browser/api/audio/audio_service_utils_unittest.cc

// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "extensions/browser/api/audio/audio_service_utils.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace extensions {

TEST(AudioServiceUtilsTest, ConvertStreamTypeFromMojom) {
  EXPECT_EQ(ConvertStreamTypeFromMojom(crosapi::mojom::StreamType::kNone),
            api::audio::StreamType::kNone);
  EXPECT_EQ(ConvertStreamTypeFromMojom(crosapi::mojom::StreamType::kInput),
            api::audio::StreamType::kInput);
  EXPECT_EQ(ConvertStreamTypeFromMojom(crosapi::mojom::StreamType::kOutput),
            api::audio::StreamType::kOutput);
}

TEST(AudioServiceUtilsTest, ConvertStreamTypeToMojom) {
  EXPECT_EQ(crosapi::mojom::StreamType::kNone,
            ConvertStreamTypeToMojom(api::audio::StreamType::kNone));
  EXPECT_EQ(crosapi::mojom::StreamType::kInput,
            ConvertStreamTypeToMojom(api::audio::StreamType::kInput));
  EXPECT_EQ(crosapi::mojom::StreamType::kOutput,
            ConvertStreamTypeToMojom(api::audio::StreamType::kOutput));
}

TEST(AudioServiceUtilsTest, ConvertDeviceTypeFromMojom) {
  const int mojom_max_value =
      static_cast<int>(crosapi::mojom::DeviceType::kMaxValue);
  const int ext_max_value = static_cast<int>(api::audio::DeviceType::kMaxValue);

  ASSERT_EQ(ext_max_value, mojom_max_value);

  for (int i = 0; i <= mojom_max_value; ++i) {
    EXPECT_EQ(
        ConvertDeviceTypeFromMojom(static_cast<crosapi::mojom::DeviceType>(i)),
        static_cast<api::audio::DeviceType>(i));
  }
}

TEST(AudioServiceUtilsTest, ConvertDeviceTypeToMojom) {
  const int mojom_max_value =
      static_cast<int>(crosapi::mojom::DeviceType::kMaxValue);
  const int ext_max_value = static_cast<int>(api::audio::DeviceType::kMaxValue);

  ASSERT_EQ(ext_max_value, mojom_max_value);

  for (int i = 0; i <= ext_max_value; ++i) {
    EXPECT_EQ(ConvertDeviceTypeToMojom(static_cast<api::audio::DeviceType>(i)),
              static_cast<crosapi::mojom::DeviceType>(i));
  }
}

TEST(AudioServiceUtilsTest, ConvertDeviceFilterFromMojomNull) {
  crosapi::mojom::DeviceFilterPtr empty;
  EXPECT_EQ(ConvertDeviceFilterFromMojom(empty), nullptr);
}

TEST(AudioServiceUtilsTest, ConvertDeviceFilterFromMojomActiveState) {
  auto input = crosapi::mojom::DeviceFilter::New();
  std::unique_ptr<api::audio::DeviceFilter> result;

  input->includedActiveState =
      crosapi::mojom::DeviceFilter::ActiveState::kUnset;
  result = ConvertDeviceFilterFromMojom(input);
  EXPECT_TRUE(result && !result->is_active);

  input->includedActiveState =
      crosapi::mojom::DeviceFilter::ActiveState::kInactive;
  result = ConvertDeviceFilterFromMojom(input);
  EXPECT_TRUE(result && result->is_active && (*result->is_active == false));

  input->includedActiveState =
      crosapi::mojom::DeviceFilter::ActiveState::kActive;
  result = ConvertDeviceFilterFromMojom(input);
  EXPECT_TRUE(result && result->is_active && (*result->is_active == true));
}

TEST(AudioServiceUtilsTest, ConvertDeviceFilterFromMojomStreamTypes) {
  auto input = crosapi::mojom::DeviceFilter::New();
  std::unique_ptr<api::audio::DeviceFilter> result;

  // first input without stream types
  result = ConvertDeviceFilterFromMojom(input);
  EXPECT_TRUE(result && !result->stream_types);

  // empty stream types vector
  input->includedStreamTypes = std::vector<crosapi::mojom::StreamType>();
  result = ConvertDeviceFilterFromMojom(input);
  EXPECT_TRUE(result && result->stream_types && result->stream_types->empty());

  // nonempty stream types vector
  input->includedStreamTypes = {crosapi::mojom::StreamType::kInput,
                                crosapi::mojom::StreamType::kOutput,
                                crosapi::mojom::StreamType::kInput};
  std::vector<api::audio::StreamType> expected = {
      api::audio::StreamType::kInput, api::audio::StreamType::kOutput,
      api::audio::StreamType::kInput};
  result = ConvertDeviceFilterFromMojom(input);
  EXPECT_TRUE(result && result->stream_types &&
              (*result->stream_types == expected));
}

// crosapi::mojom::DeviceFilterPtr ConvertDeviceFilterToMojom(
//     const api::audio::DeviceFilter* filter);

TEST(AudioServiceUtilsTest, ConvertDeviceFilterToMojomNull) {
  auto expected = crosapi::mojom::DeviceFilter::New();
  EXPECT_EQ(ConvertDeviceFilterToMojom(nullptr), expected);
}

TEST(AudioServiceUtilsTest, ConvertDeviceFilterToMojomActiveState) {
  crosapi::mojom::DeviceFilterPtr result;
  auto input = std::make_unique<api::audio::DeviceFilter>();

  result = ConvertDeviceFilterToMojom(input.get());
  EXPECT_TRUE(result && (result->includedActiveState ==
                         crosapi::mojom::DeviceFilter::ActiveState::kUnset));

  input->is_active = false;
  result = ConvertDeviceFilterToMojom(input.get());
  EXPECT_TRUE(result && (result->includedActiveState ==
                         crosapi::mojom::DeviceFilter::ActiveState::kInactive));

  input->is_active = true;
  result = ConvertDeviceFilterToMojom(input.get());
  EXPECT_TRUE(result && (result->includedActiveState ==
                         crosapi::mojom::DeviceFilter::ActiveState::kActive));
}

TEST(AudioServiceUtilsTest, ConvertDeviceFilterToMojomStreamTypes) {
  crosapi::mojom::DeviceFilterPtr result;
  auto input = std::make_unique<api::audio::DeviceFilter>();

  input->stream_types = std::nullopt;
  result = ConvertDeviceFilterToMojom(input.get());
  EXPECT_TRUE(result && !result->includedStreamTypes);

  input->stream_types.emplace();
  result = ConvertDeviceFilterToMojom(input.get());
  EXPECT_TRUE(result && result->includedStreamTypes &&
              result->includedStreamTypes->empty());

  std::vector<crosapi::mojom::StreamType> expected = {
      crosapi::mojom::StreamType::kOutput, crosapi::mojom::StreamType::kInput,
      crosapi::mojom::StreamType::kInput};
  input->stream_types.emplace({api::audio::StreamType::kOutput,
                               api::audio::StreamType::kInput,
                               api::audio::StreamType::kInput});
  result = ConvertDeviceFilterToMojom(input.get());
  EXPECT_TRUE(result && result->includedStreamTypes &&
              (*result->includedStreamTypes == expected));
}

TEST(AudioServiceUtilsTest, ConvertAudioDeviceInfoFromMojom) {
  const std::string test_id = "test_id";
  const std::string test_display_name = "test_display_name";
  const std::string test_device_name = "test_device_name";
  const bool test_is_active = true;
  const int test_level = 33;
  const std::string test_stable_device_id = "test_stable_device_id";

  auto input = crosapi::mojom::AudioDeviceInfo::New();
  input->deviceName = test_device_name;
  input->deviceType = crosapi::mojom::DeviceType::kBluetooth;
  input->displayName = test_display_name;
  input->id = test_id;
  input->isActive = test_is_active;
  input->level = test_level;
  input->stableDeviceId = test_stable_device_id;
  input->streamType = crosapi::mojom::StreamType::kOutput;

  auto result = ConvertAudioDeviceInfoFromMojom(input);
  EXPECT_EQ(result.id, test_id);
  EXPECT_EQ(result.stream_type, api::audio::StreamType::kOutput);
  EXPECT_EQ(result.device_type, api::audio::DeviceType::kBluetooth);
  EXPECT_EQ(result.display_name, test_display_name);
  EXPECT_EQ(result.device_name, test_device_name);
  EXPECT_EQ(result.is_active, test_is_active);
  EXPECT_EQ(result.level, test_level);
  EXPECT_TRUE(result.stable_device_id &&
              (*result.stable_device_id == test_stable_device_id));
}

TEST(AudioServiceUtilsTest, ConvertAudioDeviceInfoToMojom) {
  const std::string test_id = "0";
  const std::string test_display_name = "Test Microphone";
  const std::string test_device_name = "mic555";
  const bool test_is_active = false;
  const int test_level = 50;
  const std::string test_stable_device_id = "5";

  api::audio::AudioDeviceInfo input;
  input.id = test_id;
  input.stream_type = api::audio::StreamType::kInput;
  input.device_type = api::audio::DeviceType::kMic;
  input.display_name = test_display_name;
  input.device_name = test_device_name;
  input.is_active = test_is_active;
  input.level = test_level;
  input.stable_device_id = test_stable_device_id;

  auto result = ConvertAudioDeviceInfoToMojom(input);
  ASSERT_TRUE(result);
  EXPECT_EQ(result->id, test_id);
  EXPECT_EQ(result->streamType, crosapi::mojom::StreamType::kInput);
  EXPECT_EQ(result->deviceType, crosapi::mojom::DeviceType::kMic);
  EXPECT_EQ(result->displayName, test_display_name);
  EXPECT_EQ(result->deviceName, test_device_name);
  EXPECT_EQ(result->isActive, test_is_active);
  EXPECT_EQ(result->level, test_level);
  EXPECT_TRUE(result->stableDeviceId &&
              (*result->stableDeviceId == test_stable_device_id));
}

TEST(AudioServiceUtilsTest, ConvertDeviceIdListsToMojomNull) {
  auto result = ConvertDeviceIdListsToMojom(nullptr, nullptr);
  ASSERT_TRUE(result);
  EXPECT_TRUE(result->inputs.empty());
  EXPECT_TRUE(result->outputs.empty());
}

TEST(AudioServiceUtilsTest, ConvertDeviceIdListsToMojomInputs) {
  std::vector<std::string> test_inputs = {"id0", "id1", "test_id"};
  auto result = ConvertDeviceIdListsToMojom(&test_inputs, nullptr);
  ASSERT_TRUE(result);
  EXPECT_EQ(result->inputs, test_inputs);
  EXPECT_TRUE(result->outputs.empty());
}

TEST(AudioServiceUtilsTest, ConvertDeviceIdListsToMojomOutputs) {
  std::vector<std::string> test_outputs = {"out0", "out1"};
  auto result = ConvertDeviceIdListsToMojom(nullptr, &test_outputs);
  ASSERT_TRUE(result);
  EXPECT_TRUE(result->inputs.empty());
  EXPECT_EQ(result->outputs, test_outputs);
}

}  // namespace extensions