|
12 | 12 |
|
13 | 13 | from frequenz.channels import ( |
14 | 14 | Broadcast, |
| 15 | + BroadcastChannel, |
15 | 16 | ChannelClosedError, |
16 | 17 | Receiver, |
17 | 18 | ReceiverStoppedError, |
@@ -425,3 +426,50 @@ async def test_broadcast_close_receiver() -> None: |
425 | 426 |
|
426 | 427 | with pytest.raises(ReceiverStoppedError): |
427 | 428 | _ = await receiver_2.receive() |
| 429 | + |
| 430 | + |
| 431 | +async def test_broadcast_auto_close_1() -> None: |
| 432 | + """Ensure broadcast auto close works when all receivers are closed.""" |
| 433 | + sender, receiver = BroadcastChannel[int](name="auto-close-test") |
| 434 | + |
| 435 | + receiver_2 = sender.subscribe() |
| 436 | + |
| 437 | + await sender.send(1) |
| 438 | + |
| 439 | + assert (await receiver.receive()) == 1 |
| 440 | + assert (await receiver_2.receive()) == 1 |
| 441 | + |
| 442 | + receiver.close() |
| 443 | + |
| 444 | + await sender.send(2) |
| 445 | + |
| 446 | + assert (await receiver_2.receive()) == 2 |
| 447 | + |
| 448 | + receiver_2.close() |
| 449 | + |
| 450 | + with pytest.raises(SenderError) as excinfo: |
| 451 | + await sender.send(3) |
| 452 | + assert isinstance(excinfo.value.__cause__, ChannelClosedError) |
| 453 | + |
| 454 | + |
| 455 | +async def test_broadcast_auto_close_2() -> None: |
| 456 | + """Ensure broadcast auto close works when all senders are closed.""" |
| 457 | + sender, receiver = BroadcastChannel[int](name="auto-close-test") |
| 458 | + |
| 459 | + await sender.send(1) |
| 460 | + |
| 461 | + assert (await receiver.receive()) == 1 |
| 462 | + |
| 463 | + sender_2 = sender.clone() |
| 464 | + |
| 465 | + await sender.aclose() |
| 466 | + |
| 467 | + await sender_2.send(2) |
| 468 | + |
| 469 | + await sender_2.aclose() |
| 470 | + |
| 471 | + assert (await receiver.receive()) == 2 |
| 472 | + |
| 473 | + with pytest.raises(ReceiverStoppedError) as excinfo: |
| 474 | + await receiver.receive() |
| 475 | + assert isinstance(excinfo.value.__cause__, ChannelClosedError) |
0 commit comments