| Index: webrtc/api/peerconnection_unittest.cc
|
| diff --git a/webrtc/api/peerconnection_unittest.cc b/webrtc/api/peerconnection_unittest.cc
|
| index 406fab0d89eb6cc13d397a1ac668a87fca043b6e..33b7b2ff4e6ec8e744d826d6f346260a92bfeb30 100644
|
| --- a/webrtc/api/peerconnection_unittest.cc
|
| +++ b/webrtc/api/peerconnection_unittest.cc
|
| @@ -31,6 +31,7 @@
|
| #include "webrtc/api/test/fakevideotrackrenderer.h"
|
| #include "webrtc/api/test/mockpeerconnectionobservers.h"
|
| #include "webrtc/base/gunit.h"
|
| +#include "webrtc/base/helpers.h"
|
| #include "webrtc/base/physicalsocketserver.h"
|
| #include "webrtc/base/ssladapter.h"
|
| #include "webrtc/base/sslstreamadapter.h"
|
| @@ -1337,6 +1338,8 @@ class P2PTestConductor : public testing::Test {
|
| }
|
| }
|
|
|
| + rtc::VirtualSocketServer* virtual_socket_server() { return ss_.get(); }
|
| +
|
| PeerConnectionTestClient* initializing_client() {
|
| return initiating_client_.get();
|
| }
|
| @@ -1929,6 +1932,66 @@ TEST_F(P2PTestConductor, LocalP2PTestSctpDataChannel) {
|
| EXPECT_TRUE_WAIT(!receiving_client()->data_observer()->IsOpen(), kMaxWaitMs);
|
| }
|
|
|
| +TEST_F(P2PTestConductor, UnorderedSctpDataChannel) {
|
| + ASSERT_TRUE(CreateTestClients());
|
| + webrtc::DataChannelInit init;
|
| + init.ordered = false;
|
| + initializing_client()->CreateDataChannel(&init);
|
| +
|
| + // Introduce random network delays.
|
| + // Otherwise it's not a true "unordered" test.
|
| + virtual_socket_server()->set_delay_mean(20);
|
| + virtual_socket_server()->set_delay_stddev(5);
|
| + virtual_socket_server()->UpdateDelayDistribution();
|
| +
|
| + initializing_client()->Negotiate();
|
| + ASSERT_TRUE(initializing_client()->data_channel() != nullptr);
|
| + EXPECT_TRUE_WAIT(receiving_client()->data_channel() != nullptr, kMaxWaitMs);
|
| + EXPECT_TRUE_WAIT(initializing_client()->data_observer()->IsOpen(),
|
| + kMaxWaitMs);
|
| + EXPECT_TRUE_WAIT(receiving_client()->data_observer()->IsOpen(), kMaxWaitMs);
|
| +
|
| + static constexpr int kNumMessages = 100;
|
| + // Deliberately chosen to be larger than the MTU so messages get fragmented.
|
| + static constexpr size_t kMaxMessageSize = 4096;
|
| + // Create and send random messages.
|
| + std::vector<std::string> sent_messages;
|
| + for (int i = 0; i < kNumMessages; ++i) {
|
| + size_t length = (rand() % kMaxMessageSize) + 1;
|
| + std::string message;
|
| + ASSERT_TRUE(rtc::CreateRandomString(length, &message));
|
| + initializing_client()->data_channel()->Send(DataBuffer(message));
|
| + receiving_client()->data_channel()->Send(DataBuffer(message));
|
| + sent_messages.push_back(message);
|
| + }
|
| +
|
| + EXPECT_EQ_WAIT(
|
| + kNumMessages,
|
| + initializing_client()->data_observer()->received_message_count(),
|
| + kMaxWaitMs);
|
| + EXPECT_EQ_WAIT(kNumMessages,
|
| + receiving_client()->data_observer()->received_message_count(),
|
| + kMaxWaitMs);
|
| +
|
| + // Sort and compare to make sure none of the messages were corrupted.
|
| + std::vector<std::string> initializing_client_received_messages =
|
| + initializing_client()->data_observer()->messages();
|
| + std::vector<std::string> receiving_client_received_messages =
|
| + receiving_client()->data_observer()->messages();
|
| + std::sort(sent_messages.begin(), sent_messages.end());
|
| + std::sort(initializing_client_received_messages.begin(),
|
| + initializing_client_received_messages.end());
|
| + std::sort(receiving_client_received_messages.begin(),
|
| + receiving_client_received_messages.end());
|
| + EXPECT_EQ(sent_messages, initializing_client_received_messages);
|
| + EXPECT_EQ(sent_messages, receiving_client_received_messages);
|
| +
|
| + receiving_client()->data_channel()->Close();
|
| + EXPECT_TRUE_WAIT(!initializing_client()->data_observer()->IsOpen(),
|
| + kMaxWaitMs);
|
| + EXPECT_TRUE_WAIT(!receiving_client()->data_observer()->IsOpen(), kMaxWaitMs);
|
| +}
|
| +
|
| // This test sets up a call between two parties and creates a data channel.
|
| // The test tests that received data is buffered unless an observer has been
|
| // registered.
|
|
|