diff options
Diffstat (limited to 'remoting/protocol/rtp_video_writer_unittest.cc')
-rw-r--r-- | remoting/protocol/rtp_video_writer_unittest.cc | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/remoting/protocol/rtp_video_writer_unittest.cc b/remoting/protocol/rtp_video_writer_unittest.cc new file mode 100644 index 0000000..ca8a8f4 --- /dev/null +++ b/remoting/protocol/rtp_video_writer_unittest.cc @@ -0,0 +1,178 @@ +// Copyright (c) 2010 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 <string> +#include <vector> + +#include "base/message_loop.h" +#include "base/string_number_conversions.h" +#include "remoting/proto/video.pb.h" +#include "remoting/protocol/fake_session.h" +#include "remoting/protocol/rtp_reader.h" +#include "remoting/protocol/rtp_utils.h" +#include "remoting/protocol/rtp_video_writer.h" +#include "testing/gtest/include/gtest/gtest.h" + +using net::IOBuffer; +using std::string; +using std::vector; + +namespace remoting { +namespace protocol { + +namespace { + +bool ParsePacket(const string& data, RtpPacket* packet) { + int header_size = UnpackRtpHeader( + reinterpret_cast<const uint8*>(&*data.begin()), + data.size(), packet->mutable_header()); + if (header_size < 0) { + return false; + } + + int descriptor_size = UnpackVp8Descriptor( + reinterpret_cast<const uint8*>(&*data.begin()) + header_size, + data.size() - header_size, packet->mutable_vp8_descriptor()); + if (descriptor_size < 0) { + return false; + } + + packet->mutable_payload()->AppendCopyOf( + &*data.begin() + header_size + descriptor_size, + data.size() - header_size - descriptor_size); + + return true; +} + +} // namespace + +class RtpVideoWriterTest : public testing::Test { + protected: + struct ExpectedPacket { + bool first; + Vp8Descriptor::FragmentationInfo fragmentation_info; + bool last; + }; + + virtual void SetUp() { + session_ = new FakeSession(); + writer_.Init(session_); + } + + void InitData(int size) { + data_.resize(size); + for (int i = 0; i < size; ++i) { + data_[i] = static_cast<char>(i); + } + } + + void InitPacket(int size, bool first, bool last) { + InitData(size); + + packet_.reset(new VideoPacket()); + packet_->mutable_format()->set_encoding(VideoPacketFormat::ENCODING_VP8); + if (first) + packet_->set_flags(packet_->flags() | VideoPacket::FIRST_PACKET); + if (last) + packet_->set_flags(packet_->flags() | VideoPacket::LAST_PACKET); + packet_->mutable_data()->assign(data_.begin(), data_.end()); + } + + bool CompareData(const CompoundBuffer& buffer, char* data, int size) { + scoped_refptr<IOBuffer> buffer_data = buffer.ToIOBufferWithSize(); + return buffer.total_bytes() == size && + memcmp(buffer_data->data(), data, size) == 0; + } + + void VerifyResult(const ExpectedPacket expected[], + int count) { + const vector<string>& rtp_packets = + session_->video_rtp_channel()->written_packets(); + ASSERT_EQ(count, static_cast<int>(rtp_packets.size())); + int pos = 0; + for (int i = 0; i < count; ++i) { + SCOPED_TRACE("Packet " + base::IntToString(i)); + + RtpPacket packet; + ASSERT_TRUE(ParsePacket(rtp_packets[i], &packet)); + EXPECT_EQ(expected[i].first, packet.vp8_descriptor().frame_beginning); + EXPECT_EQ(expected[i].last, packet.header().marker); + EXPECT_EQ(expected[i].fragmentation_info, + packet.vp8_descriptor().fragmentation_info); + EXPECT_TRUE(CompareData(packet.payload(), &*data_.begin() + pos, + packet.payload().total_bytes())); + pos += packet.payload().total_bytes(); + } + EXPECT_EQ(pos, static_cast<int>(data_.size())); + } + + scoped_refptr<FakeSession> session_; + RtpVideoWriter writer_; + + MessageLoop message_loop_; + vector<char> data_; + scoped_ptr<VideoPacket> packet_; +}; + +TEST_F(RtpVideoWriterTest, NotFragmented_FirstPacket) { + InitPacket(1024, true, false); + writer_.SendPacket(*packet_); + message_loop_.RunAllPending(); + + ExpectedPacket expected[] = { + { true, Vp8Descriptor::NOT_FRAGMENTED, false } + }; + VerifyResult(expected, arraysize(expected)); +} + +TEST_F(RtpVideoWriterTest, NotFragmented_LastPackes) { + InitPacket(1024, false, true); + writer_.SendPacket(*packet_); + message_loop_.RunAllPending(); + + ExpectedPacket expected[] = { + { false, Vp8Descriptor::NOT_FRAGMENTED, true } + }; + VerifyResult(expected, arraysize(expected)); +} + +TEST_F(RtpVideoWriterTest, TwoFragments_FirstPacket) { + InitPacket(2000, true, false); + writer_.SendPacket(*packet_); + message_loop_.RunAllPending(); + + ExpectedPacket expected[] = { + { true, Vp8Descriptor::FIRST_FRAGMENT, false }, + { false, Vp8Descriptor::LAST_FRAGMENT, false }, + }; + VerifyResult(expected, arraysize(expected)); +} + +TEST_F(RtpVideoWriterTest, TwoFragments_LastPacket) { + InitPacket(2000, false, true); + writer_.SendPacket(*packet_); + message_loop_.RunAllPending(); + + ExpectedPacket expected[] = { + { false, Vp8Descriptor::FIRST_FRAGMENT, false }, + { false, Vp8Descriptor::LAST_FRAGMENT, true }, + }; + VerifyResult(expected, arraysize(expected)); +} + +TEST_F(RtpVideoWriterTest, ThreeFragments) { + InitPacket(3000, true, true); + writer_.SendPacket(*packet_); + message_loop_.RunAllPending(); + + ExpectedPacket expected[] = { + { true, Vp8Descriptor::FIRST_FRAGMENT, false }, + { false, Vp8Descriptor::MIDDLE_FRAGMENT, false }, + { false, Vp8Descriptor::LAST_FRAGMENT, true }, + }; + VerifyResult(expected, arraysize(expected)); +} + +} // namespace protocol +} // namespace remoting |