summaryrefslogtreecommitdiff
path: root/plugins/telit/tests/test-mm-modem-helpers-telit.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/telit/tests/test-mm-modem-helpers-telit.c')
-rw-r--r--plugins/telit/tests/test-mm-modem-helpers-telit.c629
1 files changed, 629 insertions, 0 deletions
diff --git a/plugins/telit/tests/test-mm-modem-helpers-telit.c b/plugins/telit/tests/test-mm-modem-helpers-telit.c
new file mode 100644
index 00000000..e957f7d6
--- /dev/null
+++ b/plugins/telit/tests/test-mm-modem-helpers-telit.c
@@ -0,0 +1,629 @@
+/* -*- 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) 2015-2019 Telit
+ * Copyright (C) 2019 Aleksander Morgado <aleksander@aleksander.es>
+ *
+ */
+#include <stdio.h>
+#include <glib.h>
+#include <glib-object.h>
+#include <locale.h>
+
+#include <ModemManager.h>
+#define _LIBMM_INSIDE_MM
+#include <libmm-glib.h>
+
+#include "mm-log-test.h"
+#include "mm-modem-helpers.h"
+#include "mm-modem-helpers-telit.h"
+
+#include "test-helpers.h"
+
+/******************************************************************************/
+
+#define MAX_BANDS_LIST_LEN 17
+
+typedef struct {
+ const gchar *response;
+ gboolean modem_is_2g;
+ gboolean modem_is_3g;
+ gboolean modem_is_4g;
+ gboolean modem_alternate_3g_bands;
+ gboolean modem_ext_4g_bands;
+ guint mm_bands_len;
+ MMModemBand mm_bands [MAX_BANDS_LIST_LEN];
+} BndResponseTest;
+
+static BndResponseTest supported_band_mapping_tests [] = {
+ {
+ "#BND: (0-3)", TRUE, FALSE, FALSE, FALSE, FALSE, 4,
+ { MM_MODEM_BAND_EGSM,
+ MM_MODEM_BAND_DCS,
+ MM_MODEM_BAND_PCS,
+ MM_MODEM_BAND_G850 }
+ },
+ {
+ "#BND: (0-3),(0,2,5,6)", TRUE, TRUE, FALSE, FALSE, FALSE, 7,
+ { MM_MODEM_BAND_EGSM,
+ MM_MODEM_BAND_DCS,
+ MM_MODEM_BAND_PCS,
+ MM_MODEM_BAND_G850,
+ MM_MODEM_BAND_UTRAN_1,
+ MM_MODEM_BAND_UTRAN_5,
+ MM_MODEM_BAND_UTRAN_8 }
+ },
+ {
+ "#BND: (0,3),(0,2,5,6)", TRUE, TRUE, FALSE, FALSE, FALSE, 7,
+ { MM_MODEM_BAND_EGSM,
+ MM_MODEM_BAND_DCS,
+ MM_MODEM_BAND_PCS,
+ MM_MODEM_BAND_G850,
+ MM_MODEM_BAND_UTRAN_1,
+ MM_MODEM_BAND_UTRAN_5,
+ MM_MODEM_BAND_UTRAN_8 }
+ },
+ {
+ "#BND: (0,2),(0,2,5,6)", TRUE, TRUE, FALSE, FALSE, FALSE, 6,
+ { MM_MODEM_BAND_EGSM,
+ MM_MODEM_BAND_DCS,
+ MM_MODEM_BAND_G850,
+ MM_MODEM_BAND_UTRAN_1,
+ MM_MODEM_BAND_UTRAN_5,
+ MM_MODEM_BAND_UTRAN_8 }
+ },
+ {
+ "#BND: (0,2),(0-4,5,6)", TRUE, TRUE, FALSE, FALSE, FALSE, 7,
+ { MM_MODEM_BAND_EGSM,
+ MM_MODEM_BAND_DCS,
+ MM_MODEM_BAND_G850,
+ MM_MODEM_BAND_UTRAN_1,
+ MM_MODEM_BAND_UTRAN_2,
+ MM_MODEM_BAND_UTRAN_5,
+ MM_MODEM_BAND_UTRAN_8 }
+ },
+ {
+ "#BND: (0-3),(0,2,5,6),(1-1)", TRUE, TRUE, TRUE, FALSE, FALSE, 8,
+ { MM_MODEM_BAND_EGSM,
+ MM_MODEM_BAND_DCS,
+ MM_MODEM_BAND_PCS,
+ MM_MODEM_BAND_G850,
+ MM_MODEM_BAND_UTRAN_1,
+ MM_MODEM_BAND_UTRAN_5,
+ MM_MODEM_BAND_UTRAN_8,
+ MM_MODEM_BAND_EUTRAN_1 }
+ },
+ {
+ "#BND: (0),(0),(1-3)", TRUE, TRUE, TRUE, FALSE, FALSE, 5,
+ { MM_MODEM_BAND_EGSM,
+ MM_MODEM_BAND_DCS,
+ MM_MODEM_BAND_UTRAN_1,
+ MM_MODEM_BAND_EUTRAN_1,
+ MM_MODEM_BAND_EUTRAN_2 }
+ },
+ {
+ "#BND: (0),(0),(1-3)", FALSE, FALSE, TRUE, FALSE, FALSE, 2,
+ { MM_MODEM_BAND_EUTRAN_1,
+ MM_MODEM_BAND_EUTRAN_2 }
+ },
+ /* 3G alternate band settings: default */
+ {
+ "#BND: (0),(0,2,5,6,12,25)", FALSE, TRUE, FALSE, FALSE, FALSE, 5,
+ { MM_MODEM_BAND_UTRAN_1,
+ MM_MODEM_BAND_UTRAN_5,
+ MM_MODEM_BAND_UTRAN_8,
+ MM_MODEM_BAND_UTRAN_6,
+ MM_MODEM_BAND_UTRAN_19 }
+ },
+ /* 3G alternate band settings: alternate */
+ {
+ "#BND: (0),(0,2,5,6,12,13)", FALSE, TRUE, FALSE, TRUE, FALSE, 4,
+ { MM_MODEM_BAND_UTRAN_1,
+ MM_MODEM_BAND_UTRAN_3,
+ MM_MODEM_BAND_UTRAN_5,
+ MM_MODEM_BAND_UTRAN_8 }
+ },
+ /* ME910 (2G+4G device)
+ * 168695967: 0xA0E189F: 0000 1010 0000 1110 0001 1000 1001 1111
+ */
+ {
+ "#BND: (0-5),(0),(1-168695967)", TRUE, FALSE, TRUE, FALSE, FALSE, 17,
+ { MM_MODEM_BAND_EGSM,
+ MM_MODEM_BAND_DCS,
+ MM_MODEM_BAND_PCS,
+ MM_MODEM_BAND_G850,
+ MM_MODEM_BAND_EUTRAN_1,
+ MM_MODEM_BAND_EUTRAN_2,
+ MM_MODEM_BAND_EUTRAN_3,
+ MM_MODEM_BAND_EUTRAN_4,
+ MM_MODEM_BAND_EUTRAN_5,
+ MM_MODEM_BAND_EUTRAN_8,
+ MM_MODEM_BAND_EUTRAN_12,
+ MM_MODEM_BAND_EUTRAN_13,
+ MM_MODEM_BAND_EUTRAN_18,
+ MM_MODEM_BAND_EUTRAN_19,
+ MM_MODEM_BAND_EUTRAN_20,
+ MM_MODEM_BAND_EUTRAN_26,
+ MM_MODEM_BAND_EUTRAN_28 }
+ },
+ /* 4G ext band settings: devices such as LN920 */
+ {
+ "#BND: (0),(0),(1003100185A),(42)", FALSE, TRUE, TRUE, FALSE, TRUE, 13,
+ { MM_MODEM_BAND_UTRAN_1,
+ MM_MODEM_BAND_EUTRAN_2,
+ MM_MODEM_BAND_EUTRAN_4,
+ MM_MODEM_BAND_EUTRAN_5,
+ MM_MODEM_BAND_EUTRAN_7,
+ MM_MODEM_BAND_EUTRAN_12,
+ MM_MODEM_BAND_EUTRAN_13,
+ MM_MODEM_BAND_EUTRAN_25,
+ MM_MODEM_BAND_EUTRAN_29,
+ MM_MODEM_BAND_EUTRAN_30,
+ MM_MODEM_BAND_EUTRAN_41,
+ MM_MODEM_BAND_EUTRAN_66,
+ MM_MODEM_BAND_EUTRAN_71 }
+ }
+};
+
+static void
+test_parse_supported_bands_response (void)
+{
+ guint i;
+
+ for (i = 0; i < G_N_ELEMENTS (supported_band_mapping_tests); i++) {
+ GError *error = NULL;
+ GArray *bands = NULL;
+ gboolean modem_ext_4g_bands;
+
+ bands = mm_telit_parse_bnd_test_response (supported_band_mapping_tests[i].response,
+ supported_band_mapping_tests[i].modem_is_2g,
+ supported_band_mapping_tests[i].modem_is_3g,
+ supported_band_mapping_tests[i].modem_is_4g,
+ supported_band_mapping_tests[i].modem_alternate_3g_bands,
+ &modem_ext_4g_bands,
+ NULL,
+ &error);
+ g_assert_no_error (error);
+ g_assert (bands);
+ g_assert (supported_band_mapping_tests[i].modem_ext_4g_bands == modem_ext_4g_bands);
+
+ mm_test_helpers_compare_bands (bands,
+ supported_band_mapping_tests[i].mm_bands,
+ supported_band_mapping_tests[i].mm_bands_len);
+ g_array_unref (bands);
+ }
+}
+
+static BndResponseTest current_band_mapping_tests [] = {
+ {
+ "#BND: 0", TRUE, FALSE, FALSE, FALSE, FALSE, 2,
+ { MM_MODEM_BAND_EGSM,
+ MM_MODEM_BAND_DCS }
+ },
+ {
+ "#BND: 0,5", TRUE, TRUE, FALSE, FALSE, FALSE, 3,
+ { MM_MODEM_BAND_EGSM,
+ MM_MODEM_BAND_DCS,
+ MM_MODEM_BAND_UTRAN_8 }
+ },
+ {
+ "#BND: 1,3", TRUE, TRUE, FALSE, FALSE, FALSE, 5,
+ { MM_MODEM_BAND_EGSM,
+ MM_MODEM_BAND_PCS,
+ MM_MODEM_BAND_UTRAN_1,
+ MM_MODEM_BAND_UTRAN_2,
+ MM_MODEM_BAND_UTRAN_5 }
+ },
+ {
+ "#BND: 2,7", TRUE, TRUE, FALSE, FALSE, FALSE, 3,
+ { MM_MODEM_BAND_DCS,
+ MM_MODEM_BAND_G850,
+ MM_MODEM_BAND_UTRAN_4 }
+ },
+ {
+ "#BND: 3,0,1", TRUE, TRUE, TRUE, FALSE, FALSE, 4,
+ { MM_MODEM_BAND_PCS,
+ MM_MODEM_BAND_G850,
+ MM_MODEM_BAND_UTRAN_1,
+ MM_MODEM_BAND_EUTRAN_1 }
+ },
+ {
+ "#BND: 0,0,3", TRUE, FALSE, TRUE, FALSE, FALSE, 4,
+ { MM_MODEM_BAND_EGSM,
+ MM_MODEM_BAND_DCS,
+ MM_MODEM_BAND_EUTRAN_1,
+ MM_MODEM_BAND_EUTRAN_2 }
+ },
+ {
+ "#BND: 0,0,3", FALSE, FALSE, TRUE, FALSE, FALSE, 2,
+ { MM_MODEM_BAND_EUTRAN_1,
+ MM_MODEM_BAND_EUTRAN_2 }
+ },
+ /* 3G alternate band settings: default */
+ {
+ "#BND: 0,12", FALSE, TRUE, FALSE, FALSE, FALSE, 1,
+ { MM_MODEM_BAND_UTRAN_6 }
+ },
+ /* 3G alternate band settings: alternate */
+ {
+ "#BND: 0,12", FALSE, TRUE, FALSE, TRUE, FALSE, 4,
+ { MM_MODEM_BAND_UTRAN_1,
+ MM_MODEM_BAND_UTRAN_3,
+ MM_MODEM_BAND_UTRAN_5,
+ MM_MODEM_BAND_UTRAN_8 }
+ },
+ /* ME910 (2G+4G device)
+ * 168695967: 0xA0E189F: 0000 1010 0000 1110 0001 1000 1001 1111
+ */
+ {
+ "#BND: 5,0,168695967", TRUE, FALSE, TRUE, FALSE, FALSE, 17,
+ { MM_MODEM_BAND_EGSM,
+ MM_MODEM_BAND_DCS,
+ MM_MODEM_BAND_PCS,
+ MM_MODEM_BAND_G850,
+ MM_MODEM_BAND_EUTRAN_1,
+ MM_MODEM_BAND_EUTRAN_2,
+ MM_MODEM_BAND_EUTRAN_3,
+ MM_MODEM_BAND_EUTRAN_4,
+ MM_MODEM_BAND_EUTRAN_5,
+ MM_MODEM_BAND_EUTRAN_8,
+ MM_MODEM_BAND_EUTRAN_12,
+ MM_MODEM_BAND_EUTRAN_13,
+ MM_MODEM_BAND_EUTRAN_18,
+ MM_MODEM_BAND_EUTRAN_19,
+ MM_MODEM_BAND_EUTRAN_20,
+ MM_MODEM_BAND_EUTRAN_26,
+ MM_MODEM_BAND_EUTRAN_28 }
+ },
+ /* 4G ext band settings: devices such as LN920 */
+ {
+ "#BND: 0,0,1003100185A,42", FALSE, TRUE, TRUE, FALSE, TRUE, 13,
+ { MM_MODEM_BAND_UTRAN_1,
+ MM_MODEM_BAND_EUTRAN_2,
+ MM_MODEM_BAND_EUTRAN_4,
+ MM_MODEM_BAND_EUTRAN_5,
+ MM_MODEM_BAND_EUTRAN_7,
+ MM_MODEM_BAND_EUTRAN_12,
+ MM_MODEM_BAND_EUTRAN_13,
+ MM_MODEM_BAND_EUTRAN_25,
+ MM_MODEM_BAND_EUTRAN_29,
+ MM_MODEM_BAND_EUTRAN_30,
+ MM_MODEM_BAND_EUTRAN_41,
+ MM_MODEM_BAND_EUTRAN_66,
+ MM_MODEM_BAND_EUTRAN_71 }
+ }
+};
+
+static void
+test_parse_current_bands_response (void)
+{
+ guint i;
+
+ for (i = 0; i < G_N_ELEMENTS (current_band_mapping_tests); i++) {
+ GError *error = NULL;
+ GArray *bands = NULL;
+
+ bands = mm_telit_parse_bnd_query_response (current_band_mapping_tests[i].response,
+ current_band_mapping_tests[i].modem_is_2g,
+ current_band_mapping_tests[i].modem_is_3g,
+ current_band_mapping_tests[i].modem_is_4g,
+ current_band_mapping_tests[i].modem_alternate_3g_bands,
+ current_band_mapping_tests[i].modem_ext_4g_bands,
+ NULL,
+ &error);
+ g_assert_no_error (error);
+ g_assert (bands);
+
+ mm_test_helpers_compare_bands (bands,
+ current_band_mapping_tests[i].mm_bands,
+ current_band_mapping_tests[i].mm_bands_len);
+ g_array_unref (bands);
+ }
+}
+
+/******************************************************************************/
+
+static void
+test_common_bnd_cmd (const gchar *expected_cmd,
+ gboolean modem_is_2g,
+ gboolean modem_is_3g,
+ gboolean modem_is_4g,
+ gboolean modem_alternate_3g_bands,
+ gboolean modem_ext_4g_bands,
+ GArray *bands_array)
+{
+ gchar *cmd;
+ GError *error = NULL;
+
+ cmd = mm_telit_build_bnd_request (bands_array,
+ modem_is_2g, modem_is_3g, modem_is_4g,
+ modem_alternate_3g_bands,
+ modem_ext_4g_bands,
+ &error);
+ g_assert_no_error (error);
+ g_assert_cmpstr (cmd, ==, expected_cmd);
+ g_free (cmd);
+}
+
+#define test_common_bnd_cmd_2g(EXPECTED_CMD, BANDS_ARRAY) test_common_bnd_cmd (EXPECTED_CMD, TRUE, FALSE, FALSE, FALSE, FALSE, BANDS_ARRAY)
+#define test_common_bnd_cmd_3g(EXPECTED_CMD, ALTERNATE, BANDS_ARRAY) test_common_bnd_cmd (EXPECTED_CMD, FALSE, TRUE, FALSE, ALTERNATE, FALSE, BANDS_ARRAY)
+#define test_common_bnd_cmd_4g(EXPECTED_CMD, EXTENDED, BANDS_ARRAY) test_common_bnd_cmd (EXPECTED_CMD, FALSE, FALSE, TRUE, FALSE, EXTENDED, BANDS_ARRAY)
+
+static void
+test_common_bnd_cmd_error (gboolean modem_is_2g,
+ gboolean modem_is_3g,
+ gboolean modem_is_4g,
+ GArray *bands_array,
+ MMCoreError expected_error)
+{
+ gchar *cmd;
+ GError *error = NULL;
+
+ cmd = mm_telit_build_bnd_request (bands_array,
+ modem_is_2g, modem_is_3g, modem_is_4g,
+ FALSE, FALSE,
+ &error);
+ g_assert_error (error, MM_CORE_ERROR, (gint)expected_error);
+ g_assert (!cmd);
+}
+
+#define test_common_bnd_cmd_2g_invalid(BANDS_ARRAY) test_common_bnd_cmd_error (TRUE, FALSE, FALSE, BANDS_ARRAY, MM_CORE_ERROR_FAILED)
+#define test_common_bnd_cmd_3g_invalid(BANDS_ARRAY) test_common_bnd_cmd_error (FALSE, TRUE, FALSE, BANDS_ARRAY, MM_CORE_ERROR_FAILED)
+#define test_common_bnd_cmd_4g_invalid(BANDS_ARRAY) test_common_bnd_cmd_error (FALSE, FALSE, TRUE, BANDS_ARRAY, MM_CORE_ERROR_FAILED)
+#define test_common_bnd_cmd_2g_not_found(BANDS_ARRAY) test_common_bnd_cmd_error (TRUE, FALSE, FALSE, BANDS_ARRAY, MM_CORE_ERROR_NOT_FOUND)
+#define test_common_bnd_cmd_3g_not_found(BANDS_ARRAY) test_common_bnd_cmd_error (FALSE, TRUE, FALSE, BANDS_ARRAY, MM_CORE_ERROR_NOT_FOUND)
+#define test_common_bnd_cmd_4g_not_found(BANDS_ARRAY) test_common_bnd_cmd_error (FALSE, FALSE, TRUE, BANDS_ARRAY, MM_CORE_ERROR_NOT_FOUND)
+
+static void
+test_telit_get_2g_bnd_flag (void)
+{
+ GArray *bands_array;
+ MMModemBand egsm = MM_MODEM_BAND_EGSM;
+ MMModemBand dcs = MM_MODEM_BAND_DCS;
+ MMModemBand pcs = MM_MODEM_BAND_PCS;
+ MMModemBand g850 = MM_MODEM_BAND_G850;
+ MMModemBand u2100 = MM_MODEM_BAND_UTRAN_1;
+ MMModemBand eutran_i = MM_MODEM_BAND_EUTRAN_1;
+
+ /* Test Flag 0 */
+ bands_array = g_array_sized_new (FALSE, FALSE, sizeof (MMModemBand), 2);
+ g_array_append_val (bands_array, egsm);
+ g_array_append_val (bands_array, dcs);
+ test_common_bnd_cmd_2g ("#BND=0", bands_array);
+ g_array_unref (bands_array);
+
+ /* Test flag 1 */
+ bands_array = g_array_sized_new (FALSE, FALSE, sizeof (MMModemBand), 2);
+ g_array_append_val (bands_array, egsm);
+ g_array_append_val (bands_array, pcs);
+ test_common_bnd_cmd_2g ("#BND=1", bands_array);
+ g_array_unref (bands_array);
+
+ /* Test flag 2 */
+ bands_array = g_array_sized_new (FALSE, FALSE, sizeof (MMModemBand), 2);
+ g_array_append_val (bands_array, g850);
+ g_array_append_val (bands_array, dcs);
+ test_common_bnd_cmd_2g ("#BND=2", bands_array);
+ g_array_unref (bands_array);
+
+ /* Test flag 3 */
+ bands_array = g_array_sized_new (FALSE, FALSE, sizeof (MMModemBand), 2);
+ g_array_append_val (bands_array, g850);
+ g_array_append_val (bands_array, pcs);
+ test_common_bnd_cmd_2g ("#BND=3", bands_array);
+ g_array_unref (bands_array);
+
+ /* Test invalid band array */
+ bands_array = g_array_sized_new (FALSE, FALSE, sizeof (MMModemBand), 2);
+ g_array_append_val (bands_array, g850);
+ g_array_append_val (bands_array, egsm);
+ test_common_bnd_cmd_2g_invalid (bands_array);
+ g_array_unref (bands_array);
+
+ /* Test unmatched band array */
+ bands_array = g_array_sized_new (FALSE, FALSE, sizeof (MMModemBand), 2);
+ g_array_append_val (bands_array, u2100);
+ g_array_append_val (bands_array, eutran_i);
+ test_common_bnd_cmd_2g_not_found (bands_array);
+ g_array_unref (bands_array);
+}
+
+static void
+test_telit_get_3g_bnd_flag (void)
+{
+ GArray *bands_array;
+ MMModemBand u2100 = MM_MODEM_BAND_UTRAN_1;
+ MMModemBand u1900 = MM_MODEM_BAND_UTRAN_2;
+ MMModemBand u1800 = MM_MODEM_BAND_UTRAN_3;
+ MMModemBand u850 = MM_MODEM_BAND_UTRAN_5;
+ MMModemBand u800 = MM_MODEM_BAND_UTRAN_6;
+ MMModemBand u900 = MM_MODEM_BAND_UTRAN_8;
+ MMModemBand u17iv = MM_MODEM_BAND_UTRAN_4;
+ MMModemBand u17ix = MM_MODEM_BAND_UTRAN_9;
+ MMModemBand egsm = MM_MODEM_BAND_EGSM;
+ MMModemBand eutran_i = MM_MODEM_BAND_EUTRAN_1;
+
+ /* Test flag 0 */
+ bands_array = g_array_sized_new (FALSE, FALSE, sizeof (MMModemBand), 1);
+ g_array_append_val (bands_array, u2100);
+ test_common_bnd_cmd_3g ("#BND=0,0", FALSE, bands_array);
+ test_common_bnd_cmd_3g ("#BND=0,0", TRUE, bands_array);
+ g_array_unref (bands_array);
+
+ /* Test flag 1 */
+ bands_array = g_array_sized_new (FALSE, FALSE, sizeof (MMModemBand), 1);
+ g_array_append_val (bands_array, u1900);
+ test_common_bnd_cmd_3g ("#BND=0,1", FALSE, bands_array);
+ test_common_bnd_cmd_3g ("#BND=0,1", TRUE, bands_array);
+ g_array_unref (bands_array);
+
+ /* Test flag 2 */
+ bands_array = g_array_sized_new (FALSE, FALSE, sizeof (MMModemBand), 1);
+ g_array_append_val (bands_array, u850);
+ test_common_bnd_cmd_3g ("#BND=0,2", FALSE, bands_array);
+ test_common_bnd_cmd_3g ("#BND=0,2", TRUE, bands_array);
+ g_array_unref (bands_array);
+
+ /* Test flag 3 */
+ bands_array = g_array_sized_new (FALSE, FALSE, sizeof (MMModemBand), 3);
+ g_array_append_val (bands_array, u2100);
+ g_array_append_val (bands_array, u1900);
+ g_array_append_val (bands_array, u850);
+ test_common_bnd_cmd_3g ("#BND=0,3", FALSE, bands_array);
+ test_common_bnd_cmd_3g ("#BND=0,3", TRUE, bands_array);
+ g_array_unref (bands_array);
+
+ /* Test flag 4 */
+ bands_array = g_array_sized_new (FALSE, FALSE, sizeof (MMModemBand), 2);
+ g_array_append_val (bands_array, u1900);
+ g_array_append_val (bands_array, u850);
+ test_common_bnd_cmd_3g ("#BND=0,4", FALSE, bands_array);
+ test_common_bnd_cmd_3g ("#BND=0,4", TRUE, bands_array);
+ g_array_unref (bands_array);
+
+ /* Test flag 5 */
+ bands_array = g_array_sized_new (FALSE, FALSE, sizeof (MMModemBand), 1);
+ g_array_append_val (bands_array, u900);
+ test_common_bnd_cmd_3g ("#BND=0,5", FALSE, bands_array);
+ test_common_bnd_cmd_3g ("#BND=0,5", TRUE, bands_array);
+ g_array_unref (bands_array);
+
+ /* Test flag 6 */
+ bands_array = g_array_sized_new (FALSE, FALSE, sizeof (MMModemBand), 2);
+ g_array_append_val (bands_array, u2100);
+ g_array_append_val (bands_array, u900);
+ test_common_bnd_cmd_3g ("#BND=0,6", FALSE, bands_array);
+ test_common_bnd_cmd_3g ("#BND=0,6", TRUE, bands_array);
+ g_array_unref (bands_array);
+
+ /* Test flag 7 */
+ bands_array = g_array_sized_new (FALSE, FALSE, sizeof (MMModemBand), 1);
+ g_array_append_val (bands_array, u17iv);
+ test_common_bnd_cmd_3g ("#BND=0,7", FALSE, bands_array);
+ test_common_bnd_cmd_3g ("#BND=0,7", TRUE, bands_array);
+ g_array_unref (bands_array);
+
+ /* Test flag 12 in default */
+ bands_array = g_array_sized_new (FALSE, FALSE, sizeof (MMModemBand), 1);
+ g_array_append_val (bands_array, u800);
+ test_common_bnd_cmd_3g ("#BND=0,12", FALSE, bands_array);
+ g_array_unref (bands_array);
+
+ /* Test flag 12 in alternate */
+ bands_array = g_array_sized_new (FALSE, FALSE, sizeof (MMModemBand), 4);
+ g_array_append_val (bands_array, u2100);
+ g_array_append_val (bands_array, u1800);
+ g_array_append_val (bands_array, u850);
+ g_array_append_val (bands_array, u900);
+ test_common_bnd_cmd_3g ("#BND=0,12", TRUE, bands_array);
+ g_array_unref (bands_array);
+
+ /* Test invalid band array */
+ bands_array = g_array_sized_new (FALSE, FALSE, sizeof (MMModemBand), 1);
+ g_array_append_val (bands_array, u17ix);
+ test_common_bnd_cmd_3g_invalid (bands_array);
+ g_array_unref (bands_array);
+
+ /* Test unmatched band array */
+ bands_array = g_array_sized_new (FALSE, FALSE, sizeof (MMModemBand), 2);
+ g_array_append_val (bands_array, egsm);
+ g_array_append_val (bands_array, eutran_i);
+ test_common_bnd_cmd_3g_not_found (bands_array);
+ g_array_unref (bands_array);
+}
+
+static void
+test_telit_get_4g_bnd_flag (void)
+{
+ GArray *bands_array;
+ MMModemBand eutran_i = MM_MODEM_BAND_EUTRAN_1;
+ MMModemBand eutran_ii = MM_MODEM_BAND_EUTRAN_2;
+ MMModemBand u2100 = MM_MODEM_BAND_UTRAN_1;
+ MMModemBand egsm = MM_MODEM_BAND_EGSM;
+
+ /* Test flag 1 */
+ bands_array = g_array_sized_new (FALSE, FALSE, sizeof (MMModemBand), 1);
+ g_array_append_val (bands_array, eutran_i);
+ test_common_bnd_cmd_4g ("#BND=0,0,1", FALSE, bands_array);
+ g_array_unref (bands_array);
+
+ /* Test flag 3 */
+ bands_array = g_array_sized_new (FALSE, FALSE, sizeof (MMModemBand), 2);
+ g_array_append_val (bands_array, eutran_i);
+ g_array_append_val (bands_array, eutran_ii);
+ test_common_bnd_cmd_4g ("#BND=0,0,3", FALSE, bands_array);
+ g_array_unref (bands_array);
+
+ /* Test unmatched band array */
+ bands_array = g_array_sized_new (FALSE, FALSE, sizeof (MMModemBand), 2);
+ g_array_append_val (bands_array, egsm);
+ g_array_append_val (bands_array, u2100);
+ test_common_bnd_cmd_4g_not_found (bands_array);
+ g_array_unref (bands_array);
+}
+
+/******************************************************************************/
+
+typedef struct {
+ const char* response;
+ MMTelitQssStatus expected_qss;
+ const char *error_message;
+} QssParseTest;
+
+static QssParseTest qss_parse_tests [] = {
+ {"#QSS: 0,0", QSS_STATUS_SIM_REMOVED, NULL},
+ {"#QSS: 1,0", QSS_STATUS_SIM_REMOVED, NULL},
+ {"#QSS: 0,1", QSS_STATUS_SIM_INSERTED, NULL},
+ {"#QSS: 0,2", QSS_STATUS_SIM_INSERTED_AND_UNLOCKED, NULL},
+ {"#QSS: 0,3", QSS_STATUS_SIM_INSERTED_AND_READY, NULL},
+ {"#QSS:0,3", QSS_STATUS_SIM_INSERTED_AND_READY, NULL},
+ {"#QSS: 0, 3", QSS_STATUS_SIM_INSERTED_AND_READY, NULL},
+ {"#QSS: 0", QSS_STATUS_UNKNOWN, "Could not parse \"#QSS?\" response: #QSS: 0"},
+ {"QSS:0,1", QSS_STATUS_UNKNOWN, "Could not parse \"#QSS?\" response: QSS:0,1"},
+ {"#QSS: 0,5", QSS_STATUS_UNKNOWN, "Unknown QSS status value given: 5"},
+};
+
+static void
+test_telit_parse_qss_query (void)
+{
+ MMTelitQssStatus actual_qss_status;
+ GError *error = NULL;
+ guint i;
+
+ for (i = 0; i < G_N_ELEMENTS (qss_parse_tests); i++) {
+ actual_qss_status = mm_telit_parse_qss_query (qss_parse_tests[i].response, &error);
+
+ g_assert_cmpint (actual_qss_status, ==, qss_parse_tests[i].expected_qss);
+ if (qss_parse_tests[i].error_message) {
+ g_assert_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED);
+ g_assert_cmpstr (error->message, ==, qss_parse_tests[i].error_message);
+ g_clear_error (&error);
+ }
+ }
+}
+
+/******************************************************************************/
+
+int main (int argc, char **argv)
+{
+ setlocale (LC_ALL, "");
+
+ g_test_init (&argc, &argv, NULL);
+
+ g_test_add_func ("/MM/telit/bands/supported/parse_bands_response", test_parse_supported_bands_response);
+ g_test_add_func ("/MM/telit/bands/current/parse_bands_response", test_parse_current_bands_response);
+ g_test_add_func ("/MM/telit/bands/current/set_bands/2g", test_telit_get_2g_bnd_flag);
+ g_test_add_func ("/MM/telit/bands/current/set_bands/3g", test_telit_get_3g_bnd_flag);
+ g_test_add_func ("/MM/telit/bands/current/set_bands/4g", test_telit_get_4g_bnd_flag);
+ g_test_add_func ("/MM/telit/qss/query", test_telit_parse_qss_query);
+ return g_test_run ();
+}