aboutsummaryrefslogtreecommitdiff
path: root/src/tests/test-modem-helpers.c
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2010-01-05 14:29:19 -0600
committerDan Williams <dcbw@redhat.com>2010-01-05 14:29:19 -0600
commit216e49f8d8bbfbc0b7d2fbd00ac712a2de41b33a (patch)
tree20a91de71c45266abdde5fcfee9d0a8beae15483 /src/tests/test-modem-helpers.c
parenta06b3f20cafab2ff2d1de16553f7ff578a9b761b (diff)
gsm: split out +COPS response parsing and add testcases
Diffstat (limited to 'src/tests/test-modem-helpers.c')
-rw-r--r--src/tests/test-modem-helpers.c371
1 files changed, 371 insertions, 0 deletions
diff --git a/src/tests/test-modem-helpers.c b/src/tests/test-modem-helpers.c
new file mode 100644
index 00000000..e2cbf103
--- /dev/null
+++ b/src/tests/test-modem-helpers.c
@@ -0,0 +1,371 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details:
+ *
+ * Copyright (C) 2010 Red Hat, Inc.
+ */
+
+#include <glib.h>
+#include <string.h>
+
+#include "mm-modem-helpers.h"
+
+#define MM_SCAN_TAG_STATUS "status"
+#define MM_SCAN_TAG_OPER_LONG "operator-long"
+#define MM_SCAN_TAG_OPER_SHORT "operator-short"
+#define MM_SCAN_TAG_OPER_NUM "operator-num"
+#define MM_SCAN_TAG_ACCESS_TECH "access-tech"
+
+typedef struct {
+ const char *status;
+ const char *oper_long;
+ const char *oper_short;
+ const char *oper_num;
+ const char *tech;
+} OperEntry;
+
+#define ARRAY_LEN(i) (sizeof (i) / sizeof (i[0]))
+
+static void
+test_results (const char *desc,
+ const char *reply,
+ OperEntry *expected_results,
+ guint32 expected_results_len)
+{
+ guint i;
+ GError *error = NULL;
+ GPtrArray *results;
+
+ g_print ("\nTesting %s +COPS response...\n", desc);
+
+ results = mm_gsm_parse_scan_response (reply, &error);
+ g_assert (results);
+ g_assert (error == NULL);
+
+ g_assert (results->len == expected_results_len);
+
+ for (i = 0; i < results->len; i++) {
+ GHashTable *entry = g_ptr_array_index (results, i);
+ const char *value;
+ OperEntry *expected = &expected_results[i];
+
+ value = g_hash_table_lookup (entry, MM_SCAN_TAG_STATUS);
+ g_assert (value);
+ g_assert (strcmp (value, expected->status) == 0);
+
+ value = g_hash_table_lookup (entry, MM_SCAN_TAG_OPER_LONG);
+ if (expected->oper_long) {
+ g_assert (value);
+ g_assert (strcmp (value, expected->oper_long) == 0);
+ } else
+ g_assert (value == NULL);
+
+ value = g_hash_table_lookup (entry, MM_SCAN_TAG_OPER_SHORT);
+ if (expected->oper_short) {
+ g_assert (value);
+ g_assert (strcmp (value, expected->oper_short) == 0);
+ } else
+ g_assert (value == NULL);
+
+ value = g_hash_table_lookup (entry, MM_SCAN_TAG_OPER_NUM);
+ if (expected->oper_num) {
+ g_assert (value);
+ g_assert (strcmp (value, expected->oper_num) == 0);
+ } else
+ g_assert (value == NULL);
+
+ value = g_hash_table_lookup (entry, MM_SCAN_TAG_ACCESS_TECH);
+ if (expected->tech) {
+ g_assert (value);
+ g_assert (strcmp (value, expected->tech) == 0);
+ } else
+ g_assert (value == NULL);
+ }
+
+ mm_gsm_destroy_scan_data (results);
+}
+
+static void
+test_cops_response_tm506 (void *f, gpointer d)
+{
+ const char *reply = "+COPS: (2,\"\",\"T-Mobile\",\"31026\",0),(2,\"T - Mobile\",\"T - Mobile\",\"310260\"),2),(1,\"AT&T\",\"AT&T\",\"310410\"),0)";
+ static OperEntry expected[] = {
+ { "2", "", "T-Mobile", "31026", "0" },
+ { "2", "T - Mobile", "T - Mobile", "310260", "2" },
+ { "1", "AT&T", "AT&T", "310410", "0" }
+ };
+
+ test_results ("TM-506", reply, &expected[0], ARRAY_LEN (expected));
+}
+
+static void
+test_cops_response_gt3gplus (void *f, gpointer d)
+{
+ const char *reply = "+COPS: (1,\"T-Mobile US\",\"TMO US\",\"31026\",0),(1,\"Cingular\",\"Cingular\",\"310410\",0),,(0, 1, 3),(0-2)";
+ static OperEntry expected[] = {
+ { "1", "T-Mobile US", "TMO US", "31026", "0" },
+ { "1", "Cingular", "Cingular", "310410", "0" },
+ };
+
+ test_results ("GlobeTrotter 3G+ (nozomi)", reply, &expected[0], ARRAY_LEN (expected));
+}
+
+static void
+test_cops_response_ac881 (void *f, gpointer d)
+{
+ const char *reply = "+COPS: (1,\"T-Mobile\",\"TMO\",\"31026\",0),(1,\"AT&T\",\"AT&T\",\"310410\",2),(1,\"AT&T\",\"AT&T\",\"310410\",0),,(0,1,2,3,4),)";
+ static OperEntry expected[] = {
+ { "1", "T-Mobile", "TMO", "31026", "0" },
+ { "1", "AT&T", "AT&T", "310410", "2" },
+ { "1", "AT&T", "AT&T", "310410", "0" },
+ };
+
+ test_results ("Sierra AirCard 881", reply, &expected[0], ARRAY_LEN (expected));
+}
+
+static void
+test_cops_response_gtmax36 (void *f, gpointer d)
+{
+ const char *reply = "+COPS: (2,\"T-Mobile US\",\"TMO US\",\"31026\",0),(1,\"AT&T\",\"AT&T\",\"310410\",2),(1,\"AT&T\",\"AT&T\",\"310410\",0),,(0, 1,)";
+ static OperEntry expected[] = {
+ { "2", "T-Mobile US", "TMO US", "31026", "0" },
+ { "1", "AT&T", "AT&T", "310410", "2" },
+ { "1", "AT&T", "AT&T", "310410", "0" },
+ };
+
+ test_results ("Option GlobeTrotter MAX 3.6", reply, &expected[0], ARRAY_LEN (expected));
+}
+
+static void
+test_cops_response_ac860 (void *f, gpointer d)
+{
+ const char *reply = "+COPS: (2,\"T-Mobile\",\"TMO\",\"31026\",0),(1,\"Cingular\",\"Cinglr\",\"310410\",2),(1,\"Cingular\",\"Cinglr\",\"310410\",0),,)";
+ static OperEntry expected[] = {
+ { "2", "T-Mobile", "TMO", "31026", "0" },
+ { "1", "Cingular", "Cinglr", "310410", "2" },
+ { "1", "Cingular", "Cinglr", "310410", "0" },
+ };
+
+ test_results ("Sierra AirCard 860", reply, &expected[0], ARRAY_LEN (expected));
+}
+
+static void
+test_cops_response_gtm378 (void *f, gpointer d)
+{
+ const char *reply = "+COPS: (2,\"T-Mobile\",\"T-Mobile\",\"31026\",0),(1,\"AT&T\",\"AT&T\",\"310410\",2),(1,\"AT&T\",\"AT&T\",\"310410\",0),,(0, 1, 3),(0-2)";
+ static OperEntry expected[] = {
+ { "2", "T-Mobile", "T-Mobile", "31026", "0" },
+ { "1", "AT&T", "AT&T", "310410", "2" },
+ { "1", "AT&T", "AT&T", "310410", "0" },
+ };
+
+ test_results ("Option GTM378", reply, &expected[0], ARRAY_LEN (expected));
+}
+
+static void
+test_cops_response_motoc (void *f, gpointer d)
+{
+ const char *reply = "+COPS: (2,\"T-Mobile\",\"\",\"310260\"),(0,\"Cingular Wireless\",\"\",\"310410\")";
+ static OperEntry expected[] = {
+ { "2", "T-Mobile", "", "310260", NULL },
+ { "0", "Cingular Wireless", "", "310410", NULL },
+ };
+
+ test_results ("BUSlink SCWi275u (Motorola C-series)", reply, &expected[0], ARRAY_LEN (expected));
+}
+
+static void
+test_cops_response_mf627a (void *f, gpointer d)
+{
+ const char *reply = "+COPS: (2,\"AT&T@\",\"AT&TD\",\"310410\",0),(3,\"Voicestream Wireless Corporation\",\"VSTREAM\",\"31026\",0),";
+ static OperEntry expected[] = {
+ { "2", "AT&T@", "AT&TD", "310410", "0" },
+ { "3", "Voicestream Wireless Corporation", "VSTREAM", "31026", "0" },
+ };
+
+ test_results ("ZTE MF627 (A)", reply, &expected[0], ARRAY_LEN (expected));
+}
+
+static void
+test_cops_response_mf627b (void *f, gpointer d)
+{
+ const char *reply = "+COPS: (2,\"AT&Tp\",\"AT&T@\",\"310410\",0),(3,\"\",\"\",\"31026\",0),";
+ static OperEntry expected[] = {
+ { "2", "AT&Tp", "AT&T@", "310410", "0" },
+ { "3", "", "", "31026", "0" },
+ };
+
+ test_results ("ZTE MF627 (B)", reply, &expected[0], ARRAY_LEN (expected));
+}
+
+static void
+test_cops_response_e160g (void *f, gpointer d)
+{
+ const char *reply = "+COPS: (2,\"T-Mobile\",\"TMO\",\"31026\",0),(1,\"AT&T\",\"AT&T\",\"310410\",0),,(0,1,2,3,4),(0,1,2)";
+ static OperEntry expected[] = {
+ { "2", "T-Mobile", "TMO", "31026", "0" },
+ { "1", "AT&T", "AT&T", "310410", "0" },
+ };
+
+ test_results ("Huawei E160G", reply, &expected[0], ARRAY_LEN (expected));
+}
+
+static void
+test_cops_response_mercury (void *f, gpointer d)
+{
+ const char *reply = "+COPS: (2,\"\",\"\",\"310410\",2),(1,\"AT&T\",\"AT&T\",\"310410\",0),(1,\"T-Mobile\",\"TMO\",\"31026\",0),,(0,1,2,3,4),(0,1,2)";
+ static OperEntry expected[] = {
+ { "2", "", "", "310410", "2" },
+ { "1", "AT&T", "AT&T", "310410", "0" },
+ { "1", "T-Mobile", "TMO", "31026", "0" },
+ };
+
+ test_results ("Sierra AT&T USBConnect Mercury", reply, &expected[0], ARRAY_LEN (expected));
+}
+
+static void
+test_cops_response_quicksilver (void *f, gpointer d)
+{
+ const char *reply = "+COPS: (2,\"AT&T\",\"\",\"310410\",0),(2,\"\",\"\",\"3104100\",2),(1,\"AT&T\",\"\",\"310260\",0),,(0-4),(0-2)";
+ static OperEntry expected[] = {
+ { "2", "AT&T", "", "310410", "0" },
+ { "2", "", "", "3104100", "2" },
+ { "1", "AT&T", "", "310260", "0" },
+ };
+
+ test_results ("Option AT&T Quicksilver", reply, &expected[0], ARRAY_LEN (expected));
+}
+
+static void
+test_cops_response_icon225 (void *f, gpointer d)
+{
+ const char *reply = "+COPS: (2,\"T-Mobile US\",\"TMO US\",\"31026\",0),(1,\"AT&T\",\"AT&T\",\"310410\",0),,(0, 1, 3),(0-2)";
+ static OperEntry expected[] = {
+ { "2", "T-Mobile US", "TMO US", "31026", "0" },
+ { "1", "AT&T", "AT&T", "310410", "0" },
+ };
+
+ test_results ("Option iCON 225", reply, &expected[0], ARRAY_LEN (expected));
+}
+
+static void
+test_cops_response_icon452 (void *f, gpointer d)
+{
+ const char *reply = "+COPS: (1,\"T-Mobile US\",\"TMO US\",\"31026\",0),(2,\"T-Mobile\",\"T-Mobile\",\"310260\",2),(1,\"AT&T\",\"AT&T\",\"310410\",2),(1,\"AT&T\",\"AT&T\",\"310410\",0),,(0,1,2,3,4),(0,1,2)";
+ static OperEntry expected[] = {
+ { "1", "T-Mobile US", "TMO US", "31026", "0" },
+ { "2", "T-Mobile", "T-Mobile", "310260", "2" },
+ { "1", "AT&T", "AT&T", "310410", "2" },
+ { "1", "AT&T", "AT&T", "310410", "0" }
+ };
+
+ test_results ("Option iCON 452", reply, &expected[0], ARRAY_LEN (expected));
+}
+
+static void
+test_cops_response_f3507g (void *f, gpointer d)
+{
+ const char *reply = "+COPS: (2,\"T - Mobile\",\"T - Mobile\",\"31026\",0),(1,\"AT&T\",\"AT&T\",\"310410\",0),(1,\"AT&T\",\"AT&T\",\"310410\",2)";
+ static OperEntry expected[] = {
+ { "2", "T - Mobile", "T - Mobile", "31026", "0" },
+ { "1", "AT&T", "AT&T", "310410", "0" },
+ { "1", "AT&T", "AT&T", "310410", "2" }
+ };
+
+ test_results ("Ericsson F3507g", reply, &expected[0], ARRAY_LEN (expected));
+}
+
+static void
+test_cops_response_f3607gw (void *f, gpointer d)
+{
+ const char *reply = "+COPS: (2,\"T - Mobile\",\"T - Mobile\",\"31026\",0),(1,\"AT&T\",\"AT&T\",\"310410\"),2),(1,\"AT&T\",\"AT&T\",\"310410\"),0)";
+ static OperEntry expected[] = {
+ { "2", "T - Mobile", "T - Mobile", "31026", "0" },
+ { "1", "AT&T", "AT&T", "310410", "2" },
+ { "1", "AT&T", "AT&T", "310410", "0" }
+ };
+
+ test_results ("Ericsson F3607gw", reply, &expected[0], ARRAY_LEN (expected));
+}
+
+static void
+test_cops_response_mc8775 (void *f, gpointer d)
+{
+ const char *reply = "+COPS: (2,\"T-Mobile\",\"T-Mobile\",\"31026\",0),(1,\"AT&T\",\"AT&T\",\"310410\",2),(1,\"AT&T\",\"AT&T\",\"310410\",0),,(0,1,2,3,4),(0,1,2)";
+ static OperEntry expected[] = {
+ { "2", "T-Mobile", "T-Mobile", "31026", "0" },
+ { "1", "AT&T", "AT&T", "310410", "2" },
+ { "1", "AT&T", "AT&T", "310410", "0" }
+ };
+
+ test_results ("Sierra MC8775", reply, &expected[0], ARRAY_LEN (expected));
+}
+
+#if 0
+static void
+test_cops_response_n80 (void *f, gpointer d)
+{
+ const char *reply = "+COPS: (2,\"T - Mobile\",,\"31026\"),(1,\"Einstein PCS\",,\"31064\"),(1,\"Cingular\",,\"31041\"),,(0,1,3),(0,2)";
+ static OperEntry expected[] = {
+ { "2", "T - Mobile", "", "31026", NULL },
+ { "1", "Einstein PCS", "", "31064", NULL },
+ { "1", "Cingular", "", "31041", NULL },
+ };
+ GError *error = NULL;
+ GPtrArray *results;
+
+ results = mm_gsm_parse_scan_response (reply, &error);
+ g_assert (results);
+ g_assert (error == NULL);
+
+ g_assert (results->len == ARRAY_LEN (expected));
+ test_results ("Nokia N80", results, &expected[0]);
+
+ mm_gsm_destroy_scan_data (results);
+}
+#endif
+
+typedef void (*TCFunc)(void);
+
+#define TESTCASE(t, d) g_test_create_case (#t, 0, d, NULL, (TCFunc) t, NULL)
+
+int main (int argc, char **argv)
+{
+ GTestSuite *suite;
+
+ g_test_init (&argc, &argv, NULL);
+
+ suite = g_test_get_root ();
+
+ g_test_suite_add (suite, TESTCASE (test_cops_response_tm506, NULL));
+ g_test_suite_add (suite, TESTCASE (test_cops_response_gt3gplus, NULL));
+ g_test_suite_add (suite, TESTCASE (test_cops_response_ac881, NULL));
+ g_test_suite_add (suite, TESTCASE (test_cops_response_gtmax36, NULL));
+ g_test_suite_add (suite, TESTCASE (test_cops_response_ac860, NULL));
+ g_test_suite_add (suite, TESTCASE (test_cops_response_gtm378, NULL));
+ g_test_suite_add (suite, TESTCASE (test_cops_response_motoc, NULL));
+ g_test_suite_add (suite, TESTCASE (test_cops_response_mf627a, NULL));
+ g_test_suite_add (suite, TESTCASE (test_cops_response_mf627b, NULL));
+ g_test_suite_add (suite, TESTCASE (test_cops_response_e160g, NULL));
+ g_test_suite_add (suite, TESTCASE (test_cops_response_mercury, NULL));
+ g_test_suite_add (suite, TESTCASE (test_cops_response_quicksilver, NULL));
+ g_test_suite_add (suite, TESTCASE (test_cops_response_icon225, NULL));
+ g_test_suite_add (suite, TESTCASE (test_cops_response_icon452, NULL));
+ g_test_suite_add (suite, TESTCASE (test_cops_response_f3507g, NULL));
+ g_test_suite_add (suite, TESTCASE (test_cops_response_f3607gw, NULL));
+ g_test_suite_add (suite, TESTCASE (test_cops_response_mc8775, NULL));
+#if 0
+ g_test_suite_add (suite, TESTCASE (test_cops_response_n80, NULL));
+#endif
+
+ return g_test_run ();
+}
+