test: fix Windows CI failures in wallet_multiwallet and old binary tests (ancient wallets) #34233

pull w0xlt wants to merge 2 commits into bitcoin:master from w0xlt:ascii-only-tmpdir changing 3 files +43 −19
  1. w0xlt commented at 3:17 pm on January 8, 2026: contributor

    Currently, the wallet_multiwallet.py and feature_unsupported_utxo_db.py functional tests are disabled on CI because they rely on legacy wallet binaries that do not correctly handle Unicode paths.

    This is tracked as a TODO in .github/workflows/ci.yml. The limitation also blocks efforts to expand ancient wallet test coverage (e.g. bitcoin/bitcoin#33186).

    This PR restores functional test coverage on Windows CI by addressing two root causes:

    1. Skip Windows-incompatible tests in wallet_multiwallet: Several test cases depend on Unix-specific filesystem behavior that is not supported on Windows:

      • Directory permission tests using chmod (Windows ignores os.chmod(path, 0))
      • Recursive directory symlink tests (unsupported by listwalletdir)
      • File symlink detection tests (Windows handles file symlinks differently)
    2. Use ASCII-only tmpdir for old binary tests: When running tests against previous releases (feature_unsupported_utxo_db, wallet_multiwallet) on Windows, an ASCII-only temporary directory name (test_runner_btc_run_) is used instead of test_runner_₿_🏃_. This avoids failures caused by older binaries lacking proper Unicode path support.

  2. DrahtBot added the label Tests on Jan 8, 2026
  3. DrahtBot commented at 3:17 pm on January 8, 2026: contributor

    The following sections might be updated with supplementary metadata relevant to reviewers and maintainers.

    Code Coverage & Benchmarks

    For details see: https://corecheck.dev/bitcoin/bitcoin/pulls/34233.

    Reviews

    See the guideline for information on the review process. A summary of reviews will appear here.

    Conflicts

    Reviewers, this pull request conflicts with the following ones:

    • #34168 (qa: Require --exclude for each excluded test by hebasto)
    • #31410 (qa: Fix wallet_multiwallet.py by hebasto)
    • #19461 (multiprocess: Add bitcoin-gui -ipcconnect option by ryanofsky)
    • #19460 (multiprocess: Add bitcoin-wallet -ipcconnect option by ryanofsky)
    • #10102 (Multiprocess bitcoin by ryanofsky)

    If you consider this pull request important, please also help to review the conflicting pull requests. Ideally, start with the one that should be merged first.

  4. in test/functional/test_runner.py:546 in dc3f95883d
    539@@ -547,6 +540,19 @@ def remove_tests(exclude_list):
    540         subprocess.check_call([sys.executable, os.path.join(config["environment"]["SRCDIR"], 'test', 'functional', test_list[0].split()[0]), '-h'])
    541         sys.exit(0)
    542 
    543+    # Create base test directory
    544+    # Use ASCII-only path when running tests with old binaries (e.g. v0.14.3) that
    545+    # don't handle Unicode on Windows. Only affects runs that include such tests.
    546+    old_binary_tests = ('feature_unsupported_utxo_db', 'wallet_multiwallet')
    


    maflcko commented at 3:46 pm on January 8, 2026:
    I fail to see where wallet_multiwallet loads an old 14.3 binary (or any old binary), so this comment seems to be wrong.

    w0xlt commented at 8:30 pm on January 8, 2026:
    Fixed. Thanks.

    maflcko commented at 9:00 pm on January 8, 2026:

    Well, this is still globally disabling unicode tests on Windows, just to run a single edge-case test feature_unsupported_utxo_db.py. I’d say unicode tests are more important than this test, and this test could trivially be run sequentially after the other tests, if there was need to.

    It seems a bit invasive to change the test framework to work around a single prev-releases test on a single platform.

    My preference would be to leave this as-is for now, and either leave the test excluded, or just run it sequentially with a tmpdir overridden for just this test.


    w0xlt commented at 9:57 pm on January 8, 2026:
    Updated test_runner.py to use an ASCII-only tmpdir path specifically for feature_unsupported_utxo_db.py on Windows. Everything else remains unchanged.

    w0xlt commented at 10:00 pm on January 8, 2026:
    I mean, there’s no change to the Unicode path. The PR still adds both feature_unsupported_utxo_db.py and wallet_multiwallet.py to CI.
  5. DrahtBot added the label CI failed on Jan 8, 2026
  6. test: skip Windows-incompatible tests in wallet_multiwallet
    Skip several tests that don't work correctly on Windows:
    
    1. chmod-based no_access test: Windows does not support Unix-style
       file permissions via os.chmod(). Setting chmod(path, 0) doesn't
       actually make the directory inaccessible.
    
    2. recursive_dir_symlink test: Skip recursive directory symlink test
       on Windows as directory symlinks behave differently.
    
    3. w8_symlink test: File symlinks behave differently on Windows and
       don't trigger the expected "Invalid -wallet path" error.
    
    4. Error message check: Use "filesystem error:" for all platforms
       since the cross-compiled MinGW build produces the same error
       format as Linux/macOS.
    a3e08a7536
  7. w0xlt force-pushed on Jan 8, 2026
  8. test: use ASCII-only tmpdir path for feature_unsupported_utxo_db on Windows
    On Windows, use an ASCII-only tmpdir path specifically for
    feature_unsupported_utxo_db.py, which uses old v0.14.3 binaries that
    don't handle Unicode paths properly. All other tests continue to use
    the Unicode path (test_runner_₿_🏃_) to preserve Unicode path testing.
    548a51a5d2
  9. DrahtBot removed the label CI failed on Jan 8, 2026
  10. w0xlt force-pushed on Jan 8, 2026
  11. fanquake commented at 9:59 am on January 9, 2026: member
    Note that re-enabling wallet_multiwallet was also attempted in #31410, but progress there seemed to stall.
  12. in test/functional/test_runner.py:763 in 548a51a5d2
    756@@ -757,7 +757,13 @@ def get_next(self):
    757             log_stdout = tempfile.SpooledTemporaryFile(max_size=2**16)
    758             log_stderr = tempfile.SpooledTemporaryFile(max_size=2**16)
    759             test_argv = test.split()
    760-            testdir = "{}/{}_{}".format(self.tmpdir, re.sub(".py$", "", test_argv[0]), portseed)
    761+            # On Windows, use ASCII-only path for tests that use old binaries (e.g. v0.14.3)
    762+            # which don't handle Unicode paths properly.
    763+            if platform.system() == 'Windows' and test_argv[0] == 'feature_unsupported_utxo_db.py':
    764+                ascii_tmpdir = "{}/test_runner_ascii_{}".format(tempfile.gettempdir(), datetime.datetime.now().strftime("%Y%m%d_%H%M%S"))
    


    maflcko commented at 3:47 pm on January 9, 2026:

    This will now silently (and without any way to change it), pick a different tmpdirprefix.

    I understand that this only happens on Windows, and only for a single test, and only when the previous releases have been downloaded.

    However, this feels a bit like a layer violation, and all of this temporary code will have to be maintained and removed later on.

    I’ve implemented my alternative in https://www.github.com/bitcoin/bitcoin/pull/34240/changes/671303af2e2bad2bda992ad783654d06c3a1d36e


    hebasto commented at 4:10 pm on January 9, 2026:
    I agree with this assessment. We can move forward with #34240.
  13. w0xlt commented at 4:14 pm on January 9, 2026: contributor
  14. w0xlt closed this on Jan 9, 2026

  15. w0xlt deleted the branch on Jan 9, 2026
  16. hebasto commented at 4:18 pm on January 9, 2026: member

    @w0xlt

    Closing it in favor of #34240

    The #34240 only addresses an issue with feature_unsupported_utxo_db.py. Why closing this PR with the rest of your patch?

  17. maflcko commented at 4:26 pm on January 9, 2026: member

    Yeah, I haven’t looked at the other commit, but it may be fine.

    Seems fine to re-open this and put in draft for now. Once it conflicts with master, you can just rebase it, and move it out of draft again.


github-metadata-mirror

This is a metadata mirror of the GitHub repository bitcoin/bitcoin. This site is not affiliated with GitHub. Content is generated from a GitHub metadata backup.
generated: 2026-01-12 00:13 UTC

This site is hosted by @0xB10C
More mirrored repositories can be found on mirror.b10c.me