wolfssh/apps/wolfsshd/test
John Safranek 960e63cba0 wolfsshd: refuse a config line that does not fit
ConfigLoad() reports a line too long for its buffer and fails the load.
A cut line used to take effect with whatever fitted, since what is left
of it is read as a line of its own and a leftover of two bytes or less
is skipped as blank. The buffer is 1024 bytes now, so a long path or
forced command still loads.

- one byte is read past a full buffer, so a line that ends exactly
  there, at a newline or the end of the file, is not taken for a cut one
- the size is WOLFSSHD_MAX_LINE_SIZE in configuration.h, shared with
  the test
- test_configuration covers a long line, lines that exactly fill the
  buffer, and a line cut to leave a blank-looking remainder

Issue: ZD-22623
2026-10-30 13:51:24 -05:00
..
README.md tests: report the sshd suite's pass count 2026-10-14 15:52:44 -05:00
create_authorized_test_file.sh tests: chmod the sshd authorized_keys at creation 2026-10-14 15:52:44 -05:00
create_sshd_config.sh wolfsshd: scope a test run's ports and daemons 2026-09-17 15:04:26 +02:00
error_return.sh
…
port_lease.sh wolfsshd: lease a port block to one run only 2026-09-17 15:04:26 +02:00
run_all_sshd_tests.sh wolfsshd: exec the login shell path whole 2026-10-28 13:10:29 -05:00
ssh_kex_algos.sh
…
sshd_bad_sftp_test.sh
…
sshd_bad_subsystem_test.sh
…
sshd_channel_close_test.sh wolfsshd: bound the shell child reap and flush the held backlog 2026-10-09 10:30:29 -07:00
sshd_chroot_fail_test.sh tests: cover the sshd chroot skip-after-failure 2026-10-14 15:52:44 -05:00
sshd_chroot_preload.c tests: cover the sshd chroot skip-after-failure 2026-10-14 15:52:44 -05:00
sshd_dash_d_test.ps1
…
sshd_empty_password_test.sh
…
sshd_exec_test.sh
…
sshd_exit_status_test.sh wolfsshd: exit non-zero when startup fails 2026-10-26 17:21:29 -07:00
sshd_forcedcmd_test.sh wolfsshd: apply ForceCommand to SFTP and SCP 2026-10-30 13:51:24 -05:00
sshd_fork_fail_test.sh wolfsshd: keep accepting after a failed fork 2026-10-26 17:21:29 -07:00
sshd_fork_preload.c wolfsshd: keep accepting after a failed fork 2026-10-26 17:21:29 -07:00
sshd_large_sftp_test.sh wolfsshd: name the large SFTP files per run 2026-09-17 15:04:26 +02:00
sshd_login_grace_test.ps1
…
sshd_login_grace_test.sh
…
sshd_long_shell_test.sh wolfsshd: exec the login shell path whole 2026-10-28 13:10:29 -05:00
sshd_match_overlap_test.sh
…
sshd_mldsa_composite_test.sh
…
sshd_ossh_cert_test.sh wolfsshd: apply ForceCommand to SFTP and SCP 2026-10-30 13:51:24 -05:00
sshd_permitroot_forced_cmd.sh
…
sshd_permitroot_prohibit_password.sh
…
sshd_permitroot_test.sh
…
sshd_port_lease_test.sh wolfsshd: test the port block allocator 2026-09-17 15:04:26 +02:00
sshd_privdrop_fail_test.sh wolfsshd: tighten the run registry and ports 2026-09-17 15:04:26 +02:00
sshd_privdrop_preload.c
…
sshd_pubkey_reject_test.sh tests: drive the sshd pubkey rejection path 2026-10-14 15:52:44 -05:00
sshd_scp_fail.sh
…
sshd_sftp_idle_cpu_test.sh
…
sshd_stderr_drain_test.sh wolfsshd: test that a pty session ends on exit 2026-10-19 21:28:13 -05:00
sshd_stderr_eof_test.sh wolfsshd: give the stderr EOF test a temp dir 2026-09-22 11:07:39 -05:00
sshd_stdin_eof_test.sh
…
sshd_stdin_stall_test.sh
…
sshd_term_close_test.sh tests: poll for the settled state on term close 2026-10-14 15:52:44 -05:00
sshd_term_size_test.sh wolfsshd: name the tmux session per test run 2026-09-17 15:04:26 +02:00
sshd_window_full_test.sh
…
sshd_x509_test.sh
…
sshd_x509_upn_fail.sh
…
start_sshd.sh wolfsshd: keep the registry when grep fails 2026-09-17 15:04:26 +02:00
test_configuration.c wolfsshd: refuse a config line that does not fit 2026-10-30 13:51:24 -05:00
wolfssh_options.sh
…

README.md

wolfSSHd Tests

These are separate from the tests in scripts directory because of the need for 'sudo' when starting up an SSHd server to test against.

Directory Permissions

wolfSSHd's StrictModes check refuses to read an authorized_keys file if any directory above it is group or world writable. A tree unpacked or cloned under a umask of 002, the default where each user has their own group, has mode 0775 directories, so no test can authenticate and the suite fails from the first test. run_all_sshd_tests.sh checks for this before it starts a daemon and names the offending directories; clear the bits with chmod g-w,o-w on each, or create the tree under umask 022.

Running Tests

To run all tests do:

$ cd apps/wolfsshd/test/

$ sudo ./run_all_sshd_tests.sh <user>
Running all wolfSSHd tests
Starting up local wolfSSHd for tests on 127.0.0.1:22222
SSHD running on PID 7979
sshd_exec_test.sh ... PASSED
Shutting down test wolfSSHd
Stopping SSHD, killing pid 7979
All tests ran, 1 run, 1 passed, 0 skipped

"run" counts every test reached, skips included. Passed plus skipped must equal run; the runner fails if they do not.

To run a specific test do:

startup wolfSSHd

$ cd ./apps/wolfsshd

$ sudo ./wolfsshd -D -d -f ./test/sshd_config_test
[PID 8049]: [SSHD] parsing config file ./test/sshd_config_test
[PID 8049]: [SSHD] Setting login grace time to 600
[PID 8049]: [SSHD] Turning off privilege separation!
[PID 8049]: [SSHD] Starting wolfSSH SSHD application
[PID 8049]: Entering wolfSSH_CTX_new()
[PID 8049]: Entering CtxInit()
[PID 8049]: Leaving wolfSSH_CTX_new(), ctx = 0x5574747f3520
[PID 8049]: Entering wolfSSH_CTX_SetBanner()
[PID 8049]:   setting banner to: "wolfSSHD
"
...
...
...

point the test to the host/port if needed

$ cd ./apps/wolfsshd/test

$ ./sshd_exec_test.sh 127.0.0.1 22222

Adding Tests

New tests should be added to a new .sh file if not related to any of the existing tests. The test should then be called from run_all_sshd_tests.sh once added, for example:

run_test "new_test.sh"

This would be added before the call to stop the SSHd server stop_wolfsshd and after the test files have been setup:

 48 # setup
 49 set -e
 50 ./create_authorized_test_file.sh
 51 ./create_sshd_config.sh
 52 set +e

The name also has to be listed in one of the two arrays at the top of run_all_sshd_tests.sh, or the run aborts with an error naming it. Use test_cases if the test runs against the shared daemon, in which case the loop over that array calls it and nothing else is needed. Use extra_test_cases if the test needs setup of its own -- a different daemon config, its own daemon, or the shared daemon stopped first -- and keep the run_test call where that setup happens. Both arrays drive --match and --exclude, so a test that is missing from them cannot be selected or skipped from the command line.

A test that can only run against a daemon the runner starts itself is skipped when --host and --port point at an external one. Pass its name to skip_local_only on that path, or add it to local_sshd_tests if it belongs in that block, so the external run still counts it as skipped.

Selecting Tests

--match <name> runs a single test and --exclude <name> drops one from a full run. Both take any name from the list the runner prints when it is given a name or an option it does not recognize, and an unrecognized name is an error rather than a silent no-op. --match runs the test where it sits in the suite, with the daemon it needs set up around it.