blob: 2398d62dd227f185689318f51fdf46e0c9008b3f [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#include "testutil/testutil.h"
#include "host/ble_hs.h"
#include "host/audio/ble_audio.h"
/**
* BAP_v1.0.1 Table 3.16
* BASE structure for the logical BASE structure example
*/
static const uint8_t example_base[] = {
0x1e, 0x00, 0x00, /* Presentation_Delay: 40 ms */
0x02, /* Num_Subgroups: 2 Subgroups */
0x02, /* Num_BIS[0]: 2 BIS in Subgroup[0] */
0x06, 0x00, 0x00, 0x00, 0x00, /* Codec_ID[0]: LC3 */
0x0a, /* Codec_Specific_Configuration_Length[0] */
0x02, 0x01, 0x08, /* LTV 1: Sampling_Frequency: 48000 Hz */
0x02, 0x02, 0x02, /* LTV 2: Frame_Duration: 10 ms */
0x03, 0x04, 0x64, 0x00, /* LTV 3: Octets_Per_Codec_Frame: 100 octets */
0x09, /* Metadata_Length[0] */
0x03, 0x02, 0x04, 0x00, /* LTV 1: Streaming_Audio_Contexts: Media */
0x04, 0x04, 0x73, 0x70, 0x61, /* LTV 2: Language: Spanish */
0x01, /* BIS_index[0[0]] */
0x06, /* Codec_Specific_Configuration_Length[0[0]] */
0x05, 0x03, 0x01, 0x00, 0x00, 0x00, /* LTV 1 = Audio_Channel_Allocation: FL */
0x02, /* BIS_index[0[1]] */
0x06, /* Codec_Specific_Configuration_Length[0[1]] */
0x05, 0x03, 0x02, 0x00, 0x00, 0x00, /* LTV 1 = Audio_Channel_Allocation: FR */
0x02, /* Num_BIS[1]: 2 BIS in Subgroup[0] */
0x06, 0x00, 0x00, 0x00, 0x00, /* Codec_ID[1]: LC3 */
0x0a, /* Codec_Specific_Configuration_Length[1] */
0x02, 0x01, 0x08, /* LTV 1: Sampling_Frequency: 48000 Hz */
0x02, 0x02, 0x02, /* LTV 2: Frame_Duration: 10 ms */
0x03, 0x04, 0x64, 0x00, /* LTV 3: Octets_Per_Codec_Frame: 100 octets */
0x09, /* Metadata_Length[1] */
0x03, 0x02, 0x04, 0x00, /* LTV 1: Streaming_Audio_Contexts: Media */
0x04, 0x04, 0x65, 0x6e, 0x67, /* LTV 2: Language: English */
0x03, /* BIS_index[1[0]] */
0x06, /* Codec_Specific_Configuration_Length[1[0]] */
0x05, 0x03, 0x01, 0x00, 0x00, 0x00, /* LTV 1 = Audio_Channel_Allocation: FL */
0x04, /* BIS_index[1[1]] */
0x06, /* Codec_Specific_Configuration_Length[1[1]] */
0x05, 0x03, 0x02, 0x00, 0x00, 0x00, /* LTV 1 = Audio_Channel_Allocation: FR */
};
TEST_CASE_SELF(ble_audio_base_parse_test)
{
struct ble_audio_base_subgroup subgroup;
struct ble_audio_base_group group;
struct ble_audio_base_bis bis;
struct ble_audio_base_iter subgroup_iter;
struct ble_audio_base_iter bis_iter;
int rc;
rc = ble_audio_base_parse(example_base, (uint8_t)sizeof(example_base),
&group, &subgroup_iter);
TEST_ASSERT(rc == 0);
TEST_ASSERT(group.presentation_delay == 30);
TEST_ASSERT(group.num_subgroups == 2);
rc = ble_audio_base_subgroup_iter(&subgroup_iter, &subgroup, &bis_iter);
TEST_ASSERT(rc == 0);
TEST_ASSERT(subgroup.codec_id.format == 0x06);
TEST_ASSERT(subgroup.codec_id.company_id == 0x0000);
TEST_ASSERT(subgroup.codec_id.vendor_specific == 0x0000);
TEST_ASSERT(subgroup.codec_spec_config_len == 10);
TEST_ASSERT(subgroup.codec_spec_config != NULL);
TEST_ASSERT(subgroup.metadata_len == 9);
TEST_ASSERT(subgroup.num_bis == 2);
rc = ble_audio_base_bis_iter(&bis_iter, &bis);
TEST_ASSERT(rc == 0);
TEST_ASSERT(bis.index == 0x01);
TEST_ASSERT(bis.codec_spec_config_len == 6);
TEST_ASSERT(bis.codec_spec_config != NULL);
rc = ble_audio_base_bis_iter(&bis_iter, &bis);
TEST_ASSERT(rc == 0);
TEST_ASSERT(bis.index == 0x02);
TEST_ASSERT(bis.codec_spec_config_len == 6);
TEST_ASSERT(bis.codec_spec_config != NULL);
rc = ble_audio_base_bis_iter(&bis_iter, &bis);
TEST_ASSERT(rc == BLE_HS_ENOENT);
rc = ble_audio_base_subgroup_iter(&subgroup_iter, &subgroup, &bis_iter);
TEST_ASSERT(rc == 0);
TEST_ASSERT(subgroup.codec_id.format == 0x06);
TEST_ASSERT(subgroup.codec_id.company_id == 0x0000);
TEST_ASSERT(subgroup.codec_id.vendor_specific == 0x0000);
TEST_ASSERT(subgroup.codec_spec_config_len == 10);
TEST_ASSERT(subgroup.codec_spec_config != NULL);
TEST_ASSERT(subgroup.metadata_len == 9);
TEST_ASSERT(subgroup.num_bis == 2);
rc = ble_audio_base_bis_iter(&bis_iter, &bis);
TEST_ASSERT(rc == 0);
TEST_ASSERT(bis.index == 0x03);
TEST_ASSERT(bis.codec_spec_config_len == 6);
TEST_ASSERT(bis.codec_spec_config != NULL);
rc = ble_audio_base_bis_iter(&bis_iter, &bis);
TEST_ASSERT(rc == 0);
TEST_ASSERT(bis.index == 0x04);
TEST_ASSERT(bis.codec_spec_config_len == 6);
TEST_ASSERT(bis.codec_spec_config != NULL);
rc = ble_audio_base_bis_iter(&bis_iter, &bis);
TEST_ASSERT(rc == BLE_HS_ENOENT);
rc = ble_audio_base_subgroup_iter(&subgroup_iter, &subgroup, &bis_iter);
TEST_ASSERT(rc == BLE_HS_ENOENT);
}
TEST_CASE_SELF(ble_audio_base_parse_test_params)
{
struct ble_audio_base_subgroup subgroup;
struct ble_audio_base_group group;
struct ble_audio_base_bis bis;
struct ble_audio_base_iter subgroup_iter;
struct ble_audio_base_iter bis_iter;
int rc;
rc = ble_audio_base_parse(NULL, (uint8_t)sizeof(example_base), &group, &subgroup_iter);
TEST_ASSERT(rc == BLE_HS_EINVAL);
rc = ble_audio_base_parse(NULL, (uint8_t)sizeof(example_base), NULL, &subgroup_iter);
TEST_ASSERT(rc == BLE_HS_EINVAL);
rc = ble_audio_base_parse(example_base, (uint8_t)sizeof(example_base), &group, NULL);
TEST_ASSERT(rc == 0);
rc = ble_audio_base_parse(example_base, (uint8_t)sizeof(example_base), &group, &subgroup_iter);
TEST_ASSERT(rc == 0);
rc = ble_audio_base_subgroup_iter(NULL, &subgroup, &bis_iter);
TEST_ASSERT(rc == BLE_HS_EINVAL);
rc = ble_audio_base_subgroup_iter(&subgroup_iter, NULL, &bis_iter);
TEST_ASSERT(rc == BLE_HS_EINVAL);
rc = ble_audio_base_subgroup_iter(&subgroup_iter, &subgroup, NULL);
TEST_ASSERT(rc == 0);
rc = ble_audio_base_bis_iter(NULL, &bis);
TEST_ASSERT(rc == BLE_HS_EINVAL);
rc = ble_audio_base_bis_iter(&bis_iter, NULL);
TEST_ASSERT(rc == BLE_HS_EINVAL);
}
TEST_CASE_SELF(ble_audio_base_parse_test_data_length)
{
struct ble_audio_base_subgroup subgroup;
struct ble_audio_base_group group;
struct ble_audio_base_bis bis;
struct ble_audio_base_iter subgroup_iter;
struct ble_audio_base_iter bis_iter;
int rc;
/* Incomplete: empty */
rc = ble_audio_base_parse(example_base, 0, &group, &subgroup_iter);
TEST_ASSERT(rc == BLE_HS_EMSGSIZE);
/* Truncated: Presentation_Delay Parameter */
rc = ble_audio_base_parse(example_base, 2, &group, &subgroup_iter);
TEST_ASSERT(rc == BLE_HS_EMSGSIZE);
/* Incomplete: no Num_Subgroups[0] Parameter */
rc = ble_audio_base_parse(example_base, 3, &group, &subgroup_iter);
TEST_ASSERT(rc == BLE_HS_EMSGSIZE);
/* Incomplete: no Num_BIS[0] Parameter */
rc = ble_audio_base_parse(example_base, 4, &group, &subgroup_iter);
TEST_ASSERT(rc == 0);
rc = ble_audio_base_subgroup_iter(&subgroup_iter, &subgroup, &bis_iter);
TEST_ASSERT(rc == BLE_HS_EMSGSIZE);
/* Truncated: Codec_ID[0] Parameter */
rc = ble_audio_base_parse(example_base, 9, &group, &subgroup_iter);
rc = ble_audio_base_subgroup_iter(&subgroup_iter, &subgroup, &bis_iter);
TEST_ASSERT(rc == BLE_HS_EMSGSIZE);
/* Incomplete: no Codec_Specific_Configuration_Length[0] Parameter */
rc = ble_audio_base_parse(example_base, 13, &group, &subgroup_iter);
rc = ble_audio_base_subgroup_iter(&subgroup_iter, &subgroup, &bis_iter);
TEST_ASSERT(rc == BLE_HS_EMSGSIZE);
/* Truncated: Codec_Specific_Configuration[0] Parameter */
rc = ble_audio_base_parse(example_base, 14, &group, &subgroup_iter);
rc = ble_audio_base_subgroup_iter(&subgroup_iter, &subgroup, &bis_iter);
TEST_ASSERT(rc == BLE_HS_EMSGSIZE);
/* Incomplete: no Metadata_Length[0] Parameter */
rc = ble_audio_base_parse(example_base, 21, &group, &subgroup_iter);
rc = ble_audio_base_subgroup_iter(&subgroup_iter, &subgroup, &bis_iter);
TEST_ASSERT(rc == BLE_HS_EMSGSIZE);
/* Truncated: Metadata[0] Parameter */
rc = ble_audio_base_parse(example_base, 30, &group, &subgroup_iter);
rc = ble_audio_base_subgroup_iter(&subgroup_iter, &subgroup, &bis_iter);
TEST_ASSERT(rc == BLE_HS_EMSGSIZE);
/* Incomplete: no BIS_index[0[0]] Parameter */
rc = ble_audio_base_parse(example_base, 31, &group, &subgroup_iter);
rc = ble_audio_base_subgroup_iter(&subgroup_iter, &subgroup, &bis_iter);
TEST_ASSERT(rc == 0);
rc = ble_audio_base_bis_iter(&bis_iter, &bis);
TEST_ASSERT(rc == BLE_HS_EMSGSIZE);
/* Incomplete: no Codec_Specific_Configuration_Length[0[0]] Parameter */
rc = ble_audio_base_parse(example_base, 32, &group, &subgroup_iter);
rc = ble_audio_base_subgroup_iter(&subgroup_iter, &subgroup, &bis_iter);
rc = ble_audio_base_bis_iter(&bis_iter, &bis);
TEST_ASSERT(rc == BLE_HS_EMSGSIZE);
/* Truncated: Codec_Specific_Configuration_Length[0[0]] Parameter */
rc = ble_audio_base_parse(example_base, 38, &group, &subgroup_iter);
rc = ble_audio_base_subgroup_iter(&subgroup_iter, &subgroup, &bis_iter);
rc = ble_audio_base_bis_iter(&bis_iter, &bis);
TEST_ASSERT(rc == BLE_HS_EMSGSIZE);
/* Incomplete: no BIS_index[0[1]] Parameter */
rc = ble_audio_base_parse(example_base, 39, &group, &subgroup_iter);
rc = ble_audio_base_subgroup_iter(&subgroup_iter, &subgroup, &bis_iter);
rc = ble_audio_base_bis_iter(&bis_iter, &bis);
TEST_ASSERT(rc == 0);
rc = ble_audio_base_bis_iter(&bis_iter, &bis);
TEST_ASSERT(rc == BLE_HS_EMSGSIZE);
/* Incomplete: no Codec_Specific_Configuration_Length[0[1]] Parameter */
rc = ble_audio_base_parse(example_base, 40, &group, &subgroup_iter);
rc = ble_audio_base_subgroup_iter(&subgroup_iter, &subgroup, &bis_iter);
rc = ble_audio_base_bis_iter(&bis_iter, &bis);
rc = ble_audio_base_bis_iter(&bis_iter, &bis);
TEST_ASSERT(rc == BLE_HS_EMSGSIZE);
/* Truncated: Codec_Specific_Configuration_Length[0[1]] Parameter */
rc = ble_audio_base_parse(example_base, 46, &group, &subgroup_iter);
rc = ble_audio_base_subgroup_iter(&subgroup_iter, &subgroup, &bis_iter);
rc = ble_audio_base_bis_iter(&bis_iter, &bis);
TEST_ASSERT(rc == 0);
rc = ble_audio_base_bis_iter(&bis_iter, &bis);
TEST_ASSERT(rc == BLE_HS_EMSGSIZE);
/* Incomplete: no Num_BIS[1] Parameter */
rc = ble_audio_base_parse(example_base, 47, &group, &subgroup_iter);
rc = ble_audio_base_subgroup_iter(&subgroup_iter, &subgroup, &bis_iter);
TEST_ASSERT(rc == 0);
rc = ble_audio_base_subgroup_iter(&subgroup_iter, &subgroup, &bis_iter);
TEST_ASSERT(rc == BLE_HS_EMSGSIZE);
/* Truncated: Codec_ID[1] Parameter */
rc = ble_audio_base_parse(example_base, 52, &group, &subgroup_iter);
rc = ble_audio_base_subgroup_iter(&subgroup_iter, &subgroup, &bis_iter);
rc = ble_audio_base_subgroup_iter(&subgroup_iter, &subgroup, &bis_iter);
TEST_ASSERT(rc == BLE_HS_EMSGSIZE);
/* Incomplete: no Codec_Specific_Configuration_Length[1] Parameter */
rc = ble_audio_base_parse(example_base, 53, &group, &subgroup_iter);
rc = ble_audio_base_subgroup_iter(&subgroup_iter, &subgroup, &bis_iter);
rc = ble_audio_base_subgroup_iter(&subgroup_iter, &subgroup, &bis_iter);
TEST_ASSERT(rc == BLE_HS_EMSGSIZE);
/* Truncated: Codec_Specific_Configuration[1] Parameter */
rc = ble_audio_base_parse(example_base, 63, &group, &subgroup_iter);
rc = ble_audio_base_subgroup_iter(&subgroup_iter, &subgroup, &bis_iter);
rc = ble_audio_base_subgroup_iter(&subgroup_iter, &subgroup, &bis_iter);
TEST_ASSERT(rc == BLE_HS_EMSGSIZE);
/* Incomplete: no Metadata_Length[1] Parameter */
rc = ble_audio_base_parse(example_base, 64, &group, &subgroup_iter);
rc = ble_audio_base_subgroup_iter(&subgroup_iter, &subgroup, &bis_iter);
rc = ble_audio_base_subgroup_iter(&subgroup_iter, &subgroup, &bis_iter);
TEST_ASSERT(rc == BLE_HS_EMSGSIZE);
/* Truncated: Metadata[1] Parameter */
rc = ble_audio_base_parse(example_base, 73, &group, &subgroup_iter);
rc = ble_audio_base_subgroup_iter(&subgroup_iter, &subgroup, &bis_iter);
rc = ble_audio_base_subgroup_iter(&subgroup_iter, &subgroup, &bis_iter);
TEST_ASSERT(rc == BLE_HS_EMSGSIZE);
/* Incomplete: no BIS_index[1[0]] Parameter */
rc = ble_audio_base_parse(example_base, 74, &group, &subgroup_iter);
rc = ble_audio_base_subgroup_iter(&subgroup_iter, &subgroup, &bis_iter);
rc = ble_audio_base_subgroup_iter(&subgroup_iter, &subgroup, &bis_iter);
TEST_ASSERT(rc == 0);
rc = ble_audio_base_bis_iter(&bis_iter, &bis);
TEST_ASSERT(rc == BLE_HS_EMSGSIZE);
/* Incomplete: no Codec_Specific_Configuration_Length[1[0]] Parameter */
rc = ble_audio_base_parse(example_base, 75, &group, &subgroup_iter);
rc = ble_audio_base_subgroup_iter(&subgroup_iter, &subgroup, &bis_iter);
rc = ble_audio_base_subgroup_iter(&subgroup_iter, &subgroup, &bis_iter);
rc = ble_audio_base_bis_iter(&bis_iter, &bis);
TEST_ASSERT(rc == BLE_HS_EMSGSIZE);
/* Truncated: Codec_Specific_Configuration_Length[1[0]] Parameter */
rc = ble_audio_base_parse(example_base, 81, &group, &subgroup_iter);
rc = ble_audio_base_subgroup_iter(&subgroup_iter, &subgroup, &bis_iter);
rc = ble_audio_base_subgroup_iter(&subgroup_iter, &subgroup, &bis_iter);
rc = ble_audio_base_bis_iter(&bis_iter, &bis);
TEST_ASSERT(rc == BLE_HS_EMSGSIZE);
/* Incomplete: no BIS_index[1[1]] Parameter */
rc = ble_audio_base_parse(example_base, 82, &group, &subgroup_iter);
rc = ble_audio_base_subgroup_iter(&subgroup_iter, &subgroup, &bis_iter);
rc = ble_audio_base_subgroup_iter(&subgroup_iter, &subgroup, &bis_iter);
rc = ble_audio_base_bis_iter(&bis_iter, &bis);
TEST_ASSERT(rc == 0);
rc = ble_audio_base_bis_iter(&bis_iter, &bis);
TEST_ASSERT(rc == BLE_HS_EMSGSIZE);
/* Incomplete: no Codec_Specific_Configuration_Length[1[1]] Parameter */
rc = ble_audio_base_parse(example_base, 83, &group, &subgroup_iter);
rc = ble_audio_base_subgroup_iter(&subgroup_iter, &subgroup, &bis_iter);
rc = ble_audio_base_subgroup_iter(&subgroup_iter, &subgroup, &bis_iter);
rc = ble_audio_base_bis_iter(&bis_iter, &bis);
rc = ble_audio_base_bis_iter(&bis_iter, &bis);
TEST_ASSERT(rc == BLE_HS_EMSGSIZE);
/* Truncated: Codec_Specific_Configuration_Length[0[1]] Parameter */
rc = ble_audio_base_parse(example_base, 89, &group, &subgroup_iter);
rc = ble_audio_base_subgroup_iter(&subgroup_iter, &subgroup, &bis_iter);
rc = ble_audio_base_subgroup_iter(&subgroup_iter, &subgroup, &bis_iter);
rc = ble_audio_base_bis_iter(&bis_iter, &bis);
rc = ble_audio_base_bis_iter(&bis_iter, &bis);
TEST_ASSERT(rc == BLE_HS_EMSGSIZE);
}
TEST_SUITE(ble_audio_base_parse_test_suite)
{
ble_audio_base_parse_test();
ble_audio_base_parse_test_params();
ble_audio_base_parse_test_data_length();
}