@@ -8,6 +8,7 @@ use waitgroup::WaitGroup;
8
8
9
9
use super :: * ;
10
10
use crate :: api:: media_engine:: MediaEngine ;
11
+ use crate :: api:: setting_engine:: SctpMaxMessageSize ;
11
12
use crate :: api:: { APIBuilder , API } ;
12
13
use crate :: data_channel:: data_channel_init:: RTCDataChannelInit ;
13
14
//use log::LevelFilter;
@@ -1375,6 +1376,203 @@ async fn test_data_channel_non_standard_session_description() -> Result<()> {
1375
1376
Ok ( ( ) )
1376
1377
}
1377
1378
1379
+ async fn create_data_channel_with_max_message_size (
1380
+ remote_max_message_size : Option < u32 > ,
1381
+ can_send_max_message_size : Option < SctpMaxMessageSize > ,
1382
+ ) -> Result < Arc < RTCDataChannel > > {
1383
+ let mut m = MediaEngine :: default ( ) ;
1384
+ let mut s: SettingEngine = SettingEngine :: default ( ) ;
1385
+ s. detach_data_channels ( ) ;
1386
+ m. register_default_codecs ( ) ?;
1387
+ let api_builder = APIBuilder :: new ( ) . with_media_engine ( m) ;
1388
+
1389
+ if let Some ( can_send_max_message_size) = can_send_max_message_size {
1390
+ s. set_sctp_max_message_size_can_send ( can_send_max_message_size) ;
1391
+ }
1392
+
1393
+ let api = api_builder. with_setting_engine ( s) . build ( ) ;
1394
+
1395
+ let ( offer_pc, answer_pc) = new_pair ( & api) . await ?;
1396
+ let ( data_channel_tx, mut data_channel_rx) = mpsc:: channel :: < Arc < RTCDataChannel > > ( 1 ) ;
1397
+ let data_channel_tx = Arc :: new ( data_channel_tx) ;
1398
+ answer_pc. on_data_channel ( Box :: new ( move |dc : Arc < RTCDataChannel > | {
1399
+ let data_channel_tx2 = Arc :: clone ( & data_channel_tx) ;
1400
+ Box :: pin ( async move {
1401
+ data_channel_tx2. send ( dc) . await . unwrap ( ) ;
1402
+ } )
1403
+ } ) ) ;
1404
+
1405
+ let _ = offer_pc. create_data_channel ( "foo" , None ) . await ?;
1406
+
1407
+ let offer = offer_pc. create_offer ( None ) . await ?;
1408
+ let mut offer_gathering_complete = offer_pc. gathering_complete_promise ( ) . await ;
1409
+ offer_pc. set_local_description ( offer) . await ?;
1410
+ let _ = offer_gathering_complete. recv ( ) . await ;
1411
+ let mut offer = offer_pc. local_description ( ) . await . unwrap ( ) ;
1412
+
1413
+ if let Some ( remote_max_message_size) = remote_max_message_size {
1414
+ offer
1415
+ . sdp
1416
+ . push_str ( format ! ( "a=max-message-size:{}\r \n " , remote_max_message_size) . as_str ( ) ) ;
1417
+ }
1418
+
1419
+ answer_pc. set_remote_description ( offer) . await ?;
1420
+
1421
+ let answer = answer_pc. create_answer ( None ) . await ?;
1422
+
1423
+ let mut answer_gathering_complete = answer_pc. gathering_complete_promise ( ) . await ;
1424
+ answer_pc. set_local_description ( answer) . await ?;
1425
+ let _ = answer_gathering_complete. recv ( ) . await ;
1426
+
1427
+ let answer = answer_pc. local_description ( ) . await . unwrap ( ) ;
1428
+ offer_pc. set_remote_description ( answer) . await ?;
1429
+
1430
+ Ok ( data_channel_rx. recv ( ) . await . unwrap ( ) )
1431
+ }
1432
+
1433
+ // 128 KB
1434
+ const EXPECTED_MAX_MESSAGE_SIZE : u32 = 131072 ;
1435
+
1436
+ #[ tokio:: test]
1437
+ async fn test_data_channel_max_message_size_respected_on_send ( ) -> Result < ( ) > {
1438
+ let data_channel = create_data_channel_with_max_message_size (
1439
+ Some ( EXPECTED_MAX_MESSAGE_SIZE ) ,
1440
+ Some ( SctpMaxMessageSize :: Unbounded ) ,
1441
+ )
1442
+ . await ?;
1443
+
1444
+ // A buffer with a size greater than the default size of 64KB.
1445
+ let buffer = vec ! [ 0 ; 68000 ] ;
1446
+ let bytes = bytes:: Bytes :: copy_from_slice ( buffer. as_slice ( ) ) ;
1447
+ data_channel. send ( & bytes) . await . unwrap ( ) ;
1448
+
1449
+ Ok ( ( ) )
1450
+ }
1451
+
1452
+ #[ tokio:: test]
1453
+ async fn test_given_remote_max_message_size_is_none_when_data_channel_can_send_max_message_size_respected_on_send (
1454
+ ) -> Result < ( ) > {
1455
+ const EXPECTED_CAN_SEND_MAX_MESSAGE_SIZE : u32 = 1024 ;
1456
+ let data_channel = create_data_channel_with_max_message_size (
1457
+ None ,
1458
+ Some ( SctpMaxMessageSize :: Bounded (
1459
+ EXPECTED_CAN_SEND_MAX_MESSAGE_SIZE ,
1460
+ ) ) ,
1461
+ )
1462
+ . await ?;
1463
+
1464
+ let buffer = vec ! [ 0 ; 65536 ] ;
1465
+ let bytes = bytes:: Bytes :: copy_from_slice ( buffer. as_slice ( ) ) ;
1466
+
1467
+ let actual = data_channel. send ( & bytes) . await ;
1468
+
1469
+ assert ! ( matches!(
1470
+ actual,
1471
+ Err ( Error :: Data ( data:: Error :: Sctp (
1472
+ sctp:: Error :: ErrOutboundPacketTooLarge
1473
+ ) ) )
1474
+ ) ) ;
1475
+
1476
+ Ok ( ( ) )
1477
+ }
1478
+
1479
+ async fn run_data_channel_config_max_message_size (
1480
+ remote_max_message_size : Option < u32 > ,
1481
+ can_send_max_message_size : Option < SctpMaxMessageSize > ,
1482
+ ) -> Result < u32 > {
1483
+ let data_channel = create_data_channel_with_max_message_size (
1484
+ remote_max_message_size,
1485
+ can_send_max_message_size,
1486
+ )
1487
+ . await ?;
1488
+ let data_channel = data_channel. detach ( ) . await ?;
1489
+ Ok ( data_channel. config . max_message_size )
1490
+ }
1491
+
1492
+ #[ tokio:: test]
1493
+ async fn test_data_channel_max_message_size_reflected_on_data_channel_config ( ) -> Result < ( ) > {
1494
+ assert_eq ! (
1495
+ run_data_channel_config_max_message_size(
1496
+ Some ( EXPECTED_MAX_MESSAGE_SIZE ) ,
1497
+ Some ( SctpMaxMessageSize :: Unbounded )
1498
+ )
1499
+ . await ?,
1500
+ EXPECTED_MAX_MESSAGE_SIZE
1501
+ ) ;
1502
+
1503
+ Ok ( ( ) )
1504
+ }
1505
+
1506
+ #[ tokio:: test]
1507
+ async fn test_can_send_max_message_size_unspecified_then_remote_default_value_is_respected (
1508
+ ) -> Result < ( ) > {
1509
+ assert_eq ! (
1510
+ run_data_channel_config_max_message_size( Some ( EXPECTED_MAX_MESSAGE_SIZE ) , None ) . await ?,
1511
+ SctpMaxMessageSize :: DEFAULT_MESSAGE_SIZE
1512
+ ) ;
1513
+
1514
+ Ok ( ( ) )
1515
+ }
1516
+
1517
+ #[ tokio:: test]
1518
+ async fn test_given_can_send_channel_max_message_size_less_than_remote_max_message_size_respect_send_channel_max_message_size (
1519
+ ) -> Result < ( ) > {
1520
+ let remote_max_message_size = 1024 ;
1521
+ let can_send_channel_max_message_size = 256 ;
1522
+ assert_eq ! (
1523
+ run_data_channel_config_max_message_size(
1524
+ Some ( remote_max_message_size) ,
1525
+ Some ( SctpMaxMessageSize :: Bounded (
1526
+ can_send_channel_max_message_size
1527
+ ) )
1528
+ )
1529
+ . await ?,
1530
+ can_send_channel_max_message_size
1531
+ ) ;
1532
+
1533
+ Ok ( ( ) )
1534
+ }
1535
+
1536
+ #[ tokio:: test]
1537
+ async fn test_can_send_max_message_size_respected_on_data_channel_config ( ) -> Result < ( ) > {
1538
+ let can_send_channel_max_message_size = 1024 ;
1539
+ assert_eq ! (
1540
+ run_data_channel_config_max_message_size(
1541
+ None ,
1542
+ Some ( SctpMaxMessageSize :: Bounded (
1543
+ can_send_channel_max_message_size
1544
+ ) )
1545
+ )
1546
+ . await ?,
1547
+ can_send_channel_max_message_size
1548
+ ) ;
1549
+
1550
+ Ok ( ( ) )
1551
+ }
1552
+
1553
+ #[ tokio:: test]
1554
+ async fn test_given_no_remote_message_size_or_can_send_max_message_size_max_size_is_65536 (
1555
+ ) -> Result < ( ) > {
1556
+ assert_eq ! (
1557
+ run_data_channel_config_max_message_size( None , None ) . await ?,
1558
+ SctpMaxMessageSize :: DEFAULT_MESSAGE_SIZE
1559
+ ) ;
1560
+
1561
+ Ok ( ( ) )
1562
+ }
1563
+
1564
+ #[ tokio:: test]
1565
+ async fn test_respect_default_remote_max_message_size_when_can_send_max_message_size_is_greater_than_default (
1566
+ ) -> Result < ( ) > {
1567
+ assert_eq ! (
1568
+ run_data_channel_config_max_message_size( None , Some ( SctpMaxMessageSize :: Bounded ( 70000 ) ) )
1569
+ . await ?,
1570
+ SctpMaxMessageSize :: DEFAULT_MESSAGE_SIZE
1571
+ ) ;
1572
+
1573
+ Ok ( ( ) )
1574
+ }
1575
+
1378
1576
struct TestOrtcStack {
1379
1577
//api *API
1380
1578
gatherer : Arc < RTCIceGatherer > ,
0 commit comments