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 #include <stdint.h> 401d3bd1e5SMatthias Ringwald #include <stdio.h> 411d3bd1e5SMatthias Ringwald #include <stdlib.h> 421d3bd1e5SMatthias Ringwald #include <string.h> 431d3bd1e5SMatthias Ringwald 441d3bd1e5SMatthias Ringwald #include "CppUTest/TestHarness.h" 451d3bd1e5SMatthias Ringwald #include "CppUTest/CommandLineTestRunner.h" 461d3bd1e5SMatthias Ringwald 47*d2621a77SMatthias Ringwald #include "btstack_event.h" 481d3bd1e5SMatthias Ringwald #include "classic/hfp.h" 49*d2621a77SMatthias Ringwald #include "classic/hfp_hf.h" 501d3bd1e5SMatthias Ringwald #include "classic/hfp_ag.h" 511d3bd1e5SMatthias Ringwald 521d3bd1e5SMatthias Ringwald void hfp_parse(hfp_connection_t * context, uint8_t byte, int isHandsFree); 531d3bd1e5SMatthias Ringwald 541d3bd1e5SMatthias Ringwald static hfp_connection_t context; 551d3bd1e5SMatthias Ringwald static int hfp_ag_indicators_nr = 7; 561d3bd1e5SMatthias Ringwald static hfp_ag_indicator_t hfp_ag_indicators[] = { 571d3bd1e5SMatthias Ringwald // index, name, min range, max range, status, mandatory, enabled, status changed 581d3bd1e5SMatthias Ringwald {1, "service", 0, 1, 1, 0, 0, 0}, 591d3bd1e5SMatthias Ringwald {2, "call", 0, 1, 0, 1, 1, 0}, 601d3bd1e5SMatthias Ringwald {3, "callsetup", 0, 3, 0, 1, 1, 0}, 611d3bd1e5SMatthias Ringwald {4, "battchg", 0, 5, 3, 0, 0, 0}, 621d3bd1e5SMatthias Ringwald {5, "signal", 0, 5, 5, 0, 0, 0}, 631d3bd1e5SMatthias Ringwald {6, "roam", 0, 1, 0, 0, 0, 0}, 641d3bd1e5SMatthias Ringwald {7, "callheld", 0, 2, 0, 1, 1, 0} 651d3bd1e5SMatthias Ringwald }; 661d3bd1e5SMatthias Ringwald static uint8_t call_status_index = 2; 671d3bd1e5SMatthias Ringwald static uint8_t callsetup_status_index = 3; 681d3bd1e5SMatthias Ringwald static uint8_t callheld_status_index = 7; 691d3bd1e5SMatthias Ringwald 701d3bd1e5SMatthias Ringwald 711d3bd1e5SMatthias Ringwald static void parse_ag(const char * packet){ 721d3bd1e5SMatthias Ringwald for (uint16_t pos = 0; pos < strlen(packet); pos++){ 731d3bd1e5SMatthias Ringwald hfp_parse(&context, packet[pos], 0); 741d3bd1e5SMatthias Ringwald } 751d3bd1e5SMatthias Ringwald } 761d3bd1e5SMatthias Ringwald 771d3bd1e5SMatthias Ringwald static void parse_hf(const char * packet){ 781d3bd1e5SMatthias Ringwald for (uint16_t pos = 0; pos < strlen(packet); pos++){ 791d3bd1e5SMatthias Ringwald hfp_parse(&context, packet[pos], 1); 801d3bd1e5SMatthias Ringwald } 811d3bd1e5SMatthias Ringwald } 821d3bd1e5SMatthias Ringwald 831d3bd1e5SMatthias Ringwald TEST_GROUP(HFPParser){ 841d3bd1e5SMatthias Ringwald char packet[200]; 851d3bd1e5SMatthias Ringwald int pos; 861d3bd1e5SMatthias Ringwald int offset; 871d3bd1e5SMatthias Ringwald 881d3bd1e5SMatthias Ringwald void setup(void){ 89*d2621a77SMatthias Ringwald hfp_init(); 90016a59dfSMatthias Ringwald memset(&context, 0, sizeof(hfp_connection_t)); 911d3bd1e5SMatthias Ringwald context.parser_state = HFP_PARSER_CMD_HEADER; 921d3bd1e5SMatthias Ringwald context.parser_item_index = 0; 931d3bd1e5SMatthias Ringwald context.line_size = 0; 941d3bd1e5SMatthias Ringwald context.ag_indicators_nr = 0; 951d3bd1e5SMatthias Ringwald context.remote_codecs_nr = 0; 96016a59dfSMatthias Ringwald context.bnip_number[0] = 0; 97016a59dfSMatthias Ringwald context.bnip_type = 0; 981d3bd1e5SMatthias Ringwald memset(packet,0, sizeof(packet)); 991d3bd1e5SMatthias Ringwald } 100*d2621a77SMatthias Ringwald 101*d2621a77SMatthias Ringwald void teardown(void){ 102*d2621a77SMatthias Ringwald hfp_deinit(); 103*d2621a77SMatthias Ringwald } 1041d3bd1e5SMatthias Ringwald }; 1051d3bd1e5SMatthias Ringwald 1061d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_HF_OK){ 10720d8d1cfSMatthias Ringwald snprintf(packet, sizeof(packet), "\r\n%s\r\n", HFP_OK); 1081d3bd1e5SMatthias Ringwald parse_hf(packet); 1091d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_OK, context.command); 1101d3bd1e5SMatthias Ringwald } 1111d3bd1e5SMatthias Ringwald 1121d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_HF_SUPPORTED_FEATURES){ 11320d8d1cfSMatthias Ringwald snprintf(packet, sizeof(packet), "\r\n%s:1007\r\n\r\nOK\r\n", HFP_SUPPORTED_FEATURES); 1141d3bd1e5SMatthias Ringwald parse_hf(packet); 1151d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_OK, context.command); 1161d3bd1e5SMatthias Ringwald CHECK_EQUAL(1007, context.remote_supported_features); 1171d3bd1e5SMatthias Ringwald } 1181d3bd1e5SMatthias Ringwald 1191d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_CMD_INDICATORS_QUERY){ 12020d8d1cfSMatthias Ringwald snprintf(packet, sizeof(packet), "\r\nAT%s?\r\n", HFP_INDICATOR); 1211d3bd1e5SMatthias Ringwald parse_ag(packet); 1221d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_RETRIEVE_AG_INDICATORS_STATUS, context.command); 1231d3bd1e5SMatthias Ringwald } 1241d3bd1e5SMatthias Ringwald 1251d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_CMD_INDICATORS_RETRIEVE){ 12620d8d1cfSMatthias Ringwald snprintf(packet, sizeof(packet), "\r\nAT%s=?\r\n", HFP_INDICATOR); 1271d3bd1e5SMatthias Ringwald parse_ag(packet); 1281d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_RETRIEVE_AG_INDICATORS, context.command); 1291d3bd1e5SMatthias Ringwald } 1301d3bd1e5SMatthias Ringwald 1311d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_HF_INDICATORS){ 1321d3bd1e5SMatthias Ringwald offset = 0; 1331d3bd1e5SMatthias Ringwald offset += snprintf(packet, sizeof(packet), "%s:", HFP_INDICATOR); 1341d3bd1e5SMatthias Ringwald for (pos = 0; pos < hfp_ag_indicators_nr; pos++){ 1351d3bd1e5SMatthias Ringwald if (pos != 0) { 1361d3bd1e5SMatthias Ringwald packet[offset++] = ','; 1371d3bd1e5SMatthias Ringwald } 1381d3bd1e5SMatthias Ringwald offset += snprintf(packet+offset, sizeof(packet)-offset, "(\"%s\", (%d, %d)),", hfp_ag_indicators[pos].name, hfp_ag_indicators[pos].min_range, hfp_ag_indicators[pos].max_range); 1391d3bd1e5SMatthias Ringwald } 1401d3bd1e5SMatthias Ringwald offset += snprintf(packet+offset, sizeof(packet)-offset, "\r\n\r\nOK\r\n"); 1411d3bd1e5SMatthias Ringwald context.state = HFP_W4_RETRIEVE_INDICATORS; 1421d3bd1e5SMatthias Ringwald 1431d3bd1e5SMatthias Ringwald parse_hf(packet); 1441d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_OK, context.command); 1451d3bd1e5SMatthias Ringwald CHECK_EQUAL(hfp_ag_indicators_nr, context.ag_indicators_nr); 1461d3bd1e5SMatthias Ringwald for (pos = 0; pos < hfp_ag_indicators_nr; pos++){ 1471d3bd1e5SMatthias Ringwald CHECK_EQUAL(hfp_ag_indicators[pos].index, context.ag_indicators[pos].index); 1481d3bd1e5SMatthias Ringwald STRCMP_EQUAL(hfp_ag_indicators[pos].name, context.ag_indicators[pos].name); 1491d3bd1e5SMatthias Ringwald CHECK_EQUAL(hfp_ag_indicators[pos].min_range, context.ag_indicators[pos].min_range); 1501d3bd1e5SMatthias Ringwald CHECK_EQUAL(hfp_ag_indicators[pos].max_range, context.ag_indicators[pos].max_range); 1511d3bd1e5SMatthias Ringwald } 1521d3bd1e5SMatthias Ringwald } 1531d3bd1e5SMatthias Ringwald 1541d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_HF_INDICATORS_RANGE){ 1551d3bd1e5SMatthias Ringwald offset = 0; 1561d3bd1e5SMatthias Ringwald offset += snprintf(packet, sizeof(packet), "%s:", HFP_INDICATOR); 1571d3bd1e5SMatthias Ringwald for (pos = 0; pos < hfp_ag_indicators_nr; pos++){ 1581d3bd1e5SMatthias Ringwald if (pos != 0) { 1591d3bd1e5SMatthias Ringwald packet[offset++] = ','; 1601d3bd1e5SMatthias Ringwald } 1611d3bd1e5SMatthias Ringwald offset += snprintf(packet+offset, sizeof(packet)-offset, "(\"%s\", (%d-%d)),", hfp_ag_indicators[pos].name, hfp_ag_indicators[pos].min_range, hfp_ag_indicators[pos].max_range); 1621d3bd1e5SMatthias Ringwald } 1631d3bd1e5SMatthias Ringwald offset += snprintf(packet+offset, sizeof(packet)-offset, "\r\n\r\nOK\r\n"); 1641d3bd1e5SMatthias Ringwald context.state = HFP_W4_RETRIEVE_INDICATORS; 1651d3bd1e5SMatthias Ringwald 1661d3bd1e5SMatthias Ringwald parse_hf(packet); 1671d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_OK, context.command); 1681d3bd1e5SMatthias Ringwald CHECK_EQUAL(hfp_ag_indicators_nr, context.ag_indicators_nr); 1691d3bd1e5SMatthias Ringwald for (pos = 0; pos < hfp_ag_indicators_nr; pos++){ 1701d3bd1e5SMatthias Ringwald CHECK_EQUAL(hfp_ag_indicators[pos].index, context.ag_indicators[pos].index); 1711d3bd1e5SMatthias Ringwald STRCMP_EQUAL(hfp_ag_indicators[pos].name, context.ag_indicators[pos].name); 1721d3bd1e5SMatthias Ringwald CHECK_EQUAL(hfp_ag_indicators[pos].min_range, context.ag_indicators[pos].min_range); 1731d3bd1e5SMatthias Ringwald CHECK_EQUAL(hfp_ag_indicators[pos].max_range, context.ag_indicators[pos].max_range); 1741d3bd1e5SMatthias Ringwald } 1751d3bd1e5SMatthias Ringwald } 1761d3bd1e5SMatthias Ringwald 1771d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_HF_INDICATOR_STATUS){ 1781d3bd1e5SMatthias Ringwald // send status 1791d3bd1e5SMatthias Ringwald offset = 0; 1801d3bd1e5SMatthias Ringwald offset += snprintf(packet, sizeof(packet), "%s:", HFP_INDICATOR); 1811d3bd1e5SMatthias Ringwald for (pos = 0; pos < hfp_ag_indicators_nr - 1; pos++){ 1821d3bd1e5SMatthias Ringwald offset += snprintf(packet+offset, sizeof(packet)-offset, "%d,", hfp_ag_indicators[pos].status); 1831d3bd1e5SMatthias Ringwald } 1841d3bd1e5SMatthias Ringwald offset += snprintf(packet+offset, sizeof(packet)-offset, "%d\r\n\r\nOK\r\n", hfp_ag_indicators[pos].status); 1851d3bd1e5SMatthias Ringwald 1861d3bd1e5SMatthias Ringwald //context.command = HFP_CMD_RETRIEVE_AG_INDICATORS_STATUS; 1871d3bd1e5SMatthias Ringwald context.state = HFP_W4_RETRIEVE_INDICATORS_STATUS; 1881d3bd1e5SMatthias Ringwald 1891d3bd1e5SMatthias Ringwald parse_hf(packet); 1901d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_OK, context.command); 1911d3bd1e5SMatthias Ringwald for (pos = 0; pos < hfp_ag_indicators_nr; pos++){ 1921d3bd1e5SMatthias Ringwald CHECK_EQUAL(hfp_ag_indicators[pos].status, context.ag_indicators[pos].status); 1931d3bd1e5SMatthias Ringwald } 1941d3bd1e5SMatthias Ringwald } 1951d3bd1e5SMatthias Ringwald 1961d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_HF_SUPPORT_CALL_HOLD_AND_MULTIPARTY_SERVICES_TEST){ 19720d8d1cfSMatthias Ringwald snprintf(packet, sizeof(packet), "\r\nAT%s=?\r\n", HFP_SUPPORT_CALL_HOLD_AND_MULTIPARTY_SERVICES); 1981d3bd1e5SMatthias Ringwald parse_ag(packet); 1991d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_SUPPORT_CALL_HOLD_AND_MULTIPARTY_SERVICES, context.command); 2001d3bd1e5SMatthias Ringwald } 2011d3bd1e5SMatthias Ringwald 2021d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_HF_SUPPORT_CALL_HOLD_AND_MULTIPARTY_SERVICES_SET){ 2031d3bd1e5SMatthias Ringwald int action = 1; 2041d3bd1e5SMatthias Ringwald int call_index = 2; 20520d8d1cfSMatthias Ringwald snprintf(packet, sizeof(packet), "\r\nAT%s=%u%u\r\n", HFP_SUPPORT_CALL_HOLD_AND_MULTIPARTY_SERVICES, action, call_index); 2061d3bd1e5SMatthias Ringwald parse_ag(packet); 2071d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_CALL_HOLD, context.command); 2081d3bd1e5SMatthias Ringwald CHECK_EQUAL(action, context.ag_call_hold_action); 2091d3bd1e5SMatthias Ringwald CHECK_EQUAL(call_index, context.call_index); 2101d3bd1e5SMatthias Ringwald } 2111d3bd1e5SMatthias Ringwald 2121d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_HF_SUPPORT_CALL_HOLD_AND_MULTIPARTY_SERVICES){ 21320d8d1cfSMatthias Ringwald snprintf(packet, sizeof(packet), "\r\n%s:(1,1x,2,2x,3)\r\n\r\nOK\r\n", HFP_SUPPORT_CALL_HOLD_AND_MULTIPARTY_SERVICES); 2141d3bd1e5SMatthias Ringwald parse_hf(packet); 2151d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_OK, context.command); 2161d3bd1e5SMatthias Ringwald CHECK_EQUAL(5, context.remote_call_services_index); 2171d3bd1e5SMatthias Ringwald 2181d3bd1e5SMatthias Ringwald STRCMP_EQUAL("1", (char*)context.remote_call_services[0].name); 2191d3bd1e5SMatthias Ringwald STRCMP_EQUAL("1x", (char*)context.remote_call_services[1].name); 2201d3bd1e5SMatthias Ringwald STRCMP_EQUAL("2", (char*)context.remote_call_services[2].name); 2211d3bd1e5SMatthias Ringwald STRCMP_EQUAL("2x", (char*)context.remote_call_services[3].name); 2221d3bd1e5SMatthias Ringwald STRCMP_EQUAL("3", (char*)context.remote_call_services[4].name); 2231d3bd1e5SMatthias Ringwald } 2241d3bd1e5SMatthias Ringwald 2251d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_GENERIC_STATUS_INDICATOR_TEST){ 22620d8d1cfSMatthias Ringwald snprintf(packet, sizeof(packet), "\r\nAT%s=?\r\n", HFP_GENERIC_STATUS_INDICATOR); 2271d3bd1e5SMatthias Ringwald parse_ag(packet); 2281d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_RETRIEVE_GENERIC_STATUS_INDICATORS, context.command); 2291d3bd1e5SMatthias Ringwald } 2301d3bd1e5SMatthias Ringwald 2311d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_GENERIC_STATUS_INDICATOR_SET){ 2321d3bd1e5SMatthias Ringwald int param = 1; 23320d8d1cfSMatthias Ringwald snprintf(packet, sizeof(packet), "\r\nAT%s=%u\r\n", HFP_GENERIC_STATUS_INDICATOR, param); 2341d3bd1e5SMatthias Ringwald parse_ag(packet); 2351d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_LIST_GENERIC_STATUS_INDICATORS, context.command); 2361d3bd1e5SMatthias Ringwald } 2371d3bd1e5SMatthias Ringwald 2381d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_GENERIC_STATUS_INDICATOR_READ){ 23920d8d1cfSMatthias Ringwald snprintf(packet, sizeof(packet), "\r\nAT%s?\r\n", HFP_GENERIC_STATUS_INDICATOR); 2401d3bd1e5SMatthias Ringwald parse_ag(packet); 2411d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_RETRIEVE_GENERIC_STATUS_INDICATORS_STATE, context.command); 2421d3bd1e5SMatthias Ringwald } 2431d3bd1e5SMatthias Ringwald 2441d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_HF_GENERIC_STATUS_INDICATOR_STATE){ 24520d8d1cfSMatthias Ringwald snprintf(packet, sizeof(packet), "\r\n%s:0,1\r\n\r\nOK\r\n", HFP_GENERIC_STATUS_INDICATOR); 2461d3bd1e5SMatthias Ringwald // context.command = HFP_CMD_RETRIEVE_GENERIC_STATUS_INDICATORS_STATE; 2471d3bd1e5SMatthias Ringwald context.state = HFP_W4_RETRIEVE_INITITAL_STATE_GENERIC_STATUS_INDICATORS; 2481d3bd1e5SMatthias Ringwald 2491d3bd1e5SMatthias Ringwald parse_hf(packet); 2501d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_OK, context.command); 2511d3bd1e5SMatthias Ringwald CHECK_EQUAL(1, context.generic_status_indicators[0].state); 2521d3bd1e5SMatthias Ringwald } 2531d3bd1e5SMatthias Ringwald 2541d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_HF_AG_INDICATOR_STATUS_UPDATE){ 2551d3bd1e5SMatthias Ringwald context.ag_indicators_nr = hfp_ag_indicators_nr; 2561d3bd1e5SMatthias Ringwald memcpy(context.ag_indicators, hfp_ag_indicators, hfp_ag_indicators_nr * sizeof(hfp_ag_indicator_t)); 2571d3bd1e5SMatthias Ringwald 2581d3bd1e5SMatthias Ringwald uint8_t index = 4; 2591d3bd1e5SMatthias Ringwald uint8_t status = 5; 2601d3bd1e5SMatthias Ringwald 26120d8d1cfSMatthias Ringwald snprintf(packet, sizeof(packet), "\r\n%s:%d,%d\r\n\r\nOK\r\n", HFP_TRANSFER_AG_INDICATOR_STATUS, index, status); 2621d3bd1e5SMatthias Ringwald 2631d3bd1e5SMatthias Ringwald parse_hf(packet); 2641d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_OK, context.command); 2651d3bd1e5SMatthias Ringwald CHECK_EQUAL(status, context.ag_indicators[index - 1].status); 2661d3bd1e5SMatthias Ringwald } 2671d3bd1e5SMatthias Ringwald 2681d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_HF_AG_QUERY_OPERATOR_SELECTION){ 26920d8d1cfSMatthias Ringwald snprintf(packet, sizeof(packet), "\r\n%s:1,0,\"sunrise\"\r\n\r\nOK\r\n", HFP_QUERY_OPERATOR_SELECTION); 2701d3bd1e5SMatthias Ringwald 2711d3bd1e5SMatthias Ringwald context.command = HFP_CMD_QUERY_OPERATOR_SELECTION_NAME; 2721d3bd1e5SMatthias Ringwald 2731d3bd1e5SMatthias Ringwald parse_hf(packet); 2741d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_OK, context.command); 2751d3bd1e5SMatthias Ringwald CHECK_EQUAL(0, context.operator_name_changed); 2761d3bd1e5SMatthias Ringwald STRCMP_EQUAL( "sunrise", context.network_operator.name); 2771d3bd1e5SMatthias Ringwald } 2781d3bd1e5SMatthias Ringwald 2791d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_HF_ERROR){ 28020d8d1cfSMatthias Ringwald snprintf(packet, sizeof(packet), "\r\n%s\r\n", HFP_ERROR); 2811d3bd1e5SMatthias Ringwald 2821d3bd1e5SMatthias Ringwald parse_hf(packet); 2831d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_ERROR, context.command); 2841d3bd1e5SMatthias Ringwald } 2851d3bd1e5SMatthias Ringwald 2861d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_HF_EXTENDED_AUDIO_GATEWAY_ERROR){ 28720d8d1cfSMatthias Ringwald snprintf(packet, sizeof(packet), "\r\n%s:%d\r\n", HFP_EXTENDED_AUDIO_GATEWAY_ERROR, HFP_CME_ERROR_NO_NETWORK_SERVICE); 2881d3bd1e5SMatthias Ringwald 2891d3bd1e5SMatthias Ringwald parse_hf(packet); 2901d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_EXTENDED_AUDIO_GATEWAY_ERROR, context.command); 2911d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CME_ERROR_NO_NETWORK_SERVICE, context.extended_audio_gateway_error_value); 2921d3bd1e5SMatthias Ringwald } 2931d3bd1e5SMatthias Ringwald 2941d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_HF_AG_INDICATOR_CALLS_STATUS_UPDATE){ 2951d3bd1e5SMatthias Ringwald context.ag_indicators_nr = hfp_ag_indicators_nr; 2961d3bd1e5SMatthias Ringwald memcpy(context.ag_indicators, hfp_ag_indicators, hfp_ag_indicators_nr * sizeof(hfp_ag_indicator_t)); 2971d3bd1e5SMatthias Ringwald uint8_t status = 1; 2981d3bd1e5SMatthias Ringwald 2991d3bd1e5SMatthias Ringwald // call status 3001d3bd1e5SMatthias Ringwald uint8_t index = call_status_index; 30120d8d1cfSMatthias Ringwald snprintf(packet, sizeof(packet), "\r\n%s:%d,%d\r\n\r\nOK\r\n", HFP_TRANSFER_AG_INDICATOR_STATUS, index, status); 3021d3bd1e5SMatthias Ringwald parse_hf(packet); 3031d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_OK, context.command); 3041d3bd1e5SMatthias Ringwald CHECK_EQUAL(status, context.ag_indicators[index - 1].status); 3051d3bd1e5SMatthias Ringwald 3061d3bd1e5SMatthias Ringwald // callsetup status 3071d3bd1e5SMatthias Ringwald index = callsetup_status_index; 30820d8d1cfSMatthias Ringwald snprintf(packet, sizeof(packet), "\r\n%s:%d,%d\r\n\r\nOK\r\n", HFP_TRANSFER_AG_INDICATOR_STATUS, index, status); 3091d3bd1e5SMatthias Ringwald parse_hf(packet); 3101d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_OK, context.command); 3111d3bd1e5SMatthias Ringwald CHECK_EQUAL(status, context.ag_indicators[index - 1].status); 3121d3bd1e5SMatthias Ringwald 3131d3bd1e5SMatthias Ringwald // callheld status 3141d3bd1e5SMatthias Ringwald index = callheld_status_index; 31520d8d1cfSMatthias Ringwald snprintf(packet, sizeof(packet), "\r\n%s:%d,%d\r\n\r\nOK\r\n", HFP_TRANSFER_AG_INDICATOR_STATUS, index, status); 3161d3bd1e5SMatthias Ringwald parse_hf(packet); 3171d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_OK, context.command); 3181d3bd1e5SMatthias Ringwald CHECK_EQUAL(status, context.ag_indicators[index - 1].status); 3191d3bd1e5SMatthias Ringwald } 3201d3bd1e5SMatthias Ringwald 3211d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_LIST_CURRENT_CALLS_1){ 3221d3bd1e5SMatthias Ringwald strcpy(packet, "\r\n+CLCC: 1,2,3,4,5,,129\r\n"); 3231d3bd1e5SMatthias Ringwald parse_hf(packet); 3241d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_LIST_CURRENT_CALLS, context.command); 3251d3bd1e5SMatthias Ringwald CHECK_EQUAL(1, context.clcc_idx); 3261d3bd1e5SMatthias Ringwald CHECK_EQUAL(2, context.clcc_dir); 3271d3bd1e5SMatthias Ringwald CHECK_EQUAL(3, context.clcc_status); 3281d3bd1e5SMatthias Ringwald CHECK_EQUAL(4, context.clcc_mode); 3291d3bd1e5SMatthias Ringwald CHECK_EQUAL(5, context.clcc_mpty); 3301d3bd1e5SMatthias Ringwald STRCMP_EQUAL("", context.bnip_number); 3311d3bd1e5SMatthias Ringwald CHECK_EQUAL(129, context.bnip_type); 3321d3bd1e5SMatthias Ringwald } 3331d3bd1e5SMatthias Ringwald 3341d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_LIST_CURRENT_CALLS_2){ 3351d3bd1e5SMatthias Ringwald strcpy(packet, "\r\n+CLCC: 1,2,3,4,5,"",129\r\n"); 3361d3bd1e5SMatthias Ringwald parse_hf(packet); 3371d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_LIST_CURRENT_CALLS, context.command); 3381d3bd1e5SMatthias Ringwald CHECK_EQUAL(1, context.clcc_idx); 3391d3bd1e5SMatthias Ringwald CHECK_EQUAL(2, context.clcc_dir); 3401d3bd1e5SMatthias Ringwald CHECK_EQUAL(3, context.clcc_status); 3411d3bd1e5SMatthias Ringwald CHECK_EQUAL(4, context.clcc_mode); 3421d3bd1e5SMatthias Ringwald CHECK_EQUAL(5, context.clcc_mpty); 3431d3bd1e5SMatthias Ringwald STRCMP_EQUAL("", context.bnip_number); 3441d3bd1e5SMatthias Ringwald CHECK_EQUAL(129, context.bnip_type); 3451d3bd1e5SMatthias Ringwald } 3461d3bd1e5SMatthias Ringwald 3471d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_AG_SUPPORTED_FEATURES){ 34820d8d1cfSMatthias Ringwald snprintf(packet, sizeof(packet), "\r\nAT%s=159\r\n", HFP_SUPPORTED_FEATURES); 3491d3bd1e5SMatthias Ringwald //context.keep_separator = 0; 3501d3bd1e5SMatthias Ringwald parse_ag(packet); 3511d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_SUPPORTED_FEATURES, context.command); 3521d3bd1e5SMatthias Ringwald CHECK_EQUAL(159, context.remote_supported_features); 3531d3bd1e5SMatthias Ringwald } 3541d3bd1e5SMatthias Ringwald 3551d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_AG_AVAILABLE_CODECS){ 35620d8d1cfSMatthias Ringwald snprintf(packet, sizeof(packet), "\r\nAT%s=0,1,2\r\n", HFP_AVAILABLE_CODECS); 3571d3bd1e5SMatthias Ringwald parse_ag(packet); 3581d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_AVAILABLE_CODECS, context.command); 3591d3bd1e5SMatthias Ringwald CHECK_EQUAL(3, context.remote_codecs_nr); 3601d3bd1e5SMatthias Ringwald for (pos = 0; pos < 3; pos++){ 3611d3bd1e5SMatthias Ringwald CHECK_EQUAL(pos, context.remote_codecs[pos]); 3621d3bd1e5SMatthias Ringwald } 3631d3bd1e5SMatthias Ringwald } 3641d3bd1e5SMatthias Ringwald 3651d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_AG_GENERIC_STATUS_INDICATOR){ 36620d8d1cfSMatthias Ringwald snprintf(packet, sizeof(packet), "\r\nAT%s=0,1,2,3,4\r\n", HFP_GENERIC_STATUS_INDICATOR); 3671d3bd1e5SMatthias Ringwald parse_ag(packet); 3681d3bd1e5SMatthias Ringwald CHECK_EQUAL(context.command, HFP_CMD_LIST_GENERIC_STATUS_INDICATORS); 3691d3bd1e5SMatthias Ringwald CHECK_EQUAL(5, context.generic_status_indicators_nr); 3701d3bd1e5SMatthias Ringwald 3711d3bd1e5SMatthias Ringwald for (pos = 0; pos < context.generic_status_indicators_nr; pos++){ 3721d3bd1e5SMatthias Ringwald CHECK_EQUAL(pos, context.generic_status_indicators[pos].uuid); 3731d3bd1e5SMatthias Ringwald } 3741d3bd1e5SMatthias Ringwald } 3751d3bd1e5SMatthias Ringwald 3761d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_AG_ENABLE_INDICATOR_STATUS_UPDATE){ 37720d8d1cfSMatthias Ringwald snprintf(packet, sizeof(packet), "\r\nAT%s=3,0,0,1\r\n", HFP_ENABLE_STATUS_UPDATE_FOR_AG_INDICATORS); 3781d3bd1e5SMatthias Ringwald parse_ag(packet); 3791d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_ENABLE_INDICATOR_STATUS_UPDATE, context.command); 3801d3bd1e5SMatthias Ringwald CHECK_EQUAL(1, context.enable_status_update_for_ag_indicators); 3811d3bd1e5SMatthias Ringwald } 3821d3bd1e5SMatthias Ringwald 3831d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_AG_ENABLE_INDIVIDUAL_INDICATOR_STATUS_UPDATE){ 3841d3bd1e5SMatthias Ringwald hfp_ag_init_ag_indicators(hfp_ag_indicators_nr, (hfp_ag_indicator_t *)&hfp_ag_indicators); 3851d3bd1e5SMatthias Ringwald context.ag_indicators_nr = hfp_ag_indicators_nr; 3861d3bd1e5SMatthias Ringwald memcpy(context.ag_indicators, hfp_ag_indicators, hfp_ag_indicators_nr * sizeof(hfp_ag_indicator_t)); 3871d3bd1e5SMatthias Ringwald 3881d3bd1e5SMatthias Ringwald for (pos = 0; pos < hfp_ag_indicators_nr; pos++){ 3891d3bd1e5SMatthias Ringwald CHECK_EQUAL(hfp_ag_indicators[pos].index, hfp_ag_get_ag_indicators(&context)[pos].index ); 3901d3bd1e5SMatthias Ringwald CHECK_EQUAL(hfp_ag_indicators[pos].enabled, hfp_ag_get_ag_indicators(&context)[pos].enabled); 3911d3bd1e5SMatthias Ringwald CHECK_EQUAL(hfp_ag_indicators[pos].index, context.ag_indicators[pos].index); 3921d3bd1e5SMatthias Ringwald CHECK_EQUAL(hfp_ag_indicators[pos].enabled, context.ag_indicators[pos].enabled); 3931d3bd1e5SMatthias Ringwald } 39420d8d1cfSMatthias Ringwald snprintf(packet, sizeof(packet), "\r\nAT%s=0,0,0,0,0,0,0\r\n", 3951d3bd1e5SMatthias Ringwald HFP_UPDATE_ENABLE_STATUS_FOR_INDIVIDUAL_AG_INDICATORS); 3961d3bd1e5SMatthias Ringwald parse_ag(packet); 3971d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_ENABLE_INDIVIDUAL_AG_INDICATOR_STATUS_UPDATE, context.command); 3981d3bd1e5SMatthias Ringwald 3991d3bd1e5SMatthias Ringwald for (pos = 0; pos < hfp_ag_indicators_nr; pos++){ 4001d3bd1e5SMatthias Ringwald if (hfp_ag_get_ag_indicators(&context)[pos].mandatory){ 4011d3bd1e5SMatthias Ringwald CHECK_EQUAL(1, hfp_ag_get_ag_indicators(&context)[pos].enabled); 4021d3bd1e5SMatthias Ringwald CHECK_EQUAL(1, context.ag_indicators[pos].enabled); 4031d3bd1e5SMatthias Ringwald } else { 4041d3bd1e5SMatthias Ringwald CHECK_EQUAL(0, hfp_ag_get_ag_indicators(&context)[pos].enabled); 4051d3bd1e5SMatthias Ringwald CHECK_EQUAL(0, context.ag_indicators[pos].enabled); 4061d3bd1e5SMatthias Ringwald } 4071d3bd1e5SMatthias Ringwald } 4081d3bd1e5SMatthias Ringwald } 4091d3bd1e5SMatthias Ringwald 4101d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_AG_ENABLE_INDIVIDUAL_INDICATOR_STATUS_UPDATE_OPT_VALUES3){ 4111d3bd1e5SMatthias Ringwald hfp_ag_init_ag_indicators(hfp_ag_indicators_nr, (hfp_ag_indicator_t *)&hfp_ag_indicators); 4121d3bd1e5SMatthias Ringwald context.ag_indicators_nr = hfp_ag_indicators_nr; 4131d3bd1e5SMatthias Ringwald memcpy(context.ag_indicators, hfp_ag_indicators, hfp_ag_indicators_nr * sizeof(hfp_ag_indicator_t)); 4141d3bd1e5SMatthias Ringwald 41520d8d1cfSMatthias Ringwald snprintf(packet, sizeof(packet), "\r\nAT%s=,1,,,,,1\r\n", 4161d3bd1e5SMatthias Ringwald HFP_UPDATE_ENABLE_STATUS_FOR_INDIVIDUAL_AG_INDICATORS); 4171d3bd1e5SMatthias Ringwald parse_ag(packet); 4181d3bd1e5SMatthias Ringwald 4191d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_ENABLE_INDIVIDUAL_AG_INDICATOR_STATUS_UPDATE, context.command); 4201d3bd1e5SMatthias Ringwald 4211d3bd1e5SMatthias Ringwald for (pos = 0; pos < hfp_ag_indicators_nr; pos++){ 4221d3bd1e5SMatthias Ringwald CHECK_EQUAL(hfp_ag_indicators[pos].index, hfp_ag_get_ag_indicators(&context)[pos].index ); 4231d3bd1e5SMatthias Ringwald CHECK_EQUAL(hfp_ag_indicators[pos].enabled, hfp_ag_get_ag_indicators(&context)[pos].enabled); 4241d3bd1e5SMatthias Ringwald CHECK_EQUAL(hfp_ag_indicators[pos].index, context.ag_indicators[pos].index ); 4251d3bd1e5SMatthias Ringwald CHECK_EQUAL(hfp_ag_indicators[pos].enabled, context.ag_indicators[pos].enabled); 4261d3bd1e5SMatthias Ringwald } 4271d3bd1e5SMatthias Ringwald } 4281d3bd1e5SMatthias Ringwald 4291d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_AG_ENABLE_INDIVIDUAL_INDICATOR_STATUS_UPDATE_OPT_VALUES2){ 4301d3bd1e5SMatthias Ringwald hfp_ag_init_ag_indicators(hfp_ag_indicators_nr, (hfp_ag_indicator_t *)&hfp_ag_indicators); 4311d3bd1e5SMatthias Ringwald context.ag_indicators_nr = hfp_ag_indicators_nr; 4321d3bd1e5SMatthias Ringwald memcpy(context.ag_indicators, hfp_ag_indicators, hfp_ag_indicators_nr * sizeof(hfp_ag_indicator_t)); 4331d3bd1e5SMatthias Ringwald 43420d8d1cfSMatthias Ringwald snprintf(packet, sizeof(packet), "\r\nAT%s=1,,,1,1,1,\r\n", 4351d3bd1e5SMatthias Ringwald HFP_UPDATE_ENABLE_STATUS_FOR_INDIVIDUAL_AG_INDICATORS); 4361d3bd1e5SMatthias Ringwald parse_ag(packet); 4371d3bd1e5SMatthias Ringwald 4381d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_ENABLE_INDIVIDUAL_AG_INDICATOR_STATUS_UPDATE, context.command); 4391d3bd1e5SMatthias Ringwald 4401d3bd1e5SMatthias Ringwald for (pos = 0; pos < hfp_ag_indicators_nr; pos++){ 4411d3bd1e5SMatthias Ringwald CHECK_EQUAL(1,hfp_ag_get_ag_indicators(&context)[pos].enabled); 4421d3bd1e5SMatthias Ringwald CHECK_EQUAL(1, context.ag_indicators[pos].enabled); 4431d3bd1e5SMatthias Ringwald } 4441d3bd1e5SMatthias Ringwald } 4451d3bd1e5SMatthias Ringwald 4461d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_AG_ENABLE_INDIVIDUAL_INDICATOR_STATUS_UPDATE_OPT_VALUES1){ 4471d3bd1e5SMatthias Ringwald hfp_ag_init_ag_indicators(hfp_ag_indicators_nr, (hfp_ag_indicator_t *)&hfp_ag_indicators); 4481d3bd1e5SMatthias Ringwald context.ag_indicators_nr = hfp_ag_indicators_nr; 4491d3bd1e5SMatthias Ringwald memcpy(context.ag_indicators, hfp_ag_indicators, hfp_ag_indicators_nr * sizeof(hfp_ag_indicator_t)); 4501d3bd1e5SMatthias Ringwald 45120d8d1cfSMatthias Ringwald snprintf(packet, sizeof(packet), "\r\nAT%s=1,,,1,1,1,\r\n", 4521d3bd1e5SMatthias Ringwald HFP_UPDATE_ENABLE_STATUS_FOR_INDIVIDUAL_AG_INDICATORS); 4531d3bd1e5SMatthias Ringwald parse_ag(packet); 4541d3bd1e5SMatthias Ringwald 4551d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_ENABLE_INDIVIDUAL_AG_INDICATOR_STATUS_UPDATE, context.command); 4561d3bd1e5SMatthias Ringwald 4571d3bd1e5SMatthias Ringwald for (pos = 0; pos < hfp_ag_indicators_nr; pos++){ 4581d3bd1e5SMatthias Ringwald CHECK_EQUAL(1, hfp_ag_get_ag_indicators(&context)[pos].enabled); 4591d3bd1e5SMatthias Ringwald CHECK_EQUAL(1, context.ag_indicators[pos].enabled); 4601d3bd1e5SMatthias Ringwald } 4611d3bd1e5SMatthias Ringwald } 4621d3bd1e5SMatthias Ringwald 4631d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_AG_HF_QUERY_OPERATOR_SELECTION){ 4641d3bd1e5SMatthias Ringwald context.network_operator.format = 0xff; 46520d8d1cfSMatthias Ringwald snprintf(packet, sizeof(packet), "\r\nAT%s=3,0\r\n", HFP_QUERY_OPERATOR_SELECTION); 4661d3bd1e5SMatthias Ringwald 4671d3bd1e5SMatthias Ringwald parse_ag(packet); 4681d3bd1e5SMatthias Ringwald CHECK_EQUAL(0, context.operator_name_changed); 4691d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_QUERY_OPERATOR_SELECTION_NAME_FORMAT, context.command); 4701d3bd1e5SMatthias Ringwald 47120d8d1cfSMatthias Ringwald snprintf(packet, sizeof(packet), "\r\nAT%s?\r\n", HFP_QUERY_OPERATOR_SELECTION); 4721d3bd1e5SMatthias Ringwald 4731d3bd1e5SMatthias Ringwald parse_ag(packet); 4741d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_QUERY_OPERATOR_SELECTION_NAME, context.command); 4751d3bd1e5SMatthias Ringwald CHECK_EQUAL(0, context.operator_name_changed); 4761d3bd1e5SMatthias Ringwald } 4771d3bd1e5SMatthias Ringwald 4781d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_AG_EXTENDED_AUDIO_GATEWAY_ERROR){ 47920d8d1cfSMatthias Ringwald snprintf(packet, sizeof(packet), "\r\nAT%s=1\r\n", HFP_ENABLE_EXTENDED_AUDIO_GATEWAY_ERROR); 4801d3bd1e5SMatthias Ringwald 4811d3bd1e5SMatthias Ringwald parse_ag(packet); 4821d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_ENABLE_EXTENDED_AUDIO_GATEWAY_ERROR, context.command ); 4831d3bd1e5SMatthias Ringwald CHECK_EQUAL(1, context.enable_extended_audio_gateway_error_report); 4841d3bd1e5SMatthias Ringwald } 4851d3bd1e5SMatthias Ringwald 4861d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_AG_TRIGGER_CODEC_CONNECTION_SETUP){ 48720d8d1cfSMatthias Ringwald snprintf(packet, sizeof(packet), "\r\nAT%s\r\n", HFP_TRIGGER_CODEC_CONNECTION_SETUP); 4881d3bd1e5SMatthias Ringwald parse_ag(packet); 4891d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_TRIGGER_CODEC_CONNECTION_SETUP, context.command); 4901d3bd1e5SMatthias Ringwald } 4911d3bd1e5SMatthias Ringwald 4921d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_AG_CONFIRM_COMMON_CODEC){ 4931d3bd1e5SMatthias Ringwald int codec = 2; 49420d8d1cfSMatthias Ringwald snprintf(packet, sizeof(packet), "\r\nAT%s=%d\r\n", HFP_CONFIRM_COMMON_CODEC, codec); 4951d3bd1e5SMatthias Ringwald 4961d3bd1e5SMatthias Ringwald parse_ag(packet); 4971d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_HF_CONFIRMED_CODEC, context.command ); 4981d3bd1e5SMatthias Ringwald CHECK_EQUAL(codec, context.codec_confirmed); 4991d3bd1e5SMatthias Ringwald } 5001d3bd1e5SMatthias Ringwald 5011d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_AG_DIAL){ 5021d3bd1e5SMatthias Ringwald strcpy(packet, "\r\nATD00123456789;\r\n"); 5031d3bd1e5SMatthias Ringwald 5041d3bd1e5SMatthias Ringwald parse_ag(packet); 5051d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_CALL_PHONE_NUMBER, context.command); 5061d3bd1e5SMatthias Ringwald STRCMP_EQUAL("00123456789", (const char *) &context.line_buffer[3]); 5071d3bd1e5SMatthias Ringwald } 5081d3bd1e5SMatthias Ringwald 5091d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_ANSWER_CALL){ 51020d8d1cfSMatthias Ringwald snprintf(packet, sizeof(packet), "\r\n%s\r\n", HFP_ANSWER_CALL); 5111d3bd1e5SMatthias Ringwald parse_ag(packet); 5121d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_CALL_ANSWERED, context.command); 5131d3bd1e5SMatthias Ringwald } 5141d3bd1e5SMatthias Ringwald 5151d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_CMD_RESPONSE_AND_HOLD_QUERY){ 51620d8d1cfSMatthias Ringwald snprintf(packet, sizeof(packet), "\r\nAT%s?\r\n", HFP_RESPONSE_AND_HOLD); 5171d3bd1e5SMatthias Ringwald parse_ag(packet); 5181d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_RESPONSE_AND_HOLD_QUERY, context.command); 5191d3bd1e5SMatthias Ringwald } 5201d3bd1e5SMatthias Ringwald 5211d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_CMD_RESPONSE_AND_HOLD_COMMAND){ 5221d3bd1e5SMatthias Ringwald int param = 1; 52320d8d1cfSMatthias Ringwald snprintf(packet, sizeof(packet), "\r\nAT%s=%u\r\n", HFP_RESPONSE_AND_HOLD, param); 5241d3bd1e5SMatthias Ringwald parse_ag(packet); 5251d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_RESPONSE_AND_HOLD_COMMAND, context.command); 5261d3bd1e5SMatthias Ringwald CHECK_EQUAL(param, context.ag_response_and_hold_action); 5271d3bd1e5SMatthias Ringwald } 5281d3bd1e5SMatthias Ringwald 5291d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_CMD_RESPONSE_AND_HOLD_STATUS){ 5301d3bd1e5SMatthias Ringwald int status = 1; 53120d8d1cfSMatthias Ringwald snprintf(packet, sizeof(packet), "\r\n%s:%u\r\n", HFP_RESPONSE_AND_HOLD, status); 5321d3bd1e5SMatthias Ringwald parse_hf(packet); 5331d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_RESPONSE_AND_HOLD_STATUS, context.command); 5341d3bd1e5SMatthias Ringwald } 5351d3bd1e5SMatthias Ringwald 5361d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_CMD_ENABLE_CLIP){ 5371d3bd1e5SMatthias Ringwald int param = 1; 53820d8d1cfSMatthias Ringwald snprintf(packet, sizeof(packet), "\r\nAT%s=%u\r\n", HFP_ENABLE_CLIP, param); 5391d3bd1e5SMatthias Ringwald parse_ag(packet); 5401d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_ENABLE_CLIP, context.command); 5411d3bd1e5SMatthias Ringwald CHECK_EQUAL(param, context.clip_enabled); 5421d3bd1e5SMatthias Ringwald } 5431d3bd1e5SMatthias Ringwald 544016a59dfSMatthias Ringwald TEST(HFPParser, HFP_CMD_AG_SENT_CLIP_INFORMATION_a){ 545016a59dfSMatthias Ringwald // default/minimal 546016a59dfSMatthias Ringwald parse_hf("\r\n+CLIP: \"+123456789\",145\r\n"); 547016a59dfSMatthias Ringwald CHECK_EQUAL(HFP_CMD_AG_SENT_CLIP_INFORMATION, context.command); 548016a59dfSMatthias Ringwald STRCMP_EQUAL("+123456789", context.bnip_number); 549016a59dfSMatthias Ringwald CHECK_EQUAL(145, context.bnip_type); 550016a59dfSMatthias Ringwald CHECK_EQUAL(false, context.clip_have_alpha); 551016a59dfSMatthias Ringwald } 552016a59dfSMatthias Ringwald 553016a59dfSMatthias Ringwald TEST(HFPParser, HFP_CMD_AG_SENT_CLIP_INFORMATION_b){ 554016a59dfSMatthias Ringwald // iOS 555016a59dfSMatthias Ringwald parse_hf("\r\n+CLIP: \"+123456789\",145,,,\"BlueKitchen GmbH\"\r\n"); 556016a59dfSMatthias Ringwald CHECK_EQUAL(HFP_CMD_AG_SENT_CLIP_INFORMATION, context.command); 557016a59dfSMatthias Ringwald STRCMP_EQUAL("+123456789", context.bnip_number); 558016a59dfSMatthias Ringwald CHECK_EQUAL(145, context.bnip_type); 559016a59dfSMatthias Ringwald CHECK_EQUAL(true, context.clip_have_alpha); 560016a59dfSMatthias Ringwald STRCMP_EQUAL("BlueKitchen GmbH", (const char *)context.line_buffer); 561016a59dfSMatthias Ringwald } 562016a59dfSMatthias Ringwald 563016a59dfSMatthias Ringwald TEST(HFPParser, HFP_CMD_AG_SENT_CLIP_INFORMATION_c){ 564016a59dfSMatthias Ringwald // older iOS with additional ',' 565016a59dfSMatthias Ringwald parse_hf("\r\n+CLIP: \"+123456789\",145,,,,\"BlueKitchen GmbH\"\r\n"); 566016a59dfSMatthias Ringwald CHECK_EQUAL(HFP_CMD_AG_SENT_CLIP_INFORMATION, context.command); 567016a59dfSMatthias Ringwald STRCMP_EQUAL("+123456789", context.bnip_number); 568016a59dfSMatthias Ringwald CHECK_EQUAL(145, context.bnip_type); 569016a59dfSMatthias Ringwald CHECK_EQUAL(true, context.clip_have_alpha); 570016a59dfSMatthias Ringwald STRCMP_EQUAL("BlueKitchen GmbH", (const char *)context.line_buffer); 571016a59dfSMatthias Ringwald } 572016a59dfSMatthias Ringwald 573016a59dfSMatthias Ringwald TEST(HFPParser, HFP_CMD_AG_SENT_CLIP_INFORMATION_d){ 574016a59dfSMatthias Ringwald // BlackBerry, additional quotes 575016a59dfSMatthias Ringwald parse_hf("\r\n+CLIP: \"+123456789\",145,\"\",,\"BlueKitchen GmbH\"\r\n"); 576016a59dfSMatthias Ringwald CHECK_EQUAL(HFP_CMD_AG_SENT_CLIP_INFORMATION, context.command); 577016a59dfSMatthias Ringwald STRCMP_EQUAL("+123456789", context.bnip_number); 578016a59dfSMatthias Ringwald CHECK_EQUAL(145, context.bnip_type); 579016a59dfSMatthias Ringwald CHECK_EQUAL(true, context.clip_have_alpha); 580016a59dfSMatthias Ringwald STRCMP_EQUAL("BlueKitchen GmbH", (const char *)context.line_buffer); 581016a59dfSMatthias Ringwald } 582016a59dfSMatthias Ringwald 583da8e14c5SMatthias Ringwald TEST(HFPParser, HFP_CMD_AG_SENT_CALL_WAITING_INFORMATION){ 584da8e14c5SMatthias Ringwald parse_hf("\r\n+CCWA: \"+123456789\",145,\"\",1,\"BlueKitchen GmbH\"\r\n"); 585da8e14c5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_AG_SENT_CALL_WAITING_NOTIFICATION_UPDATE, context.command); 586da8e14c5SMatthias Ringwald STRCMP_EQUAL("+123456789", context.bnip_number); 587da8e14c5SMatthias Ringwald CHECK_EQUAL(145, context.bnip_type); 588da8e14c5SMatthias Ringwald CHECK_EQUAL(true, context.clip_have_alpha); 589da8e14c5SMatthias Ringwald STRCMP_EQUAL("BlueKitchen GmbH", (const char *)context.line_buffer); 590da8e14c5SMatthias Ringwald } 591da8e14c5SMatthias Ringwald 592*d2621a77SMatthias Ringwald // #define LOG_LINE_BUFFER 593*d2621a77SMatthias Ringwald static void hfp_at_parser_test_dump_line_buffer(void){ 594*d2621a77SMatthias Ringwald #ifdef LOG_LINE_BUFFER 595*d2621a77SMatthias Ringwald uint16_t line_len = strlen(reinterpret_cast<const char *>(context.line_buffer)); 596*d2621a77SMatthias Ringwald printf("\nLine buffer: %s\n", context.line_buffer); 597*d2621a77SMatthias Ringwald printf_hexdump(context.line_buffer, line_len); 598*d2621a77SMatthias Ringwald #endif 599*d2621a77SMatthias Ringwald } 600*d2621a77SMatthias Ringwald 601*d2621a77SMatthias Ringwald TEST(HFPParser, custom_command_hf){ 602*d2621a77SMatthias Ringwald hfp_custom_at_command_t custom_hf_command = { 603*d2621a77SMatthias Ringwald .command = "+FOO:", 604*d2621a77SMatthias Ringwald .command_id = 1 605*d2621a77SMatthias Ringwald }; 606*d2621a77SMatthias Ringwald const char * custom_hf_command_string = "\r\n+FOO:1,2,3\r\n"; 607*d2621a77SMatthias Ringwald hfp_register_custom_hf_command(&custom_hf_command); 608*d2621a77SMatthias Ringwald parse_hf(custom_hf_command_string); 609*d2621a77SMatthias Ringwald CHECK_EQUAL(1, context.custom_at_command_id); 610*d2621a77SMatthias Ringwald hfp_at_parser_test_dump_line_buffer(); 611*d2621a77SMatthias Ringwald } 612*d2621a77SMatthias Ringwald 613*d2621a77SMatthias Ringwald TEST(HFPParser, custom_command_ag_with_colon){ 614*d2621a77SMatthias Ringwald hfp_custom_at_command_t custom_ag_command = { 615*d2621a77SMatthias Ringwald .command = "AT+FOO:", 616*d2621a77SMatthias Ringwald .command_id = 2 617*d2621a77SMatthias Ringwald }; 618*d2621a77SMatthias Ringwald const char * custom_hf_command_string = "\r\nAT+FOO:1,2,3\r\n"; 619*d2621a77SMatthias Ringwald hfp_register_custom_ag_command(&custom_ag_command); 620*d2621a77SMatthias Ringwald parse_ag(custom_hf_command_string); 621*d2621a77SMatthias Ringwald CHECK_EQUAL(2, context.custom_at_command_id); 622*d2621a77SMatthias Ringwald hfp_at_parser_test_dump_line_buffer(); 623*d2621a77SMatthias Ringwald } 624*d2621a77SMatthias Ringwald 625*d2621a77SMatthias Ringwald TEST(HFPParser, custom_command_ag_with_question){ 626*d2621a77SMatthias Ringwald hfp_custom_at_command_t custom_ag_command = { 627*d2621a77SMatthias Ringwald .command = "AT+FOO?", 628*d2621a77SMatthias Ringwald .command_id = 3 629*d2621a77SMatthias Ringwald }; 630*d2621a77SMatthias Ringwald const char * custom_hf_command_string = "\r\nAT+FOO?\r\n"; 631*d2621a77SMatthias Ringwald hfp_register_custom_ag_command(&custom_ag_command); 632*d2621a77SMatthias Ringwald parse_ag(custom_hf_command_string); 633*d2621a77SMatthias Ringwald CHECK_EQUAL(3, context.custom_at_command_id); 634*d2621a77SMatthias Ringwald hfp_at_parser_test_dump_line_buffer(); 635*d2621a77SMatthias Ringwald } 636*d2621a77SMatthias Ringwald 6371d3bd1e5SMatthias Ringwald int main (int argc, const char * argv[]){ 6381d3bd1e5SMatthias Ringwald return CommandLineTestRunner::RunAllTests(argc, argv); 6391d3bd1e5SMatthias Ringwald } 640