stktest: Fix unused variable warnings
[platform/upstream/ofono.git] / tools / stktest.c
1 /*
2  *
3  *  oFono - Open Source Telephony
4  *
5  *  Copyright (C) 2008-2011  Intel Corporation. All rights reserved.
6  *
7  *  This program is free software; you can redistribute it and/or modify
8  *  it under the terms of the GNU General Public License version 2 as
9  *  published by the Free Software Foundation.
10  *
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with this program; if not, write to the Free Software
18  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19  *
20  */
21
22 #ifdef HAVE_CONFIG_H
23 #include <config.h>
24 #endif
25
26 #include <stdio.h>
27 #include <errno.h>
28 #include <fcntl.h>
29 #include <unistd.h>
30 #include <stdlib.h>
31 #include <string.h>
32 #include <signal.h>
33 #include <netinet/in.h>
34 #include <arpa/inet.h>
35
36 #include <gdbus.h>
37 #include <gatchat/gatserver.h>
38
39 #include "unit/stk-test-data.h"
40
41 #define OFONO_SERVICE   "org.ofono"
42 #define STKTEST_PATH    "/stktest"
43 #define STKTEST_ERROR   "org.ofono.stktest.Error"
44 #define OFONO_ERROR     "org.ofono.Error"
45 #define OFONO_MANAGER_INTERFACE         OFONO_SERVICE ".Manager"
46 #define OFONO_MODEM_INTERFACE           OFONO_SERVICE ".Modem"
47 #define OFONO_STK_INTERFACE             OFONO_SERVICE ".SimToolkit"
48 #define OFONO_STKAGENT_INTERFACE        OFONO_SERVICE ".SimToolkitAgent"
49
50 #define LISTEN_PORT     12765
51
52 enum test_state {
53         TEST_STATE_POWERING_UP = 1,
54         TEST_STATE_REGISTERING_AGENT,
55         TEST_STATE_RUNNING,
56         TEST_STATE_POWERING_DOWN,
57 };
58
59 enum test_result {
60         TEST_RESULT_NOT_RUN = 0,
61         TEST_RESULT_PASSED,
62         TEST_RESULT_FAILED
63 };
64
65 typedef DBusMessage *(*display_text_cb_t)(DBusMessage *msg, const char *text,
66                                                 unsigned char icon_id,
67                                                 gboolean urgent);
68 typedef DBusMessage *(*get_inkey_cb_t)(DBusMessage *msg, const char *alpha,
69                                                 unsigned char icon_id);
70 typedef void (*terminal_response_func)(const unsigned char *pdu,
71                                         unsigned int len);
72
73 struct test {
74         char *name;
75         char *method;
76         unsigned char *req_pdu;
77         unsigned int req_len;
78         unsigned char *rsp_pdu;
79         unsigned int rsp_len;
80         void *agent_func;
81         terminal_response_func tr_func;
82         enum test_result result;
83 };
84
85 static GMainLoop *main_loop = NULL;
86 static volatile sig_atomic_t __terminated = 0;
87 static GList *tests = NULL;
88 static GList *cur_test = NULL;
89
90 /* DBus related */
91 static DBusConnection *conn;
92 static gboolean ofono_running = FALSE;
93 static guint modem_changed_watch;
94 static enum test_state state;
95 static DBusMessage *pending = NULL;
96
97 /* Emulator setup */
98 static guint server_watch;
99 static GAtServer *emulator;
100
101 /* Emulated modem state variables */
102 static int modem_mode = 0;
103
104 void __stktest_test_next();
105 void __stktest_test_finish(gboolean successful);
106 static gboolean create_tcp(void);
107
108 #define STKTEST_AGENT_ASSERT(expr)                                      \
109         do {                                                            \
110                 if (!(expr)) {                                          \
111                         g_printerr("Assertion Failed %s:%d %s\n",       \
112                                         __FILE__, __LINE__, #expr);     \
113                         __stktest_test_finish(FALSE);                   \
114                         return stktest_error_failed(msg);               \
115                 }                                                       \
116         } while (0)
117
118 #define STKTEST_RESPONSE_ASSERT(expect_pdu, expect_pdu_len,             \
119                                 got_pdu, got_pdu_len)                   \
120         do {                                                            \
121                 if ((expect_pdu_len) != (got_pdu_len)) {                \
122                         g_printerr("Assertion Failed %s:%d"             \
123                                         " Wrong response len"           \
124                                         " want: %d, got: %d\n",         \
125                                         __FILE__, __LINE__,             \
126                                         expect_pdu_len, got_pdu_len);   \
127                         __stktest_test_finish(FALSE);                   \
128                         return;                                         \
129                 }                                                       \
130                                                                         \
131                 if (memcmp(expect_pdu, got_pdu, expect_pdu_len) != 0) { \
132                         g_printerr("Assertion Failed %s:%d"             \
133                                         "Wrong response\n",             \
134                                         __FILE__, __LINE__);            \
135                         __stktest_test_finish(FALSE);                   \
136                         return;                                         \
137                 }                                                       \
138         } while (0)
139
140 static const char *to_hex(const unsigned char *data, unsigned int len)
141 {
142         static char buf[512+1];
143         unsigned int i;
144
145         for (i = 0; i < len; i++)
146                 sprintf(buf + i * 2, "%02hhX", data[i]);
147
148         buf[i*2] = '\0';
149
150         return buf;
151 }
152
153 static void send_proactive_command(const unsigned char *pdu, unsigned int len)
154 {
155         char buf[1024];
156
157         sprintf(buf, "+CUSATP: %s", to_hex(pdu, len));
158         g_at_server_send_unsolicited(emulator, buf);
159 }
160
161 static DBusMessage *stktest_error_invalid_args(DBusMessage *msg)
162 {
163         return g_dbus_create_error(msg, STKTEST_ERROR ".InvalidArguments",
164                                         "Invalid arguments provided");
165 }
166
167 static DBusMessage *stktest_error_failed(DBusMessage *msg)
168 {
169         return g_dbus_create_error(msg, STKTEST_ERROR ".Failed",
170                                         "Operation failed");
171 }
172
173 static DBusMessage *stktest_error_end_session(DBusMessage *msg)
174 {
175         return g_dbus_create_error(msg, OFONO_ERROR ".EndSession",
176                                         "End Session Request");
177 }
178
179 static DBusMessage *stktest_error_go_back(DBusMessage *msg)
180 {
181         return g_dbus_create_error(msg, OFONO_ERROR ".GoBack",
182                                         "Go Back Request");
183 }
184
185 static DBusMessage *stktest_error_busy(DBusMessage *msg)
186 {
187         return g_dbus_create_error(msg, OFONO_ERROR ".Busy",
188                                         "UI Busy");
189 }
190
191 static DBusMessage *agent_release(DBusConnection *conn, DBusMessage *msg,
192                                         void *data)
193 {
194         g_print("Got Release\n");
195
196         if (pending) {
197                 dbus_message_unref(pending);
198                 pending = NULL;
199         }
200
201         return dbus_message_new_method_return(msg);
202 }
203
204 static DBusMessage *agent_cancel(DBusConnection *conn, DBusMessage *msg,
205                                         void *data)
206 {
207         if (pending) {
208                 dbus_message_unref(pending);
209                 pending = NULL;
210         }
211
212         return NULL;
213 }
214
215 static DBusMessage *agent_display_text(DBusConnection *conn, DBusMessage *msg,
216                                         void *data)
217 {
218         const char *text;
219         unsigned char icon_id;
220         dbus_bool_t urgent;
221         struct test *test;
222         display_text_cb_t func;
223         DBusMessage *reply;
224
225         if (dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &text,
226                                                 DBUS_TYPE_BYTE, &icon_id,
227                                                 DBUS_TYPE_BOOLEAN, &urgent,
228                                                 DBUS_TYPE_INVALID) == FALSE)
229                 return stktest_error_invalid_args(msg);
230
231         if (cur_test == NULL)
232                 return stktest_error_failed(msg);
233
234         test = cur_test->data;
235         func = test->agent_func;
236
237         if (strcmp(test->method, "DisplayText")) {
238                 g_printerr("Wrong method called!\n");
239                 __stktest_test_finish(FALSE);
240                 return stktest_error_failed(msg);
241         }
242
243         if (func == NULL) {
244                 g_printerr("DisplayText not expected to be called");
245                 __stktest_test_finish(FALSE);
246                 return stktest_error_failed(msg);
247         }
248
249         reply = func(msg, text, icon_id, urgent);
250         if (reply == NULL)
251                 pending = dbus_message_ref(msg);
252
253         return reply;
254 }
255
256 #define GET_INKEY_TEMPLATE(func, method_name)                           \
257 static DBusMessage *func(DBusConnection *conn, DBusMessage *msg,        \
258                                 void *data)                             \
259 {                                                                       \
260         const char *alpha;                                              \
261         unsigned char icon_id;                                          \
262         struct test *test;                                              \
263         get_inkey_cb_t func;                                            \
264         DBusMessage *reply;                                             \
265                                                                         \
266         if (dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &alpha,  \
267                                         DBUS_TYPE_BYTE, &icon_id,       \
268                                         DBUS_TYPE_INVALID) == FALSE)    \
269                 return stktest_error_invalid_args(msg);                 \
270                                                                         \
271         if (cur_test == NULL)                                           \
272                 return stktest_error_failed(msg);                       \
273                                                                         \
274         test = cur_test->data;                                          \
275         func = test->agent_func;                                        \
276                                                                         \
277         if (strcmp(test->method, method_name)) {                        \
278                 g_printerr("Wrong method called!\n");                   \
279                 __stktest_test_finish(FALSE);                           \
280                 return stktest_error_failed(msg);                       \
281         }                                                               \
282                                                                         \
283         if (func == NULL) {                                             \
284                 g_printerr(method_name " not expected to be called");   \
285                 __stktest_test_finish(FALSE);                           \
286                 return stktest_error_failed(msg);                       \
287         }                                                               \
288                                                                         \
289         reply = func(msg, alpha, icon_id);                              \
290         if (reply == NULL)                                              \
291                 pending = dbus_message_ref(msg);                        \
292                                                                         \
293         return reply;                                                   \
294 }                                                                       \
295
296 GET_INKEY_TEMPLATE(agent_request_key, "RequestKey")
297 GET_INKEY_TEMPLATE(agent_request_digit, "RequestDigit")
298 GET_INKEY_TEMPLATE(agent_request_confirmation, "RequestConfirmation")
299
300 static void server_debug(const char *str, void *data)
301 {
302         g_print("%s: %s\n", (char *) data, str);
303 }
304
305 static void cgmi_cb(GAtServer *server, GAtServerRequestType type,
306                         GAtResult *cmd, gpointer user)
307 {
308         switch (type) {
309         case G_AT_SERVER_REQUEST_TYPE_COMMAND_ONLY:
310                 g_at_server_send_info(server, "oFono", TRUE);
311                 g_at_server_send_final(server, G_AT_SERVER_RESULT_OK);
312                 break;
313         case G_AT_SERVER_REQUEST_TYPE_SUPPORT:
314                 g_at_server_send_final(server, G_AT_SERVER_RESULT_OK);
315                 break;
316         default:
317                 g_at_server_send_final(server, G_AT_SERVER_RESULT_ERROR);
318         };
319 }
320
321 static void cgmm_cb(GAtServer *server, GAtServerRequestType type,
322                         GAtResult *cmd, gpointer user)
323 {
324         switch (type) {
325         case G_AT_SERVER_REQUEST_TYPE_COMMAND_ONLY:
326                 g_at_server_send_info(server, "oFono pre-1.0", TRUE);
327                 g_at_server_send_final(server, G_AT_SERVER_RESULT_OK);
328                 break;
329         case G_AT_SERVER_REQUEST_TYPE_SUPPORT:
330                 g_at_server_send_final(server, G_AT_SERVER_RESULT_OK);
331                 break;
332         default:
333                 g_at_server_send_final(server, G_AT_SERVER_RESULT_ERROR);
334         };
335 }
336
337 static void cgmr_cb(GAtServer *server, GAtServerRequestType type,
338                         GAtResult *cmd, gpointer user)
339 {
340         char buf[256];
341
342         switch (type) {
343         case G_AT_SERVER_REQUEST_TYPE_COMMAND_ONLY:
344                 sprintf(buf, "oFono pre-1.0 version: %s", VERSION);
345                 g_at_server_send_info(server, buf, TRUE);
346                 g_at_server_send_final(server, G_AT_SERVER_RESULT_OK);
347                 break;
348         case G_AT_SERVER_REQUEST_TYPE_SUPPORT:
349                 g_at_server_send_final(server, G_AT_SERVER_RESULT_OK);
350                 break;
351         default:
352                 g_at_server_send_final(server, G_AT_SERVER_RESULT_ERROR);
353         };
354 }
355
356 static void cgsn_cb(GAtServer *server, GAtServerRequestType type,
357                         GAtResult *cmd, gpointer user)
358 {
359         switch (type) {
360         case G_AT_SERVER_REQUEST_TYPE_COMMAND_ONLY:
361                 g_at_server_send_info(server, "123456789", TRUE);
362                 g_at_server_send_final(server, G_AT_SERVER_RESULT_OK);
363                 break;
364         case G_AT_SERVER_REQUEST_TYPE_SUPPORT:
365                 g_at_server_send_final(server, G_AT_SERVER_RESULT_OK);
366                 break;
367         default:
368                 g_at_server_send_final(server, G_AT_SERVER_RESULT_ERROR);
369         };
370 }
371
372 static gboolean send_ok(gpointer user)
373 {
374         GAtServer *server = user;
375
376         g_at_server_send_final(server, G_AT_SERVER_RESULT_OK);
377
378         return FALSE;
379 }
380
381 static void cfun_cb(GAtServer *server, GAtServerRequestType type,
382                         GAtResult *cmd, gpointer user)
383 {
384         char buf[12];
385
386         switch (type) {
387         case G_AT_SERVER_REQUEST_TYPE_SUPPORT:
388                 g_at_server_send_info(server, "+CFUN: (0-1,4)", TRUE);
389                 g_at_server_send_final(server, G_AT_SERVER_RESULT_OK);
390                 break;
391         case G_AT_SERVER_REQUEST_TYPE_QUERY:
392                 snprintf(buf, sizeof(buf), "+CFUN: %d", modem_mode);
393                 g_at_server_send_info(server, buf, TRUE);
394                 g_at_server_send_final(server, G_AT_SERVER_RESULT_OK);
395                 break;
396         case G_AT_SERVER_REQUEST_TYPE_SET:
397         {
398                 GAtResultIter iter;
399                 int mode;
400
401                 g_at_result_iter_init(&iter, cmd);
402                 g_at_result_iter_next(&iter, "");
403
404                 if (g_at_result_iter_next_number(&iter, &mode) == FALSE)
405                         goto error;
406
407                 if (mode != 0 && mode != 1)
408                         goto error;
409
410                 if (modem_mode == mode) {
411                         g_at_server_send_final(server, G_AT_SERVER_RESULT_OK);
412                         break;
413                 }
414
415                 modem_mode = mode;
416                 g_timeout_add_seconds(1, send_ok, server);
417                 break;
418         }
419         default:
420                 goto error;
421         };
422
423         return;
424
425 error:
426         g_at_server_send_final(server, G_AT_SERVER_RESULT_ERROR);
427 }
428
429 static void cusatt_cb(GAtServer *server, GAtServerRequestType type,
430                         GAtResult *cmd, gpointer user)
431 {
432         switch (type) {
433         case G_AT_SERVER_REQUEST_TYPE_SUPPORT:
434                 g_at_server_send_final(server, G_AT_SERVER_RESULT_OK);
435                 break;
436         case G_AT_SERVER_REQUEST_TYPE_QUERY:
437                 g_at_server_send_ext_final(server, "+CME ERROR: 4");
438                 break;
439         case G_AT_SERVER_REQUEST_TYPE_SET:
440         {
441                 GAtResultIter iter;
442                 const unsigned char *pdu;
443                 int len;
444                 struct test *test;
445                 terminal_response_func func;
446
447                 g_at_result_iter_init(&iter, cmd);
448                 g_at_result_iter_next(&iter, "");
449
450                 if (g_at_result_iter_next_hexstring(&iter, &pdu, &len) == FALSE)
451                         goto error;
452
453                 if (cur_test == NULL)
454                         goto error;
455
456                 g_at_server_send_final(server, G_AT_SERVER_RESULT_OK);
457
458                 test = cur_test->data;
459                 func = test->tr_func;
460                 func(pdu, len);
461                 break;
462         }
463         default:
464                 goto error;
465         };
466
467         return;
468
469 error:
470         g_at_server_send_final(server, G_AT_SERVER_RESULT_ERROR);
471 }
472
473 static void listen_again(gpointer user_data)
474 {
475         g_at_server_unref(emulator);
476         emulator = NULL;
477
478         if (create_tcp() == TRUE)
479                 return;
480
481         g_print("Error listening to socket\n");
482         g_main_loop_quit(main_loop);
483 }
484
485 static void setup_emulator(GAtServer *server)
486 {
487         g_at_server_set_debug(server, server_debug, "Server");
488
489         g_at_server_register(server, "+CGMI", cgmi_cb, NULL, NULL);
490         g_at_server_register(server, "+CGMM", cgmm_cb, NULL, NULL);
491         g_at_server_register(server, "+CGMR", cgmr_cb, NULL, NULL);
492         g_at_server_register(server, "+CGSN", cgsn_cb, NULL, NULL);
493         g_at_server_register(server, "+CFUN", cfun_cb, NULL, NULL);
494         g_at_server_register(server, "+CUSATT", cusatt_cb, NULL, NULL);
495
496         g_at_server_set_disconnect_function(server, listen_again, NULL);
497 }
498
499 static gboolean on_socket_connected(GIOChannel *chan, GIOCondition cond,
500                                                         gpointer user)
501 {
502         struct sockaddr saddr;
503         unsigned int len = sizeof(saddr);
504         int fd;
505         GIOChannel *client_io = NULL;
506
507         if (cond != G_IO_IN)
508                 goto error;
509
510         fd = accept(g_io_channel_unix_get_fd(chan), &saddr, &len);
511         if (fd == -1)
512                 goto error;
513
514         client_io = g_io_channel_unix_new(fd);
515
516         emulator = g_at_server_new(client_io);
517         g_at_server_set_echo(emulator, FALSE);
518         g_io_channel_unref(client_io);
519
520         if (emulator == NULL)
521                 goto error;
522
523         setup_emulator(emulator);
524
525 error:
526         server_watch = 0;
527         return FALSE;
528 }
529
530 static gboolean create_tcp(void)
531 {
532         struct sockaddr_in addr;
533         int sk;
534         int reuseaddr = 1;
535         GIOChannel *server_io;
536
537         sk = socket(PF_INET, SOCK_STREAM, 0);
538         if (sk < 0) {
539                 g_print("Can't create tcp/ip socket: %s (%d)\n",
540                                                 strerror(errno), errno);
541                 return FALSE;
542         }
543
544         memset(&addr, 0, sizeof(addr));
545
546         addr.sin_family = AF_INET;
547         addr.sin_addr.s_addr = INADDR_ANY;
548         addr.sin_port = htons(LISTEN_PORT);
549
550         setsockopt(sk, SOL_SOCKET, SO_REUSEADDR, &reuseaddr, sizeof(reuseaddr));
551         if (bind(sk, (struct sockaddr *) &addr, sizeof(struct sockaddr)) < 0) {
552                 g_print("Can't bind socket: %s (%d)", strerror(errno), errno);
553                 close(sk);
554                 return FALSE;
555         }
556
557         if (listen(sk, 1) < 0) {
558                 g_print("Can't listen on socket: %s (%d)",
559                                                 strerror(errno), errno);
560                 close(sk);
561                 return FALSE;
562         }
563
564         g_print("new tcp is created at tcp port %d\n", LISTEN_PORT);
565
566         server_io = g_io_channel_unix_new(sk);
567         g_io_channel_set_close_on_unref(server_io, TRUE);
568
569         server_watch = g_io_add_watch_full(server_io,
570                                 G_PRIORITY_DEFAULT,
571                                 G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL,
572                                 on_socket_connected, NULL, NULL);
573
574         g_io_channel_unref(server_io);
575
576         return TRUE;
577 }
578
579 static gboolean has_stk_interface(DBusMessageIter *iter)
580 {
581         DBusMessageIter entry;
582
583         dbus_message_iter_recurse(iter, &entry);
584
585         while (dbus_message_iter_get_arg_type(&entry) == DBUS_TYPE_STRING) {
586                 const char *interface;
587
588                 dbus_message_iter_get_basic(&entry, &interface);
589
590                 if (g_str_equal(interface, OFONO_STK_INTERFACE) == TRUE)
591                         return TRUE;
592
593                 dbus_message_iter_next(&entry);
594         }
595
596         return FALSE;
597 }
598
599 static int send_with_reply(const char *path, const char *interface,
600                                 const char *method, DBusPendingCall **call,
601                                 DBusPendingCallNotifyFunction cb,
602                                 void *user_data, DBusFreeFunction free_func,
603                                 int timeout, int type, ...)
604 {
605         DBusMessage *msg;
606         DBusPendingCall *c;
607         va_list args;
608         int err;
609
610         msg = dbus_message_new_method_call(OFONO_SERVICE, path,
611                                                 interface, method);
612         if (msg == NULL) {
613                 g_printerr("Unable to allocate new D-Bus %s message\n", method);
614                 err = -ENOMEM;
615                 goto fail;
616         }
617
618         va_start(args, type);
619
620         if (!dbus_message_append_args_valist(msg, type, args)) {
621                 va_end(args);
622                 err = -EIO;
623                 goto fail;
624         }
625
626         va_end(args);
627
628         if (timeout > 0)
629                 timeout *= 1000;
630
631         if (!dbus_connection_send_with_reply(conn, msg, &c, timeout)) {
632                 g_printerr("Sending %s failed\n", method);
633                 err = -EIO;
634                 goto fail;
635         }
636
637         if (call != NULL)
638                 *call = c;
639
640         dbus_pending_call_set_notify(c, cb, user_data, free_func);
641         dbus_pending_call_unref(c);
642
643         dbus_message_unref(msg);
644
645         return 0;
646
647 fail:
648         if (free_func && user_data)
649                 free_func(user_data);
650
651         if (msg)
652                 dbus_message_unref(msg);
653
654         return err;
655 }
656
657 static void set_property_reply(DBusPendingCall *call, void *user_data)
658 {
659         DBusMessage *reply = dbus_pending_call_steal_reply(call);
660         DBusError err;
661
662         dbus_error_init(&err);
663
664         if (dbus_set_error_from_message(&err, reply) == TRUE) {
665                 g_printerr("%s: %s\n", err.name, err.message);
666                 dbus_error_free(&err);
667         }
668
669         dbus_message_unref(reply);
670 }
671
672 static int set_property(const char *path, const char *interface,
673                         const char *key, int type, const void *val,
674                         DBusPendingCallNotifyFunction notify,
675                         gpointer user_data,
676                         DBusFreeFunction destroy)
677 {
678         DBusMessage *msg;
679         DBusMessageIter iter, value;
680         DBusPendingCall *call;
681         const char *signature;
682
683         msg = dbus_message_new_method_call(OFONO_SERVICE, path, interface,
684                                                 "SetProperty");
685         if (msg == NULL)
686                 return -ENOMEM;
687
688         dbus_message_set_auto_start(msg, FALSE);
689
690         dbus_message_iter_init_append(msg, &iter);
691
692         dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &key);
693
694         switch (type) {
695         case DBUS_TYPE_BOOLEAN:
696                 signature = DBUS_TYPE_BOOLEAN_AS_STRING;
697                 break;
698         default:
699                 dbus_message_unref(msg);
700                 return -EINVAL;
701         }
702
703         dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT,
704                                                         signature, &value);
705         dbus_message_iter_append_basic(&value, type, val);
706         dbus_message_iter_close_container(&iter, &value);
707
708         if (dbus_connection_send_with_reply(conn, msg, &call, -1) == FALSE) {
709                 dbus_message_unref(msg);
710                 return -EIO;
711         }
712
713         dbus_message_unref(msg);
714
715         if (call == NULL)
716                 return -EINVAL;
717
718         dbus_pending_call_set_notify(call, notify, user_data, destroy);
719
720         dbus_pending_call_unref(call);
721
722         return 0;
723 }
724
725 static void register_agent_reply(DBusPendingCall *call, void *user_data)
726 {
727         DBusMessage *reply = dbus_pending_call_steal_reply(call);
728         DBusError err;
729         struct test *test;
730
731         dbus_error_init(&err);
732
733         if (dbus_set_error_from_message(&err, reply) == TRUE) {
734                 g_printerr("%s: %s\n", err.name, err.message);
735                 dbus_error_free(&err);
736         }
737
738         dbus_message_unref(reply);
739
740         state = TEST_STATE_RUNNING;
741         test = cur_test->data;
742         send_proactive_command(test->req_pdu, test->req_len);
743 }
744
745 static void register_agent()
746 {
747         const char *path = "/default";
748         int status;
749
750         g_print("Gained STK interface, registering agent...\n");
751
752         status = send_with_reply(STKTEST_PATH, OFONO_STK_INTERFACE,
753                                         "RegisterAgent", NULL,
754                                         register_agent_reply, NULL, NULL, 1,
755                                         DBUS_TYPE_OBJECT_PATH, &path,
756                                         DBUS_TYPE_INVALID);
757
758         if (status < 0) {
759                 g_printerr("Unable to register agent with oFono\n");
760                 g_main_loop_quit(main_loop);
761                 return;
762         }
763
764         state = TEST_STATE_REGISTERING_AGENT;
765 }
766
767 static gboolean modem_changed(DBusConnection *conn,
768                                 DBusMessage *msg, void *user_data)
769 {
770         DBusMessageIter iter, value;
771         const char *path, *key;
772         gboolean has_stk;
773
774         if (dbus_message_iter_init(msg, &iter) == FALSE)
775                 return TRUE;
776
777         path = dbus_message_get_path(msg);
778
779         if (g_str_equal(STKTEST_PATH, path) == FALSE)
780                 return TRUE;
781
782         dbus_message_iter_get_basic(&iter, &key);
783
784         dbus_message_iter_next(&iter);
785         dbus_message_iter_recurse(&iter, &value);
786
787         if (g_str_equal(key, "Interfaces") == FALSE)
788                 return TRUE;
789
790         has_stk = has_stk_interface(&value);
791
792         switch (state) {
793         case TEST_STATE_POWERING_UP:
794                 if (has_stk)
795                         register_agent();
796                 break;
797         case TEST_STATE_REGISTERING_AGENT:
798         case TEST_STATE_RUNNING:
799                 if (has_stk == FALSE)
800                         g_printerr("Unexpectedly lost STK interface\n");
801                 /* Fall through */
802         case TEST_STATE_POWERING_DOWN:
803                 break;
804         };
805
806         return TRUE;
807 }
808
809 static void powerup(void)
810 {
811         dbus_bool_t powered = TRUE;
812
813         state = TEST_STATE_POWERING_UP;
814         set_property(STKTEST_PATH, OFONO_MODEM_INTERFACE, "Powered",
815                         DBUS_TYPE_BOOLEAN, &powered,
816                         set_property_reply, NULL, NULL);
817 }
818
819 static void get_modems_reply(DBusPendingCall *call, void *user_data)
820 {
821         DBusMessage *reply = dbus_pending_call_steal_reply(call);
822         DBusMessageIter iter, list;
823         DBusError err;
824         gboolean found = FALSE;
825
826         dbus_error_init(&err);
827
828         if (dbus_set_error_from_message(&err, reply) == TRUE) {
829                 g_printerr("%s: %s\n", err.name, err.message);
830                 dbus_error_free(&err);
831                 goto done;
832         }
833
834         if (dbus_message_has_signature(reply, "a(oa{sv})") == FALSE)
835                 goto done;
836
837         if (dbus_message_iter_init(reply, &iter) == FALSE)
838                 goto done;
839
840         dbus_message_iter_recurse(&iter, &list);
841
842         while (dbus_message_iter_get_arg_type(&list) == DBUS_TYPE_STRUCT) {
843                 DBusMessageIter entry;
844                 const char *path;
845
846                 dbus_message_iter_recurse(&list, &entry);
847                 dbus_message_iter_get_basic(&entry, &path);
848
849                 if (g_str_equal(path, STKTEST_PATH))
850                         found = TRUE;
851
852                 dbus_message_iter_next(&list);
853         }
854
855 done:
856         dbus_message_unref(reply);
857
858         if (found == FALSE) {
859                 g_printerr("STK Test modem not found\n");
860                 g_main_loop_quit(main_loop);
861                 return;
862         }
863
864         g_print("Test modem found\n");
865
866         modem_changed_watch = g_dbus_add_signal_watch(conn, OFONO_SERVICE,
867                                                         STKTEST_PATH,
868                                                         OFONO_MODEM_INTERFACE,
869                                                         "PropertyChanged",
870                                                         modem_changed,
871                                                         NULL, NULL);
872
873         if (create_tcp() == FALSE) {
874                 g_printerr("Unable to listen on modem emulator socket\n");
875                 g_main_loop_quit(main_loop);
876         }
877
878         __stktest_test_next();
879 }
880
881 static int get_modems(DBusConnection *conn)
882 {
883         DBusMessage *msg;
884         DBusPendingCall *call;
885
886         msg = dbus_message_new_method_call(OFONO_SERVICE, "/",
887                                         OFONO_MANAGER_INTERFACE, "GetModems");
888         if (msg == NULL)
889                 return -ENOMEM;
890
891         dbus_message_set_auto_start(msg, FALSE);
892
893         g_print("getting modems\n");
894
895         if (dbus_connection_send_with_reply(conn, msg, &call, -1) == FALSE) {
896                 dbus_message_unref(msg);
897                 return -EIO;
898         }
899
900         dbus_message_unref(msg);
901
902         if (call == NULL)
903                 return -EINVAL;
904
905         dbus_pending_call_set_notify(call, get_modems_reply, conn, NULL);
906
907         dbus_pending_call_unref(call);
908
909         return 0;
910 }
911
912 static const GDBusMethodTable agent_methods[] = {
913         { GDBUS_METHOD("Release", NULL, NULL, agent_release) },
914         { GDBUS_ASYNC_METHOD("DisplayText",
915                 GDBUS_ARGS({ "text", "s" }, { "icon_id", "y" },
916                                 { "urgent", "b" }), NULL,
917                                 agent_display_text) },
918         { GDBUS_ASYNC_METHOD("RequestDigit",
919                 GDBUS_ARGS({ "alpha", "s" }, { "icon_id", "y" }),
920                 GDBUS_ARGS({ "digit", "s" }),
921                                 agent_request_digit) },
922         { GDBUS_ASYNC_METHOD("RequestKey",
923                 GDBUS_ARGS({ "alpha", "s" }, { "icon_id", "y" }),
924                 GDBUS_ARGS({ "key", "s" }),
925                                 agent_request_key) },
926         { GDBUS_ASYNC_METHOD("RequestConfirmation",
927                 GDBUS_ARGS({ "alpha", "s" }, { "icon_id", "y" }),
928                 GDBUS_ARGS({ "confirmation", "b" }),
929                                 agent_request_confirmation) },
930         { GDBUS_NOREPLY_METHOD("Cancel", NULL, NULL, agent_cancel) },
931         { },
932 };
933
934 static void ofono_connect(DBusConnection *conn, void *user_data)
935 {
936         g_print("starting telephony interface\n");
937
938         if (!g_dbus_register_interface(conn, "/default",
939                                         OFONO_STKAGENT_INTERFACE,
940                                         agent_methods, NULL, NULL,
941                                         NULL, NULL)) {
942                 g_printerr("Unable to register local agent");
943                 g_main_loop_quit(main_loop);
944         }
945
946         ofono_running = TRUE;
947         get_modems(conn);
948 }
949
950 static void ofono_disconnect(DBusConnection *conn, void *user_data)
951 {
952         g_print("stopping telephony interface\n");
953
954         g_dbus_unregister_interface(conn, "/default", OFONO_STKAGENT_INTERFACE);
955
956         ofono_running = FALSE;
957
958         g_dbus_remove_watch(conn, modem_changed_watch);
959         modem_changed_watch = 0;
960
961         if (server_watch) {
962                 g_source_remove(server_watch);
963                 server_watch = 0;
964         }
965
966         g_at_server_unref(emulator);
967         emulator = NULL;
968 }
969
970 static void sig_term(int sig)
971 {
972         if (__terminated > 0)
973                 return;
974
975         __terminated = 1;
976
977         g_print("Terminating\n");
978
979         g_main_loop_quit(main_loop);
980 }
981
982 static void disconnect_callback(DBusConnection *conn, void *user_data)
983 {
984         g_printerr("D-Bus disconnect\n");
985
986         g_main_loop_quit(main_loop);
987 }
988
989 static gboolean end_session_and_finish(gpointer user_data)
990 {
991         g_at_server_send_unsolicited(emulator, "+CUSATEND");
992         __stktest_test_finish(TRUE);
993
994         return FALSE;
995 }
996
997 static void expect_response_and_finish(const unsigned char *pdu,
998                                         unsigned int len)
999 {
1000         struct test *test = cur_test->data;
1001
1002         STKTEST_RESPONSE_ASSERT(test->rsp_pdu, test->rsp_len, pdu, len);
1003
1004         g_idle_add(end_session_and_finish, NULL);
1005 }
1006
1007 static void expect_response(const unsigned char *pdu, unsigned int len)
1008 {
1009         struct test *test = cur_test->data;
1010
1011         STKTEST_RESPONSE_ASSERT(test->rsp_pdu, test->rsp_len, pdu, len);
1012 }
1013
1014 static gboolean poweroff_not_canceled_after_3(gpointer user_data)
1015 {
1016         __stktest_test_finish(pending != NULL);
1017         return FALSE;
1018 }
1019
1020 static gboolean end_session_and_not_canceled_after_3(gpointer user_data)
1021 {
1022         g_at_server_send_unsolicited(emulator, "+CUSATEND");
1023         g_timeout_add_seconds(3, poweroff_not_canceled_after_3, NULL);
1024
1025         return FALSE;
1026 }
1027
1028 static void expect_response_and_not_canceled_after_3(const unsigned char *pdu,
1029                                                         unsigned int len)
1030 {
1031         struct test *test = cur_test->data;
1032
1033         STKTEST_RESPONSE_ASSERT(test->rsp_pdu, test->rsp_len, pdu, len);
1034
1035         g_idle_add(end_session_and_not_canceled_after_3, NULL);
1036 }
1037
1038 static gboolean poweroff_and_canceled_after_21(gpointer user_data)
1039 {
1040         __stktest_test_finish(pending == NULL);
1041         return FALSE;
1042 }
1043
1044 static gboolean end_session_and_canceled_after_21(gpointer user_data)
1045 {
1046         g_at_server_send_unsolicited(emulator, "+CUSATEND");
1047         g_timeout_add_seconds(21, poweroff_and_canceled_after_21, NULL);
1048
1049         return FALSE;
1050 }
1051
1052 static void expect_response_and_canceled_after_21(const unsigned char *pdu,
1053                                                         unsigned int len)
1054 {
1055         struct test *test = cur_test->data;
1056
1057         STKTEST_RESPONSE_ASSERT(test->rsp_pdu, test->rsp_len, pdu, len);
1058
1059         g_idle_add(end_session_and_canceled_after_21, NULL);
1060 }
1061
1062 static DBusMessage *test_display_text_11(DBusMessage *msg,
1063                                                 const char *text,
1064                                                 unsigned char icon_id,
1065                                                 gboolean urgent)
1066 {
1067         STKTEST_AGENT_ASSERT(g_str_equal(text, "Toolkit Test 1"));
1068         STKTEST_AGENT_ASSERT(icon_id == 0);
1069         STKTEST_AGENT_ASSERT(urgent == FALSE);
1070
1071         return dbus_message_new_method_return(msg);
1072 }
1073
1074 static DBusMessage *test_display_text_12(DBusMessage *msg,
1075                                                 const char *text,
1076                                                 unsigned char icon_id,
1077                                                 gboolean urgent)
1078 {
1079         STKTEST_AGENT_ASSERT(g_str_equal(text, "Toolkit Test 1"));
1080         STKTEST_AGENT_ASSERT(icon_id == 0);
1081         STKTEST_AGENT_ASSERT(urgent == FALSE);
1082
1083         return stktest_error_busy(msg);
1084 }
1085
1086 static DBusMessage *test_display_text_13(DBusMessage *msg,
1087                                                 const char *text,
1088                                                 unsigned char icon_id,
1089                                                 gboolean urgent)
1090 {
1091         STKTEST_AGENT_ASSERT(g_str_equal(text, "Toolkit Test 2"));
1092         STKTEST_AGENT_ASSERT(icon_id == 0);
1093         STKTEST_AGENT_ASSERT(urgent == TRUE);
1094
1095         return dbus_message_new_method_return(msg);
1096 }
1097
1098 static DBusMessage *test_display_text_14(DBusMessage *msg,
1099                                                 const char *text,
1100                                                 unsigned char icon_id,
1101                                                 gboolean urgent)
1102 {
1103         STKTEST_AGENT_ASSERT(g_str_equal(text, "Toolkit Test 3"));
1104         STKTEST_AGENT_ASSERT(icon_id == 0);
1105         STKTEST_AGENT_ASSERT(urgent == FALSE);
1106
1107         return dbus_message_new_method_return(msg);
1108 }
1109
1110 static DBusMessage *test_display_text_15(DBusMessage *msg,
1111                                                 const char *text,
1112                                                 unsigned char icon_id,
1113                                                 gboolean urgent)
1114 {
1115         STKTEST_AGENT_ASSERT(g_str_equal(text, "Toolkit Test 4"));
1116         STKTEST_AGENT_ASSERT(icon_id == 0);
1117         STKTEST_AGENT_ASSERT(urgent == FALSE);
1118
1119         return NULL;
1120 }
1121
1122 static DBusMessage *test_display_text_16(DBusMessage *msg,
1123                                                 const char *text,
1124                                                 unsigned char icon_id,
1125                                                 gboolean urgent)
1126 {
1127         STKTEST_AGENT_ASSERT(g_str_equal(text, "This command instructs the ME"
1128                                                 " to display a text message. "
1129                                                 "It allows the SIM to define "
1130                                                 "the priority of that message, "
1131                                                 "and the text string format. "
1132                                                 "Two types of prio"));
1133         STKTEST_AGENT_ASSERT(icon_id == 0);
1134         STKTEST_AGENT_ASSERT(urgent == FALSE);
1135
1136         return dbus_message_new_method_return(msg);
1137 }
1138
1139 static DBusMessage *test_display_text_17(DBusMessage *msg,
1140                                                 const char *text,
1141                                                 unsigned char icon_id,
1142                                                 gboolean urgent)
1143 {
1144         /* oFono gives rich text formatting in HTML */
1145         STKTEST_AGENT_ASSERT(g_str_equal(text, "&lt;GO-BACKWARDS&gt;"));
1146         STKTEST_AGENT_ASSERT(icon_id == 0);
1147         STKTEST_AGENT_ASSERT(urgent == FALSE);
1148
1149         return stktest_error_go_back(msg);
1150 }
1151
1152 static DBusMessage *test_display_text_18(DBusMessage *msg,
1153                                                 const char *text,
1154                                                 unsigned char icon_id,
1155                                                 gboolean urgent)
1156 {
1157         /* oFono gives rich text formatting in HTML */
1158         STKTEST_AGENT_ASSERT(g_str_equal(text, "&lt;ABORT&gt;"));
1159         STKTEST_AGENT_ASSERT(icon_id == 0);
1160         STKTEST_AGENT_ASSERT(urgent == FALSE);
1161
1162         return stktest_error_end_session(msg);
1163 }
1164
1165 static DBusMessage *test_display_text_21(DBusMessage *msg,
1166                                                 const char *text,
1167                                                 unsigned char icon_id,
1168                                                 gboolean urgent)
1169 {
1170         STKTEST_AGENT_ASSERT(g_str_equal(text, "&lt;TIME-OUT&gt;"));
1171         STKTEST_AGENT_ASSERT(icon_id == 0);
1172         STKTEST_AGENT_ASSERT(urgent == FALSE);
1173
1174         return NULL;
1175 }
1176
1177 static DBusMessage *test_display_text_31(DBusMessage *msg,
1178                                                 const char *text,
1179                                                 unsigned char icon_id,
1180                                                 gboolean urgent)
1181 {
1182         static const char *expected = "This command instructs the ME to display"
1183                                         " a text message, and/or an icon "
1184                                         "(see 6.5.4). It allows the "
1185                                         "SIM to define the priority of that "
1186                                         "message, and the text string format. "
1187                                         "Two types of priority are defined:- "
1188                                         "display normal priority text and/";
1189         STKTEST_AGENT_ASSERT(g_str_equal(text, expected));
1190         STKTEST_AGENT_ASSERT(icon_id == 0);
1191         STKTEST_AGENT_ASSERT(urgent == FALSE);
1192
1193         return dbus_message_new_method_return(msg);
1194 }
1195
1196 static DBusMessage *test_display_text_41(DBusMessage *msg,
1197                                                 const char *text,
1198                                                 unsigned char icon_id,
1199                                                 gboolean urgent)
1200 {
1201         STKTEST_AGENT_ASSERT(g_str_equal(text, "Toolkit Test 1"));
1202         STKTEST_AGENT_ASSERT(icon_id == 0);
1203         STKTEST_AGENT_ASSERT(urgent == FALSE);
1204
1205         return NULL;
1206 }
1207
1208 static DBusMessage *test_display_text_42(DBusMessage *msg,
1209                                                 const char *text,
1210                                                 unsigned char icon_id,
1211                                                 gboolean urgent)
1212 {
1213         STKTEST_AGENT_ASSERT(g_str_equal(text, "Toolkit Test 2"));
1214         STKTEST_AGENT_ASSERT(icon_id == 0);
1215         STKTEST_AGENT_ASSERT(urgent == FALSE);
1216
1217         return NULL;
1218 }
1219
1220 static gboolean user_response(gpointer user_data)
1221 {
1222         if (pending == NULL) {
1223                 __stktest_test_finish(FALSE);
1224                 return FALSE;
1225         }
1226
1227         g_dbus_send_reply(conn, pending, DBUS_TYPE_INVALID);
1228         dbus_message_unref(pending);
1229         pending = NULL;
1230
1231         __stktest_test_finish(TRUE);
1232
1233         return FALSE;
1234 }
1235
1236 static DBusMessage *test_display_text_43(DBusMessage *msg,
1237                                                 const char *text,
1238                                                 unsigned char icon_id,
1239                                                 gboolean urgent)
1240 {
1241         STKTEST_AGENT_ASSERT(g_str_equal(text, "Toolkit Test 3"));
1242         STKTEST_AGENT_ASSERT(icon_id == 0);
1243         STKTEST_AGENT_ASSERT(urgent == FALSE);
1244
1245         g_timeout_add_seconds(3, user_response, NULL);
1246         return NULL;
1247 }
1248
1249 static DBusMessage *test_display_text_51(DBusMessage *msg,
1250                                                 const char *text,
1251                                                 unsigned char icon_id,
1252                                                 gboolean urgent)
1253 {
1254         STKTEST_AGENT_ASSERT(g_str_equal(text, "Basic Icon"));
1255         STKTEST_AGENT_ASSERT(icon_id == 1);
1256         STKTEST_AGENT_ASSERT(urgent == FALSE);
1257
1258         return dbus_message_new_method_return(msg);
1259 }
1260
1261 static DBusMessage *test_display_text_52(DBusMessage *msg,
1262                                                 const char *text,
1263                                                 unsigned char icon_id,
1264                                                 gboolean urgent)
1265 {
1266         STKTEST_AGENT_ASSERT(g_str_equal(text, "Colour Icon"));
1267         STKTEST_AGENT_ASSERT(icon_id == 2);
1268         STKTEST_AGENT_ASSERT(urgent == FALSE);
1269
1270         return dbus_message_new_method_return(msg);
1271 }
1272
1273 static DBusMessage *test_display_text_53(DBusMessage *msg,
1274                                                 const char *text,
1275                                                 unsigned char icon_id,
1276                                                 gboolean urgent)
1277 {
1278         STKTEST_AGENT_ASSERT(g_str_equal(text, "Basic Icon"));
1279         STKTEST_AGENT_ASSERT(icon_id == 1);
1280         STKTEST_AGENT_ASSERT(urgent == FALSE);
1281
1282         return dbus_message_new_method_return(msg);
1283 }
1284
1285 static DBusMessage *test_display_text_61(DBusMessage *msg,
1286                                                 const char *text,
1287                                                 unsigned char icon_id,
1288                                                 gboolean urgent)
1289 {
1290         STKTEST_AGENT_ASSERT(g_str_equal(text, "ЗДРАВСТВУЙТЕ"));
1291         STKTEST_AGENT_ASSERT(icon_id == 0);
1292         STKTEST_AGENT_ASSERT(urgent == FALSE);
1293
1294         return dbus_message_new_method_return(msg);
1295 }
1296
1297 static DBusMessage *test_display_text_71(DBusMessage *msg,
1298                                                 const char *text,
1299                                                 unsigned char icon_id,
1300                                                 gboolean urgent)
1301 {
1302         STKTEST_AGENT_ASSERT(g_str_equal(text, "10 Second"));
1303         STKTEST_AGENT_ASSERT(icon_id == 0);
1304         STKTEST_AGENT_ASSERT(urgent == FALSE);
1305
1306         return NULL;
1307 }
1308
1309 static DBusMessage *test_display_text_81(DBusMessage *msg,
1310                                                 const char *text,
1311                                                 unsigned char icon_id,
1312                                                 gboolean urgent)
1313 {
1314         const char *expect =
1315                 "<div style=\"text-align: left;\"><span style=\"color: "
1316                 "#347235;background-color: #FFFF00;\">Text Attribute 1</span>"
1317                 "</div>";
1318
1319         STKTEST_AGENT_ASSERT(g_str_equal(text, expect));
1320         STKTEST_AGENT_ASSERT(icon_id == 0);
1321         STKTEST_AGENT_ASSERT(urgent == FALSE);
1322
1323         return dbus_message_new_method_return(msg);
1324 }
1325
1326 static DBusMessage *test_display_text_82(DBusMessage *msg,
1327                                                 const char *text,
1328                                                 unsigned char icon_id,
1329                                                 gboolean urgent)
1330 {
1331         const char *expect =
1332                 "<div style=\"text-align: center;\"><span style=\"color: "
1333                 "#347235;background-color: #FFFF00;\">Text Attribute 1</span>"
1334                 "</div>";
1335
1336         STKTEST_AGENT_ASSERT(g_str_equal(text, expect));
1337         STKTEST_AGENT_ASSERT(icon_id == 0);
1338         STKTEST_AGENT_ASSERT(urgent == FALSE);
1339
1340         return dbus_message_new_method_return(msg);
1341 }
1342
1343 static DBusMessage *test_display_text_83(DBusMessage *msg,
1344                                                 const char *text,
1345                                                 unsigned char icon_id,
1346                                                 gboolean urgent)
1347 {
1348         const char *expect =
1349                 "<div style=\"text-align: right;\"><span style=\"color: "
1350                 "#347235;background-color: #FFFF00;\">Text Attribute 1</span>"
1351                 "</div>";
1352
1353         STKTEST_AGENT_ASSERT(g_str_equal(text, expect));
1354         STKTEST_AGENT_ASSERT(icon_id == 0);
1355         STKTEST_AGENT_ASSERT(urgent == FALSE);
1356
1357         return dbus_message_new_method_return(msg);
1358 }
1359
1360 static DBusMessage *test_display_text_84(DBusMessage *msg,
1361                                                 const char *text,
1362                                                 unsigned char icon_id,
1363                                                 gboolean urgent)
1364 {
1365         const char *expect =
1366                 "<div style=\"text-align: left;\"><span style=\"font-size: "
1367                 "big;color: #347235;background-color: #FFFF00;\">"
1368                 "Text Attribute 1</span></div>";
1369
1370         STKTEST_AGENT_ASSERT(g_str_equal(text, expect));
1371         STKTEST_AGENT_ASSERT(icon_id == 0);
1372         STKTEST_AGENT_ASSERT(urgent == FALSE);
1373
1374         return dbus_message_new_method_return(msg);
1375 }
1376
1377 static DBusMessage *test_display_text_85(DBusMessage *msg,
1378                                                 const char *text,
1379                                                 unsigned char icon_id,
1380                                                 gboolean urgent)
1381 {
1382         const char *expect =
1383                 "<div style=\"text-align: left;\"><span style=\"font-size: "
1384                 "small;color: #347235;background-color: #FFFF00;\">"
1385                 "Text Attribute 1</span></div>";
1386
1387         STKTEST_AGENT_ASSERT(g_str_equal(text, expect));
1388         STKTEST_AGENT_ASSERT(icon_id == 0);
1389         STKTEST_AGENT_ASSERT(urgent == FALSE);
1390
1391         return dbus_message_new_method_return(msg);
1392 }
1393
1394 static DBusMessage *test_display_text_86(DBusMessage *msg,
1395                                                 const char *text,
1396                                                 unsigned char icon_id,
1397                                                 gboolean urgent)
1398 {
1399         const char *expect =
1400                 "<div style=\"text-align: left;\"><span style=\"font-weight: "
1401                 "bold;color: #347235;background-color: #FFFF00;\">"
1402                 "Text Attribute 1</span></div>";
1403
1404         STKTEST_AGENT_ASSERT(g_str_equal(text, expect));
1405         STKTEST_AGENT_ASSERT(icon_id == 0);
1406         STKTEST_AGENT_ASSERT(urgent == FALSE);
1407
1408         return dbus_message_new_method_return(msg);
1409 }
1410
1411 static DBusMessage *test_display_text_87(DBusMessage *msg,
1412                                                 const char *text,
1413                                                 unsigned char icon_id,
1414                                                 gboolean urgent)
1415 {
1416         const char *expect =
1417                 "<div style=\"text-align: left;\"><span style=\"font-style: "
1418                 "italic;color: #347235;background-color: #FFFF00;\">"
1419                 "Text Attribute 1</span></div>";
1420
1421         STKTEST_AGENT_ASSERT(g_str_equal(text, expect));
1422         STKTEST_AGENT_ASSERT(icon_id == 0);
1423         STKTEST_AGENT_ASSERT(urgent == FALSE);
1424
1425         return dbus_message_new_method_return(msg);
1426 }
1427
1428 static DBusMessage *test_display_text_88(DBusMessage *msg,
1429                                                 const char *text,
1430                                                 unsigned char icon_id,
1431                                                 gboolean urgent)
1432 {
1433         const char *expect =
1434                 "<div style=\"text-align: left;\"><span style=\""
1435                 "text-decoration: underline;color: #347235;"
1436                 "background-color: #FFFF00;\">Text Attribute 1</span></div>";
1437
1438         STKTEST_AGENT_ASSERT(g_str_equal(text, expect));
1439         STKTEST_AGENT_ASSERT(icon_id == 0);
1440         STKTEST_AGENT_ASSERT(urgent == FALSE);
1441
1442         return dbus_message_new_method_return(msg);
1443 }
1444
1445 static DBusMessage *test_display_text_89(DBusMessage *msg,
1446                                                 const char *text,
1447                                                 unsigned char icon_id,
1448                                                 gboolean urgent)
1449 {
1450         const char *expect =
1451                 "<div style=\"text-align: left;\"><span style=\""
1452                 "text-decoration: line-through;color: #347235;"
1453                 "background-color: #FFFF00;\">Text Attribute 1</span></div>";
1454
1455         STKTEST_AGENT_ASSERT(g_str_equal(text, expect));
1456         STKTEST_AGENT_ASSERT(icon_id == 0);
1457         STKTEST_AGENT_ASSERT(urgent == FALSE);
1458
1459         return dbus_message_new_method_return(msg);
1460 }
1461
1462 static DBusMessage *test_display_text_810(DBusMessage *msg,
1463                                                 const char *text,
1464                                                 unsigned char icon_id,
1465                                                 gboolean urgent)
1466 {
1467         const char *expect =
1468                 "<div style=\"text-align: left;\"><span style=\"color: "
1469                 "#347235;background-color: #FFFF00;\">Text Attribute 1</span>"
1470                 "</div>";
1471
1472         STKTEST_AGENT_ASSERT(g_str_equal(text, expect));
1473         STKTEST_AGENT_ASSERT(icon_id == 0);
1474         STKTEST_AGENT_ASSERT(urgent == FALSE);
1475
1476         return dbus_message_new_method_return(msg);
1477 }
1478
1479 static DBusMessage *test_display_text_91(DBusMessage *msg,
1480                                                 const char *text,
1481                                                 unsigned char icon_id,
1482                                                 gboolean urgent)
1483 {
1484         const char *expect = "你好";
1485
1486         STKTEST_AGENT_ASSERT(g_str_equal(text, expect));
1487         STKTEST_AGENT_ASSERT(icon_id == 0);
1488         STKTEST_AGENT_ASSERT(urgent == FALSE);
1489
1490         return dbus_message_new_method_return(msg);
1491 }
1492
1493 static DBusMessage *test_display_text_101(DBusMessage *msg,
1494                                                 const char *text,
1495                                                 unsigned char icon_id,
1496                                                 gboolean urgent)
1497 {
1498         const char *expect = "80ル";
1499
1500         STKTEST_AGENT_ASSERT(g_str_equal(text, expect));
1501         STKTEST_AGENT_ASSERT(icon_id == 0);
1502         STKTEST_AGENT_ASSERT(urgent == FALSE);
1503
1504         return dbus_message_new_method_return(msg);
1505 }
1506
1507 static DBusMessage *test_get_inkey_11(DBusMessage *msg,
1508                                         const char *alpha,
1509                                         unsigned char icon_id)
1510 {
1511         DBusMessage *reply;
1512         const char *ret = "+";
1513
1514         STKTEST_AGENT_ASSERT(g_str_equal(alpha, "Enter \"+\""));
1515         STKTEST_AGENT_ASSERT(icon_id == 0);
1516
1517         reply = dbus_message_new_method_return(msg);
1518         dbus_message_append_args(reply, DBUS_TYPE_STRING, &ret,
1519                                         DBUS_TYPE_INVALID);
1520
1521         return reply;
1522 }
1523
1524 static DBusMessage *test_get_inkey_12(DBusMessage *msg,
1525                                         const char *alpha,
1526                                         unsigned char icon_id)
1527 {
1528         DBusMessage *reply;
1529         const char *ret = "0";
1530
1531         STKTEST_AGENT_ASSERT(g_str_equal(alpha, "Enter \"0\""));
1532         STKTEST_AGENT_ASSERT(icon_id == 0);
1533
1534         reply = dbus_message_new_method_return(msg);
1535         dbus_message_append_args(reply, DBUS_TYPE_STRING, &ret,
1536                                         DBUS_TYPE_INVALID);
1537
1538         return reply;
1539 }
1540
1541 static DBusMessage *test_get_inkey_13(DBusMessage *msg,
1542                                         const char *alpha,
1543                                         unsigned char icon_id)
1544 {
1545         STKTEST_AGENT_ASSERT(g_str_equal(alpha, "&lt;GO-BACKWARDS&gt;"));
1546         STKTEST_AGENT_ASSERT(icon_id == 0);
1547
1548         return stktest_error_go_back(msg);
1549 }
1550
1551 static DBusMessage *test_get_inkey_14(DBusMessage *msg,
1552                                         const char *alpha,
1553                                         unsigned char icon_id)
1554 {
1555         STKTEST_AGENT_ASSERT(g_str_equal(alpha, "&lt;ABORT&gt;"));
1556         STKTEST_AGENT_ASSERT(icon_id == 0);
1557
1558         return stktest_error_end_session(msg);
1559 }
1560
1561 static DBusMessage *test_get_inkey_15(DBusMessage *msg,
1562                                         const char *alpha,
1563                                         unsigned char icon_id)
1564 {
1565         DBusMessage *reply;
1566         const char *ret = "q";
1567
1568         STKTEST_AGENT_ASSERT(g_str_equal(alpha, "Enter \"q\""));
1569         STKTEST_AGENT_ASSERT(icon_id == 0);
1570
1571         reply = dbus_message_new_method_return(msg);
1572         dbus_message_append_args(reply, DBUS_TYPE_STRING, &ret,
1573                                         DBUS_TYPE_INVALID);
1574
1575         return reply;
1576 }
1577
1578 static DBusMessage *test_get_inkey_16(DBusMessage *msg,
1579                                         const char *alpha,
1580                                         unsigned char icon_id)
1581 {
1582         DBusMessage *reply;
1583         const char *ret = "x";
1584         const char *expected =
1585                 "Enter \"x\". This command instructs the ME to display text, "
1586                 "and to expect the user to enter a single character. Any "
1587                 "response entered by the user shall be passed t";
1588
1589         STKTEST_AGENT_ASSERT(g_str_equal(alpha, expected));
1590         STKTEST_AGENT_ASSERT(icon_id == 0);
1591
1592         reply = dbus_message_new_method_return(msg);
1593         dbus_message_append_args(reply, DBUS_TYPE_STRING, &ret,
1594                                         DBUS_TYPE_INVALID);
1595
1596         return reply;
1597 }
1598
1599 static DBusMessage *test_get_inkey_21(DBusMessage *msg,
1600                                         const char *text, unsigned char icon_id)
1601 {
1602         STKTEST_AGENT_ASSERT(g_str_equal(text, "&lt;TIME-OUT&gt;"));
1603         STKTEST_AGENT_ASSERT(icon_id == 0);
1604
1605         return NULL;
1606 }
1607
1608 static DBusMessage *test_get_inkey_31(DBusMessage *msg,
1609                                         const char *alpha,
1610                                         unsigned char icon_id)
1611 {
1612         DBusMessage *reply;
1613         const char *ret = "+";
1614
1615         STKTEST_AGENT_ASSERT(g_str_equal(alpha, "ЗДРАВСТВУЙТЕ"));
1616         STKTEST_AGENT_ASSERT(icon_id == 0);
1617
1618         reply = dbus_message_new_method_return(msg);
1619         dbus_message_append_args(reply, DBUS_TYPE_STRING, &ret,
1620                                         DBUS_TYPE_INVALID);
1621
1622         return reply;
1623 }
1624
1625 static DBusMessage *test_get_inkey_32(DBusMessage *msg,
1626                                         const char *alpha,
1627                                         unsigned char icon_id)
1628 {
1629         DBusMessage *reply;
1630         const char *ret = "+";
1631         const char *expect = "ЗДРАВСТВУЙТЕЗДРАВСТВУЙТЕ"
1632                                 "ЗДРАВСТВУЙТЕЗДРАВСТВУЙТЕ"
1633                                 "ЗДРАВСТВУЙТЕЗДРАВСТВУЙ";
1634
1635         STKTEST_AGENT_ASSERT(g_str_equal(alpha, expect));
1636         STKTEST_AGENT_ASSERT(icon_id == 0);
1637
1638         reply = dbus_message_new_method_return(msg);
1639         dbus_message_append_args(reply, DBUS_TYPE_STRING, &ret,
1640                                         DBUS_TYPE_INVALID);
1641
1642         return reply;
1643 }
1644
1645 static DBusMessage *test_get_inkey_41(DBusMessage *msg,
1646                                         const char *alpha,
1647                                         unsigned char icon_id)
1648 {
1649         DBusMessage *reply;
1650         const char *ret = "Д";
1651
1652         STKTEST_AGENT_ASSERT(g_str_equal(alpha, "Enter"));
1653         STKTEST_AGENT_ASSERT(icon_id == 0);
1654
1655         reply = dbus_message_new_method_return(msg);
1656         dbus_message_append_args(reply, DBUS_TYPE_STRING, &ret,
1657                                         DBUS_TYPE_INVALID);
1658
1659         return reply;
1660 }
1661
1662 static DBusMessage *test_get_inkey_51a(DBusMessage *msg,
1663                                         const char *alpha,
1664                                         unsigned char icon_id)
1665 {
1666         DBusMessage *reply;
1667         dbus_bool_t ret = 1;
1668
1669         STKTEST_AGENT_ASSERT(g_str_equal(alpha, "Enter YES"));
1670         STKTEST_AGENT_ASSERT(icon_id == 0);
1671
1672         reply = dbus_message_new_method_return(msg);
1673         dbus_message_append_args(reply, DBUS_TYPE_BOOLEAN, &ret,
1674                                         DBUS_TYPE_INVALID);
1675
1676         return reply;
1677 }
1678
1679 static DBusMessage *test_get_inkey_51b(DBusMessage *msg,
1680                                         const char *alpha,
1681                                         unsigned char icon_id)
1682 {
1683         DBusMessage *reply;
1684         dbus_bool_t ret = 0;
1685
1686         STKTEST_AGENT_ASSERT(g_str_equal(alpha, "Enter NO"));
1687         STKTEST_AGENT_ASSERT(icon_id == 0);
1688
1689         reply = dbus_message_new_method_return(msg);
1690         dbus_message_append_args(reply, DBUS_TYPE_BOOLEAN, &ret,
1691                                         DBUS_TYPE_INVALID);
1692
1693         return reply;
1694 }
1695
1696 static DBusMessage *test_get_inkey_61(DBusMessage *msg,
1697                                         const char *alpha,
1698                                         unsigned char icon_id)
1699 {
1700         DBusMessage *reply;
1701         const char *ret = "+";
1702
1703         STKTEST_AGENT_ASSERT(g_str_equal(alpha, "&lt;NO-ICON&gt;"));
1704         STKTEST_AGENT_ASSERT(icon_id == 1);
1705
1706         reply = dbus_message_new_method_return(msg);
1707         dbus_message_append_args(reply, DBUS_TYPE_STRING, &ret,
1708                                         DBUS_TYPE_INVALID);
1709
1710         return reply;
1711 }
1712
1713 static DBusMessage *test_get_inkey_62(DBusMessage *msg,
1714                                         const char *alpha,
1715                                         unsigned char icon_id)
1716 {
1717         DBusMessage *reply;
1718         const char *ret = "+";
1719
1720         STKTEST_AGENT_ASSERT(g_str_equal(alpha, "&lt;BASIC-ICON&gt;"));
1721         STKTEST_AGENT_ASSERT(icon_id == 1);
1722
1723         reply = dbus_message_new_method_return(msg);
1724         dbus_message_append_args(reply, DBUS_TYPE_STRING, &ret,
1725                                         DBUS_TYPE_INVALID);
1726
1727         return reply;
1728 }
1729
1730 static DBusMessage *test_get_inkey_63(DBusMessage *msg,
1731                                         const char *alpha,
1732                                         unsigned char icon_id)
1733 {
1734         DBusMessage *reply;
1735         const char *ret = "+";
1736
1737         STKTEST_AGENT_ASSERT(g_str_equal(alpha, "&lt;NO-ICON&gt;"));
1738         STKTEST_AGENT_ASSERT(icon_id == 2);
1739
1740         reply = dbus_message_new_method_return(msg);
1741         dbus_message_append_args(reply, DBUS_TYPE_STRING, &ret,
1742                                         DBUS_TYPE_INVALID);
1743
1744         return reply;
1745 }
1746
1747 static DBusMessage *test_get_inkey_64(DBusMessage *msg,
1748                                         const char *alpha,
1749                                         unsigned char icon_id)
1750 {
1751         DBusMessage *reply;
1752         const char *ret = "+";
1753
1754         STKTEST_AGENT_ASSERT(g_str_equal(alpha, "&lt;COLOUR-ICON&gt;"));
1755         STKTEST_AGENT_ASSERT(icon_id == 2);
1756
1757         reply = dbus_message_new_method_return(msg);
1758         dbus_message_append_args(reply, DBUS_TYPE_STRING, &ret,
1759                                         DBUS_TYPE_INVALID);
1760
1761         return reply;
1762 }
1763
1764 static DBusMessage *test_get_inkey_81(DBusMessage *msg,
1765                                         const char *alpha,
1766                                         unsigned char icon_id)
1767 {
1768         STKTEST_AGENT_ASSERT(g_str_equal(alpha, "Enter \"+\""));
1769         STKTEST_AGENT_ASSERT(icon_id == 0);
1770
1771         return NULL;
1772 }
1773
1774 static DBusMessage *test_get_inkey_91(DBusMessage *msg,
1775                                         const char *alpha,
1776                                         unsigned char icon_id)
1777 {
1778         DBusMessage *reply;
1779         const char *ret = "+";
1780         const char *expect =
1781                 "<div style=\"text-align: left;\"><span style=\"color: "
1782                 "#347235;background-color: #FFFF00;\">Enter \"+\"</span></div>";
1783
1784         STKTEST_AGENT_ASSERT(g_str_equal(alpha, expect));
1785         STKTEST_AGENT_ASSERT(icon_id == 0);
1786
1787         reply = dbus_message_new_method_return(msg);
1788         dbus_message_append_args(reply, DBUS_TYPE_STRING, &ret,
1789                                         DBUS_TYPE_INVALID);
1790
1791         return reply;
1792 }
1793
1794 static DBusMessage *test_get_inkey_92(DBusMessage *msg,
1795                                         const char *alpha,
1796                                         unsigned char icon_id)
1797 {
1798         DBusMessage *reply;
1799         const char *ret = "+";
1800         const char *expect =
1801                 "<div style=\"text-align: center;\"><span style=\"color: "
1802                 "#347235;background-color: #FFFF00;\">Enter \"+\"</span>"
1803                 "</div>";
1804
1805         STKTEST_AGENT_ASSERT(g_str_equal(alpha, expect));
1806         STKTEST_AGENT_ASSERT(icon_id == 0);
1807
1808         reply = dbus_message_new_method_return(msg);
1809         dbus_message_append_args(reply, DBUS_TYPE_STRING, &ret,
1810                                         DBUS_TYPE_INVALID);
1811
1812         return reply;
1813 }
1814
1815 static DBusMessage *test_get_inkey_93(DBusMessage *msg,
1816                                         const char *alpha,
1817                                         unsigned char icon_id)
1818 {
1819         DBusMessage *reply;
1820         const char *ret = "+";
1821         const char *expect =
1822                 "<div style=\"text-align: right;\"><span style=\"color: "
1823                 "#347235;background-color: #FFFF00;\">Enter \"+\"</span>"
1824                 "</div>";
1825
1826         STKTEST_AGENT_ASSERT(g_str_equal(alpha, expect));
1827         STKTEST_AGENT_ASSERT(icon_id == 0);
1828
1829         reply = dbus_message_new_method_return(msg);
1830         dbus_message_append_args(reply, DBUS_TYPE_STRING, &ret,
1831                                         DBUS_TYPE_INVALID);
1832
1833         return reply;
1834 }
1835
1836 static DBusMessage *test_get_inkey_94(DBusMessage *msg,
1837                                         const char *alpha,
1838                                         unsigned char icon_id)
1839 {
1840         DBusMessage *reply;
1841         const char *ret = "+";
1842         const char *expect =
1843                 "<div style=\"text-align: left;\"><span style=\"font-size: "
1844                 "big;color: #347235;background-color: #FFFF00;\">Enter \"+\""
1845                 "</span></div>";
1846
1847         STKTEST_AGENT_ASSERT(g_str_equal(alpha, expect));
1848         STKTEST_AGENT_ASSERT(icon_id == 0);
1849
1850         reply = dbus_message_new_method_return(msg);
1851         dbus_message_append_args(reply, DBUS_TYPE_STRING, &ret,
1852                                         DBUS_TYPE_INVALID);
1853
1854         return reply;
1855 }
1856
1857 static DBusMessage *test_get_inkey_95(DBusMessage *msg,
1858                                         const char *alpha,
1859                                         unsigned char icon_id)
1860 {
1861         DBusMessage *reply;
1862         const char *ret = "+";
1863         const char *expect =
1864                 "<div style=\"text-align: left;\"><span style=\"font-size: "
1865                 "small;color: #347235;background-color: #FFFF00;\">"
1866                 "Enter \"+\"</span></div>";
1867
1868         STKTEST_AGENT_ASSERT(g_str_equal(alpha, expect));
1869         STKTEST_AGENT_ASSERT(icon_id == 0);
1870
1871         reply = dbus_message_new_method_return(msg);
1872         dbus_message_append_args(reply, DBUS_TYPE_STRING, &ret,
1873                                         DBUS_TYPE_INVALID);
1874
1875         return reply;
1876 }
1877
1878 static DBusMessage *test_get_inkey_96(DBusMessage *msg,
1879                                         const char *alpha,
1880                                         unsigned char icon_id)
1881 {
1882         DBusMessage *reply;
1883         const char *ret = "+";
1884         const char *expect =
1885                 "<div style=\"text-align: left;\"><span style=\"font-weight: "
1886                 "bold;color: #347235;background-color: #FFFF00;\">Enter \"+\""
1887                 "</span></div>";
1888
1889         STKTEST_AGENT_ASSERT(g_str_equal(alpha, expect));
1890         STKTEST_AGENT_ASSERT(icon_id == 0);
1891
1892         reply = dbus_message_new_method_return(msg);
1893         dbus_message_append_args(reply, DBUS_TYPE_STRING, &ret,
1894                                         DBUS_TYPE_INVALID);
1895
1896         return reply;
1897 }
1898
1899 static DBusMessage *test_get_inkey_97(DBusMessage *msg,
1900                                         const char *alpha,
1901                                         unsigned char icon_id)
1902 {
1903         DBusMessage *reply;
1904         const char *ret = "+";
1905         const char *expect =
1906                 "<div style=\"text-align: left;\"><span style=\"font-style: "
1907                 "italic;color: #347235;background-color: #FFFF00;\">"
1908                 "Enter \"+\"</span></div>";
1909
1910         STKTEST_AGENT_ASSERT(g_str_equal(alpha, expect));
1911         STKTEST_AGENT_ASSERT(icon_id == 0);
1912
1913         reply = dbus_message_new_method_return(msg);
1914         dbus_message_append_args(reply, DBUS_TYPE_STRING, &ret,
1915                                         DBUS_TYPE_INVALID);
1916
1917         return reply;
1918 }
1919
1920 static DBusMessage *test_get_inkey_98(DBusMessage *msg,
1921                                         const char *alpha,
1922                                         unsigned char icon_id)
1923 {
1924         DBusMessage *reply;
1925         const char *ret = "+";
1926         const char *expect =
1927                 "<div style=\"text-align: left;\"><span style=\""
1928                 "text-decoration: underline;color: #347235;"
1929                 "background-color: #FFFF00;\">Enter \"+\"</span></div>";
1930
1931         STKTEST_AGENT_ASSERT(g_str_equal(alpha, expect));
1932         STKTEST_AGENT_ASSERT(icon_id == 0);
1933
1934         reply = dbus_message_new_method_return(msg);
1935         dbus_message_append_args(reply, DBUS_TYPE_STRING, &ret,
1936                                         DBUS_TYPE_INVALID);
1937
1938         return reply;
1939 }
1940
1941 static DBusMessage *test_get_inkey_99(DBusMessage *msg,
1942                                         const char *alpha,
1943                                         unsigned char icon_id)
1944 {
1945         DBusMessage *reply;
1946         const char *ret = "+";
1947         const char *expect =
1948                 "<div style=\"text-align: left;\"><span style=\""
1949                 "text-decoration: line-through;color: #347235;"
1950                 "background-color: #FFFF00;\">Enter \"+\"</span></div>";
1951
1952         STKTEST_AGENT_ASSERT(g_str_equal(alpha, expect));
1953         STKTEST_AGENT_ASSERT(icon_id == 0);
1954
1955         reply = dbus_message_new_method_return(msg);
1956         dbus_message_append_args(reply, DBUS_TYPE_STRING, &ret,
1957                                         DBUS_TYPE_INVALID);
1958
1959         return reply;
1960 }
1961
1962 static DBusMessage *test_get_inkey_910(DBusMessage *msg,
1963                                         const char *alpha,
1964                                         unsigned char icon_id)
1965 {
1966         DBusMessage *reply;
1967         const char *ret = "+";
1968         const char *expect =
1969                 "<div style=\"text-align: left;\"><span style=\"color: "
1970                 "#347235;background-color: #FFFF00;\">Enter \"+\"</span></div>";
1971
1972         STKTEST_AGENT_ASSERT(g_str_equal(alpha, expect));
1973         STKTEST_AGENT_ASSERT(icon_id == 0);
1974
1975         reply = dbus_message_new_method_return(msg);
1976         dbus_message_append_args(reply, DBUS_TYPE_STRING, &ret,
1977                                         DBUS_TYPE_INVALID);
1978
1979         return reply;
1980 }
1981
1982 static DBusMessage *test_get_inkey_101(DBusMessage *msg,
1983                                         const char *alpha,
1984                                         unsigned char icon_id)
1985 {
1986         DBusMessage *reply;
1987         const char *ret = "+";
1988         const char *expect = "你好";
1989
1990         STKTEST_AGENT_ASSERT(g_str_equal(alpha, expect));
1991         STKTEST_AGENT_ASSERT(icon_id == 0);
1992
1993         reply = dbus_message_new_method_return(msg);
1994         dbus_message_append_args(reply, DBUS_TYPE_STRING, &ret,
1995                                         DBUS_TYPE_INVALID);
1996
1997         return reply;
1998 }
1999
2000 static DBusMessage *test_get_inkey_102(DBusMessage *msg,
2001                                         const char *alpha,
2002                                         unsigned char icon_id)
2003 {
2004         DBusMessage *reply;
2005         const char *ret = "+";
2006         const char *expect =
2007                 "你好你好你好你好你好你好你好你好你好你好"
2008                 "你好你好你好你好你好你好你好你好你好你好"
2009                 "你好你好你好你好你好你好你好你好你好你好"
2010                 "你好你好你好你好你好";
2011
2012         STKTEST_AGENT_ASSERT(g_str_equal(alpha, expect));
2013         STKTEST_AGENT_ASSERT(icon_id == 0);
2014
2015         reply = dbus_message_new_method_return(msg);
2016         dbus_message_append_args(reply, DBUS_TYPE_STRING, &ret,
2017                                         DBUS_TYPE_INVALID);
2018
2019         return reply;
2020 }
2021
2022 static DBusMessage *test_get_inkey_111(DBusMessage *msg,
2023                                         const char *alpha,
2024                                         unsigned char icon_id)
2025 {
2026         DBusMessage *reply;
2027         const char *ret = "好";
2028
2029         STKTEST_AGENT_ASSERT(g_str_equal(alpha, "Enter"));
2030         STKTEST_AGENT_ASSERT(icon_id == 0);
2031
2032         reply = dbus_message_new_method_return(msg);
2033         dbus_message_append_args(reply, DBUS_TYPE_STRING, &ret,
2034                                         DBUS_TYPE_INVALID);
2035
2036         return reply;
2037 }
2038
2039 static DBusMessage *test_get_inkey_121(DBusMessage *msg,
2040                                         const char *alpha,
2041                                         unsigned char icon_id)
2042 {
2043         DBusMessage *reply;
2044         const char *ret = "+";
2045         const char *expect = "ル";
2046
2047         STKTEST_AGENT_ASSERT(g_str_equal(alpha, expect));
2048         STKTEST_AGENT_ASSERT(icon_id == 0);
2049
2050         reply = dbus_message_new_method_return(msg);
2051         dbus_message_append_args(reply, DBUS_TYPE_STRING, &ret,
2052                                         DBUS_TYPE_INVALID);
2053
2054         return reply;
2055 }
2056
2057 static DBusMessage *test_get_inkey_122(DBusMessage *msg,
2058                                         const char *alpha,
2059                                         unsigned char icon_id)
2060 {
2061         DBusMessage *reply;
2062         const char *ret = "+";
2063         const char *expect =
2064                 "ルルルルルルルルルルルルルルルルルルルル"
2065                 "ルルルルルルルルルルルルルルルルルルルル"
2066                 "ルルルルルルルルルルルルルルルルルルルル"
2067                 "ルルルルルルルルルル";
2068
2069         STKTEST_AGENT_ASSERT(g_str_equal(alpha, expect));
2070         STKTEST_AGENT_ASSERT(icon_id == 0);
2071
2072         reply = dbus_message_new_method_return(msg);
2073         dbus_message_append_args(reply, DBUS_TYPE_STRING, &ret,
2074                                         DBUS_TYPE_INVALID);
2075
2076         return reply;
2077 }
2078
2079 static DBusMessage *test_get_inkey_131(DBusMessage *msg,
2080                                         const char *alpha,
2081                                         unsigned char icon_id)
2082 {
2083         DBusMessage *reply;
2084         const char *ret = "ル";
2085
2086         STKTEST_AGENT_ASSERT(g_str_equal(alpha, "Enter"));
2087         STKTEST_AGENT_ASSERT(icon_id == 0);
2088
2089         reply = dbus_message_new_method_return(msg);
2090         dbus_message_append_args(reply, DBUS_TYPE_STRING, &ret,
2091                                         DBUS_TYPE_INVALID);
2092
2093         return reply;
2094 }
2095
2096 static void power_down_reply(DBusPendingCall *call, void *user_data)
2097 {
2098         __stktest_test_next();
2099 }
2100
2101 void __stktest_test_finish(gboolean successful)
2102 {
2103         struct test *test = cur_test->data;
2104         dbus_bool_t powered = FALSE;
2105
2106         test->result = successful ? TEST_RESULT_PASSED : TEST_RESULT_FAILED;
2107
2108         state = TEST_STATE_POWERING_DOWN;
2109         set_property(STKTEST_PATH, OFONO_MODEM_INTERFACE, "Powered",
2110                         DBUS_TYPE_BOOLEAN, &powered,
2111                         power_down_reply, NULL, NULL);
2112 }
2113
2114 void __stktest_test_next()
2115 {
2116         if (cur_test == NULL)
2117                 cur_test = tests;
2118         else
2119                 cur_test = cur_test->next;
2120
2121         if (cur_test == NULL) {
2122                 g_main_loop_quit(main_loop);
2123                 return;
2124         }
2125
2126         powerup();
2127 }
2128
2129 static void stktest_add_test(const char *name, const char *method,
2130                                 const unsigned char *req, unsigned int req_len,
2131                                 const unsigned char *rsp, unsigned int rsp_len,
2132                                 void *agent_func,
2133                                 terminal_response_func tr_func)
2134 {
2135         struct test *test = g_new0(struct test, 1);
2136
2137         test->name = g_strdup(name);
2138         test->method = g_strdup(method);
2139         test->req_pdu = g_memdup(req, req_len);
2140         test->req_len = req_len;
2141         test->rsp_pdu = g_memdup(rsp, rsp_len);
2142         test->rsp_len = rsp_len;
2143         test->agent_func = agent_func;
2144         test->tr_func = tr_func;
2145
2146         tests = g_list_append(tests, test);
2147 }
2148
2149 static void __stktest_test_init(void)
2150 {
2151         stktest_add_test("Display Text 1.1", "DisplayText",
2152                                 display_text_111, sizeof(display_text_111),
2153                                 display_text_response_111,
2154                                 sizeof(display_text_response_111),
2155                                 test_display_text_11,
2156                                 expect_response_and_finish);
2157         stktest_add_test("Display Text 1.2", "DisplayText",
2158                                 display_text_111, sizeof(display_text_111),
2159                                 display_text_response_121,
2160                                 sizeof(display_text_response_121),
2161                                 test_display_text_12,
2162                                 expect_response_and_finish);
2163         stktest_add_test("Display Text 1.3", "DisplayText",
2164                                 display_text_131, sizeof(display_text_131),
2165                                 display_text_response_131,
2166                                 sizeof(display_text_response_131),
2167                                 test_display_text_13,
2168                                 expect_response_and_finish);
2169         stktest_add_test("Display Text 1.4", "DisplayText",
2170                                 display_text_141, sizeof(display_text_141),
2171                                 display_text_response_141,
2172                                 sizeof(display_text_response_141),
2173                                 test_display_text_14,
2174                                 expect_response_and_finish);
2175         stktest_add_test("Display Text 1.5", "DisplayText",
2176                                 display_text_151, sizeof(display_text_151),
2177                                 display_text_response_151,
2178                                 sizeof(display_text_response_151),
2179                                 test_display_text_15,
2180                                 expect_response_and_finish);
2181         stktest_add_test("Display Text 1.6", "DisplayText",
2182                                 display_text_161, sizeof(display_text_161),
2183                                 display_text_response_161,
2184                                 sizeof(display_text_response_161),
2185                                 test_display_text_16,
2186                                 expect_response_and_finish);
2187         stktest_add_test("Display Text 1.7", "DisplayText",
2188                                 display_text_171, sizeof(display_text_171),
2189                                 display_text_response_171,
2190                                 sizeof(display_text_response_171),
2191                                 test_display_text_17,
2192                                 expect_response_and_finish);
2193         stktest_add_test("Display Text 1.8", "DisplayText",
2194                                 display_text_181, sizeof(display_text_181),
2195                                 display_text_response_181,
2196                                 sizeof(display_text_response_181),
2197                                 test_display_text_18,
2198                                 expect_response_and_finish);
2199         stktest_add_test("Display Text 1.9", "DisplayText",
2200                                 display_text_191, sizeof(display_text_191),
2201                                 display_text_response_191,
2202                                 sizeof(display_text_response_191),
2203                                 NULL, expect_response_and_finish);
2204         stktest_add_test("Display Text 2.1", "DisplayText",
2205                                 display_text_211, sizeof(display_text_211),
2206                                 display_text_response_211,
2207                                 sizeof(display_text_response_211),
2208                                 test_display_text_21,
2209                                 expect_response_and_finish);
2210         stktest_add_test("Display Text 3.1", "DisplayText",
2211                                 display_text_311, sizeof(display_text_311),
2212                                 display_text_response_311,
2213                                 sizeof(display_text_response_311),
2214                                 test_display_text_31,
2215                                 expect_response_and_finish);
2216         stktest_add_test("Display Text 4.1", "DisplayText",
2217                                 display_text_411, sizeof(display_text_411),
2218                                 display_text_response_411,
2219                                 sizeof(display_text_response_411),
2220                                 test_display_text_41,
2221                                 expect_response_and_not_canceled_after_3);
2222         stktest_add_test("Display Text 4.2", "DisplayText",
2223                                 display_text_421, sizeof(display_text_421),
2224                                 display_text_response_421,
2225                                 sizeof(display_text_response_421),
2226                                 test_display_text_42,
2227                                 expect_response_and_canceled_after_21);
2228         stktest_add_test("Display Text 4.3", "DisplayText",
2229                                 display_text_431, sizeof(display_text_431),
2230                                 display_text_response_431,
2231                                 sizeof(display_text_response_431),
2232                                 test_display_text_43, expect_response);
2233         stktest_add_test("Display Text 5.1A", "DisplayText",
2234                                 display_text_511, sizeof(display_text_511),
2235                                 display_text_response_511a,
2236                                 sizeof(display_text_response_511a),
2237                                 test_display_text_51,
2238                                 expect_response_and_finish);
2239         stktest_add_test("Display Text 5.2A", "DisplayText",
2240                                 display_text_521, sizeof(display_text_521),
2241                                 display_text_response_521a,
2242                                 sizeof(display_text_response_521a),
2243                                 test_display_text_52,
2244                                 expect_response_and_finish);
2245         stktest_add_test("Display Text 5.3A", "DisplayText",
2246                                 display_text_531, sizeof(display_text_531),
2247                                 display_text_response_531a,
2248                                 sizeof(display_text_response_531a),
2249                                 test_display_text_53,
2250                                 expect_response_and_finish);
2251         stktest_add_test("Display Text 6.1", "DisplayText",
2252                                 display_text_611, sizeof(display_text_611),
2253                                 display_text_response_611,
2254                                 sizeof(display_text_response_611),
2255                                 test_display_text_61,
2256                                 expect_response_and_finish);
2257         stktest_add_test("Display Text 7.1", "DisplayText",
2258                                 display_text_711, sizeof(display_text_711),
2259                                 display_text_response_711,
2260                                 sizeof(display_text_response_711),
2261                                 test_display_text_71,
2262                                 expect_response_and_finish);
2263         /*
2264          * We skip parts where the UI is asked to display simple text to ensure
2265          * that the alignment, font is set up correctly and not 'remembered'
2266          * from a previous state.  oFono does not keep any state of the
2267          * previous commands
2268          */
2269         stktest_add_test("Display Text 8.1", "DisplayText",
2270                                 display_text_811, sizeof(display_text_811),
2271                                 display_text_response_811,
2272                                 sizeof(display_text_response_811),
2273                                 test_display_text_81,
2274                                 expect_response_and_finish);
2275         stktest_add_test("Display Text 8.2", "DisplayText",
2276                                 display_text_821, sizeof(display_text_821),
2277                                 display_text_response_821,
2278                                 sizeof(display_text_response_821),
2279                                 test_display_text_82,
2280                                 expect_response_and_finish);
2281         stktest_add_test("Display Text 8.3", "DisplayText",
2282                                 display_text_831, sizeof(display_text_831),
2283                                 display_text_response_831,
2284                                 sizeof(display_text_response_831),
2285                                 test_display_text_83,
2286                                 expect_response_and_finish);
2287         stktest_add_test("Display Text 8.4", "DisplayText",
2288                                 display_text_841, sizeof(display_text_841),
2289                                 display_text_response_841,
2290                                 sizeof(display_text_response_841),
2291                                 test_display_text_84,
2292                                 expect_response_and_finish);
2293         stktest_add_test("Display Text 8.5", "DisplayText",
2294                                 display_text_851, sizeof(display_text_851),
2295                                 display_text_response_851,
2296                                 sizeof(display_text_response_851),
2297                                 test_display_text_85,
2298                                 expect_response_and_finish);
2299         stktest_add_test("Display Text 8.6", "DisplayText",
2300                                 display_text_861, sizeof(display_text_861),
2301                                 display_text_response_861,
2302                                 sizeof(display_text_response_861),
2303                                 test_display_text_86,
2304                                 expect_response_and_finish);
2305         stktest_add_test("Display Text 8.7", "DisplayText",
2306                                 display_text_871, sizeof(display_text_871),
2307                                 display_text_response_871,
2308                                 sizeof(display_text_response_871),
2309                                 test_display_text_87,
2310                                 expect_response_and_finish);
2311         stktest_add_test("Display Text 8.8", "DisplayText",
2312                                 display_text_881, sizeof(display_text_881),
2313                                 display_text_response_881,
2314                                 sizeof(display_text_response_881),
2315                                 test_display_text_88,
2316                                 expect_response_and_finish);
2317         stktest_add_test("Display Text 8.9", "DisplayText",
2318                                 display_text_891, sizeof(display_text_891),
2319                                 display_text_response_891,
2320                                 sizeof(display_text_response_891),
2321                                 test_display_text_89,
2322                                 expect_response_and_finish);
2323         stktest_add_test("Display Text 8.10", "DisplayText",
2324                                 display_text_8101, sizeof(display_text_8101),
2325                                 display_text_response_8101,
2326                                 sizeof(display_text_response_8101),
2327                                 test_display_text_810,
2328                                 expect_response_and_finish);
2329         stktest_add_test("Display Text 9.1", "DisplayText",
2330                                 display_text_911, sizeof(display_text_911),
2331                                 display_text_response_911,
2332                                 sizeof(display_text_response_911),
2333                                 test_display_text_91,
2334                                 expect_response_and_finish);
2335         stktest_add_test("Display Text 10.1", "DisplayText",
2336                                 display_text_1011, sizeof(display_text_1011),
2337                                 display_text_response_1011,
2338                                 sizeof(display_text_response_1011),
2339                                 test_display_text_101,
2340                                 expect_response_and_finish);
2341         stktest_add_test("Get Inkey 1.1", "RequestDigit",
2342                                 get_inkey_111, sizeof(get_inkey_111),
2343                                 get_inkey_response_111,
2344                                 sizeof(get_inkey_response_111),
2345                                 test_get_inkey_11,
2346                                 expect_response_and_finish);
2347         stktest_add_test("Get Inkey 1.2", "RequestDigit",
2348                                 get_inkey_121, sizeof(get_inkey_121),
2349                                 get_inkey_response_121,
2350                                 sizeof(get_inkey_response_121),
2351                                 test_get_inkey_12,
2352                                 expect_response_and_finish);
2353         stktest_add_test("Get Inkey 1.3", "RequestDigit",
2354                                 get_inkey_131, sizeof(get_inkey_131),
2355                                 get_inkey_response_131,
2356                                 sizeof(get_inkey_response_131),
2357                                 test_get_inkey_13,
2358                                 expect_response_and_finish);
2359         stktest_add_test("Get Inkey 1.4", "RequestDigit",
2360                                 get_inkey_141, sizeof(get_inkey_141),
2361                                 get_inkey_response_141,
2362                                 sizeof(get_inkey_response_141),
2363                                 test_get_inkey_14,
2364                                 expect_response_and_finish);
2365         stktest_add_test("Get Inkey 1.5", "RequestKey",
2366                                 get_inkey_151, sizeof(get_inkey_151),
2367                                 get_inkey_response_151,
2368                                 sizeof(get_inkey_response_151),
2369                                 test_get_inkey_15,
2370                                 expect_response_and_finish);
2371         stktest_add_test("Get Inkey 1.6", "RequestKey",
2372                                 get_inkey_161, sizeof(get_inkey_161),
2373                                 get_inkey_response_161,
2374                                 sizeof(get_inkey_response_161),
2375                                 test_get_inkey_16,
2376                                 expect_response_and_finish);
2377         stktest_add_test("Get Inkey 2.1", "RequestDigit",
2378                                 get_inkey_211, sizeof(get_inkey_211),
2379                                 get_inkey_response_211,
2380                                 sizeof(get_inkey_response_211),
2381                                 test_get_inkey_21,
2382                                 expect_response_and_finish);
2383         stktest_add_test("Get Inkey 3.1", "RequestDigit",
2384                                 get_inkey_311, sizeof(get_inkey_311),
2385                                 get_inkey_response_311,
2386                                 sizeof(get_inkey_response_311),
2387                                 test_get_inkey_31,
2388                                 expect_response_and_finish);
2389         stktest_add_test("Get Inkey 3.2", "RequestDigit",
2390                                 get_inkey_321, sizeof(get_inkey_321),
2391                                 get_inkey_response_321,
2392                                 sizeof(get_inkey_response_321),
2393                                 test_get_inkey_32,
2394                                 expect_response_and_finish);
2395         stktest_add_test("Get Inkey 4.1", "RequestKey",
2396                                 get_inkey_411, sizeof(get_inkey_411),
2397                                 get_inkey_response_411,
2398                                 sizeof(get_inkey_response_411),
2399                                 test_get_inkey_41,
2400                                 expect_response_and_finish);
2401         stktest_add_test("Get Inkey 5.1a", "RequestConfirmation",
2402                                 get_inkey_511, sizeof(get_inkey_511),
2403                                 get_inkey_response_511,
2404                                 sizeof(get_inkey_response_511),
2405                                 test_get_inkey_51a,
2406                                 expect_response_and_finish);
2407         stktest_add_test("Get Inkey 5.1b", "RequestConfirmation",
2408                                 get_inkey_512, sizeof(get_inkey_512),
2409                                 get_inkey_response_512,
2410                                 sizeof(get_inkey_response_512),
2411                                 test_get_inkey_51b,
2412                                 expect_response_and_finish);
2413         stktest_add_test("Get Inkey 6.1", "RequestDigit",
2414                                 get_inkey_611, sizeof(get_inkey_611),
2415                                 get_inkey_response_611,
2416                                 sizeof(get_inkey_response_611),
2417                                 test_get_inkey_61,
2418                                 expect_response_and_finish);
2419         stktest_add_test("Get Inkey 6.2", "RequestDigit",
2420                                 get_inkey_621, sizeof(get_inkey_621),
2421                                 get_inkey_response_621,
2422                                 sizeof(get_inkey_response_621),
2423                                 test_get_inkey_62,
2424                                 expect_response_and_finish);
2425         stktest_add_test("Get Inkey 6.3", "RequestDigit",
2426                                 get_inkey_631, sizeof(get_inkey_631),
2427                                 get_inkey_response_631,
2428                                 sizeof(get_inkey_response_631),
2429                                 test_get_inkey_63,
2430                                 expect_response_and_finish);
2431         stktest_add_test("Get Inkey 6.4", "RequestDigit",
2432                                 get_inkey_641, sizeof(get_inkey_641),
2433                                 get_inkey_response_641,
2434                                 sizeof(get_inkey_response_641),
2435                                 test_get_inkey_64,
2436                                 expect_response_and_finish);
2437         /* Test Sequence for GetInkey 7.1 skipped, we do not support help */
2438         stktest_add_test("Get Inkey 8.1", "RequestDigit",
2439                                 get_inkey_811, sizeof(get_inkey_811),
2440                                 get_inkey_response_811,
2441                                 sizeof(get_inkey_response_811),
2442                                 test_get_inkey_81,
2443                                 expect_response_and_finish);
2444         stktest_add_test("Get Inkey 9.1", "RequestDigit",
2445                                 get_inkey_911, sizeof(get_inkey_911),
2446                                 get_inkey_response_911,
2447                                 sizeof(get_inkey_response_911),
2448                                 test_get_inkey_91,
2449                                 expect_response_and_finish);
2450         stktest_add_test("Get Inkey 9.2", "RequestDigit",
2451                                 get_inkey_921, sizeof(get_inkey_921),
2452                                 get_inkey_response_921,
2453                                 sizeof(get_inkey_response_921),
2454                                 test_get_inkey_92,
2455                                 expect_response_and_finish);
2456         stktest_add_test("Get Inkey 9.3", "RequestDigit",
2457                                 get_inkey_931, sizeof(get_inkey_931),
2458                                 get_inkey_response_931,
2459                                 sizeof(get_inkey_response_931),
2460                                 test_get_inkey_93,
2461                                 expect_response_and_finish);
2462         stktest_add_test("Get Inkey 9.4", "RequestDigit",
2463                                 get_inkey_941, sizeof(get_inkey_941),
2464                                 get_inkey_response_941,
2465                                 sizeof(get_inkey_response_941),
2466                                 test_get_inkey_94,
2467                                 expect_response_and_finish);
2468         stktest_add_test("Get Inkey 9.5", "RequestDigit",
2469                                 get_inkey_951, sizeof(get_inkey_951),
2470                                 get_inkey_response_951,
2471                                 sizeof(get_inkey_response_951),
2472                                 test_get_inkey_95,
2473                                 expect_response_and_finish);
2474         stktest_add_test("Get Inkey 9.6", "RequestDigit",
2475                                 get_inkey_961, sizeof(get_inkey_961),
2476                                 get_inkey_response_961,
2477                                 sizeof(get_inkey_response_961),
2478                                 test_get_inkey_96,
2479                                 expect_response_and_finish);
2480         stktest_add_test("Get Inkey 9.7", "RequestDigit",
2481                                 get_inkey_971, sizeof(get_inkey_971),
2482                                 get_inkey_response_971,
2483                                 sizeof(get_inkey_response_971),
2484                                 test_get_inkey_97,
2485                                 expect_response_and_finish);
2486         stktest_add_test("Get Inkey 9.8", "RequestDigit",
2487                                 get_inkey_981, sizeof(get_inkey_981),
2488                                 get_inkey_response_981,
2489                                 sizeof(get_inkey_response_981),
2490                                 test_get_inkey_98,
2491                                 expect_response_and_finish);
2492         stktest_add_test("Get Inkey 9.9", "RequestDigit",
2493                                 get_inkey_991, sizeof(get_inkey_991),
2494                                 get_inkey_response_991,
2495                                 sizeof(get_inkey_response_991),
2496                                 test_get_inkey_99,
2497                                 expect_response_and_finish);
2498         stktest_add_test("Get Inkey 9.10", "RequestDigit",
2499                                 get_inkey_9101, sizeof(get_inkey_9101),
2500                                 get_inkey_response_9101,
2501                                 sizeof(get_inkey_response_9101),
2502                                 test_get_inkey_910,
2503                                 expect_response_and_finish);
2504         stktest_add_test("Get Inkey 10.1", "RequestDigit",
2505                                 get_inkey_1011, sizeof(get_inkey_1011),
2506                                 get_inkey_response_1011,
2507                                 sizeof(get_inkey_response_1011),
2508                                 test_get_inkey_101,
2509                                 expect_response_and_finish);
2510         stktest_add_test("Get Inkey 10.2", "RequestDigit",
2511                                 get_inkey_1021, sizeof(get_inkey_1021),
2512                                 get_inkey_response_1021,
2513                                 sizeof(get_inkey_response_1021),
2514                                 test_get_inkey_102,
2515                                 expect_response_and_finish);
2516         stktest_add_test("Get Inkey 11.1", "RequestKey",
2517                                 get_inkey_1111, sizeof(get_inkey_1111),
2518                                 get_inkey_response_1111,
2519                                 sizeof(get_inkey_response_1111),
2520                                 test_get_inkey_111,
2521                                 expect_response_and_finish);
2522         stktest_add_test("Get Inkey 12.1", "RequestDigit",
2523                                 get_inkey_1211, sizeof(get_inkey_1211),
2524                                 get_inkey_response_1211,
2525                                 sizeof(get_inkey_response_1211),
2526                                 test_get_inkey_121,
2527                                 expect_response_and_finish);
2528         stktest_add_test("Get Inkey 12.2", "RequestDigit",
2529                                 get_inkey_1221, sizeof(get_inkey_1221),
2530                                 get_inkey_response_1221,
2531                                 sizeof(get_inkey_response_1221),
2532                                 test_get_inkey_122,
2533                                 expect_response_and_finish);
2534         stktest_add_test("Get Inkey 13.1", "RequestKey",
2535                                 get_inkey_1311, sizeof(get_inkey_1311),
2536                                 get_inkey_response_1311,
2537                                 sizeof(get_inkey_response_1311),
2538                                 test_get_inkey_131,
2539                                 expect_response_and_finish);
2540 }
2541
2542 static void test_destroy(gpointer user_data)
2543 {
2544         struct test *test = user_data;
2545
2546         g_free(test->name);
2547         g_free(test->method);
2548         g_free(test->req_pdu);
2549         g_free(test->rsp_pdu);
2550
2551         g_free(test);
2552 }
2553
2554 static void __stktest_test_summarize(void)
2555 {
2556         GList *l;
2557         unsigned int not_run = 0;
2558         unsigned int passed = 0;
2559         unsigned int failed = 0;
2560
2561         g_print("\n\nTest Summary\n");
2562         g_print("============\n");
2563
2564         for (l = tests; l; l = l->next) {
2565                 struct test *test = l->data;
2566
2567                 g_print("%-60s", test->name);
2568
2569                 switch (test->result) {
2570                 case TEST_RESULT_NOT_RUN:
2571                         g_print("Not Run\n");
2572                         not_run += 1;
2573                         break;
2574                 case TEST_RESULT_PASSED:
2575                         g_print("Passed\n");
2576                         passed += 1;
2577                         break;
2578                 case TEST_RESULT_FAILED:
2579                         g_print("Failed\n");
2580                         failed += 1;
2581                 break;
2582                 }
2583         }
2584
2585         g_print("\nTotal: %d, Passed: %d(%.1f%%), Failed: %d, NotRun: %d\n",
2586                         not_run + passed + failed, passed,
2587                         (float) passed * 100 / (not_run + passed + failed),
2588                         failed, not_run);
2589 }
2590
2591 static void __stktest_test_cleanup(void)
2592 {
2593         g_list_free_full(tests, test_destroy);
2594         tests = NULL;
2595         cur_test = NULL;
2596 }
2597
2598 static gboolean option_version = FALSE;
2599
2600 static GOptionEntry options[] = {
2601         { "version", 'v', 0, G_OPTION_ARG_NONE, &option_version,
2602                                 "Show version information and exit" },
2603         { NULL },
2604 };
2605
2606 int main(int argc, char **argv)
2607 {
2608         GOptionContext *context;
2609         GError *error = NULL;
2610         DBusError err;
2611         guint watch;
2612         struct sigaction sa;
2613
2614         context = g_option_context_new(NULL);
2615         g_option_context_add_main_entries(context, options, NULL);
2616
2617         if (g_option_context_parse(context, &argc, &argv, &error) == FALSE) {
2618                 if (error != NULL) {
2619                         g_printerr("%s\n", error->message);
2620                         g_error_free(error);
2621                 } else
2622                         g_printerr("An unknown error occurred\n");
2623                 exit(1);
2624         }
2625
2626         g_option_context_free(context);
2627
2628         if (option_version == TRUE) {
2629                 printf("%s\n", VERSION);
2630                 exit(0);
2631         }
2632
2633         __stktest_test_init();
2634
2635         main_loop = g_main_loop_new(NULL, FALSE);
2636
2637         dbus_error_init(&err);
2638
2639         conn = g_dbus_setup_bus(DBUS_BUS_SYSTEM, NULL, &err);
2640         if (conn == NULL) {
2641                 if (dbus_error_is_set(&err) == TRUE) {
2642                         fprintf(stderr, "%s\n", err.message);
2643                         dbus_error_free(&err);
2644                 } else
2645                         fprintf(stderr, "Can't register with system bus\n");
2646                 exit(1);
2647         }
2648
2649         g_dbus_set_disconnect_function(conn, disconnect_callback, NULL, NULL);
2650
2651         memset(&sa, 0, sizeof(sa));
2652         sa.sa_handler = sig_term;
2653         sigaction(SIGINT, &sa, NULL);
2654         sigaction(SIGTERM, &sa, NULL);
2655
2656         watch = g_dbus_add_service_watch(conn, OFONO_SERVICE,
2657                                 ofono_connect, ofono_disconnect, NULL, NULL);
2658
2659         g_main_loop_run(main_loop);
2660
2661         g_dbus_remove_watch(conn, watch);
2662
2663         if (ofono_running == TRUE)
2664                 ofono_disconnect(conn, NULL);
2665
2666         dbus_connection_unref(conn);
2667
2668         g_main_loop_unref(main_loop);
2669
2670         __stktest_test_summarize();
2671         __stktest_test_cleanup();
2672
2673         return 0;
2674 }