|
12 | 12 | from __future__ import annotations |
13 | 13 |
|
14 | 14 | import asyncio |
| 15 | +import ctypes |
| 16 | +import gc |
15 | 17 | from typing import Optional |
16 | 18 |
|
17 | 19 | import pytest |
@@ -277,3 +279,45 @@ async def test_data_targeted_with_topic() -> None: |
277 | 279 | await _assert_no_data(other, other_collector) |
278 | 280 |
|
279 | 281 | await asyncio.gather(sender.disconnect(), target.disconnect(), other.disconnect()) |
| 282 | + |
| 283 | + |
| 284 | +@skip_if_no_credentials() # type: ignore[untyped-decorator] |
| 285 | +@pytest.mark.asyncio |
| 286 | +async def test_publish_data_makes_no_ctypes_array_type() -> None: |
| 287 | + """Sending and receiving payloads of new lengths makes no ctypes array type.""" |
| 288 | + room_name = unique_room_name("py-dc-array-type") |
| 289 | + |
| 290 | + sender = rtc.Room() |
| 291 | + receiver = rtc.Room() |
| 292 | + |
| 293 | + await connect_room("sender", room_name, room=sender) |
| 294 | + await connect_room("receiver", room_name, room=receiver) |
| 295 | + await ensure_rooms_all_connected([sender, receiver]) |
| 296 | + await ensure_participants_visible(sender, ["receiver"]) |
| 297 | + |
| 298 | + collector = _DataCollector(receiver, sender_identity="sender") |
| 299 | + lengths = range(1001, 1011) |
| 300 | + payloads = [bytes([i]) * n for i, n in enumerate(lengths)] |
| 301 | + |
| 302 | + gc.collect() |
| 303 | + gc.disable() |
| 304 | + try: |
| 305 | + for payload in payloads: |
| 306 | + await sender.local_participant.publish_data(payload) |
| 307 | + await wait_until( |
| 308 | + lambda: len(collector.packets) >= len(payloads), |
| 309 | + message="receiver did not get all payloads", |
| 310 | + ) |
| 311 | + array_types = [ |
| 312 | + o |
| 313 | + for o in gc.get_objects() |
| 314 | + if isinstance(o, type) |
| 315 | + and issubclass(o, ctypes.Array) |
| 316 | + and getattr(o, "_length_", None) in lengths |
| 317 | + ] |
| 318 | + finally: |
| 319 | + gc.enable() |
| 320 | + assert array_types == [] |
| 321 | + assert collector.payloads() == payloads |
| 322 | + |
| 323 | + await asyncio.gather(sender.disconnect(), receiver.disconnect()) |
0 commit comments