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

Side by Side Diff: remoting/signaling/fake_signal_strategy.cc

Issue 2417913002: Process incoming IQs in the same order that they were sent. (Closed)
Patch Set: Reviewer's feedback Created 4 years, 2 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
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "remoting/signaling/fake_signal_strategy.h" 5 #include "remoting/signaling/fake_signal_strategy.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/location.h" 10 #include "base/location.h"
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
56 base::Unretained(peer), 56 base::Unretained(peer),
57 peer_callback)); 57 peer_callback));
58 } 58 }
59 } 59 }
60 60
61 void FakeSignalStrategy::SetLocalJid(const std::string& jid) { 61 void FakeSignalStrategy::SetLocalJid(const std::string& jid) {
62 DCHECK(CalledOnValidThread()); 62 DCHECK(CalledOnValidThread());
63 jid_ = jid; 63 jid_ = jid;
64 } 64 }
65 65
66 void FakeSignalStrategy::SimulatePackgeReordering() {
67 DCHECK(CalledOnValidThread());
68 simulate_reorder_ = true;
69 }
70
66 void FakeSignalStrategy::Connect() { 71 void FakeSignalStrategy::Connect() {
67 DCHECK(CalledOnValidThread()); 72 DCHECK(CalledOnValidThread());
68 FOR_EACH_OBSERVER(Listener, listeners_, 73 FOR_EACH_OBSERVER(Listener, listeners_,
69 OnSignalStrategyStateChange(CONNECTED)); 74 OnSignalStrategyStateChange(CONNECTED));
70 } 75 }
71 76
72 void FakeSignalStrategy::Disconnect() { 77 void FakeSignalStrategy::Disconnect() {
73 DCHECK(CalledOnValidThread()); 78 DCHECK(CalledOnValidThread());
74 FOR_EACH_OBSERVER(Listener, listeners_, 79 FOR_EACH_OBSERVER(Listener, listeners_,
75 OnSignalStrategyStateChange(DISCONNECTED)); 80 OnSignalStrategyStateChange(DISCONNECTED));
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
128 std::unique_ptr<buzz::XmlElement> stanza) { 133 std::unique_ptr<buzz::XmlElement> stanza) {
129 thread->PostTask(FROM_HERE, 134 thread->PostTask(FROM_HERE,
130 base::Bind(&FakeSignalStrategy::OnIncomingMessage, 135 base::Bind(&FakeSignalStrategy::OnIncomingMessage,
131 target, base::Passed(&stanza))); 136 target, base::Passed(&stanza)));
132 } 137 }
133 138
134 void FakeSignalStrategy::OnIncomingMessage( 139 void FakeSignalStrategy::OnIncomingMessage(
135 std::unique_ptr<buzz::XmlElement> stanza) { 140 std::unique_ptr<buzz::XmlElement> stanza) {
136 DCHECK(CalledOnValidThread()); 141 DCHECK(CalledOnValidThread());
137 142
143 if (!simulate_reorder_) {
144 NotifyListeners(std::move(stanza));
145 return;
146 }
147
148 // Simulate IQ message re-ordering by swapping the delivery order of the 2nd
149 // session-info message and the first transport-info message.
150 const buzz::XmlElement* jingle =
151 stanza->FirstNamed(buzz::QName("urn:xmpp:jingle:1", "jingle"));
152 std::string action = jingle->Attr(buzz::QName("", "action"));
153
154 if (action != "session-info" && action != "transport-info") {
Sergey Ulanov 2016/10/19 21:23:39 I don't think we really need this logic here. The
kelvinp 2016/10/21 00:26:03 Done.
155 NotifyListeners(std::move(stanza));
156 return;
157 }
158
159 if (action == "session-info") {
160 session_info_counts_++;
161 // Only reorder the 2nd session-info message.
162 if (session_info_counts_ == 2) {
163 pending_session_info_ = std::move(stanza);
164 } else {
165 NotifyListeners(std::move(stanza));
166 }
167 } else if (action == "transport-info" && session_info_counts_ == 2) {
168 NotifyListeners(std::move(stanza));
169 NotifyListeners(std::move(pending_session_info_));
170 pending_session_info_.reset();
171 simulate_reorder_ = false;
172 }
173 }
174
175 void FakeSignalStrategy::NotifyListeners(
176 std::unique_ptr<buzz::XmlElement> stanza) {
177 DCHECK(CalledOnValidThread());
178
138 buzz::XmlElement* stanza_ptr = stanza.get(); 179 buzz::XmlElement* stanza_ptr = stanza.get();
139 received_messages_.push_back(stanza.release()); 180 received_messages_.push_back(stanza.release());
140 181
141 const std::string& to_field = stanza_ptr->Attr(buzz::QN_TO); 182 const std::string& to_field = stanza_ptr->Attr(buzz::QN_TO);
142 if (to_field != jid_) { 183 if (to_field != jid_) {
143 LOG(WARNING) << "Dropping stanza that is addressed to " << to_field 184 LOG(WARNING) << "Dropping stanza that is addressed to " << to_field
144 << ". Local jid: " << jid_ 185 << ". Local jid: " << jid_
145 << ". Message content: " << stanza_ptr->Str(); 186 << ". Message content: " << stanza_ptr->Str();
146 return; 187 return;
147 } 188 }
148 189
149 base::ObserverListBase<Listener>::Iterator it(&listeners_); 190 base::ObserverListBase<Listener>::Iterator it(&listeners_);
150 Listener* listener; 191 Listener* listener;
151 while ((listener = it.GetNext()) != nullptr) { 192 while ((listener = it.GetNext()) != nullptr) {
152 if (listener->OnSignalStrategyIncomingStanza(stanza_ptr)) 193 if (listener->OnSignalStrategyIncomingStanza(stanza_ptr))
153 break; 194 break;
154 } 195 }
155 } 196 }
156 197
157 void FakeSignalStrategy::SetPeerCallback(const PeerCallback& peer_callback) { 198 void FakeSignalStrategy::SetPeerCallback(const PeerCallback& peer_callback) {
158 peer_callback_ = peer_callback; 199 peer_callback_ = peer_callback;
159 } 200 }
160 201
161 } // namespace remoting 202 } // namespace remoting
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698