From 14b93163da85db81004fc7d602f9844877aaa295 Mon Sep 17 00:00:00 2001 From: Bartosz Golaszewski Date: Mon, 20 Feb 2017 15:57:24 +0100 Subject: [PATCH] tests: add a chip iterator test case Add a test case checking the chip iterators and the accompanying gpiod_foreach_chip() macro. Since we're adding a new file: make the cleanup helpers reusable from all test files. Signed-off-by: Bartosz Golaszewski --- tests/unit/Makefile.am | 2 +- tests/unit/gpiod-unit.c | 18 ++++++++++++++++ tests/unit/gpiod-unit.h | 7 ++++-- tests/unit/tests-chip.c | 47 +++++++++++++++-------------------------- tests/unit/tests-iter.c | 40 +++++++++++++++++++++++++++++++++++ 5 files changed, 81 insertions(+), 33 deletions(-) create mode 100644 tests/unit/tests-iter.c diff --git a/tests/unit/Makefile.am b/tests/unit/Makefile.am index b92e101..260b22e 100644 --- a/tests/unit/Makefile.am +++ b/tests/unit/Makefile.am @@ -13,4 +13,4 @@ DEPENDENCIES = libgpiod.la check_PROGRAMS = gpiod-unit -gpiod_unit_SOURCES = gpiod-unit.c tests-chip.c +gpiod_unit_SOURCES = gpiod-unit.c tests-chip.c tests-iter.c diff --git a/tests/unit/gpiod-unit.c b/tests/unit/gpiod-unit.c index a5b77bb..04995c1 100644 --- a/tests/unit/gpiod-unit.c +++ b/tests/unit/gpiod-unit.c @@ -402,3 +402,21 @@ int main(int argc GU_UNUSED, char **argv GU_UNUSED) return globals.tests_failed ? EXIT_FAILURE : EXIT_SUCCESS; } + +void gu_close_chip(struct gpiod_chip **chip) +{ + if (*chip) + gpiod_chip_close(*chip); +} + +void gu_free_str(char **str) +{ + if (*str) + free(*str); +} + +void gu_free_chip_iter(struct gpiod_chip_iter **iter) +{ + if (*iter) + gpiod_chip_iter_free(*iter); +} diff --git a/tests/unit/gpiod-unit.h b/tests/unit/gpiod-unit.h index ffefabe..4c0aff9 100644 --- a/tests/unit/gpiod-unit.h +++ b/tests/unit/gpiod-unit.h @@ -11,9 +11,8 @@ #ifndef __GPIOD_UNIT_H__ #define __GPIOD_UNIT_H__ -#include +#include #include -#include #define GU_INIT __attribute__((constructor)) #define GU_UNUSED __attribute__((unused)) @@ -74,6 +73,10 @@ const char * gu_chip_path(unsigned int index); const char * gu_chip_name(unsigned int index); unsigned int gu_chip_num(unsigned int index); +void gu_close_chip(struct gpiod_chip **chip); +void gu_free_str(char **str); +void gu_free_chip_iter(struct gpiod_chip_iter **iter); + #define GU_ASSERT(statement) \ do { \ if (!(statement)) { \ diff --git a/tests/unit/tests-chip.c b/tests/unit/tests-chip.c index 514da80..bfba6f7 100644 --- a/tests/unit/tests-chip.c +++ b/tests/unit/tests-chip.c @@ -9,26 +9,13 @@ */ #include "gpiod-unit.h" -#include #include #include -static void close_chip(struct gpiod_chip **chip) -{ - if (*chip) - gpiod_chip_close(*chip); -} - -static void free_str(char **str) -{ - if (*str) - free(*str); -} - static void chip_open_good(void) { - GU_CLEANUP(close_chip) struct gpiod_chip *chip = NULL; + GU_CLEANUP(gu_close_chip) struct gpiod_chip *chip = NULL; chip = gpiod_chip_open(gu_chip_path(0)); GU_ASSERT_NOT_NULL(chip); @@ -63,7 +50,7 @@ GU_DEFINE_TEST(chip_open_notty, static void chip_open_by_number_good(void) { - GU_CLEANUP(close_chip) struct gpiod_chip *chip = NULL; + GU_CLEANUP(gu_close_chip) struct gpiod_chip *chip = NULL; chip = gpiod_chip_open_by_number(gu_chip_num(0)); GU_ASSERT_NOT_NULL(chip); @@ -74,10 +61,10 @@ GU_DEFINE_TEST(chip_open_by_number_good, static void chip_open_lookup(void) { - GU_CLEANUP(close_chip) struct gpiod_chip *chip_by_name = NULL; - GU_CLEANUP(close_chip) struct gpiod_chip *chip_by_path = NULL; - GU_CLEANUP(close_chip) struct gpiod_chip *chip_by_num = NULL; - GU_CLEANUP(free_str) char *chip_num; + GU_CLEANUP(gu_close_chip) struct gpiod_chip *chip_by_name = NULL; + GU_CLEANUP(gu_close_chip) struct gpiod_chip *chip_by_path = NULL; + GU_CLEANUP(gu_close_chip) struct gpiod_chip *chip_by_num = NULL; + GU_CLEANUP(gu_free_str) char *chip_num; GU_ASSERT(asprintf(&chip_num, "%u", gu_chip_num(0)) > 0); @@ -95,9 +82,9 @@ GU_DEFINE_TEST(chip_open_lookup, static void chip_name(void) { - GU_CLEANUP(close_chip) struct gpiod_chip *chip0 = NULL; - GU_CLEANUP(close_chip) struct gpiod_chip *chip1 = NULL; - GU_CLEANUP(close_chip) struct gpiod_chip *chip2 = NULL; + GU_CLEANUP(gu_close_chip) struct gpiod_chip *chip0 = NULL; + GU_CLEANUP(gu_close_chip) struct gpiod_chip *chip1 = NULL; + GU_CLEANUP(gu_close_chip) struct gpiod_chip *chip2 = NULL; chip0 = gpiod_chip_open(gu_chip_path(0)); chip1 = gpiod_chip_open(gu_chip_path(1)); @@ -114,9 +101,9 @@ GU_DEFINE_TEST(chip_name, "gpiod_chip_name()", GU_LINES_UNNAMED, { 8, 8, 8 }); static void chip_label(void) { - GU_CLEANUP(close_chip) struct gpiod_chip *chip0 = NULL; - GU_CLEANUP(close_chip) struct gpiod_chip *chip1 = NULL; - GU_CLEANUP(close_chip) struct gpiod_chip *chip2 = NULL; + GU_CLEANUP(gu_close_chip) struct gpiod_chip *chip0 = NULL; + GU_CLEANUP(gu_close_chip) struct gpiod_chip *chip1 = NULL; + GU_CLEANUP(gu_close_chip) struct gpiod_chip *chip2 = NULL; chip0 = gpiod_chip_open(gu_chip_path(0)); chip1 = gpiod_chip_open(gu_chip_path(1)); @@ -134,11 +121,11 @@ GU_DEFINE_TEST(chip_label, "gpiod_chip_label()", static void chip_num_lines(void) { - GU_CLEANUP(close_chip) struct gpiod_chip *chip0 = NULL; - GU_CLEANUP(close_chip) struct gpiod_chip *chip1 = NULL; - GU_CLEANUP(close_chip) struct gpiod_chip *chip2 = NULL; - GU_CLEANUP(close_chip) struct gpiod_chip *chip3 = NULL; - GU_CLEANUP(close_chip) struct gpiod_chip *chip4 = NULL; + GU_CLEANUP(gu_close_chip) struct gpiod_chip *chip0 = NULL; + GU_CLEANUP(gu_close_chip) struct gpiod_chip *chip1 = NULL; + GU_CLEANUP(gu_close_chip) struct gpiod_chip *chip2 = NULL; + GU_CLEANUP(gu_close_chip) struct gpiod_chip *chip3 = NULL; + GU_CLEANUP(gu_close_chip) struct gpiod_chip *chip4 = NULL; chip0 = gpiod_chip_open(gu_chip_path(0)); chip1 = gpiod_chip_open(gu_chip_path(1)); diff --git a/tests/unit/tests-iter.c b/tests/unit/tests-iter.c new file mode 100644 index 0000000..4bc5574 --- /dev/null +++ b/tests/unit/tests-iter.c @@ -0,0 +1,40 @@ +/* + * GPIO chip test cases for libgpiod. + * + * Copyright (C) 2017 Bartosz Golaszewski + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2.1 of the GNU Lesser General Public License + * as published by the Free Software Foundation. + */ + +#include "gpiod-unit.h" + +static void chip_iter(void) +{ + GU_CLEANUP(gu_free_chip_iter) struct gpiod_chip_iter *iter = NULL; + struct gpiod_chip *chip; + bool A, B, C; + + A = B = C = false; + + iter = gpiod_chip_iter_new(); + GU_ASSERT_NOT_NULL(iter); + + gpiod_foreach_chip(iter, chip) { + GU_ASSERT(!gpiod_chip_iter_err(iter)); + + if (strcmp(gpiod_chip_label(chip), "gpio-mockup-A") == 0) + A = true; + else if (strcmp(gpiod_chip_label(chip), "gpio-mockup-B") == 0) + B = true; + else if (strcmp(gpiod_chip_label(chip), "gpio-mockup-C") == 0) + C = true; + } + + GU_ASSERT(A); + GU_ASSERT(B); + GU_ASSERT(C); +} +GU_DEFINE_TEST(chip_iter, "gpiod_chip iterator", + GU_LINES_UNNAMED, { 8, 8, 8 }); -- 2.30.2