Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cdde1c97 authored by Jakub Tyszkowski's avatar Jakub Tyszkowski
Browse files

LeAudio: Fix unsuported offload capabilities config

In a case where a json file configurations for a particualar
context do not match any of the offloader capabilities, we
were returning a random memory address as an audio set configuration
pointer.

Bug: 295972694
Test: atest --host bluetooth_le_audio_test bluetooth_le_audio_client_test bluetooth_test_broadcaster bluetooth_test_broadcaster_state_machine bluetooth_le_audio_codec_manager_test
Change-Id: I03d22725e081cac45df4bbeada929e626093ab2f
parent 35d9faff
Loading
Loading
Loading
Loading
+3 −1
Original line number Original line Diff line number Diff line
@@ -173,7 +173,9 @@ struct codec_manager_impl {


  const AudioSetConfigurations* GetOffloadCodecConfig(
  const AudioSetConfigurations* GetOffloadCodecConfig(
      types::LeAudioContextType ctx_type) {
      types::LeAudioContextType ctx_type) {
    return &context_type_offload_config_map_[ctx_type];
    return context_type_offload_config_map_.count(ctx_type)
               ? &context_type_offload_config_map_[ctx_type]
               : nullptr;
  }
  }


  void UpdateSupportedBroadcastConfig(
  void UpdateSupportedBroadcastConfig(
+54 −5
Original line number Original line Diff line number Diff line
@@ -21,6 +21,7 @@


#include "btm_api_mock.h"
#include "btm_api_mock.h"
#include "gd/common/init_flags.h"
#include "gd/common/init_flags.h"
#include "le_audio_set_configuration_provider.h"
#include "mock_controller.h"
#include "mock_controller.h"
#include "osi/include/properties.h"
#include "osi/include/properties.h"
#include "stack/acl/acl.h"
#include "stack/acl/acl.h"
@@ -45,7 +46,10 @@ T& le_audio::types::BidirectionalPair<T>::get(uint8_t direction) {
  return (direction == le_audio::types::kLeAudioDirectionSink) ? sink : source;
  return (direction == le_audio::types::kLeAudioDirectionSink) ? sink : source;
}
}


std::vector<AudioSetConfiguration> offload_capabilities(0);
static const std::vector<AudioSetConfiguration> offload_capabilities_none(0);

const std::vector<AudioSetConfiguration>* offload_capabilities =
    &offload_capabilities_none;


const char* test_flags[] = {
const char* test_flags[] = {
    "INIT_default_log_level_str=LOG_VERBOSE",
    "INIT_default_log_level_str=LOG_VERBOSE",
@@ -55,7 +59,7 @@ namespace bluetooth {
namespace audio {
namespace audio {
namespace le_audio {
namespace le_audio {
std::vector<AudioSetConfiguration> get_offload_capabilities() {
std::vector<AudioSetConfiguration> get_offload_capabilities() {
  return offload_capabilities;
  return *offload_capabilities;
}
}
}  // namespace le_audio
}  // namespace le_audio
}  // namespace audio
}  // namespace audio
@@ -64,6 +68,11 @@ std::vector<AudioSetConfiguration> get_offload_capabilities() {
namespace le_audio {
namespace le_audio {
namespace {
namespace {


void set_mock_offload_capabilities(
    const std::vector<AudioSetConfiguration>& caps) {
  offload_capabilities = &caps;
}

static constexpr char kPropLeAudioOffloadSupported[] =
static constexpr char kPropLeAudioOffloadSupported[] =
    "ro.bluetooth.leaudio_offload.supported";
    "ro.bluetooth.leaudio_offload.supported";
static constexpr char kPropLeAudioOffloadDisabled[] =
static constexpr char kPropLeAudioOffloadDisabled[] =
@@ -73,8 +82,7 @@ class CodecManagerTestBase : public Test {
 public:
 public:
  virtual void SetUp() override {
  virtual void SetUp() override {
    bluetooth::common::InitFlags::Load(test_flags);
    bluetooth::common::InitFlags::Load(test_flags);

    set_mock_offload_capabilities(offload_capabilities_none);
    offload_capabilities.clear();


    ON_CALL(controller_interface, SupportsBleIsochronousBroadcaster)
    ON_CALL(controller_interface, SupportsBleIsochronousBroadcaster)
        .WillByDefault(Return(true));
        .WillByDefault(Return(true));
@@ -275,8 +283,49 @@ TEST_F(CodecManagerTestAdsp, testStreamConfigurationAdspDownMix) {
  }
  }
}
}


TEST_F(CodecManagerTestAdsp, test_capabilities_none) {
  const std::vector<bluetooth::le_audio::btle_audio_codec_config_t>
      offloading_preference(0);
  codec_manager->Start(offloading_preference);

  // Verify every context
  for (::le_audio::types::LeAudioContextType ctx_type :
       ::le_audio::types::kLeAudioContextAllTypesArray) {
    ASSERT_EQ(nullptr, codec_manager->GetOffloadCodecConfig(ctx_type));
  }
}

TEST_F(CodecManagerTestAdsp, test_capabilities) {
  for (auto test_context : ::le_audio::types::kLeAudioContextAllTypesArray) {
    // Build the offloader capabilities vector using the configuration provider
    // in HOST mode to get all the .json filce configuration entries.
    std::vector<AudioSetConfiguration> offload_capabilities;
    AudioSetConfigurationProvider::Initialize(
        le_audio::types::CodecLocation::HOST);
    for (auto& cap : *AudioSetConfigurationProvider::Get()->GetConfigurations(
             test_context)) {
      offload_capabilities.push_back(*cap);
    }
    ASSERT_NE(0u, offload_capabilities.size());
    set_mock_offload_capabilities(offload_capabilities);
    // Clean up before the codec manager starts it in ADSP mode.
    AudioSetConfigurationProvider::Cleanup();

    const std::vector<bluetooth::le_audio::btle_audio_codec_config_t>
        offloading_preference = {
            {bluetooth::le_audio::LE_AUDIO_CODEC_INDEX_SOURCE_LC3}};
    codec_manager->Start(offloading_preference);

    auto cfg = codec_manager->GetOffloadCodecConfig(test_context);
    ASSERT_NE(nullptr, cfg);
    ASSERT_EQ(offload_capabilities.size(), cfg->size());

    // Clean up the before testing any other offload capabilities.
    codec_manager->Stop();
  }
}

// TODO: Add the unit tests for:
// TODO: Add the unit tests for:
// GetOffloadCodecConfig
// GetBroadcastOffloadConfig
// GetBroadcastOffloadConfig
// UpdateBroadcastConnHandle
// UpdateBroadcastConnHandle