xref: /btstack/test/hfp/hfp_at_parser_test.cpp (revision 1d3bd1e51ca491d6783233c8d7431c44f06daa5a)
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