10e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/* 20e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * libjingle 30e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Copyright 2004 Google Inc. 40e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 50e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without 60e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * modification, are permitted provided that the following conditions are met: 70e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 80e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 90e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * this list of conditions and the following disclaimer. 100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * this list of conditions and the following disclaimer in the documentation 120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * and/or other materials provided with the distribution. 130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 3. The name of the author may not be used to endorse or promote products 140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * derived from this software without specific prior written permission. 150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org */ 270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/session/media/mediamessages.h" 290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <string> 310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include <vector> 320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/p2p/base/constants.h" 340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/session/media/mediasessionclient.h" 3513b2d035e2e7f2f18e3a4d3377bc1a09f43a4ff9buildbot@webrtc.org#include "webrtc/libjingle/xmllite/xmlelement.h" 36cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/gunit.h" 37cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/scoped_ptr.h" 380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Unit tests for mediamessages.cc. 400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgnamespace cricket { 420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgnamespace { 440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char kViewVideoNoneXml[] = 460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "<view xmlns='google:jingle'" 470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org " name='video1'" 480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org " type='none'" 490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "/>"; 500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass MediaMessagesTest : public testing::Test { 520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public: 530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // CreateMediaSessionDescription uses a static variable cricket::NS_JINGLE_RTP 540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // defined in another file and cannot be used to initialize another static 550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // variable (http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.14) 560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org MediaMessagesTest() 570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org : remote_description_(CreateMediaSessionDescription("audio1", "video1")) { 580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org protected: 610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static std::string ViewVideoStaticVgaXml(const std::string& ssrc) { 620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return "<view xmlns='google:jingle'" 630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org " name='video1'" 640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org " type='static'" 650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org " ssrc='" + ssrc + "'" 660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ">" 670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "<params" 680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org " width='640'" 690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org " height='480'" 700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org " framerate='30'" 710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org " preference='0'" 720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org " />" 730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "</view>"; 740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static cricket::StreamParams CreateStream(const std::string& nick, 770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& name, 780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint32 ssrc1, 790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint32 ssrc2, 800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& semantics, 810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& type, 820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& display) { 830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org StreamParams stream; 840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream.groupid = nick; 850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream.id = name; 860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream.ssrcs.push_back(ssrc1); 870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream.ssrcs.push_back(ssrc2); 880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream.ssrc_groups.push_back( 890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::SsrcGroup(semantics, stream.ssrcs)); 900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream.type = type; 910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org stream.display = display; 920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return stream; 930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static std::string StreamsXml(const std::string& stream1, 960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& stream2) { 970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return "<streams xmlns='google:jingle'>" 980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org + stream1 990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org + stream2 + 1000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "</streams>"; 1010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static std::string StreamXml(const std::string& nick, 1050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& name, 1060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& ssrc1, 1070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& ssrc2, 1080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& semantics, 1090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& type, 1100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& display) { 1110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return "<stream" 1120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org " nick='" + nick + "'" 1130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org " name='" + name + "'" 1140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org " type='" + type + "'" 1150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org " display='" + display + "'" 1160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ">" 1170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "<ssrc>" + ssrc1 + "</ssrc>" 1180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "<ssrc>" + ssrc2 + "</ssrc>" 1190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "<ssrc-group" 1200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org " semantics='" + semantics + "'" 1210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ">" 1220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "<ssrc>" + ssrc1 + "</ssrc>" 1230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "<ssrc>" + ssrc2 + "</ssrc>" 1240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "</ssrc-group>" 1250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "</stream>"; 1260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static std::string HeaderExtensionsXml(const std::string& hdrext1, 1290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& hdrext2) { 1300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return "<rtp:description xmlns:rtp=\"urn:xmpp:jingle:apps:rtp:1\">" 1310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org + hdrext1 1320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org + hdrext2 + 1330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "</rtp:description>"; 1340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static std::string HeaderExtensionXml(const std::string& uri, 1370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& id) { 1380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return "<rtp:rtp-hdrext" 1390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org " uri='" + uri + "'" 1400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org " id='" + id + "'" 1410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "/>"; 1420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static cricket::SessionDescription* CreateMediaSessionDescription( 1450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& audio_content_name, 1460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::string& video_content_name) { 1470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::SessionDescription* desc = new cricket::SessionDescription(); 1480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc->AddContent(audio_content_name, cricket::NS_JINGLE_RTP, 1490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org new cricket::AudioContentDescription()); 1500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc->AddContent(video_content_name, cricket::NS_JINGLE_RTP, 1510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org new cricket::VideoContentDescription()); 1520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return desc; 1530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1557162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org size_t ClearXmlElements(cricket::XmlElements* elements) { 1567162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org size_t size = elements->size(); 1577162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org for (size_t i = 0; i < size; i++) { 1587162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org delete elements->at(i); 1597162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org } 1607162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org elements->clear(); 1617162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org return size; 1627162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org } 1637162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org 1642a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<cricket::SessionDescription> remote_description_; 1650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 1660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} // anonymous namespace 1680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test serializing/deserializing an empty <view> message. 1700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(MediaMessagesTest, ViewNoneToFromXml) { 1710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org buzz::XmlElement* expected_view_elem = 1720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org buzz::XmlElement::ForStr(kViewVideoNoneXml); 1732a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<buzz::XmlElement> action_elem( 1740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org new buzz::XmlElement(QN_JINGLE)); 1750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(cricket::IsJingleViewRequest(action_elem.get())); 1770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org action_elem->AddElement(expected_view_elem); 1780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(cricket::IsJingleViewRequest(action_elem.get())); 1790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::ViewRequest view_request; 1810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::XmlElements actual_view_elems; 1820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::WriteError error; 1830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(cricket::WriteJingleViewRequest( 1850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "video1", view_request, &actual_view_elems, &error)); 1860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(1U, actual_view_elems.size()); 1880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(expected_view_elem->Str(), actual_view_elems[0]->Str()); 1897162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org ClearXmlElements(&actual_view_elems); 1900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::ParseError parse_error; 1920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(cricket::IsJingleViewRequest(action_elem.get())); 1930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(cricket::ParseJingleViewRequest( 1940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org action_elem.get(), &view_request, &parse_error)); 1950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0U, view_request.static_video_views.size()); 1960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test serializing/deserializing an a simple vga <view> message. 1990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(MediaMessagesTest, ViewVgaToFromXml) { 2002a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<buzz::XmlElement> action_elem( 2010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org new buzz::XmlElement(QN_JINGLE)); 2020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org buzz::XmlElement* expected_view_elem1 = 2030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org buzz::XmlElement::ForStr(ViewVideoStaticVgaXml("1234")); 2040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org buzz::XmlElement* expected_view_elem2 = 2050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org buzz::XmlElement::ForStr(ViewVideoStaticVgaXml("2468")); 2060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org action_elem->AddElement(expected_view_elem1); 2070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org action_elem->AddElement(expected_view_elem2); 2080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::ViewRequest view_request; 2100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::XmlElements actual_view_elems; 2110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::WriteError error; 2120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org view_request.static_video_views.push_back(cricket::StaticVideoView( 2140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::StreamSelector(1234), 640, 480, 30)); 2150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org view_request.static_video_views.push_back(cricket::StaticVideoView( 2160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::StreamSelector(2468), 640, 480, 30)); 2170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(cricket::WriteJingleViewRequest( 2190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "video1", view_request, &actual_view_elems, &error)); 2200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_EQ(2U, actual_view_elems.size()); 2220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(expected_view_elem1->Str(), actual_view_elems[0]->Str()); 2230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(expected_view_elem2->Str(), actual_view_elems[1]->Str()); 2247162d28d68ad58802a5a52eca0df59150ee7b9d4henrike@webrtc.org ClearXmlElements(&actual_view_elems); 2250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org view_request.static_video_views.clear(); 2270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::ParseError parse_error; 2280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(cricket::IsJingleViewRequest(action_elem.get())); 2290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(cricket::ParseJingleViewRequest( 2300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org action_elem.get(), &view_request, &parse_error)); 2310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(2U, view_request.static_video_views.size()); 2320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1234U, view_request.static_video_views[0].selector.ssrc); 2330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(640, view_request.static_video_views[0].width); 2340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(480, view_request.static_video_views[0].height); 2350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(30, view_request.static_video_views[0].framerate); 2360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(2468U, view_request.static_video_views[1].selector.ssrc); 2370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test deserializing bad view XML. 2400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(MediaMessagesTest, ParseBadViewXml) { 2412a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<buzz::XmlElement> action_elem( 2420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org new buzz::XmlElement(QN_JINGLE)); 2430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org buzz::XmlElement* view_elem = 2440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org buzz::XmlElement::ForStr(ViewVideoStaticVgaXml("not-an-ssrc")); 2450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org action_elem->AddElement(view_elem); 2460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::ViewRequest view_request; 2480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::ParseError parse_error; 2490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_FALSE(cricket::ParseJingleViewRequest( 2500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org action_elem.get(), &view_request, &parse_error)); 2510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test serializing/deserializing typical streams xml. 2550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(MediaMessagesTest, StreamsToFromXml) { 2562a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<buzz::XmlElement> expected_streams_elem( 2570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org buzz::XmlElement::ForStr( 2580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org StreamsXml( 2590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org StreamXml("nick1", "stream1", "101", "102", 2600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "semantics1", "type1", "display1"), 2610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org StreamXml("nick2", "stream2", "201", "202", 2620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "semantics2", "type2", "display2")))); 2630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::StreamParams> expected_streams; 2650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org expected_streams.push_back(CreateStream("nick1", "stream1", 101U, 102U, 2660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "semantics1", "type1", "display1")); 2670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org expected_streams.push_back(CreateStream("nick2", "stream2", 201U, 202U, 2680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "semantics2", "type2", "display2")); 2690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2702a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<buzz::XmlElement> actual_desc_elem( 2710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org new buzz::XmlElement(QN_JINGLE_RTP_CONTENT)); 2720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::WriteJingleStreams(expected_streams, actual_desc_elem.get()); 2730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const buzz::XmlElement* actual_streams_elem = 2750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org actual_desc_elem->FirstNamed(QN_JINGLE_DRAFT_STREAMS); 2760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(actual_streams_elem != NULL); 2770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(expected_streams_elem->Str(), actual_streams_elem->Str()); 2780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2792a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<buzz::XmlElement> expected_desc_elem( 2800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org new buzz::XmlElement(QN_JINGLE_RTP_CONTENT)); 2810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org expected_desc_elem->AddElement(new buzz::XmlElement( 2820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *expected_streams_elem)); 2830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::StreamParams> actual_streams; 2840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::ParseError parse_error; 2850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(cricket::HasJingleStreams(expected_desc_elem.get())); 2870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(cricket::ParseJingleStreams( 2880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org expected_desc_elem.get(), &actual_streams, &parse_error)); 2890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(2U, actual_streams.size()); 2900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(expected_streams[0], actual_streams[0]); 2910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(expected_streams[1], actual_streams[1]); 2920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test deserializing bad streams xml. 2950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(MediaMessagesTest, StreamsFromBadXml) { 2962a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<buzz::XmlElement> streams_elem( 2970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org buzz::XmlElement::ForStr( 2980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org StreamsXml( 2990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org StreamXml("nick1", "name1", "101", "not-an-ssrc", 3000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "semantics1", "type1", "display1"), 3010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org StreamXml("nick2", "name2", "202", "not-an-ssrc", 3020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "semantics2", "type2", "display2")))); 3032a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<buzz::XmlElement> desc_elem( 3040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org new buzz::XmlElement(QN_JINGLE_RTP_CONTENT)); 3050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc_elem->AddElement(new buzz::XmlElement(*streams_elem)); 3060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::StreamParams> actual_streams; 3080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::ParseError parse_error; 3090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_FALSE(cricket::ParseJingleStreams( 3100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc_elem.get(), &actual_streams, &parse_error)); 3110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 3120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test serializing/deserializing typical RTP Header Extension xml. 3140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(MediaMessagesTest, HeaderExtensionsToFromXml) { 3152a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<buzz::XmlElement> expected_desc_elem( 3160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org buzz::XmlElement::ForStr( 3170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org HeaderExtensionsXml( 3180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org HeaderExtensionXml("abc", "123"), 3190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org HeaderExtensionXml("def", "456")))); 3200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::RtpHeaderExtension> expected_hdrexts; 3220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org expected_hdrexts.push_back(RtpHeaderExtension("abc", 123)); 3230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org expected_hdrexts.push_back(RtpHeaderExtension("def", 456)); 3240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3252a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<buzz::XmlElement> actual_desc_elem( 3260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org new buzz::XmlElement(QN_JINGLE_RTP_CONTENT)); 3270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::WriteJingleRtpHeaderExtensions(expected_hdrexts, actual_desc_elem.get()); 3280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(actual_desc_elem != NULL); 3300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(expected_desc_elem->Str(), actual_desc_elem->Str()); 3310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::RtpHeaderExtension> actual_hdrexts; 3330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::ParseError parse_error; 3340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_TRUE(cricket::ParseJingleRtpHeaderExtensions( 3350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org expected_desc_elem.get(), &actual_hdrexts, &parse_error)); 3360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(2U, actual_hdrexts.size()); 3370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(expected_hdrexts[0], actual_hdrexts[0]); 3380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(expected_hdrexts[1], actual_hdrexts[1]); 3390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 3400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test deserializing bad RTP header extension xml. 3420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(MediaMessagesTest, HeaderExtensionsFromBadXml) { 3430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<cricket::RtpHeaderExtension> actual_hdrexts; 3440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::ParseError parse_error; 3450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3462a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::scoped_ptr<buzz::XmlElement> desc_elem( 3470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org buzz::XmlElement::ForStr( 3480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org HeaderExtensionsXml( 3490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org HeaderExtensionXml("abc", "123"), 3500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org HeaderExtensionXml("def", "not-an-id")))); 3510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_FALSE(cricket::ParseJingleRtpHeaderExtensions( 3520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc_elem.get(), &actual_hdrexts, &parse_error)); 3530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc_elem.reset( 3550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org buzz::XmlElement::ForStr( 3560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org HeaderExtensionsXml( 3570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org HeaderExtensionXml("abc", "123"), 3580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org HeaderExtensionXml("def", "-1")))); 3590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ASSERT_FALSE(cricket::ParseJingleRtpHeaderExtensions( 3600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org desc_elem.get(), &actual_hdrexts, &parse_error)); 3610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 3620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} // namespace cricket 364