1 /******************************************************************************
2  *
3  *  Copyright 2016 The Android Open Source Project
4  *
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 
19 #include <dlfcn.h>
20 
21 #include <set>
22 #include <vector>
23 
24 #include <gtest/gtest.h>
25 
26 #include "stack/include/a2dp_aac.h"
27 #include "stack/include/a2dp_api.h"
28 #include "stack/include/a2dp_codec_api.h"
29 #include "stack/include/a2dp_sbc.h"
30 #include "stack/include/a2dp_vendor.h"
31 
32 namespace {
33 const uint8_t codec_info_sbc[AVDT_CODEC_SIZE] = {
34     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
47 };
48 
49 const 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 
69 const uint8_t codec_info_sbc_sink_capability[AVDT_CODEC_SIZE] = {
70     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
92 };
93 
94 const 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 
111 const uint8_t codec_info_aac_capability[AVDT_CODEC_SIZE] = {
112     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
127 };
128 
129 const 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 
155 const uint8_t codec_info_non_a2dp[AVDT_CODEC_SIZE] = {
156     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
162 };
163 
164 const uint8_t codec_info_non_a2dp_dummy[AVDT_CODEC_SIZE] = {
165     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
171 };
172 
173 static const char* APTX_ENCODER_LIB_NAME = "libaptX_encoder.so";
174 static const char* APTX_HD_ENCODER_LIB_NAME = "libaptXHD_encoder.so";
175 static const char* LDAC_ENCODER_LIB_NAME = "libldacBT_enc.so";
176 
has_shared_library(const char * name)177 static bool has_shared_library(const char* name) {
178   void* lib_handle = dlopen(name, RTLD_NOW);
179   if (lib_handle != nullptr) {
180     dlclose(lib_handle);
181     return true;
182   }
183   return false;
184 }
185 
186 }  // namespace
187 
188 class StackA2dpTest : public ::testing::Test {
189  protected:
StackA2dpTest()190   StackA2dpTest() {
191     // Create the set with all supported codecs
192     for (int i = BTAV_A2DP_CODEC_INDEX_MIN; i < BTAV_A2DP_CODEC_INDEX_MAX;
193          i++) {
194       btav_a2dp_codec_index_t codec_index =
195           static_cast<btav_a2dp_codec_index_t>(i);
196 
197       bool supported = false;
198       switch (codec_index) {
199         case BTAV_A2DP_CODEC_INDEX_SOURCE_SBC:
200           supported = true;
201           break;
202         case BTAV_A2DP_CODEC_INDEX_SOURCE_AAC:
203           supported = true;
204           break;
205         case BTAV_A2DP_CODEC_INDEX_SOURCE_APTX:
206           // Codec aptX is supported only if the device has the corresponding
207           // shared library installed.
208           supported = has_shared_library(APTX_ENCODER_LIB_NAME);
209           break;
210         case BTAV_A2DP_CODEC_INDEX_SOURCE_APTX_HD:
211           // Codec aptX-HD is supported only if the device has the corresponding
212           // shared library installed.
213           supported = has_shared_library(APTX_HD_ENCODER_LIB_NAME);
214           break;
215         case BTAV_A2DP_CODEC_INDEX_SOURCE_LDAC:
216           // Codec LDAC is supported only if the device has the corresponding
217           // shared library installed.
218           supported = has_shared_library(LDAC_ENCODER_LIB_NAME);
219           break;
220         case BTAV_A2DP_CODEC_INDEX_SINK_SBC:
221           supported = true;
222           break;
223         case BTAV_A2DP_CODEC_INDEX_SINK_AAC:
224           supported = true;
225           break;
226         case BTAV_A2DP_CODEC_INDEX_MAX:
227           // Needed to avoid using "default:" case so we can capture when
228           // a new codec is added, and it can be included here.
229           break;
230       }
231 
232       if (supported) {
233         supported_codecs_.insert(codec_index);
234       }
235     }
236   }
237 
has_codec_support(btav_a2dp_codec_index_t codec_index)238   bool has_codec_support(btav_a2dp_codec_index_t codec_index) {
239     return supported_codecs_.find(codec_index) != supported_codecs_.end();
240   }
241 
242  private:
243   std::set<btav_a2dp_codec_index_t> supported_codecs_;
244 };
245 
246 class A2dpCodecConfigTest : public StackA2dpTest {};
247 
TEST_F(StackA2dpTest,test_a2dp_bits_set)248 TEST_F(StackA2dpTest, test_a2dp_bits_set) {
249   EXPECT_TRUE(A2DP_BitsSet(0x0) == A2DP_SET_ZERO_BIT);
250   EXPECT_TRUE(A2DP_BitsSet(0x1) == A2DP_SET_ONE_BIT);
251   EXPECT_TRUE(A2DP_BitsSet(0x2) == A2DP_SET_ONE_BIT);
252   EXPECT_TRUE(A2DP_BitsSet(0x3) == A2DP_SET_MULTL_BIT);
253   EXPECT_TRUE(A2DP_BitsSet(0x7f) == A2DP_SET_MULTL_BIT);
254   EXPECT_TRUE(A2DP_BitsSet(0x80) == A2DP_SET_ONE_BIT);
255   EXPECT_TRUE(A2DP_BitsSet(0x81) == A2DP_SET_MULTL_BIT);
256   EXPECT_TRUE(A2DP_BitsSet(0xc0) == A2DP_SET_MULTL_BIT);
257   EXPECT_TRUE(A2DP_BitsSet(0xff) == A2DP_SET_MULTL_BIT);
258   EXPECT_TRUE(A2DP_BitsSet(0x8000) == A2DP_SET_ONE_BIT);
259   EXPECT_TRUE(A2DP_BitsSet(0x8001) == A2DP_SET_MULTL_BIT);
260   EXPECT_TRUE(A2DP_BitsSet(0xc000) == A2DP_SET_MULTL_BIT);
261   EXPECT_TRUE(A2DP_BitsSet(0xffff) == A2DP_SET_MULTL_BIT);
262   EXPECT_TRUE(A2DP_BitsSet(0x80000) == A2DP_SET_ONE_BIT);
263   EXPECT_TRUE(A2DP_BitsSet(0x80001) == A2DP_SET_MULTL_BIT);
264   EXPECT_TRUE(A2DP_BitsSet(0xc0000) == A2DP_SET_MULTL_BIT);
265   EXPECT_TRUE(A2DP_BitsSet(0xfffff) == A2DP_SET_MULTL_BIT);
266   EXPECT_TRUE(A2DP_BitsSet(0x80000000) == A2DP_SET_ONE_BIT);
267   EXPECT_TRUE(A2DP_BitsSet(0x80000001) == A2DP_SET_MULTL_BIT);
268   EXPECT_TRUE(A2DP_BitsSet(0xc0000000) == A2DP_SET_MULTL_BIT);
269   EXPECT_TRUE(A2DP_BitsSet(0xffffffff) == A2DP_SET_MULTL_BIT);
270   EXPECT_TRUE(A2DP_BitsSet(0x8000000000000000) == A2DP_SET_ONE_BIT);
271   EXPECT_TRUE(A2DP_BitsSet(0x8000000000000001) == A2DP_SET_MULTL_BIT);
272   EXPECT_TRUE(A2DP_BitsSet(0xc000000000000000) == A2DP_SET_MULTL_BIT);
273   EXPECT_TRUE(A2DP_BitsSet(0xffffffffffffffff) == A2DP_SET_MULTL_BIT);
274 }
275 
TEST_F(StackA2dpTest,test_a2dp_is_codec_valid_sbc)276 TEST_F(StackA2dpTest, test_a2dp_is_codec_valid_sbc) {
277   EXPECT_TRUE(A2DP_IsSourceCodecValid(codec_info_sbc));
278   EXPECT_TRUE(A2DP_IsSourceCodecValid(codec_info_sbc_capability));
279   EXPECT_TRUE(A2DP_IsPeerSourceCodecValid(codec_info_sbc));
280   EXPECT_TRUE(A2DP_IsPeerSourceCodecValid(codec_info_sbc_capability));
281 
282   EXPECT_TRUE(A2DP_IsSinkCodecValid(codec_info_sbc_sink_capability));
283   EXPECT_TRUE(A2DP_IsPeerSinkCodecValid(codec_info_sbc_sink_capability));
284 
285   EXPECT_FALSE(A2DP_IsSourceCodecValid(codec_info_non_a2dp));
286   EXPECT_FALSE(A2DP_IsSinkCodecValid(codec_info_non_a2dp));
287   EXPECT_FALSE(A2DP_IsPeerSourceCodecValid(codec_info_non_a2dp));
288   EXPECT_FALSE(A2DP_IsPeerSinkCodecValid(codec_info_non_a2dp));
289 
290   // Test with invalid SBC codecs
291   uint8_t codec_info_sbc_invalid[AVDT_CODEC_SIZE];
292   memset(codec_info_sbc_invalid, 0, sizeof(codec_info_sbc_invalid));
293   EXPECT_FALSE(A2DP_IsSourceCodecValid(codec_info_sbc_invalid));
294   EXPECT_FALSE(A2DP_IsSinkCodecValid(codec_info_sbc_invalid));
295   EXPECT_FALSE(A2DP_IsPeerSourceCodecValid(codec_info_sbc_invalid));
296   EXPECT_FALSE(A2DP_IsPeerSinkCodecValid(codec_info_sbc_invalid));
297 
298   memcpy(codec_info_sbc_invalid, codec_info_sbc, sizeof(codec_info_sbc));
299   codec_info_sbc_invalid[0] = 0;  // Corrupt the Length field
300   EXPECT_FALSE(A2DP_IsSourceCodecValid(codec_info_sbc_invalid));
301   EXPECT_FALSE(A2DP_IsSinkCodecValid(codec_info_sbc_invalid));
302   EXPECT_FALSE(A2DP_IsPeerSourceCodecValid(codec_info_sbc_invalid));
303   EXPECT_FALSE(A2DP_IsPeerSinkCodecValid(codec_info_sbc_invalid));
304 
305   memcpy(codec_info_sbc_invalid, codec_info_sbc, sizeof(codec_info_sbc));
306   codec_info_sbc_invalid[1] = 0xff;  // Corrupt the Media Type field
307   EXPECT_FALSE(A2DP_IsSourceCodecValid(codec_info_sbc_invalid));
308   EXPECT_FALSE(A2DP_IsSinkCodecValid(codec_info_sbc_invalid));
309   EXPECT_FALSE(A2DP_IsPeerSourceCodecValid(codec_info_sbc_invalid));
310   EXPECT_FALSE(A2DP_IsPeerSinkCodecValid(codec_info_sbc_invalid));
311 }
312 
TEST_F(StackA2dpTest,test_a2dp_is_codec_valid_aac)313 TEST_F(StackA2dpTest, test_a2dp_is_codec_valid_aac) {
314   EXPECT_TRUE(A2DP_IsSourceCodecValid(codec_info_aac));
315   EXPECT_TRUE(A2DP_IsSourceCodecValid(codec_info_aac_capability));
316   EXPECT_TRUE(A2DP_IsPeerSourceCodecValid(codec_info_aac));
317   EXPECT_TRUE(A2DP_IsPeerSourceCodecValid(codec_info_aac_capability));
318 
319   EXPECT_TRUE(A2DP_IsSinkCodecValid(codec_info_aac_sink_capability));
320   EXPECT_TRUE(A2DP_IsPeerSinkCodecValid(codec_info_aac_sink_capability));
321 
322   // Test with invalid AAC codecs
323   uint8_t codec_info_aac_invalid[AVDT_CODEC_SIZE];
324   memcpy(codec_info_aac_invalid, codec_info_aac, sizeof(codec_info_aac));
325   codec_info_aac_invalid[0] = 0;  // Corrupt the Length field
326   EXPECT_FALSE(A2DP_IsSourceCodecValid(codec_info_aac_invalid));
327   EXPECT_FALSE(A2DP_IsSinkCodecValid(codec_info_aac_invalid));
328   EXPECT_FALSE(A2DP_IsPeerSourceCodecValid(codec_info_aac_invalid));
329   EXPECT_FALSE(A2DP_IsPeerSinkCodecValid(codec_info_aac_invalid));
330 
331   memcpy(codec_info_aac_invalid, codec_info_aac, sizeof(codec_info_aac));
332   codec_info_aac_invalid[1] = 0xff;  // Corrupt the Media Type field
333   EXPECT_FALSE(A2DP_IsSourceCodecValid(codec_info_aac_invalid));
334   EXPECT_FALSE(A2DP_IsSinkCodecValid(codec_info_aac_invalid));
335   EXPECT_FALSE(A2DP_IsPeerSourceCodecValid(codec_info_aac_invalid));
336   EXPECT_FALSE(A2DP_IsPeerSinkCodecValid(codec_info_aac_invalid));
337 }
338 
TEST_F(StackA2dpTest,test_a2dp_get_codec_type)339 TEST_F(StackA2dpTest, test_a2dp_get_codec_type) {
340   tA2DP_CODEC_TYPE codec_type = A2DP_GetCodecType(codec_info_sbc);
341   EXPECT_EQ(codec_type, A2DP_MEDIA_CT_SBC);
342 
343   codec_type = A2DP_GetCodecType(codec_info_aac);
344   EXPECT_EQ(codec_type, A2DP_MEDIA_CT_AAC);
345 
346   codec_type = A2DP_GetCodecType(codec_info_non_a2dp);
347   EXPECT_EQ(codec_type, A2DP_MEDIA_CT_NON_A2DP);
348 }
349 
TEST_F(StackA2dpTest,test_a2dp_is_sink_codec_supported)350 TEST_F(StackA2dpTest, test_a2dp_is_sink_codec_supported) {
351   EXPECT_TRUE(A2DP_IsSinkCodecSupported(codec_info_sbc));
352   EXPECT_FALSE(A2DP_IsSinkCodecSupported(codec_info_sbc_capability));
353   EXPECT_FALSE(A2DP_IsSinkCodecSupported(codec_info_sbc_sink_capability));
354 
355   EXPECT_TRUE(A2DP_IsSinkCodecSupported(codec_info_aac));
356   // NOTE: The test below should be EXPECT_FALSE.
357   // However, codec_info_aac_capability is practically same as codec_info_aac,
358   // therefore we cannot differentiate it as a capability.
359   EXPECT_TRUE(A2DP_IsSinkCodecSupported(codec_info_aac_capability));
360   EXPECT_FALSE(A2DP_IsSinkCodecSupported(codec_info_aac_sink_capability));
361 
362   EXPECT_FALSE(A2DP_IsSinkCodecSupported(codec_info_non_a2dp));
363 }
364 
TEST_F(StackA2dpTest,test_a2dp_is_peer_source_codec_supported)365 TEST_F(StackA2dpTest, test_a2dp_is_peer_source_codec_supported) {
366   EXPECT_TRUE(A2DP_IsPeerSourceCodecSupported(codec_info_sbc));
367   EXPECT_TRUE(A2DP_IsPeerSourceCodecSupported(codec_info_sbc_capability));
368   EXPECT_TRUE(A2DP_IsPeerSourceCodecSupported(codec_info_sbc_sink_capability));
369 
370   EXPECT_TRUE(A2DP_IsPeerSourceCodecSupported(codec_info_aac));
371   EXPECT_TRUE(A2DP_IsPeerSourceCodecSupported(codec_info_aac_capability));
372   EXPECT_TRUE(A2DP_IsPeerSourceCodecSupported(codec_info_aac_sink_capability));
373 
374   EXPECT_FALSE(A2DP_IsPeerSourceCodecSupported(codec_info_non_a2dp));
375 }
376 
TEST_F(StackA2dpTest,test_init_default_codec)377 TEST_F(StackA2dpTest, test_init_default_codec) {
378   uint8_t codec_info_result[AVDT_CODEC_SIZE];
379 
380   memset(codec_info_result, 0, sizeof(codec_info_result));
381   A2DP_InitDefaultCodec(codec_info_result);
382 
383   // Compare the result codec with the local test codec info
384   for (size_t i = 0; i < codec_info_sbc[0] + 1; i++) {
385     EXPECT_EQ(codec_info_result[i], codec_info_sbc[i]);
386   }
387 }
388 
TEST_F(StackA2dpTest,test_a2dp_uses_rtp_header)389 TEST_F(StackA2dpTest, test_a2dp_uses_rtp_header) {
390   EXPECT_TRUE(A2DP_UsesRtpHeader(true, codec_info_sbc));
391   EXPECT_TRUE(A2DP_UsesRtpHeader(false, codec_info_sbc));
392 
393   EXPECT_TRUE(A2DP_UsesRtpHeader(true, codec_info_aac));
394   EXPECT_TRUE(A2DP_UsesRtpHeader(false, codec_info_aac));
395 
396   EXPECT_TRUE(A2DP_UsesRtpHeader(true, codec_info_non_a2dp));
397   EXPECT_TRUE(A2DP_UsesRtpHeader(false, codec_info_non_a2dp));
398 }
399 
TEST_F(StackA2dpTest,test_a2dp_get_media_type)400 TEST_F(StackA2dpTest, test_a2dp_get_media_type) {
401   uint8_t codec_info_test[AVDT_CODEC_SIZE];
402 
403   EXPECT_EQ(A2DP_GetMediaType(codec_info_sbc), AVDT_MEDIA_TYPE_AUDIO);
404   EXPECT_EQ(A2DP_GetMediaType(codec_info_aac), AVDT_MEDIA_TYPE_AUDIO);
405   EXPECT_EQ(A2DP_GetMediaType(codec_info_non_a2dp), AVDT_MEDIA_TYPE_AUDIO);
406 
407   // Prepare dummy codec info for video and for multimedia
408   memset(codec_info_test, 0, sizeof(codec_info_test));
409   codec_info_test[0] = sizeof(codec_info_test);
410   codec_info_test[1] = 0x01 << 4;
411   EXPECT_EQ(A2DP_GetMediaType(codec_info_test), AVDT_MEDIA_TYPE_VIDEO);
412   codec_info_test[1] = 0x02 << 4;
413   EXPECT_EQ(A2DP_GetMediaType(codec_info_test), AVDT_MEDIA_TYPE_MULTI);
414 }
415 
TEST_F(StackA2dpTest,test_a2dp_codec_name)416 TEST_F(StackA2dpTest, test_a2dp_codec_name) {
417   uint8_t codec_info_test[AVDT_CODEC_SIZE];
418 
419   // Explicit tests for known codecs
420   EXPECT_STREQ(A2DP_CodecName(codec_info_sbc), "SBC");
421   EXPECT_STREQ(A2DP_CodecName(codec_info_sbc_capability), "SBC");
422   EXPECT_STREQ(A2DP_CodecName(codec_info_sbc_sink_capability), "SBC");
423   EXPECT_STREQ(A2DP_CodecName(codec_info_aac), "AAC");
424   EXPECT_STREQ(A2DP_CodecName(codec_info_aac_capability), "AAC");
425   EXPECT_STREQ(A2DP_CodecName(codec_info_aac_sink_capability), "AAC");
426   EXPECT_STREQ(A2DP_CodecName(codec_info_non_a2dp), "UNKNOWN VENDOR CODEC");
427 
428   // Test all unknown codecs
429   memcpy(codec_info_test, codec_info_sbc, sizeof(codec_info_sbc));
430   for (uint8_t codec_type = A2DP_MEDIA_CT_AAC + 1;
431        codec_type < A2DP_MEDIA_CT_NON_A2DP; codec_type++) {
432     codec_info_test[2] = codec_type;  // Unknown codec type
433     EXPECT_STREQ(A2DP_CodecName(codec_info_test), "UNKNOWN CODEC");
434   }
435 }
436 
TEST_F(StackA2dpTest,test_a2dp_vendor)437 TEST_F(StackA2dpTest, test_a2dp_vendor) {
438   EXPECT_EQ(A2DP_VendorCodecGetVendorId(codec_info_non_a2dp),
439             (uint32_t)0x00000403);
440   EXPECT_EQ(A2DP_VendorCodecGetCodecId(codec_info_non_a2dp), (uint16_t)0x0807);
441   EXPECT_TRUE(A2DP_VendorUsesRtpHeader(true, codec_info_non_a2dp));
442   EXPECT_TRUE(A2DP_VendorUsesRtpHeader(false, codec_info_non_a2dp));
443 }
444 
TEST_F(StackA2dpTest,test_a2dp_codec_type_equals)445 TEST_F(StackA2dpTest, test_a2dp_codec_type_equals) {
446   EXPECT_TRUE(A2DP_CodecTypeEquals(codec_info_sbc, codec_info_sbc_capability));
447   EXPECT_TRUE(
448       A2DP_CodecTypeEquals(codec_info_sbc, codec_info_sbc_sink_capability));
449   EXPECT_TRUE(A2DP_CodecTypeEquals(codec_info_aac, codec_info_aac_capability));
450   EXPECT_TRUE(
451       A2DP_CodecTypeEquals(codec_info_aac, codec_info_aac_sink_capability));
452   EXPECT_TRUE(
453       A2DP_CodecTypeEquals(codec_info_non_a2dp, codec_info_non_a2dp_dummy));
454   EXPECT_FALSE(A2DP_CodecTypeEquals(codec_info_sbc, codec_info_non_a2dp));
455   EXPECT_FALSE(A2DP_CodecTypeEquals(codec_info_aac, codec_info_non_a2dp));
456   EXPECT_FALSE(A2DP_CodecTypeEquals(codec_info_sbc, codec_info_aac));
457 }
458 
TEST_F(StackA2dpTest,test_a2dp_codec_equals)459 TEST_F(StackA2dpTest, test_a2dp_codec_equals) {
460   uint8_t codec_info_sbc_test[AVDT_CODEC_SIZE];
461   uint8_t codec_info_aac_test[AVDT_CODEC_SIZE];
462   uint8_t codec_info_non_a2dp_test[AVDT_CODEC_SIZE];
463 
464   // Test two identical SBC codecs
465   memset(codec_info_sbc_test, 0xAB, sizeof(codec_info_sbc_test));
466   memcpy(codec_info_sbc_test, codec_info_sbc, sizeof(codec_info_sbc));
467   EXPECT_TRUE(A2DP_CodecEquals(codec_info_sbc, codec_info_sbc_test));
468 
469   // Test two identical AAC codecs
470   memset(codec_info_aac_test, 0xAB, sizeof(codec_info_aac_test));
471   memcpy(codec_info_aac_test, codec_info_aac, sizeof(codec_info_aac));
472   EXPECT_TRUE(A2DP_CodecEquals(codec_info_aac, codec_info_aac_test));
473 
474   // Test two identical non-A2DP codecs that are not recognized
475   memset(codec_info_non_a2dp_test, 0xAB, sizeof(codec_info_non_a2dp_test));
476   memcpy(codec_info_non_a2dp_test, codec_info_non_a2dp,
477          sizeof(codec_info_non_a2dp));
478   EXPECT_FALSE(A2DP_CodecEquals(codec_info_non_a2dp, codec_info_non_a2dp_test));
479 
480   // Test two codecs that have different types
481   EXPECT_FALSE(A2DP_CodecEquals(codec_info_sbc, codec_info_non_a2dp));
482   EXPECT_FALSE(A2DP_CodecEquals(codec_info_sbc, codec_info_aac));
483 
484   // Test two SBC codecs that are slightly different
485   memset(codec_info_sbc_test, 0xAB, sizeof(codec_info_sbc_test));
486   memcpy(codec_info_sbc_test, codec_info_sbc, sizeof(codec_info_sbc));
487   codec_info_sbc_test[5] = codec_info_sbc[5] + 1;
488   EXPECT_FALSE(A2DP_CodecEquals(codec_info_sbc, codec_info_sbc_test));
489   codec_info_sbc_test[5] = codec_info_sbc[5];
490   codec_info_sbc_test[6] = codec_info_sbc[6] + 1;
491   EXPECT_FALSE(A2DP_CodecEquals(codec_info_sbc, codec_info_sbc_test));
492 
493   // Test two AAC codecs that are slightly different
494   memset(codec_info_aac_test, 0xAB, sizeof(codec_info_aac_test));
495   memcpy(codec_info_aac_test, codec_info_aac, sizeof(codec_info_aac));
496   codec_info_aac_test[7] = codec_info_aac[7] + 1;
497   EXPECT_FALSE(A2DP_CodecEquals(codec_info_aac, codec_info_aac_test));
498   codec_info_aac_test[7] = codec_info_aac[7];
499   codec_info_aac_test[8] = codec_info_aac[8] + 1;
500   EXPECT_FALSE(A2DP_CodecEquals(codec_info_aac, codec_info_aac_test));
501 
502   // Test two SBC codecs that are identical, but with different dummy
503   // trailer data.
504   memset(codec_info_sbc_test, 0xAB, sizeof(codec_info_sbc_test));
505   memcpy(codec_info_sbc_test, codec_info_sbc, sizeof(codec_info_sbc));
506   codec_info_sbc_test[7] = codec_info_sbc[7] + 1;
507   EXPECT_TRUE(A2DP_CodecEquals(codec_info_sbc, codec_info_sbc_test));
508 
509   // Test two AAC codecs that are identical, but with different dummy
510   // trailer data.
511   memset(codec_info_aac_test, 0xAB, sizeof(codec_info_aac_test));
512   memcpy(codec_info_aac_test, codec_info_aac, sizeof(codec_info_aac));
513   codec_info_aac_test[9] = codec_info_aac[9] + 1;
514   EXPECT_TRUE(A2DP_CodecEquals(codec_info_aac, codec_info_aac_test));
515 }
516 
TEST_F(StackA2dpTest,test_a2dp_get_track_sample_rate)517 TEST_F(StackA2dpTest, test_a2dp_get_track_sample_rate) {
518   EXPECT_EQ(A2DP_GetTrackSampleRate(codec_info_sbc), 44100);
519   EXPECT_EQ(A2DP_GetTrackSampleRate(codec_info_aac), 44100);
520   EXPECT_EQ(A2DP_GetTrackSampleRate(codec_info_non_a2dp), -1);
521 }
522 
TEST_F(StackA2dpTest,test_a2dp_get_track_channel_count)523 TEST_F(StackA2dpTest, test_a2dp_get_track_channel_count) {
524   EXPECT_EQ(A2DP_GetTrackChannelCount(codec_info_sbc), 2);
525   EXPECT_EQ(A2DP_GetTrackChannelCount(codec_info_aac), 2);
526   EXPECT_EQ(A2DP_GetTrackChannelCount(codec_info_non_a2dp), -1);
527 }
528 
TEST_F(StackA2dpTest,test_a2dp_get_number_of_subbands_sbc)529 TEST_F(StackA2dpTest, test_a2dp_get_number_of_subbands_sbc) {
530   EXPECT_EQ(A2DP_GetNumberOfSubbandsSbc(codec_info_sbc), 8);
531   EXPECT_EQ(A2DP_GetNumberOfSubbandsSbc(codec_info_aac), -1);
532   EXPECT_EQ(A2DP_GetNumberOfSubbandsSbc(codec_info_non_a2dp), -1);
533 }
534 
TEST_F(StackA2dpTest,test_a2dp_get_number_of_blocks_sbc)535 TEST_F(StackA2dpTest, test_a2dp_get_number_of_blocks_sbc) {
536   EXPECT_EQ(A2DP_GetNumberOfBlocksSbc(codec_info_sbc), 16);
537   EXPECT_EQ(A2DP_GetNumberOfBlocksSbc(codec_info_aac), -1);
538   EXPECT_EQ(A2DP_GetNumberOfBlocksSbc(codec_info_non_a2dp), -1);
539 }
540 
TEST_F(StackA2dpTest,test_a2dp_get_allocation_method_code_sbc)541 TEST_F(StackA2dpTest, test_a2dp_get_allocation_method_code_sbc) {
542   EXPECT_EQ(A2DP_GetAllocationMethodCodeSbc(codec_info_sbc), 0);
543   EXPECT_EQ(A2DP_GetAllocationMethodCodeSbc(codec_info_aac), -1);
544   EXPECT_EQ(A2DP_GetAllocationMethodCodeSbc(codec_info_non_a2dp), -1);
545 }
546 
TEST_F(StackA2dpTest,test_a2dp_get_channel_mode_code_sbc)547 TEST_F(StackA2dpTest, test_a2dp_get_channel_mode_code_sbc) {
548   EXPECT_EQ(A2DP_GetChannelModeCodeSbc(codec_info_sbc), 3);
549   EXPECT_EQ(A2DP_GetChannelModeCodeSbc(codec_info_aac), -1);
550   EXPECT_EQ(A2DP_GetChannelModeCodeSbc(codec_info_non_a2dp), -1);
551 }
552 
TEST_F(StackA2dpTest,test_a2dp_get_sampling_frequency_code_sbc)553 TEST_F(StackA2dpTest, test_a2dp_get_sampling_frequency_code_sbc) {
554   EXPECT_EQ(A2DP_GetSamplingFrequencyCodeSbc(codec_info_sbc), 2);
555   EXPECT_EQ(A2DP_GetSamplingFrequencyCodeSbc(codec_info_aac), -1);
556   EXPECT_EQ(A2DP_GetSamplingFrequencyCodeSbc(codec_info_non_a2dp), -1);
557 }
558 
TEST_F(StackA2dpTest,test_a2dp_get_min_bitpool_sbc)559 TEST_F(StackA2dpTest, test_a2dp_get_min_bitpool_sbc) {
560   EXPECT_EQ(A2DP_GetMinBitpoolSbc(codec_info_sbc), 2);
561   EXPECT_EQ(A2DP_GetMinBitpoolSbc(codec_info_sbc_capability), 2);
562   EXPECT_EQ(A2DP_GetMinBitpoolSbc(codec_info_sbc_sink_capability), 2);
563   EXPECT_EQ(A2DP_GetMinBitpoolSbc(codec_info_aac), -1);
564   EXPECT_EQ(A2DP_GetMinBitpoolSbc(codec_info_non_a2dp), -1);
565 }
566 
TEST_F(StackA2dpTest,test_a2dp_get_max_bitpool_sbc)567 TEST_F(StackA2dpTest, test_a2dp_get_max_bitpool_sbc) {
568   EXPECT_EQ(A2DP_GetMaxBitpoolSbc(codec_info_sbc), 53);
569   EXPECT_EQ(A2DP_GetMaxBitpoolSbc(codec_info_sbc_capability), 53);
570   EXPECT_EQ(A2DP_GetMaxBitpoolSbc(codec_info_sbc_sink_capability), 53);
571   EXPECT_EQ(A2DP_GetMaxBitpoolSbc(codec_info_aac), -1);
572   EXPECT_EQ(A2DP_GetMaxBitpoolSbc(codec_info_non_a2dp), -1);
573 }
574 
TEST_F(StackA2dpTest,test_a2dp_get_sink_track_channel_type)575 TEST_F(StackA2dpTest, test_a2dp_get_sink_track_channel_type) {
576   EXPECT_EQ(A2DP_GetSinkTrackChannelType(codec_info_sbc), 3);
577   EXPECT_EQ(A2DP_GetSinkTrackChannelType(codec_info_aac), 3);
578   EXPECT_EQ(A2DP_GetSinkTrackChannelType(codec_info_non_a2dp), -1);
579 }
580 
TEST_F(StackA2dpTest,test_a2dp_get_object_type_code_aac)581 TEST_F(StackA2dpTest, test_a2dp_get_object_type_code_aac) {
582   EXPECT_EQ(A2DP_GetObjectTypeCodeAac(codec_info_sbc), -1);
583   EXPECT_EQ(A2DP_GetObjectTypeCodeAac(codec_info_aac), 0x80);
584   EXPECT_EQ(A2DP_GetObjectTypeCodeAac(codec_info_non_a2dp), -1);
585 }
586 
TEST_F(StackA2dpTest,test_a2dp_get_channel_mode_code_aac)587 TEST_F(StackA2dpTest, test_a2dp_get_channel_mode_code_aac) {
588   EXPECT_EQ(A2DP_GetChannelModeCodeAac(codec_info_sbc), -1);
589   EXPECT_EQ(A2DP_GetChannelModeCodeAac(codec_info_aac), 0x04);
590   EXPECT_EQ(A2DP_GetChannelModeCodeAac(codec_info_non_a2dp), -1);
591 }
592 
TEST_F(StackA2dpTest,test_a2dp_get_variable_bit_rate_support_aac)593 TEST_F(StackA2dpTest, test_a2dp_get_variable_bit_rate_support_aac) {
594   EXPECT_EQ(A2DP_GetVariableBitRateSupportAac(codec_info_sbc), -1);
595   EXPECT_EQ(A2DP_GetVariableBitRateSupportAac(codec_info_aac), 0);
596   EXPECT_EQ(A2DP_GetVariableBitRateSupportAac(codec_info_non_a2dp), -1);
597 }
598 
TEST_F(StackA2dpTest,test_a2dp_get_bit_rate_aac)599 TEST_F(StackA2dpTest, test_a2dp_get_bit_rate_aac) {
600   EXPECT_EQ(A2DP_GetBitRateAac(codec_info_sbc), -1);
601   EXPECT_EQ(A2DP_GetBitRateAac(codec_info_aac), 320000);
602   EXPECT_EQ(A2DP_GetBitRateAac(codec_info_non_a2dp), -1);
603 }
604 
TEST_F(StackA2dpTest,test_a2dp_get_packet_timestamp)605 TEST_F(StackA2dpTest, test_a2dp_get_packet_timestamp) {
606   uint8_t a2dp_data[1000];
607   uint32_t timestamp;
608   uint32_t* p_ts = reinterpret_cast<uint32_t*>(a2dp_data);
609 
610   memset(a2dp_data, 0xAB, sizeof(a2dp_data));
611   *p_ts = 0x12345678;
612   timestamp = 0xFFFFFFFF;
613   EXPECT_TRUE(A2DP_GetPacketTimestamp(codec_info_sbc, a2dp_data, &timestamp));
614   EXPECT_EQ(timestamp, static_cast<uint32_t>(0x12345678));
615 
616   memset(a2dp_data, 0xAB, sizeof(a2dp_data));
617   *p_ts = 0x12345678;
618   timestamp = 0xFFFFFFFF;
619   EXPECT_TRUE(A2DP_GetPacketTimestamp(codec_info_aac, 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;
625   EXPECT_FALSE(
626       A2DP_GetPacketTimestamp(codec_info_non_a2dp, a2dp_data, &timestamp));
627 }
628 
TEST_F(StackA2dpTest,test_a2dp_build_codec_header)629 TEST_F(StackA2dpTest, test_a2dp_build_codec_header) {
630   uint8_t a2dp_data[1000];
631   BT_HDR* p_buf = reinterpret_cast<BT_HDR*>(a2dp_data);
632   const uint16_t BT_HDR_LEN = 500;
633   const uint16_t BT_HDR_OFFSET = 50;
634   const uint8_t FRAMES_PER_PACKET = 0xCD;
635 
636   memset(a2dp_data, 0xAB, sizeof(a2dp_data));
637   p_buf->len = BT_HDR_LEN;
638   p_buf->offset = BT_HDR_OFFSET;
639   EXPECT_TRUE(A2DP_BuildCodecHeader(codec_info_sbc, p_buf, FRAMES_PER_PACKET));
640   EXPECT_EQ(p_buf->offset + 1,
641             BT_HDR_OFFSET);               // Modified by A2DP_SBC_MPL_HDR_LEN
642   EXPECT_EQ(p_buf->len - 1, BT_HDR_LEN);  // Modified by A2DP_SBC_MPL_HDR_LEN
643   const uint8_t* p =
644       reinterpret_cast<const uint8_t*>(p_buf + 1) + p_buf->offset;
645   EXPECT_EQ(
646       *p, static_cast<uint8_t>(0x0D));  // 0xCD masked with A2DP_SBC_HDR_NUM_MSK
647 
648   memset(a2dp_data, 0xAB, sizeof(a2dp_data));
649   p_buf->len = BT_HDR_LEN;
650   p_buf->offset = BT_HDR_OFFSET;
651   EXPECT_TRUE(A2DP_BuildCodecHeader(codec_info_aac, p_buf, FRAMES_PER_PACKET));
652 
653   memset(a2dp_data, 0xAB, sizeof(a2dp_data));
654   p_buf->len = BT_HDR_LEN;
655   p_buf->offset = BT_HDR_OFFSET;
656   EXPECT_FALSE(
657       A2DP_BuildCodecHeader(codec_info_non_a2dp, p_buf, FRAMES_PER_PACKET));
658 }
659 
TEST_F(StackA2dpTest,test_a2dp_adjust_codec)660 TEST_F(StackA2dpTest, test_a2dp_adjust_codec) {
661   uint8_t codec_info_sbc_test[AVDT_CODEC_SIZE];
662   uint8_t codec_info_aac_test[AVDT_CODEC_SIZE];
663   uint8_t codec_info_non_a2dp_test[AVDT_CODEC_SIZE];
664 
665   // Test updating a valid SBC codec that doesn't need adjustment
666   memset(codec_info_sbc_test, 0xAB, sizeof(codec_info_sbc_test));
667   memcpy(codec_info_sbc_test, codec_info_sbc, sizeof(codec_info_sbc));
668   EXPECT_TRUE(A2DP_AdjustCodec(codec_info_sbc_test));
669   EXPECT_TRUE(
670       memcmp(codec_info_sbc_test, codec_info_sbc, sizeof(codec_info_sbc)) == 0);
671 
672   // Test updating a valid SBC codec that needs adjustment
673   memset(codec_info_sbc_test, 0xAB, sizeof(codec_info_sbc_test));
674   memcpy(codec_info_sbc_test, codec_info_sbc, sizeof(codec_info_sbc));
675   codec_info_sbc_test[6] = 54;  // A2DP_SBC_MAX_BITPOOL + 1
676   EXPECT_TRUE(A2DP_AdjustCodec(codec_info_sbc_test));
677   EXPECT_TRUE(
678       memcmp(codec_info_sbc_test, codec_info_sbc, sizeof(codec_info_sbc)) == 0);
679 
680   // Test updating an invalid SBC codec
681   memset(codec_info_sbc_test, 0xAB, sizeof(codec_info_sbc_test));
682   memcpy(codec_info_sbc_test, codec_info_sbc, sizeof(codec_info_sbc));
683   codec_info_sbc_test[6] = 255;  // Invalid MAX_BITPOOL
684   EXPECT_FALSE(A2DP_AdjustCodec(codec_info_sbc_test));
685 
686   // Test updating a valid AAC codec that doesn't need adjustment
687   memset(codec_info_aac_test, 0xAB, sizeof(codec_info_aac_test));
688   memcpy(codec_info_aac_test, codec_info_aac, sizeof(codec_info_aac));
689   EXPECT_TRUE(A2DP_AdjustCodec(codec_info_aac_test));
690   EXPECT_TRUE(
691       memcmp(codec_info_aac_test, codec_info_aac, sizeof(codec_info_aac)) == 0);
692 
693   // Test updating a non-A2DP codec that is not recognized
694   memset(codec_info_non_a2dp_test, 0xAB, sizeof(codec_info_non_a2dp_test));
695   memcpy(codec_info_non_a2dp_test, codec_info_non_a2dp,
696          sizeof(codec_info_non_a2dp));
697   EXPECT_FALSE(A2DP_AdjustCodec(codec_info_non_a2dp_test));
698 }
699 
TEST_F(StackA2dpTest,test_a2dp_source_codec_index)700 TEST_F(StackA2dpTest, test_a2dp_source_codec_index) {
701   // Explicit tests for known Source codecs
702   EXPECT_EQ(A2DP_SourceCodecIndex(codec_info_sbc),
703             BTAV_A2DP_CODEC_INDEX_SOURCE_SBC);
704   EXPECT_EQ(A2DP_SourceCodecIndex(codec_info_sbc_capability),
705             BTAV_A2DP_CODEC_INDEX_SOURCE_SBC);
706   EXPECT_EQ(A2DP_SourceCodecIndex(codec_info_sbc_sink_capability),
707             BTAV_A2DP_CODEC_INDEX_SOURCE_SBC);
708   EXPECT_EQ(A2DP_SourceCodecIndex(codec_info_aac),
709             BTAV_A2DP_CODEC_INDEX_SOURCE_AAC);
710   EXPECT_EQ(A2DP_SourceCodecIndex(codec_info_aac_capability),
711             BTAV_A2DP_CODEC_INDEX_SOURCE_AAC);
712   EXPECT_EQ(A2DP_SourceCodecIndex(codec_info_aac_sink_capability),
713             BTAV_A2DP_CODEC_INDEX_SOURCE_AAC);
714   EXPECT_EQ(A2DP_SourceCodecIndex(codec_info_non_a2dp),
715             BTAV_A2DP_CODEC_INDEX_MAX);
716 }
717 
TEST_F(StackA2dpTest,test_a2dp_sink_codec_index)718 TEST_F(StackA2dpTest, test_a2dp_sink_codec_index) {
719   // Explicit tests for known Sink codecs
720   EXPECT_EQ(A2DP_SinkCodecIndex(codec_info_sbc),
721             BTAV_A2DP_CODEC_INDEX_SINK_SBC);
722   EXPECT_EQ(A2DP_SinkCodecIndex(codec_info_sbc_capability),
723             BTAV_A2DP_CODEC_INDEX_SINK_SBC);
724   EXPECT_EQ(A2DP_SinkCodecIndex(codec_info_sbc_sink_capability),
725             BTAV_A2DP_CODEC_INDEX_SINK_SBC);
726   EXPECT_EQ(A2DP_SinkCodecIndex(codec_info_aac),
727             BTAV_A2DP_CODEC_INDEX_SINK_AAC);
728   EXPECT_EQ(A2DP_SinkCodecIndex(codec_info_aac_capability),
729             BTAV_A2DP_CODEC_INDEX_SINK_AAC);
730   EXPECT_EQ(A2DP_SinkCodecIndex(codec_info_aac_sink_capability),
731             BTAV_A2DP_CODEC_INDEX_SINK_AAC);
732   EXPECT_EQ(A2DP_SinkCodecIndex(codec_info_non_a2dp),
733             BTAV_A2DP_CODEC_INDEX_MAX);
734 }
735 
TEST_F(StackA2dpTest,test_a2dp_codec_index_str)736 TEST_F(StackA2dpTest, test_a2dp_codec_index_str) {
737   // Explicit tests for known codecs
738   EXPECT_STREQ(A2DP_CodecIndexStr(BTAV_A2DP_CODEC_INDEX_SOURCE_SBC), "SBC");
739   EXPECT_STREQ(A2DP_CodecIndexStr(BTAV_A2DP_CODEC_INDEX_SINK_SBC), "SBC SINK");
740   EXPECT_STREQ(A2DP_CodecIndexStr(BTAV_A2DP_CODEC_INDEX_SOURCE_AAC), "AAC");
741 
742   // Test that the unknown codec string has not changed
743   EXPECT_STREQ(A2DP_CodecIndexStr(BTAV_A2DP_CODEC_INDEX_MAX),
744                "UNKNOWN CODEC INDEX");
745 
746   // Test that each codec has a known string
747   for (int i = BTAV_A2DP_CODEC_INDEX_MIN; i < BTAV_A2DP_CODEC_INDEX_MAX; i++) {
748     btav_a2dp_codec_index_t codec_index =
749         static_cast<btav_a2dp_codec_index_t>(i);
750     EXPECT_STRNE(A2DP_CodecIndexStr(codec_index), "UNKNOWN CODEC INDEX");
751   }
752 }
753 
TEST_F(StackA2dpTest,test_a2dp_init_codec_config)754 TEST_F(StackA2dpTest, test_a2dp_init_codec_config) {
755   AvdtpSepConfig avdt_cfg;
756 
757   //
758   // Test for SBC Source
759   //
760   memset(&avdt_cfg, 0, sizeof(avdt_cfg));
761   EXPECT_TRUE(
762       A2DP_InitCodecConfig(BTAV_A2DP_CODEC_INDEX_SOURCE_SBC, &avdt_cfg));
763   // Compare the result codec with the local test codec info
764   for (size_t i = 0; i < codec_info_sbc_capability[0] + 1; i++) {
765     EXPECT_EQ(avdt_cfg.codec_info[i], codec_info_sbc_capability[i]);
766   }
767 // Test for content protection
768 #if (BTA_AV_CO_CP_SCMS_T == TRUE)
769   EXPECT_EQ(avdt_cfg.protect_info[0], AVDT_CP_LOSC);
770   EXPECT_EQ(avdt_cfg.protect_info[1], (AVDT_CP_SCMS_T_ID & 0xFF));
771   EXPECT_EQ(avdt_cfg.protect_info[2], ((AVDT_CP_SCMS_T_ID >> 8) & 0xFF));
772   EXPECT_EQ(avdt_cfg.num_protect, 1);
773 #endif
774 
775   //
776   // Test for SBC Sink
777   //
778   memset(&avdt_cfg, 0, sizeof(avdt_cfg));
779   EXPECT_TRUE(A2DP_InitCodecConfig(BTAV_A2DP_CODEC_INDEX_SINK_SBC, &avdt_cfg));
780   // Compare the result codec with the local test codec info
781   for (size_t i = 0; i < codec_info_sbc_sink_capability[0] + 1; i++) {
782     EXPECT_EQ(avdt_cfg.codec_info[i], codec_info_sbc_sink_capability[i]);
783   }
784 
785   //
786   // Test for AAC Source
787   //
788   memset(&avdt_cfg, 0, sizeof(avdt_cfg));
789   EXPECT_TRUE(
790       A2DP_InitCodecConfig(BTAV_A2DP_CODEC_INDEX_SOURCE_AAC, &avdt_cfg));
791   // Compare the result codec with the local test codec info
792   for (size_t i = 0; i < codec_info_aac_capability[0] + 1; i++) {
793     EXPECT_EQ(avdt_cfg.codec_info[i], codec_info_aac_capability[i]);
794   }
795 // Test for content protection
796 #if (BTA_AV_CO_CP_SCMS_T == TRUE)
797   EXPECT_EQ(avdt_cfg.protect_info[0], AVDT_CP_LOSC);
798   EXPECT_EQ(avdt_cfg.protect_info[1], (AVDT_CP_SCMS_T_ID & 0xFF));
799   EXPECT_EQ(avdt_cfg.protect_info[2], ((AVDT_CP_SCMS_T_ID >> 8) & 0xFF));
800   EXPECT_EQ(avdt_cfg.num_protect, 1);
801 #endif
802 }
803 
TEST_F(A2dpCodecConfigTest,createCodec)804 TEST_F(A2dpCodecConfigTest, createCodec) {
805   for (int i = BTAV_A2DP_CODEC_INDEX_MIN; i < BTAV_A2DP_CODEC_INDEX_MAX; i++) {
806     btav_a2dp_codec_index_t codec_index =
807         static_cast<btav_a2dp_codec_index_t>(i);
808 
809     // Ignore codecs that are not supported on the device
810     if (!has_codec_support(codec_index)) {
811       continue;
812     }
813 
814     A2dpCodecConfig* codec_config = A2dpCodecConfig::createCodec(codec_index);
815     EXPECT_NE(codec_config, nullptr);
816     EXPECT_EQ(codec_config->codecIndex(), codec_index);
817     EXPECT_FALSE(codec_config->name().empty());
818     EXPECT_NE(codec_config->codecPriority(), BTAV_A2DP_CODEC_PRIORITY_DISABLED);
819     EXPECT_NE(codec_config->codecPriority(), BTAV_A2DP_CODEC_PRIORITY_DEFAULT);
820     delete codec_config;
821   }
822 }
823 
TEST_F(A2dpCodecConfigTest,setCodecConfig)824 TEST_F(A2dpCodecConfigTest, setCodecConfig) {
825   uint8_t codec_info_result[AVDT_CODEC_SIZE];
826   btav_a2dp_codec_index_t peer_codec_index;
827   A2dpCodecs* a2dp_codecs =
828       new A2dpCodecs(std::vector<btav_a2dp_codec_config_t>());
829   A2dpCodecConfig* codec_config;
830 
831   EXPECT_TRUE(a2dp_codecs->init());
832 
833   // Create the codec capability - SBC
834   memset(codec_info_result, 0, sizeof(codec_info_result));
835   peer_codec_index = A2DP_SourceCodecIndex(codec_info_sbc_sink_capability);
836   EXPECT_NE(peer_codec_index, BTAV_A2DP_CODEC_INDEX_MAX);
837   codec_config =
838       a2dp_codecs->findSourceCodecConfig(codec_info_sbc_sink_capability);
839   EXPECT_NE(codec_config, nullptr);
840   EXPECT_TRUE(a2dp_codecs->setCodecConfig(
841       codec_info_sbc_sink_capability, true /* is_capability */,
842       codec_info_result, true /* select_current_codec */));
843   EXPECT_EQ(a2dp_codecs->getCurrentCodecConfig(), codec_config);
844   // Compare the result codec with the local test codec info
845   for (size_t i = 0; i < codec_info_sbc[0] + 1; i++) {
846     EXPECT_EQ(codec_info_result[i], codec_info_sbc[i]);
847   }
848   EXPECT_EQ(codec_config->getAudioBitsPerSample(), 16);
849 
850   // Create the codec capability - AAC
851   memset(codec_info_result, 0, sizeof(codec_info_result));
852   peer_codec_index = A2DP_SourceCodecIndex(codec_info_aac_sink_capability);
853   EXPECT_NE(peer_codec_index, BTAV_A2DP_CODEC_INDEX_MAX);
854   codec_config =
855       a2dp_codecs->findSourceCodecConfig(codec_info_aac_sink_capability);
856   EXPECT_NE(codec_config, nullptr);
857   EXPECT_TRUE(a2dp_codecs->setCodecConfig(
858       codec_info_aac_sink_capability, true /* is_capability */,
859       codec_info_result, true /* select_current_codec */));
860   EXPECT_EQ(a2dp_codecs->getCurrentCodecConfig(), codec_config);
861   // Compare the result codec with the local test codec info
862   for (size_t i = 0; i < codec_info_aac[0] + 1; i++) {
863     EXPECT_EQ(codec_info_result[i], codec_info_aac[i]);
864   }
865   EXPECT_EQ(codec_config->getAudioBitsPerSample(), 16);
866 
867   // Create the codec config - SBC
868   memset(codec_info_result, 0, sizeof(codec_info_result));
869   peer_codec_index = A2DP_SourceCodecIndex(codec_info_sbc);
870   EXPECT_NE(peer_codec_index, BTAV_A2DP_CODEC_INDEX_MAX);
871   codec_config = a2dp_codecs->findSourceCodecConfig(codec_info_sbc);
872   EXPECT_NE(codec_config, nullptr);
873   EXPECT_TRUE(a2dp_codecs->setCodecConfig(
874       codec_info_sbc, false /* is_capability */, codec_info_result,
875       true /* select_current_codec */));
876   EXPECT_EQ(a2dp_codecs->getCurrentCodecConfig(), codec_config);
877   // Compare the result codec with the local test codec info
878   for (size_t i = 0; i < codec_info_sbc[0] + 1; i++) {
879     EXPECT_EQ(codec_info_result[i], codec_info_sbc[i]);
880   }
881   EXPECT_FALSE(codec_config->useRtpHeaderMarkerBit());
882 
883   // Create the codec config - AAC
884   memset(codec_info_result, 0, sizeof(codec_info_result));
885   peer_codec_index = A2DP_SourceCodecIndex(codec_info_aac);
886   EXPECT_NE(peer_codec_index, BTAV_A2DP_CODEC_INDEX_MAX);
887   codec_config = a2dp_codecs->findSourceCodecConfig(codec_info_aac);
888   EXPECT_NE(codec_config, nullptr);
889   EXPECT_TRUE(a2dp_codecs->setCodecConfig(
890       codec_info_aac, false /* is_capability */, codec_info_result,
891       true /* select_current_codec */));
892   EXPECT_EQ(a2dp_codecs->getCurrentCodecConfig(), codec_config);
893   // Compare the result codec with the local test codec info
894   for (size_t i = 0; i < codec_info_aac[0] + 1; i++) {
895     EXPECT_EQ(codec_info_result[i], codec_info_aac[i]);
896   }
897   EXPECT_TRUE(codec_config->useRtpHeaderMarkerBit());
898 
899   // Create the codec capability - SBC Sink
900   memset(codec_info_result, 0, sizeof(codec_info_result));
901   peer_codec_index = A2DP_SinkCodecIndex(codec_info_sbc_capability);
902   EXPECT_NE(peer_codec_index, BTAV_A2DP_CODEC_INDEX_MAX);
903   codec_config = a2dp_codecs->findSinkCodecConfig(codec_info_sbc_capability);
904   EXPECT_NE(codec_config, nullptr);
905   EXPECT_TRUE(a2dp_codecs->setSinkCodecConfig(
906       codec_info_sbc_capability, true /* is_capability */, codec_info_result,
907       true /* select_current_codec */));
908   EXPECT_EQ(a2dp_codecs->getCurrentCodecConfig(), codec_config);
909   // Compare the result codec with the local test codec info
910   for (size_t i = 0; i < codec_info_sbc[0] + 1; i++) {
911     EXPECT_EQ(codec_info_result[i], codec_info_sbc[i]);
912   }
913   EXPECT_EQ(codec_config->getAudioBitsPerSample(), 16);
914 
915   // Create the codec capability - AAC Sink
916   memset(codec_info_result, 0, sizeof(codec_info_result));
917   peer_codec_index = A2DP_SinkCodecIndex(codec_info_aac_capability);
918   EXPECT_NE(peer_codec_index, BTAV_A2DP_CODEC_INDEX_MAX);
919   codec_config = a2dp_codecs->findSinkCodecConfig(codec_info_aac_capability);
920   EXPECT_NE(codec_config, nullptr);
921   EXPECT_TRUE(a2dp_codecs->setSinkCodecConfig(
922       codec_info_aac_capability, true /* is_capability */, codec_info_result,
923       true /* select_current_codec */));
924   EXPECT_EQ(a2dp_codecs->getCurrentCodecConfig(), codec_config);
925   // Compare the result codec with the local test codec info
926   for (size_t i = 0; i < codec_info_aac[0] + 1; i++) {
927     EXPECT_EQ(codec_info_result[i], codec_info_aac[i]);
928   }
929   EXPECT_EQ(codec_config->getAudioBitsPerSample(), 16);
930 
931   // Create the codec config - SBC Sink
932   memset(codec_info_result, 0, sizeof(codec_info_result));
933   peer_codec_index = A2DP_SinkCodecIndex(codec_info_sbc);
934   EXPECT_NE(peer_codec_index, BTAV_A2DP_CODEC_INDEX_MAX);
935   codec_config = a2dp_codecs->findSinkCodecConfig(codec_info_sbc);
936   EXPECT_NE(codec_config, nullptr);
937   EXPECT_TRUE(a2dp_codecs->setSinkCodecConfig(
938       codec_info_sbc, false /* is_capability */, codec_info_result,
939       true /* select_current_codec */));
940   EXPECT_EQ(a2dp_codecs->getCurrentCodecConfig(), codec_config);
941   // Compare the result codec with the local test codec info
942   for (size_t i = 0; i < codec_info_sbc[0] + 1; i++) {
943     EXPECT_EQ(codec_info_result[i], codec_info_sbc[i]);
944   }
945   EXPECT_EQ(codec_config->getAudioBitsPerSample(), 16);
946 
947   // Create the codec config - AAC Sink
948   memset(codec_info_result, 0, sizeof(codec_info_result));
949   peer_codec_index = A2DP_SinkCodecIndex(codec_info_aac);
950   EXPECT_NE(peer_codec_index, BTAV_A2DP_CODEC_INDEX_MAX);
951   codec_config = a2dp_codecs->findSinkCodecConfig(codec_info_aac);
952   EXPECT_NE(codec_config, nullptr);
953   EXPECT_TRUE(a2dp_codecs->setSinkCodecConfig(
954       codec_info_aac, false /* is_capability */, codec_info_result,
955       true /* select_current_codec */));
956   EXPECT_EQ(a2dp_codecs->getCurrentCodecConfig(), codec_config);
957   // Compare the result codec with the local test codec info
958   for (size_t i = 0; i < codec_info_aac[0] + 1; i++) {
959     EXPECT_EQ(codec_info_result[i], codec_info_aac[i]);
960   }
961   EXPECT_EQ(codec_config->getAudioBitsPerSample(), 16);
962 
963   // Test invalid codec info
964   uint8_t codec_info_sbc_test1[AVDT_CODEC_SIZE];
965   memset(codec_info_result, 0, sizeof(codec_info_result));
966   memset(codec_info_sbc_test1, 0, sizeof(codec_info_sbc_test1));
967   EXPECT_FALSE(a2dp_codecs->setCodecConfig(
968       codec_info_sbc_test1, true /* is_capability */, codec_info_result,
969       true /* select_current_codec */));
970   delete a2dp_codecs;
971 }
972 
TEST_F(A2dpCodecConfigTest,init)973 TEST_F(A2dpCodecConfigTest, init) {
974   std::vector<btav_a2dp_codec_config_t> default_priorities;
975   A2dpCodecs codecs(default_priorities);
976 
977   EXPECT_TRUE(codecs.init());
978 
979   const std::list<A2dpCodecConfig*> orderedSourceCodecs =
980       codecs.orderedSourceCodecs();
981   EXPECT_FALSE(orderedSourceCodecs.empty());
982 
983   const std::list<A2dpCodecConfig*> orderedSinkCodecs =
984       codecs.orderedSinkCodecs();
985   EXPECT_FALSE(orderedSinkCodecs.empty());
986 }
987