[PATCH] huawei: fix parsing of ^NDISSTATQRY? response
Ben Chan
benchan at chromium.org
Mon Aug 5 19:46:03 PDT 2013
This patch modifies mm_huawei_parse_ndisstatqry_response() to properly
handle a ^NDISSTATQRY? response when it is mixed with another unsolicited
response, e.g.
^RSSI: 16\r\n^NDISSTATQRY: 0,,,"IPV4"
This patch is originally developed by:
Franko Fang <fangxiaozhi at huawei.com>
And then revised by:
Ben Chan <benchan at chromium.org>
---
plugins/huawei/mm-modem-helpers-huawei.c | 6 +-
plugins/huawei/tests/test-modem-helpers-huawei.c | 70 +++++++++++++++---------
2 files changed, 48 insertions(+), 28 deletions(-)
diff --git a/plugins/huawei/mm-modem-helpers-huawei.c b/plugins/huawei/mm-modem-helpers-huawei.c
index d9b038d..e1e05c4 100644
--- a/plugins/huawei/mm-modem-helpers-huawei.c
+++ b/plugins/huawei/mm-modem-helpers-huawei.c
@@ -20,6 +20,7 @@
#define _LIBMM_INSIDE_MM
#include <libmm-glib.h>
+#include "mm-log.h"
#include "mm-modem-helpers-huawei.h"
/*****************************************************************************/
@@ -37,7 +38,10 @@ mm_huawei_parse_ndisstatqry_response (const gchar *response,
GMatchInfo *match_info;
GError *inner_error = NULL;
- if (!response || !g_str_has_prefix (response, "^NDISSTATQRY:")) {
+ if (response)
+ response = g_strstr_len (response, -1, "^NDISSTATQRY:");
+
+ if (!response) {
g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, "Missing ^NDISSTATQRY prefix");
return FALSE;
}
diff --git a/plugins/huawei/tests/test-modem-helpers-huawei.c b/plugins/huawei/tests/test-modem-helpers-huawei.c
index c1bc0ed..5e2e83d 100644
--- a/plugins/huawei/tests/test-modem-helpers-huawei.c
+++ b/plugins/huawei/tests/test-modem-helpers-huawei.c
@@ -17,6 +17,9 @@
#include <glib-object.h>
#include <locale.h>
+#include <ModemManager.h>
+
+#include "mm-errors-types.h"
#include "mm-modem-helpers-huawei.h"
/*****************************************************************************/
@@ -24,6 +27,7 @@
typedef struct {
const gchar *str;
+ gboolean expected_result;
gboolean expected_ipv4_available;
gboolean expected_ipv4_connected;
gboolean expected_ipv6_available;
@@ -31,39 +35,48 @@ typedef struct {
} NdisstatqryTest;
static const NdisstatqryTest ndisstatqry_tests[] = {
- { "^NDISSTATQRY: 1,,,IPV4\r\n", TRUE, TRUE, FALSE, FALSE },
- { "^NDISSTATQRY: 0,,,IPV4\r\n", TRUE, FALSE, FALSE, FALSE },
- { "^NDISSTATQRY: 1,,,IPV6\r\n", FALSE, FALSE, TRUE, TRUE },
- { "^NDISSTATQRY: 0,,,IPV6\r\n", FALSE, FALSE, TRUE, FALSE },
+ { "^NDISSTATQRY: 1,,,IPV4\r\n", TRUE, TRUE, TRUE, FALSE, FALSE },
+ { "^NDISSTATQRY: 0,,,IPV4\r\n", TRUE, TRUE, FALSE, FALSE, FALSE },
+ { "^NDISSTATQRY: 1,,,IPV6\r\n", TRUE, FALSE, FALSE, TRUE, TRUE },
+ { "^NDISSTATQRY: 0,,,IPV6\r\n", TRUE, FALSE, FALSE, TRUE, FALSE },
{ "^NDISSTATQRY: 1,,,IPV4\r\n"
- "^NDISSTATQRY: 1,,,IPV6\r\n", TRUE, TRUE, TRUE, TRUE },
+ "^NDISSTATQRY: 1,,,IPV6\r\n", TRUE, TRUE, TRUE, TRUE, TRUE },
{ "^NDISSTATQRY: 1,,,IPV4\r\n"
- "^NDISSTATQRY: 0,,,IPV6\r\n", TRUE, TRUE, TRUE, FALSE },
+ "^NDISSTATQRY: 0,,,IPV6\r\n", TRUE, TRUE, TRUE, TRUE, FALSE },
{ "^NDISSTATQRY: 0,,,IPV4\r\n"
- "^NDISSTATQRY: 1,,,IPV6\r\n", TRUE, FALSE, TRUE, TRUE },
+ "^NDISSTATQRY: 1,,,IPV6\r\n", TRUE, TRUE, FALSE, TRUE, TRUE },
{ "^NDISSTATQRY: 0,,,IPV4\r\n"
- "^NDISSTATQRY: 0,,,IPV6\r\n", TRUE, FALSE, TRUE, FALSE },
- { "^NDISSTATQRY: 1,,,IPV4", TRUE, TRUE, FALSE, FALSE },
- { "^NDISSTATQRY: 0,,,IPV4", TRUE, FALSE, FALSE, FALSE },
- { "^NDISSTATQRY: 1,,,IPV6", FALSE, FALSE, TRUE, TRUE },
- { "^NDISSTATQRY: 0,,,IPV6", FALSE, FALSE, TRUE, FALSE },
+ "^NDISSTATQRY: 0,,,IPV6\r\n", TRUE, TRUE, FALSE, TRUE, FALSE },
+ { "^NDISSTATQRY: 1,,,IPV4", TRUE, TRUE, TRUE, FALSE, FALSE },
+ { "^NDISSTATQRY: 0,,,IPV4", TRUE, TRUE, FALSE, FALSE, FALSE },
+ { "^NDISSTATQRY: 1,,,IPV6", TRUE, FALSE, FALSE, TRUE, TRUE },
+ { "^NDISSTATQRY: 0,,,IPV6", TRUE, FALSE, FALSE, TRUE, FALSE },
{ "^NDISSTATQRY: 1,,,IPV4\r\n"
- "^NDISSTATQRY: 1,,,IPV6", TRUE, TRUE, TRUE, TRUE },
+ "^NDISSTATQRY: 1,,,IPV6", TRUE, TRUE, TRUE, TRUE, TRUE },
{ "^NDISSTATQRY: 1,,,IPV4\r\n"
- "^NDISSTATQRY: 0,,,IPV6", TRUE, TRUE, TRUE, FALSE },
+ "^NDISSTATQRY: 0,,,IPV6", TRUE, TRUE, TRUE, TRUE, FALSE },
{ "^NDISSTATQRY: 0,,,IPV4\r\n"
- "^NDISSTATQRY: 1,,,IPV6", TRUE, FALSE, TRUE, TRUE },
+ "^NDISSTATQRY: 1,,,IPV6", TRUE, TRUE, FALSE, TRUE, TRUE },
{ "^NDISSTATQRY: 0,,,IPV4\r\n"
- "^NDISSTATQRY: 0,,,IPV6", TRUE, FALSE, TRUE, FALSE },
- { NULL, FALSE, FALSE, FALSE, FALSE }
+ "^NDISSTATQRY: 0,,,IPV6", TRUE, TRUE, FALSE, TRUE, FALSE },
+ { "^RSSI: 16\r\n"
+ "^NDISSTATQRY: 0,,,IPV4", TRUE, TRUE, FALSE, FALSE, FALSE },
+ { "^RSSI: 16\r\n"
+ "^NDISSTATQRY: 0,,,IPV4\r\n"
+ "^NDISSTATQRY: 0,,,IPV6", TRUE, TRUE, FALSE, TRUE, FALSE },
+ { "^RSSI: 16\r\n", FALSE, FALSE, FALSE, FALSE, FALSE },
+ { "OK\r\n", FALSE, FALSE, FALSE, FALSE, FALSE },
+ { "\r\n", FALSE, FALSE, FALSE, FALSE, FALSE },
+ { "", FALSE, FALSE, FALSE, FALSE, FALSE },
+ { NULL, FALSE, FALSE, FALSE, FALSE, FALSE }
};
static void
test_ndisstatqry (void)
{
- guint i;
+ size_t i;
- for (i = 0; ndisstatqry_tests[i].str; i++) {
+ for (i = 0; i < sizeof (ndisstatqry_tests) / sizeof (ndisstatqry_tests[0]); i++) {
GError *error = NULL;
gboolean ipv4_available;
gboolean ipv4_connected;
@@ -76,15 +89,18 @@ test_ndisstatqry (void)
&ipv4_connected,
&ipv6_available,
&ipv6_connected,
- &error) == TRUE);
- g_assert_no_error (error);
+ &error) == ndisstatqry_tests[i].expected_result);
+ if (ndisstatqry_tests[i].expected_result) {
+ g_assert_no_error (error);
+ g_assert (ipv4_available == ndisstatqry_tests[i].expected_ipv4_available);
+ if (ipv4_available)
+ g_assert (ipv4_connected == ndisstatqry_tests[i].expected_ipv4_connected);
+ g_assert (ipv6_available == ndisstatqry_tests[i].expected_ipv6_available);
+ if (ipv6_available)
+ g_assert (ipv6_connected == ndisstatqry_tests[i].expected_ipv6_connected);
+ } else
+ g_assert_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED);
- g_assert (ipv4_available == ndisstatqry_tests[i].expected_ipv4_available);
- if (ipv4_available)
- g_assert (ipv4_connected == ndisstatqry_tests[i].expected_ipv4_connected);
- g_assert (ipv6_available == ndisstatqry_tests[i].expected_ipv6_available);
- if (ipv6_available)
- g_assert (ipv6_connected == ndisstatqry_tests[i].expected_ipv6_connected);
}
}
--
1.8.3
More information about the ModemManager-devel
mailing list