Add passing test for unregistered err relay

Drop the `xfail` test and instead add a new one that ensures the
`tractor._exceptions` fixes enable graceful relay of
remote-but-unregistered error types via the unboxing of just the
`rae.src_type_str/boxed_type_str` content. The test also ensures
a warning is included with remote error content indicating the user
should register their error type for effective cross-actor re-raising.

Deats,
- add `test_unregistered_err_still_relayed`: verify the
  `RemoteActorError` IS raised with `.boxed_type`
  as `None` but `.src_type_str`, `.boxed_type_str`,
  and `.tb_str` all preserved from the IPC msg.
- drop `test_unregistered_boxed_type_resolution_xfail`
  since the new above case covers it and we don't need to have
  an effectively entirely repeated test just with an inverse assert
  as it's last line..

(this patch was generated in some part by [`claude-code`][claude-code-gh])
[claude-code-gh]: https://github.com/anthropics/claude-code
multicast_revertable_streams
Gud Boi 2026-03-24 16:28:19 -04:00
parent a41c6d5c70
commit 80597b80bf
1 changed files with 34 additions and 22 deletions

View File

@ -257,29 +257,23 @@ def test_registered_another_err_relayed(
assert rae.boxed_type is AnotherAppError assert rae.boxed_type is AnotherAppError
@pytest.mark.xfail( def test_unregistered_err_still_relayed(
reason=(
'Unregistered custom error types are not '
'resolvable by `get_err_type()` and thus '
'`.boxed_type` will be `None`, indicating '
'the framework cannot reconstruct the '
'original remote error type - the user '
'must call `reg_err_types()` to fix this.'
),
)
def test_unregistered_custom_err_fails_lookup(
debug_mode: bool, debug_mode: bool,
tpt_proto: str, tpt_proto: str,
): ):
''' '''
When a custom error type is NOT registered the Verify that even when a custom error type is NOT registered via
received `RemoteActorError.boxed_type` should NOT `reg_err_types()`, the remote error is still relayed as
match the original error type. a `RemoteActorError` with all string-level info preserved
(traceback, type name, source actor uid).
This test is `xfail` to document the expected The `.boxed_type` will be `None` (type obj can't be resolved) but
failure mode and to alert the user that `.boxed_type_str` and `.src_type_str` still report the original
`reg_err_types()` must be called for custom type name from the IPC msg.
error types to relay correctly.
This document the expected limitation: without `reg_err_types()`
the `.boxed_type` property can NOT resolve to the original Python
type.
''' '''
# NOTE: intentionally do NOT call # NOTE: intentionally do NOT call
@ -307,7 +301,25 @@ def test_unregistered_custom_err_fails_lookup(
rae = excinfo.value rae = excinfo.value
# XXX this SHOULD fail bc the type was never # the error IS relayed even without
# registered and thus `get_err_type()` returns # registration; type obj is unresolvable but
# `None` for the boxed type lookup. # all string-level info is preserved.
assert rae.boxed_type is UnregisteredAppError assert rae.boxed_type is None # NOT `UnregisteredAppError`
assert rae.src_type is None
# string names survive the IPC round-trip
# via the `Error` msg fields.
assert (
rae.src_type_str
==
'UnregisteredAppError'
)
assert (
rae.boxed_type_str
==
'UnregisteredAppError'
)
# original traceback content is preserved
assert 'this error type is unknown' in rae.tb_str
assert 'UnregisteredAppError' in rae.tb_str