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 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.