1 #include <gammu-message.h>
2 #include "test_helper.h"
3 #include "../../libgammu/phone/at/atgen.h"
4 #include "../../libgammu/gsmstate.h"
5 
is_empty(const char * buffer,const int length)6 int is_empty(const char *buffer, const int length)
7 {
8   int i;
9 
10   if(buffer != NULL && length > 0)
11     for(i = 0; i < length; ++i)
12       if(buffer[i] != '\0')
13         return FALSE;
14 
15   return TRUE;
16 }
17 
IncomingSMS(GSM_StateMachine * s,GSM_SMSMessage * sms,void * user_data)18 void IncomingSMS(GSM_StateMachine * s, GSM_SMSMessage *sms, void *user_data)
19 {
20   if(user_data != NULL)
21     memcpy(user_data, sms, sizeof(GSM_SMSMessage));
22 }
23 
ignore_if_incoming_sms_disabled(void)24 void ignore_if_incoming_sms_disabled(void)
25 {
26   GSM_Error error;
27   GSM_SMSMessage sms;
28   GSM_StateMachine *s = setup_state_machine();
29   GSM_Phone_ATGENData *Priv = setup_at_engine(s);
30   GSM_Protocol_Message msg;
31 
32   const char *event = "+CDS:25\rBAD\r";
33   const char *responses[] = { "ERROR\r\n" };
34   SET_RESPONSES(responses);
35   bind_response_handling(s);
36 
37   puts(__func__);
38 
39   UNNEEDED(Priv);
40 
41   memset(&sms, 0, sizeof(sms));
42   s->Phone.Data.EnableIncomingSMS = FALSE;
43   s->Phone.Data.RequestID = ID_None;
44   s->User.IncomingSMS = &IncomingSMS;
45   s->User.IncomingSMSUserData = &sms;
46 
47   msg.Length = strlen(event);
48   msg.Buffer = (char*)event;
49   msg.Type = 0;
50 
51   s->Phone.Data.RequestMsg = &msg;
52   error = ATGEN_DispatchMessage(s);
53   test_result(error == ERR_NONE);
54   test_result(is_empty((char*)&sms, sizeof(sms)));
55 
56   cleanup_state_machine(s);
57 }
58 
ignore_if_no_cds_handler(void)59 void ignore_if_no_cds_handler(void)
60 {
61   GSM_Error error;
62   GSM_SMSMessage sms;
63   GSM_StateMachine *s = setup_state_machine();
64   GSM_Phone_ATGENData *Priv = setup_at_engine(s);
65   GSM_Protocol_Message msg;
66 
67   const char *event = "+CDS:25\rBAD\r";
68   const char *responses[] = { "ERROR\r\n" };
69   SET_RESPONSES(responses);
70   bind_response_handling(s);
71 
72   puts(__func__);
73 
74   UNNEEDED(Priv);
75 
76   memset(&sms, 0, sizeof(sms));
77   s->Phone.Data.EnableIncomingSMS = TRUE;
78   s->Phone.Data.RequestID = ID_None;
79 
80   msg.Length = strlen(event);
81   msg.Buffer = (char*)event;
82   msg.Type = 0;
83 
84   s->Phone.Data.RequestMsg = &msg;
85   error = ATGEN_DispatchMessage(s);
86   test_result(error == ERR_NONE);
87   test_result(is_empty((char*)&sms, sizeof(sms)));
88 
89   cleanup_state_machine(s);
90 }
91 
process_cds(void)92 void process_cds(void)
93 {
94   GSM_Error error;
95   GSM_SMSMessage sms;
96   GSM_StateMachine *s = setup_state_machine();
97   GSM_Phone_ATGENData *Priv = setup_at_engine(s);
98   GSM_Protocol_Message msg;
99 
100   const char *event = "+CDS:25\r07914875215652F006360B914892347527F3817003018104808170030181448000\r";
101   const char *responses[] = { "ERROR\r\n" };
102   SET_RESPONSES(responses);
103   bind_response_handling(s);
104 
105   puts(__func__);
106 
107   UNNEEDED(Priv);
108 
109   memset(&sms, 0, sizeof(sms));
110   s->Phone.Data.EnableIncomingSMS = TRUE;
111   s->Phone.Data.RequestID = ID_None;
112   s->User.IncomingSMS = &IncomingSMS;
113   s->User.IncomingSMSUserData = &sms;
114 
115   msg.Length = strlen(event);
116   msg.Buffer = (char*)event;
117   msg.Type = 0;
118 
119   s->Phone.Data.RequestMsg = &msg;
120   error = ATGEN_DispatchMessage(s);
121   test_result(error == ERR_NONE);
122   test_result(sms.PDU == SMS_Status_Report);
123 
124   cleanup_state_machine(s);
125 }
126 
main(void)127 int main(void)
128 {
129   ignore_if_incoming_sms_disabled();
130   ignore_if_no_cds_handler();
131   process_cds();
132 }