diff options
-rw-r--r-- | .gitignore | 2 | ||||
-rw-r--r-- | configure.ac | 1 | ||||
-rw-r--r-- | src/qmi-firmware-update/Makefile.am | 17 | ||||
-rw-r--r-- | src/qmi-firmware-update/qfu-utils.c | 48 | ||||
-rw-r--r-- | src/qmi-firmware-update/qfu-utils.h | 7 | ||||
-rw-r--r-- | src/qmi-firmware-update/test/Makefile.am | 24 | ||||
-rw-r--r-- | src/qmi-firmware-update/test/test-utils.c | 104 |
7 files changed, 203 insertions, 0 deletions
@@ -79,3 +79,5 @@ Makefile.in /utils/swi-update /src/qmi-firmware-update/qfu-enum-types.* + +/src/qmi-firmware-update/test/test-utils diff --git a/configure.ac b/configure.ac index 311c10ea..d4b6abff 100644 --- a/configure.ac +++ b/configure.ac @@ -173,6 +173,7 @@ AC_CONFIG_FILES([Makefile src/qmicli/test/Makefile src/qmi-proxy/Makefile src/qmi-firmware-update/Makefile + src/qmi-firmware-update/test/Makefile utils/Makefile docs/Makefile docs/reference/Makefile diff --git a/src/qmi-firmware-update/Makefile.am b/src/qmi-firmware-update/Makefile.am index 86e857d8..cbe8ed1b 100644 --- a/src/qmi-firmware-update/Makefile.am +++ b/src/qmi-firmware-update/Makefile.am @@ -1,4 +1,20 @@ +SUBDIRS = . test + +noinst_LTLIBRARIES = libutils.la + +libutils_la_SOURCES = \ + qfu-utils.h qfu-utils.c \ + $(NULL) + +libutils_la_CPPFLAGS = \ + $(GLIB_CFLAGS) \ + $(NULL) + +libutils_la_LIBADD = \ + $(GLIB_CFLAGS) \ + $(NULL) + bin_PROGRAMS = qmi-firmware-update qmi_firmware_update_CPPFLAGS = \ @@ -60,6 +76,7 @@ qmi_firmware_update_SOURCES = \ qmi_firmware_update_LDADD = \ $(GUDEV_LIBS) \ $(GLIB_LIBS) \ + $(builddir)/libutils.la \ $(top_builddir)/src/libqmi-glib/libqmi-glib.la \ $(NULL) diff --git a/src/qmi-firmware-update/qfu-utils.c b/src/qmi-firmware-update/qfu-utils.c index 905e3280..4e0b6e3a 100644 --- a/src/qmi-firmware-update/qfu-utils.c +++ b/src/qmi-firmware-update/qfu-utils.c @@ -27,6 +27,7 @@ #include <string.h> #include <glib.h> +#include <gio/gio.h> #include "qfu-utils.h" @@ -165,3 +166,50 @@ qfu_utils_crc16 (const guint8 *buffer, crc = crc_table[(crc ^ *buffer++) & 0xff] ^ (crc >> 8); return ~crc; } + +/******************************************************************************/ + +gboolean +qfu_utils_parse_cwe_version_string (const gchar *version, + gchar **firmware_version, + gchar **config_version, + gchar **carrier, + GError **error) +{ + GRegex *regex; + GMatchInfo *match_info = NULL; + gboolean result = FALSE; + + regex = g_regex_new ("(?:.*)" + "_([0-9][0-9]\\.[0-9][0-9]\\.[0-9][0-9]\\.[0-9][0-9])" /* firmware version */ + "(?:" + "(?:.*)" + "_([a-zA-Z\\-]+)" /* carrier */ + "_([0-9][0-9][0-9]\\.[0-9][0-9][0-9]_[0-9][0-9][0-9])" /* config version */ + ")?", + 0, 0, NULL); + g_assert (regex); + + if (!g_regex_match_full (regex, version, strlen (version), 0, 0, &match_info, NULL)) { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, + "couldn't parse CWE version string '%s': didn't match", + version); + goto out; + } + + if (firmware_version) + *firmware_version = g_match_info_fetch (match_info, 1); + if (carrier) + *carrier = (g_match_info_get_match_count (match_info) > 2 ? g_match_info_fetch (match_info, 2) : NULL); + if (config_version) + *config_version = (g_match_info_get_match_count (match_info) > 3 ? g_match_info_fetch (match_info, 3) : NULL); + + result = TRUE; + +out: + if (match_info) + g_match_info_free (match_info); + g_regex_unref (regex); + + return result; +} diff --git a/src/qmi-firmware-update/qfu-utils.h b/src/qmi-firmware-update/qfu-utils.h index 2c66aadd..8180a83d 100644 --- a/src/qmi-firmware-update/qfu-utils.h +++ b/src/qmi-firmware-update/qfu-utils.h @@ -24,6 +24,7 @@ #define QFU_UTILS_H #include <glib.h> +#include <gio/gio.h> G_BEGIN_DECLS @@ -36,6 +37,12 @@ gchar *qfu_utils_get_firmware_image_unique_id_printable (const GArray *unique_id guint16 qfu_utils_crc16 (const guint8 *buffer, gsize len); +gboolean qfu_utils_parse_cwe_version_string (const gchar *version, + gchar **firmware_version, + gchar **config_version, + gchar **carrier, + GError **error); + G_END_DECLS #endif /* QFU_UTILS_H */ diff --git a/src/qmi-firmware-update/test/Makefile.am b/src/qmi-firmware-update/test/Makefile.am new file mode 100644 index 00000000..7ef33d36 --- /dev/null +++ b/src/qmi-firmware-update/test/Makefile.am @@ -0,0 +1,24 @@ +include $(top_srcdir)/gtester.make + +noinst_PROGRAMS = \ + test-utils \ + $(NULL) + +TEST_PROGS += $(noinst_PROGRAMS) + +test_utils_SOURCES = \ + test-utils.c \ + $(NULL) + +test_utils_CPPFLAGS = \ + $(GLIB_CFLAGS) \ + -I$(top_srcdir) \ + -I$(top_srcdir)/src/qmi-firmware-update \ + -I$(top_builddir)/src/qmi-firmware-update \ + -DLIBQMI_GLIB_COMPILATION \ + $(NULL) + +test_utils_LDADD = \ + $(top_builddir)/src/qmi-firmware-update/libutils.la \ + $(GLIB_LIBS) \ + $(NULL) diff --git a/src/qmi-firmware-update/test/test-utils.c b/src/qmi-firmware-update/test/test-utils.c new file mode 100644 index 00000000..7a77eeb4 --- /dev/null +++ b/src/qmi-firmware-update/test/test-utils.c @@ -0,0 +1,104 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * qmi-firmware-update -- Command line tool to update firmware in QMI devices + * + * 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. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * Copyright (C) 2016 Zodiac Inflight Innovations + * Copyright (C) 2016 Aleksander Morgado <aleksander@aleksander.es> + */ + +#include "qfu-utils.h" + +/******************************************************************************/ + +static void +common_version_parser_test (const gchar *version, + const gchar *expected_firmware_version, + const gchar *expected_config_version, + const gchar *expected_carrier) +{ + gboolean res; + GError *error = NULL; + gchar *firmware_version = NULL; + gchar *config_version = NULL; + gchar *carrier = NULL; + + res = qfu_utils_parse_cwe_version_string (version, + &firmware_version, + &config_version, + &carrier, + &error); + g_assert_no_error (error); + g_assert (res); + + g_assert_cmpstr (firmware_version, ==, expected_firmware_version); + g_assert_cmpstr (config_version, ==, expected_config_version); + g_assert_cmpstr (carrier, ==, expected_carrier); + + g_free (firmware_version); + g_free (config_version); + g_free (carrier); +} + +static void +test_cwe_version_parser_mc7700 (void) +{ + common_version_parser_test ("9999999_9999999_9200_03.05.29.03_00_generic_000.000_001_SPKG_MC", + "03.05.29.03", + "000.000_001", + "generic"); +} + +static void +test_cwe_version_parser_mc7354_cwe (void) +{ + common_version_parser_test ("INTERNAL_?_SWI9X15C_05.05.63.01_?_?_?_?", + "05.05.63.01", + NULL, + NULL); +} + +static void +test_cwe_version_parser_mc7354_nvu (void) +{ + common_version_parser_test ("9999999_9902350_SWI9X15C_05.05.63.01_00_SPRINT_005.037_000", + "05.05.63.01", + "005.037_000", + "SPRINT"); +} + +static void +test_cwe_version_parser_mc7354b_spk (void) +{ + common_version_parser_test ("9999999_9902574_SWI9X15C_05.05.66.00_00_GENNA-UMTS_005.028_000", + "05.05.66.00", + "005.028_000", + "GENNA-UMTS"); +} + +/******************************************************************************/ + +int main (int argc, char **argv) +{ + g_type_init (); + g_test_init (&argc, &argv, NULL); + + g_test_add_func ("/qmi-firmware-update/cwe-version-parser/mc7700", test_cwe_version_parser_mc7700); + g_test_add_func ("/qmi-firmware-update/cwe-version-parser/mc7354/cwe", test_cwe_version_parser_mc7354_cwe); + g_test_add_func ("/qmi-firmware-update/cwe-version-parser/mc7354/nvu", test_cwe_version_parser_mc7354_nvu); + g_test_add_func ("/qmi-firmware-update/cwe-version-parser/mc7354b/spk", test_cwe_version_parser_mc7354b_spk); + + return g_test_run (); +} |