1*1d3bd1e5SMatthias Ringwald /* 2*1d3bd1e5SMatthias Ringwald * Copyright (C) 2014 BlueKitchen GmbH 3*1d3bd1e5SMatthias Ringwald * 4*1d3bd1e5SMatthias Ringwald * Redistribution and use in source and binary forms, with or without 5*1d3bd1e5SMatthias Ringwald * modification, are permitted provided that the following conditions 6*1d3bd1e5SMatthias Ringwald * are met: 7*1d3bd1e5SMatthias Ringwald * 8*1d3bd1e5SMatthias Ringwald * 1. Redistributions of source code must retain the above copyright 9*1d3bd1e5SMatthias Ringwald * notice, this list of conditions and the following disclaimer. 10*1d3bd1e5SMatthias Ringwald * 2. Redistributions in binary form must reproduce the above copyright 11*1d3bd1e5SMatthias Ringwald * notice, this list of conditions and the following disclaimer in the 12*1d3bd1e5SMatthias Ringwald * documentation and/or other materials provided with the distribution. 13*1d3bd1e5SMatthias Ringwald * 3. Neither the name of the copyright holders nor the names of 14*1d3bd1e5SMatthias Ringwald * contributors may be used to endorse or promote products derived 15*1d3bd1e5SMatthias Ringwald * from this software without specific prior written permission. 16*1d3bd1e5SMatthias Ringwald * 4. Any redistribution, use, or modification is done solely for 17*1d3bd1e5SMatthias Ringwald * personal benefit and not for any commercial purpose or for 18*1d3bd1e5SMatthias Ringwald * monetary gain. 19*1d3bd1e5SMatthias Ringwald * 20*1d3bd1e5SMatthias Ringwald * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS 21*1d3bd1e5SMatthias Ringwald * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22*1d3bd1e5SMatthias Ringwald * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 23*1d3bd1e5SMatthias Ringwald * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS 24*1d3bd1e5SMatthias Ringwald * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 25*1d3bd1e5SMatthias Ringwald * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 26*1d3bd1e5SMatthias Ringwald * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 27*1d3bd1e5SMatthias Ringwald * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 28*1d3bd1e5SMatthias Ringwald * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 29*1d3bd1e5SMatthias Ringwald * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 30*1d3bd1e5SMatthias Ringwald * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31*1d3bd1e5SMatthias Ringwald * SUCH DAMAGE. 32*1d3bd1e5SMatthias Ringwald * 33*1d3bd1e5SMatthias Ringwald * Please inquire about commercial licensing options at 34*1d3bd1e5SMatthias Ringwald * [email protected] 35*1d3bd1e5SMatthias Ringwald * 36*1d3bd1e5SMatthias Ringwald */ 37*1d3bd1e5SMatthias Ringwald 38*1d3bd1e5SMatthias Ringwald 39*1d3bd1e5SMatthias Ringwald #include <stdint.h> 40*1d3bd1e5SMatthias Ringwald #include <stdio.h> 41*1d3bd1e5SMatthias Ringwald #include <stdlib.h> 42*1d3bd1e5SMatthias Ringwald #include <string.h> 43*1d3bd1e5SMatthias Ringwald 44*1d3bd1e5SMatthias Ringwald #include "CppUTest/TestHarness.h" 45*1d3bd1e5SMatthias Ringwald #include "CppUTest/CommandLineTestRunner.h" 46*1d3bd1e5SMatthias Ringwald 47*1d3bd1e5SMatthias Ringwald #include "classic/hfp.h" 48*1d3bd1e5SMatthias Ringwald #include "classic/hfp_ag.h" 49*1d3bd1e5SMatthias Ringwald 50*1d3bd1e5SMatthias Ringwald void hfp_parse(hfp_connection_t * context, uint8_t byte, int isHandsFree); 51*1d3bd1e5SMatthias Ringwald 52*1d3bd1e5SMatthias Ringwald static hfp_connection_t context; 53*1d3bd1e5SMatthias Ringwald static int hfp_ag_indicators_nr = 7; 54*1d3bd1e5SMatthias Ringwald static hfp_ag_indicator_t hfp_ag_indicators[] = { 55*1d3bd1e5SMatthias Ringwald // index, name, min range, max range, status, mandatory, enabled, status changed 56*1d3bd1e5SMatthias Ringwald {1, "service", 0, 1, 1, 0, 0, 0}, 57*1d3bd1e5SMatthias Ringwald {2, "call", 0, 1, 0, 1, 1, 0}, 58*1d3bd1e5SMatthias Ringwald {3, "callsetup", 0, 3, 0, 1, 1, 0}, 59*1d3bd1e5SMatthias Ringwald {4, "battchg", 0, 5, 3, 0, 0, 0}, 60*1d3bd1e5SMatthias Ringwald {5, "signal", 0, 5, 5, 0, 0, 0}, 61*1d3bd1e5SMatthias Ringwald {6, "roam", 0, 1, 0, 0, 0, 0}, 62*1d3bd1e5SMatthias Ringwald {7, "callheld", 0, 2, 0, 1, 1, 0} 63*1d3bd1e5SMatthias Ringwald }; 64*1d3bd1e5SMatthias Ringwald static uint8_t call_status_index = 2; 65*1d3bd1e5SMatthias Ringwald static uint8_t callsetup_status_index = 3; 66*1d3bd1e5SMatthias Ringwald static uint8_t callheld_status_index = 7; 67*1d3bd1e5SMatthias Ringwald 68*1d3bd1e5SMatthias Ringwald 69*1d3bd1e5SMatthias Ringwald static void parse_ag(const char * packet){ 70*1d3bd1e5SMatthias Ringwald for (uint16_t pos = 0; pos < strlen(packet); pos++){ 71*1d3bd1e5SMatthias Ringwald hfp_parse(&context, packet[pos], 0); 72*1d3bd1e5SMatthias Ringwald } 73*1d3bd1e5SMatthias Ringwald } 74*1d3bd1e5SMatthias Ringwald 75*1d3bd1e5SMatthias Ringwald static void parse_hf(const char * packet){ 76*1d3bd1e5SMatthias Ringwald for (uint16_t pos = 0; pos < strlen(packet); pos++){ 77*1d3bd1e5SMatthias Ringwald hfp_parse(&context, packet[pos], 1); 78*1d3bd1e5SMatthias Ringwald } 79*1d3bd1e5SMatthias Ringwald } 80*1d3bd1e5SMatthias Ringwald 81*1d3bd1e5SMatthias Ringwald TEST_GROUP(HFPParser){ 82*1d3bd1e5SMatthias Ringwald char packet[200]; 83*1d3bd1e5SMatthias Ringwald int pos; 84*1d3bd1e5SMatthias Ringwald int offset; 85*1d3bd1e5SMatthias Ringwald 86*1d3bd1e5SMatthias Ringwald void setup(void){ 87*1d3bd1e5SMatthias Ringwald context.parser_state = HFP_PARSER_CMD_HEADER; 88*1d3bd1e5SMatthias Ringwald context.parser_item_index = 0; 89*1d3bd1e5SMatthias Ringwald context.line_size = 0; 90*1d3bd1e5SMatthias Ringwald context.ag_indicators_nr = 0; 91*1d3bd1e5SMatthias Ringwald context.remote_codecs_nr = 0; 92*1d3bd1e5SMatthias Ringwald memset(packet,0, sizeof(packet)); 93*1d3bd1e5SMatthias Ringwald } 94*1d3bd1e5SMatthias Ringwald }; 95*1d3bd1e5SMatthias Ringwald 96*1d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_HF_OK){ 97*1d3bd1e5SMatthias Ringwald sprintf(packet, "\r\n%s\r\n", HFP_OK); 98*1d3bd1e5SMatthias Ringwald parse_hf(packet); 99*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_OK, context.command); 100*1d3bd1e5SMatthias Ringwald } 101*1d3bd1e5SMatthias Ringwald 102*1d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_HF_SUPPORTED_FEATURES){ 103*1d3bd1e5SMatthias Ringwald sprintf(packet, "\r\n%s:1007\r\n\r\nOK\r\n", HFP_SUPPORTED_FEATURES); 104*1d3bd1e5SMatthias Ringwald parse_hf(packet); 105*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_OK, context.command); 106*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(1007, context.remote_supported_features); 107*1d3bd1e5SMatthias Ringwald } 108*1d3bd1e5SMatthias Ringwald 109*1d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_CMD_INDICATORS_QUERY){ 110*1d3bd1e5SMatthias Ringwald sprintf(packet, "\r\nAT%s?\r\n", HFP_INDICATOR); 111*1d3bd1e5SMatthias Ringwald parse_ag(packet); 112*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_RETRIEVE_AG_INDICATORS_STATUS, context.command); 113*1d3bd1e5SMatthias Ringwald } 114*1d3bd1e5SMatthias Ringwald 115*1d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_CMD_INDICATORS_RETRIEVE){ 116*1d3bd1e5SMatthias Ringwald sprintf(packet, "\r\nAT%s=?\r\n", HFP_INDICATOR); 117*1d3bd1e5SMatthias Ringwald parse_ag(packet); 118*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_RETRIEVE_AG_INDICATORS, context.command); 119*1d3bd1e5SMatthias Ringwald } 120*1d3bd1e5SMatthias Ringwald 121*1d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_HF_INDICATORS){ 122*1d3bd1e5SMatthias Ringwald offset = 0; 123*1d3bd1e5SMatthias Ringwald offset += snprintf(packet, sizeof(packet), "%s:", HFP_INDICATOR); 124*1d3bd1e5SMatthias Ringwald for (pos = 0; pos < hfp_ag_indicators_nr; pos++){ 125*1d3bd1e5SMatthias Ringwald if (pos != 0) { 126*1d3bd1e5SMatthias Ringwald packet[offset++] = ','; 127*1d3bd1e5SMatthias Ringwald } 128*1d3bd1e5SMatthias 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); 129*1d3bd1e5SMatthias Ringwald } 130*1d3bd1e5SMatthias Ringwald offset += snprintf(packet+offset, sizeof(packet)-offset, "\r\n\r\nOK\r\n"); 131*1d3bd1e5SMatthias Ringwald context.state = HFP_W4_RETRIEVE_INDICATORS; 132*1d3bd1e5SMatthias Ringwald 133*1d3bd1e5SMatthias Ringwald parse_hf(packet); 134*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_OK, context.command); 135*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(hfp_ag_indicators_nr, context.ag_indicators_nr); 136*1d3bd1e5SMatthias Ringwald for (pos = 0; pos < hfp_ag_indicators_nr; pos++){ 137*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(hfp_ag_indicators[pos].index, context.ag_indicators[pos].index); 138*1d3bd1e5SMatthias Ringwald STRCMP_EQUAL(hfp_ag_indicators[pos].name, context.ag_indicators[pos].name); 139*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(hfp_ag_indicators[pos].min_range, context.ag_indicators[pos].min_range); 140*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(hfp_ag_indicators[pos].max_range, context.ag_indicators[pos].max_range); 141*1d3bd1e5SMatthias Ringwald } 142*1d3bd1e5SMatthias Ringwald } 143*1d3bd1e5SMatthias Ringwald 144*1d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_HF_INDICATORS_RANGE){ 145*1d3bd1e5SMatthias Ringwald offset = 0; 146*1d3bd1e5SMatthias Ringwald offset += snprintf(packet, sizeof(packet), "%s:", HFP_INDICATOR); 147*1d3bd1e5SMatthias Ringwald for (pos = 0; pos < hfp_ag_indicators_nr; pos++){ 148*1d3bd1e5SMatthias Ringwald if (pos != 0) { 149*1d3bd1e5SMatthias Ringwald packet[offset++] = ','; 150*1d3bd1e5SMatthias Ringwald } 151*1d3bd1e5SMatthias 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); 152*1d3bd1e5SMatthias Ringwald } 153*1d3bd1e5SMatthias Ringwald offset += snprintf(packet+offset, sizeof(packet)-offset, "\r\n\r\nOK\r\n"); 154*1d3bd1e5SMatthias Ringwald context.state = HFP_W4_RETRIEVE_INDICATORS; 155*1d3bd1e5SMatthias Ringwald 156*1d3bd1e5SMatthias Ringwald parse_hf(packet); 157*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_OK, context.command); 158*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(hfp_ag_indicators_nr, context.ag_indicators_nr); 159*1d3bd1e5SMatthias Ringwald for (pos = 0; pos < hfp_ag_indicators_nr; pos++){ 160*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(hfp_ag_indicators[pos].index, context.ag_indicators[pos].index); 161*1d3bd1e5SMatthias Ringwald STRCMP_EQUAL(hfp_ag_indicators[pos].name, context.ag_indicators[pos].name); 162*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(hfp_ag_indicators[pos].min_range, context.ag_indicators[pos].min_range); 163*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(hfp_ag_indicators[pos].max_range, context.ag_indicators[pos].max_range); 164*1d3bd1e5SMatthias Ringwald } 165*1d3bd1e5SMatthias Ringwald } 166*1d3bd1e5SMatthias Ringwald 167*1d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_HF_INDICATOR_STATUS){ 168*1d3bd1e5SMatthias Ringwald // send status 169*1d3bd1e5SMatthias Ringwald offset = 0; 170*1d3bd1e5SMatthias Ringwald offset += snprintf(packet, sizeof(packet), "%s:", HFP_INDICATOR); 171*1d3bd1e5SMatthias Ringwald for (pos = 0; pos < hfp_ag_indicators_nr - 1; pos++){ 172*1d3bd1e5SMatthias Ringwald offset += snprintf(packet+offset, sizeof(packet)-offset, "%d,", hfp_ag_indicators[pos].status); 173*1d3bd1e5SMatthias Ringwald } 174*1d3bd1e5SMatthias Ringwald offset += snprintf(packet+offset, sizeof(packet)-offset, "%d\r\n\r\nOK\r\n", hfp_ag_indicators[pos].status); 175*1d3bd1e5SMatthias Ringwald 176*1d3bd1e5SMatthias Ringwald //context.command = HFP_CMD_RETRIEVE_AG_INDICATORS_STATUS; 177*1d3bd1e5SMatthias Ringwald context.state = HFP_W4_RETRIEVE_INDICATORS_STATUS; 178*1d3bd1e5SMatthias Ringwald 179*1d3bd1e5SMatthias Ringwald parse_hf(packet); 180*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_OK, context.command); 181*1d3bd1e5SMatthias Ringwald for (pos = 0; pos < hfp_ag_indicators_nr; pos++){ 182*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(hfp_ag_indicators[pos].status, context.ag_indicators[pos].status); 183*1d3bd1e5SMatthias Ringwald } 184*1d3bd1e5SMatthias Ringwald } 185*1d3bd1e5SMatthias Ringwald 186*1d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_HF_SUPPORT_CALL_HOLD_AND_MULTIPARTY_SERVICES_TEST){ 187*1d3bd1e5SMatthias Ringwald sprintf(packet, "\r\nAT%s=?\r\n", HFP_SUPPORT_CALL_HOLD_AND_MULTIPARTY_SERVICES); 188*1d3bd1e5SMatthias Ringwald parse_ag(packet); 189*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_SUPPORT_CALL_HOLD_AND_MULTIPARTY_SERVICES, context.command); 190*1d3bd1e5SMatthias Ringwald } 191*1d3bd1e5SMatthias Ringwald 192*1d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_HF_SUPPORT_CALL_HOLD_AND_MULTIPARTY_SERVICES_SET){ 193*1d3bd1e5SMatthias Ringwald int action = 1; 194*1d3bd1e5SMatthias Ringwald int call_index = 2; 195*1d3bd1e5SMatthias Ringwald sprintf(packet, "\r\nAT%s=%u%u\r\n", HFP_SUPPORT_CALL_HOLD_AND_MULTIPARTY_SERVICES, action, call_index); 196*1d3bd1e5SMatthias Ringwald parse_ag(packet); 197*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_CALL_HOLD, context.command); 198*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(action, context.ag_call_hold_action); 199*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(call_index, context.call_index); 200*1d3bd1e5SMatthias Ringwald } 201*1d3bd1e5SMatthias Ringwald 202*1d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_HF_SUPPORT_CALL_HOLD_AND_MULTIPARTY_SERVICES){ 203*1d3bd1e5SMatthias Ringwald sprintf(packet, "\r\n%s:(1,1x,2,2x,3)\r\n\r\nOK\r\n", HFP_SUPPORT_CALL_HOLD_AND_MULTIPARTY_SERVICES); 204*1d3bd1e5SMatthias Ringwald parse_hf(packet); 205*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_OK, context.command); 206*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(5, context.remote_call_services_index); 207*1d3bd1e5SMatthias Ringwald 208*1d3bd1e5SMatthias Ringwald STRCMP_EQUAL("1", (char*)context.remote_call_services[0].name); 209*1d3bd1e5SMatthias Ringwald STRCMP_EQUAL("1x", (char*)context.remote_call_services[1].name); 210*1d3bd1e5SMatthias Ringwald STRCMP_EQUAL("2", (char*)context.remote_call_services[2].name); 211*1d3bd1e5SMatthias Ringwald STRCMP_EQUAL("2x", (char*)context.remote_call_services[3].name); 212*1d3bd1e5SMatthias Ringwald STRCMP_EQUAL("3", (char*)context.remote_call_services[4].name); 213*1d3bd1e5SMatthias Ringwald } 214*1d3bd1e5SMatthias Ringwald 215*1d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_GENERIC_STATUS_INDICATOR_TEST){ 216*1d3bd1e5SMatthias Ringwald sprintf(packet, "\r\nAT%s=?\r\n", HFP_GENERIC_STATUS_INDICATOR); 217*1d3bd1e5SMatthias Ringwald parse_ag(packet); 218*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_RETRIEVE_GENERIC_STATUS_INDICATORS, context.command); 219*1d3bd1e5SMatthias Ringwald } 220*1d3bd1e5SMatthias Ringwald 221*1d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_GENERIC_STATUS_INDICATOR_SET){ 222*1d3bd1e5SMatthias Ringwald int param = 1; 223*1d3bd1e5SMatthias Ringwald sprintf(packet, "\r\nAT%s=%u\r\n", HFP_GENERIC_STATUS_INDICATOR, param); 224*1d3bd1e5SMatthias Ringwald parse_ag(packet); 225*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_LIST_GENERIC_STATUS_INDICATORS, context.command); 226*1d3bd1e5SMatthias Ringwald } 227*1d3bd1e5SMatthias Ringwald 228*1d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_GENERIC_STATUS_INDICATOR_READ){ 229*1d3bd1e5SMatthias Ringwald sprintf(packet, "\r\nAT%s?\r\n", HFP_GENERIC_STATUS_INDICATOR); 230*1d3bd1e5SMatthias Ringwald parse_ag(packet); 231*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_RETRIEVE_GENERIC_STATUS_INDICATORS_STATE, context.command); 232*1d3bd1e5SMatthias Ringwald } 233*1d3bd1e5SMatthias Ringwald 234*1d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_HF_GENERIC_STATUS_INDICATOR_STATE){ 235*1d3bd1e5SMatthias Ringwald sprintf(packet, "\r\n%s:0,1\r\n\r\nOK\r\n", HFP_GENERIC_STATUS_INDICATOR); 236*1d3bd1e5SMatthias Ringwald // context.command = HFP_CMD_RETRIEVE_GENERIC_STATUS_INDICATORS_STATE; 237*1d3bd1e5SMatthias Ringwald context.state = HFP_W4_RETRIEVE_INITITAL_STATE_GENERIC_STATUS_INDICATORS; 238*1d3bd1e5SMatthias Ringwald 239*1d3bd1e5SMatthias Ringwald parse_hf(packet); 240*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_OK, context.command); 241*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(1, context.generic_status_indicators[0].state); 242*1d3bd1e5SMatthias Ringwald } 243*1d3bd1e5SMatthias Ringwald 244*1d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_HF_AG_INDICATOR_STATUS_UPDATE){ 245*1d3bd1e5SMatthias Ringwald context.ag_indicators_nr = hfp_ag_indicators_nr; 246*1d3bd1e5SMatthias Ringwald memcpy(context.ag_indicators, hfp_ag_indicators, hfp_ag_indicators_nr * sizeof(hfp_ag_indicator_t)); 247*1d3bd1e5SMatthias Ringwald 248*1d3bd1e5SMatthias Ringwald uint8_t index = 4; 249*1d3bd1e5SMatthias Ringwald uint8_t status = 5; 250*1d3bd1e5SMatthias Ringwald 251*1d3bd1e5SMatthias Ringwald sprintf(packet, "\r\n%s:%d,%d\r\n\r\nOK\r\n", HFP_TRANSFER_AG_INDICATOR_STATUS, index, status); 252*1d3bd1e5SMatthias Ringwald 253*1d3bd1e5SMatthias Ringwald parse_hf(packet); 254*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_OK, context.command); 255*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(status, context.ag_indicators[index - 1].status); 256*1d3bd1e5SMatthias Ringwald } 257*1d3bd1e5SMatthias Ringwald 258*1d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_HF_AG_QUERY_OPERATOR_SELECTION){ 259*1d3bd1e5SMatthias Ringwald sprintf(packet, "\r\n%s:1,0,\"sunrise\"\r\n\r\nOK\r\n", HFP_QUERY_OPERATOR_SELECTION); 260*1d3bd1e5SMatthias Ringwald 261*1d3bd1e5SMatthias Ringwald context.command = HFP_CMD_QUERY_OPERATOR_SELECTION_NAME; 262*1d3bd1e5SMatthias Ringwald 263*1d3bd1e5SMatthias Ringwald parse_hf(packet); 264*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_OK, context.command); 265*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(0, context.operator_name_changed); 266*1d3bd1e5SMatthias Ringwald STRCMP_EQUAL( "sunrise", context.network_operator.name); 267*1d3bd1e5SMatthias Ringwald } 268*1d3bd1e5SMatthias Ringwald 269*1d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_HF_ERROR){ 270*1d3bd1e5SMatthias Ringwald sprintf(packet, "\r\n%s\r\n", HFP_ERROR); 271*1d3bd1e5SMatthias Ringwald 272*1d3bd1e5SMatthias Ringwald parse_hf(packet); 273*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_ERROR, context.command); 274*1d3bd1e5SMatthias Ringwald } 275*1d3bd1e5SMatthias Ringwald 276*1d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_HF_EXTENDED_AUDIO_GATEWAY_ERROR){ 277*1d3bd1e5SMatthias Ringwald sprintf(packet, "\r\n%s:%d\r\n", HFP_EXTENDED_AUDIO_GATEWAY_ERROR, HFP_CME_ERROR_NO_NETWORK_SERVICE); 278*1d3bd1e5SMatthias Ringwald 279*1d3bd1e5SMatthias Ringwald parse_hf(packet); 280*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_EXTENDED_AUDIO_GATEWAY_ERROR, context.command); 281*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CME_ERROR_NO_NETWORK_SERVICE, context.extended_audio_gateway_error_value); 282*1d3bd1e5SMatthias Ringwald } 283*1d3bd1e5SMatthias Ringwald 284*1d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_HF_AG_INDICATOR_CALLS_STATUS_UPDATE){ 285*1d3bd1e5SMatthias Ringwald context.ag_indicators_nr = hfp_ag_indicators_nr; 286*1d3bd1e5SMatthias Ringwald memcpy(context.ag_indicators, hfp_ag_indicators, hfp_ag_indicators_nr * sizeof(hfp_ag_indicator_t)); 287*1d3bd1e5SMatthias Ringwald uint8_t status = 1; 288*1d3bd1e5SMatthias Ringwald 289*1d3bd1e5SMatthias Ringwald // call status 290*1d3bd1e5SMatthias Ringwald uint8_t index = call_status_index; 291*1d3bd1e5SMatthias Ringwald sprintf(packet, "\r\n%s:%d,%d\r\n\r\nOK\r\n", HFP_TRANSFER_AG_INDICATOR_STATUS, index, status); 292*1d3bd1e5SMatthias Ringwald parse_hf(packet); 293*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_OK, context.command); 294*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(status, context.ag_indicators[index - 1].status); 295*1d3bd1e5SMatthias Ringwald 296*1d3bd1e5SMatthias Ringwald // callsetup status 297*1d3bd1e5SMatthias Ringwald index = callsetup_status_index; 298*1d3bd1e5SMatthias Ringwald sprintf(packet, "\r\n%s:%d,%d\r\n\r\nOK\r\n", HFP_TRANSFER_AG_INDICATOR_STATUS, index, status); 299*1d3bd1e5SMatthias Ringwald parse_hf(packet); 300*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_OK, context.command); 301*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(status, context.ag_indicators[index - 1].status); 302*1d3bd1e5SMatthias Ringwald 303*1d3bd1e5SMatthias Ringwald // callheld status 304*1d3bd1e5SMatthias Ringwald index = callheld_status_index; 305*1d3bd1e5SMatthias Ringwald sprintf(packet, "\r\n%s:%d,%d\r\n\r\nOK\r\n", HFP_TRANSFER_AG_INDICATOR_STATUS, index, status); 306*1d3bd1e5SMatthias Ringwald parse_hf(packet); 307*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_OK, context.command); 308*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(status, context.ag_indicators[index - 1].status); 309*1d3bd1e5SMatthias Ringwald } 310*1d3bd1e5SMatthias Ringwald 311*1d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_LIST_CURRENT_CALLS_1){ 312*1d3bd1e5SMatthias Ringwald strcpy(packet, "\r\n+CLCC: 1,2,3,4,5,,129\r\n"); 313*1d3bd1e5SMatthias Ringwald parse_hf(packet); 314*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_LIST_CURRENT_CALLS, context.command); 315*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(1, context.clcc_idx); 316*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(2, context.clcc_dir); 317*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(3, context.clcc_status); 318*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(4, context.clcc_mode); 319*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(5, context.clcc_mpty); 320*1d3bd1e5SMatthias Ringwald STRCMP_EQUAL("", context.bnip_number); 321*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(129, context.bnip_type); 322*1d3bd1e5SMatthias Ringwald } 323*1d3bd1e5SMatthias Ringwald 324*1d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_LIST_CURRENT_CALLS_2){ 325*1d3bd1e5SMatthias Ringwald strcpy(packet, "\r\n+CLCC: 1,2,3,4,5,"",129\r\n"); 326*1d3bd1e5SMatthias Ringwald parse_hf(packet); 327*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_LIST_CURRENT_CALLS, context.command); 328*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(1, context.clcc_idx); 329*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(2, context.clcc_dir); 330*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(3, context.clcc_status); 331*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(4, context.clcc_mode); 332*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(5, context.clcc_mpty); 333*1d3bd1e5SMatthias Ringwald STRCMP_EQUAL("", context.bnip_number); 334*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(129, context.bnip_type); 335*1d3bd1e5SMatthias Ringwald } 336*1d3bd1e5SMatthias Ringwald 337*1d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_AG_SUPPORTED_FEATURES){ 338*1d3bd1e5SMatthias Ringwald sprintf(packet, "\r\nAT%s=159\r\n", HFP_SUPPORTED_FEATURES); 339*1d3bd1e5SMatthias Ringwald //context.keep_separator = 0; 340*1d3bd1e5SMatthias Ringwald parse_ag(packet); 341*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_SUPPORTED_FEATURES, context.command); 342*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(159, context.remote_supported_features); 343*1d3bd1e5SMatthias Ringwald } 344*1d3bd1e5SMatthias Ringwald 345*1d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_AG_AVAILABLE_CODECS){ 346*1d3bd1e5SMatthias Ringwald sprintf(packet, "\r\nAT%s=0,1,2\r\n", HFP_AVAILABLE_CODECS); 347*1d3bd1e5SMatthias Ringwald parse_ag(packet); 348*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_AVAILABLE_CODECS, context.command); 349*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(3, context.remote_codecs_nr); 350*1d3bd1e5SMatthias Ringwald for (pos = 0; pos < 3; pos++){ 351*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(pos, context.remote_codecs[pos]); 352*1d3bd1e5SMatthias Ringwald } 353*1d3bd1e5SMatthias Ringwald } 354*1d3bd1e5SMatthias Ringwald 355*1d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_AG_GENERIC_STATUS_INDICATOR){ 356*1d3bd1e5SMatthias Ringwald sprintf(packet, "\r\nAT%s=0,1,2,3,4\r\n", HFP_GENERIC_STATUS_INDICATOR); 357*1d3bd1e5SMatthias Ringwald parse_ag(packet); 358*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(context.command, HFP_CMD_LIST_GENERIC_STATUS_INDICATORS); 359*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(5, context.generic_status_indicators_nr); 360*1d3bd1e5SMatthias Ringwald 361*1d3bd1e5SMatthias Ringwald for (pos = 0; pos < context.generic_status_indicators_nr; pos++){ 362*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(pos, context.generic_status_indicators[pos].uuid); 363*1d3bd1e5SMatthias Ringwald } 364*1d3bd1e5SMatthias Ringwald } 365*1d3bd1e5SMatthias Ringwald 366*1d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_AG_ENABLE_INDICATOR_STATUS_UPDATE){ 367*1d3bd1e5SMatthias Ringwald sprintf(packet, "\r\nAT%s=3,0,0,1\r\n", HFP_ENABLE_STATUS_UPDATE_FOR_AG_INDICATORS); 368*1d3bd1e5SMatthias Ringwald parse_ag(packet); 369*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_ENABLE_INDICATOR_STATUS_UPDATE, context.command); 370*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(1, context.enable_status_update_for_ag_indicators); 371*1d3bd1e5SMatthias Ringwald } 372*1d3bd1e5SMatthias Ringwald 373*1d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_AG_ENABLE_INDIVIDUAL_INDICATOR_STATUS_UPDATE){ 374*1d3bd1e5SMatthias Ringwald hfp_ag_init_ag_indicators(hfp_ag_indicators_nr, (hfp_ag_indicator_t *)&hfp_ag_indicators); 375*1d3bd1e5SMatthias Ringwald context.ag_indicators_nr = hfp_ag_indicators_nr; 376*1d3bd1e5SMatthias Ringwald memcpy(context.ag_indicators, hfp_ag_indicators, hfp_ag_indicators_nr * sizeof(hfp_ag_indicator_t)); 377*1d3bd1e5SMatthias Ringwald 378*1d3bd1e5SMatthias Ringwald for (pos = 0; pos < hfp_ag_indicators_nr; pos++){ 379*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(hfp_ag_indicators[pos].index, hfp_ag_get_ag_indicators(&context)[pos].index ); 380*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(hfp_ag_indicators[pos].enabled, hfp_ag_get_ag_indicators(&context)[pos].enabled); 381*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(hfp_ag_indicators[pos].index, context.ag_indicators[pos].index); 382*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(hfp_ag_indicators[pos].enabled, context.ag_indicators[pos].enabled); 383*1d3bd1e5SMatthias Ringwald } 384*1d3bd1e5SMatthias Ringwald sprintf(packet, "\r\nAT%s=0,0,0,0,0,0,0\r\n", 385*1d3bd1e5SMatthias Ringwald HFP_UPDATE_ENABLE_STATUS_FOR_INDIVIDUAL_AG_INDICATORS); 386*1d3bd1e5SMatthias Ringwald parse_ag(packet); 387*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_ENABLE_INDIVIDUAL_AG_INDICATOR_STATUS_UPDATE, context.command); 388*1d3bd1e5SMatthias Ringwald 389*1d3bd1e5SMatthias Ringwald for (pos = 0; pos < hfp_ag_indicators_nr; pos++){ 390*1d3bd1e5SMatthias Ringwald if (hfp_ag_get_ag_indicators(&context)[pos].mandatory){ 391*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(1, hfp_ag_get_ag_indicators(&context)[pos].enabled); 392*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(1, context.ag_indicators[pos].enabled); 393*1d3bd1e5SMatthias Ringwald } else { 394*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(0, hfp_ag_get_ag_indicators(&context)[pos].enabled); 395*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(0, context.ag_indicators[pos].enabled); 396*1d3bd1e5SMatthias Ringwald } 397*1d3bd1e5SMatthias Ringwald } 398*1d3bd1e5SMatthias Ringwald } 399*1d3bd1e5SMatthias Ringwald 400*1d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_AG_ENABLE_INDIVIDUAL_INDICATOR_STATUS_UPDATE_OPT_VALUES3){ 401*1d3bd1e5SMatthias Ringwald hfp_ag_init_ag_indicators(hfp_ag_indicators_nr, (hfp_ag_indicator_t *)&hfp_ag_indicators); 402*1d3bd1e5SMatthias Ringwald context.ag_indicators_nr = hfp_ag_indicators_nr; 403*1d3bd1e5SMatthias Ringwald memcpy(context.ag_indicators, hfp_ag_indicators, hfp_ag_indicators_nr * sizeof(hfp_ag_indicator_t)); 404*1d3bd1e5SMatthias Ringwald 405*1d3bd1e5SMatthias Ringwald sprintf(packet, "\r\nAT%s=,1,,,,,1\r\n", 406*1d3bd1e5SMatthias Ringwald HFP_UPDATE_ENABLE_STATUS_FOR_INDIVIDUAL_AG_INDICATORS); 407*1d3bd1e5SMatthias Ringwald parse_ag(packet); 408*1d3bd1e5SMatthias Ringwald 409*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_ENABLE_INDIVIDUAL_AG_INDICATOR_STATUS_UPDATE, context.command); 410*1d3bd1e5SMatthias Ringwald 411*1d3bd1e5SMatthias Ringwald for (pos = 0; pos < hfp_ag_indicators_nr; pos++){ 412*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(hfp_ag_indicators[pos].index, hfp_ag_get_ag_indicators(&context)[pos].index ); 413*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(hfp_ag_indicators[pos].enabled, hfp_ag_get_ag_indicators(&context)[pos].enabled); 414*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(hfp_ag_indicators[pos].index, context.ag_indicators[pos].index ); 415*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(hfp_ag_indicators[pos].enabled, context.ag_indicators[pos].enabled); 416*1d3bd1e5SMatthias Ringwald } 417*1d3bd1e5SMatthias Ringwald } 418*1d3bd1e5SMatthias Ringwald 419*1d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_AG_ENABLE_INDIVIDUAL_INDICATOR_STATUS_UPDATE_OPT_VALUES2){ 420*1d3bd1e5SMatthias Ringwald hfp_ag_init_ag_indicators(hfp_ag_indicators_nr, (hfp_ag_indicator_t *)&hfp_ag_indicators); 421*1d3bd1e5SMatthias Ringwald context.ag_indicators_nr = hfp_ag_indicators_nr; 422*1d3bd1e5SMatthias Ringwald memcpy(context.ag_indicators, hfp_ag_indicators, hfp_ag_indicators_nr * sizeof(hfp_ag_indicator_t)); 423*1d3bd1e5SMatthias Ringwald 424*1d3bd1e5SMatthias Ringwald sprintf(packet, "\r\nAT%s=1,,,1,1,1,\r\n", 425*1d3bd1e5SMatthias Ringwald HFP_UPDATE_ENABLE_STATUS_FOR_INDIVIDUAL_AG_INDICATORS); 426*1d3bd1e5SMatthias Ringwald parse_ag(packet); 427*1d3bd1e5SMatthias Ringwald 428*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_ENABLE_INDIVIDUAL_AG_INDICATOR_STATUS_UPDATE, context.command); 429*1d3bd1e5SMatthias Ringwald 430*1d3bd1e5SMatthias Ringwald for (pos = 0; pos < hfp_ag_indicators_nr; pos++){ 431*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(1,hfp_ag_get_ag_indicators(&context)[pos].enabled); 432*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(1, context.ag_indicators[pos].enabled); 433*1d3bd1e5SMatthias Ringwald } 434*1d3bd1e5SMatthias Ringwald } 435*1d3bd1e5SMatthias Ringwald 436*1d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_AG_ENABLE_INDIVIDUAL_INDICATOR_STATUS_UPDATE_OPT_VALUES1){ 437*1d3bd1e5SMatthias Ringwald hfp_ag_init_ag_indicators(hfp_ag_indicators_nr, (hfp_ag_indicator_t *)&hfp_ag_indicators); 438*1d3bd1e5SMatthias Ringwald context.ag_indicators_nr = hfp_ag_indicators_nr; 439*1d3bd1e5SMatthias Ringwald memcpy(context.ag_indicators, hfp_ag_indicators, hfp_ag_indicators_nr * sizeof(hfp_ag_indicator_t)); 440*1d3bd1e5SMatthias Ringwald 441*1d3bd1e5SMatthias Ringwald sprintf(packet, "\r\nAT%s=1,,,1,1,1,\r\n", 442*1d3bd1e5SMatthias Ringwald HFP_UPDATE_ENABLE_STATUS_FOR_INDIVIDUAL_AG_INDICATORS); 443*1d3bd1e5SMatthias Ringwald parse_ag(packet); 444*1d3bd1e5SMatthias Ringwald 445*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_ENABLE_INDIVIDUAL_AG_INDICATOR_STATUS_UPDATE, context.command); 446*1d3bd1e5SMatthias Ringwald 447*1d3bd1e5SMatthias Ringwald for (pos = 0; pos < hfp_ag_indicators_nr; pos++){ 448*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(1, hfp_ag_get_ag_indicators(&context)[pos].enabled); 449*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(1, context.ag_indicators[pos].enabled); 450*1d3bd1e5SMatthias Ringwald } 451*1d3bd1e5SMatthias Ringwald } 452*1d3bd1e5SMatthias Ringwald 453*1d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_AG_HF_QUERY_OPERATOR_SELECTION){ 454*1d3bd1e5SMatthias Ringwald context.network_operator.format = 0xff; 455*1d3bd1e5SMatthias Ringwald sprintf(packet, "\r\nAT%s=3,0\r\n", HFP_QUERY_OPERATOR_SELECTION); 456*1d3bd1e5SMatthias Ringwald 457*1d3bd1e5SMatthias Ringwald parse_ag(packet); 458*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(0, context.operator_name_changed); 459*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_QUERY_OPERATOR_SELECTION_NAME_FORMAT, context.command); 460*1d3bd1e5SMatthias Ringwald 461*1d3bd1e5SMatthias Ringwald sprintf(packet, "\r\nAT%s?\r\n", HFP_QUERY_OPERATOR_SELECTION); 462*1d3bd1e5SMatthias Ringwald 463*1d3bd1e5SMatthias Ringwald parse_ag(packet); 464*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_QUERY_OPERATOR_SELECTION_NAME, context.command); 465*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(0, context.operator_name_changed); 466*1d3bd1e5SMatthias Ringwald } 467*1d3bd1e5SMatthias Ringwald 468*1d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_AG_EXTENDED_AUDIO_GATEWAY_ERROR){ 469*1d3bd1e5SMatthias Ringwald sprintf(packet, "\r\nAT%s=1\r\n", HFP_ENABLE_EXTENDED_AUDIO_GATEWAY_ERROR); 470*1d3bd1e5SMatthias Ringwald 471*1d3bd1e5SMatthias Ringwald parse_ag(packet); 472*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_ENABLE_EXTENDED_AUDIO_GATEWAY_ERROR, context.command ); 473*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(1, context.enable_extended_audio_gateway_error_report); 474*1d3bd1e5SMatthias Ringwald } 475*1d3bd1e5SMatthias Ringwald 476*1d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_AG_TRIGGER_CODEC_CONNECTION_SETUP){ 477*1d3bd1e5SMatthias Ringwald sprintf(packet, "\r\nAT%s\r\n", HFP_TRIGGER_CODEC_CONNECTION_SETUP); 478*1d3bd1e5SMatthias Ringwald parse_ag(packet); 479*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_TRIGGER_CODEC_CONNECTION_SETUP, context.command); 480*1d3bd1e5SMatthias Ringwald } 481*1d3bd1e5SMatthias Ringwald 482*1d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_AG_CONFIRM_COMMON_CODEC){ 483*1d3bd1e5SMatthias Ringwald int codec = 2; 484*1d3bd1e5SMatthias Ringwald sprintf(packet, "\r\nAT%s=%d\r\n", HFP_CONFIRM_COMMON_CODEC, codec); 485*1d3bd1e5SMatthias Ringwald 486*1d3bd1e5SMatthias Ringwald parse_ag(packet); 487*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_HF_CONFIRMED_CODEC, context.command ); 488*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(codec, context.codec_confirmed); 489*1d3bd1e5SMatthias Ringwald } 490*1d3bd1e5SMatthias Ringwald 491*1d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_AG_DIAL){ 492*1d3bd1e5SMatthias Ringwald strcpy(packet, "\r\nATD00123456789;\r\n"); 493*1d3bd1e5SMatthias Ringwald 494*1d3bd1e5SMatthias Ringwald parse_ag(packet); 495*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_CALL_PHONE_NUMBER, context.command); 496*1d3bd1e5SMatthias Ringwald STRCMP_EQUAL("00123456789", (const char *) &context.line_buffer[3]); 497*1d3bd1e5SMatthias Ringwald } 498*1d3bd1e5SMatthias Ringwald 499*1d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_ANSWER_CALL){ 500*1d3bd1e5SMatthias Ringwald sprintf(packet, "\r\n%s\r\n", HFP_ANSWER_CALL); 501*1d3bd1e5SMatthias Ringwald parse_ag(packet); 502*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_CALL_ANSWERED, context.command); 503*1d3bd1e5SMatthias Ringwald } 504*1d3bd1e5SMatthias Ringwald 505*1d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_CMD_RESPONSE_AND_HOLD_QUERY){ 506*1d3bd1e5SMatthias Ringwald sprintf(packet, "\r\nAT%s?\r\n", HFP_RESPONSE_AND_HOLD); 507*1d3bd1e5SMatthias Ringwald parse_ag(packet); 508*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_RESPONSE_AND_HOLD_QUERY, context.command); 509*1d3bd1e5SMatthias Ringwald } 510*1d3bd1e5SMatthias Ringwald 511*1d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_CMD_RESPONSE_AND_HOLD_COMMAND){ 512*1d3bd1e5SMatthias Ringwald int param = 1; 513*1d3bd1e5SMatthias Ringwald sprintf(packet, "\r\nAT%s=%u\r\n", HFP_RESPONSE_AND_HOLD, param); 514*1d3bd1e5SMatthias Ringwald parse_ag(packet); 515*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_RESPONSE_AND_HOLD_COMMAND, context.command); 516*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(param, context.ag_response_and_hold_action); 517*1d3bd1e5SMatthias Ringwald } 518*1d3bd1e5SMatthias Ringwald 519*1d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_CMD_RESPONSE_AND_HOLD_STATUS){ 520*1d3bd1e5SMatthias Ringwald int status = 1; 521*1d3bd1e5SMatthias Ringwald sprintf(packet, "\r\n%s:%u\r\n", HFP_RESPONSE_AND_HOLD, status); 522*1d3bd1e5SMatthias Ringwald parse_hf(packet); 523*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_RESPONSE_AND_HOLD_STATUS, context.command); 524*1d3bd1e5SMatthias Ringwald } 525*1d3bd1e5SMatthias Ringwald 526*1d3bd1e5SMatthias Ringwald TEST(HFPParser, HFP_CMD_ENABLE_CLIP){ 527*1d3bd1e5SMatthias Ringwald int param = 1; 528*1d3bd1e5SMatthias Ringwald sprintf(packet, "\r\nAT%s=%u\r\n", HFP_ENABLE_CLIP, param); 529*1d3bd1e5SMatthias Ringwald parse_ag(packet); 530*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(HFP_CMD_ENABLE_CLIP, context.command); 531*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(param, context.clip_enabled); 532*1d3bd1e5SMatthias Ringwald } 533*1d3bd1e5SMatthias Ringwald 534*1d3bd1e5SMatthias Ringwald int main (int argc, const char * argv[]){ 535*1d3bd1e5SMatthias Ringwald return CommandLineTestRunner::RunAllTests(argc, argv); 536*1d3bd1e5SMatthias Ringwald } 537