This is an automated email from Gerrit. "Evgeniy Naydanov <evgeniy.nayda...@syntacore.com>" just uploaded a new patch set to Gerrit, which you can find at https://review.openocd.org/c/openocd/+/8644
-- gerrit commit f625d363b5d85571aa2ea80a913e77ba0cd3176a Author: Evgeniy Naydanov <evgeniy.nayda...@syntacore.com> Date: Fri Nov 29 17:44:50 2024 +0300 testing/tcl_commands: test `target create`, `cget`, `configure` Introduce basic testing of error-handling in target configuration related commands. The tests can be run via `make check` when JTAG `dummy` adapter is enabled. Change-Id: Id0f382046dd70007d8e696d82d2396a7ccab7a33 Signed-off-by: Evgeniy Naydanov <evgeniy.nayda...@syntacore.com> diff --git a/Makefile.am b/Makefile.am index 155a2b3bb7..f22d36d3d3 100644 --- a/Makefile.am +++ b/Makefile.am @@ -10,7 +10,7 @@ AUTOMAKE_OPTIONS = gnu 1.6 DISTCHECK_CONFIGURE_FLAGS = --disable-install-jim # do not run Jim Tcl tests (esp. during distcheck) -check-recursive: SUBDIRS := +check-recursive: SUBDIRS := $(SUBDIRS:jimtcl=) nobase_dist_pkgdata_DATA = \ contrib/libdcc/dcc_stdio.c \ @@ -36,6 +36,9 @@ EXTRA_DIST += jimtcl/configure.gnu DISTCLEANFILES += jimtcl/jsmn/jsmn.o endif +SUBDIRS += testing +DIST_SUBDIRS += testing + # common flags used in openocd build AM_CFLAGS = $(GCC_WARNINGS) AM_LDFLAGS = diff --git a/configure.ac b/configure.ac index 567152b0a6..6b95311d4f 100644 --- a/configure.ac +++ b/configure.ac @@ -857,7 +857,8 @@ AS_IF([test "x$gcc_warnings" = "xyes"], [ AC_SUBST(EXTRA_DIST_NEWS, ["$(echo $srcdir/NEWS-*)"]) AC_CONFIG_FILES([ - Makefile + Makefile \ + testing/Makefile ]) AC_OUTPUT diff --git a/testing/Makefile.am b/testing/Makefile.am new file mode 100644 index 0000000000..42972bed5a --- /dev/null +++ b/testing/Makefile.am @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: GPL-2.0-or-later + +TESTS = + +include tcl_commands/Makefile.am diff --git a/testing/tcl_commands/Makefile.am b/testing/tcl_commands/Makefile.am new file mode 100644 index 0000000000..80e0a6c625 --- /dev/null +++ b/testing/tcl_commands/Makefile.am @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: GPL-2.0-or-later + +if DUMMY +TESTS += \ + %D%/test-target-create-command.cfg \ + %D%/test-target-configure-cget-command.cfg +endif + +TEST_EXTENSIONS = .cfg +CFG_LOG_COMPILER = $(top_builddir)/src/openocd +AM_CFG_LOG_FLAGS = -f $(abs_srcdir)/%D%/utils.tcl -f diff --git a/testing/tcl_commands/test-target-configure-cget-command.cfg b/testing/tcl_commands/test-target-configure-cget-command.cfg new file mode 100644 index 0000000000..09bd3037f3 --- /dev/null +++ b/testing/tcl_commands/test-target-configure-cget-command.cfg @@ -0,0 +1,30 @@ +namespace import testing_helpers::* +namespace import configure_testing::* + +adapter driver dummy +jtag newtap tap cpu -irlen 5 + +{*}[target_create_first_args] {*}[simple_configure_options] + +set target_name [lindex [target names] 0] + +check_matches testee {$target_name cget -type} + +foreach {opt arg} [simple_configure_options] { + check_error_matches ".*$opt.*" {$target_name cget $opt extra_arg} + check_matches [dict get [simple_configure_options] $opt] \ + {$target_name cget $opt} +} + +check_error_matches [opt_arg_re -event] {$target_name cget -event} +$target_name cget -event examine-start +check_error_matches {.*-event examine-start.*} \ + {$target_name cget -event examine-start extra_arg} + +check_error_matches ".*configure.*" {$target_name configure} + +foreach {opt arg} [simple_configure_options] { + $target_name configure $opt [$target_name cget $opt] +} + +shutdown diff --git a/testing/tcl_commands/test-target-create-command.cfg b/testing/tcl_commands/test-target-create-command.cfg new file mode 100644 index 0000000000..98a36ef707 --- /dev/null +++ b/testing/tcl_commands/test-target-create-command.cfg @@ -0,0 +1,47 @@ +namespace import testing_helpers::* +namespace import configure_testing::* + +adapter driver dummy +jtag newtap tap cpu -irlen 5 + +check_error_matches {.*target create.*} {target create} +check_error_matches {.*target create.*} {target create test.target} +check_error_matches {.*target create.*} {target create test.target testee} + +{*}[target_create_first_args] {*}[simple_configure_options] + +foreach {opt arg} [simple_configure_options] { + check_error_matches [opt_arg_re $opt] {{*}[target_create_first_args] $opt} +} + +foreach {opt1 arg1} [simple_configure_options] { + foreach {opt2 arg2} [simple_configure_options] { + check_error_matches [opt_arg_re $opt2] \ + {{*}[target_create_first_args] $opt1 $arg1 $opt2} + check_error_matches {} \ + {{*}[target_create_first_args] $opt1 $opt2 $arg2} + } +} + +check_error_matches ".*-type.*" \ + {{*}[target_create_first_args] -type} + +check_error_matches ".*-type.*" \ + {{*}[target_create_first_args] {*}[simple_configure_options] -type} + +check_error_matches {.*-event [^ ]+ .*} \ + {{*}[target_create_first_args] -event} + +check_error_matches {.*not-an-event.*} \ + {{*}[target_create_first_args] -event not-an-event} + +check_error_matches {.*-event examine-start [^ ]+.*} \ + {{*}[target_create_first_args] -event examine-start} + +{*}[target_create_first_args] {*}[simple_configure_options] -event examine-start body +{*}[target_create_first_args] {*}[simple_configure_options] -event examine-start body -event examine-end another-body -event examine-start new-body +{*}[target_create_first_args] -event examine-start body {*}[simple_configure_options] + +#-defer-examine + +shutdown diff --git a/testing/tcl_commands/utils.tcl b/testing/tcl_commands/utils.tcl new file mode 100644 index 0000000000..72f4bca19c --- /dev/null +++ b/testing/tcl_commands/utils.tcl @@ -0,0 +1,83 @@ +# SPDX-License-Identifier: GPL-2.0-or-later + +namespace eval testing_helpers { + + proc test_failure message { + echo $message + shutdown error + } + + proc check_for_error {expctd_code msg_ptrn script} { + set code [catch {uplevel 1 $script} msg] + if {!$code} { + test_failure \ + "'$script' finished successfully. \ + Was expecting an error." + } + if {$expctd_code ne "" && $code != $expctd_code} { + test_failure \ + "'$script' returned unexpected error code $code. \ + Was expecting $expctd_code. Error message: '$msg'" + } + if {$msg_ptrn ne "" && ![regexp $msg_ptrn $msg]} { + test_failure \ + "'$script' returned unexpected error message '$msg'. \ + Was expecting '$msg_ptrn'. Error code: $code" + } + } + + proc check_error_matches {pattern script} { + tailcall check_for_error {} $pattern $script + } + + proc check_matches {pattern script} { + set result [uplevel $script] + if {[regexp $pattern $result]} {return} + test_failure \ + "'$script' produced unexpected result '$result'. \ + Was expecting '$pattern'." + } + + namespace export check_error_matches check_matches +} + +namespace eval configure_testing { + + variable target_idx 0 + + proc unique_tgt_name {} { + variable target_idx + incr target_idx + return test_target$target_idx + } + + proc target_create_first_args {} { + return "target create [unique_tgt_name] testee" + } + + proc arg_re {} { + return {[^ ]+} + } + + proc opt_arg_re opt { + return ".*$opt [arg_re].*" + } + + proc simple_configure_options {} { + return { + -work-area-virt 0 + -work-area-phys 0 + -work-area-size 1 + -work-area-backup 0 + -endian little + -coreid 1 + -chain-position tap.cpu + -dbgbase 0 + -rtos hwthread + -gdb-port 0 + -gdb-max-connections 1 + } + } + + namespace export target_create_first_args opt_arg_re simple_configure_options +} --