Files
kdmukai f04675e4a3 Narrow bare p2sh candidacy to what the rebuild cannot decide
The nested single sig outlier in change candidacy also required the
output's one derivation path entry to claim this seed's fingerprint.
That kept an output paying our key under another seed's key and
fingerprint out of the rebuild, so it was shown as a spend to the
user's own address, while the same output with its redeem script
present is refused as a contradiction. The rebuild derives our key at
the entry's path whatever fingerprint it lists, so the outlier drops
the condition and _is_change_candidate drops the verified derivation
paths it read for it.

The outlier also required exactly one derivation path entry. It only
kept out bare p2sh outputs annotated with several keys while omitting
their scripts, which no surveyed coordinator emits, and the single sig
surplus check now refuses those.

The m-of-n exclusion becomes a check that the output omits its redeem
script. For an output parsed as plain p2sh the two admit the same
outputs, since a supplied multisig redeem script is the only source of
an m-of-n there, and the new check states what the outlier is for.

New tests refuse an output that pays this seed but lists another key,
and pin each of the three remaining conditions: a payment to another
wallet of this seed, annotated with our key, stays a spend.
2026-09-29 12:05:36 -05:00
..
2025-10-23 14:23:27 -05:00
2024-11-06 14:00:36 -06:00
2024-11-05 12:19:35 -06:00
2025-12-17 21:11:14 +01:00
2025-12-26 07:13:00 -06:00
2024-03-02 07:46:35 -06:00
2024-07-14 13:21:23 -05:00
2025-01-02 18:38:03 -06:00

Running Tests

The tests are designed to be run on non-Raspi hardware.

Setup

On your testing machine you'll have to install:

# general dependencies
pip3 install -r requirements.txt

# test suite dependencies
pip3 install -r tests/requirements.txt

Then make the seedsigner python module visible/importable to the tests by installing it:

pip3 install -e .

Running all tests, calculating overall test coverage

tldr: just run the convenience script from the project root:

./tests/run_full_coverage.sh

Running tests manually

Run the whole test suite:

pytest

Run a specific test file:

pytest tests/test_this_file.py

Run a specific test:

pytest tests/test_this_file.py::test_this_specific_test

Force pytest to show logging output:

pytest tests/test_this_file.py::test_this_specific_test -o log_cli=1

# or (same result)

pytest tests/test_this_file.py::test_this_specific_test --log-cli-level=DEBUG

Annoying complications:

  • If you want to see print() statements that are in a test file, add -s
  • Better idea: use a proper logger in the test file and use one of the above options to display logs

Screenshot generator

The screenshot generator is meant to mostly be a utility and not really part of the test suite. However, it is actually implemented to be run by pytest.

see: Screenshot generator README

Generate coverage manually

Run tests and generate test coverage

coverage run -m pytest

The screenshots can generate their own separate coverage report:

coverage run -m pytest tests/screenshot_generator/generator.py --locale es

Show the resulting test coverage details:

coverage report

Generate the interactive html report:

coverage html