11d3bd1e5SMatthias Ringwald /*
21d3bd1e5SMatthias Ringwald * Copyright (C) 2014 BlueKitchen GmbH
31d3bd1e5SMatthias Ringwald *
41d3bd1e5SMatthias Ringwald * Redistribution and use in source and binary forms, with or without
51d3bd1e5SMatthias Ringwald * modification, are permitted provided that the following conditions
61d3bd1e5SMatthias Ringwald * are met:
71d3bd1e5SMatthias Ringwald *
81d3bd1e5SMatthias Ringwald * 1. Redistributions of source code must retain the above copyright
91d3bd1e5SMatthias Ringwald * notice, this list of conditions and the following disclaimer.
101d3bd1e5SMatthias Ringwald * 2. Redistributions in binary form must reproduce the above copyright
111d3bd1e5SMatthias Ringwald * notice, this list of conditions and the following disclaimer in the
121d3bd1e5SMatthias Ringwald * documentation and/or other materials provided with the distribution.
131d3bd1e5SMatthias Ringwald * 3. Neither the name of the copyright holders nor the names of
141d3bd1e5SMatthias Ringwald * contributors may be used to endorse or promote products derived
151d3bd1e5SMatthias Ringwald * from this software without specific prior written permission.
161d3bd1e5SMatthias Ringwald * 4. Any redistribution, use, or modification is done solely for
171d3bd1e5SMatthias Ringwald * personal benefit and not for any commercial purpose or for
181d3bd1e5SMatthias Ringwald * monetary gain.
191d3bd1e5SMatthias Ringwald *
201d3bd1e5SMatthias Ringwald * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS
211d3bd1e5SMatthias Ringwald * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
221d3bd1e5SMatthias Ringwald * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
231d3bd1e5SMatthias Ringwald * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS
241d3bd1e5SMatthias Ringwald * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
251d3bd1e5SMatthias Ringwald * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
261d3bd1e5SMatthias Ringwald * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
271d3bd1e5SMatthias Ringwald * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
281d3bd1e5SMatthias Ringwald * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
291d3bd1e5SMatthias Ringwald * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
301d3bd1e5SMatthias Ringwald * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
311d3bd1e5SMatthias Ringwald * SUCH DAMAGE.
321d3bd1e5SMatthias Ringwald *
331d3bd1e5SMatthias Ringwald * Please inquire about commercial licensing options at
341d3bd1e5SMatthias Ringwald * [email protected]
351d3bd1e5SMatthias Ringwald *
361d3bd1e5SMatthias Ringwald */
371d3bd1e5SMatthias Ringwald
381d3bd1e5SMatthias Ringwald // *****************************************************************************
391d3bd1e5SMatthias Ringwald //
401d3bd1e5SMatthias Ringwald // test calculation of sdp records created by various profiles
411d3bd1e5SMatthias Ringwald //
421d3bd1e5SMatthias Ringwald // *****************************************************************************
431d3bd1e5SMatthias Ringwald
441d3bd1e5SMatthias Ringwald
451d3bd1e5SMatthias Ringwald #include <stdint.h>
461d3bd1e5SMatthias Ringwald #include <stdio.h>
471d3bd1e5SMatthias Ringwald #include <stdlib.h>
481d3bd1e5SMatthias Ringwald #include <string.h>
491d3bd1e5SMatthias Ringwald
501d3bd1e5SMatthias Ringwald #include "CppUTest/TestHarness.h"
511d3bd1e5SMatthias Ringwald #include "CppUTest/CommandLineTestRunner.h"
521d3bd1e5SMatthias Ringwald
531d3bd1e5SMatthias Ringwald #include "classic/avrcp_controller.h"
541d3bd1e5SMatthias Ringwald
551d3bd1e5SMatthias Ringwald #include "btstack_util.h"
561d3bd1e5SMatthias Ringwald #include "bluetooth.h"
571d3bd1e5SMatthias Ringwald
581d3bd1e5SMatthias Ringwald #include "classic/device_id_server.h"
591d3bd1e5SMatthias Ringwald #include "classic/avrcp_target.h"
601d3bd1e5SMatthias Ringwald #include "classic/a2dp_source.h"
611d3bd1e5SMatthias Ringwald #include "classic/a2dp_sink.h"
621d3bd1e5SMatthias Ringwald #include "classic/hsp_hs.h"
631d3bd1e5SMatthias Ringwald #include "classic/hsp_ag.h"
641d3bd1e5SMatthias Ringwald #include "classic/hfp_hf.h"
651d3bd1e5SMatthias Ringwald #include "classic/hfp_ag.h"
661d3bd1e5SMatthias Ringwald #include "classic/hid_device.h"
671d3bd1e5SMatthias Ringwald #include "classic/pan.h"
681d3bd1e5SMatthias Ringwald #include "classic/spp_server.h"
691d3bd1e5SMatthias Ringwald #include "classic/sdp_util.h"
701d3bd1e5SMatthias Ringwald
711d3bd1e5SMatthias Ringwald static uint8_t service_buffer[300];
721d3bd1e5SMatthias Ringwald static const char * test_string = "test";
731d3bd1e5SMatthias Ringwald static const uint16_t uint16_list_empty[] = { 0 };
741d3bd1e5SMatthias Ringwald static const uint16_t uint16_list_single_element[] = { 0x1234, 0 };
751d3bd1e5SMatthias Ringwald
TEST_GROUP(SDPRecordBuilder)761d3bd1e5SMatthias Ringwald TEST_GROUP(SDPRecordBuilder){
771d3bd1e5SMatthias Ringwald void setup(void){
781d3bd1e5SMatthias Ringwald memset(service_buffer, 0, sizeof(service_buffer));
791d3bd1e5SMatthias Ringwald }
801d3bd1e5SMatthias Ringwald };
811d3bd1e5SMatthias Ringwald
821d3bd1e5SMatthias Ringwald // a2dp sink
831d3bd1e5SMatthias Ringwald
841d3bd1e5SMatthias Ringwald static const char * default_a2dp_sink_service_name = "BTstack A2DP Sink Service";
851d3bd1e5SMatthias Ringwald static const char * default_a2dp_sink_service_provider_name = "BTstack A2DP Sink Service Provider";
861d3bd1e5SMatthias Ringwald
871d3bd1e5SMatthias Ringwald #define A2DP_SINK_RECORD_SIZE_MIN 84
881d3bd1e5SMatthias Ringwald
a2dp_sink_record_size(const char * service_name,const char * service_provider_name)891d3bd1e5SMatthias Ringwald static uint16_t a2dp_sink_record_size(const char * service_name, const char * service_provider_name){
901d3bd1e5SMatthias Ringwald int service_name_len = service_name ? strlen(service_name) : strlen(default_a2dp_sink_service_name);
911d3bd1e5SMatthias Ringwald int service_provider_name_len = service_provider_name ? strlen(service_provider_name) : strlen(default_a2dp_sink_service_provider_name);
921d3bd1e5SMatthias Ringwald return A2DP_SINK_RECORD_SIZE_MIN + service_name_len + service_provider_name_len;
931d3bd1e5SMatthias Ringwald }
941d3bd1e5SMatthias Ringwald
TEST(SDPRecordBuilder,A2DP_SINK)951d3bd1e5SMatthias Ringwald TEST(SDPRecordBuilder, A2DP_SINK){
961d3bd1e5SMatthias Ringwald const char * service_name;
971d3bd1e5SMatthias Ringwald const char * service_provider_name;
981d3bd1e5SMatthias Ringwald int expected_len;
991d3bd1e5SMatthias Ringwald
100*44718ae7SMatthias Ringwald service_name = ".";
101*44718ae7SMatthias Ringwald service_provider_name = ".";
1021d3bd1e5SMatthias Ringwald expected_len = a2dp_sink_record_size(service_name, service_provider_name);
1031d3bd1e5SMatthias Ringwald a2dp_sink_create_sdp_record(service_buffer, 0, 0, service_name, service_provider_name);
1041d3bd1e5SMatthias Ringwald CHECK_EQUAL(de_get_len(service_buffer), expected_len);
1051d3bd1e5SMatthias Ringwald }
1061d3bd1e5SMatthias Ringwald
1071d3bd1e5SMatthias Ringwald // a2dp source
1081d3bd1e5SMatthias Ringwald
1091d3bd1e5SMatthias Ringwald static const char * default_a2dp_source_service_name = "BTstack A2DP Source Service";
1101d3bd1e5SMatthias Ringwald static const char * default_a2dp_source_service_provider_name = "BTstack A2DP Source Service Provider";
1111d3bd1e5SMatthias Ringwald
1121d3bd1e5SMatthias Ringwald #define A2DP_SOURCE_RECORD_SIZE_MIN 84
1131d3bd1e5SMatthias Ringwald
a2dp_source_record_size(const char * service_name,const char * service_provider_name)1141d3bd1e5SMatthias Ringwald static uint16_t a2dp_source_record_size(const char * service_name, const char * service_provider_name){
1151d3bd1e5SMatthias Ringwald int service_name_len = service_name ? strlen(service_name) : strlen(default_a2dp_source_service_name);
1161d3bd1e5SMatthias Ringwald int service_provider_name_len = service_provider_name ? strlen(service_provider_name) : strlen(default_a2dp_source_service_provider_name);
1171d3bd1e5SMatthias Ringwald return A2DP_SOURCE_RECORD_SIZE_MIN + service_name_len + service_provider_name_len;
1181d3bd1e5SMatthias Ringwald }
1191d3bd1e5SMatthias Ringwald
TEST(SDPRecordBuilder,A2DP_SOURCE)1201d3bd1e5SMatthias Ringwald TEST(SDPRecordBuilder, A2DP_SOURCE){
1211d3bd1e5SMatthias Ringwald const char * service_name;
1221d3bd1e5SMatthias Ringwald const char * service_provider_name;
1231d3bd1e5SMatthias Ringwald int expected_len;
1241d3bd1e5SMatthias Ringwald
125*44718ae7SMatthias Ringwald service_name = ".";
126*44718ae7SMatthias Ringwald service_provider_name = ".";
1271d3bd1e5SMatthias Ringwald expected_len = a2dp_source_record_size(service_name, service_provider_name);
1281d3bd1e5SMatthias Ringwald a2dp_source_create_sdp_record(service_buffer, 0, 0, service_name, service_provider_name);
1291d3bd1e5SMatthias Ringwald CHECK_EQUAL(de_get_len(service_buffer), expected_len);
1301d3bd1e5SMatthias Ringwald }
1311d3bd1e5SMatthias Ringwald
1321d3bd1e5SMatthias Ringwald //
1331d3bd1e5SMatthias Ringwald // avcrp target
1341d3bd1e5SMatthias Ringwald //
1351d3bd1e5SMatthias Ringwald
1361d3bd1e5SMatthias Ringwald static const char * default_avrcp_target_service_name = "BTstack AVRCP Target Service";
1371d3bd1e5SMatthias Ringwald static const char * default_avrcp_target_service_provider_name = "BTstack AVRCP Target Service Provider";
1381d3bd1e5SMatthias Ringwald
1391d3bd1e5SMatthias Ringwald #define AVRCP_TARGET_RECORD_SIZE_MIN 84
1401d3bd1e5SMatthias Ringwald
avrcp_target_record_size(const char * service_name,const char * service_provider_name)1411d3bd1e5SMatthias Ringwald static uint16_t avrcp_target_record_size(const char * service_name, const char * service_provider_name){
1421d3bd1e5SMatthias Ringwald int service_name_len = service_name ? strlen(service_name) : strlen(default_avrcp_target_service_name);
1431d3bd1e5SMatthias Ringwald int service_provider_name_len = service_provider_name ? strlen(service_provider_name) : strlen(default_avrcp_target_service_provider_name);
1441d3bd1e5SMatthias Ringwald return AVRCP_TARGET_RECORD_SIZE_MIN + service_name_len + service_provider_name_len;
1451d3bd1e5SMatthias Ringwald }
1461d3bd1e5SMatthias Ringwald
TEST(SDPRecordBuilder,AVRCP_TARGET)1471d3bd1e5SMatthias Ringwald TEST(SDPRecordBuilder, AVRCP_TARGET){
1481d3bd1e5SMatthias Ringwald const char * service_name;
1491d3bd1e5SMatthias Ringwald const char * service_provider_name;
1501d3bd1e5SMatthias Ringwald int expected_len;
1511d3bd1e5SMatthias Ringwald int descriptor_size;
1521d3bd1e5SMatthias Ringwald
153*44718ae7SMatthias Ringwald service_name = ".";
154*44718ae7SMatthias Ringwald service_provider_name = ".";
1551d3bd1e5SMatthias Ringwald descriptor_size = 0;
1561d3bd1e5SMatthias Ringwald expected_len = avrcp_target_record_size(service_name, service_provider_name);
1571d3bd1e5SMatthias Ringwald avrcp_target_create_sdp_record(service_buffer, 0, 0, service_name, service_provider_name);
1581d3bd1e5SMatthias Ringwald CHECK_EQUAL(de_get_len(service_buffer), expected_len);
1591d3bd1e5SMatthias Ringwald }
1601d3bd1e5SMatthias Ringwald
1611d3bd1e5SMatthias Ringwald //
1621d3bd1e5SMatthias Ringwald // avrcp controller
1631d3bd1e5SMatthias Ringwald //
1641d3bd1e5SMatthias Ringwald
1651d3bd1e5SMatthias Ringwald static const char * default_avrcp_controller_service_name = "BTstack AVRCP Controller Service";
1661d3bd1e5SMatthias Ringwald static const char * default_avrcp_controller_service_provider_name = "BTstack AVRCP Controller Service Provider";
1671d3bd1e5SMatthias Ringwald
1681d3bd1e5SMatthias Ringwald #define AVRCP_CONTROLLER_RECORD_SIZE_MIN 87
1691d3bd1e5SMatthias Ringwald
avrcp_controller_record_size(const char * service_name,const char * service_provider_name)1701d3bd1e5SMatthias Ringwald static uint16_t avrcp_controller_record_size(const char * service_name, const char * service_provider_name){
1711d3bd1e5SMatthias Ringwald int service_name_len = service_name ? strlen(service_name) : strlen(default_avrcp_controller_service_name);
1721d3bd1e5SMatthias Ringwald int service_provider_name_len = service_provider_name ? strlen(service_provider_name) : strlen(default_avrcp_controller_service_provider_name);
1731d3bd1e5SMatthias Ringwald return AVRCP_CONTROLLER_RECORD_SIZE_MIN + service_name_len + service_provider_name_len;
1741d3bd1e5SMatthias Ringwald }
1751d3bd1e5SMatthias Ringwald
TEST(SDPRecordBuilder,AVRCP_CONTROLLER)1761d3bd1e5SMatthias Ringwald TEST(SDPRecordBuilder, AVRCP_CONTROLLER){
1771d3bd1e5SMatthias Ringwald const char * service_name;
1781d3bd1e5SMatthias Ringwald const char * service_provider_name;
1791d3bd1e5SMatthias Ringwald int expected_len;
1801d3bd1e5SMatthias Ringwald int descriptor_size;
1811d3bd1e5SMatthias Ringwald
182*44718ae7SMatthias Ringwald service_name = ".";
183*44718ae7SMatthias Ringwald service_provider_name = ".";
1841d3bd1e5SMatthias Ringwald descriptor_size = 0;
1851d3bd1e5SMatthias Ringwald expected_len = avrcp_controller_record_size(service_name, service_provider_name);
1861d3bd1e5SMatthias Ringwald avrcp_controller_create_sdp_record(service_buffer, 0, 0, service_name, service_provider_name);
1871d3bd1e5SMatthias Ringwald CHECK_EQUAL(de_get_len(service_buffer), expected_len);
1881d3bd1e5SMatthias Ringwald }
1891d3bd1e5SMatthias Ringwald
1901d3bd1e5SMatthias Ringwald //
1911d3bd1e5SMatthias Ringwald // hid_device.h
1921d3bd1e5SMatthias Ringwald //
1931d3bd1e5SMatthias Ringwald
1941d3bd1e5SMatthias Ringwald #define HID_DEVICE_RECORD_SIZE_MIN 187
1951d3bd1e5SMatthias Ringwald
hid_device_record_size(uint16_t descriptor_size,const char * name)1961d3bd1e5SMatthias Ringwald static uint16_t hid_device_record_size(uint16_t descriptor_size, const char * name){
1971d3bd1e5SMatthias Ringwald return HID_DEVICE_RECORD_SIZE_MIN + descriptor_size + strlen(name);
1981d3bd1e5SMatthias Ringwald }
1991d3bd1e5SMatthias Ringwald
TEST(SDPRecordBuilder,HID_DEVICE)2001d3bd1e5SMatthias Ringwald TEST(SDPRecordBuilder, HID_DEVICE){
2011d3bd1e5SMatthias Ringwald const char * name;
2021d3bd1e5SMatthias Ringwald int expected_len;
2031d3bd1e5SMatthias Ringwald int descriptor_size;
2041d3bd1e5SMatthias Ringwald
2051d3bd1e5SMatthias Ringwald name = "";
2061d3bd1e5SMatthias Ringwald descriptor_size = 0;
2071d3bd1e5SMatthias Ringwald expected_len = hid_device_record_size(descriptor_size, name);
2081d3bd1e5SMatthias Ringwald
2091d3bd1e5SMatthias Ringwald hid_sdp_record_t hid_params = {0, 0, 0, 0, 0, false, false, 0xFFFF, 0xFFFF, 3200, NULL, descriptor_size, name};
2101d3bd1e5SMatthias Ringwald hid_create_sdp_record(service_buffer, 0x0001, &hid_params);
2111d3bd1e5SMatthias Ringwald
2121d3bd1e5SMatthias Ringwald CHECK_EQUAL(de_get_len(service_buffer), expected_len);
2131d3bd1e5SMatthias Ringwald }
2141d3bd1e5SMatthias Ringwald
2151d3bd1e5SMatthias Ringwald //
2161d3bd1e5SMatthias Ringwald // hfp_hf
2171d3bd1e5SMatthias Ringwald //
2181d3bd1e5SMatthias Ringwald
2191d3bd1e5SMatthias Ringwald #define HFP_HF_RECORD_SIZE_MIN 78
2201d3bd1e5SMatthias Ringwald
hfp_hf_record_size(const char * name)2211d3bd1e5SMatthias Ringwald static uint16_t hfp_hf_record_size(const char * name){
2221d3bd1e5SMatthias Ringwald return HFP_HF_RECORD_SIZE_MIN + strlen(name);
2231d3bd1e5SMatthias Ringwald }
2241d3bd1e5SMatthias Ringwald
TEST(SDPRecordBuilder,HFP_HF)2251d3bd1e5SMatthias Ringwald TEST(SDPRecordBuilder, HFP_HF){
2261d3bd1e5SMatthias Ringwald const char * name;
2271d3bd1e5SMatthias Ringwald int expected_len;
2281d3bd1e5SMatthias Ringwald
229*44718ae7SMatthias Ringwald name = ".";
2301d3bd1e5SMatthias Ringwald expected_len = hfp_hf_record_size(name);
2311d3bd1e5SMatthias Ringwald hfp_hf_create_sdp_record(service_buffer, 0, 0, name, 0, 0);
2321d3bd1e5SMatthias Ringwald CHECK_EQUAL(de_get_len(service_buffer), expected_len);
2331d3bd1e5SMatthias Ringwald
2341d3bd1e5SMatthias Ringwald name =test_string;
2351d3bd1e5SMatthias Ringwald expected_len = hfp_hf_record_size(name);
2361d3bd1e5SMatthias Ringwald hfp_hf_create_sdp_record(service_buffer, 0, 0, name, 0, 0);
2371d3bd1e5SMatthias Ringwald CHECK_EQUAL(de_get_len(service_buffer), expected_len);
2381d3bd1e5SMatthias Ringwald }
2391d3bd1e5SMatthias Ringwald
2401d3bd1e5SMatthias Ringwald //
2411d3bd1e5SMatthias Ringwald // hfp_ag
2421d3bd1e5SMatthias Ringwald //
2431d3bd1e5SMatthias Ringwald
2441d3bd1e5SMatthias Ringwald #define HFP_AG_RECORD_SIZE_MIN 83
2451d3bd1e5SMatthias Ringwald
hfp_ag_record_size(const char * name)2461d3bd1e5SMatthias Ringwald static uint16_t hfp_ag_record_size(const char * name){
2471d3bd1e5SMatthias Ringwald return HFP_AG_RECORD_SIZE_MIN + strlen(name);
2481d3bd1e5SMatthias Ringwald }
2491d3bd1e5SMatthias Ringwald
TEST(SDPRecordBuilder,HFP_AG)2501d3bd1e5SMatthias Ringwald TEST(SDPRecordBuilder, HFP_AG){
2511d3bd1e5SMatthias Ringwald const char * name;
2521d3bd1e5SMatthias Ringwald int expected_len;
2531d3bd1e5SMatthias Ringwald
254*44718ae7SMatthias Ringwald name = ".";
2551d3bd1e5SMatthias Ringwald expected_len = hfp_ag_record_size(name);
2561d3bd1e5SMatthias Ringwald hfp_ag_create_sdp_record(service_buffer, 0, 0, name, 0, 0, 0);
2571d3bd1e5SMatthias Ringwald CHECK_EQUAL(de_get_len(service_buffer), expected_len);
2581d3bd1e5SMatthias Ringwald
2591d3bd1e5SMatthias Ringwald name =test_string;
2601d3bd1e5SMatthias Ringwald expected_len = hfp_ag_record_size(name);
2611d3bd1e5SMatthias Ringwald hfp_ag_create_sdp_record(service_buffer, 0, 0, name, 0, 0, 0);
2621d3bd1e5SMatthias Ringwald CHECK_EQUAL(de_get_len(service_buffer), expected_len);
2631d3bd1e5SMatthias Ringwald }
2641d3bd1e5SMatthias Ringwald
2651d3bd1e5SMatthias Ringwald
2661d3bd1e5SMatthias Ringwald //
2671d3bd1e5SMatthias Ringwald // hsp_ag
2681d3bd1e5SMatthias Ringwald //
2691d3bd1e5SMatthias Ringwald
2701d3bd1e5SMatthias Ringwald #define HSP_AG_RECORD_SIZE_MIN 72
2711d3bd1e5SMatthias Ringwald
hsp_ag_record_size(const char * name)2721d3bd1e5SMatthias Ringwald static uint16_t hsp_ag_record_size(const char * name){
2731d3bd1e5SMatthias Ringwald return HSP_AG_RECORD_SIZE_MIN + strlen(name);
2741d3bd1e5SMatthias Ringwald }
2751d3bd1e5SMatthias Ringwald
TEST(SDPRecordBuilder,HSP_AG)2761d3bd1e5SMatthias Ringwald TEST(SDPRecordBuilder, HSP_AG){
2771d3bd1e5SMatthias Ringwald const char * name;
2781d3bd1e5SMatthias Ringwald int expected_len;
2791d3bd1e5SMatthias Ringwald
2801d3bd1e5SMatthias Ringwald name = "";
2811d3bd1e5SMatthias Ringwald expected_len = hsp_ag_record_size(name);
2821d3bd1e5SMatthias Ringwald hsp_ag_create_sdp_record(service_buffer, 0, 0, name);
2831d3bd1e5SMatthias Ringwald CHECK_EQUAL(de_get_len(service_buffer), expected_len);
2841d3bd1e5SMatthias Ringwald
2851d3bd1e5SMatthias Ringwald name =test_string;
2861d3bd1e5SMatthias Ringwald expected_len = hsp_ag_record_size(name);
2871d3bd1e5SMatthias Ringwald hsp_ag_create_sdp_record(service_buffer, 0, 0, name);
2881d3bd1e5SMatthias Ringwald CHECK_EQUAL(de_get_len(service_buffer), expected_len);
2891d3bd1e5SMatthias Ringwald }
2901d3bd1e5SMatthias Ringwald
2911d3bd1e5SMatthias Ringwald //
2921d3bd1e5SMatthias Ringwald // hsp_hs
2931d3bd1e5SMatthias Ringwald //
2941d3bd1e5SMatthias Ringwald
2951d3bd1e5SMatthias Ringwald #define HSP_HS_RECORD_SIZE_MIN 80
2961d3bd1e5SMatthias Ringwald
hsp_hs_record_size(const char * name)2971d3bd1e5SMatthias Ringwald static uint16_t hsp_hs_record_size(const char * name){
2981d3bd1e5SMatthias Ringwald return HSP_HS_RECORD_SIZE_MIN + strlen(name);
2991d3bd1e5SMatthias Ringwald }
3001d3bd1e5SMatthias Ringwald
TEST(SDPRecordBuilder,HSP_HS)3011d3bd1e5SMatthias Ringwald TEST(SDPRecordBuilder, HSP_HS){
3021d3bd1e5SMatthias Ringwald const char * name;
3031d3bd1e5SMatthias Ringwald int expected_len;
3041d3bd1e5SMatthias Ringwald
3051d3bd1e5SMatthias Ringwald name = "";
3061d3bd1e5SMatthias Ringwald expected_len = hsp_hs_record_size(name);
3071d3bd1e5SMatthias Ringwald hsp_hs_create_sdp_record(service_buffer, 0, 0, name, 0);
3081d3bd1e5SMatthias Ringwald CHECK_EQUAL(de_get_len(service_buffer), expected_len);
3091d3bd1e5SMatthias Ringwald
3101d3bd1e5SMatthias Ringwald name =test_string;
3111d3bd1e5SMatthias Ringwald expected_len = hsp_hs_record_size(name);
3121d3bd1e5SMatthias Ringwald hsp_hs_create_sdp_record(service_buffer, 0, 0, name, 0);
3131d3bd1e5SMatthias Ringwald CHECK_EQUAL(de_get_len(service_buffer), expected_len);
3141d3bd1e5SMatthias Ringwald }
3151d3bd1e5SMatthias Ringwald
3161d3bd1e5SMatthias Ringwald //
3171d3bd1e5SMatthias Ringwald // device id
3181d3bd1e5SMatthias Ringwald //
3191d3bd1e5SMatthias Ringwald
3201d3bd1e5SMatthias Ringwald #define DEVICE_ID_RECORD_SIZE 64
3211d3bd1e5SMatthias Ringwald
device_id_record_size(void)3221d3bd1e5SMatthias Ringwald static uint16_t device_id_record_size(void){
3231d3bd1e5SMatthias Ringwald return DEVICE_ID_RECORD_SIZE;
3241d3bd1e5SMatthias Ringwald }
3251d3bd1e5SMatthias Ringwald
TEST(SDPRecordBuilder,DeviceID)3261d3bd1e5SMatthias Ringwald TEST(SDPRecordBuilder, DeviceID){
3271d3bd1e5SMatthias Ringwald int expected_len;
3281d3bd1e5SMatthias Ringwald expected_len = device_id_record_size();
3291d3bd1e5SMatthias Ringwald device_id_create_sdp_record(service_buffer, 0, 0, 0, 0, 0);
3301d3bd1e5SMatthias Ringwald CHECK_EQUAL(de_get_len(service_buffer), expected_len);
3311d3bd1e5SMatthias Ringwald }
3321d3bd1e5SMatthias Ringwald
3331d3bd1e5SMatthias Ringwald
3341d3bd1e5SMatthias Ringwald //
3351d3bd1e5SMatthias Ringwald // pan
3361d3bd1e5SMatthias Ringwald //
3371d3bd1e5SMatthias Ringwald
3381d3bd1e5SMatthias Ringwald #define PAN_RECORD_MIN_LEN 104
3391d3bd1e5SMatthias Ringwald
3401d3bd1e5SMatthias Ringwald static const char default_panu_service_name[] = "Personal Ad-hoc User Service";
3411d3bd1e5SMatthias Ringwald static const char default_panu_service_desc[] = "Personal Ad-hoc User Service";
3421d3bd1e5SMatthias Ringwald
3431d3bd1e5SMatthias Ringwald static const char default_nap_service_name[] = "Network Access Point Service";
3441d3bd1e5SMatthias Ringwald static const char default_nap_service_desc[] = "Personal Ad-hoc Network Service which provides access to a network";
3451d3bd1e5SMatthias Ringwald
3461d3bd1e5SMatthias Ringwald static const char default_gn_service_name[] = "Group Ad-hoc Network Service";
3471d3bd1e5SMatthias Ringwald static const char default_gn_service_desc[] = "Personal Group Ad-hoc Network Service";
3481d3bd1e5SMatthias Ringwald
3491d3bd1e5SMatthias Ringwald // network_packet_types (X bytes x nr network packet types)
3501d3bd1e5SMatthias Ringwald // name. default name or name
3511d3bd1e5SMatthias Ringwald // ipv4 subnet, if yes + x
3521d3bd1e5SMatthias Ringwald // ipv6 subnet, if yes + x
3531d3bd1e5SMatthias Ringwald
pan_sdp_record_size(uint16_t * network_packet_types,const char * name,const char * description,const char * IPv4Subnet,const char * IPv6Subnet,const char * default_name,const char * default_desc)3541d3bd1e5SMatthias Ringwald static uint16_t pan_sdp_record_size(uint16_t * network_packet_types, const char *name, const char *description, const char *IPv4Subnet,
3551d3bd1e5SMatthias Ringwald const char *IPv6Subnet, const char * default_name, const char * default_desc){
3561d3bd1e5SMatthias Ringwald int num_network_packet_types;
3571d3bd1e5SMatthias Ringwald for (num_network_packet_types=0; network_packet_types && *network_packet_types; num_network_packet_types++, network_packet_types++);
3581d3bd1e5SMatthias Ringwald int name_len = name ? strlen(name) : strlen(default_name);
3591d3bd1e5SMatthias Ringwald int desc_len = description ? strlen(description) : strlen(default_desc);
3601d3bd1e5SMatthias Ringwald int ipv4_len = IPv4Subnet ? 5 + strlen(IPv4Subnet) : 0;
3611d3bd1e5SMatthias Ringwald int ipv6_len = IPv6Subnet ? 5 + strlen(IPv6Subnet) : 0;
3621d3bd1e5SMatthias Ringwald uint16_t res = PAN_RECORD_MIN_LEN + name_len + desc_len + ipv4_len + ipv6_len + num_network_packet_types * 3; // tyoe + uint16_t
3631d3bd1e5SMatthias Ringwald return res;
3641d3bd1e5SMatthias Ringwald }
3651d3bd1e5SMatthias Ringwald
pan_panu_sdp_record_size(uint16_t * network_packet_types,const char * name,const char * description)3661d3bd1e5SMatthias Ringwald static uint16_t pan_panu_sdp_record_size(uint16_t * network_packet_types, const char *name, const char *description){
3671d3bd1e5SMatthias Ringwald return pan_sdp_record_size(network_packet_types, name, description, NULL, NULL, default_panu_service_name, default_panu_service_desc);
3681d3bd1e5SMatthias Ringwald }
3691d3bd1e5SMatthias Ringwald
pan_gn_sdp_record_size(uint16_t * network_packet_types,const char * name,const char * description,const char * IPv4Subnet,const char * IPv6Subnet)3701d3bd1e5SMatthias Ringwald static uint16_t pan_gn_sdp_record_size(uint16_t * network_packet_types, const char *name, const char *description, const char *IPv4Subnet,
3711d3bd1e5SMatthias Ringwald const char *IPv6Subnet){
3721d3bd1e5SMatthias Ringwald return pan_sdp_record_size(network_packet_types, name, description, IPv4Subnet, IPv6Subnet, default_gn_service_name, default_gn_service_desc);
3731d3bd1e5SMatthias Ringwald }
3741d3bd1e5SMatthias Ringwald
pan_nap_sdp_record_size(uint16_t * network_packet_types,const char * name,const char * description,const char * IPv4Subnet,const char * IPv6Subnet)3751d3bd1e5SMatthias Ringwald static uint16_t pan_nap_sdp_record_size(uint16_t * network_packet_types, const char *name, const char *description, const char *IPv4Subnet,
3761d3bd1e5SMatthias Ringwald const char *IPv6Subnet){
3771d3bd1e5SMatthias Ringwald return pan_sdp_record_size(network_packet_types, name, description, IPv4Subnet, IPv6Subnet, default_nap_service_name, default_nap_service_desc) + 14;
3781d3bd1e5SMatthias Ringwald }
3791d3bd1e5SMatthias Ringwald
TEST(SDPRecordBuilder,PANU)3801d3bd1e5SMatthias Ringwald TEST(SDPRecordBuilder, PANU){
3811d3bd1e5SMatthias Ringwald int expected_len;
3821d3bd1e5SMatthias Ringwald const char * name;
3831d3bd1e5SMatthias Ringwald const char * desc;
3841d3bd1e5SMatthias Ringwald uint16_t * network_packet_types;
3851d3bd1e5SMatthias Ringwald
3861d3bd1e5SMatthias Ringwald // empty name
3871d3bd1e5SMatthias Ringwald name = "";
3881d3bd1e5SMatthias Ringwald desc = "";
3891d3bd1e5SMatthias Ringwald network_packet_types = NULL;
3901d3bd1e5SMatthias Ringwald expected_len = pan_panu_sdp_record_size(network_packet_types, name, desc);
3911d3bd1e5SMatthias Ringwald pan_create_panu_sdp_record(service_buffer, 0, network_packet_types, name, desc, BNEP_SECURITY_NONE);
3921d3bd1e5SMatthias Ringwald CHECK_EQUAL(de_get_len(service_buffer), expected_len);
3931d3bd1e5SMatthias Ringwald
3941d3bd1e5SMatthias Ringwald // default name
3951d3bd1e5SMatthias Ringwald name = NULL;
3961d3bd1e5SMatthias Ringwald desc = NULL;
3971d3bd1e5SMatthias Ringwald network_packet_types = NULL;
3981d3bd1e5SMatthias Ringwald expected_len = pan_panu_sdp_record_size(network_packet_types, name, desc);
3991d3bd1e5SMatthias Ringwald pan_create_panu_sdp_record(service_buffer, 0, network_packet_types, name, desc, BNEP_SECURITY_NONE);
4001d3bd1e5SMatthias Ringwald CHECK_EQUAL(de_get_len(service_buffer), expected_len);
4011d3bd1e5SMatthias Ringwald
4021d3bd1e5SMatthias Ringwald // empty list
4031d3bd1e5SMatthias Ringwald name = NULL;
4041d3bd1e5SMatthias Ringwald desc = NULL;
4051d3bd1e5SMatthias Ringwald network_packet_types = (uint16_t *) &uint16_list_empty;
4061d3bd1e5SMatthias Ringwald expected_len = pan_panu_sdp_record_size(network_packet_types, name, desc);
4071d3bd1e5SMatthias Ringwald pan_create_panu_sdp_record(service_buffer, 0, network_packet_types, name, desc, BNEP_SECURITY_NONE);
4081d3bd1e5SMatthias Ringwald CHECK_EQUAL(de_get_len(service_buffer), expected_len);
4091d3bd1e5SMatthias Ringwald
4101d3bd1e5SMatthias Ringwald // single element
4111d3bd1e5SMatthias Ringwald name = NULL;
4121d3bd1e5SMatthias Ringwald desc = NULL;
4131d3bd1e5SMatthias Ringwald network_packet_types = (uint16_t *) &uint16_list_single_element;
4141d3bd1e5SMatthias Ringwald expected_len = pan_panu_sdp_record_size(network_packet_types, name, desc);
4151d3bd1e5SMatthias Ringwald pan_create_panu_sdp_record(service_buffer, 0, network_packet_types, name, desc, BNEP_SECURITY_NONE);
4161d3bd1e5SMatthias Ringwald CHECK_EQUAL(de_get_len(service_buffer), expected_len);
4171d3bd1e5SMatthias Ringwald }
4181d3bd1e5SMatthias Ringwald
TEST(SDPRecordBuilder,GN)4191d3bd1e5SMatthias Ringwald TEST(SDPRecordBuilder, GN){
4201d3bd1e5SMatthias Ringwald int expected_len;
4211d3bd1e5SMatthias Ringwald const char * name;
4221d3bd1e5SMatthias Ringwald const char * desc;
4231d3bd1e5SMatthias Ringwald uint16_t * network_packet_types;
4241d3bd1e5SMatthias Ringwald const char *IPv4Subnet;
4251d3bd1e5SMatthias Ringwald const char *IPv6Subnet;
4261d3bd1e5SMatthias Ringwald
4271d3bd1e5SMatthias Ringwald // empty name
4281d3bd1e5SMatthias Ringwald name = "";
4291d3bd1e5SMatthias Ringwald desc = "";
4301d3bd1e5SMatthias Ringwald network_packet_types = NULL;
4311d3bd1e5SMatthias Ringwald IPv4Subnet = NULL;
4321d3bd1e5SMatthias Ringwald IPv6Subnet = NULL;
4331d3bd1e5SMatthias Ringwald expected_len = pan_gn_sdp_record_size(network_packet_types, name, desc, IPv4Subnet, IPv6Subnet);
4341d3bd1e5SMatthias Ringwald pan_create_gn_sdp_record(service_buffer, 0, network_packet_types, name, desc, BNEP_SECURITY_NONE, IPv4Subnet, IPv6Subnet);
4351d3bd1e5SMatthias Ringwald CHECK_EQUAL(de_get_len(service_buffer), expected_len);
4361d3bd1e5SMatthias Ringwald
4371d3bd1e5SMatthias Ringwald // test ipv4 param
4381d3bd1e5SMatthias Ringwald name = "";
4391d3bd1e5SMatthias Ringwald desc = "";
4401d3bd1e5SMatthias Ringwald network_packet_types = NULL;
4411d3bd1e5SMatthias Ringwald IPv4Subnet = NULL;
4421d3bd1e5SMatthias Ringwald IPv6Subnet = "";
4431d3bd1e5SMatthias Ringwald expected_len = pan_gn_sdp_record_size(network_packet_types, name, desc, IPv4Subnet, IPv6Subnet);
4441d3bd1e5SMatthias Ringwald pan_create_gn_sdp_record(service_buffer, 0, network_packet_types, name, desc, BNEP_SECURITY_NONE, IPv4Subnet, IPv6Subnet);
4451d3bd1e5SMatthias Ringwald CHECK_EQUAL(de_get_len(service_buffer), expected_len);
4461d3bd1e5SMatthias Ringwald
4471d3bd1e5SMatthias Ringwald // test ipv6 param
4481d3bd1e5SMatthias Ringwald name = "";
4491d3bd1e5SMatthias Ringwald desc = "";
4501d3bd1e5SMatthias Ringwald network_packet_types = NULL;
4511d3bd1e5SMatthias Ringwald IPv4Subnet = "";
4521d3bd1e5SMatthias Ringwald IPv6Subnet = "";
4531d3bd1e5SMatthias Ringwald expected_len = pan_gn_sdp_record_size(network_packet_types, name, desc, IPv4Subnet, IPv6Subnet);
4541d3bd1e5SMatthias Ringwald pan_create_gn_sdp_record(service_buffer, 0, network_packet_types, name, desc, BNEP_SECURITY_NONE, IPv4Subnet, IPv6Subnet);
4551d3bd1e5SMatthias Ringwald CHECK_EQUAL(de_get_len(service_buffer), expected_len);
4561d3bd1e5SMatthias Ringwald }
4571d3bd1e5SMatthias Ringwald
TEST(SDPRecordBuilder,NAP)4581d3bd1e5SMatthias Ringwald TEST(SDPRecordBuilder, NAP){
4591d3bd1e5SMatthias Ringwald int expected_len;
4601d3bd1e5SMatthias Ringwald const char * name;
4611d3bd1e5SMatthias Ringwald const char * desc;
4621d3bd1e5SMatthias Ringwald uint16_t * network_packet_types;
4631d3bd1e5SMatthias Ringwald const char *IPv4Subnet;
4641d3bd1e5SMatthias Ringwald const char *IPv6Subnet;
4651d3bd1e5SMatthias Ringwald
4661d3bd1e5SMatthias Ringwald // empty name
4671d3bd1e5SMatthias Ringwald name = "";
4681d3bd1e5SMatthias Ringwald desc = "";
4691d3bd1e5SMatthias Ringwald network_packet_types = NULL;
4701d3bd1e5SMatthias Ringwald IPv4Subnet = NULL;
4711d3bd1e5SMatthias Ringwald IPv6Subnet = NULL;
4721d3bd1e5SMatthias Ringwald expected_len = pan_nap_sdp_record_size(network_packet_types, name, desc, IPv4Subnet, IPv6Subnet);
4731d3bd1e5SMatthias Ringwald pan_create_nap_sdp_record(service_buffer, 0, network_packet_types, name, desc, BNEP_SECURITY_NONE, PAN_NET_ACCESS_TYPE_PSTN, 0, IPv4Subnet, IPv6Subnet);
4741d3bd1e5SMatthias Ringwald CHECK_EQUAL(de_get_len(service_buffer), expected_len);
4751d3bd1e5SMatthias Ringwald
4761d3bd1e5SMatthias Ringwald // test ipv4 param
4771d3bd1e5SMatthias Ringwald name = "";
4781d3bd1e5SMatthias Ringwald desc = "";
4791d3bd1e5SMatthias Ringwald network_packet_types = NULL;
4801d3bd1e5SMatthias Ringwald IPv4Subnet = NULL;
4811d3bd1e5SMatthias Ringwald IPv6Subnet = "";
4821d3bd1e5SMatthias Ringwald expected_len = pan_nap_sdp_record_size(network_packet_types, name, desc, IPv4Subnet, IPv6Subnet);
4831d3bd1e5SMatthias Ringwald pan_create_nap_sdp_record(service_buffer, 0, network_packet_types, name, desc, BNEP_SECURITY_NONE, PAN_NET_ACCESS_TYPE_PSTN, 0, IPv4Subnet, IPv6Subnet);
4841d3bd1e5SMatthias Ringwald CHECK_EQUAL(de_get_len(service_buffer), expected_len);
4851d3bd1e5SMatthias Ringwald
4861d3bd1e5SMatthias Ringwald // test ipv6 param
4871d3bd1e5SMatthias Ringwald name = "";
4881d3bd1e5SMatthias Ringwald desc = "";
4891d3bd1e5SMatthias Ringwald network_packet_types = NULL;
4901d3bd1e5SMatthias Ringwald IPv4Subnet = "";
4911d3bd1e5SMatthias Ringwald IPv6Subnet = "";
4921d3bd1e5SMatthias Ringwald expected_len = pan_nap_sdp_record_size(network_packet_types, name, desc, IPv4Subnet, IPv6Subnet);
4931d3bd1e5SMatthias Ringwald pan_create_nap_sdp_record(service_buffer, 0, network_packet_types, name, desc, BNEP_SECURITY_NONE, PAN_NET_ACCESS_TYPE_PSTN, 0, IPv4Subnet, IPv6Subnet);
4941d3bd1e5SMatthias Ringwald CHECK_EQUAL(de_get_len(service_buffer), expected_len);
4951d3bd1e5SMatthias Ringwald }
4961d3bd1e5SMatthias Ringwald
4971d3bd1e5SMatthias Ringwald //
4981d3bd1e5SMatthias Ringwald // SPP: Record + strlen(service_name)
4991d3bd1e5SMatthias Ringwald //
5001d3bd1e5SMatthias Ringwald
5011d3bd1e5SMatthias Ringwald #define SPP_RECORD_MIN_LEN 84
5021d3bd1e5SMatthias Ringwald
spp_sdp_record_size_for_service_name(const char * service_name)5031d3bd1e5SMatthias Ringwald static uint16_t spp_sdp_record_size_for_service_name(const char * service_name){
5041d3bd1e5SMatthias Ringwald return SPP_RECORD_MIN_LEN + strlen(service_name);
5051d3bd1e5SMatthias Ringwald }
5061d3bd1e5SMatthias Ringwald
TEST(SDPRecordBuilder,SPP)5071d3bd1e5SMatthias Ringwald TEST(SDPRecordBuilder, SPP){
5081d3bd1e5SMatthias Ringwald int expected_len = spp_sdp_record_size_for_service_name(test_string);
5091d3bd1e5SMatthias Ringwald spp_create_sdp_record(service_buffer, 0, 0, test_string);
5101d3bd1e5SMatthias Ringwald CHECK_EQUAL(de_get_len(service_buffer), expected_len);
5111d3bd1e5SMatthias Ringwald }
5121d3bd1e5SMatthias Ringwald
main(int argc,const char * argv[])5131d3bd1e5SMatthias Ringwald int main (int argc, const char * argv[]){
5141d3bd1e5SMatthias Ringwald return CommandLineTestRunner::RunAllTests(argc, argv);
5151d3bd1e5SMatthias Ringwald }
516