forked from goodboy/tractor
				
			Change cancel test over the exception group
							parent
							
								
									cd79fd79b9
								
							
						
					
					
						commit
						882c33ff06
					
				| 
						 | 
					@ -8,6 +8,10 @@ import platform
 | 
				
			||||||
import time
 | 
					import time
 | 
				
			||||||
from itertools import repeat
 | 
					from itertools import repeat
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from exceptiongroup import (
 | 
				
			||||||
 | 
					    BaseExceptionGroup,
 | 
				
			||||||
 | 
					    ExceptionGroup,
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
import pytest
 | 
					import pytest
 | 
				
			||||||
import trio
 | 
					import trio
 | 
				
			||||||
import tractor
 | 
					import tractor
 | 
				
			||||||
| 
						 | 
					@ -76,9 +80,11 @@ def test_remote_error(arb_addr, args_err):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def test_multierror(arb_addr):
 | 
					def test_multierror(arb_addr):
 | 
				
			||||||
    """Verify we raise a ``trio.MultiError`` out of a nursery where
 | 
					    '''
 | 
				
			||||||
 | 
					    Verify we raise a ``BaseExceptionGroup`` out of a nursery where
 | 
				
			||||||
    more then one actor errors.
 | 
					    more then one actor errors.
 | 
				
			||||||
    """
 | 
					
 | 
				
			||||||
 | 
					    '''
 | 
				
			||||||
    async def main():
 | 
					    async def main():
 | 
				
			||||||
        async with tractor.open_nursery(
 | 
					        async with tractor.open_nursery(
 | 
				
			||||||
            arbiter_addr=arb_addr,
 | 
					            arbiter_addr=arb_addr,
 | 
				
			||||||
| 
						 | 
					@ -95,10 +101,10 @@ def test_multierror(arb_addr):
 | 
				
			||||||
                print("Look Maa that first actor failed hard, hehh")
 | 
					                print("Look Maa that first actor failed hard, hehh")
 | 
				
			||||||
                raise
 | 
					                raise
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # here we should get a `trio.MultiError` containing exceptions
 | 
					        # here we should get a ``BaseExceptionGroup`` containing exceptions
 | 
				
			||||||
        # from both subactors
 | 
					        # from both subactors
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    with pytest.raises(trio.MultiError):
 | 
					    with pytest.raises(BaseExceptionGroup):
 | 
				
			||||||
        trio.run(main)
 | 
					        trio.run(main)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -107,7 +113,7 @@ def test_multierror(arb_addr):
 | 
				
			||||||
    'num_subactors', range(25, 26),
 | 
					    'num_subactors', range(25, 26),
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
def test_multierror_fast_nursery(arb_addr, start_method, num_subactors, delay):
 | 
					def test_multierror_fast_nursery(arb_addr, start_method, num_subactors, delay):
 | 
				
			||||||
    """Verify we raise a ``trio.MultiError`` out of a nursery where
 | 
					    """Verify we raise a ``BaseExceptionGroup`` out of a nursery where
 | 
				
			||||||
    more then one actor errors and also with a delay before failure
 | 
					    more then one actor errors and also with a delay before failure
 | 
				
			||||||
    to test failure during an ongoing spawning.
 | 
					    to test failure during an ongoing spawning.
 | 
				
			||||||
    """
 | 
					    """
 | 
				
			||||||
| 
						 | 
					@ -123,10 +129,11 @@ def test_multierror_fast_nursery(arb_addr, start_method, num_subactors, delay):
 | 
				
			||||||
                    delay=delay
 | 
					                    delay=delay
 | 
				
			||||||
                )
 | 
					                )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    with pytest.raises(trio.MultiError) as exc_info:
 | 
					    # with pytest.raises(trio.MultiError) as exc_info:
 | 
				
			||||||
 | 
					    with pytest.raises(BaseExceptionGroup) as exc_info:
 | 
				
			||||||
        trio.run(main)
 | 
					        trio.run(main)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    assert exc_info.type == tractor.MultiError
 | 
					    assert exc_info.type == ExceptionGroup
 | 
				
			||||||
    err = exc_info.value
 | 
					    err = exc_info.value
 | 
				
			||||||
    exceptions = err.exceptions
 | 
					    exceptions = err.exceptions
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -214,8 +221,8 @@ async def test_cancel_infinite_streamer(start_method):
 | 
				
			||||||
    [
 | 
					    [
 | 
				
			||||||
        # daemon actors sit idle while single task actors error out
 | 
					        # daemon actors sit idle while single task actors error out
 | 
				
			||||||
        (1, tractor.RemoteActorError, AssertionError, (assert_err, {}), None),
 | 
					        (1, tractor.RemoteActorError, AssertionError, (assert_err, {}), None),
 | 
				
			||||||
        (2, tractor.MultiError, AssertionError, (assert_err, {}), None),
 | 
					        (2, BaseExceptionGroup, AssertionError, (assert_err, {}), None),
 | 
				
			||||||
        (3, tractor.MultiError, AssertionError, (assert_err, {}), None),
 | 
					        (3, BaseExceptionGroup, AssertionError, (assert_err, {}), None),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # 1 daemon actor errors out while single task actors sleep forever
 | 
					        # 1 daemon actor errors out while single task actors sleep forever
 | 
				
			||||||
        (3, tractor.RemoteActorError, AssertionError, (sleep_forever, {}),
 | 
					        (3, tractor.RemoteActorError, AssertionError, (sleep_forever, {}),
 | 
				
			||||||
| 
						 | 
					@ -226,7 +233,7 @@ async def test_cancel_infinite_streamer(start_method):
 | 
				
			||||||
         (do_nuthin, {}), (assert_err, {'delay': 1}, True)),
 | 
					         (do_nuthin, {}), (assert_err, {'delay': 1}, True)),
 | 
				
			||||||
        # daemon complete quickly delay while single task
 | 
					        # daemon complete quickly delay while single task
 | 
				
			||||||
        # actors error after brief delay
 | 
					        # actors error after brief delay
 | 
				
			||||||
        (3, tractor.MultiError, AssertionError,
 | 
					        (3, BaseExceptionGroup, AssertionError,
 | 
				
			||||||
         (assert_err, {'delay': 1}), (do_nuthin, {}, False)),
 | 
					         (assert_err, {'delay': 1}), (do_nuthin, {}, False)),
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    ids=[
 | 
					    ids=[
 | 
				
			||||||
| 
						 | 
					@ -293,7 +300,7 @@ async def test_some_cancels_all(num_actors_and_errs, start_method, loglevel):
 | 
				
			||||||
        # should error here with a ``RemoteActorError`` or ``MultiError``
 | 
					        # should error here with a ``RemoteActorError`` or ``MultiError``
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    except first_err as err:
 | 
					    except first_err as err:
 | 
				
			||||||
        if isinstance(err, tractor.MultiError):
 | 
					        if isinstance(err, BaseExceptionGroup):
 | 
				
			||||||
            assert len(err.exceptions) == num_actors
 | 
					            assert len(err.exceptions) == num_actors
 | 
				
			||||||
            for exc in err.exceptions:
 | 
					            for exc in err.exceptions:
 | 
				
			||||||
                if isinstance(exc, tractor.RemoteActorError):
 | 
					                if isinstance(exc, tractor.RemoteActorError):
 | 
				
			||||||
| 
						 | 
					@ -337,7 +344,7 @@ async def spawn_and_error(breadth, depth) -> None:
 | 
				
			||||||
@tractor_test
 | 
					@tractor_test
 | 
				
			||||||
async def test_nested_multierrors(loglevel, start_method):
 | 
					async def test_nested_multierrors(loglevel, start_method):
 | 
				
			||||||
    '''
 | 
					    '''
 | 
				
			||||||
    Test that failed actor sets are wrapped in `trio.MultiError`s. This
 | 
					    Test that failed actor sets are wrapped in `BaseExceptionGroup`s. This
 | 
				
			||||||
    test goes only 2 nurseries deep but we should eventually have tests
 | 
					    test goes only 2 nurseries deep but we should eventually have tests
 | 
				
			||||||
    for arbitrary n-depth actor trees.
 | 
					    for arbitrary n-depth actor trees.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -365,7 +372,7 @@ async def test_nested_multierrors(loglevel, start_method):
 | 
				
			||||||
                        breadth=subactor_breadth,
 | 
					                        breadth=subactor_breadth,
 | 
				
			||||||
                        depth=depth,
 | 
					                        depth=depth,
 | 
				
			||||||
                    )
 | 
					                    )
 | 
				
			||||||
        except trio.MultiError as err:
 | 
					        except BaseExceptionGroup as err:
 | 
				
			||||||
            assert len(err.exceptions) == subactor_breadth
 | 
					            assert len(err.exceptions) == subactor_breadth
 | 
				
			||||||
            for subexc in err.exceptions:
 | 
					            for subexc in err.exceptions:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -383,10 +390,10 @@ async def test_nested_multierrors(loglevel, start_method):
 | 
				
			||||||
                        assert subexc.type in (
 | 
					                        assert subexc.type in (
 | 
				
			||||||
                            tractor.RemoteActorError,
 | 
					                            tractor.RemoteActorError,
 | 
				
			||||||
                            trio.Cancelled,
 | 
					                            trio.Cancelled,
 | 
				
			||||||
                            trio.MultiError
 | 
					                            BaseExceptionGroup,
 | 
				
			||||||
                        )
 | 
					                        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    elif isinstance(subexc, trio.MultiError):
 | 
					                    elif isinstance(subexc, BaseExceptionGroup):
 | 
				
			||||||
                        for subsub in subexc.exceptions:
 | 
					                        for subsub in subexc.exceptions:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                            if subsub in (tractor.RemoteActorError,):
 | 
					                            if subsub in (tractor.RemoteActorError,):
 | 
				
			||||||
| 
						 | 
					@ -394,7 +401,7 @@ async def test_nested_multierrors(loglevel, start_method):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                            assert type(subsub) in (
 | 
					                            assert type(subsub) in (
 | 
				
			||||||
                                trio.Cancelled,
 | 
					                                trio.Cancelled,
 | 
				
			||||||
                                trio.MultiError,
 | 
					                                BaseExceptionGroup,
 | 
				
			||||||
                            )
 | 
					                            )
 | 
				
			||||||
                else:
 | 
					                else:
 | 
				
			||||||
                    assert isinstance(subexc, tractor.RemoteActorError)
 | 
					                    assert isinstance(subexc, tractor.RemoteActorError)
 | 
				
			||||||
| 
						 | 
					@ -406,13 +413,13 @@ async def test_nested_multierrors(loglevel, start_method):
 | 
				
			||||||
                    if is_win():
 | 
					                    if is_win():
 | 
				
			||||||
                        if isinstance(subexc, tractor.RemoteActorError):
 | 
					                        if isinstance(subexc, tractor.RemoteActorError):
 | 
				
			||||||
                            assert subexc.type in (
 | 
					                            assert subexc.type in (
 | 
				
			||||||
                                trio.MultiError,
 | 
					                                BaseExceptionGroup,
 | 
				
			||||||
                                tractor.RemoteActorError
 | 
					                                tractor.RemoteActorError
 | 
				
			||||||
                            )
 | 
					                            )
 | 
				
			||||||
                        else:
 | 
					                        else:
 | 
				
			||||||
                            assert isinstance(subexc, trio.MultiError)
 | 
					                            assert isinstance(subexc, BaseExceptionGroup)
 | 
				
			||||||
                    else:
 | 
					                    else:
 | 
				
			||||||
                        assert subexc.type is trio.MultiError
 | 
					                        assert subexc.type is ExceptionGroup
 | 
				
			||||||
                else:
 | 
					                else:
 | 
				
			||||||
                    assert subexc.type in (
 | 
					                    assert subexc.type in (
 | 
				
			||||||
                        tractor.RemoteActorError,
 | 
					                        tractor.RemoteActorError,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue