]> git.ipfire.org Git - thirdparty/rsync.git/commit
testsuite: rewrite the shell testsuite in Python
authorAndrew Tridgell <andrew@tridgell.net>
Thu, 21 May 2026 01:47:34 +0000 (11:47 +1000)
committerAndrew Tridgell <andrew@tridgell.net>
Fri, 22 May 2026 04:34:52 +0000 (14:34 +1000)
commit1f689ec0c21b7c2eaa9add1958d2c7ed280aac3e
treebd88f4b7a0139898e807861347b7816465fd9584
parent88393140250b491463bf52900abb6c7bac5ee154
testsuite: rewrite the shell testsuite in Python

Replace the entire shell-based testsuite with Python. runtests.py
already drove the suite (it had replaced runtests.sh earlier); this
converts all 60 test scripts from *.test shell to *_test.py and adds
testsuite/rsyncfns.py as the shared helper module -- the Python
counterpart of the now-removed rsync.fns.

runtests.py:
  * Discovers and runs both *.test and *_test.py; dispatches the
    Python tests via the same python3 that runs the harness.
  * Extends PYTHONPATH so tests can `import rsyncfns`.

testsuite/rsyncfns.py provides everything the ports need:
  * environment wiring (scratchdir / srcdir / TOOLDIR / RSYNC /
    TLS_ARGS, and HOME pointed at the per-test scratch dir);
  * result reporting -- test_fail / test_skipped / test_xfail mapping
    to the 0 / 1 / 77 / 78 exit-code convention;
  * the transfer-and-verify helpers checkit, checkdiff, verify_dirs,
    rsync_ls_lR, check_perms and the v_filt output filter;
  * fixture builders hands_setup, build_symlinks, build_rsyncd_conf,
    make_data_file, cp_p / cp_touch, makepath / rmtree.

All 60 tests are converted, including the four split-variant tests
that share one source via a Makefile-built symlink (chown/chown-fake,
devices/devices-fake, xattrs/xattrs-hlink, exclude/exclude-lsh);
Makefile.in's CHECK_SYMLINKS now points at the *_test.py names.

The dead rsync.fns shell library is removed.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
117 files changed:
Makefile.in
runtests.py
testsuite/00-hello.test [deleted file]
testsuite/00-hello_test.py [new file with mode: 0644]
testsuite/acls-default.test [deleted file]
testsuite/acls-default_test.py [new file with mode: 0644]
testsuite/acls.test [deleted file]
testsuite/acls_test.py [new file with mode: 0644]
testsuite/alt-dest-symlink-race.test [deleted file]
testsuite/alt-dest-symlink-race_test.py [new file with mode: 0644]
testsuite/alt-dest.test [deleted file]
testsuite/alt-dest_test.py [new file with mode: 0644]
testsuite/atimes.test [deleted file]
testsuite/atimes_test.py [new file with mode: 0644]
testsuite/backup.test [deleted file]
testsuite/backup_test.py [new file with mode: 0644]
testsuite/bare-do-open-symlink-race.test [deleted file]
testsuite/bare-do-open-symlink-race_test.py [new file with mode: 0644]
testsuite/batch-mode.test [deleted file]
testsuite/batch-mode_test.py [new file with mode: 0644]
testsuite/chdir-symlink-race.test [deleted file]
testsuite/chdir-symlink-race_test.py [new file with mode: 0644]
testsuite/chgrp.test [deleted file]
testsuite/chgrp_test.py [new file with mode: 0644]
testsuite/chmod-option.test [deleted file]
testsuite/chmod-option_test.py [new file with mode: 0644]
testsuite/chmod-symlink-race.test [deleted file]
testsuite/chmod-symlink-race_test.py [new file with mode: 0644]
testsuite/chmod-temp-dir.test [deleted file]
testsuite/chmod-temp-dir_test.py [new file with mode: 0644]
testsuite/chmod.test [deleted file]
testsuite/chmod_test.py [new file with mode: 0644]
testsuite/chown.test [deleted file]
testsuite/chown_test.py [new file with mode: 0644]
testsuite/clean-fname-underflow.test [deleted file]
testsuite/clean-fname-underflow_test.py [new file with mode: 0644]
testsuite/copy-dest-source-symlink.test [deleted file]
testsuite/copy-dest-source-symlink_test.py [new file with mode: 0644]
testsuite/crtimes.test [deleted file]
testsuite/crtimes_test.py [new file with mode: 0644]
testsuite/daemon-chroot-acl.test [deleted file]
testsuite/daemon-chroot-acl_test.py [new file with mode: 0644]
testsuite/daemon-gzip-download.test [deleted file]
testsuite/daemon-gzip-download_test.py [new file with mode: 0644]
testsuite/daemon-gzip-upload.test [deleted file]
testsuite/daemon-gzip-upload_test.py [new file with mode: 0644]
testsuite/daemon-refuse-compress.test [deleted file]
testsuite/daemon-refuse-compress_test.py [new file with mode: 0644]
testsuite/daemon.test [deleted file]
testsuite/daemon_test.py [new file with mode: 0644]
testsuite/delay-updates.test [deleted file]
testsuite/delay-updates_test.py [new file with mode: 0644]
testsuite/delete.test [deleted file]
testsuite/delete_test.py [new file with mode: 0644]
testsuite/devices.test [deleted file]
testsuite/devices_test.py [new file with mode: 0644]
testsuite/dir-sgid.test [deleted file]
testsuite/dir-sgid_test.py [new file with mode: 0644]
testsuite/duplicates.test [deleted file]
testsuite/duplicates_test.py [new file with mode: 0644]
testsuite/exclude-lsh.test [deleted symlink]
testsuite/exclude.test [deleted file]
testsuite/exclude_test.py [new file with mode: 0644]
testsuite/executability.test [deleted file]
testsuite/executability_test.py [new file with mode: 0644]
testsuite/files-from.test [deleted file]
testsuite/files-from_test.py [new file with mode: 0644]
testsuite/fuzzy.test [deleted file]
testsuite/fuzzy_test.py [new file with mode: 0644]
testsuite/hands.test [deleted file]
testsuite/hands_test.py [new file with mode: 0644]
testsuite/hardlinks.test [deleted file]
testsuite/hardlinks_test.py [new file with mode: 0644]
testsuite/itemize.test [deleted file]
testsuite/itemize_test.py [new file with mode: 0644]
testsuite/longdir.test [deleted file]
testsuite/longdir_test.py [new file with mode: 0644]
testsuite/merge.test [deleted file]
testsuite/merge_test.py [new file with mode: 0644]
testsuite/missing.test [deleted file]
testsuite/missing_test.py [new file with mode: 0644]
testsuite/mkpath.test [deleted file]
testsuite/mkpath_test.py [new file with mode: 0644]
testsuite/open-noatime.test [deleted file]
testsuite/open-noatime_test.py [new file with mode: 0644]
testsuite/protected-regular.test [deleted file]
testsuite/protected-regular_test.py [new file with mode: 0644]
testsuite/proxy-response-line-too-long.test [deleted file]
testsuite/proxy-response-line-too-long_test.py [new file with mode: 0644]
testsuite/relative.test [deleted file]
testsuite/relative_test.py [new file with mode: 0644]
testsuite/rsync.fns [deleted file]
testsuite/rsyncfns.py [new file with mode: 0644]
testsuite/safe-links.test [deleted file]
testsuite/safe-links_test.py [new file with mode: 0644]
testsuite/secure-relpath-validation.test [deleted file]
testsuite/secure-relpath-validation_test.py [new file with mode: 0644]
testsuite/sender-flist-symlink-leak.test [deleted file]
testsuite/sender-flist-symlink-leak_test.py [new file with mode: 0644]
testsuite/simd-checksum.test [deleted file]
testsuite/simd-checksum_test.py [new file with mode: 0644]
testsuite/ssh-basic.test [deleted file]
testsuite/ssh-basic_test.py [new file with mode: 0644]
testsuite/symlink-dirlink-basis.test [deleted file]
testsuite/symlink-dirlink-basis_test.py [new file with mode: 0644]
testsuite/symlink-ignore.test [deleted file]
testsuite/symlink-ignore_test.py [new file with mode: 0644]
testsuite/trimslash.test [deleted file]
testsuite/trimslash_test.py [new file with mode: 0644]
testsuite/unsafe-byname.test [deleted file]
testsuite/unsafe-byname_test.py [new file with mode: 0644]
testsuite/unsafe-links.test [deleted file]
testsuite/unsafe-links_test.py [new file with mode: 0644]
testsuite/wildmatch.test [deleted file]
testsuite/wildmatch_test.py [new file with mode: 0644]
testsuite/xattrs.test [deleted file]
testsuite/xattrs_test.py [new file with mode: 0644]