aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/Makefile.am29
-rw-r--r--test/mmrules.c173
2 files changed, 202 insertions, 0 deletions
diff --git a/test/Makefile.am b/test/Makefile.am
index ae526cbb..cd2b5d56 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -6,12 +6,16 @@ EXTRA_DIST =
# lsudev
################################################################################
+if WITH_UDEV
+
noinst_PROGRAMS += lsudev
lsudev_SOURCES = lsudev.c
lsudev_CPPFLAGS = $(GUDEV_CFLAGS)
lsudev_LDADD = $(GUDEV_LIBS)
+endif
+
################################################################################
# mmtty
################################################################################
@@ -38,6 +42,31 @@ mmtty_LDADD = \
$(NULL)
################################################################################
+# mmrules
+################################################################################
+
+noinst_PROGRAMS += mmrules
+
+mmrules_SOURCES = mmrules.c
+
+mmrules_CPPFLAGS = \
+ $(MM_CFLAGS) \
+ -I$(top_srcdir) \
+ -I$(top_srcdir)/src \
+ -I$(top_srcdir)/src/kerneldevice \
+ -I$(top_srcdir)/include \
+ -I$(top_builddir)/include \
+ -I$(top_srcdir)/libmm-glib \
+ -I$(top_srcdir)/libmm-glib/generated \
+ -I$(top_builddir)/libmm-glib/generated
+ $(NULL)
+
+mmrules_LDADD = \
+ $(MM_LIBS) \
+ $(top_builddir)/src/libkerneldevice.la \
+ $(NULL)
+
+################################################################################
# mmcli-test-sms
################################################################################
diff --git a/test/mmrules.c b/test/mmrules.c
new file mode 100644
index 00000000..f8c4c3e4
--- /dev/null
+++ b/test/mmrules.c
@@ -0,0 +1,173 @@
+/* -*- 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 Aleksander Morgado <aleksander@aleksander.es>
+ */
+
+#include "config.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <locale.h>
+#include <string.h>
+
+#include <glib.h>
+#include <gio/gio.h>
+
+#include <mm-log.h>
+#include <mm-kernel-device-generic-rules.h>
+
+#define PROGRAM_NAME "mmrules"
+#define PROGRAM_VERSION PACKAGE_VERSION
+
+/* Context */
+static gchar *path;
+static gboolean verbose_flag;
+static gboolean version_flag;
+
+static GOptionEntry main_entries[] = {
+ { "path", 'p', 0, G_OPTION_ARG_FILENAME, &path,
+ "Specify path to udev rules directory",
+ "[PATH]"
+ },
+ { "verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose_flag,
+ "Run action with verbose logs",
+ NULL
+ },
+ { "version", 'V', 0, G_OPTION_ARG_NONE, &version_flag,
+ "Print version",
+ NULL
+ },
+ { NULL }
+};
+
+void
+_mm_log (const char *loc,
+ const char *func,
+ guint32 level,
+ const char *fmt,
+ ...)
+{
+ va_list args;
+ gchar *msg;
+
+ if (!verbose_flag)
+ return;
+
+ va_start (args, fmt);
+ msg = g_strdup_vprintf (fmt, args);
+ va_end (args);
+ g_print ("%s\n", msg);
+ g_free (msg);
+}
+
+static void
+print_version_and_exit (void)
+{
+ g_print ("\n"
+ PROGRAM_NAME " " PROGRAM_VERSION "\n"
+ "Copyright (2015) Aleksander Morgado\n"
+ "License GPLv2+: GNU GPL version 2 or later <http://gnu.org/licenses/gpl-2.0.html>\n"
+ "This is free software: you are free to change and redistribute it.\n"
+ "There is NO WARRANTY, to the extent permitted by law.\n"
+ "\n");
+ exit (EXIT_SUCCESS);
+}
+
+static void
+print_rule (MMUdevRule *rule)
+{
+ /* Process conditions */
+ if (rule->conditions) {
+ guint i;
+
+ for (i = 0; i < rule->conditions->len; i++) {
+ MMUdevRuleMatch *rule_match;
+
+ rule_match = &g_array_index (rule->conditions, MMUdevRuleMatch, i);
+ switch (rule_match->type) {
+ case MM_UDEV_RULE_MATCH_TYPE_EQUAL:
+ g_print (" [condition %u] %s == %s\n",
+ i, rule_match->parameter, rule_match->value);
+ break;
+ case MM_UDEV_RULE_MATCH_TYPE_NOT_EQUAL:
+ g_print (" [condition %u] %s != %s\n",
+ i, rule_match->parameter, rule_match->value);
+ break;
+ case MM_UDEV_RULE_MATCH_TYPE_UNKNOWN:
+ g_assert_not_reached ();
+ }
+ }
+ }
+
+ /* Process result */
+ switch (rule->result.type) {
+ case MM_UDEV_RULE_RESULT_TYPE_LABEL:
+ g_print (" [result] label %s\n", rule->result.content.tag);
+ break;
+ case MM_UDEV_RULE_RESULT_TYPE_GOTO_INDEX:
+ g_print (" [result] jump to rule %u\n", rule->result.content.index);
+ break;
+ case MM_UDEV_RULE_RESULT_TYPE_PROPERTY:
+ g_print (" [result] set property %s = %s\n",
+ rule->result.content.property.name, rule->result.content.property.value);
+ break;
+ case MM_UDEV_RULE_RESULT_TYPE_GOTO_TAG:
+ case MM_UDEV_RULE_RESULT_TYPE_UNKNOWN:
+ g_assert_not_reached ();
+ }
+}
+
+int main (int argc, char **argv)
+{
+ GOptionContext *context;
+ GArray *rules;
+ guint i;
+ GError *error = NULL;
+
+ setlocale (LC_ALL, "");
+
+ g_type_init ();
+
+ /* Setup option context, process it and destroy it */
+ context = g_option_context_new ("- ModemManager udev rules testing");
+ g_option_context_add_main_entries (context, main_entries, NULL);
+ g_option_context_parse (context, &argc, &argv, NULL);
+ g_option_context_free (context);
+
+ if (version_flag)
+ print_version_and_exit ();
+
+ /* No device path given? */
+ if (!path) {
+ g_printerr ("error: no path specified\n");
+ exit (EXIT_FAILURE);
+ }
+
+ /* Load rules from directory */
+ rules = mm_kernel_device_generic_rules_load (path, &error);
+ if (!rules) {
+ g_printerr ("error: couldn't load rules: %s", error->message);
+ exit (EXIT_FAILURE);
+ }
+
+ /* Print loaded rules */
+ for (i = 0; i < rules->len; i++) {
+ g_print ("-----------------------------------------\n");
+ g_print ("rule [%u]:\n", i);
+ print_rule (&g_array_index (rules, MMUdevRule, i));
+ }
+
+ g_array_unref (rules);
+
+ return EXIT_SUCCESS;
+}