xref: /btstack/test/sdp/sdp_record_builder.cpp (revision 44718ae7b0deb47a33e218adf28d193b5673b16d)
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