blob: fd2139151882760adb4cfa1755e0717881f61227 [file] [log] [blame]
// SPDX-License-Identifier: LGPL-2.1-or-later
/*
* This file is part of libgpiod.
*
* Copyright (C) 2017-2018 Bartosz Golaszewski <bartekgola@gmail.com>
*/
/* Test cases for the gpiomon program. */
#include <signal.h>
#include <unistd.h>
#include "gpiod-test.h"
static void gpiomon_single_rising_edge_event(void)
{
test_tool_run("gpiomon", "--rising-edge", "--num-events=1",
test_chip_name(1), "4", (char *)NULL);
test_set_event(1, 4, TEST_EVENT_RISING, 200);
test_tool_wait();
TEST_ASSERT(test_tool_exited());
TEST_ASSERT_RET_OK(test_tool_exit_status());
TEST_ASSERT_NOT_NULL(test_tool_stdout());
TEST_ASSERT_NULL(test_tool_stderr());
TEST_ASSERT_REGEX_MATCH(test_tool_stdout(),
"event\\:\\s+RISING\\s+EDGE\\s+offset\\:\\s+4\\s+timestamp:\\s+\\[[0-9]+\\.[0-9]+\\]");
}
TEST_DEFINE(gpiomon_single_rising_edge_event,
"tools: gpiomon - single rising edge event",
0, { 8, 8 });
static void gpiomon_single_rising_edge_event_active_low(void)
{
test_tool_run("gpiomon", "--rising-edge", "--num-events=1",
"--active-low", test_chip_name(1), "4", (char *)NULL);
test_set_event(1, 4, TEST_EVENT_RISING, 200);
test_tool_wait();
TEST_ASSERT(test_tool_exited());
TEST_ASSERT_RET_OK(test_tool_exit_status());
TEST_ASSERT_NOT_NULL(test_tool_stdout());
TEST_ASSERT_NULL(test_tool_stderr());
TEST_ASSERT_REGEX_MATCH(test_tool_stdout(),
"event\\:\\s+RISING\\s+EDGE\\s+offset\\:\\s+4\\s+timestamp:\\s+\\[[0-9]+\\.[0-9]+\\]");
}
TEST_DEFINE(gpiomon_single_rising_edge_event_active_low,
"tools: gpiomon - single rising edge event (active-low)",
0, { 8, 8 });
static void gpiomon_single_rising_edge_event_silent(void)
{
test_tool_run("gpiomon", "--rising-edge", "--num-events=1",
"--silent", test_chip_name(1), "4", (char *)NULL);
test_set_event(1, 4, TEST_EVENT_RISING, 200);
test_tool_wait();
TEST_ASSERT(test_tool_exited());
TEST_ASSERT_RET_OK(test_tool_exit_status());
TEST_ASSERT_NULL(test_tool_stdout());
TEST_ASSERT_NULL(test_tool_stderr());
}
TEST_DEFINE(gpiomon_single_rising_edge_event_silent,
"tools: gpiomon - single rising edge event (silent mode)",
0, { 8, 8 });
static void gpiomon_four_alternating_events(void)
{
test_tool_run("gpiomon", "--num-events=4",
test_chip_name(1), "4", (char *)NULL);
test_set_event(1, 4, TEST_EVENT_ALTERNATING, 100);
test_tool_wait();
TEST_ASSERT(test_tool_exited());
TEST_ASSERT_RET_OK(test_tool_exit_status());
TEST_ASSERT_NOT_NULL(test_tool_stdout());
TEST_ASSERT_NULL(test_tool_stderr());
TEST_ASSERT_REGEX_MATCH(test_tool_stdout(),
"event\\:\\s+FALLING\\s+EDGE\\s+offset\\:\\s+4\\s+timestamp:\\s+\\[[0-9]+\\.[0-9]+\\]");
TEST_ASSERT_REGEX_MATCH(test_tool_stdout(),
"event\\:\\s+RISING\\s+EDGE\\s+offset\\:\\s+4\\s+timestamp:\\s+\\[[0-9]+\\.[0-9]+\\]");
}
TEST_DEFINE(gpiomon_four_alternating_events,
"tools: gpiomon - four alternating events",
0, { 8, 8 });
static void gpiomon_falling_edge_events_sigint(void)
{
test_tool_run("gpiomon", "--falling-edge",
test_chip_name(0), "4", (char *)NULL);
test_set_event(0, 4, TEST_EVENT_FALLING, 100);
usleep(200000);
test_tool_signal(SIGINT);
test_tool_wait();
TEST_ASSERT(test_tool_exited());
TEST_ASSERT_RET_OK(test_tool_exit_status());
TEST_ASSERT_NOT_NULL(test_tool_stdout());
TEST_ASSERT_NULL(test_tool_stderr());
TEST_ASSERT_REGEX_MATCH(test_tool_stdout(),
"event\\:\\s+FALLING\\s+EDGE\\s+offset\\:\\s+4\\s+timestamp:\\s+\\[[0-9]+\\.[0-9]+\\]");
}
TEST_DEFINE(gpiomon_falling_edge_events_sigint,
"tools: gpiomon - receive falling edge events and kill with SIGINT",
0, { 8, 8 });
static void gpiomon_both_events_sigterm(void)
{
test_tool_run("gpiomon", "--falling-edge", "--rising-edge",
test_chip_name(0), "4", (char *)NULL);
test_set_event(0, 4, TEST_EVENT_ALTERNATING, 100);
usleep(300000);
test_tool_signal(SIGTERM);
test_tool_wait();
TEST_ASSERT(test_tool_exited());
TEST_ASSERT_RET_OK(test_tool_exit_status());
TEST_ASSERT_NOT_NULL(test_tool_stdout());
TEST_ASSERT_NULL(test_tool_stderr());
TEST_ASSERT_REGEX_MATCH(test_tool_stdout(),
"event\\:\\s+FALLING\\s+EDGE\\s+offset\\:\\s+4\\s+timestamp:\\s+\\[[0-9]+\\.[0-9]+\\]");
TEST_ASSERT_REGEX_MATCH(test_tool_stdout(),
"event\\:\\s+RISING\\s+EDGE\\s+offset\\:\\s+4\\s+timestamp:\\s+\\[[0-9]+\\.[0-9]+\\]");
}
TEST_DEFINE(gpiomon_both_events_sigterm,
"tools: gpiomon - receive both types of events and kill with SIGTERM",
0, { 8, 8 });
static void gpiomon_watch_multiple_lines(void)
{
test_tool_run("gpiomon", "--format=%o", test_chip_name(0),
"1", "2", "3", "4", "5", (char *)NULL);
test_set_event(0, 2, TEST_EVENT_ALTERNATING, 100);
usleep(150000);
test_set_event(0, 3, TEST_EVENT_ALTERNATING, 100);
usleep(150000);
test_set_event(0, 4, TEST_EVENT_ALTERNATING, 100);
usleep(150000);
test_tool_signal(SIGTERM);
test_tool_wait();
TEST_ASSERT(test_tool_exited());
TEST_ASSERT_RET_OK(test_tool_exit_status());
TEST_ASSERT_NULL(test_tool_stderr());
TEST_ASSERT_NOT_NULL(test_tool_stdout());
TEST_ASSERT_STR_EQ(test_tool_stdout(), "2\n3\n4\n");
}
TEST_DEFINE(gpiomon_watch_multiple_lines,
"tools: gpiomon - watch multiple lines",
0, { 8, 8 });
static void gpiomon_watch_multiple_lines_not_in_order(void)
{
test_tool_run("gpiomon", "--format=%o", test_chip_name(0),
"5", "2", "7", "1", "6", (char *)NULL);
test_set_event(0, 2, TEST_EVENT_ALTERNATING, 100);
usleep(150000);
test_set_event(0, 1, TEST_EVENT_ALTERNATING, 100);
usleep(150000);
test_set_event(0, 6, TEST_EVENT_ALTERNATING, 100);
usleep(150000);
test_tool_signal(SIGTERM);
test_tool_wait();
TEST_ASSERT(test_tool_exited());
TEST_ASSERT_RET_OK(test_tool_exit_status());
TEST_ASSERT_NULL(test_tool_stderr());
TEST_ASSERT_NOT_NULL(test_tool_stdout());
TEST_ASSERT_STR_EQ(test_tool_stdout(), "2\n1\n6\n");
}
TEST_DEFINE(gpiomon_watch_multiple_lines_not_in_order,
"tools: gpiomon - watch multiple lines (offsets not in order)",
0, { 8, 8 });
static void gpiomon_request_the_same_line_twice(void)
{
test_tool_run("gpiomon", test_chip_name(0), "2", "2", (char *)NULL);
test_tool_wait();
TEST_ASSERT(test_tool_exited());
TEST_ASSERT_EQ(test_tool_exit_status(), 1);
TEST_ASSERT_NULL(test_tool_stdout());
TEST_ASSERT_NOT_NULL(test_tool_stderr());
TEST_ASSERT_STR_CONTAINS(test_tool_stderr(),
"error waiting for events");
}
TEST_DEFINE(gpiomon_request_the_same_line_twice,
"tools: gpiomon - request the same line twice",
0, { 8, 8 });
static void gpiomon_no_arguments(void)
{
test_tool_run("gpiomon", (char *)NULL);
test_tool_wait();
TEST_ASSERT(test_tool_exited());
TEST_ASSERT_EQ(test_tool_exit_status(), 1);
TEST_ASSERT_NULL(test_tool_stdout());
TEST_ASSERT_NOT_NULL(test_tool_stderr());
TEST_ASSERT_STR_CONTAINS(test_tool_stderr(),
"gpiochip must be specified");
}
TEST_DEFINE(gpiomon_no_arguments,
"tools: gpiomon - no arguments",
0, { });
static void gpiomon_line_not_specified(void)
{
test_tool_run("gpiomon", test_chip_name(1), (char *)NULL);
test_tool_wait();
TEST_ASSERT(test_tool_exited());
TEST_ASSERT_EQ(test_tool_exit_status(), 1);
TEST_ASSERT_NULL(test_tool_stdout());
TEST_ASSERT_NOT_NULL(test_tool_stderr());
TEST_ASSERT_STR_CONTAINS(test_tool_stderr(),
"GPIO line offset must be specified");
}
TEST_DEFINE(gpiomon_line_not_specified,
"tools: gpiomon - line not specified",
0, { 4, 4 });
static void gpiomon_line_out_of_range(void)
{
test_tool_run("gpiomon", test_chip_name(0), "4", (char *)NULL);
test_tool_wait();
TEST_ASSERT(test_tool_exited());
TEST_ASSERT_EQ(test_tool_exit_status(), 1);
TEST_ASSERT_NULL(test_tool_stdout());
TEST_ASSERT_NOT_NULL(test_tool_stderr());
TEST_ASSERT_STR_CONTAINS(test_tool_stderr(),
"error waiting for events");
}
TEST_DEFINE(gpiomon_line_out_of_range,
"tools: gpiomon - line out of range",
0, { 4 });
static void gpiomon_custom_format_event_and_offset(void)
{
test_tool_run("gpiomon", "--num-events=1", "--format=%e %o",
test_chip_name(0), "3", (char *)NULL);
test_set_event(0, 3, TEST_EVENT_RISING, 100);
test_tool_wait();
TEST_ASSERT(test_tool_exited());
TEST_ASSERT_RET_OK(test_tool_exit_status());
TEST_ASSERT_NOT_NULL(test_tool_stdout());
TEST_ASSERT_NULL(test_tool_stderr());
TEST_ASSERT_STR_EQ(test_tool_stdout(), "1 3\n");
}
TEST_DEFINE(gpiomon_custom_format_event_and_offset,
"tools: gpiomon - custom output format: event and offset",
0, { 8, 8 });
static void gpiomon_custom_format_event_and_offset_joined(void)
{
test_tool_run("gpiomon", "--num-events=1", "--format=%e%o",
test_chip_name(0), "3", (char *)NULL);
test_set_event(0, 3, TEST_EVENT_RISING, 100);
test_tool_wait();
TEST_ASSERT(test_tool_exited());
TEST_ASSERT_RET_OK(test_tool_exit_status());
TEST_ASSERT_NOT_NULL(test_tool_stdout());
TEST_ASSERT_NULL(test_tool_stderr());
TEST_ASSERT_STR_EQ(test_tool_stdout(), "13\n");
}
TEST_DEFINE(gpiomon_custom_format_event_and_offset_joined,
"tools: gpiomon - custom output format: event and offset, joined strings",
0, { 8, 8 });
static void gpiomon_custom_format_timestamp(void)
{
test_tool_run("gpiomon", "--num-events=1", "--format=%e %o %s.%n",
test_chip_name(0), "3", (char *)NULL);
test_set_event(0, 3, TEST_EVENT_RISING, 100);
test_tool_wait();
TEST_ASSERT(test_tool_exited());
TEST_ASSERT_RET_OK(test_tool_exit_status());
TEST_ASSERT_NOT_NULL(test_tool_stdout());
TEST_ASSERT_NULL(test_tool_stderr());
TEST_ASSERT_REGEX_MATCH(test_tool_stdout(), "1 3 [0-9]+\\.[0-9]+");
}
TEST_DEFINE(gpiomon_custom_format_timestamp,
"tools: gpiomon - custom output format: timestamp",
0, { 8, 8 });
static void gpiomon_custom_format_double_percent_sign(void)
{
test_tool_run("gpiomon", "--num-events=1", "--format=%%",
test_chip_name(0), "3", (char *)NULL);
test_set_event(0, 3, TEST_EVENT_RISING, 100);
test_tool_wait();
TEST_ASSERT(test_tool_exited());
TEST_ASSERT_RET_OK(test_tool_exit_status());
TEST_ASSERT_NOT_NULL(test_tool_stdout());
TEST_ASSERT_NULL(test_tool_stderr());
TEST_ASSERT_STR_EQ(test_tool_stdout(), "%\n");
}
TEST_DEFINE(gpiomon_custom_format_double_percent_sign,
"tools: gpiomon - custom output format: double percent sign",
0, { 8, 8 });
static void gpiomon_custom_format_double_percent_sign_and_spec(void)
{
test_tool_run("gpiomon", "--num-events=1", "--format=%%e",
test_chip_name(0), "3", (char *)NULL);
test_set_event(0, 3, TEST_EVENT_RISING, 100);
test_tool_wait();
TEST_ASSERT(test_tool_exited());
TEST_ASSERT_RET_OK(test_tool_exit_status());
TEST_ASSERT_NOT_NULL(test_tool_stdout());
TEST_ASSERT_NULL(test_tool_stderr());
TEST_ASSERT_STR_EQ(test_tool_stdout(), "%e\n");
}
TEST_DEFINE(gpiomon_custom_format_double_percent_sign_and_spec,
"tools: gpiomon - custom output format: double percent sign with specifier",
0, { 8, 8 });
static void gpiomon_custom_format_single_percent_sign(void)
{
test_tool_run("gpiomon", "--num-events=1", "--format=%",
test_chip_name(0), "3", (char *)NULL);
test_set_event(0, 3, TEST_EVENT_RISING, 100);
test_tool_wait();
TEST_ASSERT(test_tool_exited());
TEST_ASSERT_RET_OK(test_tool_exit_status());
TEST_ASSERT_NOT_NULL(test_tool_stdout());
TEST_ASSERT_NULL(test_tool_stderr());
TEST_ASSERT_STR_EQ(test_tool_stdout(), "%\n");
}
TEST_DEFINE(gpiomon_custom_format_single_percent_sign,
"tools: gpiomon - custom output format: single percent sign",
0, { 8, 8 });
static void gpiomon_custom_format_single_percent_sign_between_chars(void)
{
test_tool_run("gpiomon", "--num-events=1", "--format=foo % bar",
test_chip_name(0), "3", (char *)NULL);
test_set_event(0, 3, TEST_EVENT_RISING, 100);
test_tool_wait();
TEST_ASSERT(test_tool_exited());
TEST_ASSERT_RET_OK(test_tool_exit_status());
TEST_ASSERT_NOT_NULL(test_tool_stdout());
TEST_ASSERT_NULL(test_tool_stderr());
TEST_ASSERT_STR_EQ(test_tool_stdout(), "foo % bar\n");
}
TEST_DEFINE(gpiomon_custom_format_single_percent_sign_between_chars,
"tools: gpiomon - custom output format: single percent sign between other characters",
0, { 8, 8 });
static void gpiomon_custom_format_unknown_specifier(void)
{
test_tool_run("gpiomon", "--num-events=1", "--format=%x",
test_chip_name(0), "3", (char *)NULL);
test_set_event(0, 3, TEST_EVENT_RISING, 100);
test_tool_wait();
TEST_ASSERT(test_tool_exited());
TEST_ASSERT_RET_OK(test_tool_exit_status());
TEST_ASSERT_NOT_NULL(test_tool_stdout());
TEST_ASSERT_NULL(test_tool_stderr());
TEST_ASSERT_STR_EQ(test_tool_stdout(), "%x\n");
}
TEST_DEFINE(gpiomon_custom_format_unknown_specifier,
"tools: gpiomon - custom output format: unknown specifier",
0, { 8, 8 });