From: Kent Gibson <warthog618@gmail.com>
To: linux-gpio@vger.kernel.org, brgl@bgdev.pl
Cc: Kent Gibson <warthog618@gmail.com>
Subject: [libgpiod v2][PATCH v3 5/5] tools: gpiowatch tests
Date: Tue, 11 Oct 2022 08:29:09 +0800 [thread overview]
Message-ID: <20221011002909.26987-6-warthog618@gmail.com> (raw)
In-Reply-To: <20221011002909.26987-1-warthog618@gmail.com>
Extend the tool test suite to cover the gpiowatch tool.
Signed-off-by: Kent Gibson <warthog618@gmail.com>
---
tools/gpio-tools-test.bats | 503 +++++++++++++++++++++++++++++++++++++
1 file changed, 503 insertions(+)
diff --git a/tools/gpio-tools-test.bats b/tools/gpio-tools-test.bats
index 6c12ffc..e42576b 100755
--- a/tools/gpio-tools-test.bats
+++ b/tools/gpio-tools-test.bats
@@ -2318,3 +2318,506 @@ request_release_line() {
dut_read
output_is "%x"
}
+
+#
+# gpiowatch test cases
+#
+
+@test "gpiowatch: by name" {
+ gpiosim_chip sim0 num_lines=8 line_name=4:foo
+
+ local sim0=${GPIOSIM_CHIP_NAME[sim0]}
+
+ dut_run gpiowatch --banner foo
+ dut_regex_match "Watching line .*"
+
+ request_release_line $sim0 4
+
+ dut_regex_match "[0-9]+\.[0-9]+\\s+requested\\s+foo"
+ dut_regex_match "[0-9]+\.[0-9]+\\s+released\\s+foo"
+ # tools currently have no way to generate a reconfig event
+}
+
+@test "gpiowatch: by offset" {
+ gpiosim_chip sim0 num_lines=8
+
+ local sim0=${GPIOSIM_CHIP_NAME[sim0]}
+
+ dut_run gpiowatch --banner --chip $sim0 4
+ dut_regex_match "Watching line .*"
+
+ request_release_line $sim0 4
+ dut_regex_match "[0-9]+\.[0-9]+\\s+requested\\s+$sim0 4"
+ dut_regex_match "[0-9]+\.[0-9]+\\s+released\\s+$sim0 4"
+
+ assert_fail dut_readable
+}
+
+@test "gpiowatch: by symlink" {
+ gpiosim_chip sim0 num_lines=8
+ gpiosim_chip_symlink sim0 .
+
+ local sim0=${GPIOSIM_CHIP_NAME[sim0]}
+
+ dut_run gpiowatch --banner --chip $GPIOSIM_CHIP_LINK 4
+ dut_regex_match "Watching line .*"
+
+ request_release_line $sim0 4
+ dut_regex_match "[0-9]+\.[0-9]+\\s+requested\\s+$sim0\\s+4"
+ dut_regex_match "[0-9]+\.[0-9]+\\s+released\\s+$sim0\\s+4"
+
+ assert_fail dut_readable
+}
+
+@test "gpiowatch: by chip and name" {
+ gpiosim_chip sim0 num_lines=8 line_name=4:foo
+ gpiosim_chip sim1 num_lines=8 line_name=2:foo
+
+ local sim1=${GPIOSIM_CHIP_NAME[sim1]}
+
+ dut_run gpiowatch --banner --chip $sim1 foo
+ dut_regex_match "Watching line .*"
+
+ request_release_line $sim1 2
+ dut_regex_match "[0-9]+\.[0-9]+\\s+requested\\s+$sim1 2 foo"
+ dut_regex_match "[0-9]+\.[0-9]+\\s+released\\s+$sim1 2 foo"
+
+ assert_fail dut_readable
+}
+
+@test "gpiowatch: first matching named line" {
+ gpiosim_chip sim0 num_lines=4 line_name=1:foo line_name=2:bar \
+ line_name=3:foobar
+ gpiosim_chip sim1 num_lines=8 line_name=0:baz line_name=2:foobar \
+ line_name=4:xyz line_name=7:foobar
+ gpiosim_chip sim2 num_lines=16
+
+ dut_run gpiowatch --banner foobar
+ dut_regex_match "Watching line .*"
+
+ request_release_line ${GPIOSIM_CHIP_NAME[sim0]} 3
+ dut_regex_match "[0-9]+\.[0-9]+\\s+requested\\s+foobar"
+ dut_regex_match "[0-9]+\.[0-9]+\\s+released\\s+foobar"
+
+ assert_fail dut_readable
+}
+
+@test "gpiowatch: with requested" {
+ gpiosim_chip sim0 num_lines=8
+
+ local sim0=${GPIOSIM_CHIP_NAME[sim0]}
+
+ gpiosim_set_pull sim0 4 pull-up
+
+ dut_run gpiowatch --banner --event=requested --chip $sim0 4
+ dut_flush
+
+ request_release_line ${GPIOSIM_CHIP_NAME[sim0]} 4
+ dut_regex_match "[0-9]+\.[0-9]+\\s+requested\\s+$sim0 4"
+ assert_fail dut_readable
+}
+
+@test "gpiowatch: with released" {
+ gpiosim_chip sim0 num_lines=8
+ local sim0=${GPIOSIM_CHIP_NAME[sim0]}
+
+ gpiosim_set_pull sim0 4 pull-down
+
+ dut_run gpiowatch --banner --event=released --chip $sim0 4
+ dut_flush
+
+ request_release_line ${GPIOSIM_CHIP_NAME[sim0]} 4
+ dut_regex_match "[0-9]+\.[0-9]+\\s+released\\s+$sim0 4"
+ assert_fail dut_readable
+}
+
+@test "gpiowatch: with quiet mode" {
+ gpiosim_chip sim0 num_lines=8
+
+ local sim0=${GPIOSIM_CHIP_NAME[sim0]}
+
+ dut_run gpiowatch --banner --quiet --chip $sim0 4
+ dut_flush
+
+ request_release_line ${GPIOSIM_CHIP_NAME[sim0]} 4
+ assert_fail dut_readable
+}
+
+@test "gpiowatch: with num-events" {
+ gpiosim_chip sim0 num_lines=8
+
+ local sim0=${GPIOSIM_CHIP_NAME[sim0]}
+
+ # redirect, as gpiowatch exits after 4 events
+ dut_run_redirect gpiowatch --num-events=4 --chip $sim0 3 4
+
+
+ request_release_line ${GPIOSIM_CHIP_NAME[sim0]} 4
+ request_release_line ${GPIOSIM_CHIP_NAME[sim0]} 3
+
+ dut_wait
+ status_is 0
+ dut_read_redirect
+
+ regex_matches "[0-9]+\.[0-9]+\\s+requested\\s+$sim0 4" "${lines[0]}"
+ regex_matches "[0-9]+\.[0-9]+\\s+released\\s+$sim0 4" "${lines[1]}"
+ regex_matches "[0-9]+\.[0-9]+\\s+requested\\s+$sim0 3" "${lines[2]}"
+ regex_matches "[0-9]+\.[0-9]+\\s+released\\s+$sim0 3" "${lines[3]}"
+ num_lines_is 4
+}
+
+@test "gpiowatch: multiple lines" {
+ gpiosim_chip sim0 num_lines=8
+
+ local sim0=${GPIOSIM_CHIP_NAME[sim0]}
+
+ dut_run gpiowatch --banner --chip $sim0 1 2 3 4 5
+ dut_regex_match "Watching lines .*"
+
+ request_release_line $sim0 2
+ dut_regex_match "[0-9]+\.[0-9]+\\s+requested\\s+$sim0 2"
+ dut_regex_match "[0-9]+\.[0-9]+\\s+released\\s+$sim0 2"
+
+ request_release_line $sim0 3
+ dut_regex_match "[0-9]+\.[0-9]+\\s+requested\\s+$sim0 3"
+ dut_regex_match "[0-9]+\.[0-9]+\\s+released\\s+$sim0 3"
+
+ request_release_line $sim0 4
+ dut_regex_match "[0-9]+\.[0-9]+\\s+requested\\s+$sim0 4"
+ dut_regex_match "[0-9]+\.[0-9]+\\s+released\\s+$sim0 4"
+
+ assert_fail dut_readable
+}
+
+@test "gpiowatch: multiple lines by name and offset" {
+ gpiosim_chip sim0 num_lines=4 line_name=1:foo line_name=2:bar
+
+ local sim0=${GPIOSIM_CHIP_NAME[sim0]}
+
+ dut_run gpiowatch --banner --chip $sim0 bar foo 3
+ dut_regex_match "Watching lines .*"
+
+ request_release_line $sim0 2
+ dut_regex_match "[0-9]+\.[0-9]+\\s+requested\\s+$sim0 2\\s+bar"
+ dut_regex_match "[0-9]+\.[0-9]+\\s+released\\s+$sim0 2\\s+bar"
+
+ request_release_line $sim0 1
+ dut_regex_match "[0-9]+\.[0-9]+\\s+requested\\s+$sim0 1\\s+foo"
+ dut_regex_match "[0-9]+\.[0-9]+\\s+released\\s+$sim0 1\\s+foo"
+
+ request_release_line $sim0 3
+ dut_regex_match "[0-9]+\.[0-9]+\\s+requested\\s+$sim0 3"
+ dut_regex_match "[0-9]+\.[0-9]+\\s+released\\s+$sim0 3"
+
+ assert_fail dut_readable
+}
+
+@test "gpiowatch: multiple lines across multiple chips" {
+ gpiosim_chip sim0 num_lines=4 line_name=1:foo line_name=2:bar
+ gpiosim_chip sim1 num_lines=8 line_name=0:baz line_name=4:xyz
+
+ local sim0=${GPIOSIM_CHIP_NAME[sim0]}
+ local sim1=${GPIOSIM_CHIP_NAME[sim1]}
+
+ dut_run gpiowatch --banner baz bar foo xyz
+ dut_regex_match "Watching lines .*"
+
+ request_release_line $sim0 2
+ dut_regex_match "[0-9]+\.[0-9]+\\s+requested\\s+bar"
+ dut_regex_match "[0-9]+\.[0-9]+\\s+released\\s+bar"
+
+ request_release_line $sim0 1
+ dut_regex_match "[0-9]+\.[0-9]+\\s+requested\\s+foo"
+ dut_regex_match "[0-9]+\.[0-9]+\\s+released\\s+foo"
+
+ request_release_line $sim1 4
+ dut_regex_match "[0-9]+\.[0-9]+\\s+requested\\s+xyz"
+ dut_regex_match "[0-9]+\.[0-9]+\\s+released\\s+xyz"
+
+ request_release_line $sim1 0
+ dut_regex_match "[0-9]+\.[0-9]+\\s+requested\\s+baz"
+ dut_regex_match "[0-9]+\.[0-9]+\\s+released\\s+baz"
+
+ assert_fail dut_readable
+}
+
+@test "gpiowatch: exit after SIGINT" {
+ gpiosim_chip sim0 num_lines=8
+
+ dut_run gpiowatch --banner --chip ${GPIOSIM_CHIP_NAME[sim0]} 4
+ dut_regex_match "Watching line .*"
+
+ dut_kill -SIGINT
+ dut_wait
+
+ status_is 130
+}
+
+@test "gpiowatch: exit after SIGTERM" {
+ gpiosim_chip sim0 num_lines=8
+
+ dut_run gpiowatch --banner --chip ${GPIOSIM_CHIP_NAME[sim0]} 4
+ dut_regex_match "Watching line .*"
+
+ dut_kill -SIGTERM
+ dut_wait
+
+ status_is 143
+}
+
+@test "gpiowatch: with nonexistent line" {
+ run_tool gpiowatch nonexistent-line
+
+ status_is 1
+ output_regex_match ".*cannot find line 'nonexistent-line'"
+}
+
+@test "gpiowatch: with same line twice" {
+ gpiosim_chip sim0 num_lines=8 line_name=1:foo
+
+ local sim0=${GPIOSIM_CHIP_NAME[sim0]}
+
+ # by offset
+ run_tool gpiowatch --chip $sim0 0 0
+
+ output_regex_match ".*lines '0' and '0' are the same line"
+ num_lines_is 1
+ status_is 1
+
+ # by name
+ run_tool gpiowatch foo foo
+
+ output_regex_match ".*lines 'foo' and 'foo' are the same line"
+ num_lines_is 1
+ status_is 1
+
+ # by name and offset
+ run_tool gpiowatch --chip $sim0 1 foo
+
+ output_regex_match ".*lines '1' and 'foo' are the same line"
+ num_lines_is 1
+ status_is 1
+}
+
+@test "gpiowatch: with strict named line check" {
+ gpiosim_chip sim0 num_lines=4 line_name=1:foo line_name=2:bar \
+ line_name=3:foobar
+ gpiosim_chip sim1 num_lines=8 line_name=0:baz line_name=2:foobar \
+ line_name=4:xyz line_name=7:foobar
+ gpiosim_chip sim2 num_lines=16
+
+ run_tool gpiowatch --strict foobar
+
+ output_regex_match ".*line 'foobar' is not unique"
+ status_is 1
+}
+
+@test "gpiowatch: with lines by offset" {
+ # not suggesting this setup makes any sense
+ # - just test that we can deal with it
+ gpiosim_chip sim0 num_lines=8 line_name=1:6 line_name=6:1
+
+ local sim0=${GPIOSIM_CHIP_NAME[sim0]}
+
+ dut_run gpiowatch --banner --chip $sim0 1
+ dut_flush
+
+ request_release_line $sim0 1
+ dut_regex_match "[0-9]+\.[0-9]+\\s+requested\\s+$sim0 1"
+ dut_regex_match "[0-9]+\.[0-9]+\\s+released\\s+$sim0 1"
+
+ request_release_line $sim0 6
+
+ assert_fail dut_readable
+}
+
+@test "gpiowatch: with lines strictly by name" {
+ # not suggesting this setup makes any sense
+ # - just test that we can deal with it
+ gpiosim_chip sim0 num_lines=8 line_name=1:6 line_name=6:1
+
+ local sim0=${GPIOSIM_CHIP_NAME[sim0]}
+
+ dut_run gpiowatch --banner --by-name --chip $sim0 1
+ dut_flush
+
+ request_release_line $sim0 6
+ dut_regex_match "[0-9]+\.[0-9]+\\s+requested\\s+$sim0 6 1"
+ dut_regex_match "[0-9]+\.[0-9]+\\s+released\\s+$sim0 6 1"
+
+ request_release_line $sim0 1
+ assert_fail dut_readable
+}
+
+@test "gpiowatch: with no arguments" {
+ run_tool gpiowatch
+
+ output_regex_match ".*at least one GPIO line must be specified"
+ status_is 1
+}
+
+@test "gpiowatch: with no line specified" {
+ gpiosim_chip sim0 num_lines=8
+
+ run_tool gpiowatch --chip ${GPIOSIM_CHIP_NAME[sim0]}
+
+ output_regex_match ".*at least one GPIO line must be specified"
+ status_is 1
+}
+
+@test "gpiowatch: with offset out of range" {
+ gpiosim_chip sim0 num_lines=4
+
+ local sim0=${GPIOSIM_CHIP_NAME[sim0]}
+
+ run_tool gpiowatch --chip $sim0 5
+
+ output_regex_match ".*offset 5 is out of range on chip '$sim0'"
+ status_is 1
+}
+
+@test "gpiowatch: with custom format (event type + offset)" {
+ gpiosim_chip sim0 num_lines=8
+
+ local sim0=${GPIOSIM_CHIP_NAME[sim0]}
+
+ dut_run gpiowatch --banner --event=requested "--format=%e %o" -c $sim0 4
+ dut_flush
+
+ request_release_line $sim0 4
+ dut_read
+ output_is "1 4"
+}
+
+@test "gpiowatch: with custom format (event type + offset joined)" {
+ gpiosim_chip sim0 num_lines=8
+
+ local sim0=${GPIOSIM_CHIP_NAME[sim0]}
+
+ dut_run gpiowatch --banner --event=requested "--format=%e%o" -c $sim0 4
+ dut_flush
+
+ request_release_line $sim0 4
+ dut_read
+ output_is "14"
+}
+
+@test "gpiowatch: with custom format (event, chip and line)" {
+ gpiosim_chip sim0 num_lines=8 line_name=4:baz
+
+ local sim0=${GPIOSIM_CHIP_NAME[sim0]}
+
+ dut_run gpiowatch --banner --event=released \
+ "--format=%e %o %E %c %l" -c $sim0 baz
+ dut_flush
+
+ request_release_line $sim0 4
+ dut_regex_match "2 4 released $sim0 baz"
+}
+
+@test "gpiowatch: with custom format (seconds timestamp)" {
+ gpiosim_chip sim0 num_lines=8
+
+ local sim0=${GPIOSIM_CHIP_NAME[sim0]}
+
+ dut_run gpiowatch --banner --event=requested "--format=%e %o %S" \
+ -c $sim0 4
+ dut_flush
+
+ request_release_line $sim0 4
+ dut_regex_match "1 4 [0-9]+\\.[0-9]+"
+}
+
+@test "gpiowatch: with custom format (UTC timestamp)" {
+ gpiosim_chip sim0 num_lines=8
+
+ local sim0=${GPIOSIM_CHIP_NAME[sim0]}
+
+ dut_run gpiowatch --banner --event=released \
+ "--format=%U %e %o" -c $sim0 4
+ dut_flush
+
+ request_release_line $sim0 4
+ dut_regex_match \
+"[0-9][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9]T[0-2][0-9]:[0-5][0-9]:[0-5][0-9]\\.[0-9]+Z 2 4"
+}
+
+@test "gpiowatch: with custom format (localtime timestamp)" {
+ gpiosim_chip sim0 num_lines=8
+
+ local sim0=${GPIOSIM_CHIP_NAME[sim0]}
+
+ dut_run gpiowatch --banner --event=released \
+ "--format=%L %e %o" -c $sim0 4
+ dut_flush
+
+ request_release_line $sim0 4
+ dut_regex_match \
+"[0-9][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9]T[0-2][0-9]:[0-5][0-9]:[0-5][0-9]\\.[0-9]+ 2 4"
+}
+
+@test "gpiowatch: with custom format (double percent sign)" {
+ gpiosim_chip sim0 num_lines=8
+
+ local sim0=${GPIOSIM_CHIP_NAME[sim0]}
+
+ dut_run gpiowatch --banner --event=requested "--format=start%%end" \
+ -c $sim0 4
+ dut_flush
+
+ request_release_line $sim0 4
+ dut_read
+ output_is "start%end"
+}
+
+@test "gpiowatch: with custom format (double percent sign + event type specifier)" {
+ gpiosim_chip sim0 num_lines=8
+
+ local sim0=${GPIOSIM_CHIP_NAME[sim0]}
+
+ dut_run gpiowatch --banner --event=requested "--format=%%e" -c $sim0 4
+ dut_flush
+
+ request_release_line $sim0 4
+ dut_read
+ output_is "%e"
+}
+
+@test "gpiowatch: with custom format (single percent sign)" {
+ gpiosim_chip sim0 num_lines=8
+
+ local sim0=${GPIOSIM_CHIP_NAME[sim0]}
+
+ dut_run gpiowatch --banner --event=requested "--format=%" -c $sim0 4
+ dut_flush
+
+ request_release_line $sim0 4
+ dut_read
+ output_is "%"
+}
+
+@test "gpiowatch: with custom format (single percent sign between other characters)" {
+ gpiosim_chip sim0 num_lines=8
+
+ local sim0=${GPIOSIM_CHIP_NAME[sim0]}
+
+ dut_run gpiowatch --banner --event=requested "--format=foo % bar" -c $sim0 4
+ dut_flush
+
+ request_release_line $sim0 4
+ dut_read
+ output_is "foo % bar"
+}
+
+@test "gpiowatch: with custom format (unknown specifier)" {
+ gpiosim_chip sim0 num_lines=8
+
+ local sim0=${GPIOSIM_CHIP_NAME[sim0]}
+
+ dut_run gpiowatch --banner --event=requested "--format=%x" -c $sim0 4
+ dut_flush
+
+ request_release_line $sim0 4
+ dut_read
+ output_is "%x"
+}
--
2.38.0
prev parent reply other threads:[~2022-10-11 0:30 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-10-11 0:29 [libgpiod v2][PATCH v3 0/5] tools: improvements for v2 Kent Gibson
2022-10-11 0:29 ` [libgpiod v2][PATCH v3 1/5] tools: remove old code to simplify review Kent Gibson
2022-10-11 0:29 ` [libgpiod v2][PATCH v3 2/5] tools: line name focussed rework Kent Gibson
2022-11-08 13:13 ` Bartosz Golaszewski
2022-11-08 15:33 ` Kent Gibson
2022-11-08 18:25 ` Bartosz Golaszewski
2022-11-09 2:00 ` Kent Gibson
2022-11-09 11:16 ` Bartosz Golaszewski
2022-11-09 11:40 ` Kent Gibson
2022-10-11 0:29 ` [libgpiod v2][PATCH v3 3/5] tools: tests for " Kent Gibson
2022-10-11 0:29 ` [libgpiod v2][PATCH v3 4/5] tools: add gpiowatch Kent Gibson
2022-11-08 15:00 ` Bartosz Golaszewski
2022-11-08 15:38 ` Kent Gibson
2022-11-08 18:04 ` Bartosz Golaszewski
2022-11-09 1:57 ` Kent Gibson
2022-10-11 0:29 ` Kent Gibson [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=20221011002909.26987-6-warthog618@gmail.com \
--to=warthog618@gmail.com \
--cc=brgl@bgdev.pl \
--cc=linux-gpio@vger.kernel.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).