blob: fecb3cadaa1c96887462e4d9b35a0ab444fe14ad [file] [log] [blame]
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -07001/******************************************************************************
2 *
Jakub Pawlowski5b790fe2017-09-18 09:00:20 -07003 * Copyright 2016 The Android Open Source Project
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -07004 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 ******************************************************************************/
18
Pavlin Radoslavov4decac32017-01-13 17:42:01 -080019#include <dlfcn.h>
20
21#include <set>
Pavlin Radoslavova6ba5ac2017-01-31 20:51:06 -080022#include <vector>
Pavlin Radoslavov4decac32017-01-13 17:42:01 -080023
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -070024#include <gtest/gtest.h>
25
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -080026#include "stack/include/a2dp_aac.h"
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -070027#include "stack/include/a2dp_api.h"
Pavlin Radoslavov5ce01162016-12-05 13:02:26 -080028#include "stack/include/a2dp_codec_api.h"
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -070029#include "stack/include/a2dp_sbc.h"
30#include "stack/include/a2dp_vendor.h"
31
32namespace {
33const uint8_t codec_info_sbc[AVDT_CODEC_SIZE] = {
Myles Watson911d1ae2016-11-28 16:44:40 -080034 6, // Length (A2DP_SBC_INFO_LEN)
35 0, // Media Type: AVDT_MEDIA_TYPE_AUDIO
36 0, // Media Codec Type: A2DP_MEDIA_CT_SBC
37 0x20 | 0x01, // Sample Frequency: A2DP_SBC_IE_SAMP_FREQ_44 |
38 // Channel Mode: A2DP_SBC_IE_CH_MD_JOINT
39 0x10 | 0x04 | 0x01, // Block Length: A2DP_SBC_IE_BLOCKS_16 |
40 // Subbands: A2DP_SBC_IE_SUBBAND_8 |
41 // Allocation Method: A2DP_SBC_IE_ALLOC_MD_L
42 2, // MinimumBitpool Value: A2DP_SBC_IE_MIN_BITPOOL
43 53, // Maximum Bitpool Value: A2DP_SBC_MAX_BITPOOL
44 7, // Dummy
45 8, // Dummy
46 9 // Dummy
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -070047};
48
koh.changseok444ea2c2017-07-04 02:37:42 +090049const uint8_t codec_info_sbc_capability[AVDT_CODEC_SIZE] = {
50 6, // Length (A2DP_SBC_INFO_LEN)
51 0, // Media Type: AVDT_MEDIA_TYPE_AUDIO
52 0, // Media Codec Type: A2DP_MEDIA_CT_SBC
53 0x20 | // Sample Frequency: A2DP_SBC_IE_SAMP_FREQ_44 |
54 0x08 | 0x01, // Channel Mode: A2DP_SBC_IE_CH_MD_MONO |
55 // A2DP_SBC_IE_CH_MD_JOINT
56 0x80 | 0x40 | 0x20 | 0x10 | // Block Length: A2DP_SBC_IE_BLOCKS_4 |
57 // A2DP_SBC_IE_BLOCKS_8 |
58 // A2DP_SBC_IE_BLOCKS_12 |
59 // A2DP_SBC_IE_BLOCKS_16 |
60 0x04 | // Subbands: A2DP_SBC_IE_SUBBAND_8 |
61 0x01, // Allocation Method: A2DP_SBC_IE_ALLOC_MD_L
62 2, // MinimumBitpool Value: A2DP_SBC_IE_MIN_BITPOOL
63 53, // Maximum Bitpool Value: A2DP_SBC_MAX_BITPOOL
64 7, // Dummy
65 8, // Dummy
66 9 // Dummy
67};
68
Pavlin Radoslavov5ce01162016-12-05 13:02:26 -080069const uint8_t codec_info_sbc_sink_capability[AVDT_CODEC_SIZE] = {
Myles Watson911d1ae2016-11-28 16:44:40 -080070 6, // Length (A2DP_SBC_INFO_LEN)
71 0, // Media Type: AVDT_MEDIA_TYPE_AUDIO
72 0, // Media Codec Type: A2DP_MEDIA_CT_SBC
73 0x20 | 0x10 | // Sample Frequency: A2DP_SBC_IE_SAMP_FREQ_44 |
74 // A2DP_SBC_IE_SAMP_FREQ_48 |
75 0x08 | 0x04 | 0x02 | 0x01, // Channel Mode: A2DP_SBC_IE_CH_MD_MONO |
76 // A2DP_SBC_IE_CH_MD_DUAL |
77 // A2DP_SBC_IE_CH_MD_STEREO |
78 // A2DP_SBC_IE_CH_MD_JOINT
79 0x80 | 0x40 | 0x20 | 0x10 | // Block Length: A2DP_SBC_IE_BLOCKS_4 |
80 // A2DP_SBC_IE_BLOCKS_8 |
81 // A2DP_SBC_IE_BLOCKS_12 |
82 // A2DP_SBC_IE_BLOCKS_16 |
83 0x08 | 0x04 | // Subbands: A2DP_SBC_IE_SUBBAND_4 |
84 // A2DP_SBC_IE_SUBBAND_8 |
85 0x02 | 0x01, // Allocation Method: A2DP_SBC_IE_ALLOC_MD_S |
86 // A2DP_SBC_IE_ALLOC_MD_L
87 2, // MinimumBitpool Value: A2DP_SBC_IE_MIN_BITPOOL
88 53, // Maximum Bitpool Value: A2DP_SBC_MAX_BITPOOL
89 7, // Dummy
90 8, // Dummy
91 9 // Dummy
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -070092};
93
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -080094const uint8_t codec_info_aac[AVDT_CODEC_SIZE] = {
95 8, // Length (A2DP_AAC_INFO_LEN)
96 0, // Media Type: AVDT_MEDIA_TYPE_AUDIO
97 2, // Media Codec Type: A2DP_MEDIA_CT_AAC
98 0x80, // Object Type: A2DP_AAC_OBJECT_TYPE_MPEG2_LC
99 0x01, // Sampling Frequency: A2DP_AAC_SAMPLING_FREQ_44100
100 0x04, // Channels: A2DP_AAC_CHANNEL_MODE_STEREO
101 0x00 | 0x4, // Variable Bit Rate:
102 // A2DP_AAC_VARIABLE_BIT_RATE_DISABLED
103 // Bit Rate: 320000 = 0x4e200
104 0xe2, // Bit Rate: 320000 = 0x4e200
105 0x00, // Bit Rate: 320000 = 0x4e200
106 7, // Dummy
107 8, // Dummy
108 9 // Dummy
109};
110
111const uint8_t codec_info_aac_capability[AVDT_CODEC_SIZE] = {
Pavlin Radoslavov858b6a12017-06-19 21:12:37 -0700112 8, // Length (A2DP_AAC_INFO_LEN)
113 0, // Media Type: AVDT_MEDIA_TYPE_AUDIO
114 2, // Media Codec Type: A2DP_MEDIA_CT_AAC
115 0x80, // Object Type: A2DP_AAC_OBJECT_TYPE_MPEG2_LC
116 0x01, // Sampling Frequency: A2DP_AAC_SAMPLING_FREQ_44100
117 // TODO: AAC 48.0kHz sampling rate should be added back - see b/62301376
118 0x04, // Channels: A2DP_AAC_CHANNEL_MODE_STEREO
119 0x00 | 0x4, // Variable Bit Rate:
120 // A2DP_AAC_VARIABLE_BIT_RATE_DISABLED
121 // Bit Rate: 320000 = 0x4e200
122 0xe2, // Bit Rate: 320000 = 0x4e200
123 0x00, // Bit Rate: 320000 = 0x4e200
124 7, // Dummy
125 8, // Dummy
126 9 // Dummy
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800127};
128
129const uint8_t codec_info_aac_sink_capability[AVDT_CODEC_SIZE] = {
130 8, // Length (A2DP_AAC_INFO_LEN)
131 0, // Media Type: AVDT_MEDIA_TYPE_AUDIO
132 2, // Media Codec Type: A2DP_MEDIA_CT_AAC
133 0x80 | 0x40 | 0x20 | 0x10, // Object Type: A2DP_AAC_OBJECT_TYPE_MPEG2_LC |
134 // A2DP_AAC_OBJECT_TYPE_MPEG4_LC
135 // A2DP_AAC_OBJECT_TYPE_MPEG4_LTP
136 // A2DP_AAC_OBJECT_TYPE_MPEG4_SCALABLE
137 0x01, // Sampling Frequency: A2DP_AAC_SAMPLING_FREQ_44100
138 0x80 | 0x20 | 0x10 | 0x08 | 0x04, // Sampling Frequency:
139 // A2DP_AAC_SAMPLING_FREQ_48000 |
140 // A2DP_AAC_SAMPLING_FREQ_88200 |
141 // A2DP_AAC_SAMPLING_FREQ_96000 |
142 // Channels:
143 // A2DP_AAC_CHANNEL_MODE_MONO |
144 // A2DP_AAC_CHANNEL_MODE_STEREO
145 0x80 | 0x4, // Variable Bit Rate:
146 // A2DP_AAC_VARIABLE_BIT_RATE_ENABLED
147 // Bit Rate: 320000 = 0x4e200
148 0xe2, // Bit Rate: 320000 = 0x4e200
149 0x00, // Bit Rate: 320000 = 0x4e200
150 7, // Dummy
151 8, // Dummy
152 9 // Dummy
153};
154
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700155const uint8_t codec_info_non_a2dp[AVDT_CODEC_SIZE] = {
Myles Watson911d1ae2016-11-28 16:44:40 -0800156 8, // Length
157 0, // Media Type: AVDT_MEDIA_TYPE_AUDIO
158 0xFF, // Media Codec Type: A2DP_MEDIA_CT_NON_A2DP
159 3, 4, 0, 0, // Vendor ID: LSB first, upper two octets should be 0
160 7, 8, // Codec ID: LSB first
161 9 // Dummy
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700162};
163
164const uint8_t codec_info_non_a2dp_dummy[AVDT_CODEC_SIZE] = {
Myles Watson911d1ae2016-11-28 16:44:40 -0800165 8, // Length
166 0, // Media Type: AVDT_MEDIA_TYPE_AUDIO
167 0xFF, // Media Codec Type: A2DP_MEDIA_CT_NON_A2DP
168 3, 4, 0, 0, // Vendor ID: LSB first, upper two octets should be 0
169 7, 8, // Codec ID: LSB first
170 10 // Dummy
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700171};
172
Pavlin Radoslavov4decac32017-01-13 17:42:01 -0800173static const char* APTX_ENCODER_LIB_NAME = "libaptX_encoder.so";
174static const char* APTX_HD_ENCODER_LIB_NAME = "libaptXHD_encoder.so";
175static const char* LDAC_ENCODER_LIB_NAME = "libldacBT_enc.so";
Chisato Kenmochif57c4282018-08-10 20:44:05 +0900176static const char* LDAC_DECODER_LIB_NAME = "libldacBT_dec.so";
Pavlin Radoslavov4decac32017-01-13 17:42:01 -0800177
178static bool has_shared_library(const char* name) {
179 void* lib_handle = dlopen(name, RTLD_NOW);
180 if (lib_handle != nullptr) {
181 dlclose(lib_handle);
182 return true;
183 }
184 return false;
185}
186
Myles Watson911d1ae2016-11-28 16:44:40 -0800187} // namespace
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700188
Pavlin Radoslavov4decac32017-01-13 17:42:01 -0800189class StackA2dpTest : public ::testing::Test {
190 protected:
191 StackA2dpTest() {
192 // Create the set with all supported codecs
193 for (int i = BTAV_A2DP_CODEC_INDEX_MIN; i < BTAV_A2DP_CODEC_INDEX_MAX;
194 i++) {
195 btav_a2dp_codec_index_t codec_index =
196 static_cast<btav_a2dp_codec_index_t>(i);
197
198 bool supported = false;
199 switch (codec_index) {
200 case BTAV_A2DP_CODEC_INDEX_SOURCE_SBC:
201 supported = true;
202 break;
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800203 case BTAV_A2DP_CODEC_INDEX_SOURCE_AAC:
204 supported = true;
205 break;
Pavlin Radoslavov4decac32017-01-13 17:42:01 -0800206 case BTAV_A2DP_CODEC_INDEX_SOURCE_APTX:
207 // Codec aptX is supported only if the device has the corresponding
208 // shared library installed.
209 supported = has_shared_library(APTX_ENCODER_LIB_NAME);
210 break;
211 case BTAV_A2DP_CODEC_INDEX_SOURCE_APTX_HD:
212 // Codec aptX-HD is supported only if the device has the corresponding
213 // shared library installed.
214 supported = has_shared_library(APTX_HD_ENCODER_LIB_NAME);
215 break;
216 case BTAV_A2DP_CODEC_INDEX_SOURCE_LDAC:
217 // Codec LDAC is supported only if the device has the corresponding
218 // shared library installed.
219 supported = has_shared_library(LDAC_ENCODER_LIB_NAME);
220 break;
221 case BTAV_A2DP_CODEC_INDEX_SINK_SBC:
222 supported = true;
223 break;
Bailey Forrest7e2ab692017-06-16 15:38:03 -0700224 case BTAV_A2DP_CODEC_INDEX_SINK_AAC:
225 supported = true;
226 break;
Chisato Kenmochif57c4282018-08-10 20:44:05 +0900227 case BTAV_A2DP_CODEC_INDEX_SINK_LDAC:
228 // Codec LDAC is supported only if the device has the corresponding
229 // shared library installed.
230 supported = has_shared_library(LDAC_DECODER_LIB_NAME);
231 break;
Pavlin Radoslavov4decac32017-01-13 17:42:01 -0800232 case BTAV_A2DP_CODEC_INDEX_MAX:
233 // Needed to avoid using "default:" case so we can capture when
234 // a new codec is added, and it can be included here.
235 break;
236 }
237
238 if (supported) {
239 supported_codecs_.insert(codec_index);
240 }
241 }
242 }
243
244 bool has_codec_support(btav_a2dp_codec_index_t codec_index) {
245 return supported_codecs_.find(codec_index) != supported_codecs_.end();
246 }
247
248 private:
249 std::set<btav_a2dp_codec_index_t> supported_codecs_;
250};
251
252class A2dpCodecConfigTest : public StackA2dpTest {};
253
254TEST_F(StackA2dpTest, test_a2dp_bits_set) {
Pavlin Radoslavov5ce01162016-12-05 13:02:26 -0800255 EXPECT_TRUE(A2DP_BitsSet(0x0) == A2DP_SET_ZERO_BIT);
256 EXPECT_TRUE(A2DP_BitsSet(0x1) == A2DP_SET_ONE_BIT);
257 EXPECT_TRUE(A2DP_BitsSet(0x2) == A2DP_SET_ONE_BIT);
258 EXPECT_TRUE(A2DP_BitsSet(0x3) == A2DP_SET_MULTL_BIT);
259 EXPECT_TRUE(A2DP_BitsSet(0x7f) == A2DP_SET_MULTL_BIT);
260 EXPECT_TRUE(A2DP_BitsSet(0x80) == A2DP_SET_ONE_BIT);
261 EXPECT_TRUE(A2DP_BitsSet(0x81) == A2DP_SET_MULTL_BIT);
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800262 EXPECT_TRUE(A2DP_BitsSet(0xc0) == A2DP_SET_MULTL_BIT);
Pavlin Radoslavov5ce01162016-12-05 13:02:26 -0800263 EXPECT_TRUE(A2DP_BitsSet(0xff) == A2DP_SET_MULTL_BIT);
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800264 EXPECT_TRUE(A2DP_BitsSet(0x8000) == A2DP_SET_ONE_BIT);
265 EXPECT_TRUE(A2DP_BitsSet(0x8001) == A2DP_SET_MULTL_BIT);
266 EXPECT_TRUE(A2DP_BitsSet(0xc000) == A2DP_SET_MULTL_BIT);
267 EXPECT_TRUE(A2DP_BitsSet(0xffff) == A2DP_SET_MULTL_BIT);
268 EXPECT_TRUE(A2DP_BitsSet(0x80000) == A2DP_SET_ONE_BIT);
269 EXPECT_TRUE(A2DP_BitsSet(0x80001) == A2DP_SET_MULTL_BIT);
270 EXPECT_TRUE(A2DP_BitsSet(0xc0000) == A2DP_SET_MULTL_BIT);
271 EXPECT_TRUE(A2DP_BitsSet(0xfffff) == A2DP_SET_MULTL_BIT);
272 EXPECT_TRUE(A2DP_BitsSet(0x80000000) == A2DP_SET_ONE_BIT);
273 EXPECT_TRUE(A2DP_BitsSet(0x80000001) == A2DP_SET_MULTL_BIT);
274 EXPECT_TRUE(A2DP_BitsSet(0xc0000000) == A2DP_SET_MULTL_BIT);
275 EXPECT_TRUE(A2DP_BitsSet(0xffffffff) == A2DP_SET_MULTL_BIT);
276 EXPECT_TRUE(A2DP_BitsSet(0x8000000000000000) == A2DP_SET_ONE_BIT);
277 EXPECT_TRUE(A2DP_BitsSet(0x8000000000000001) == A2DP_SET_MULTL_BIT);
278 EXPECT_TRUE(A2DP_BitsSet(0xc000000000000000) == A2DP_SET_MULTL_BIT);
279 EXPECT_TRUE(A2DP_BitsSet(0xffffffffffffffff) == A2DP_SET_MULTL_BIT);
Pavlin Radoslavov5ce01162016-12-05 13:02:26 -0800280}
281
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800282TEST_F(StackA2dpTest, test_a2dp_is_codec_valid_sbc) {
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700283 EXPECT_TRUE(A2DP_IsSourceCodecValid(codec_info_sbc));
koh.changseok444ea2c2017-07-04 02:37:42 +0900284 EXPECT_TRUE(A2DP_IsSourceCodecValid(codec_info_sbc_capability));
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700285 EXPECT_TRUE(A2DP_IsPeerSourceCodecValid(codec_info_sbc));
koh.changseok444ea2c2017-07-04 02:37:42 +0900286 EXPECT_TRUE(A2DP_IsPeerSourceCodecValid(codec_info_sbc_capability));
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700287
Pavlin Radoslavov5ce01162016-12-05 13:02:26 -0800288 EXPECT_TRUE(A2DP_IsSinkCodecValid(codec_info_sbc_sink_capability));
289 EXPECT_TRUE(A2DP_IsPeerSinkCodecValid(codec_info_sbc_sink_capability));
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700290
291 EXPECT_FALSE(A2DP_IsSourceCodecValid(codec_info_non_a2dp));
292 EXPECT_FALSE(A2DP_IsSinkCodecValid(codec_info_non_a2dp));
293 EXPECT_FALSE(A2DP_IsPeerSourceCodecValid(codec_info_non_a2dp));
294 EXPECT_FALSE(A2DP_IsPeerSinkCodecValid(codec_info_non_a2dp));
295
296 // Test with invalid SBC codecs
297 uint8_t codec_info_sbc_invalid[AVDT_CODEC_SIZE];
298 memset(codec_info_sbc_invalid, 0, sizeof(codec_info_sbc_invalid));
299 EXPECT_FALSE(A2DP_IsSourceCodecValid(codec_info_sbc_invalid));
300 EXPECT_FALSE(A2DP_IsSinkCodecValid(codec_info_sbc_invalid));
301 EXPECT_FALSE(A2DP_IsPeerSourceCodecValid(codec_info_sbc_invalid));
302 EXPECT_FALSE(A2DP_IsPeerSinkCodecValid(codec_info_sbc_invalid));
303
304 memcpy(codec_info_sbc_invalid, codec_info_sbc, sizeof(codec_info_sbc));
Myles Watson911d1ae2016-11-28 16:44:40 -0800305 codec_info_sbc_invalid[0] = 0; // Corrupt the Length field
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700306 EXPECT_FALSE(A2DP_IsSourceCodecValid(codec_info_sbc_invalid));
307 EXPECT_FALSE(A2DP_IsSinkCodecValid(codec_info_sbc_invalid));
308 EXPECT_FALSE(A2DP_IsPeerSourceCodecValid(codec_info_sbc_invalid));
309 EXPECT_FALSE(A2DP_IsPeerSinkCodecValid(codec_info_sbc_invalid));
310
311 memcpy(codec_info_sbc_invalid, codec_info_sbc, sizeof(codec_info_sbc));
Myles Watson911d1ae2016-11-28 16:44:40 -0800312 codec_info_sbc_invalid[1] = 0xff; // Corrupt the Media Type field
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700313 EXPECT_FALSE(A2DP_IsSourceCodecValid(codec_info_sbc_invalid));
314 EXPECT_FALSE(A2DP_IsSinkCodecValid(codec_info_sbc_invalid));
315 EXPECT_FALSE(A2DP_IsPeerSourceCodecValid(codec_info_sbc_invalid));
316 EXPECT_FALSE(A2DP_IsPeerSinkCodecValid(codec_info_sbc_invalid));
317}
318
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800319TEST_F(StackA2dpTest, test_a2dp_is_codec_valid_aac) {
320 EXPECT_TRUE(A2DP_IsSourceCodecValid(codec_info_aac));
koh.changseok444ea2c2017-07-04 02:37:42 +0900321 EXPECT_TRUE(A2DP_IsSourceCodecValid(codec_info_aac_capability));
Bailey Forrest7e2ab692017-06-16 15:38:03 -0700322 EXPECT_TRUE(A2DP_IsPeerSourceCodecValid(codec_info_aac));
323 EXPECT_TRUE(A2DP_IsPeerSourceCodecValid(codec_info_aac_capability));
koh.changseok444ea2c2017-07-04 02:37:42 +0900324
Bailey Forrest7e2ab692017-06-16 15:38:03 -0700325 EXPECT_TRUE(A2DP_IsSinkCodecValid(codec_info_aac_sink_capability));
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800326 EXPECT_TRUE(A2DP_IsPeerSinkCodecValid(codec_info_aac_sink_capability));
327
328 // Test with invalid AAC codecs
329 uint8_t codec_info_aac_invalid[AVDT_CODEC_SIZE];
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800330 memcpy(codec_info_aac_invalid, codec_info_aac, sizeof(codec_info_aac));
331 codec_info_aac_invalid[0] = 0; // Corrupt the Length field
332 EXPECT_FALSE(A2DP_IsSourceCodecValid(codec_info_aac_invalid));
koh.changseok444ea2c2017-07-04 02:37:42 +0900333 EXPECT_FALSE(A2DP_IsSinkCodecValid(codec_info_aac_invalid));
334 EXPECT_FALSE(A2DP_IsPeerSourceCodecValid(codec_info_aac_invalid));
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800335 EXPECT_FALSE(A2DP_IsPeerSinkCodecValid(codec_info_aac_invalid));
336
337 memcpy(codec_info_aac_invalid, codec_info_aac, sizeof(codec_info_aac));
338 codec_info_aac_invalid[1] = 0xff; // Corrupt the Media Type field
339 EXPECT_FALSE(A2DP_IsSourceCodecValid(codec_info_aac_invalid));
koh.changseok444ea2c2017-07-04 02:37:42 +0900340 EXPECT_FALSE(A2DP_IsSinkCodecValid(codec_info_aac_invalid));
341 EXPECT_FALSE(A2DP_IsPeerSourceCodecValid(codec_info_aac_invalid));
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800342 EXPECT_FALSE(A2DP_IsPeerSinkCodecValid(codec_info_aac_invalid));
343}
344
Pavlin Radoslavov4decac32017-01-13 17:42:01 -0800345TEST_F(StackA2dpTest, test_a2dp_get_codec_type) {
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700346 tA2DP_CODEC_TYPE codec_type = A2DP_GetCodecType(codec_info_sbc);
347 EXPECT_EQ(codec_type, A2DP_MEDIA_CT_SBC);
348
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800349 codec_type = A2DP_GetCodecType(codec_info_aac);
350 EXPECT_EQ(codec_type, A2DP_MEDIA_CT_AAC);
351
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700352 codec_type = A2DP_GetCodecType(codec_info_non_a2dp);
353 EXPECT_EQ(codec_type, A2DP_MEDIA_CT_NON_A2DP);
354}
355
Pavlin Radoslavov4decac32017-01-13 17:42:01 -0800356TEST_F(StackA2dpTest, test_a2dp_is_sink_codec_supported) {
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700357 EXPECT_TRUE(A2DP_IsSinkCodecSupported(codec_info_sbc));
koh.changseok444ea2c2017-07-04 02:37:42 +0900358 EXPECT_FALSE(A2DP_IsSinkCodecSupported(codec_info_sbc_capability));
Pavlin Radoslavov5ce01162016-12-05 13:02:26 -0800359 EXPECT_FALSE(A2DP_IsSinkCodecSupported(codec_info_sbc_sink_capability));
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800360
Bailey Forrest7e2ab692017-06-16 15:38:03 -0700361 EXPECT_TRUE(A2DP_IsSinkCodecSupported(codec_info_aac));
362 // NOTE: The test below should be EXPECT_FALSE.
363 // However, codec_info_aac_capability is practically same as codec_info_aac,
364 // therefore we cannot differentiate it as a capability.
365 EXPECT_TRUE(A2DP_IsSinkCodecSupported(codec_info_aac_capability));
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800366 EXPECT_FALSE(A2DP_IsSinkCodecSupported(codec_info_aac_sink_capability));
367
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700368 EXPECT_FALSE(A2DP_IsSinkCodecSupported(codec_info_non_a2dp));
369}
370
Pavlin Radoslavov4decac32017-01-13 17:42:01 -0800371TEST_F(StackA2dpTest, test_a2dp_is_peer_source_codec_supported) {
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700372 EXPECT_TRUE(A2DP_IsPeerSourceCodecSupported(codec_info_sbc));
koh.changseok444ea2c2017-07-04 02:37:42 +0900373 EXPECT_TRUE(A2DP_IsPeerSourceCodecSupported(codec_info_sbc_capability));
Pavlin Radoslavov5ce01162016-12-05 13:02:26 -0800374 EXPECT_TRUE(A2DP_IsPeerSourceCodecSupported(codec_info_sbc_sink_capability));
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800375
Bailey Forrest7e2ab692017-06-16 15:38:03 -0700376 EXPECT_TRUE(A2DP_IsPeerSourceCodecSupported(codec_info_aac));
377 EXPECT_TRUE(A2DP_IsPeerSourceCodecSupported(codec_info_aac_capability));
378 EXPECT_TRUE(A2DP_IsPeerSourceCodecSupported(codec_info_aac_sink_capability));
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800379
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700380 EXPECT_FALSE(A2DP_IsPeerSourceCodecSupported(codec_info_non_a2dp));
381}
382
Pavlin Radoslavov4decac32017-01-13 17:42:01 -0800383TEST_F(StackA2dpTest, test_init_default_codec) {
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700384 uint8_t codec_info_result[AVDT_CODEC_SIZE];
385
386 memset(codec_info_result, 0, sizeof(codec_info_result));
387 A2DP_InitDefaultCodec(codec_info_result);
388
389 // Compare the result codec with the local test codec info
390 for (size_t i = 0; i < codec_info_sbc[0] + 1; i++) {
391 EXPECT_EQ(codec_info_result[i], codec_info_sbc[i]);
392 }
393}
394
Pavlin Radoslavov4decac32017-01-13 17:42:01 -0800395TEST_F(StackA2dpTest, test_a2dp_uses_rtp_header) {
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700396 EXPECT_TRUE(A2DP_UsesRtpHeader(true, codec_info_sbc));
397 EXPECT_TRUE(A2DP_UsesRtpHeader(false, codec_info_sbc));
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800398
399 EXPECT_TRUE(A2DP_UsesRtpHeader(true, codec_info_aac));
400 EXPECT_TRUE(A2DP_UsesRtpHeader(false, codec_info_aac));
401
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700402 EXPECT_TRUE(A2DP_UsesRtpHeader(true, codec_info_non_a2dp));
403 EXPECT_TRUE(A2DP_UsesRtpHeader(false, codec_info_non_a2dp));
404}
405
Pavlin Radoslavov4decac32017-01-13 17:42:01 -0800406TEST_F(StackA2dpTest, test_a2dp_get_media_type) {
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700407 uint8_t codec_info_test[AVDT_CODEC_SIZE];
408
409 EXPECT_EQ(A2DP_GetMediaType(codec_info_sbc), AVDT_MEDIA_TYPE_AUDIO);
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800410 EXPECT_EQ(A2DP_GetMediaType(codec_info_aac), AVDT_MEDIA_TYPE_AUDIO);
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700411 EXPECT_EQ(A2DP_GetMediaType(codec_info_non_a2dp), AVDT_MEDIA_TYPE_AUDIO);
412
413 // Prepare dummy codec info for video and for multimedia
414 memset(codec_info_test, 0, sizeof(codec_info_test));
415 codec_info_test[0] = sizeof(codec_info_test);
416 codec_info_test[1] = 0x01 << 4;
417 EXPECT_EQ(A2DP_GetMediaType(codec_info_test), AVDT_MEDIA_TYPE_VIDEO);
418 codec_info_test[1] = 0x02 << 4;
419 EXPECT_EQ(A2DP_GetMediaType(codec_info_test), AVDT_MEDIA_TYPE_MULTI);
420}
421
Pavlin Radoslavov4decac32017-01-13 17:42:01 -0800422TEST_F(StackA2dpTest, test_a2dp_codec_name) {
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700423 uint8_t codec_info_test[AVDT_CODEC_SIZE];
424
425 // Explicit tests for known codecs
426 EXPECT_STREQ(A2DP_CodecName(codec_info_sbc), "SBC");
koh.changseok444ea2c2017-07-04 02:37:42 +0900427 EXPECT_STREQ(A2DP_CodecName(codec_info_sbc_capability), "SBC");
Pavlin Radoslavov5ce01162016-12-05 13:02:26 -0800428 EXPECT_STREQ(A2DP_CodecName(codec_info_sbc_sink_capability), "SBC");
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800429 EXPECT_STREQ(A2DP_CodecName(codec_info_aac), "AAC");
430 EXPECT_STREQ(A2DP_CodecName(codec_info_aac_capability), "AAC");
431 EXPECT_STREQ(A2DP_CodecName(codec_info_aac_sink_capability), "AAC");
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700432 EXPECT_STREQ(A2DP_CodecName(codec_info_non_a2dp), "UNKNOWN VENDOR CODEC");
433
434 // Test all unknown codecs
435 memcpy(codec_info_test, codec_info_sbc, sizeof(codec_info_sbc));
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800436 for (uint8_t codec_type = A2DP_MEDIA_CT_AAC + 1;
Myles Watson911d1ae2016-11-28 16:44:40 -0800437 codec_type < A2DP_MEDIA_CT_NON_A2DP; codec_type++) {
438 codec_info_test[2] = codec_type; // Unknown codec type
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700439 EXPECT_STREQ(A2DP_CodecName(codec_info_test), "UNKNOWN CODEC");
440 }
441}
442
Pavlin Radoslavov4decac32017-01-13 17:42:01 -0800443TEST_F(StackA2dpTest, test_a2dp_vendor) {
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700444 EXPECT_EQ(A2DP_VendorCodecGetVendorId(codec_info_non_a2dp),
Myles Watson911d1ae2016-11-28 16:44:40 -0800445 (uint32_t)0x00000403);
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700446 EXPECT_EQ(A2DP_VendorCodecGetCodecId(codec_info_non_a2dp), (uint16_t)0x0807);
447 EXPECT_TRUE(A2DP_VendorUsesRtpHeader(true, codec_info_non_a2dp));
448 EXPECT_TRUE(A2DP_VendorUsesRtpHeader(false, codec_info_non_a2dp));
449}
450
Pavlin Radoslavov4decac32017-01-13 17:42:01 -0800451TEST_F(StackA2dpTest, test_a2dp_codec_type_equals) {
koh.changseok444ea2c2017-07-04 02:37:42 +0900452 EXPECT_TRUE(A2DP_CodecTypeEquals(codec_info_sbc, codec_info_sbc_capability));
Pavlin Radoslavov5ce01162016-12-05 13:02:26 -0800453 EXPECT_TRUE(
454 A2DP_CodecTypeEquals(codec_info_sbc, codec_info_sbc_sink_capability));
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800455 EXPECT_TRUE(A2DP_CodecTypeEquals(codec_info_aac, codec_info_aac_capability));
456 EXPECT_TRUE(
457 A2DP_CodecTypeEquals(codec_info_aac, codec_info_aac_sink_capability));
Myles Watson911d1ae2016-11-28 16:44:40 -0800458 EXPECT_TRUE(
459 A2DP_CodecTypeEquals(codec_info_non_a2dp, codec_info_non_a2dp_dummy));
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700460 EXPECT_FALSE(A2DP_CodecTypeEquals(codec_info_sbc, codec_info_non_a2dp));
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800461 EXPECT_FALSE(A2DP_CodecTypeEquals(codec_info_aac, codec_info_non_a2dp));
462 EXPECT_FALSE(A2DP_CodecTypeEquals(codec_info_sbc, codec_info_aac));
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700463}
464
Pavlin Radoslavov4decac32017-01-13 17:42:01 -0800465TEST_F(StackA2dpTest, test_a2dp_codec_equals) {
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700466 uint8_t codec_info_sbc_test[AVDT_CODEC_SIZE];
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800467 uint8_t codec_info_aac_test[AVDT_CODEC_SIZE];
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700468 uint8_t codec_info_non_a2dp_test[AVDT_CODEC_SIZE];
469
470 // Test two identical SBC codecs
471 memset(codec_info_sbc_test, 0xAB, sizeof(codec_info_sbc_test));
472 memcpy(codec_info_sbc_test, codec_info_sbc, sizeof(codec_info_sbc));
473 EXPECT_TRUE(A2DP_CodecEquals(codec_info_sbc, codec_info_sbc_test));
474
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800475 // Test two identical AAC codecs
476 memset(codec_info_aac_test, 0xAB, sizeof(codec_info_aac_test));
477 memcpy(codec_info_aac_test, codec_info_aac, sizeof(codec_info_aac));
478 EXPECT_TRUE(A2DP_CodecEquals(codec_info_aac, codec_info_aac_test));
479
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700480 // Test two identical non-A2DP codecs that are not recognized
481 memset(codec_info_non_a2dp_test, 0xAB, sizeof(codec_info_non_a2dp_test));
482 memcpy(codec_info_non_a2dp_test, codec_info_non_a2dp,
483 sizeof(codec_info_non_a2dp));
484 EXPECT_FALSE(A2DP_CodecEquals(codec_info_non_a2dp, codec_info_non_a2dp_test));
485
486 // Test two codecs that have different types
487 EXPECT_FALSE(A2DP_CodecEquals(codec_info_sbc, codec_info_non_a2dp));
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800488 EXPECT_FALSE(A2DP_CodecEquals(codec_info_sbc, codec_info_aac));
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700489
490 // Test two SBC codecs that are slightly different
491 memset(codec_info_sbc_test, 0xAB, sizeof(codec_info_sbc_test));
492 memcpy(codec_info_sbc_test, codec_info_sbc, sizeof(codec_info_sbc));
493 codec_info_sbc_test[5] = codec_info_sbc[5] + 1;
494 EXPECT_FALSE(A2DP_CodecEquals(codec_info_sbc, codec_info_sbc_test));
495 codec_info_sbc_test[5] = codec_info_sbc[5];
496 codec_info_sbc_test[6] = codec_info_sbc[6] + 1;
497 EXPECT_FALSE(A2DP_CodecEquals(codec_info_sbc, codec_info_sbc_test));
498
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800499 // Test two AAC codecs that are slightly different
500 memset(codec_info_aac_test, 0xAB, sizeof(codec_info_aac_test));
501 memcpy(codec_info_aac_test, codec_info_aac, sizeof(codec_info_aac));
502 codec_info_aac_test[7] = codec_info_aac[7] + 1;
503 EXPECT_FALSE(A2DP_CodecEquals(codec_info_aac, codec_info_aac_test));
504 codec_info_aac_test[7] = codec_info_aac[7];
505 codec_info_aac_test[8] = codec_info_aac[8] + 1;
506 EXPECT_FALSE(A2DP_CodecEquals(codec_info_aac, codec_info_aac_test));
507
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700508 // Test two SBC codecs that are identical, but with different dummy
509 // trailer data.
510 memset(codec_info_sbc_test, 0xAB, sizeof(codec_info_sbc_test));
511 memcpy(codec_info_sbc_test, codec_info_sbc, sizeof(codec_info_sbc));
512 codec_info_sbc_test[7] = codec_info_sbc[7] + 1;
513 EXPECT_TRUE(A2DP_CodecEquals(codec_info_sbc, codec_info_sbc_test));
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800514
515 // Test two AAC codecs that are identical, but with different dummy
516 // trailer data.
517 memset(codec_info_aac_test, 0xAB, sizeof(codec_info_aac_test));
518 memcpy(codec_info_aac_test, codec_info_aac, sizeof(codec_info_aac));
519 codec_info_aac_test[9] = codec_info_aac[9] + 1;
520 EXPECT_TRUE(A2DP_CodecEquals(codec_info_aac, codec_info_aac_test));
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700521}
522
Pavlin Radoslavov4decac32017-01-13 17:42:01 -0800523TEST_F(StackA2dpTest, test_a2dp_get_track_sample_rate) {
Pavlin Radoslavovcd02ce92016-11-04 17:18:51 -0700524 EXPECT_EQ(A2DP_GetTrackSampleRate(codec_info_sbc), 44100);
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800525 EXPECT_EQ(A2DP_GetTrackSampleRate(codec_info_aac), 44100);
Pavlin Radoslavovcd02ce92016-11-04 17:18:51 -0700526 EXPECT_EQ(A2DP_GetTrackSampleRate(codec_info_non_a2dp), -1);
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700527}
528
Pavlin Radoslavov4decac32017-01-13 17:42:01 -0800529TEST_F(StackA2dpTest, test_a2dp_get_track_channel_count) {
Pavlin Radoslavov5ce01162016-12-05 13:02:26 -0800530 EXPECT_EQ(A2DP_GetTrackChannelCount(codec_info_sbc), 2);
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800531 EXPECT_EQ(A2DP_GetTrackChannelCount(codec_info_aac), 2);
Pavlin Radoslavov5ce01162016-12-05 13:02:26 -0800532 EXPECT_EQ(A2DP_GetTrackChannelCount(codec_info_non_a2dp), -1);
533}
534
Pavlin Radoslavov4decac32017-01-13 17:42:01 -0800535TEST_F(StackA2dpTest, test_a2dp_get_number_of_subbands_sbc) {
Pavlin Radoslavovcd02ce92016-11-04 17:18:51 -0700536 EXPECT_EQ(A2DP_GetNumberOfSubbandsSbc(codec_info_sbc), 8);
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800537 EXPECT_EQ(A2DP_GetNumberOfSubbandsSbc(codec_info_aac), -1);
Pavlin Radoslavovcd02ce92016-11-04 17:18:51 -0700538 EXPECT_EQ(A2DP_GetNumberOfSubbandsSbc(codec_info_non_a2dp), -1);
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700539}
540
Pavlin Radoslavov4decac32017-01-13 17:42:01 -0800541TEST_F(StackA2dpTest, test_a2dp_get_number_of_blocks_sbc) {
Pavlin Radoslavovcd02ce92016-11-04 17:18:51 -0700542 EXPECT_EQ(A2DP_GetNumberOfBlocksSbc(codec_info_sbc), 16);
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800543 EXPECT_EQ(A2DP_GetNumberOfBlocksSbc(codec_info_aac), -1);
Pavlin Radoslavovcd02ce92016-11-04 17:18:51 -0700544 EXPECT_EQ(A2DP_GetNumberOfBlocksSbc(codec_info_non_a2dp), -1);
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700545}
546
Pavlin Radoslavov4decac32017-01-13 17:42:01 -0800547TEST_F(StackA2dpTest, test_a2dp_get_allocation_method_code_sbc) {
Pavlin Radoslavovcd02ce92016-11-04 17:18:51 -0700548 EXPECT_EQ(A2DP_GetAllocationMethodCodeSbc(codec_info_sbc), 0);
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800549 EXPECT_EQ(A2DP_GetAllocationMethodCodeSbc(codec_info_aac), -1);
Pavlin Radoslavovcd02ce92016-11-04 17:18:51 -0700550 EXPECT_EQ(A2DP_GetAllocationMethodCodeSbc(codec_info_non_a2dp), -1);
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700551}
552
Pavlin Radoslavov4decac32017-01-13 17:42:01 -0800553TEST_F(StackA2dpTest, test_a2dp_get_channel_mode_code_sbc) {
Pavlin Radoslavovcd02ce92016-11-04 17:18:51 -0700554 EXPECT_EQ(A2DP_GetChannelModeCodeSbc(codec_info_sbc), 3);
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800555 EXPECT_EQ(A2DP_GetChannelModeCodeSbc(codec_info_aac), -1);
Pavlin Radoslavovcd02ce92016-11-04 17:18:51 -0700556 EXPECT_EQ(A2DP_GetChannelModeCodeSbc(codec_info_non_a2dp), -1);
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700557}
558
Pavlin Radoslavov4decac32017-01-13 17:42:01 -0800559TEST_F(StackA2dpTest, test_a2dp_get_sampling_frequency_code_sbc) {
Pavlin Radoslavovcd02ce92016-11-04 17:18:51 -0700560 EXPECT_EQ(A2DP_GetSamplingFrequencyCodeSbc(codec_info_sbc), 2);
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800561 EXPECT_EQ(A2DP_GetSamplingFrequencyCodeSbc(codec_info_aac), -1);
Pavlin Radoslavovcd02ce92016-11-04 17:18:51 -0700562 EXPECT_EQ(A2DP_GetSamplingFrequencyCodeSbc(codec_info_non_a2dp), -1);
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700563}
564
Pavlin Radoslavov4decac32017-01-13 17:42:01 -0800565TEST_F(StackA2dpTest, test_a2dp_get_min_bitpool_sbc) {
Pavlin Radoslavovcd02ce92016-11-04 17:18:51 -0700566 EXPECT_EQ(A2DP_GetMinBitpoolSbc(codec_info_sbc), 2);
koh.changseok444ea2c2017-07-04 02:37:42 +0900567 EXPECT_EQ(A2DP_GetMinBitpoolSbc(codec_info_sbc_capability), 2);
Pavlin Radoslavov5ce01162016-12-05 13:02:26 -0800568 EXPECT_EQ(A2DP_GetMinBitpoolSbc(codec_info_sbc_sink_capability), 2);
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800569 EXPECT_EQ(A2DP_GetMinBitpoolSbc(codec_info_aac), -1);
Pavlin Radoslavovcd02ce92016-11-04 17:18:51 -0700570 EXPECT_EQ(A2DP_GetMinBitpoolSbc(codec_info_non_a2dp), -1);
571}
572
Pavlin Radoslavov4decac32017-01-13 17:42:01 -0800573TEST_F(StackA2dpTest, test_a2dp_get_max_bitpool_sbc) {
Pavlin Radoslavovcd02ce92016-11-04 17:18:51 -0700574 EXPECT_EQ(A2DP_GetMaxBitpoolSbc(codec_info_sbc), 53);
koh.changseok444ea2c2017-07-04 02:37:42 +0900575 EXPECT_EQ(A2DP_GetMaxBitpoolSbc(codec_info_sbc_capability), 53);
Pavlin Radoslavov5ce01162016-12-05 13:02:26 -0800576 EXPECT_EQ(A2DP_GetMaxBitpoolSbc(codec_info_sbc_sink_capability), 53);
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800577 EXPECT_EQ(A2DP_GetMaxBitpoolSbc(codec_info_aac), -1);
Pavlin Radoslavovcd02ce92016-11-04 17:18:51 -0700578 EXPECT_EQ(A2DP_GetMaxBitpoolSbc(codec_info_non_a2dp), -1);
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700579}
580
Pavlin Radoslavov4decac32017-01-13 17:42:01 -0800581TEST_F(StackA2dpTest, test_a2dp_get_sink_track_channel_type) {
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700582 EXPECT_EQ(A2DP_GetSinkTrackChannelType(codec_info_sbc), 3);
Bailey Forrest7e2ab692017-06-16 15:38:03 -0700583 EXPECT_EQ(A2DP_GetSinkTrackChannelType(codec_info_aac), 3);
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700584 EXPECT_EQ(A2DP_GetSinkTrackChannelType(codec_info_non_a2dp), -1);
585}
586
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800587TEST_F(StackA2dpTest, test_a2dp_get_object_type_code_aac) {
588 EXPECT_EQ(A2DP_GetObjectTypeCodeAac(codec_info_sbc), -1);
589 EXPECT_EQ(A2DP_GetObjectTypeCodeAac(codec_info_aac), 0x80);
590 EXPECT_EQ(A2DP_GetObjectTypeCodeAac(codec_info_non_a2dp), -1);
591}
592
593TEST_F(StackA2dpTest, test_a2dp_get_channel_mode_code_aac) {
594 EXPECT_EQ(A2DP_GetChannelModeCodeAac(codec_info_sbc), -1);
595 EXPECT_EQ(A2DP_GetChannelModeCodeAac(codec_info_aac), 0x04);
596 EXPECT_EQ(A2DP_GetChannelModeCodeAac(codec_info_non_a2dp), -1);
597}
598
599TEST_F(StackA2dpTest, test_a2dp_get_variable_bit_rate_support_aac) {
600 EXPECT_EQ(A2DP_GetVariableBitRateSupportAac(codec_info_sbc), -1);
601 EXPECT_EQ(A2DP_GetVariableBitRateSupportAac(codec_info_aac), 0);
602 EXPECT_EQ(A2DP_GetVariableBitRateSupportAac(codec_info_non_a2dp), -1);
603}
604
605TEST_F(StackA2dpTest, test_a2dp_get_bit_rate_aac) {
606 EXPECT_EQ(A2DP_GetBitRateAac(codec_info_sbc), -1);
607 EXPECT_EQ(A2DP_GetBitRateAac(codec_info_aac), 320000);
608 EXPECT_EQ(A2DP_GetBitRateAac(codec_info_non_a2dp), -1);
609}
610
Pavlin Radoslavov4decac32017-01-13 17:42:01 -0800611TEST_F(StackA2dpTest, test_a2dp_get_packet_timestamp) {
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700612 uint8_t a2dp_data[1000];
613 uint32_t timestamp;
Myles Watson911d1ae2016-11-28 16:44:40 -0800614 uint32_t* p_ts = reinterpret_cast<uint32_t*>(a2dp_data);
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700615
616 memset(a2dp_data, 0xAB, sizeof(a2dp_data));
617 *p_ts = 0x12345678;
618 timestamp = 0xFFFFFFFF;
619 EXPECT_TRUE(A2DP_GetPacketTimestamp(codec_info_sbc, a2dp_data, &timestamp));
620 EXPECT_EQ(timestamp, static_cast<uint32_t>(0x12345678));
621
622 memset(a2dp_data, 0xAB, sizeof(a2dp_data));
623 *p_ts = 0x12345678;
624 timestamp = 0xFFFFFFFF;
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800625 EXPECT_TRUE(A2DP_GetPacketTimestamp(codec_info_aac, a2dp_data, &timestamp));
626 EXPECT_EQ(timestamp, static_cast<uint32_t>(0x12345678));
627
628 memset(a2dp_data, 0xAB, sizeof(a2dp_data));
629 *p_ts = 0x12345678;
630 timestamp = 0xFFFFFFFF;
Myles Watson911d1ae2016-11-28 16:44:40 -0800631 EXPECT_FALSE(
632 A2DP_GetPacketTimestamp(codec_info_non_a2dp, a2dp_data, &timestamp));
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700633}
634
Pavlin Radoslavov4decac32017-01-13 17:42:01 -0800635TEST_F(StackA2dpTest, test_a2dp_build_codec_header) {
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700636 uint8_t a2dp_data[1000];
Myles Watson911d1ae2016-11-28 16:44:40 -0800637 BT_HDR* p_buf = reinterpret_cast<BT_HDR*>(a2dp_data);
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700638 const uint16_t BT_HDR_LEN = 500;
639 const uint16_t BT_HDR_OFFSET = 50;
640 const uint8_t FRAMES_PER_PACKET = 0xCD;
641
642 memset(a2dp_data, 0xAB, sizeof(a2dp_data));
643 p_buf->len = BT_HDR_LEN;
644 p_buf->offset = BT_HDR_OFFSET;
645 EXPECT_TRUE(A2DP_BuildCodecHeader(codec_info_sbc, p_buf, FRAMES_PER_PACKET));
Myles Watson911d1ae2016-11-28 16:44:40 -0800646 EXPECT_EQ(p_buf->offset + 1,
647 BT_HDR_OFFSET); // Modified by A2DP_SBC_MPL_HDR_LEN
648 EXPECT_EQ(p_buf->len - 1, BT_HDR_LEN); // Modified by A2DP_SBC_MPL_HDR_LEN
649 const uint8_t* p =
650 reinterpret_cast<const uint8_t*>(p_buf + 1) + p_buf->offset;
651 EXPECT_EQ(
652 *p, static_cast<uint8_t>(0x0D)); // 0xCD masked with A2DP_SBC_HDR_NUM_MSK
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700653
654 memset(a2dp_data, 0xAB, sizeof(a2dp_data));
655 p_buf->len = BT_HDR_LEN;
656 p_buf->offset = BT_HDR_OFFSET;
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800657 EXPECT_TRUE(A2DP_BuildCodecHeader(codec_info_aac, p_buf, FRAMES_PER_PACKET));
658
659 memset(a2dp_data, 0xAB, sizeof(a2dp_data));
660 p_buf->len = BT_HDR_LEN;
661 p_buf->offset = BT_HDR_OFFSET;
Myles Watson911d1ae2016-11-28 16:44:40 -0800662 EXPECT_FALSE(
663 A2DP_BuildCodecHeader(codec_info_non_a2dp, p_buf, FRAMES_PER_PACKET));
Pavlin Radoslavovf66f4e92016-10-14 15:14:37 -0700664}
Pavlin Radoslavovb7bb9f02016-10-18 17:19:55 -0700665
Pavlin Radoslavov4decac32017-01-13 17:42:01 -0800666TEST_F(StackA2dpTest, test_a2dp_adjust_codec) {
Pavlin Radoslavovb7bb9f02016-10-18 17:19:55 -0700667 uint8_t codec_info_sbc_test[AVDT_CODEC_SIZE];
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800668 uint8_t codec_info_aac_test[AVDT_CODEC_SIZE];
Pavlin Radoslavovb7bb9f02016-10-18 17:19:55 -0700669 uint8_t codec_info_non_a2dp_test[AVDT_CODEC_SIZE];
670
671 // Test updating a valid SBC codec that doesn't need adjustment
672 memset(codec_info_sbc_test, 0xAB, sizeof(codec_info_sbc_test));
673 memcpy(codec_info_sbc_test, codec_info_sbc, sizeof(codec_info_sbc));
674 EXPECT_TRUE(A2DP_AdjustCodec(codec_info_sbc_test));
Myles Watson911d1ae2016-11-28 16:44:40 -0800675 EXPECT_TRUE(
676 memcmp(codec_info_sbc_test, codec_info_sbc, sizeof(codec_info_sbc)) == 0);
Pavlin Radoslavovb7bb9f02016-10-18 17:19:55 -0700677
678 // Test updating a valid SBC codec that needs adjustment
679 memset(codec_info_sbc_test, 0xAB, sizeof(codec_info_sbc_test));
680 memcpy(codec_info_sbc_test, codec_info_sbc, sizeof(codec_info_sbc));
681 codec_info_sbc_test[6] = 54; // A2DP_SBC_MAX_BITPOOL + 1
682 EXPECT_TRUE(A2DP_AdjustCodec(codec_info_sbc_test));
Myles Watson911d1ae2016-11-28 16:44:40 -0800683 EXPECT_TRUE(
684 memcmp(codec_info_sbc_test, codec_info_sbc, sizeof(codec_info_sbc)) == 0);
Pavlin Radoslavovb7bb9f02016-10-18 17:19:55 -0700685
686 // Test updating an invalid SBC codec
687 memset(codec_info_sbc_test, 0xAB, sizeof(codec_info_sbc_test));
688 memcpy(codec_info_sbc_test, codec_info_sbc, sizeof(codec_info_sbc));
Myles Watson911d1ae2016-11-28 16:44:40 -0800689 codec_info_sbc_test[6] = 255; // Invalid MAX_BITPOOL
Pavlin Radoslavovb7bb9f02016-10-18 17:19:55 -0700690 EXPECT_FALSE(A2DP_AdjustCodec(codec_info_sbc_test));
691
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800692 // Test updating a valid AAC codec that doesn't need adjustment
693 memset(codec_info_aac_test, 0xAB, sizeof(codec_info_aac_test));
694 memcpy(codec_info_aac_test, codec_info_aac, sizeof(codec_info_aac));
695 EXPECT_TRUE(A2DP_AdjustCodec(codec_info_aac_test));
696 EXPECT_TRUE(
697 memcmp(codec_info_aac_test, codec_info_aac, sizeof(codec_info_aac)) == 0);
698
Pavlin Radoslavovb7bb9f02016-10-18 17:19:55 -0700699 // Test updating a non-A2DP codec that is not recognized
700 memset(codec_info_non_a2dp_test, 0xAB, sizeof(codec_info_non_a2dp_test));
701 memcpy(codec_info_non_a2dp_test, codec_info_non_a2dp,
702 sizeof(codec_info_non_a2dp));
703 EXPECT_FALSE(A2DP_AdjustCodec(codec_info_non_a2dp_test));
704}
Pavlin Radoslavov5ce01162016-12-05 13:02:26 -0800705
Pavlin Radoslavov4decac32017-01-13 17:42:01 -0800706TEST_F(StackA2dpTest, test_a2dp_source_codec_index) {
Pavlin Radoslavovf8dd02a2018-03-26 23:30:46 -0700707 // Explicit tests for known Source codecs
Pavlin Radoslavov5ce01162016-12-05 13:02:26 -0800708 EXPECT_EQ(A2DP_SourceCodecIndex(codec_info_sbc),
709 BTAV_A2DP_CODEC_INDEX_SOURCE_SBC);
koh.changseok444ea2c2017-07-04 02:37:42 +0900710 EXPECT_EQ(A2DP_SourceCodecIndex(codec_info_sbc_capability),
711 BTAV_A2DP_CODEC_INDEX_SOURCE_SBC);
Pavlin Radoslavov5ce01162016-12-05 13:02:26 -0800712 EXPECT_EQ(A2DP_SourceCodecIndex(codec_info_sbc_sink_capability),
713 BTAV_A2DP_CODEC_INDEX_SOURCE_SBC);
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800714 EXPECT_EQ(A2DP_SourceCodecIndex(codec_info_aac),
715 BTAV_A2DP_CODEC_INDEX_SOURCE_AAC);
716 EXPECT_EQ(A2DP_SourceCodecIndex(codec_info_aac_capability),
717 BTAV_A2DP_CODEC_INDEX_SOURCE_AAC);
718 EXPECT_EQ(A2DP_SourceCodecIndex(codec_info_aac_sink_capability),
719 BTAV_A2DP_CODEC_INDEX_SOURCE_AAC);
Pavlin Radoslavov5ce01162016-12-05 13:02:26 -0800720 EXPECT_EQ(A2DP_SourceCodecIndex(codec_info_non_a2dp),
721 BTAV_A2DP_CODEC_INDEX_MAX);
722}
723
Pavlin Radoslavovf8dd02a2018-03-26 23:30:46 -0700724TEST_F(StackA2dpTest, test_a2dp_sink_codec_index) {
725 // Explicit tests for known Sink codecs
726 EXPECT_EQ(A2DP_SinkCodecIndex(codec_info_sbc),
727 BTAV_A2DP_CODEC_INDEX_SINK_SBC);
728 EXPECT_EQ(A2DP_SinkCodecIndex(codec_info_sbc_capability),
729 BTAV_A2DP_CODEC_INDEX_SINK_SBC);
730 EXPECT_EQ(A2DP_SinkCodecIndex(codec_info_sbc_sink_capability),
731 BTAV_A2DP_CODEC_INDEX_SINK_SBC);
732 EXPECT_EQ(A2DP_SinkCodecIndex(codec_info_aac),
733 BTAV_A2DP_CODEC_INDEX_SINK_AAC);
734 EXPECT_EQ(A2DP_SinkCodecIndex(codec_info_aac_capability),
735 BTAV_A2DP_CODEC_INDEX_SINK_AAC);
736 EXPECT_EQ(A2DP_SinkCodecIndex(codec_info_aac_sink_capability),
737 BTAV_A2DP_CODEC_INDEX_SINK_AAC);
738 EXPECT_EQ(A2DP_SinkCodecIndex(codec_info_non_a2dp),
739 BTAV_A2DP_CODEC_INDEX_MAX);
740}
741
Pavlin Radoslavov4decac32017-01-13 17:42:01 -0800742TEST_F(StackA2dpTest, test_a2dp_codec_index_str) {
Pavlin Radoslavov5ce01162016-12-05 13:02:26 -0800743 // Explicit tests for known codecs
744 EXPECT_STREQ(A2DP_CodecIndexStr(BTAV_A2DP_CODEC_INDEX_SOURCE_SBC), "SBC");
745 EXPECT_STREQ(A2DP_CodecIndexStr(BTAV_A2DP_CODEC_INDEX_SINK_SBC), "SBC SINK");
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800746 EXPECT_STREQ(A2DP_CodecIndexStr(BTAV_A2DP_CODEC_INDEX_SOURCE_AAC), "AAC");
Pavlin Radoslavov5ce01162016-12-05 13:02:26 -0800747
748 // Test that the unknown codec string has not changed
749 EXPECT_STREQ(A2DP_CodecIndexStr(BTAV_A2DP_CODEC_INDEX_MAX),
750 "UNKNOWN CODEC INDEX");
751
752 // Test that each codec has a known string
Pavlin Radoslavov4decac32017-01-13 17:42:01 -0800753 for (int i = BTAV_A2DP_CODEC_INDEX_MIN; i < BTAV_A2DP_CODEC_INDEX_MAX; i++) {
Pavlin Radoslavov5ce01162016-12-05 13:02:26 -0800754 btav_a2dp_codec_index_t codec_index =
755 static_cast<btav_a2dp_codec_index_t>(i);
756 EXPECT_STRNE(A2DP_CodecIndexStr(codec_index), "UNKNOWN CODEC INDEX");
757 }
758}
759
Pavlin Radoslavov4decac32017-01-13 17:42:01 -0800760TEST_F(StackA2dpTest, test_a2dp_init_codec_config) {
Pavlin Radoslavovd7522292017-11-24 19:12:11 -0800761 AvdtpSepConfig avdt_cfg;
Pavlin Radoslavov5ce01162016-12-05 13:02:26 -0800762
763 //
764 // Test for SBC Source
765 //
766 memset(&avdt_cfg, 0, sizeof(avdt_cfg));
767 EXPECT_TRUE(
768 A2DP_InitCodecConfig(BTAV_A2DP_CODEC_INDEX_SOURCE_SBC, &avdt_cfg));
769 // Compare the result codec with the local test codec info
koh.changseok444ea2c2017-07-04 02:37:42 +0900770 for (size_t i = 0; i < codec_info_sbc_capability[0] + 1; i++) {
771 EXPECT_EQ(avdt_cfg.codec_info[i], codec_info_sbc_capability[i]);
Pavlin Radoslavov5ce01162016-12-05 13:02:26 -0800772 }
773// Test for content protection
774#if (BTA_AV_CO_CP_SCMS_T == TRUE)
775 EXPECT_EQ(avdt_cfg.protect_info[0], AVDT_CP_LOSC);
776 EXPECT_EQ(avdt_cfg.protect_info[1], (AVDT_CP_SCMS_T_ID & 0xFF));
777 EXPECT_EQ(avdt_cfg.protect_info[2], ((AVDT_CP_SCMS_T_ID >> 8) & 0xFF));
778 EXPECT_EQ(avdt_cfg.num_protect, 1);
779#endif
780
781 //
782 // Test for SBC Sink
783 //
784 memset(&avdt_cfg, 0, sizeof(avdt_cfg));
785 EXPECT_TRUE(A2DP_InitCodecConfig(BTAV_A2DP_CODEC_INDEX_SINK_SBC, &avdt_cfg));
786 // Compare the result codec with the local test codec info
787 for (size_t i = 0; i < codec_info_sbc_sink_capability[0] + 1; i++) {
788 EXPECT_EQ(avdt_cfg.codec_info[i], codec_info_sbc_sink_capability[i]);
789 }
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800790
791 //
792 // Test for AAC Source
793 //
794 memset(&avdt_cfg, 0, sizeof(avdt_cfg));
795 EXPECT_TRUE(
796 A2DP_InitCodecConfig(BTAV_A2DP_CODEC_INDEX_SOURCE_AAC, &avdt_cfg));
797 // Compare the result codec with the local test codec info
798 for (size_t i = 0; i < codec_info_aac_capability[0] + 1; i++) {
799 EXPECT_EQ(avdt_cfg.codec_info[i], codec_info_aac_capability[i]);
800 }
801// Test for content protection
802#if (BTA_AV_CO_CP_SCMS_T == TRUE)
803 EXPECT_EQ(avdt_cfg.protect_info[0], AVDT_CP_LOSC);
804 EXPECT_EQ(avdt_cfg.protect_info[1], (AVDT_CP_SCMS_T_ID & 0xFF));
805 EXPECT_EQ(avdt_cfg.protect_info[2], ((AVDT_CP_SCMS_T_ID >> 8) & 0xFF));
806 EXPECT_EQ(avdt_cfg.num_protect, 1);
807#endif
Pavlin Radoslavov5ce01162016-12-05 13:02:26 -0800808}
809
Pavlin Radoslavov4decac32017-01-13 17:42:01 -0800810TEST_F(A2dpCodecConfigTest, createCodec) {
811 for (int i = BTAV_A2DP_CODEC_INDEX_MIN; i < BTAV_A2DP_CODEC_INDEX_MAX; i++) {
Pavlin Radoslavov5ce01162016-12-05 13:02:26 -0800812 btav_a2dp_codec_index_t codec_index =
813 static_cast<btav_a2dp_codec_index_t>(i);
Pavlin Radoslavov4decac32017-01-13 17:42:01 -0800814
815 // Ignore codecs that are not supported on the device
816 if (!has_codec_support(codec_index)) {
817 continue;
818 }
819
Pavlin Radoslavov5ce01162016-12-05 13:02:26 -0800820 A2dpCodecConfig* codec_config = A2dpCodecConfig::createCodec(codec_index);
821 EXPECT_NE(codec_config, nullptr);
822 EXPECT_EQ(codec_config->codecIndex(), codec_index);
823 EXPECT_FALSE(codec_config->name().empty());
Pavlin Radoslavova6ba5ac2017-01-31 20:51:06 -0800824 EXPECT_NE(codec_config->codecPriority(), BTAV_A2DP_CODEC_PRIORITY_DISABLED);
825 EXPECT_NE(codec_config->codecPriority(), BTAV_A2DP_CODEC_PRIORITY_DEFAULT);
Pavlin Radoslavov5ce01162016-12-05 13:02:26 -0800826 delete codec_config;
827 }
828}
829
Pavlin Radoslavov4decac32017-01-13 17:42:01 -0800830TEST_F(A2dpCodecConfigTest, setCodecConfig) {
Pavlin Radoslavov5ce01162016-12-05 13:02:26 -0800831 uint8_t codec_info_result[AVDT_CODEC_SIZE];
832 btav_a2dp_codec_index_t peer_codec_index;
Pavlin Radoslavova6ba5ac2017-01-31 20:51:06 -0800833 A2dpCodecs* a2dp_codecs =
834 new A2dpCodecs(std::vector<btav_a2dp_codec_config_t>());
Pavlin Radoslavov5ce01162016-12-05 13:02:26 -0800835 A2dpCodecConfig* codec_config;
836
837 EXPECT_TRUE(a2dp_codecs->init());
838
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800839 // Create the codec capability - SBC
Pavlin Radoslavov5ce01162016-12-05 13:02:26 -0800840 memset(codec_info_result, 0, sizeof(codec_info_result));
841 peer_codec_index = A2DP_SourceCodecIndex(codec_info_sbc_sink_capability);
842 EXPECT_NE(peer_codec_index, BTAV_A2DP_CODEC_INDEX_MAX);
843 codec_config =
844 a2dp_codecs->findSourceCodecConfig(codec_info_sbc_sink_capability);
845 EXPECT_NE(codec_config, nullptr);
Pavlin Radoslavov494e53e2017-01-25 17:00:23 -0800846 EXPECT_TRUE(a2dp_codecs->setCodecConfig(
847 codec_info_sbc_sink_capability, true /* is_capability */,
848 codec_info_result, true /* select_current_codec */));
Pavlin Radoslavov5ce01162016-12-05 13:02:26 -0800849 EXPECT_EQ(a2dp_codecs->getCurrentCodecConfig(), codec_config);
850 // Compare the result codec with the local test codec info
851 for (size_t i = 0; i < codec_info_sbc[0] + 1; i++) {
852 EXPECT_EQ(codec_info_result[i], codec_info_sbc[i]);
853 }
Pavlin Radoslavovc95e5dd2017-05-10 17:09:00 -0700854 EXPECT_EQ(codec_config->getAudioBitsPerSample(), 16);
Pavlin Radoslavov5ce01162016-12-05 13:02:26 -0800855
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800856 // Create the codec capability - AAC
857 memset(codec_info_result, 0, sizeof(codec_info_result));
858 peer_codec_index = A2DP_SourceCodecIndex(codec_info_aac_sink_capability);
859 EXPECT_NE(peer_codec_index, BTAV_A2DP_CODEC_INDEX_MAX);
860 codec_config =
861 a2dp_codecs->findSourceCodecConfig(codec_info_aac_sink_capability);
862 EXPECT_NE(codec_config, nullptr);
Pavlin Radoslavov494e53e2017-01-25 17:00:23 -0800863 EXPECT_TRUE(a2dp_codecs->setCodecConfig(
864 codec_info_aac_sink_capability, true /* is_capability */,
865 codec_info_result, true /* select_current_codec */));
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800866 EXPECT_EQ(a2dp_codecs->getCurrentCodecConfig(), codec_config);
867 // Compare the result codec with the local test codec info
868 for (size_t i = 0; i < codec_info_aac[0] + 1; i++) {
869 EXPECT_EQ(codec_info_result[i], codec_info_aac[i]);
870 }
Pavlin Radoslavovc95e5dd2017-05-10 17:09:00 -0700871 EXPECT_EQ(codec_config->getAudioBitsPerSample(), 16);
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800872
873 // Create the codec config - SBC
Pavlin Radoslavov5ce01162016-12-05 13:02:26 -0800874 memset(codec_info_result, 0, sizeof(codec_info_result));
875 peer_codec_index = A2DP_SourceCodecIndex(codec_info_sbc);
876 EXPECT_NE(peer_codec_index, BTAV_A2DP_CODEC_INDEX_MAX);
877 codec_config = a2dp_codecs->findSourceCodecConfig(codec_info_sbc);
878 EXPECT_NE(codec_config, nullptr);
Pavlin Radoslavov494e53e2017-01-25 17:00:23 -0800879 EXPECT_TRUE(a2dp_codecs->setCodecConfig(
880 codec_info_sbc, false /* is_capability */, codec_info_result,
881 true /* select_current_codec */));
Pavlin Radoslavov5ce01162016-12-05 13:02:26 -0800882 EXPECT_EQ(a2dp_codecs->getCurrentCodecConfig(), codec_config);
883 // Compare the result codec with the local test codec info
884 for (size_t i = 0; i < codec_info_sbc[0] + 1; i++) {
885 EXPECT_EQ(codec_info_result[i], codec_info_sbc[i]);
886 }
Pavlin Radoslavov3b8391c2017-05-12 01:16:10 -0700887 EXPECT_FALSE(codec_config->useRtpHeaderMarkerBit());
Pavlin Radoslavov5ce01162016-12-05 13:02:26 -0800888
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800889 // Create the codec config - AAC
890 memset(codec_info_result, 0, sizeof(codec_info_result));
891 peer_codec_index = A2DP_SourceCodecIndex(codec_info_aac);
892 EXPECT_NE(peer_codec_index, BTAV_A2DP_CODEC_INDEX_MAX);
893 codec_config = a2dp_codecs->findSourceCodecConfig(codec_info_aac);
894 EXPECT_NE(codec_config, nullptr);
Pavlin Radoslavov494e53e2017-01-25 17:00:23 -0800895 EXPECT_TRUE(a2dp_codecs->setCodecConfig(
896 codec_info_aac, false /* is_capability */, codec_info_result,
897 true /* select_current_codec */));
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800898 EXPECT_EQ(a2dp_codecs->getCurrentCodecConfig(), codec_config);
899 // Compare the result codec with the local test codec info
900 for (size_t i = 0; i < codec_info_aac[0] + 1; i++) {
901 EXPECT_EQ(codec_info_result[i], codec_info_aac[i]);
902 }
Pavlin Radoslavov3b8391c2017-05-12 01:16:10 -0700903 EXPECT_TRUE(codec_config->useRtpHeaderMarkerBit());
Pavlin Radoslavovd5f49602017-01-03 16:53:18 -0800904
Pavlin Radoslavovf8dd02a2018-03-26 23:30:46 -0700905 // Create the codec capability - SBC Sink
906 memset(codec_info_result, 0, sizeof(codec_info_result));
907 peer_codec_index = A2DP_SinkCodecIndex(codec_info_sbc_capability);
908 EXPECT_NE(peer_codec_index, BTAV_A2DP_CODEC_INDEX_MAX);
909 codec_config = a2dp_codecs->findSinkCodecConfig(codec_info_sbc_capability);
910 EXPECT_NE(codec_config, nullptr);
911 EXPECT_TRUE(a2dp_codecs->setSinkCodecConfig(
912 codec_info_sbc_capability, true /* is_capability */, codec_info_result,
913 true /* select_current_codec */));
914 EXPECT_EQ(a2dp_codecs->getCurrentCodecConfig(), codec_config);
915 // Compare the result codec with the local test codec info
916 for (size_t i = 0; i < codec_info_sbc[0] + 1; i++) {
917 EXPECT_EQ(codec_info_result[i], codec_info_sbc[i]);
918 }
919 EXPECT_EQ(codec_config->getAudioBitsPerSample(), 16);
920
921 // Create the codec capability - AAC Sink
922 memset(codec_info_result, 0, sizeof(codec_info_result));
923 peer_codec_index = A2DP_SinkCodecIndex(codec_info_aac_capability);
924 EXPECT_NE(peer_codec_index, BTAV_A2DP_CODEC_INDEX_MAX);
925 codec_config = a2dp_codecs->findSinkCodecConfig(codec_info_aac_capability);
926 EXPECT_NE(codec_config, nullptr);
927 EXPECT_TRUE(a2dp_codecs->setSinkCodecConfig(
928 codec_info_aac_capability, true /* is_capability */, codec_info_result,
929 true /* select_current_codec */));
930 EXPECT_EQ(a2dp_codecs->getCurrentCodecConfig(), codec_config);
931 // Compare the result codec with the local test codec info
932 for (size_t i = 0; i < codec_info_aac[0] + 1; i++) {
933 EXPECT_EQ(codec_info_result[i], codec_info_aac[i]);
934 }
935 EXPECT_EQ(codec_config->getAudioBitsPerSample(), 16);
936
937 // Create the codec config - SBC Sink
938 memset(codec_info_result, 0, sizeof(codec_info_result));
939 peer_codec_index = A2DP_SinkCodecIndex(codec_info_sbc);
940 EXPECT_NE(peer_codec_index, BTAV_A2DP_CODEC_INDEX_MAX);
941 codec_config = a2dp_codecs->findSinkCodecConfig(codec_info_sbc);
942 EXPECT_NE(codec_config, nullptr);
943 EXPECT_TRUE(a2dp_codecs->setSinkCodecConfig(
944 codec_info_sbc, false /* is_capability */, codec_info_result,
945 true /* select_current_codec */));
946 EXPECT_EQ(a2dp_codecs->getCurrentCodecConfig(), codec_config);
947 // Compare the result codec with the local test codec info
948 for (size_t i = 0; i < codec_info_sbc[0] + 1; i++) {
949 EXPECT_EQ(codec_info_result[i], codec_info_sbc[i]);
950 }
951 EXPECT_EQ(codec_config->getAudioBitsPerSample(), 16);
952
953 // Create the codec config - AAC Sink
954 memset(codec_info_result, 0, sizeof(codec_info_result));
955 peer_codec_index = A2DP_SinkCodecIndex(codec_info_aac);
956 EXPECT_NE(peer_codec_index, BTAV_A2DP_CODEC_INDEX_MAX);
957 codec_config = a2dp_codecs->findSinkCodecConfig(codec_info_aac);
958 EXPECT_NE(codec_config, nullptr);
959 EXPECT_TRUE(a2dp_codecs->setSinkCodecConfig(
960 codec_info_aac, false /* is_capability */, codec_info_result,
961 true /* select_current_codec */));
962 EXPECT_EQ(a2dp_codecs->getCurrentCodecConfig(), codec_config);
963 // Compare the result codec with the local test codec info
964 for (size_t i = 0; i < codec_info_aac[0] + 1; i++) {
965 EXPECT_EQ(codec_info_result[i], codec_info_aac[i]);
966 }
967 EXPECT_EQ(codec_config->getAudioBitsPerSample(), 16);
968
Pavlin Radoslavov5ce01162016-12-05 13:02:26 -0800969 // Test invalid codec info
970 uint8_t codec_info_sbc_test1[AVDT_CODEC_SIZE];
971 memset(codec_info_result, 0, sizeof(codec_info_result));
972 memset(codec_info_sbc_test1, 0, sizeof(codec_info_sbc_test1));
Pavlin Radoslavov494e53e2017-01-25 17:00:23 -0800973 EXPECT_FALSE(a2dp_codecs->setCodecConfig(
974 codec_info_sbc_test1, true /* is_capability */, codec_info_result,
975 true /* select_current_codec */));
Pavlin Radoslavov5ce01162016-12-05 13:02:26 -0800976 delete a2dp_codecs;
977}
978
Pavlin Radoslavov4decac32017-01-13 17:42:01 -0800979TEST_F(A2dpCodecConfigTest, init) {
Pavlin Radoslavova6ba5ac2017-01-31 20:51:06 -0800980 std::vector<btav_a2dp_codec_config_t> default_priorities;
981 A2dpCodecs codecs(default_priorities);
Pavlin Radoslavov5ce01162016-12-05 13:02:26 -0800982
983 EXPECT_TRUE(codecs.init());
984
985 const std::list<A2dpCodecConfig*> orderedSourceCodecs =
986 codecs.orderedSourceCodecs();
987 EXPECT_FALSE(orderedSourceCodecs.empty());
988
989 const std::list<A2dpCodecConfig*> orderedSinkCodecs =
990 codecs.orderedSinkCodecs();
991 EXPECT_FALSE(orderedSinkCodecs.empty());
992}