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

Side by Side Diff: remoting/host/log_to_server_unittest.cc

Issue 10413035: [Chromoting] LogToServer correctly handles multiple simultaneous connections. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Sync. Created 8 years, 7 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/host/log_to_server.cc ('k') | no next file » | 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/message_loop.h" 5 #include "base/message_loop.h"
6 #include "base/message_loop_proxy.h" 6 #include "base/message_loop_proxy.h"
7 #include "remoting/jingle_glue/mock_objects.h" 7 #include "remoting/jingle_glue/mock_objects.h"
8 #include "remoting/host/log_to_server.h" 8 #include "remoting/host/log_to_server.h"
9 #include "testing/gmock_mutant.h" 9 #include "testing/gmock_mutant.h"
10 #include "testing/gmock/include/gmock/gmock.h" 10 #include "testing/gmock/include/gmock/gmock.h"
11 #include "testing/gtest/include/gtest/gtest.h" 11 #include "testing/gtest/include/gtest/gtest.h"
12 #include "third_party/libjingle/source/talk/xmllite/xmlelement.h" 12 #include "third_party/libjingle/source/talk/xmllite/xmlelement.h"
13 13
14 using buzz::XmlElement;
15 using buzz::QName;
14 using testing::_; 16 using testing::_;
15 using testing::DeleteArg; 17 using testing::DeleteArg;
16 using testing::InSequence; 18 using testing::InSequence;
17 using testing::Return; 19 using testing::Return;
18 20
19 namespace remoting { 21 namespace remoting {
20 22
21 namespace { 23 namespace {
22 24
23 ACTION_P(QuitMainMessageLoop, message_loop) { 25 ACTION_P(QuitMainMessageLoop, message_loop) {
24 message_loop->PostTask(FROM_HERE, MessageLoop::QuitClosure()); 26 message_loop->PostTask(FROM_HERE, MessageLoop::QuitClosure());
25 } 27 }
26 28
29 const char kJabberClientNamespace[] = "jabber:client";
30 const char kChromotingNamespace[] = "google:remoting";
31 const char kClientJid1[] = "client@domain.com/1234";
32 const char kClientJid2[] = "client@domain.com/5678";
33 const char kHostJid[] = "host@domain.com/1234";
34
35 bool IsLogEntryForConnection(XmlElement* node, const char* connection_type) {
36 return (node->Name() == QName(kChromotingNamespace, "entry") &&
37 node->Attr(QName("", "event-name")) == "session-state" &&
38 node->Attr(QName("", "session-state")) == "connected" &&
39 node->Attr(QName("", "role")) == "host" &&
40 node->Attr(QName("", "mode")) == "me2me" &&
41 node->Attr(QName("", "connection-type")) == connection_type);
42 }
43
44 MATCHER_P(IsClientConnected, connection_type, "") {
45 if (arg->Name() != QName(kJabberClientNamespace, "iq")) {
46 return false;
47 }
48 buzz::XmlElement* log_stanza = arg->FirstChild()->AsElement();
49 if (log_stanza->Name() !=QName(kChromotingNamespace, "log")) {
50 return false;
51 }
52 if (log_stanza->NextChild()) {
53 return false;
54 }
55 buzz::XmlElement* log_entry = log_stanza->FirstChild()->AsElement();
56 if (!IsLogEntryForConnection(log_entry, connection_type)) {
57 return false;
58 }
59 if (log_entry->NextChild()) {
60 return false;
61 }
62 return true;
63 }
64
65 MATCHER_P2(IsTwoClientsConnected, connection_type1, connection_type2, "") {
66 if (arg->Name() != QName(kJabberClientNamespace, "iq")) {
67 return false;
68 }
69 buzz::XmlElement* log_stanza = arg->FirstChild()->AsElement();
70 if (log_stanza->Name() !=QName(kChromotingNamespace, "log")) {
71 return false;
72 }
73 if (log_stanza->NextChild()) {
74 return false;
75 }
76 buzz::XmlElement* log_entry = log_stanza->FirstChild()->AsElement();
77 if (!IsLogEntryForConnection(log_entry, connection_type1)) {
78 return false;
79 }
80 log_entry = log_entry->NextChild()->AsElement();
81 if (!IsLogEntryForConnection(log_entry, connection_type2)) {
82 return false;
83 }
84 if (log_entry->NextChild()) {
85 return false;
86 }
87 return true;
88 }
89
90 bool IsLogEntryForDisconnection(XmlElement* node) {
91 return (node->Name() == QName(kChromotingNamespace, "entry") &&
92 node->Attr(QName("", "event-name")) == "session-state" &&
93 node->Attr(QName("", "session-state")) == "closed" &&
94 node->Attr(QName("", "role")) == "host" &&
95 node->Attr(QName("", "mode")) == "me2me");
96 }
97
98 MATCHER(IsClientDisconnected, "") {
99 if (arg->Name() != QName(kJabberClientNamespace, "iq")) {
100 return false;
101 }
102 buzz::XmlElement* log_stanza = arg->FirstChild()->AsElement();
103 if (log_stanza->Name() !=QName(kChromotingNamespace, "log")) {
104 return false;
105 }
106 if (log_stanza->NextChild()) {
107 return false;
108 }
109 buzz::XmlElement* log_entry = log_stanza->FirstChild()->AsElement();
110 if (!IsLogEntryForDisconnection(log_entry)) {
111 return false;
112 }
113 if (log_entry->NextChild()) {
114 return false;
115 }
116 return true;
117 }
118
27 } // namespace 119 } // namespace
28 120
29 class LogToServerTest : public testing::Test { 121 class LogToServerTest : public testing::Test {
30 public: 122 public:
31 LogToServerTest() {} 123 LogToServerTest() {}
32 virtual void SetUp() OVERRIDE { 124 virtual void SetUp() OVERRIDE {
33 message_loop_proxy_ = base::MessageLoopProxy::current(); 125 message_loop_proxy_ = base::MessageLoopProxy::current();
34 EXPECT_CALL(signal_strategy_, AddListener(_)); 126 EXPECT_CALL(signal_strategy_, AddListener(_));
35 log_to_server_.reset( 127 log_to_server_.reset(
36 new LogToServer(NULL, ServerLogEntry::ME2ME, &signal_strategy_)); 128 new LogToServer(NULL, ServerLogEntry::ME2ME, &signal_strategy_));
37 EXPECT_CALL(signal_strategy_, RemoveListener(_)); 129 EXPECT_CALL(signal_strategy_, RemoveListener(_));
38 } 130 }
39 131
40 protected: 132 protected:
41 MessageLoop message_loop_; 133 MessageLoop message_loop_;
42 scoped_refptr<base::MessageLoopProxy> message_loop_proxy_; 134 scoped_refptr<base::MessageLoopProxy> message_loop_proxy_;
43 MockSignalStrategy signal_strategy_; 135 MockSignalStrategy signal_strategy_;
44 scoped_ptr<LogToServer> log_to_server_; 136 scoped_ptr<LogToServer> log_to_server_;
45 }; 137 };
46 138
47 TEST_F(LogToServerTest, SendNow) { 139 TEST_F(LogToServerTest, SendNow) {
48 { 140 {
49 InSequence s; 141 InSequence s;
50 EXPECT_CALL(signal_strategy_, GetLocalJid()) 142 EXPECT_CALL(signal_strategy_, GetLocalJid())
51 .WillRepeatedly(Return("host@domain.com/1234")); 143 .WillRepeatedly(Return(kHostJid));
52 EXPECT_CALL(signal_strategy_, AddListener(_)); 144 EXPECT_CALL(signal_strategy_, AddListener(_));
53 EXPECT_CALL(signal_strategy_, GetNextId()); 145 EXPECT_CALL(signal_strategy_, GetNextId());
54 EXPECT_CALL(signal_strategy_, SendStanzaPtr(_)) 146 EXPECT_CALL(signal_strategy_, SendStanzaPtr(IsClientConnected("direct")))
55 .WillOnce(DoAll(DeleteArg<0>(), Return(true))); 147 .WillOnce(DoAll(DeleteArg<0>(), Return(true)));
56 EXPECT_CALL(signal_strategy_, RemoveListener(_)) 148 EXPECT_CALL(signal_strategy_, RemoveListener(_))
57 .WillOnce(QuitMainMessageLoop(&message_loop_)) 149 .WillOnce(QuitMainMessageLoop(&message_loop_))
58 .RetiresOnSaturation(); 150 .RetiresOnSaturation();
59 } 151 }
60 log_to_server_->OnSignalStrategyStateChange(SignalStrategy::CONNECTED); 152 log_to_server_->OnSignalStrategyStateChange(SignalStrategy::CONNECTED);
61 protocol::TransportRoute route; 153 protocol::TransportRoute route;
62 route.type = protocol::TransportRoute::DIRECT; 154 route.type = protocol::TransportRoute::DIRECT;
63 log_to_server_->OnClientRouteChange("client@domain.com/5678", "video", route); 155 log_to_server_->OnClientRouteChange(kClientJid1, "video", route);
64 log_to_server_->OnClientAuthenticated("client@domain.com/5678"); 156 log_to_server_->OnClientAuthenticated(kClientJid1);
65 log_to_server_->OnClientConnected("client@domain.com/5678"); 157 log_to_server_->OnClientConnected(kClientJid1);
66 log_to_server_->OnSignalStrategyStateChange(SignalStrategy::DISCONNECTED); 158 log_to_server_->OnSignalStrategyStateChange(SignalStrategy::DISCONNECTED);
67 message_loop_.Run(); 159 message_loop_.Run();
68 } 160 }
69 161
70 TEST_F(LogToServerTest, SendLater) { 162 TEST_F(LogToServerTest, SendLater) {
71 protocol::TransportRoute route; 163 protocol::TransportRoute route;
72 route.type = protocol::TransportRoute::DIRECT; 164 route.type = protocol::TransportRoute::DIRECT;
73 log_to_server_->OnClientRouteChange("client@domain.com/5678", "video", route); 165 log_to_server_->OnClientRouteChange(kClientJid1, "video", route);
74 log_to_server_->OnClientAuthenticated("client@domain.com/5678"); 166 log_to_server_->OnClientAuthenticated(kClientJid1);
75 log_to_server_->OnClientConnected("client@domain.com/5678"); 167 log_to_server_->OnClientConnected(kClientJid1);
76 { 168 {
77 InSequence s; 169 InSequence s;
78 EXPECT_CALL(signal_strategy_, GetLocalJid()) 170 EXPECT_CALL(signal_strategy_, GetLocalJid())
79 .WillRepeatedly(Return("host@domain.com/1234")); 171 .WillRepeatedly(Return(kHostJid));
80 EXPECT_CALL(signal_strategy_, AddListener(_)); 172 EXPECT_CALL(signal_strategy_, AddListener(_));
81 EXPECT_CALL(signal_strategy_, GetNextId()); 173 EXPECT_CALL(signal_strategy_, GetNextId());
82 EXPECT_CALL(signal_strategy_, SendStanzaPtr(_)) 174 EXPECT_CALL(signal_strategy_, SendStanzaPtr(IsClientConnected("direct")))
83 .WillOnce(DoAll(DeleteArg<0>(), Return(true))); 175 .WillOnce(DoAll(DeleteArg<0>(), Return(true)));
84 EXPECT_CALL(signal_strategy_, RemoveListener(_)) 176 EXPECT_CALL(signal_strategy_, RemoveListener(_))
85 .WillOnce(QuitMainMessageLoop(&message_loop_)) 177 .WillOnce(QuitMainMessageLoop(&message_loop_))
86 .RetiresOnSaturation(); 178 .RetiresOnSaturation();
87 } 179 }
88 log_to_server_->OnSignalStrategyStateChange(SignalStrategy::CONNECTED); 180 log_to_server_->OnSignalStrategyStateChange(SignalStrategy::CONNECTED);
89 log_to_server_->OnSignalStrategyStateChange(SignalStrategy::DISCONNECTED); 181 log_to_server_->OnSignalStrategyStateChange(SignalStrategy::DISCONNECTED);
90 message_loop_.Run(); 182 message_loop_.Run();
91 } 183 }
92 184
93 TEST_F(LogToServerTest, SendTwoEntriesLater) { 185 TEST_F(LogToServerTest, SendTwoEntriesLater) {
94 protocol::TransportRoute route; 186 protocol::TransportRoute route1;
95 route.type = protocol::TransportRoute::DIRECT; 187 route1.type = protocol::TransportRoute::DIRECT;
96 log_to_server_->OnClientRouteChange("client@domain.com/5678", "video", route); 188 log_to_server_->OnClientRouteChange(kClientJid1, "video", route1);
97 log_to_server_->OnClientAuthenticated("client@domain.com/5678"); 189 log_to_server_->OnClientAuthenticated(kClientJid1);
98 log_to_server_->OnClientConnected("client@domain.com/5678"); 190 log_to_server_->OnClientConnected(kClientJid1);
99 log_to_server_->OnClientAuthenticated("client@domain.com/6789"); 191 protocol::TransportRoute route2;
100 log_to_server_->OnClientConnected("client@domain.com/6789"); 192 route2.type = protocol::TransportRoute::STUN;
193 log_to_server_->OnClientRouteChange(kClientJid2, "video", route2);
194 log_to_server_->OnClientAuthenticated(kClientJid2);
195 log_to_server_->OnClientConnected(kClientJid2);
101 { 196 {
102 InSequence s; 197 InSequence s;
103 EXPECT_CALL(signal_strategy_, GetLocalJid()) 198 EXPECT_CALL(signal_strategy_, GetLocalJid())
104 .WillRepeatedly(Return("host@domain.com/1234")); 199 .WillRepeatedly(Return(kHostJid));
105 EXPECT_CALL(signal_strategy_, AddListener(_)); 200 EXPECT_CALL(signal_strategy_, AddListener(_));
106 EXPECT_CALL(signal_strategy_, GetNextId()); 201 EXPECT_CALL(signal_strategy_, GetNextId());
107 EXPECT_CALL(signal_strategy_, SendStanzaPtr(_)) 202 EXPECT_CALL(signal_strategy_, SendStanzaPtr(
203 IsTwoClientsConnected("direct", "stun")))
108 .WillOnce(DoAll(DeleteArg<0>(), Return(true))); 204 .WillOnce(DoAll(DeleteArg<0>(), Return(true)));
109 EXPECT_CALL(signal_strategy_, RemoveListener(_)) 205 EXPECT_CALL(signal_strategy_, RemoveListener(_))
110 .WillOnce(QuitMainMessageLoop(&message_loop_)) 206 .WillOnce(QuitMainMessageLoop(&message_loop_))
111 .RetiresOnSaturation(); 207 .RetiresOnSaturation();
112 } 208 }
113 log_to_server_->OnSignalStrategyStateChange(SignalStrategy::CONNECTED); 209 log_to_server_->OnSignalStrategyStateChange(SignalStrategy::CONNECTED);
114 log_to_server_->OnSignalStrategyStateChange(SignalStrategy::DISCONNECTED); 210 log_to_server_->OnSignalStrategyStateChange(SignalStrategy::DISCONNECTED);
115 message_loop_.Run(); 211 message_loop_.Run();
116 } 212 }
213
214 TEST_F(LogToServerTest, HandleRouteChangeInUnusualOrder) {
215 {
216 InSequence s;
217 EXPECT_CALL(signal_strategy_, GetLocalJid())
218 .WillRepeatedly(Return(kHostJid));
219 EXPECT_CALL(signal_strategy_, AddListener(_));
220 EXPECT_CALL(signal_strategy_, GetNextId());
221 EXPECT_CALL(signal_strategy_, SendStanzaPtr(IsClientConnected("direct")))
222 .WillOnce(DoAll(DeleteArg<0>(), Return(true)));
223 EXPECT_CALL(signal_strategy_, GetNextId());
224 EXPECT_CALL(signal_strategy_, SendStanzaPtr(IsClientDisconnected()))
225 .WillOnce(DoAll(DeleteArg<0>(), Return(true)));
226 EXPECT_CALL(signal_strategy_, GetNextId());
227 EXPECT_CALL(signal_strategy_, SendStanzaPtr(IsClientConnected("stun")))
228 .WillOnce(DoAll(DeleteArg<0>(), Return(true)));
229 EXPECT_CALL(signal_strategy_, RemoveListener(_))
230 .WillOnce(QuitMainMessageLoop(&message_loop_))
231 .RetiresOnSaturation();
232 }
233 log_to_server_->OnSignalStrategyStateChange(SignalStrategy::CONNECTED);
234 protocol::TransportRoute route1;
235 route1.type = protocol::TransportRoute::DIRECT;
236 log_to_server_->OnClientRouteChange(kClientJid1, "video", route1);
237 log_to_server_->OnClientAuthenticated(kClientJid1);
238 log_to_server_->OnClientConnected(kClientJid1);
239 protocol::TransportRoute route2;
240 route2.type = protocol::TransportRoute::STUN;
241 log_to_server_->OnClientRouteChange(kClientJid2, "video", route2);
242 log_to_server_->OnClientDisconnected(kClientJid1);
243 log_to_server_->OnClientAuthenticated(kClientJid2);
244 log_to_server_->OnClientConnected(kClientJid2);
245 log_to_server_->OnSignalStrategyStateChange(SignalStrategy::DISCONNECTED);
246 message_loop_.Run();
247 }
117 248
118 } // namespace remoting 249 } // namespace remoting
OLDNEW
« no previous file with comments | « remoting/host/log_to_server.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698