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

Side by Side Diff: remoting/jingle_glue/iq_sender_unittest.cc

Issue 9452038: Implement timeouts for IQ requests. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix release build Created 8 years, 10 months 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « remoting/jingle_glue/iq_sender.cc ('k') | remoting/jingle_glue/jingle_info_request.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/bind.h" 5 #include "base/bind.h"
6 #include "base/memory/ref_counted.h" 6 #include "base/memory/ref_counted.h"
7 #include "base/message_loop.h"
7 #include "base/stringprintf.h" 8 #include "base/stringprintf.h"
8 #include "remoting/jingle_glue/iq_sender.h" 9 #include "remoting/jingle_glue/iq_sender.h"
9 #include "remoting/jingle_glue/mock_objects.h" 10 #include "remoting/jingle_glue/mock_objects.h"
10 #include "testing/gmock/include/gmock/gmock.h" 11 #include "testing/gmock/include/gmock/gmock.h"
11 #include "testing/gtest/include/gtest/gtest.h" 12 #include "testing/gtest/include/gtest/gtest.h"
12 #include "third_party/libjingle/source/talk/xmllite/xmlelement.h" 13 #include "third_party/libjingle/source/talk/xmllite/xmlelement.h"
13 #include "third_party/libjingle/source/talk/xmpp/constants.h" 14 #include "third_party/libjingle/source/talk/xmpp/constants.h"
14 15
15 using ::testing::_; 16 using ::testing::_;
16 using ::testing::DeleteArg; 17 using ::testing::DeleteArg;
18 using ::testing::InvokeWithoutArgs;
17 using ::testing::NotNull; 19 using ::testing::NotNull;
18 using ::testing::Return; 20 using ::testing::Return;
19 using ::testing::SaveArg; 21 using ::testing::SaveArg;
20 22
21 using ::buzz::QName; 23 using ::buzz::QName;
22 using ::buzz::XmlElement; 24 using ::buzz::XmlElement;
23 25
24 namespace remoting { 26 namespace remoting {
25 27
26 namespace { 28 namespace {
27 29
28 const char kStanzaId[] = "123"; 30 const char kStanzaId[] = "123";
29 const char kNamespace[] = "chromium:testns"; 31 const char kNamespace[] = "chromium:testns";
30 const char kNamespacePrefix[] = "tes"; 32 const char kNamespacePrefix[] = "tes";
31 const char kBodyTag[] = "test"; 33 const char kBodyTag[] = "test";
32 const char kType[] = "get"; 34 const char kType[] = "get";
33 const char kTo[] = "user@domain.com"; 35 const char kTo[] = "user@domain.com";
34 36
35 class MockCallback { 37 class MockCallback {
36 public: 38 public:
37 MOCK_METHOD1(OnReply, void(const XmlElement* reply)); 39 MOCK_METHOD2(OnReply, void(IqRequest* request, const XmlElement* reply));
38 }; 40 };
39 41
40 } // namespace 42 } // namespace
41 43
42 class IqSenderTest : public testing::Test { 44 class IqSenderTest : public testing::Test {
43 public: 45 public:
44 IqSenderTest() { 46 IqSenderTest() {
45 EXPECT_CALL(signal_strategy_, AddListener(NotNull())); 47 EXPECT_CALL(signal_strategy_, AddListener(NotNull()));
46 sender_.reset(new IqSender(&signal_strategy_)); 48 sender_.reset(new IqSender(&signal_strategy_));
47 EXPECT_CALL(signal_strategy_, RemoveListener( 49 EXPECT_CALL(signal_strategy_, RemoveListener(
48 static_cast<SignalStrategy::Listener*>(sender_.get()))); 50 static_cast<SignalStrategy::Listener*>(sender_.get())));
49 } 51 }
50 52
51 protected: 53 protected:
54 void SendTestMessage() {
55 scoped_ptr<XmlElement> iq_body(
56 new XmlElement(QName(kNamespace, kBodyTag)));
57 XmlElement* sent_stanza;
58 EXPECT_CALL(signal_strategy_, GetNextId())
59 .WillOnce(Return(kStanzaId));
60 EXPECT_CALL(signal_strategy_, SendStanzaPtr(_))
61 .WillOnce(DoAll(SaveArg<0>(&sent_stanza), Return(true)));
62 request_ = sender_->SendIq(kType, kTo, iq_body.Pass(), base::Bind(
63 &MockCallback::OnReply, base::Unretained(&callback_)));
64
65 std::string expected_xml_string =
66 base::StringPrintf(
67 "<cli:iq type=\"%s\" to=\"%s\" id=\"%s\" "
68 "xmlns:cli=\"jabber:client\">"
69 "<%s:%s xmlns:%s=\"%s\"/>"
70 "</cli:iq>",
71 kType, kTo, kStanzaId, kNamespacePrefix, kBodyTag,
72 kNamespacePrefix, kNamespace);
73 EXPECT_EQ(expected_xml_string, sent_stanza->Str());
74 delete sent_stanza;
75 }
76
77 MessageLoop message_loop_;
52 MockSignalStrategy signal_strategy_; 78 MockSignalStrategy signal_strategy_;
53 scoped_ptr<IqSender> sender_; 79 scoped_ptr<IqSender> sender_;
54 MockCallback callback_; 80 MockCallback callback_;
81 scoped_ptr<IqRequest> request_;
55 }; 82 };
56 83
57 TEST_F(IqSenderTest, SendIq) { 84 TEST_F(IqSenderTest, SendIq) {
58 scoped_ptr<XmlElement> iq_body( 85 ASSERT_NO_FATAL_FAILURE({
59 new XmlElement(QName(kNamespace, kBodyTag))); 86 SendTestMessage();
60 XmlElement* sent_stanza; 87 });
61 EXPECT_CALL(signal_strategy_, GetNextId())
62 .WillOnce(Return(kStanzaId));
63 EXPECT_CALL(signal_strategy_, SendStanzaPtr(_))
64 .WillOnce(DoAll(SaveArg<0>(&sent_stanza), Return(true)));
65 scoped_ptr<IqRequest> request =
66 sender_->SendIq(kType, kTo, iq_body.Pass(), base::Bind(
67 &MockCallback::OnReply, base::Unretained(&callback_)));
68
69 std::string expected_xml_string =
70 base::StringPrintf(
71 "<cli:iq type=\"%s\" to=\"%s\" id=\"%s\" "
72 "xmlns:cli=\"jabber:client\">"
73 "<%s:%s xmlns:%s=\"%s\"/>"
74 "</cli:iq>",
75 kType, kTo, kStanzaId, kNamespacePrefix, kBodyTag,
76 kNamespacePrefix, kNamespace);
77 EXPECT_EQ(expected_xml_string, sent_stanza->Str());
78 delete sent_stanza;
79 88
80 scoped_ptr<XmlElement> response(new XmlElement(buzz::QN_IQ)); 89 scoped_ptr<XmlElement> response(new XmlElement(buzz::QN_IQ));
81 response->AddAttr(QName("", "type"), "result"); 90 response->AddAttr(QName("", "type"), "result");
82 response->AddAttr(QName("", "id"), kStanzaId); 91 response->AddAttr(QName("", "id"), kStanzaId);
92 response->AddAttr(QName("", "from"), kTo);
83 93
84 XmlElement* result = new XmlElement( 94 XmlElement* result = new XmlElement(
85 QName("test:namespace", "response-body")); 95 QName("test:namespace", "response-body"));
86 response->AddElement(result); 96 response->AddElement(result);
87 97
88 EXPECT_CALL(callback_, OnReply(response.get())); 98 EXPECT_CALL(callback_, OnReply(request_.get(), response.get()));
89 EXPECT_TRUE(sender_->OnSignalStrategyIncomingStanza(response.get())); 99 EXPECT_TRUE(sender_->OnSignalStrategyIncomingStanza(response.get()));
90 } 100 }
91 101
102 TEST_F(IqSenderTest, Timeout) {
103 ASSERT_NO_FATAL_FAILURE({
104 SendTestMessage();
105 });
106
107 request_->SetTimeout(base::TimeDelta::FromMilliseconds(2));
108
109 EXPECT_CALL(callback_, OnReply(request_.get(), NULL))
110 .WillOnce(InvokeWithoutArgs(&message_loop_, &MessageLoop::Quit));
111 message_loop_.Run();
112 }
113
114 TEST_F(IqSenderTest, InvalidFrom) {
115 ASSERT_NO_FATAL_FAILURE({
116 SendTestMessage();
117 });
118
119 scoped_ptr<XmlElement> response(new XmlElement(buzz::QN_IQ));
120 response->AddAttr(QName("", "type"), "result");
121 response->AddAttr(QName("", "id"), kStanzaId);
122 response->AddAttr(QName("", "from"), "different_user@domain.com");
123
124 XmlElement* result = new XmlElement(
125 QName("test:namespace", "response-body"));
126 response->AddElement(result);
127
128 EXPECT_CALL(callback_, OnReply(request_.get(), response.get()))
129 .Times(0);
130 EXPECT_FALSE(sender_->OnSignalStrategyIncomingStanza(response.get()));
131 }
132
133 TEST_F(IqSenderTest, IdMatchingHack) {
134 ASSERT_NO_FATAL_FAILURE({
135 SendTestMessage();
136 });
137
138 scoped_ptr<XmlElement> response(new XmlElement(buzz::QN_IQ));
139 response->AddAttr(QName("", "type"), "result");
140 response->AddAttr(QName("", "id"), "DIFFERENT_ID");
141 response->AddAttr(QName("", "from"), kTo);
142
143 XmlElement* result = new XmlElement(
144 QName("test:namespace", "response-body"));
145 response->AddElement(result);
146
147 EXPECT_CALL(callback_, OnReply(request_.get(), response.get()));
148 EXPECT_TRUE(sender_->OnSignalStrategyIncomingStanza(response.get()));
149 }
150
92 } // namespace remoting 151 } // namespace remoting
OLDNEW
« no previous file with comments | « remoting/jingle_glue/iq_sender.cc ('k') | remoting/jingle_glue/jingle_info_request.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698