Test that SCTP succeeds with one MTU and fails with a lower MTU
This pair of tests will ensure that the SCTP layer's response to MTU size changes has not been modified. Bug: webrtc:12495 Change-Id: If9776ad399871e9f01b38715594b732e156118ff Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/211246 Reviewed-by: Tommi <tommi@webrtc.org> Commit-Queue: Harald Alvestrand <hta@webrtc.org> Cr-Commit-Position: refs/heads/master@{#33459}
This commit is contained in:
parent
0e42cf703b
commit
7087b83d80
@ -397,6 +397,122 @@ TEST_P(DataChannelIntegrationTest, EndToEndCallWithSctpDataChannel) {
|
|||||||
kDefaultTimeout);
|
kDefaultTimeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This test sets up a call between two parties with an SCTP
|
||||||
|
// data channel only, and sends messages of various sizes.
|
||||||
|
TEST_P(DataChannelIntegrationTest,
|
||||||
|
EndToEndCallWithSctpDataChannelVariousSizes) {
|
||||||
|
ASSERT_TRUE(CreatePeerConnectionWrappers());
|
||||||
|
ConnectFakeSignaling();
|
||||||
|
// Expect that data channel created on caller side will show up for callee as
|
||||||
|
// well.
|
||||||
|
caller()->CreateDataChannel();
|
||||||
|
caller()->CreateAndSetAndSignalOffer();
|
||||||
|
ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
|
||||||
|
// Caller data channel should already exist (it created one). Callee data
|
||||||
|
// channel may not exist yet, since negotiation happens in-band, not in SDP.
|
||||||
|
ASSERT_NE(nullptr, caller()->data_channel());
|
||||||
|
ASSERT_TRUE_WAIT(callee()->data_channel() != nullptr, kDefaultTimeout);
|
||||||
|
EXPECT_TRUE_WAIT(caller()->data_observer()->IsOpen(), kDefaultTimeout);
|
||||||
|
EXPECT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
|
||||||
|
|
||||||
|
for (int message_size = 1; message_size < 100000; message_size *= 2) {
|
||||||
|
std::string data(message_size, 'a');
|
||||||
|
caller()->data_channel()->Send(DataBuffer(data));
|
||||||
|
EXPECT_EQ_WAIT(data, callee()->data_observer()->last_message(),
|
||||||
|
kDefaultTimeout);
|
||||||
|
callee()->data_channel()->Send(DataBuffer(data));
|
||||||
|
EXPECT_EQ_WAIT(data, caller()->data_observer()->last_message(),
|
||||||
|
kDefaultTimeout);
|
||||||
|
}
|
||||||
|
// Specifically probe the area around the MTU size.
|
||||||
|
for (int message_size = 1100; message_size < 1300; message_size += 1) {
|
||||||
|
std::string data(message_size, 'a');
|
||||||
|
caller()->data_channel()->Send(DataBuffer(data));
|
||||||
|
EXPECT_EQ_WAIT(data, callee()->data_observer()->last_message(),
|
||||||
|
kDefaultTimeout);
|
||||||
|
callee()->data_channel()->Send(DataBuffer(data));
|
||||||
|
EXPECT_EQ_WAIT(data, caller()->data_observer()->last_message(),
|
||||||
|
kDefaultTimeout);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_P(DataChannelIntegrationTest,
|
||||||
|
EndToEndCallWithSctpDataChannelLowestSafeMtu) {
|
||||||
|
// The lowest payload size limit that's tested and found safe for this
|
||||||
|
// application. Note that this is not the safe limit under all conditions;
|
||||||
|
// in particular, the default is not the largest DTLS signature, and
|
||||||
|
// this test does not use TURN.
|
||||||
|
const size_t kLowestSafePayloadSizeLimit = 1225;
|
||||||
|
|
||||||
|
ASSERT_TRUE(CreatePeerConnectionWrappers());
|
||||||
|
ConnectFakeSignaling();
|
||||||
|
// Expect that data channel created on caller side will show up for callee as
|
||||||
|
// well.
|
||||||
|
caller()->CreateDataChannel();
|
||||||
|
caller()->CreateAndSetAndSignalOffer();
|
||||||
|
ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
|
||||||
|
// Caller data channel should already exist (it created one). Callee data
|
||||||
|
// channel may not exist yet, since negotiation happens in-band, not in SDP.
|
||||||
|
ASSERT_NE(nullptr, caller()->data_channel());
|
||||||
|
ASSERT_TRUE_WAIT(callee()->data_channel() != nullptr, kDefaultTimeout);
|
||||||
|
EXPECT_TRUE_WAIT(caller()->data_observer()->IsOpen(), kDefaultTimeout);
|
||||||
|
EXPECT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
|
||||||
|
|
||||||
|
virtual_socket_server()->set_max_udp_payload(kLowestSafePayloadSizeLimit);
|
||||||
|
for (int message_size = 1140; message_size < 1240; message_size += 1) {
|
||||||
|
std::string data(message_size, 'a');
|
||||||
|
caller()->data_channel()->Send(DataBuffer(data));
|
||||||
|
ASSERT_EQ_WAIT(data, callee()->data_observer()->last_message(),
|
||||||
|
kDefaultTimeout);
|
||||||
|
callee()->data_channel()->Send(DataBuffer(data));
|
||||||
|
ASSERT_EQ_WAIT(data, caller()->data_observer()->last_message(),
|
||||||
|
kDefaultTimeout);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// This test verifies that lowering the MTU of the connection will cause
|
||||||
|
// the datachannel to not transmit reliably.
|
||||||
|
// The purpose of this test is to ensure that we know how a too-small MTU
|
||||||
|
// error manifests itself.
|
||||||
|
TEST_P(DataChannelIntegrationTest, EndToEndCallWithSctpDataChannelHarmfulMtu) {
|
||||||
|
// The lowest payload size limit that's tested and found safe for this
|
||||||
|
// application in this configuration (see test above).
|
||||||
|
const size_t kLowestSafePayloadSizeLimit = 1225;
|
||||||
|
// The size of the smallest message that fails to be delivered.
|
||||||
|
const size_t kMessageSizeThatIsNotDelivered = 1157;
|
||||||
|
|
||||||
|
ASSERT_TRUE(CreatePeerConnectionWrappers());
|
||||||
|
ConnectFakeSignaling();
|
||||||
|
caller()->CreateDataChannel();
|
||||||
|
caller()->CreateAndSetAndSignalOffer();
|
||||||
|
ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
|
||||||
|
ASSERT_NE(nullptr, caller()->data_channel());
|
||||||
|
ASSERT_TRUE_WAIT(callee()->data_channel() != nullptr, kDefaultTimeout);
|
||||||
|
EXPECT_TRUE_WAIT(caller()->data_observer()->IsOpen(), kDefaultTimeout);
|
||||||
|
EXPECT_TRUE_WAIT(callee()->data_observer()->IsOpen(), kDefaultTimeout);
|
||||||
|
|
||||||
|
virtual_socket_server()->set_max_udp_payload(kLowestSafePayloadSizeLimit - 1);
|
||||||
|
// Probe for an undelivered or slowly delivered message. The exact
|
||||||
|
// size limit seems to be dependent on the message history, so make the
|
||||||
|
// code easily able to find the current value.
|
||||||
|
bool failure_seen = false;
|
||||||
|
for (size_t message_size = 1110; message_size < 1400; message_size++) {
|
||||||
|
const size_t message_count =
|
||||||
|
callee()->data_observer()->received_message_count();
|
||||||
|
const std::string data(message_size, 'a');
|
||||||
|
caller()->data_channel()->Send(DataBuffer(data));
|
||||||
|
// Wait a very short time for the message to be delivered.
|
||||||
|
WAIT(callee()->data_observer()->received_message_count() > message_count,
|
||||||
|
10);
|
||||||
|
if (callee()->data_observer()->received_message_count() == message_count) {
|
||||||
|
ASSERT_EQ(kMessageSizeThatIsNotDelivered, message_size);
|
||||||
|
failure_seen = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ASSERT_TRUE(failure_seen);
|
||||||
|
}
|
||||||
|
|
||||||
// Ensure that when the callee closes an SCTP data channel, the closing
|
// Ensure that when the callee closes an SCTP data channel, the closing
|
||||||
// procedure results in the data channel being closed for the caller as well.
|
// procedure results in the data channel being closed for the caller as well.
|
||||||
TEST_P(DataChannelIntegrationTest, CalleeClosesSctpDataChannel) {
|
TEST_P(DataChannelIntegrationTest, CalleeClosesSctpDataChannel) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user