Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
f2b448f
fix: RS03 recognize tries all known medium sizes as candidates
Apr 8, 2026
fd2ac4e
fix: suppress verbose noise from RS03 candidate loop, fix deb build
Apr 8, 2026
3b25232
fix: update regtest golden files for multi-candidate RS03 recognize
Apr 8, 2026
6654a10
test: add pytest framework and RS03 recognition robustness tests
Apr 8, 2026
b80f9d5
enh: add golden-test framework for declarative regression tests
Apr 10, 2026
dd3f86a
enh: migrate all 28 RS01 verify tests from bash to Python
Apr 10, 2026
7b67c44
enh: migrate all 144 RS01 tests from bash to Python, disable bash tests
Apr 10, 2026
ec1d8f8
enh: migrate all 148 RS02 tests from bash to Python, disable bash tests
Apr 11, 2026
2073324
fix: wire CreateECC output/ecc_size fields, fix path stripping fidelity
Apr 10, 2026
62004ee
enh: migrate RS03f verify tests (34 tests) from bash to Python
Apr 14, 2026
c061ada
enh: migrate RS03f creation tests (14) from bash to Python
Apr 14, 2026
4889ef1
enh: migrate RS03f repair tests from bash to Python
Apr 15, 2026
31f8994
enh: migrate RS03f scanning tests (18) from bash to Python
Apr 15, 2026
9306ca9
enh: migrate RS03f reading tests (18) from bash to Python
Apr 15, 2026
a194816
fix: address code quality review for RS03f reading tests
Apr 15, 2026
b269367
enh: migrate RS03i strip + verify tests (50) from bash to Python
Apr 15, 2026
1c29845
fix: correct verify test count in RS03i docstring (48, not 50)
Apr 15, 2026
7e6c109
enh: migrate RS03i creation tests (20) from bash to Python
Apr 15, 2026
a8fa6ac
enh: migrate RS03i fixing tests (27) from bash to Python
Apr 15, 2026
47f0689
enh: migrate RS03i scanning tests (33) from bash to Python
Apr 16, 2026
2504286
enh: migrate RS03i reading tests (29) from bash to Python
Apr 16, 2026
c6d5a38
enh: disable all 274 bash RS03 tests, migrated to Python pytest
Apr 16, 2026
7d4af73
docs: add test suite README with framework docs and bash/python compa…
Apr 11, 2026
ca98828
docs: update test suite README and CLAUDE.md for completed migration
Apr 16, 2026
ab6ca23
fix: pytest test sizes and deb packaging for CI
Apr 8, 2026
05da4cf
fix: resolve remaining 17 Windows pytest failures
Apr 20, 2026
d8945dd
fix: normalize CRLF in pytest golden comparison for Windows
Apr 20, 2026
4f185b9
fix: drop empty-parametrize placeholders from test_golden collection
Apr 21, 2026
ba90cec
enh: add pytest integration tests to macOS and Windows CI
Apr 16, 2026
4785bdc
fix: fix pytest install for macOS (PEP 668) and Windows (MSYS2 pacman)
Apr 16, 2026
d4bb130
fix: use python3 -m pip on macOS to match python3 interpreter
Apr 16, 2026
e52697f
enh: cache /var/tmp/regtest master images in CI
Apr 16, 2026
c2af00e
enh: add --run-slow pytest option to skip large-image tests
Apr 17, 2026
62d3eaf
enh: mark 24 RS03i large-image tests as slow
Apr 17, 2026
82f17bf
enh: mark 17 RS02 large-image tests as slow
Apr 17, 2026
9955942
enh: run pytest on CLI builds only, slow tests on Linux only
Apr 17, 2026
ac87243
docs: document slow test marker and CI strategy
Apr 17, 2026
ab056c3
enh: run slow tests only on schedule, release tags, and manual dispatch
Apr 17, 2026
244aab6
fix: rewrite bionic apt sources to old-releases.ubuntu.com in appimag…
Apr 17, 2026
531e387
docs: add CI workflow reference at docs/workflow_readme.md
Apr 17, 2026
365c30a
fix: switch appimage apt mirror from old-releases to azure.archive.ub…
Apr 17, 2026
fe5610d
enh: parallelize pytest with xdist and bump Mac/Win CI timeouts
Apr 19, 2026
54541d2
fix: merge golden-placeholder filter into --run-slow collection hook
Apr 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -269,8 +269,17 @@ jobs:
run: |
mkdir -p /tmp/dist
docker run --device /dev/fuse --privileged --name uu -d -v $PWD:/dvdisaster -v /tmp/dist:/dist ubuntu:18.04 sleep 1800
# The default ubuntu:18.04 sources.list points at archive.ubuntu.com /
# security.ubuntu.com whose public Canonical IPs (91.189.91.x /
# 91.189.92.x) are unreachable from inside docker on GitHub Actions
# runners (apt times out, then fails with "no installation candidate").
# Rewrite to azure.archive.ubuntu.com — Microsoft's intra-Azure Ubuntu
# mirror that GHA runners (Azure-hosted) can reach reliably. It serves
# all bionic pockets (main, updates, backports, security). We
# deliberately keep the AppImage build pinned to bionic to preserve
# the glibc 2.27 compatibility floor for downstream users.
- name: install prerequisites in docker
run: docker exec uu sh -c 'apt update && apt install -y man fuse file make gcc pkg-config libglib2.0-dev libgtk-3-dev glib-networking libgdk-pixbuf2.0-dev'
run: docker exec uu sh -c "sed -i -e 's|http://archive.ubuntu.com/ubuntu|http://azure.archive.ubuntu.com/ubuntu|g' -e 's|http://security.ubuntu.com/ubuntu|http://azure.archive.ubuntu.com/ubuntu|g' /etc/apt/sources.list && apt update && apt install -y man fuse file make gcc pkg-config libglib2.0-dev libgtk-3-dev glib-networking libgdk-pixbuf2.0-dev"
- name: configure in docker
run: docker exec uu sh -c 'cd /dvdisaster && ./configure --prefix=/usr'
- name: make in docker
Expand Down
57 changes: 52 additions & 5 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,15 @@
name: non-regression tests

on: [pull_request]
on:
pull_request:
push:
branches:
- master
tags:
- 'v*'
schedule:
- cron: '0 3 * * 1' # every Monday 3am UTC
workflow_dispatch:

concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
Expand All @@ -23,6 +32,7 @@ jobs:
- arch: arm64
runs-on: macos-15
runs-on: ${{ matrix.runs-on }}
timeout-minutes: 240
steps:
- uses: actions/checkout@v5
with:
Expand Down Expand Up @@ -58,7 +68,14 @@ jobs:
./dvdisaster --version | grep NOGUI
- name: prepare dist
run: ./.github/workflows/make-mac-app.sh ${{ github.ref }} ${{ matrix.arch }}
- name: regression tests
- name: cache master images
if: matrix.printf == 'normal' && matrix.ui == 'cli'
uses: actions/cache@v4
with:
path: /var/tmp/regtest
key: regtest-${{ runner.os }}-${{ matrix.arch }}-${{ hashFiles('tests/test_*.py', 'tests/framework.py') }}
restore-keys: regtest-${{ runner.os }}-${{ matrix.arch }}-
- name: regression tests (bash, legacy)
if: matrix.printf == 'normal'
env:
REGTEST_NO_UTF8: 1
Expand All @@ -67,8 +84,14 @@ jobs:
mkdir -p /var/tmp/regtest
echo "Number of available processors: $(sysctl -n hw.ncpu || echo U)"
./regtest/runtests.sh
- name: pytest integration tests
if: matrix.printf == 'normal' && matrix.ui == 'cli'
run: |
python3 -m pip install --break-system-packages pytest pytest-xdist filelock
python3 -m pytest tests/ -v -n auto
win:
runs-on: windows-latest
timeout-minutes: 240
strategy:
matrix:
ui: [cli, gui]
Expand All @@ -86,7 +109,7 @@ jobs:
with:
msystem: MINGW64
update: false
install: git diffutils make pkg-config mingw-w64-x86_64-glib2 mingw-w64-x86_64-gcc mingw-w64-x86_64-ntldd-git man zip
install: git diffutils make pkg-config mingw-w64-x86_64-glib2 mingw-w64-x86_64-gcc mingw-w64-x86_64-ntldd-git mingw-w64-x86_64-python mingw-w64-x86_64-python-pytest mingw-w64-x86_64-python-pytest-xdist mingw-w64-x86_64-python-filelock man zip
- name: install GUI prereqs
if: matrix.ui == 'gui'
run: pacman -S --noconfirm mingw-w64-x86_64-gtk3 mingw-w64-x86_64-librsvg
Expand Down Expand Up @@ -121,7 +144,14 @@ jobs:
./dvdisaster.exe --version | grep NOGUI
- name: try to prepare dist
run: ./.github/workflows/make-dist.sh ${{ github.ref }}
- name: run regression tests
- name: cache master images
if: matrix.printf == 'normal' && matrix.ui == 'cli'
uses: actions/cache@v4
with:
path: C:\msys64\var\tmp\regtest
key: regtest-${{ runner.os }}-${{ hashFiles('tests/test_*.py', 'tests/framework.py') }}
restore-keys: regtest-${{ runner.os }}-
- name: run regression tests (bash, legacy)
if: matrix.printf == 'normal'
env:
REGTEST_NO_UTF8: 1
Expand All @@ -130,9 +160,14 @@ jobs:
mkdir -p /var/tmp/regtest
echo "Number of available processors: $(nproc || echo U)"
./regtest/runtests.sh
- name: pytest integration tests
if: matrix.printf == 'normal' && matrix.ui == 'cli'
run: |
python3 -m pytest tests/ -v -n auto

linux:
runs-on: ubuntu-latest
timeout-minutes: 180
strategy:
matrix:
ui: [cli, gui]
Expand Down Expand Up @@ -175,7 +210,14 @@ jobs:
./dvdisaster --version | grep NOGUI
- name: prepare dist
run: ./.github/workflows/make-dist.sh ${{ github.ref }}
- name: regression tests
- name: cache master images
if: matrix.printf == 'normal' && matrix.ui == 'cli'
uses: actions/cache@v4
with:
path: /var/tmp/regtest
key: regtest-${{ runner.os }}-${{ hashFiles('tests/test_*.py', 'tests/framework.py') }}
restore-keys: regtest-${{ runner.os }}-
- name: regression tests (bash, legacy)
if: matrix.printf == 'normal'
env:
REGTEST_NO_UTF8: 1
Expand All @@ -184,3 +226,8 @@ jobs:
mkdir -p /var/tmp/regtest
echo "Number of available processors: $(nproc || echo U)"
./regtest/runtests.sh
- name: pytest integration tests
if: matrix.printf == 'normal' && matrix.ui == 'cli'
run: |
pip install pytest pytest-xdist filelock
python3 -m pytest tests/ -v -n auto ${{ (github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' || startsWith(github.ref, 'refs/tags/v')) && '--run-slow' || '' }}
9 changes: 9 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,15 @@ bugs and added a few tiny features.

See the [INSTALL](INSTALL) file. The [workflow file](.github/workflows/release.yml) that is used to automatically build binaries for each release can also help.

# :test_tube: Testing

The test suite uses Python/pytest with a declarative DSL for golden-file comparison tests. See the [test suite documentation](tests/README.md) for details on the framework, test coverage, and how to add new tests.

```bash
pip install pytest
python3 -m pytest tests/ -v
```

# :camera: Screenshots

### Reading a damaged CD under Windows:
Expand Down
2 changes: 1 addition & 1 deletion debian/rules
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ ICON_SIZES := $(patsubst contrib/dvdisaster%.png,%,$(ICONS))
override_dh_update_autotools_config:
dh_update_autotools_config
test -f $(BACKUP_TAR_FILE) || \
tar cpf $(BACKUP_TAR_FILE) $(MUTABLE_FILES)
tar cpf $(BACKUP_TAR_FILE) $(MUTABLE_FILES) 2>/dev/null || true

override_dh_clean:
dh_clean
Expand Down
40 changes: 40 additions & 0 deletions docs/workflow_readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# CI Workflow Reference

This document describes the GitHub Actions workflows in `.github/workflows/`. Each workflow has a single coherent purpose; this file explains the orchestration that's not obvious from the YAML alone.

## tests.yml — Regression tests

Triggered on push and pull_request. Runs the pytest suite (`tests/`) on Linux, macOS (x86_64 + arm64), and Windows (MSYS2/MINGW64), for both CLI and GUI build variants. The full pytest suite is gated:

- **PR / push events**: fast tests only. Runs in ~5–10 minutes per platform.
- **Scheduled cron, release tags (`v*`), and manual `workflow_dispatch`**: full suite including slow tests (large-image RS02 / RS03i tests).

Slow tests are marked with `@pytest.mark.slow` in `tests/test_rs02.py` and `tests/test_rs03i.py`. The `--run-slow` pytest option (defined in `tests/conftest.py`) opts them in; CI passes it conditionally.

The first test run on any host creates ~3GB of master images in `/var/tmp/regtest/` and reuses them on subsequent runs. CI caches this directory between runs to save startup time.

## release.yml — Multi-platform release builds

Triggered on push to master/dev and on `v*` tags. Produces:

- `linux64-cli` — static CLI binary
- `linux64-deb` — Debian package
- `linux64-appimage` — AppImage built inside `ubuntu:18.04` Docker container
- `win (cli)` / `win (gui)` — Windows binaries via MSYS2/MINGW64
- `mac (cli, x86_64 / arm64)` / `mac (gui, x86_64 / arm64)` — macOS binaries

A `prepare-tag` job runs first to avoid tag race conditions between parallel platform builds.

### AppImage build note

The AppImage job intentionally builds inside `ubuntu:18.04` (Bionic) to keep the resulting AppImage's glibc dependency at 2.27 — the lowest common denominator across modern Linux distros, which maximizes downstream compatibility.

Bionic reached end-of-standard-support on 2023-04-30. The main, updates, and backports apt pockets were moved off `archive.ubuntu.com` to `old-releases.ubuntu.com`. The "install prerequisites in docker" step rewrites `/etc/apt/sources.list` to point at `old-releases.ubuntu.com` before `apt update` so package installation succeeds. The `bionic-security` pocket on `security.ubuntu.com` is also rewritten for consistency.

## codeql.yml — Static analysis

Triggered on push, pull_request, and weekly cron. Runs CodeQL static analysis. No special configuration.

## stale.yml — Issue housekeeping

Triggered on daily cron. Auto-closes issues labeled `needs-more-info` or `answered` after a quiet period.
2 changes: 2 additions & 0 deletions pytest.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
[pytest]
testpaths = tests
Loading