Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(103)

Unified Diff: remoting/protocol/jingle_messages_unittest.cc

Issue 2567953002: [Chromoting] Plugin message in JingleMessage (Closed)
Patch Set: Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: remoting/protocol/jingle_messages_unittest.cc
diff --git a/remoting/protocol/jingle_messages_unittest.cc b/remoting/protocol/jingle_messages_unittest.cc
index a72db8636103c769892e8cdfd34a69d434511613..beedc75bc67e1193f64a6a7cdcc6ab4f180898b7 100644
--- a/remoting/protocol/jingle_messages_unittest.cc
+++ b/remoting/protocol/jingle_messages_unittest.cc
@@ -8,6 +8,7 @@
#include "base/logging.h"
#include "base/macros.h"
+#include "base/strings/string_util.h"
#include "remoting/protocol/content_description.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -26,6 +27,39 @@ namespace {
const char kXmlNsNs[] = "http://www.w3.org/2000/xmlns/";
const char kXmlNs[] = "xmlns";
+bool VerifyXml(const XmlElement* exp,
+ const XmlElement* val,
+ std::string* error);
+
+bool VerifyXmlChildrenUnordered(const XmlElement* exp,
+ const XmlElement* val,
+ bool exp_is_expected,
+ std::string* error) {
+ const XmlElement* exp_child = exp->FirstElement();
+ while (exp_child) {
+ const XmlElement* val_child = val->FirstElement();
+ while (val_child) {
+ if (VerifyXml(exp_child, val_child, error)) {
+ break;
+ }
+ val_child = val_child->NextElement();
+ }
+ if (!val_child) {
+ if (error->empty()) {
+ if (exp_is_expected) {
+ *error = "<" + exp_child->Name().Merged() + "> is expected, "
+ "but not found";
+ } else {
+ *error = "Unexpected <" + exp_child->Name().Merged() + "> found";
+ }
+ }
+ return false;
+ }
+ exp_child = exp_child->NextElement();
+ }
+ return true;
+}
+
// Compares two XML blobs and returns true if they are
// equivalent. Otherwise |error| is set to error message that
// specifies the first test.
@@ -72,21 +106,8 @@ bool VerifyXml(const XmlElement* exp,
}
}
- const XmlElement* exp_child = exp->FirstElement();
- const XmlElement* val_child = val->FirstElement();
- while (exp_child && val_child) {
- if (!VerifyXml(exp_child, val_child, error))
- return false;
- exp_child = exp_child->NextElement();
- val_child = val_child->NextElement();
- }
- if (exp_child) {
- *error = "<" + exp_child->Name().Merged() + "> is expected, but not found";
- return false;
- }
-
- if (val_child) {
- *error = "Unexpected <" + val_child->Name().Merged() + "> found";
+ if (!VerifyXmlChildrenUnordered(exp, val, true, error) ||
+ !VerifyXmlChildrenUnordered(val, exp, false, error)) {
return false;
}
@@ -119,6 +140,7 @@ void ParseFormatAndCompare(const char* message_text, JingleMessage* parsed) {
std::unique_ptr<XmlElement> formatted_message(parsed->ToXml());
ASSERT_TRUE(formatted_message.get());
+
EXPECT_TRUE(VerifyXml(source_message.get(), formatted_message.get(), &error))
<< error;
}
@@ -600,5 +622,82 @@ TEST(JingleMessageTest, RemotingErrorCode) {
}
}
+namespace {
+
+void TestPluginMessage(bool insert_before_regular_message) {
Sergey Ulanov 2016/12/12 23:00:03 I doubt it's useful to test for the case when the
Hzj_jie 2016/12/13 00:20:51 I have not found there is a strong sequence requir
Sergey Ulanov 2016/12/14 01:31:50 Yes, both formats are valid. My point was that it'
Hzj_jie 2016/12/14 20:03:48 Updated.
+ const char* kMessageWithPluginTag =
+ "<cli:iq from='user@gmail.com/chromoting016DBB07' "
+ "to='user@gmail.com/chromiumsy5C6A652D' type='set' "
+ "xmlns:cli='jabber:client'><jingle action='$1' "
+ "sid='2227053353' xmlns='urn:xmpp:jingle:1'>$2"
+ "<gr:plugin xmlns:gr='google:remoting'>"
+ "<gr:sometag>some-message</gr:sometag>"
+ "</gr:plugin>$3</jingle></cli:iq>";
+ for (int i = JingleMessage::SESSION_INITIATE;
+ i <= JingleMessage::TRANSPORT_INFO; i++) {
+ JingleMessage::ActionType action_type =
+ static_cast<JingleMessage::ActionType>(i);
+ std::vector<std::string> subst = {
Sergey Ulanov 2016/12/12 23:00:03 subst is not a good name
Hzj_jie 2016/12/13 00:20:51 Done.
+ JingleMessage::GetActionName(action_type)
+ };
+ if (insert_before_regular_message) {
+ subst.emplace_back();
+ }
+ if (action_type == JingleMessage::SESSION_INFO) {
+ subst.push_back("<test-info>test-message</test-info>");
+ } else if (action_type == JingleMessage::SESSION_TERMINATE) {
+ subst.emplace_back();
+ } else if (action_type == JingleMessage::TRANSPORT_INFO) {
Sergey Ulanov 2016/12/12 23:00:03 I don't think we want to allow plugins for transpo
Hzj_jie 2016/12/13 00:20:51 I thought this before, but it would make JingleMes
Sergey Ulanov 2016/12/14 01:31:50 It would make JingleMessage very slightly more com
Hzj_jie 2016/12/14 20:03:48 I think it can make both JingleMessage and JingleS
Sergey Ulanov 2016/12/15 19:18:25 I think complexity comes not only from amount of c
Hzj_jie 2016/12/15 22:41:19 IMO how to handle the message is not part of the f
+ subst.push_back(
+ "<content name='chromoting' creator='initiator'>"
+ "<transport xmlns='google:remoting:webrtc'>"
+ "<credentials channel='event' ufrag='tPUyEAmQrEw3y7hi' "
+ "password='2iRdhLfawKZC5ydJ'/>"
+ "<credentials channel='video' ufrag='EPK3CXo5sTLJSez0' "
+ "password='eM0VUfUkZ+1Pyi0M'/>"
+ "<candidate name='event' foundation='725747215' "
+ "address='172.23.164.186' port='59089' type='local' "
+ "protocol='udp' priority='2122194688' generation='0'/>"
+ "<candidate name='video' foundation='3623806809' "
+ "address='172.23.164.186' port='57040' type='local' "
+ "protocol='udp' priority='2122194688' generation='0'/>"
+ "</transport>"
+ "</content>");
+ } else {
+ subst.push_back("<content name='chromoting' creator='initiator'>"
+ "<description xmlns='google:remoting'>"
+ "<authentication><auth-token>"
+ "j7whCMii0Z0AAPwj7whCM/j7whCMii0Z0AAPw="
+ "</auth-token></authentication>"
+ "</description>"
+ "<transport xmlns='google:remoting:webrtc' />"
+ "</content>");
+ }
+ if (!insert_before_regular_message) {
+ subst.emplace_back();
+ }
+ std::string message_str = base::ReplaceStringPlaceholders(
+ kMessageWithPluginTag, subst, nullptr);
+
+ JingleMessage message;
+ ParseFormatAndCompare(message_str.c_str(), &message);
+
+ EXPECT_TRUE(message.plugin_message);
+ XmlElement expected(QName("google:remoting", "plugin"));
+ expected.AddElement(new XmlElement(QName("google:remoting", "sometag")));
+ expected.FirstElement()->SetBodyText("some-message");
+ std::string error;
+ EXPECT_TRUE(VerifyXml(&expected, message.plugin_message.get(), &error))
+ << error;
+ }
+}
+
+} // namespace
+
+TEST(JingleMessageTest, PluginMessage) {
+ TestPluginMessage(false);
+ TestPluginMessage(true);
+}
+
} // namespace protocol
} // namespace remoting
« remoting/protocol/jingle_messages.h ('K') | « remoting/protocol/jingle_messages.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698