@@ -8,6 +8,7 @@ use waitgroup::WaitGroup;
88
99use super :: * ;
1010use crate :: api:: media_engine:: MediaEngine ;
11+ use crate :: api:: setting_engine:: SctpMaxMessageSize ;
1112use crate :: api:: { APIBuilder , API } ;
1213use crate :: data_channel:: data_channel_init:: RTCDataChannelInit ;
1314//use log::LevelFilter;
@@ -1375,6 +1376,203 @@ async fn test_data_channel_non_standard_session_description() -> Result<()> {
13751376 Ok ( ( ) )
13761377}
13771378
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+
13781576struct TestOrtcStack {
13791577 //api *API
13801578 gatherer : Arc < RTCIceGatherer > ,
0 commit comments