Skip to content

test(core): add real-world progressive RemoteFX difference fixtures from Haven - #1848

Open
GlassOnTin wants to merge 2 commits into
Devolutions:masterfrom
GlassOnTin:feat/egfx-haven-progressive-difference-fixtures
Open

test(core): add real-world progressive RemoteFX difference fixtures from Haven#1848
GlassOnTin wants to merge 2 commits into
Devolutions:masterfrom
GlassOnTin:feat/egfx-haven-progressive-difference-fixtures

Conversation

@GlassOnTin

Copy link
Copy Markdown
Contributor

Summary

Follow-up regression pack for #1698 (RFX_TILE_DIFFERENCE flag support in Progressive RemoteFX) requested in #1240, in the same shape as the #1813 fixture pack.

Adds four real WireToSurface2 progressive RemoteFX binary captures from a live Windows session (Windows 11 24H2 KVM) recorded via Haven's EGFX dumper (rdp-cli). Each fixture contains difference-encoded TILE_FIRST blocks (flags & RFX_TILE_DIFFERENCE == 0x01 per MS-RDPRFX 2.2.2.3.1.2 and 3.1.8.1.7.1) emitted during dynamic GUI activity.

Fixtures

Vendored at crates/ironrdp-testsuite-core/test_data/egfx/haven/ with provenance and license documentation in README.md:

  • wts2_64x64_diff_2tiles.bin: 2 difference tiles at (3, 2) & (3, 3) (quality = 0xFF)
  • wts2_64x128_diff_3tiles.bin: 3 difference tiles at (3, 2), (3, 3), (3, 4) (quality = 0xFF)
  • wts2_37x560_diff_column_9tiles.bin: 9-tile vertical column along x = 19, y = 3..=11 (quality = 0xFF)
  • wts2_progressive_tile_first_mixed_25tiles.bin: mixed set of 16 base tiles (flags = 0x00) and 9 difference tiles (flags = 0x01, quality = 0x00)

Validation

  • Added wire parsing, block structure, and tile assertions in crates/ironrdp-testsuite-core/tests/egfx/wire_to_surface_real_world.rs.
  • Added decoder validation asserting that uninitialized difference tiles correctly report ProgressiveDecodeError::MissingTileReference.
  • All tests in ironrdp-testsuite-core pass.

…rom Haven

Adds four binary fixtures captured from a live Windows session (Windows 11
24H2 KVM) via Haven's rdp-cli, exercising the RemoteFX Progressive
TILE_FIRST difference-decoding path (flags & RFX_TILE_DIFFERENCE == 1)
implemented in Devolutions#1698.

- wts2_64x64_diff_2tiles.bin: 2 difference tiles at full quality
- wts2_64x128_diff_3tiles.bin: 3 difference tiles at full quality
- wts2_37x560_diff_column_9tiles.bin: 9-tile vertical column of diff tiles
- wts2_progressive_tile_first_mixed_25tiles.bin: mixed 16 base + 9 diff tiles

Includes wire-parsing assertions, tile flag checks, and ProgressiveDecoder
missing-reference error handling tests in wire_to_surface_real_world.rs.

Refs: Devolutions#1240, Devolutions#1698, Devolutions#1813
@github-actions github-actions Bot added maintainer-required Maintainer review or intervention is required risk/unknown Risk could not be determined automatically; needs maintainer-level scrutiny size/M Size: up to 449 counted lines and 10 files; exceeds S in either measure labels Aug 30, 2026
@CBenoit

Benoît Cortier (CBenoit) commented Sep 3, 2026

Copy link
Copy Markdown
Member

Hi GlassOnTin

Thank you for the extra real-world captures!

Can you fix the CI checks? I think the new reviewing pipeline should kick in as soon as it’s fixed

@CBenoit Benoît Cortier (CBenoit) added the ai-review/allow-oversized Allows normal automated review of an oversized pull request label Sep 3, 2026
@GlassOnTin
GlassOnTin deployed to llm-providers September 3, 2026 18:07 — with GitHub Actions Active
@CBenoit
Benoît Cortier (CBenoit) requested a balanced review from Copilot September 3, 2026 18:07
@GlassOnTin

Copy link
Copy Markdown
Contributor Author

Fixed and pushed (a085ac4). The three difference-tile assertions built the expected y_idx with i as u16, which trips cast_possible_truncation and as_conversions under the -D warnings gate; they now use u16::try_from(i).expect(...). CI is re-running, the review pipeline should pick it up once green.

@CBenoit

Copy link
Copy Markdown
Member

The reviewer pipeline is currently broken, while I’m fixing it, I requested a Copilot review instead

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

Moderate test-coverage gaps must be addressed before approval.

Once you've addressed the issues Copilot identified, you can request another Copilot review.

Pull request overview

Adds four real-world Progressive RemoteFX difference fixtures and regression coverage.

Changes:

  • Vendors four Windows 11 captures.
  • Adds wire-format and decoder tests.
  • Documents fixture metadata, licensing, and provenance.
File summaries
File Review
crates/ironrdp-testsuite-core/tests/egfx/wire_to_surface_real_world.rs Needs stronger fixture assertions and successful difference-update decoding coverage.
crates/ironrdp-testsuite-core/test_data/egfx/haven/README.md Needs corrected region metadata and complete reproducible provenance.
Review details

Suppressed comments (1)

crates/ironrdp-testsuite-core/test_data/egfx/haven/README.md:32

  • WireToSurface2 has no destination rectangle, and the mixed capture does not contain the single bounding rectangle shown here. Its progressive REGION contains three rectangles: (1243, 192, 1280, 256), (80, 256, 139, 752), and (1243, 256, 1280, 752). Label these as region rectangles and record the actual list so the fixture metadata matches the wire data.
| File | PDU | Dest rect | Tiles | Tile Type & Difference Flags |
  • Files reviewed: 2/6 changed files
  • Comments generated: 3
  • Review effort level: Balanced

Comment on lines +205 to +214
let diff_count = region
.tiles
.iter()
.filter(|t| match t {
ProgressiveTile::First(f) => (f.flags & TILE_FLAG_DIFFERENCE) != 0,
_ => false,
})
.count();

assert_eq!(diff_count, 9, "expected exactly 9 difference-encoded tiles");
Comment on lines +266 to +269
let res = decoder.decode_bitmap(pdu.surface_id, pdu.codec_context_id, 1280, 800, &pdu.bitmap_data);
assert!(matches!(
res,
Err(ProgressiveDecodeError::MissingTileReference { x_idx: 3, y_idx: 2 })
Comment on lines +3 to +5
Binary fixtures captured from live Windows (Server 2025 and Windows 11 24H2 KVM) sessions via
[Haven](https://github.com/GlassHaven/Haven)'s `rdp-cli`.
Original captures by @GlassOnTin, recorded via Haven's EGFX PDU dumper (`EGFX_PDU_DUMP_DIR`).
@CBenoit Benoît Cortier (CBenoit) added the ai-reviewed/1 One automated review completed label Sep 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ai-review/allow-oversized Allows normal automated review of an oversized pull request ai-reviewed/1 One automated review completed maintainer-required Maintainer review or intervention is required risk/unknown Risk could not be determined automatically; needs maintainer-level scrutiny size/M Size: up to 449 counted lines and 10 files; exceeds S in either measure

Development

Successfully merging this pull request may close these issues.

3 participants