1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "remoting/protocol/content_description.h"
6
7#include <string>
8
9#include "base/logging.h"
10#include "remoting/protocol/authenticator.h"
11#include "testing/gmock/include/gmock/gmock.h"
12#include "testing/gtest/include/gtest/gtest.h"
13#include "third_party/libjingle/source/talk/xmllite/xmlelement.h"
14
15namespace remoting {
16namespace protocol {
17
18TEST(ContentDescriptionTest, FormatAndParse) {
19  scoped_ptr<CandidateSessionConfig> config =
20      CandidateSessionConfig::CreateDefault();
21  ContentDescription description(
22      config.Pass(), Authenticator::CreateEmptyAuthenticatorMessage());
23  scoped_ptr<buzz::XmlElement> xml(description.ToXml());
24  LOG(ERROR) << xml->Str();
25  scoped_ptr<ContentDescription> parsed(
26      ContentDescription::ParseXml(xml.get()));
27  ASSERT_TRUE(parsed.get());
28  EXPECT_TRUE(description.config()->control_configs() ==
29              parsed->config()->control_configs());
30  EXPECT_TRUE(description.config()->video_configs() ==
31              parsed->config()->video_configs());
32  EXPECT_TRUE(description.config()->event_configs() ==
33              parsed->config()->event_configs());
34  EXPECT_TRUE(description.config()->audio_configs() ==
35              parsed->config()->audio_configs());
36}
37
38// Verify that we can still parse configs with transports that we don't
39// recognize.
40TEST(ContentDescriptionTest, ParseUnknown) {
41  std::string kTestDescription =
42      "<description xmlns=\"google:remoting\">"
43      "  <control transport=\"stream\" version=\"2\"/>"
44      "  <event transport=\"stream\" version=\"2\"/>"
45      "  <event transport=\"new_awesome_transport\" version=\"3\"/>"
46      "  <video transport=\"stream\" version=\"2\" codec=\"vp8\"/>"
47      "  <authentication/>"
48      "</description>";
49  scoped_ptr<buzz::XmlElement> xml(buzz::XmlElement::ForStr(kTestDescription));
50  scoped_ptr<ContentDescription> parsed(
51      ContentDescription::ParseXml(xml.get()));
52  ASSERT_TRUE(parsed.get());
53  EXPECT_EQ(1U, parsed->config()->event_configs().size());
54  EXPECT_TRUE(parsed->config()->event_configs()[0] ==
55              ChannelConfig(ChannelConfig::TRANSPORT_STREAM,
56                            kDefaultStreamVersion,
57                            ChannelConfig::CODEC_UNDEFINED));
58}
59
60// Verify that we can parse configs with none transport without version and
61// codec.
62TEST(ContentDescriptionTest, NoneTransport) {
63  std::string kTestDescription =
64      "<description xmlns=\"google:remoting\">"
65      "  <control transport=\"stream\" version=\"2\"/>"
66      "  <event transport=\"stream\" version=\"2\"/>"
67      "  <event transport=\"stream\" version=\"2\"/>"
68      "  <video transport=\"stream\" version=\"2\" codec=\"vp8\"/>"
69      "  <audio transport=\"none\"/>"
70      "  <authentication/>"
71      "</description>";
72  scoped_ptr<buzz::XmlElement> xml(buzz::XmlElement::ForStr(kTestDescription));
73  scoped_ptr<ContentDescription> parsed(
74      ContentDescription::ParseXml(xml.get()));
75  ASSERT_TRUE(parsed.get());
76  EXPECT_EQ(1U, parsed->config()->audio_configs().size());
77  EXPECT_TRUE(parsed->config()->audio_configs()[0] == ChannelConfig());
78}
79
80// Verify that we can parse configs with none transport with version and
81// codec.
82TEST(ContentDescriptionTest, NoneTransportWithCodec) {
83  std::string kTestDescription =
84      "<description xmlns=\"google:remoting\">"
85      "  <control transport=\"stream\" version=\"2\"/>"
86      "  <event transport=\"stream\" version=\"2\"/>"
87      "  <event transport=\"stream\" version=\"2\"/>"
88      "  <video transport=\"stream\" version=\"2\" codec=\"vp8\"/>"
89      "  <audio transport=\"none\" version=\"2\" codec=\"verbatim\"/>"
90      "  <authentication/>"
91      "</description>";
92  scoped_ptr<buzz::XmlElement> xml(buzz::XmlElement::ForStr(kTestDescription));
93  scoped_ptr<ContentDescription> parsed(
94      ContentDescription::ParseXml(xml.get()));
95  ASSERT_TRUE(parsed.get());
96  EXPECT_EQ(1U, parsed->config()->audio_configs().size());
97  EXPECT_TRUE(parsed->config()->audio_configs()[0] == ChannelConfig());
98}
99
100}  // namespace protocol
101}  // namespace remoting
102
103