diff options
Diffstat (limited to 'chromium/third_party/libjingle/source/talk/app/webrtc/datachannel_unittest.cc')
-rw-r--r-- | chromium/third_party/libjingle/source/talk/app/webrtc/datachannel_unittest.cc | 199 |
1 files changed, 188 insertions, 11 deletions
diff --git a/chromium/third_party/libjingle/source/talk/app/webrtc/datachannel_unittest.cc b/chromium/third_party/libjingle/source/talk/app/webrtc/datachannel_unittest.cc index fdcd2f2cd11..991ae0cae7a 100644 --- a/chromium/third_party/libjingle/source/talk/app/webrtc/datachannel_unittest.cc +++ b/chromium/third_party/libjingle/source/talk/app/webrtc/datachannel_unittest.cc @@ -26,23 +26,48 @@ */ #include "talk/app/webrtc/datachannel.h" +#include "talk/app/webrtc/sctputils.h" #include "talk/app/webrtc/test/fakedatachannelprovider.h" #include "talk/base/gunit.h" -#include "testing/base/public/gmock.h" using webrtc::DataChannel; class FakeDataChannelObserver : public webrtc::DataChannelObserver { public: - MOCK_METHOD0(OnStateChange, void()); - MOCK_METHOD1(OnMessage, void(const webrtc::DataBuffer& buffer)); + FakeDataChannelObserver() + : messages_received_(0), on_state_change_count_(0) {} + + void OnStateChange() { + ++on_state_change_count_; + } + + void OnMessage(const webrtc::DataBuffer& buffer) { + ++messages_received_; + } + + size_t messages_received() const { + return messages_received_; + } + + void ResetOnStateChangeCount() { + on_state_change_count_ = 0; + } + + size_t on_state_change_count() const { + return on_state_change_count_; + } + + private: + size_t messages_received_; + size_t on_state_change_count_; }; class SctpDataChannelTest : public testing::Test { protected: SctpDataChannelTest() : webrtc_data_channel_( - DataChannel::Create(&provider_, cricket::DCT_SCTP, "test", &init_)) { + DataChannel::Create( + &provider_, cricket::DCT_SCTP, "test", init_)) { } void SetChannelReady() { @@ -59,7 +84,7 @@ class SctpDataChannelTest : public testing::Test { webrtc_data_channel_->RegisterObserver(observer_.get()); } - webrtc::DataChannelInit init_; + webrtc::InternalDataChannelInit init_; FakeDataChannelProvider provider_; talk_base::scoped_ptr<FakeDataChannelObserver> observer_; talk_base::scoped_refptr<DataChannel> webrtc_data_channel_; @@ -69,7 +94,7 @@ class SctpDataChannelTest : public testing::Test { TEST_F(SctpDataChannelTest, ConnectedToTransportOnCreated) { provider_.set_transport_available(true); talk_base::scoped_refptr<DataChannel> dc = DataChannel::Create( - &provider_, cricket::DCT_SCTP, "test1", &init_); + &provider_, cricket::DCT_SCTP, "test1", init_); EXPECT_TRUE(provider_.IsConnected(dc.get())); // The sid is not set yet, so it should not have added the streams. @@ -153,15 +178,69 @@ TEST_F(SctpDataChannelTest, OpenMessageSent) { // state. TEST_F(SctpDataChannelTest, LateCreatedChannelTransitionToOpen) { SetChannelReady(); - webrtc::DataChannelInit init; + webrtc::InternalDataChannelInit init; init.id = 1; - talk_base::scoped_refptr<DataChannel> dc = - DataChannel::Create(&provider_, cricket::DCT_SCTP, "test1", &init); + talk_base::scoped_refptr<DataChannel> dc = DataChannel::Create( + &provider_, cricket::DCT_SCTP, "test1", init); EXPECT_EQ(webrtc::DataChannelInterface::kConnecting, dc->state()); EXPECT_TRUE_WAIT(webrtc::DataChannelInterface::kOpen == dc->state(), 1000); } +// Tests that an unordered DataChannel sends data as ordered until the OPEN_ACK +// message is received. +TEST_F(SctpDataChannelTest, SendUnorderedAfterReceivesOpenAck) { + SetChannelReady(); + webrtc::InternalDataChannelInit init; + init.id = 1; + init.ordered = false; + talk_base::scoped_refptr<DataChannel> dc = DataChannel::Create( + &provider_, cricket::DCT_SCTP, "test1", init); + + EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen, dc->state(), 1000); + + // Sends a message and verifies it's ordered. + webrtc::DataBuffer buffer("some data"); + ASSERT_TRUE(dc->Send(buffer)); + EXPECT_TRUE(provider_.last_send_data_params().ordered); + + // Emulates receiving an OPEN_ACK message. + cricket::ReceiveDataParams params; + params.ssrc = init.id; + params.type = cricket::DMT_CONTROL; + talk_base::Buffer payload; + webrtc::WriteDataChannelOpenAckMessage(&payload); + dc->OnDataReceived(NULL, params, payload); + + // Sends another message and verifies it's unordered. + ASSERT_TRUE(dc->Send(buffer)); + EXPECT_FALSE(provider_.last_send_data_params().ordered); +} + +// Tests that an unordered DataChannel sends unordered data after any DATA +// message is received. +TEST_F(SctpDataChannelTest, SendUnorderedAfterReceiveData) { + SetChannelReady(); + webrtc::InternalDataChannelInit init; + init.id = 1; + init.ordered = false; + talk_base::scoped_refptr<DataChannel> dc = DataChannel::Create( + &provider_, cricket::DCT_SCTP, "test1", init); + + EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen, dc->state(), 1000); + + // Emulates receiving a DATA message. + cricket::ReceiveDataParams params; + params.ssrc = init.id; + params.type = cricket::DMT_TEXT; + webrtc::DataBuffer buffer("data"); + dc->OnDataReceived(NULL, params, buffer.data); + + // Sends a message and verifies it's unordered. + ASSERT_TRUE(dc->Send(buffer)); + EXPECT_FALSE(provider_.last_send_data_params().ordered); +} + // Tests that messages are sent with the right ssrc. TEST_F(SctpDataChannelTest, SendDataSsrc) { webrtc_data_channel_->SetSctpSid(1); @@ -177,12 +256,13 @@ TEST_F(SctpDataChannelTest, ReceiveDataWithInvalidSsrc) { SetChannelReady(); AddObserver(); - EXPECT_CALL(*(observer_.get()), OnMessage(testing::_)).Times(0); cricket::ReceiveDataParams params; params.ssrc = 0; webrtc::DataBuffer buffer("abcd"); webrtc_data_channel_->OnDataReceived(NULL, params, buffer.data); + + EXPECT_EQ(0U, observer_->messages_received()); } // Tests that the incoming messages with right ssrcs are acceted. @@ -191,11 +271,108 @@ TEST_F(SctpDataChannelTest, ReceiveDataWithValidSsrc) { SetChannelReady(); AddObserver(); - EXPECT_CALL(*(observer_.get()), OnMessage(testing::_)).Times(1); cricket::ReceiveDataParams params; params.ssrc = 1; webrtc::DataBuffer buffer("abcd"); webrtc_data_channel_->OnDataReceived(NULL, params, buffer.data); + EXPECT_EQ(1U, observer_->messages_received()); +} + +// Tests that no CONTROL message is sent if the datachannel is negotiated and +// not created from an OPEN message. +TEST_F(SctpDataChannelTest, NoMsgSentIfNegotiatedAndNotFromOpenMsg) { + webrtc::InternalDataChannelInit config; + config.id = 1; + config.negotiated = true; + config.open_handshake_role = webrtc::InternalDataChannelInit::kNone; + + SetChannelReady(); + talk_base::scoped_refptr<DataChannel> dc = DataChannel::Create( + &provider_, cricket::DCT_SCTP, "test1", config); + + EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen, dc->state(), 1000); + EXPECT_EQ(0U, provider_.last_send_data_params().ssrc); +} + +// Tests that OPEN_ACK message is sent if the datachannel is created from an +// OPEN message. +TEST_F(SctpDataChannelTest, OpenAckSentIfCreatedFromOpenMessage) { + webrtc::InternalDataChannelInit config; + config.id = 1; + config.negotiated = true; + config.open_handshake_role = webrtc::InternalDataChannelInit::kAcker; + + SetChannelReady(); + talk_base::scoped_refptr<DataChannel> dc = DataChannel::Create( + &provider_, cricket::DCT_SCTP, "test1", config); + + EXPECT_EQ_WAIT(webrtc::DataChannelInterface::kOpen, dc->state(), 1000); + + EXPECT_EQ(static_cast<unsigned int>(config.id), + provider_.last_send_data_params().ssrc); + EXPECT_EQ(cricket::DMT_CONTROL, provider_.last_send_data_params().type); } + +// Tests the OPEN_ACK role assigned by InternalDataChannelInit. +TEST_F(SctpDataChannelTest, OpenAckRoleInitialization) { + webrtc::InternalDataChannelInit init; + EXPECT_EQ(webrtc::InternalDataChannelInit::kOpener, init.open_handshake_role); + EXPECT_FALSE(init.negotiated); + + webrtc::DataChannelInit base; + base.negotiated = true; + webrtc::InternalDataChannelInit init2(base); + EXPECT_EQ(webrtc::InternalDataChannelInit::kNone, init2.open_handshake_role); +} + +// Tests that the DataChannel is closed if the sending buffer is full. +TEST_F(SctpDataChannelTest, ClosedWhenSendBufferFull) { + SetChannelReady(); + webrtc::DataBuffer buffer("abcd"); + provider_.set_send_blocked(true); + + for (size_t i = 0; i < 101; ++i) { + EXPECT_TRUE(webrtc_data_channel_->Send(buffer)); + } + + EXPECT_EQ(webrtc::DataChannelInterface::kClosed, + webrtc_data_channel_->state()); +} + +// Tests that the DataChannel is closed on transport errors. +TEST_F(SctpDataChannelTest, ClosedOnTransportError) { + SetChannelReady(); + webrtc::DataBuffer buffer("abcd"); + provider_.set_transport_error(); + + EXPECT_TRUE(webrtc_data_channel_->Send(buffer)); + + EXPECT_EQ(webrtc::DataChannelInterface::kClosed, + webrtc_data_channel_->state()); +} + +// Tests that a already closed DataChannel does not fire onStateChange again. +TEST_F(SctpDataChannelTest, ClosedDataChannelDoesNotFireOnStateChange) { + AddObserver(); + webrtc_data_channel_->Close(); + // OnStateChange called for kClosing and kClosed. + EXPECT_EQ(2U, observer_->on_state_change_count()); + + observer_->ResetOnStateChangeCount(); + webrtc_data_channel_->RemotePeerRequestClose(); + EXPECT_EQ(0U, observer_->on_state_change_count()); +} + +// Tests that RemotePeerRequestClose closes the local DataChannel. +TEST_F(SctpDataChannelTest, RemotePeerRequestClose) { + AddObserver(); + webrtc_data_channel_->RemotePeerRequestClose(); + + // OnStateChange called for kClosing and kClosed. + EXPECT_EQ(2U, observer_->on_state_change_count()); + EXPECT_EQ(webrtc::DataChannelInterface::kClosed, + webrtc_data_channel_->state()); +} + |