diff --git a/test/Makefile b/test/Makefile index 8ecef8ae6..744aaef8d 100644 --- a/test/Makefile +++ b/test/Makefile @@ -4,6 +4,7 @@ SUBDIRS = \ att_db \ avdtp \ + avdtp_util \ avrcp \ base64 \ ble_client \ diff --git a/test/avdtp_util/.gitignore b/test/avdtp_util/.gitignore new file mode 100644 index 000000000..6348b65bc --- /dev/null +++ b/test/avdtp_util/.gitignore @@ -0,0 +1 @@ +avdtp_util_test diff --git a/test/avdtp_util/Makefile b/test/avdtp_util/Makefile new file mode 100644 index 000000000..80606a9e7 --- /dev/null +++ b/test/avdtp_util/Makefile @@ -0,0 +1,41 @@ +CC = g++ + +# Requirements: cpputest.github.io + +BTSTACK_ROOT = ../.. + +CFLAGS = -g -Wall \ + -I.. \ + -I${BTSTACK_ROOT}/src + +CFLAGS += -fprofile-arcs -ftest-coverage + +LDFLAGS += -lCppUTest -lCppUTestExt + +VPATH += ${BTSTACK_ROOT}/src +VPATH += ${BTSTACK_ROOT}/src/classic +VPATH += ${BTSTACK_ROOT}/platform/posix + +COMMON = \ + btstack_util.c \ + btstack_linked_list.c \ + hci_dump.c \ + avdtp_util.c \ + +COMMON_OBJ = $(COMMON:.c=.o) + +all: avdtp_util_test + +avdtp_util_test: ${COMMON_OBJ} avdtp_util_test.o + ${CC} $^ ${CFLAGS} ${LDFLAGS} -o $@ + +test: all + rm -f *.gcda + ./avdtp_util_test + +clean: + rm -f avdtp_util_test + rm -f *.o + rm -rf *.dSYM + rm -f *.gcno *.gcda + diff --git a/test/avdtp_util/avdtp_util_test.c b/test/avdtp_util/avdtp_util_test.c new file mode 100644 index 000000000..9ec737290 --- /dev/null +++ b/test/avdtp_util/avdtp_util_test.c @@ -0,0 +1,115 @@ +/* + * Copyright (C) 2014 BlueKitchen GmbH + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the names of + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * 4. Any redistribution, use, or modification is done solely for + * personal benefit and not for any commercial purpose or for + * monetary gain. + * + * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS + * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF + * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * Please inquire about commercial licensing options at + * contact@bluekitchen-gmbh.com + * + */ + +// ***************************************************************************** +// +// test rfcomm query tests +// +// ***************************************************************************** + + +#include +#include +#include +#include + +#include "CppUTest/TestHarness.h" +#include "CppUTest/CommandLineTestRunner.h" + +#include "classic/avdtp_util.h" +#include "btstack.h" +#include "classic/avdtp.h" +#include "classic/avdtp_util.h" + + +// mock start +extern "C" uint16_t l2cap_get_remote_mtu_for_local_cid(uint16_t local_cid){ + return 1024; +} +extern "C" void l2cap_request_can_send_now_event(uint16_t local_cid){} +// mock end + +static avdtp_connection_t connection; +static avdtp_capabilities_t caps; + +TEST_GROUP(AvdtpUtil){ + void setup(void){ + connection.signaling_packet.signal_identifier = AVDTP_SI_GET_CONFIGURATION; + } +}; + +// typedef enum { +// AVDTP_SERVICE_CATEGORY_INVALID_0 = 0x00, +// AVDTP_MEDIA_TRANSPORT = 0X01, +// AVDTP_REPORTING, +// AVDTP_RECOVERY, +// AVDTP_CONTENT_PROTECTION, //4 +// AVDTP_HEADER_COMPRESSION, //5 +// AVDTP_MULTIPLEXING, //6 +// AVDTP_MEDIA_CODEC, //7 +// AVDTP_DELAY_REPORTING, //8 +// AVDTP_SERVICE_CATEGORY_INVALID_FF = 0xFF +// } avdtp_service_category_t; + +TEST(AvdtpUtil, avdtp_unpack_service_capabilities_test){ + uint8_t packet[] = { + 0x01, 0x00, + 0x07, 0x06, 0x00, 0x00, 0xff, 0xff, 0x02, 0x35, + 0x08, 0x00 + }; + uint8_t expected_sbc_codec_capabilities[] = { + 0xFF, // (AVDTP_SBC_44100 << 4) | AVDTP_SBC_STEREO, + 0xFF, //(AVDTP_SBC_BLOCK_LENGTH_16 << 4) | (AVDTP_SBC_SUBBANDS_8 << 2) | AVDTP_SBC_ALLOCATION_METHOD_LOUDNESS, + 2, 53 + }; + + uint16_t expected_categories = (1 << AVDTP_MEDIA_TRANSPORT) | (1 << AVDTP_MEDIA_CODEC) | (1 << AVDTP_DELAY_REPORTING); + CHECK_EQUAL(expected_categories, avdtp_unpack_service_capabilities(&connection, &caps, &packet[0], sizeof(packet))); + + // media codec: + CHECK_EQUAL(AVDTP_CODEC_SBC, caps.media_codec.media_codec_type); + CHECK_EQUAL(4, caps.media_codec.media_codec_information_len); + int i; + for (i = 0; i < caps.media_codec.media_codec_information_len; i++){ + CHECK_EQUAL(expected_sbc_codec_capabilities[i], caps.media_codec.media_codec_information[i]); + } +} + + +int main (int argc, const char * argv[]){ + return CommandLineTestRunner::RunAllTests(argc, argv); +}