| Index: content/browser/renderer_host/p2p/socket_host_unittest.cc
|
| diff --git a/content/browser/renderer_host/p2p/socket_host_unittest.cc b/content/browser/renderer_host/p2p/socket_host_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..06f520d830d67671955524a8ec69526d0511d46e
|
| --- /dev/null
|
| +++ b/content/browser/renderer_host/p2p/socket_host_unittest.cc
|
| @@ -0,0 +1,256 @@
|
| +// Copyright (c) 2014 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "content/browser/renderer_host/p2p/socket_host.h"
|
| +
|
| +#include <vector>
|
| +
|
| +#include "base/memory/scoped_ptr.h"
|
| +#include "content/browser/renderer_host/p2p/socket_host_test_utils.h"
|
| +#include "net/base/ip_endpoint.h"
|
| +#include "testing/gmock/include/gmock/gmock.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +// Rtp message with invalid length.
|
| +static unsigned char kRtpMsgWithInvalidLength[] = {
|
| + 0x94, 0x00, 0x00, 0x00,
|
| + 0x00, 0x00, 0x00, 0x00,
|
| + 0xAA, 0xBB, 0xCC, 0XDD, // SSRC
|
| + 0xDD, 0xCC, 0xBB, 0xAA // Only 1 CSRC, but CC count is 4.
|
| +};
|
| +
|
| +// Rtp message with single byte header extension, invalid extension length.
|
| +static unsigned char kRtpMessageWithInvalidExtnLength[] = {
|
| + 0x90, 0x00, 0x00, 0x00,
|
| + 0x00, 0x00, 0x00, 0x00,
|
| + 0x00, 0x00, 0x00, 0x00,
|
| + 0xBE, 0xDE, 0x0A, 0x00 // Extn length - 0x0A00
|
| +};
|
| +
|
| +// Valid rtp Message with 2 byte header extension.
|
| +static unsigned char kRtpMsgWith2ByteExtnHeader[] = {
|
| + 0x90, 0x00, 0x00, 0x00,
|
| + 0x00, 0x00, 0x00, 0x00,
|
| + 0xAA, 0xBB, 0xCC, 0XDD, // SSRC
|
| + 0x10, 0x00, 0x00, 0x01, // 2 Byte header extension
|
| + 0x01, 0x00, 0x00, 0x00
|
| +};
|
| +
|
| +// Stun Indication message with Zero length
|
| +static unsigned char kTurnSendIndicationMsgWithNoAttributes[] = {
|
| + 0x00, 0x16, 0x00, 0x00, // Zero length
|
| + 0x21, 0x12, 0xA4, 0x42, // magic cookie
|
| + '0', '1', '2', '3', // transaction id
|
| + '4', '5', '6', '7',
|
| + '8', '9', 'a', 'b',
|
| +};
|
| +
|
| +// Stun Send Indication message with invalid length in stun header.
|
| +static unsigned char kTurnSendIndicationMsgWithInvalidLength[] = {
|
| + 0x00, 0x16, 0xFF, 0x00, // length of 0xFF00
|
| + 0x21, 0x12, 0xA4, 0x42, // magic cookie
|
| + '0', '1', '2', '3', // transaction id
|
| + '4', '5', '6', '7',
|
| + '8', '9', 'a', 'b',
|
| +};
|
| +
|
| +// Stun Send Indication message with no DATA attribute in message.
|
| +static unsigned char kTurnSendIndicatinMsgWithNoDataAttribute[] = {
|
| + 0x00, 0x16, 0x00, 0x08, // length of
|
| + 0x21, 0x12, 0xA4, 0x42, // magic cookie
|
| + '0', '1', '2', '3', // transaction id
|
| + '4', '5', '6', '7',
|
| + '8', '9', 'a', 'b',
|
| + 0x00, 0x20, 0x00, 0x04, // Mapped address.
|
| + 0x00, 0x00, 0x00, 0x00
|
| +};
|
| +
|
| +// A valid STUN indication message with a valid RTP header in data attribute
|
| +// payload field and no extension bit set.
|
| +static unsigned char kTurnSendIndicationMsgWithoutRtpExtension[] = {
|
| + 0x00, 0x16, 0x00, 0x18, // length of
|
| + 0x21, 0x12, 0xA4, 0x42, // magic cookie
|
| + '0', '1', '2', '3', // transaction id
|
| + '4', '5', '6', '7',
|
| + '8', '9', 'a', 'b',
|
| + 0x00, 0x20, 0x00, 0x04, // Mapped address.
|
| + 0x00, 0x00, 0x00, 0x00,
|
| + 0x00, 0x13, 0x00, 0x0C, // Data attribute.
|
| + 0x80, 0x00, 0x00, 0x00, // RTP packet.
|
| + 0x00, 0x00, 0x00, 0x00,
|
| + 0x00, 0x00, 0x00, 0x00,
|
| +};
|
| +
|
| +// A valid STUN indication message with a valid RTP header and a extension
|
| +// header.
|
| +static unsigned char kTurnSendIndicationMsgWithSendTimeExtension[] = {
|
| + 0x00, 0x16, 0x00, 0x20, // length of
|
| + 0x21, 0x12, 0xA4, 0x42, // magic cookie
|
| + '0', '1', '2', '3', // transaction id
|
| + '4', '5', '6', '7',
|
| + '8', '9', 'a', 'b',
|
| + 0x00, 0x20, 0x00, 0x04, // Mapped address.
|
| + 0x00, 0x00, 0x00, 0x00,
|
| + 0x00, 0x13, 0x00, 0x14, // Data attribute.
|
| + 0x90, 0x00, 0x00, 0x00, // RTP packet.
|
| + 0x00, 0x00, 0x00, 0x00,
|
| + 0x00, 0x00, 0x00, 0x00,
|
| + 0xBE, 0xDE, 0x00, 0x01,
|
| + 0x32, 0xaa, 0xbb, 0xcc,
|
| +};
|
| +
|
| +// A valid TURN channel header, but not RTP packet.
|
| +static unsigned char kTurnChannelMessage[] = {
|
| + 0x40, 0x00, 0x00, 0x04,
|
| + 0xaa, 0xbb, 0xcc, 0xdd,
|
| +};
|
| +
|
| +// Turn ChannelMessage with zero length of payload.
|
| +static unsigned char kTurnChannelMessageWithZeroLength[] = {
|
| + 0x40, 0x00, 0x00, 0x00
|
| +};
|
| +
|
| +// RTP packet with single byte extension header of length 4 bytes.
|
| +// Extension id = 3 and length = 3
|
| +static unsigned char kRtpPacketWithSendTimeExtension[] = {
|
| + 0x90, 0x00, 0x00, 0x00,
|
| + 0x00, 0x00, 0x00, 0x00,
|
| + 0x00, 0x00, 0x00, 0x00,
|
| + 0xBE, 0xDE, 0x00, 0x01,
|
| + 0x32, 0xaa, 0xbb, 0xcc,
|
| +};
|
| +
|
| +namespace content {
|
| +
|
| +class P2PSocketHostForTest : public P2PSocketHost {
|
| + public:
|
| + P2PSocketHostForTest(IPC::Sender* message_sender, int id)
|
| + : P2PSocketHost(message_sender, id) {}
|
| + virtual ~P2PSocketHostForTest() {}
|
| +
|
| + virtual bool Init(const net::IPEndPoint& local_address,
|
| + const net::IPEndPoint& remote_address) OVERRIDE {
|
| + return true;
|
| + }
|
| +
|
| + virtual void Send(const net::IPEndPoint& to,
|
| + const std::vector<char>& data,
|
| + const talk_base::PacketOptions& options,
|
| + uint64 packet_id) OVERRIDE {
|
| + }
|
| +
|
| + virtual P2PSocketHost* AcceptIncomingTcpConnection(
|
| + const net::IPEndPoint& remote_address, int id) OVERRIDE {
|
| + return NULL;
|
| + }
|
| +
|
| + virtual bool SetOption(P2PSocketOption option, int value) OVERRIDE {
|
| + return true;
|
| + }
|
| +
|
| + using P2PSocketHost::MaybeUpdateRtpSendTimeExtn;
|
| + using P2PSocketHost::GetRtpPacketStartPositionAndLength;
|
| + using P2PSocketHost::UpdateSendTimeExtnValue;
|
| + using P2PSocketHost::MaybeUpdateRtpAuthTag;
|
| +};
|
| +
|
| +class P2PSocketHostTest : public testing::Test {
|
| + public:
|
| + virtual void SetUp() OVERRIDE {
|
| + socket_host_.reset(new P2PSocketHostForTest(&sender_, 0));
|
| + }
|
| +
|
| + MockIPCSender sender_;
|
| + scoped_ptr<P2PSocketHostForTest> socket_host_;
|
| +};
|
| +
|
| +// This test verifies parsing of all invalid packets.
|
| +TEST_F(P2PSocketHostTest, TestInvalidRtpMessages) {
|
| + int start_pos, rtp_length;
|
| + EXPECT_FALSE(socket_host_->GetRtpPacketStartPositionAndLength(
|
| + reinterpret_cast<char*>(kRtpMsgWithInvalidLength),
|
| + sizeof(kRtpMsgWithInvalidLength),
|
| + &start_pos, &rtp_length));
|
| +
|
| + EXPECT_FALSE(socket_host_->GetRtpPacketStartPositionAndLength(
|
| + reinterpret_cast<char*>(kRtpMessageWithInvalidExtnLength),
|
| + sizeof(kRtpMessageWithInvalidExtnLength),
|
| + &start_pos, &rtp_length));
|
| +
|
| + EXPECT_FALSE(socket_host_->GetRtpPacketStartPositionAndLength(
|
| + reinterpret_cast<char*>(kTurnSendIndicationMsgWithNoAttributes),
|
| + sizeof(kTurnSendIndicationMsgWithNoAttributes),
|
| + &start_pos, &rtp_length));
|
| +
|
| + EXPECT_FALSE(socket_host_->GetRtpPacketStartPositionAndLength(
|
| + reinterpret_cast<char*>(kTurnSendIndicationMsgWithInvalidLength),
|
| + sizeof(kTurnSendIndicationMsgWithInvalidLength),
|
| + &start_pos, &rtp_length));
|
| +
|
| + EXPECT_FALSE(socket_host_->GetRtpPacketStartPositionAndLength(
|
| + reinterpret_cast<char*>(kTurnSendIndicatinMsgWithNoDataAttribute),
|
| + sizeof(kTurnSendIndicatinMsgWithNoDataAttribute),
|
| + &start_pos, &rtp_length));
|
| +
|
| + EXPECT_FALSE(socket_host_->GetRtpPacketStartPositionAndLength(
|
| + reinterpret_cast<char*>(kTurnChannelMessage),
|
| + sizeof(kTurnChannelMessage),
|
| + &start_pos, &rtp_length));
|
| +
|
| + EXPECT_FALSE(socket_host_->GetRtpPacketStartPositionAndLength(
|
| + reinterpret_cast<char*>(kTurnChannelMessageWithZeroLength),
|
| + sizeof(kTurnChannelMessageWithZeroLength),
|
| + &start_pos, &rtp_length));
|
| +}
|
| +
|
| +// This test verifies seraching of RTP exension ID supplied as input in a
|
| +// RTP packet. If it finds it will be update the the timestamp.
|
| +TEST_F(P2PSocketHostTest, TestUpdateRtpAbsSendTimeExtension) {
|
| + int start_pos, rtp_length;
|
| + EXPECT_TRUE(socket_host_->GetRtpPacketStartPositionAndLength(
|
| + reinterpret_cast<char*>(kRtpMsgWith2ByteExtnHeader),
|
| + sizeof(kRtpMsgWith2ByteExtnHeader),
|
| + &start_pos, &rtp_length));
|
| + EXPECT_EQ(20, rtp_length);
|
| + EXPECT_EQ(0, start_pos);
|
| +
|
| + EXPECT_FALSE(socket_host_->MaybeUpdateRtpSendTimeExtn(
|
| + reinterpret_cast<char*>(kRtpMsgWith2ByteExtnHeader),
|
| + sizeof(kRtpMsgWith2ByteExtnHeader), 3));
|
| +
|
| + EXPECT_TRUE(socket_host_->GetRtpPacketStartPositionAndLength(
|
| + reinterpret_cast<char*>(kTurnSendIndicationMsgWithoutRtpExtension),
|
| + sizeof(kTurnSendIndicationMsgWithoutRtpExtension),
|
| + &start_pos, &rtp_length));
|
| + EXPECT_EQ(12, rtp_length);
|
| + EXPECT_EQ(32, start_pos);
|
| +
|
| + EXPECT_TRUE(socket_host_->MaybeUpdateRtpSendTimeExtn(
|
| + reinterpret_cast<char*>(kTurnSendIndicationMsgWithoutRtpExtension),
|
| + sizeof(kTurnSendIndicationMsgWithoutRtpExtension), 3));
|
| +
|
| + EXPECT_TRUE(socket_host_->GetRtpPacketStartPositionAndLength(
|
| + reinterpret_cast<char*>(kTurnSendIndicationMsgWithSendTimeExtension),
|
| + sizeof(kTurnSendIndicationMsgWithSendTimeExtension),
|
| + &start_pos, &rtp_length));
|
| + EXPECT_EQ(20, rtp_length);
|
| + EXPECT_EQ(32, start_pos);
|
| +
|
| + EXPECT_TRUE(socket_host_->MaybeUpdateRtpSendTimeExtn(
|
| + reinterpret_cast<char*>(kTurnSendIndicationMsgWithSendTimeExtension),
|
| + sizeof(kTurnSendIndicationMsgWithSendTimeExtension), 3));
|
| +
|
| + EXPECT_TRUE(socket_host_->GetRtpPacketStartPositionAndLength(
|
| + reinterpret_cast<char*>(kRtpPacketWithSendTimeExtension),
|
| + sizeof(kRtpPacketWithSendTimeExtension),
|
| + &start_pos, &rtp_length));
|
| + EXPECT_EQ(20, rtp_length);
|
| + EXPECT_EQ(0, start_pos);
|
| +
|
| + EXPECT_TRUE(socket_host_->MaybeUpdateRtpSendTimeExtn(
|
| + reinterpret_cast<char*>(kRtpPacketWithSendTimeExtension),
|
| + sizeof(kRtpPacketWithSendTimeExtension), 3));
|
| +}
|
| +
|
| +} // namespace content
|
|
|