Index: remoting/protocol/ordered_message_queue_unittest.cc |
diff --git a/remoting/protocol/ordered_message_queue_unittest.cc b/remoting/protocol/ordered_message_queue_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..0e1ac23141ee9074ba222dbc8dfd791a55f4852e |
--- /dev/null |
+++ b/remoting/protocol/ordered_message_queue_unittest.cc |
@@ -0,0 +1,113 @@ |
+// Copyright 2016 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 "remoting/protocol/ordered_message_queue.h" |
+ |
+#include "base/test/gtest_util.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+#include "third_party/webrtc/libjingle/xmllite/xmlelement.h" |
+#include "third_party/webrtc/libjingle/xmpp/constants.h" |
+ |
+using buzz::XmlElement; |
+ |
+namespace remoting { |
+ |
+namespace { |
+ |
+std::unique_ptr<XmlElement> CreateIq(std::string type, std::string id) { |
+ std::unique_ptr<XmlElement> iq( |
+ XmlElement::ForStr("<iq from='from@gmail.com' to='to@gmail.com'></iq>")); |
+ iq->AddAttr(buzz::QN_ID, id); |
+ iq->AddAttr(buzz::QN_TYPE, type); |
+ return iq; |
+} |
+ |
+void AssertIqEquals(std::list<std::string> expected_ids, |
+ std::list<std::unique_ptr<XmlElement>> iqs) { |
+ ASSERT_EQ(expected_ids.size(), iqs.size()); |
+ auto iq_it = iqs.begin(); |
+ for (auto id_it = expected_ids.begin(); iq_it != iqs.end(); |
+ ++iq_it, ++id_it) { |
+ std::unique_ptr<XmlElement> stanza = std::move(*iq_it); |
+ ASSERT_EQ(*id_it, stanza->Attr(buzz::QN_ID)); |
+ } |
+} |
+ |
+} // namespace |
+ |
+TEST(OrderedMessageQueueTest, OutOfOrderMessages1) { |
+ OrderedMessageQueue<std::unique_ptr<XmlElement>> queue; |
+ std::list<std::unique_ptr<XmlElement>> received; |
+ received = queue.OnIncomingMessage("xyz_1", CreateIq("set", "xyz_1")); |
+ AssertIqEquals({"xyz_1"}, std::move(received)); |
+ received = queue.OnIncomingMessage("xyz_4", CreateIq("set", "xyz_4")); |
+ ASSERT_EQ(0u, received.size()); |
+ received = queue.OnIncomingMessage("xyz_3", CreateIq("set", "xyz_3")); |
+ ASSERT_EQ(0u, received.size()); |
+ received = queue.OnIncomingMessage("xyz_2", CreateIq("set", "xyz_2")); |
+ AssertIqEquals({"xyz_2", "xyz_3", "xyz_4"}, std::move(received)); |
+} |
+ |
+TEST(OrderedMessageQueueTest, OutOfOrderMessages2) { |
+ OrderedMessageQueue<std::unique_ptr<XmlElement>> queue; |
+ std::list<std::unique_ptr<XmlElement>> received; |
+ received = queue.OnIncomingMessage("xyz_1", CreateIq("set", "xyz_1")); |
+ AssertIqEquals({"xyz_1"}, std::move(received)); |
+ received = queue.OnIncomingMessage("xyz_4", CreateIq("set", "xyz_4")); |
+ ASSERT_EQ(0u, received.size()); |
+ received = queue.OnIncomingMessage("xyz_2", CreateIq("set", "xyz_2")); |
+ AssertIqEquals({"xyz_2"}, std::move(received)); |
+ received = queue.OnIncomingMessage("xyz_3", CreateIq("set", "xyz_3")); |
+ AssertIqEquals({"xyz_3", "xyz_4"}, std::move(received)); |
+} |
+ |
+TEST(OrderedMessageQueueTest, DuplicateMessageId1) { |
+ OrderedMessageQueue<std::unique_ptr<XmlElement>> queue; |
+ std::list<std::unique_ptr<XmlElement>> received; |
+ received = queue.OnIncomingMessage("xyz_1", CreateIq("set", "xyz_1")); |
+ AssertIqEquals({"xyz_1"}, std::move(received)); |
+ ASSERT_DCHECK_DEATH( |
+ queue.OnIncomingMessage("xyz_1", CreateIq("set", "xyz_1"))); |
+} |
+ |
+TEST(OrderedMessageQueueTest, DuplicateMessageId2) { |
+ OrderedMessageQueue<std::unique_ptr<XmlElement>> queue; |
+ std::list<std::unique_ptr<XmlElement>> received; |
+ received = queue.OnIncomingMessage("xyz_1", CreateIq("get", "xyz_1")); |
+ AssertIqEquals({"xyz_1"}, std::move(received)); |
+ received = queue.OnIncomingMessage("xyz_4", CreateIq("get", "xyz_4")); |
+ ASSERT_EQ(0u, received.size()); |
+ received = queue.OnIncomingMessage("xyz_3", CreateIq("get", "xyz_3")); |
+ ASSERT_EQ(0u, received.size()); |
+ ASSERT_DCHECK_DEATH( |
+ queue.OnIncomingMessage("xyz_3", CreateIq("get", "xyz_3"))); |
+} |
+ |
+TEST(OrderedMessageQueueTest, InOrderMessages) { |
+ OrderedMessageQueue<std::unique_ptr<XmlElement>> queue; |
+ std::list<std::unique_ptr<XmlElement>> received; |
+ received = queue.OnIncomingMessage("xyz_1", CreateIq("set", "xyz_1")); |
+ AssertIqEquals({"xyz_1"}, std::move(received)); |
+ received = queue.OnIncomingMessage("xyz_2", CreateIq("set", "xyz_2")); |
+ AssertIqEquals({"xyz_2"}, std::move(received)); |
+ received = queue.OnIncomingMessage("xyz_3", CreateIq("set", "xyz_3")); |
+ AssertIqEquals({"xyz_3"}, std::move(received)); |
+ received = queue.OnIncomingMessage("xyz_4", CreateIq("set", "xyz_4")); |
+ AssertIqEquals({"xyz_4"}, std::move(received)); |
+} |
+ |
+TEST(OrderedMessageQueueTest, LegacyMessages) { |
+ OrderedMessageQueue<std::unique_ptr<XmlElement>> queue; |
+ std::list<std::unique_ptr<XmlElement>> received; |
+ received = queue.OnIncomingMessage("1004", CreateIq("set", "1004")); |
+ AssertIqEquals({"1004"}, std::move(received)); |
+ received = queue.OnIncomingMessage("1002", CreateIq("set", "1002")); |
+ AssertIqEquals({"1002"}, std::move(received)); |
+ received = queue.OnIncomingMessage("1003", CreateIq("set", "1003")); |
+ AssertIqEquals({"1003"}, std::move(received)); |
+ received = queue.OnIncomingMessage("1001", CreateIq("set", "1001")); |
+ AssertIqEquals({"1001"}, std::move(received)); |
+} |
+ |
+} // namespace remoting |