From: Bartosz Golaszewski <brgl@bgdev.pl>
To: Kent Gibson <warthog618@gmail.com>,
Linus Walleij <linus.walleij@linaro.org>,
Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: linux-gpio@vger.kernel.org, Bartosz Golaszewski <brgl@bgdev.pl>
Subject: [libgpiod][PATCH 3/3] tests: port C tests to libgpiosim
Date: Thu, 29 Apr 2021 11:47:34 +0200 [thread overview]
Message-ID: <20210429094734.9585-4-brgl@bgdev.pl> (raw)
In-Reply-To: <20210429094734.9585-1-brgl@bgdev.pl>
This converts the core library tests to using libgpiosim instead of
libgpiod-mockup while keeping the same interface for tests.
Signed-off-by: Bartosz Golaszewski <brgl@bgdev.pl>
---
tests/Makefile.am | 4 +-
tests/gpiod-test.c | 122 +++++++++++++++++++++++++++++++++++----------
tests/gpiod-test.h | 2 +-
3 files changed, 99 insertions(+), 29 deletions(-)
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 760aefa..c8754ea 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -3,13 +3,13 @@
SUBDIRS = mockup gpiosim
-AM_CFLAGS = -I$(top_srcdir)/include/ -I$(top_srcdir)/tests/mockup/
+AM_CFLAGS = -I$(top_srcdir)/include/ -I$(top_srcdir)/tests/gpiosim/
AM_CFLAGS += -include $(top_builddir)/config.h
AM_CFLAGS += -Wall -Wextra -g -std=gnu89 $(GLIB_CFLAGS)
AM_CFLAGS += -DG_LOG_DOMAIN=\"gpiod-test\"
AM_LDFLAGS = -pthread
LDADD = $(top_builddir)/lib/libgpiod.la
-LDADD += $(top_builddir)/tests/mockup/libgpiomockup.la
+LDADD += $(top_builddir)/tests/gpiosim/libgpiosim.la
LDADD += $(GLIB_LIBS)
bin_PROGRAMS = gpiod-test
diff --git a/tests/gpiod-test.c b/tests/gpiod-test.c
index ca5cdb3..b279989 100644
--- a/tests/gpiod-test.c
+++ b/tests/gpiod-test.c
@@ -3,7 +3,7 @@
#include <errno.h>
#include <glib/gstdio.h>
-#include <gpio-mockup.h>
+#include <gpiosim.h>
#include <linux/version.h>
#include <stdio.h>
#include <sys/utsname.h>
@@ -30,7 +30,8 @@ struct gpiod_test_event_thread {
static struct {
GList *tests;
- struct gpio_mockup *mockup;
+ struct gpiosim_ctx *gpiosim;
+ GPtrArray *sim_chips;
} globals;
static void check_kernel(void)
@@ -61,29 +62,93 @@ static void check_kernel(void)
return;
}
+static gchar **make_line_names(guint num_lines, char chip_idx)
+{
+ gchar **line_names;
+ guint i;
+
+ line_names = g_malloc0_n(num_lines + 1, sizeof(gchar *));
+
+ for (i = 0; i < num_lines; i++)
+ line_names[i] = g_strdup_printf("gpio-mockup-%c-%u",
+ chip_idx, i);
+
+ return line_names;
+}
+
+static void remove_gpiosim_chip(gpointer data)
+{
+ struct gpiosim_chip *chip = data;
+ gint ret;
+
+ ret = gpiosim_chip_uncommit(chip);
+ if (ret)
+ g_error("unable to uncommit a simulated chip: %s",
+ g_strerror(errno));
+
+ gpiosim_chip_unref(chip);
+}
+
static void test_func_wrapper(gconstpointer data)
{
const _GpiodTestCase *test = data;
- gint ret, flags = 0;
+ struct gpiosim_chip *sim_chip;
+ gchar **line_names, *label;
+ gchar chip_idx;
+ gint ret;
+ guint i;
+
+ globals.sim_chips = g_ptr_array_new_full(test->num_chips,
+ remove_gpiosim_chip);
+
+ for (i = 0; i < test->num_chips; i++) {
+ chip_idx = i + 65;
+
+ sim_chip = gpiosim_chip_new(globals.gpiosim, NULL);
+ if (!sim_chip)
+ g_error("unable to create a simulated GPIO chip: %s",
+ g_strerror(errno));
+
+ label = g_strdup_printf("gpio-mockup-%c", chip_idx);
+ ret = gpiosim_chip_set_label(sim_chip, label);
+ g_free(label);
+ if (ret)
+ g_error("unable to set simulated chip label: %s",
+ g_strerror(errno));
+
+ ret = gpiosim_chip_set_num_lines(sim_chip, test->chip_sizes[i]);
+ if (ret)
+ g_error("unable to set the number of lines for a simulated chip: %s",
+ g_strerror(errno));
+
+ if (test->flags & GPIOD_TEST_FLAG_NAMED_LINES) {
+ line_names = make_line_names(test->chip_sizes[i],
+ chip_idx);
+ ret = gpiosim_chip_set_line_names(sim_chip,
+ test->chip_sizes[i],
+ line_names);
+ g_strfreev(line_names);
+ if (ret)
+ g_error("unable to set the line names for a simulated chip: %s",
+ g_strerror(errno));
+ }
- if (test->flags & GPIOD_TEST_FLAG_NAMED_LINES)
- flags |= GPIO_MOCKUP_FLAG_NAMED_LINES;
+ ret = gpiosim_chip_commit_sync(sim_chip);
+ if (ret)
+ g_error("unable to commit the simulated chip: %s",
+ g_strerror(errno));
- ret = gpio_mockup_probe(globals.mockup, test->num_chips,
- test->chip_sizes, flags);
- if (ret)
- g_error("unable to probe gpio-mockup: %s", g_strerror(errno));
+ g_ptr_array_add(globals.sim_chips, sim_chip);
+ }
test->func();
- ret = gpio_mockup_remove(globals.mockup);
- if (ret)
- g_error("unable to remove gpio_mockup: %s", g_strerror(errno));
+ g_ptr_array_unref(globals.sim_chips);
}
-static void unref_mockup(void)
+static void unref_gpiosim(void)
{
- gpio_mockup_unref(globals.mockup);
+ gpiosim_ctx_unref(globals.gpiosim);
}
static void add_test_from_list(gpointer element, gpointer data G_GNUC_UNUSED)
@@ -102,15 +167,15 @@ int main(gint argc, gchar **argv)
g_debug("%u tests registered", g_list_length(globals.tests));
/*
- * Setup libgpiomockup first so that it runs its own kernel version
+ * Setup libpiosim first so that it runs its own kernel version
* check before we tell the user our local requirements are met as
* well.
*/
- globals.mockup = gpio_mockup_new();
- if (!globals.mockup)
- g_error("unable to initialize gpio-mockup library: %s",
+ globals.gpiosim = gpiosim_ctx_new();
+ if (!globals.gpiosim)
+ g_error("unable to initialize gpiosim library: %s",
g_strerror(errno));
- atexit(unref_mockup);
+ atexit(unref_gpiosim);
check_kernel();
@@ -127,9 +192,10 @@ void _gpiod_test_register(_GpiodTestCase *test)
const gchar *gpiod_test_chip_path(guint idx)
{
+ struct gpiosim_chip *chip = g_ptr_array_index(globals.sim_chips, idx);
const gchar *path;
- path = gpio_mockup_chip_path(globals.mockup, idx);
+ path = gpiosim_chip_get_dev(chip);
if (!path)
g_error("unable to retrieve the chip path: %s",
g_strerror(errno));
@@ -139,9 +205,10 @@ const gchar *gpiod_test_chip_path(guint idx)
const gchar *gpiod_test_chip_name(guint idx)
{
+ struct gpiosim_chip *chip = g_ptr_array_index(globals.sim_chips, idx);
const gchar *name;
- name = gpio_mockup_chip_name(globals.mockup, idx);
+ name = gpiosim_chip_get_name(chip);
if (!name)
g_error("unable to retrieve the chip name: %s",
g_strerror(errno));
@@ -151,11 +218,13 @@ const gchar *gpiod_test_chip_name(guint idx)
gint gpiod_test_chip_get_value(guint chip_index, guint line_offset)
{
+ struct gpiosim_chip *chip = g_ptr_array_index(globals.sim_chips,
+ chip_index);
gint ret;
- ret = gpio_mockup_get_value(globals.mockup, chip_index, line_offset);
+ ret = gpiosim_chip_get_value(chip, line_offset);
if (ret < 0)
- g_error("unable to read line value from gpio-mockup: %s",
+ g_error("unable to read line value from gpiosim: %s",
g_strerror(errno));
return ret;
@@ -163,12 +232,13 @@ gint gpiod_test_chip_get_value(guint chip_index, guint line_offset)
void gpiod_test_chip_set_pull(guint chip_index, guint line_offset, gint pull)
{
+ struct gpiosim_chip *chip = g_ptr_array_index(globals.sim_chips,
+ chip_index);
gint ret;
- ret = gpio_mockup_set_pull(globals.mockup, chip_index,
- line_offset, pull);
+ ret = gpiosim_chip_set_pull(chip, line_offset, pull);
if (ret)
- g_error("unable to set line pull in gpio-mockup: %s",
+ g_error("unable to set line pull in gpiosim: %s",
g_strerror(errno));
}
diff --git a/tests/gpiod-test.h b/tests/gpiod-test.h
index 61735d9..f2e8b02 100644
--- a/tests/gpiod-test.h
+++ b/tests/gpiod-test.h
@@ -50,7 +50,7 @@ enum {
/*
* Register a test case function. The last argument is the array of numbers
- * of lines per mockup chip.
+ * of lines per simulated chip.
*/
#define GPIOD_TEST_CASE(_name, _flags, ...) \
static void _name(void); \
--
2.30.1
prev parent reply other threads:[~2021-04-29 9:47 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-04-29 9:47 [libgpiod][PATCH 0/3] tests: add support for the gpio-sim kernel module Bartosz Golaszewski
2021-04-29 9:47 ` [libgpiod][PATCH 1/3] tests: remove gpiod_test_chip_num() Bartosz Golaszewski
2021-04-29 9:47 ` [libgpiod][PATCH 2/3] libgpiosim: new library for controlling the gpio-sim module Bartosz Golaszewski
2021-04-29 11:23 ` Andy Shevchenko
2021-04-29 13:07 ` Bartosz Golaszewski
2021-04-29 17:00 ` Andy Shevchenko
2021-04-29 17:03 ` Andy Shevchenko
2021-04-29 17:04 ` Andy Shevchenko
2021-04-30 9:29 ` Bartosz Golaszewski
2021-04-30 11:41 ` Andy Shevchenko
2021-04-30 12:31 ` Bartosz Golaszewski
2021-04-29 9:47 ` Bartosz Golaszewski [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210429094734.9585-4-brgl@bgdev.pl \
--to=brgl@bgdev.pl \
--cc=andriy.shevchenko@linux.intel.com \
--cc=linus.walleij@linaro.org \
--cc=linux-gpio@vger.kernel.org \
--cc=warthog618@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.