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

Side by Side Diff: remoting/webapp/unittests/fallback_signal_strategy_unittest.js

Issue 855003008: Log signal strategy progress to server. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 11 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 (function() { 5 (function() {
6 6
7 'use strict'; 7 'use strict';
8 8
9 var ControllableSignalStrategy = function(jid, stateChangeCallback) { 9 var ControllableSignalStrategy = function(jid, stateChangeCallback) {
10 this.jid = jid; 10 this.jid = jid;
11 this.stateChangeCallback_ = stateChangeCallback; 11 this.stateChangeCallback_ = stateChangeCallback;
12 this.state_ = null; 12 this.state_ = null;
13 this.onIncomingStanzaCallback = function() {}; 13 this.onIncomingStanzaCallback = function() {};
14 this.dispose = sinon.spy(); 14 this.dispose = sinon.spy();
15 this.connect = sinon.spy(); 15 this.connect = sinon.spy();
16 this.sendMessage = sinon.spy(); 16 this.sendMessage = sinon.spy();
17 this.sendConnectionSetupResults = sinon.spy();
17 }; 18 };
18 19
19 ControllableSignalStrategy.prototype.setIncomingStanzaCallback = 20 ControllableSignalStrategy.prototype.setIncomingStanzaCallback =
20 function(onIncomingStanzaCallback) { 21 function(onIncomingStanzaCallback) {
21 this.onIncomingStanzaCallback = 22 this.onIncomingStanzaCallback =
22 onIncomingStanzaCallback ? onIncomingStanzaCallback 23 onIncomingStanzaCallback ? onIncomingStanzaCallback
23 : function() {}; 24 : function() {};
24 } 25 }
25 26
26 ControllableSignalStrategy.prototype.getState = function(message) { 27 ControllableSignalStrategy.prototype.getState = function(message) {
(...skipping 24 matching lines...) Expand all
51 equal(strategy.getState(), state); 52 equal(strategy.getState(), state);
52 } else { 53 } else {
53 ok(!this.externalCallback_.called); 54 ok(!this.externalCallback_.called);
54 } 55 }
55 }; 56 };
56 57
57 var createControllableSignalStrategy = function(jid, callback) { 58 var createControllableSignalStrategy = function(jid, callback) {
58 return new ControllableSignalStrategy(jid, callback); 59 return new ControllableSignalStrategy(jid, callback);
59 }; 60 };
60 61
62 var MockLogToServer = function() {
63 this.logSignalStrategyProgress = sinon.spy();
64 };
65
66 MockLogToServer.prototype.assertProgress = function() {
67 equal(this.logSignalStrategyProgress.callCount, arguments.length);
68 for (var i = 0; i < arguments.length; ++i) {
69 equal(this.logSignalStrategyProgress.getCall(i).args[0], arguments[i]);
70 }
71 };
72
61 var onStateChange = null; 73 var onStateChange = null;
62 var onProgressCallback = null;
63 var onIncomingStanzaCallback = null; 74 var onIncomingStanzaCallback = null;
64 var strategy = null; 75 var strategy = null;
65 var primary = null; 76 var primary = null;
66 var secondary = null; 77 var secondary = null;
78 var logToServer = null;
67 79
68 module('fallback_signal_strategy', { 80 module('fallback_signal_strategy', {
69 setup: function() { 81 setup: function() {
70 onStateChange = sinon.spy(); 82 onStateChange = sinon.spy();
71 onProgressCallback = sinon.spy();
72 onIncomingStanzaCallback = sinon.spy(); 83 onIncomingStanzaCallback = sinon.spy();
73 strategy = new remoting.FallbackSignalStrategy( 84 strategy = new remoting.FallbackSignalStrategy(
74 createControllableSignalStrategy.bind(null, 'primary-jid'), 85 createControllableSignalStrategy.bind(null, 'primary-jid'),
75 createControllableSignalStrategy.bind(null, 'secondary-jid'), 86 createControllableSignalStrategy.bind(null, 'secondary-jid'),
76 onStateChange, 87 onStateChange);
77 onProgressCallback);
78 strategy.setIncomingStanzaCallback(onIncomingStanzaCallback); 88 strategy.setIncomingStanzaCallback(onIncomingStanzaCallback);
79 primary = strategy.primary_; 89 primary = strategy.primary_;
80 secondary = strategy.secondary_; 90 secondary = strategy.secondary_;
91 logToServer = new MockLogToServer();
81 primary.setExternalCallbackForTesting(onStateChange); 92 primary.setExternalCallbackForTesting(onStateChange);
82 secondary.setExternalCallbackForTesting(onStateChange); 93 secondary.setExternalCallbackForTesting(onStateChange);
83 }, 94 },
84 teardown: function() { 95 teardown: function() {
85 onStateChange = null; 96 onStateChange = null;
86 onProgressCallback = null;
87 onIncomingStanzaCallback = null; 97 onIncomingStanzaCallback = null;
88 strategy = null; 98 strategy = null;
89 primary = null; 99 primary = null;
90 secondary = null; 100 secondary = null;
101 logToServer = null;
91 }, 102 },
92 // Assert that the progress callback has been called exactly once
93 // since the last call, and with the specified state.
94 assertProgress: function(state) {
95 ok(onProgressCallback.calledOnce);
96 ok(onProgressCallback.calledWith(state));
97 onProgressCallback.reset();
98 }
99 }); 103 });
100 104
101 test('primary succeeds; send & receive routed to it', 105 test('primary succeeds; send & receive routed to it',
102 function() { 106 function() {
103 ok(!onStateChange.called); 107 ok(!onStateChange.called);
104 ok(!primary.connect.called); 108 ok(!primary.connect.called);
105 strategy.connect('server', 'username', 'authToken'); 109 strategy.connect('server', 'username', 'authToken');
106 ok(primary.connect.calledWith('server', 'username', 'authToken')); 110 ok(primary.connect.calledWith('server', 'username', 'authToken'));
107 111
108 primary.setStateForTesting(remoting.SignalStrategy.State.NOT_CONNECTED, 112 primary.setStateForTesting(remoting.SignalStrategy.State.NOT_CONNECTED,
109 true); 113 true);
110 primary.setStateForTesting(remoting.SignalStrategy.State.CONNECTING, true); 114 primary.setStateForTesting(remoting.SignalStrategy.State.CONNECTING, true);
111 primary.setStateForTesting(remoting.SignalStrategy.State.HANDSHAKE, true); 115 primary.setStateForTesting(remoting.SignalStrategy.State.HANDSHAKE, true);
112 116
113 ok(!onProgressCallback.called);
114 primary.setStateForTesting(remoting.SignalStrategy.State.CONNECTED, true); 117 primary.setStateForTesting(remoting.SignalStrategy.State.CONNECTED, true);
115 this.assertProgress( 118 equal(strategy.getJid(), 'primary-jid');
119
120 strategy.sendConnectionSetupResults(logToServer);
121 logToServer.assertProgress(
116 remoting.FallbackSignalStrategy.Progress.PRIMARY_SUCCEEDED); 122 remoting.FallbackSignalStrategy.Progress.PRIMARY_SUCCEEDED);
117 equal(strategy.getJid(), 'primary-jid');
118 123
119 ok(!onIncomingStanzaCallback.called); 124 ok(!onIncomingStanzaCallback.called);
120 primary.onIncomingStanzaCallback('test-receive-primary'); 125 primary.onIncomingStanzaCallback('test-receive-primary');
121 secondary.onIncomingStanzaCallback('test-receive-secondary'); 126 secondary.onIncomingStanzaCallback('test-receive-secondary');
122 ok(onIncomingStanzaCallback.calledOnce); 127 ok(onIncomingStanzaCallback.calledOnce);
123 ok(onIncomingStanzaCallback.calledWith('test-receive-primary')); 128 ok(onIncomingStanzaCallback.calledWith('test-receive-primary'));
124 129
125 ok(!primary.sendMessage.called); 130 ok(!primary.sendMessage.called);
126 strategy.sendMessage('test-send'); 131 strategy.sendMessage('test-send');
127 ok(primary.sendMessage.calledOnce); 132 ok(primary.sendMessage.calledOnce);
(...skipping 12 matching lines...) Expand all
140 function() { 145 function() {
141 ok(!onStateChange.called); 146 ok(!onStateChange.called);
142 ok(!primary.connect.called); 147 ok(!primary.connect.called);
143 strategy.connect('server', 'username', 'authToken'); 148 strategy.connect('server', 'username', 'authToken');
144 ok(primary.connect.calledWith('server', 'username', 'authToken')); 149 ok(primary.connect.calledWith('server', 'username', 'authToken'));
145 150
146 primary.setStateForTesting(remoting.SignalStrategy.State.NOT_CONNECTED, 151 primary.setStateForTesting(remoting.SignalStrategy.State.NOT_CONNECTED,
147 true); 152 true);
148 primary.setStateForTesting(remoting.SignalStrategy.State.CONNECTING, true); 153 primary.setStateForTesting(remoting.SignalStrategy.State.CONNECTING, true);
149 154
150 ok(!onProgressCallback.called);
151 ok(!secondary.connect.called); 155 ok(!secondary.connect.called);
152 primary.setStateForTesting(remoting.SignalStrategy.State.FAILED, false); 156 primary.setStateForTesting(remoting.SignalStrategy.State.FAILED, false);
153 ok(secondary.connect.calledWith('server', 'username', 'authToken')); 157 ok(secondary.connect.calledWith('server', 'username', 'authToken'));
154 this.assertProgress(
155 remoting.FallbackSignalStrategy.Progress.PRIMARY_FAILED);
156 158
157 secondary.setStateForTesting(remoting.SignalStrategy.State.NOT_CONNECTED, 159 secondary.setStateForTesting(remoting.SignalStrategy.State.NOT_CONNECTED,
158 false); 160 false);
159 secondary.setStateForTesting(remoting.SignalStrategy.State.CONNECTING, 161 secondary.setStateForTesting(remoting.SignalStrategy.State.CONNECTING,
160 false); 162 false);
161 secondary.setStateForTesting(remoting.SignalStrategy.State.HANDSHAKE, true); 163 secondary.setStateForTesting(remoting.SignalStrategy.State.HANDSHAKE, true);
162 164
163 ok(!onProgressCallback.called);
164 secondary.setStateForTesting(remoting.SignalStrategy.State.CONNECTED, true); 165 secondary.setStateForTesting(remoting.SignalStrategy.State.CONNECTED, true);
165 this.assertProgress( 166 equal(strategy.getJid(), 'secondary-jid');
167
168 strategy.sendConnectionSetupResults(logToServer);
169 logToServer.assertProgress(
170 remoting.FallbackSignalStrategy.Progress.PRIMARY_FAILED,
166 remoting.FallbackSignalStrategy.Progress.SECONDARY_SUCCEEDED); 171 remoting.FallbackSignalStrategy.Progress.SECONDARY_SUCCEEDED);
167 equal(strategy.getJid(), 'secondary-jid');
168 172
169 ok(!onIncomingStanzaCallback.called); 173 ok(!onIncomingStanzaCallback.called);
170 primary.onIncomingStanzaCallback('test-receive-primary'); 174 primary.onIncomingStanzaCallback('test-receive-primary');
171 secondary.onIncomingStanzaCallback('test-receive-secondary'); 175 secondary.onIncomingStanzaCallback('test-receive-secondary');
172 ok(onIncomingStanzaCallback.calledOnce); 176 ok(onIncomingStanzaCallback.calledOnce);
173 ok(onIncomingStanzaCallback.calledWith('test-receive-secondary')); 177 ok(onIncomingStanzaCallback.calledWith('test-receive-secondary'));
174 178
175 ok(!secondary.sendMessage.called); 179 ok(!secondary.sendMessage.called);
176 strategy.sendMessage('test-send'); 180 strategy.sendMessage('test-send');
177 ok(!primary.sendMessage.called); 181 ok(!primary.sendMessage.called);
178 ok(secondary.sendMessage.calledOnce); 182 ok(secondary.sendMessage.calledOnce);
179 ok(secondary.sendMessage.calledWith('test-send')); 183 ok(secondary.sendMessage.calledWith('test-send'));
180 } 184 }
181 ); 185 );
182 186
183 test('primary fails; secondary fails', 187 test('primary fails; secondary fails',
184 function() { 188 function() {
185 ok(!onStateChange.called); 189 ok(!onStateChange.called);
186 ok(!primary.connect.called); 190 ok(!primary.connect.called);
187 strategy.connect('server', 'username', 'authToken'); 191 strategy.connect('server', 'username', 'authToken');
188 ok(primary.connect.calledWith('server', 'username', 'authToken')); 192 ok(primary.connect.calledWith('server', 'username', 'authToken'));
189 193
190 primary.setStateForTesting(remoting.SignalStrategy.State.NOT_CONNECTED, 194 primary.setStateForTesting(remoting.SignalStrategy.State.NOT_CONNECTED,
191 true); 195 true);
192 ok(!onProgressCallback.called);
193 ok(!secondary.connect.called); 196 ok(!secondary.connect.called);
194 primary.setStateForTesting(remoting.SignalStrategy.State.CONNECTING, true); 197 primary.setStateForTesting(remoting.SignalStrategy.State.CONNECTING, true);
195 primary.setStateForTesting(remoting.SignalStrategy.State.FAILED, false); 198 primary.setStateForTesting(remoting.SignalStrategy.State.FAILED, false);
196 ok(secondary.connect.calledWith('server', 'username', 'authToken')); 199 ok(secondary.connect.calledWith('server', 'username', 'authToken'));
197 this.assertProgress(
198 remoting.FallbackSignalStrategy.Progress.PRIMARY_FAILED);
Jamie 2015/01/16 22:17:46 If both signaling strategies fail, it's not possib
199 secondary.setStateForTesting(remoting.SignalStrategy.State.NOT_CONNECTED, 200 secondary.setStateForTesting(remoting.SignalStrategy.State.NOT_CONNECTED,
200 false); 201 false);
201 primary.setStateForTesting(remoting.SignalStrategy.State.CONNECTING, false); 202 primary.setStateForTesting(remoting.SignalStrategy.State.CONNECTING, false);
202 secondary.setStateForTesting(remoting.SignalStrategy.State.FAILED, true); 203 secondary.setStateForTesting(remoting.SignalStrategy.State.FAILED, true);
203 this.assertProgress(
204 remoting.FallbackSignalStrategy.Progress.SECONDARY_FAILED);
205 } 204 }
206 ); 205 );
207 206
208 test('primary times out; secondary succeeds', 207 test('primary times out; secondary succeeds',
209 function() { 208 function() {
210 ok(!onStateChange.called); 209 ok(!onStateChange.called);
211 ok(!primary.connect.called); 210 ok(!primary.connect.called);
212 strategy.connect('server', 'username', 'authToken'); 211 strategy.connect('server', 'username', 'authToken');
213 ok(primary.connect.calledWith('server', 'username', 'authToken')); 212 ok(primary.connect.calledWith('server', 'username', 'authToken'));
214 213
215 primary.setStateForTesting(remoting.SignalStrategy.State.NOT_CONNECTED, 214 primary.setStateForTesting(remoting.SignalStrategy.State.NOT_CONNECTED,
216 true); 215 true);
217 primary.setStateForTesting(remoting.SignalStrategy.State.CONNECTING, true); 216 primary.setStateForTesting(remoting.SignalStrategy.State.CONNECTING, true);
218 this.clock.tick(strategy.PRIMARY_CONNECT_TIMEOUT_MS_ - 1); 217 this.clock.tick(strategy.PRIMARY_CONNECT_TIMEOUT_MS_ - 1);
219 ok(!secondary.connect.called); 218 ok(!secondary.connect.called);
220 ok(!onProgressCallback.called);
221 this.clock.tick(1); 219 this.clock.tick(1);
222 ok(secondary.connect.calledWith('server', 'username', 'authToken')); 220 ok(secondary.connect.calledWith('server', 'username', 'authToken'));
223 this.assertProgress(
224 remoting.FallbackSignalStrategy.Progress.PRIMARY_TIMED_OUT);
225 secondary.setStateForTesting(remoting.SignalStrategy.State.NOT_CONNECTED, 221 secondary.setStateForTesting(remoting.SignalStrategy.State.NOT_CONNECTED,
226 false); 222 false);
227 secondary.setStateForTesting(remoting.SignalStrategy.State.CONNECTING, 223 secondary.setStateForTesting(remoting.SignalStrategy.State.CONNECTING,
228 false); 224 false);
229 secondary.setStateForTesting(remoting.SignalStrategy.State.HANDSHAKE, true); 225 secondary.setStateForTesting(remoting.SignalStrategy.State.HANDSHAKE, true);
230 secondary.setStateForTesting(remoting.SignalStrategy.State.CONNECTED, true); 226 secondary.setStateForTesting(remoting.SignalStrategy.State.CONNECTED, true);
231 this.assertProgress( 227 strategy.sendConnectionSetupResults(logToServer);
232 remoting.FallbackSignalStrategy.Progress.SECONDARY_SUCCEEDED); 228
233 secondary.setStateForTesting(remoting.SignalStrategy.State.CLOSED, true); 229 secondary.setStateForTesting(remoting.SignalStrategy.State.CLOSED, true);
234 primary.setStateForTesting(remoting.SignalStrategy.State.FAILED, false); 230 primary.setStateForTesting(remoting.SignalStrategy.State.FAILED, false);
235 this.assertProgress( 231
232 logToServer.assertProgress(
233 remoting.FallbackSignalStrategy.Progress.PRIMARY_TIMED_OUT,
234 remoting.FallbackSignalStrategy.Progress.SECONDARY_SUCCEEDED,
236 remoting.FallbackSignalStrategy.Progress.PRIMARY_FAILED_LATE); 235 remoting.FallbackSignalStrategy.Progress.PRIMARY_FAILED_LATE);
237 } 236 }
238 ); 237 );
239 238
240 test('primary times out; secondary fails', 239 test('primary times out; secondary fails',
241 function() { 240 function() {
242 ok(!onStateChange.called); 241 ok(!onStateChange.called);
243 ok(!primary.connect.called); 242 ok(!primary.connect.called);
244 strategy.connect('server', 'username', 'authToken'); 243 strategy.connect('server', 'username', 'authToken');
245 ok(primary.connect.calledWith('server', 'username', 'authToken')); 244 ok(primary.connect.calledWith('server', 'username', 'authToken'));
246 245
247 primary.setStateForTesting(remoting.SignalStrategy.State.NOT_CONNECTED, 246 primary.setStateForTesting(remoting.SignalStrategy.State.NOT_CONNECTED,
248 true); 247 true);
249 primary.setStateForTesting(remoting.SignalStrategy.State.CONNECTING, true); 248 primary.setStateForTesting(remoting.SignalStrategy.State.CONNECTING, true);
250 this.clock.tick(strategy.PRIMARY_CONNECT_TIMEOUT_MS_ - 1); 249 this.clock.tick(strategy.PRIMARY_CONNECT_TIMEOUT_MS_ - 1);
251 ok(!secondary.connect.called); 250 ok(!secondary.connect.called);
252 ok(!onProgressCallback.called);
253 this.clock.tick(1); 251 this.clock.tick(1);
254 ok(secondary.connect.calledWith('server', 'username', 'authToken')); 252 ok(secondary.connect.calledWith('server', 'username', 'authToken'));
255 this.assertProgress(
256 remoting.FallbackSignalStrategy.Progress.PRIMARY_TIMED_OUT);
257 secondary.setStateForTesting(remoting.SignalStrategy.State.NOT_CONNECTED, 253 secondary.setStateForTesting(remoting.SignalStrategy.State.NOT_CONNECTED,
258 false); 254 false);
259 secondary.setStateForTesting(remoting.SignalStrategy.State.CONNECTING, 255 secondary.setStateForTesting(remoting.SignalStrategy.State.CONNECTING,
260 false); 256 false);
261 secondary.setStateForTesting(remoting.SignalStrategy.State.FAILED, true); 257 secondary.setStateForTesting(remoting.SignalStrategy.State.FAILED, true);
262 this.assertProgress(
263 remoting.FallbackSignalStrategy.Progress.SECONDARY_FAILED);
264 } 258 }
265 ); 259 );
266 260
267 test('primary times out; secondary succeeds; primary succeeds late', 261 test('primary times out; secondary succeeds; primary succeeds late',
268 function() { 262 function() {
269 ok(!onStateChange.called); 263 ok(!onStateChange.called);
270 ok(!primary.connect.called); 264 ok(!primary.connect.called);
271 strategy.connect('server', 'username', 'authToken'); 265 strategy.connect('server', 'username', 'authToken');
272 ok(primary.connect.calledWith('server', 'username', 'authToken')); 266 ok(primary.connect.calledWith('server', 'username', 'authToken'));
273 267
274 primary.setStateForTesting(remoting.SignalStrategy.State.NOT_CONNECTED, 268 primary.setStateForTesting(remoting.SignalStrategy.State.NOT_CONNECTED,
275 true); 269 true);
276 primary.setStateForTesting(remoting.SignalStrategy.State.CONNECTING, true); 270 primary.setStateForTesting(remoting.SignalStrategy.State.CONNECTING, true);
277 this.clock.tick(strategy.PRIMARY_CONNECT_TIMEOUT_MS_); 271 this.clock.tick(strategy.PRIMARY_CONNECT_TIMEOUT_MS_);
278 ok(secondary.connect.calledWith('server', 'username', 'authToken')); 272 ok(secondary.connect.calledWith('server', 'username', 'authToken'));
279 this.assertProgress(
280 remoting.FallbackSignalStrategy.Progress.PRIMARY_TIMED_OUT);
281 secondary.setStateForTesting(remoting.SignalStrategy.State.NOT_CONNECTED, 273 secondary.setStateForTesting(remoting.SignalStrategy.State.NOT_CONNECTED,
282 false); 274 false);
283 secondary.setStateForTesting(remoting.SignalStrategy.State.CONNECTING, 275 secondary.setStateForTesting(remoting.SignalStrategy.State.CONNECTING,
284 false); 276 false);
285 secondary.setStateForTesting(remoting.SignalStrategy.State.HANDSHAKE, true); 277 secondary.setStateForTesting(remoting.SignalStrategy.State.HANDSHAKE, true);
286 secondary.setStateForTesting(remoting.SignalStrategy.State.CONNECTED, true); 278 secondary.setStateForTesting(remoting.SignalStrategy.State.CONNECTED, true);
287 this.assertProgress( 279 strategy.sendConnectionSetupResults(logToServer);
288 remoting.FallbackSignalStrategy.Progress.SECONDARY_SUCCEEDED); 280
289 primary.setStateForTesting(remoting.SignalStrategy.State.HANDSHAKE, false); 281 primary.setStateForTesting(remoting.SignalStrategy.State.HANDSHAKE, false);
290 primary.setStateForTesting(remoting.SignalStrategy.State.CONNECTED, false); 282 primary.setStateForTesting(remoting.SignalStrategy.State.CONNECTED, false);
291 this.assertProgress( 283
284 logToServer.assertProgress(
285 remoting.FallbackSignalStrategy.Progress.PRIMARY_TIMED_OUT,
286 remoting.FallbackSignalStrategy.Progress.SECONDARY_SUCCEEDED,
292 remoting.FallbackSignalStrategy.Progress.PRIMARY_SUCCEEDED_LATE); 287 remoting.FallbackSignalStrategy.Progress.PRIMARY_SUCCEEDED_LATE);
293 } 288 }
294 ); 289 );
295 290
296 })(); 291 })();
OLDNEW
« remoting/webapp/crd/js/log_to_server.js ('K') | « remoting/webapp/crd/js/xmpp_connection.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698