OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 /** | |
6 * @fileoverview | |
7 * TODO(garykac): Create interfaces for LogToServer and SignalStrategy. | |
8 * @suppress {checkTypes|checkVars|reportUnknownTypes|visibility} | |
9 */ | |
10 | |
11 (function() { | |
12 | |
13 'use strict'; | |
14 | |
15 /** @constructor */ | |
16 var MockLogToServer = function(/** QUnit.Assert */ assert) { | |
17 /** @type {(sinon.Spy|Function)} */ | |
18 this.logSignalStrategyProgress = sinon.spy(); | |
19 this.assert_ = assert; | |
20 }; | |
21 | |
22 /** @type {function(...)} */ | |
23 MockLogToServer.prototype.assertProgress = function() { | |
24 this.assert_.equal(this.logSignalStrategyProgress.callCount * 2, | |
25 arguments.length); | |
26 for (var i = 0; i < this.logSignalStrategyProgress.callCount; ++i) { | |
27 this.assert_.equal( | |
28 this.logSignalStrategyProgress.getCall(i).args[0], arguments[2 * i]); | |
29 this.assert_.equal(this.logSignalStrategyProgress.getCall(i).args[1], | |
30 arguments[2 * i + 1]); | |
31 } | |
32 }; | |
33 | |
34 /** @type {(sinon.Spy|function(remoting.SignalStrategy.State))} */ | |
35 var onStateChange = null; | |
36 | |
37 /** @type {(sinon.Spy|function(Element):void)} */ | |
38 var onIncomingStanzaCallback = null; | |
39 | |
40 /** @type {remoting.FallbackSignalStrategy} */ | |
41 var strategy = null; | |
42 | |
43 /** @type {remoting.SignalStrategy} */ | |
44 var primary = null; | |
45 | |
46 /** @type {remoting.SignalStrategy} */ | |
47 var secondary = null; | |
48 | |
49 /** @type {MockLogToServer} */ | |
50 var logToServer = null; | |
51 | |
52 /** | |
53 * @param {QUnit.Assert} assert | |
54 * @param {remoting.MockSignalStrategy} baseSignalStrategy | |
55 * @param {remoting.SignalStrategy.State} state | |
56 * @param {boolean} expectCallback | |
57 */ | |
58 function setState(assert, baseSignalStrategy, state, expectCallback) { | |
59 onStateChange.reset(); | |
60 baseSignalStrategy.setStateForTesting(state); | |
61 | |
62 if (expectCallback) { | |
63 assert.equal(onStateChange.callCount, 1); | |
64 assert.ok(onStateChange.calledWith(state)); | |
65 assert.equal(strategy.getState(), state); | |
66 } else { | |
67 assert.ok(!onStateChange.called); | |
68 } | |
69 } | |
70 | |
71 QUnit.module('fallback_signal_strategy', { | |
72 beforeEach: function(/** QUnit.Assert */ assert) { | |
73 onStateChange = sinon.spy(); | |
74 onIncomingStanzaCallback = sinon.spy(); | |
75 strategy = new remoting.FallbackSignalStrategy( | |
76 new remoting.MockSignalStrategy('primary-jid', | |
77 remoting.SignalStrategy.Type.XMPP), | |
78 new remoting.MockSignalStrategy('secondary-jid', | |
79 remoting.SignalStrategy.Type.WCS)); | |
80 strategy.setStateChangedCallback(onStateChange); | |
81 strategy.setIncomingStanzaCallback(onIncomingStanzaCallback); | |
82 primary = strategy.primary_; | |
83 addSpies(primary); | |
84 secondary = strategy.secondary_; | |
85 addSpies(secondary); | |
86 logToServer = new MockLogToServer(assert); | |
87 }, | |
88 afterEach: function() { | |
89 onStateChange = null; | |
90 onIncomingStanzaCallback = null; | |
91 strategy = null; | |
92 primary = null; | |
93 secondary = null; | |
94 logToServer = null; | |
95 }, | |
96 }); | |
97 | |
98 /** | |
99 * @param {remoting.SignalStrategy} strategy | |
100 */ | |
101 function addSpies(strategy) { | |
102 sinon.spy(strategy, 'connect'); | |
103 sinon.spy(strategy, 'sendMessage'); | |
104 sinon.spy(strategy, 'dispose'); | |
105 } | |
106 | |
107 QUnit.test('primary succeeds; send & receive routed to it', | |
108 function(assert) { | |
109 assert.ok(!onStateChange.called); | |
110 assert.ok(!primary.connect.called); | |
111 strategy.connect('server', 'username', 'authToken'); | |
112 assert.ok(primary.connect.calledWith('server', 'username', 'authToken')); | |
113 | |
114 setState(assert, primary, remoting.SignalStrategy.State.NOT_CONNECTED, | |
115 true); | |
116 setState(assert, primary, remoting.SignalStrategy.State.CONNECTING, true); | |
117 setState(assert, primary, remoting.SignalStrategy.State.HANDSHAKE, true); | |
118 | |
119 setState(assert, primary, remoting.SignalStrategy.State.CONNECTED, true); | |
120 assert.equal(strategy.getJid(), 'primary-jid'); | |
121 | |
122 strategy.sendConnectionSetupResults(logToServer); | |
123 logToServer.assertProgress( | |
124 remoting.SignalStrategy.Type.XMPP, | |
125 remoting.FallbackSignalStrategy.Progress.SUCCEEDED); | |
126 | |
127 assert.ok(!onIncomingStanzaCallback.called); | |
128 primary.onIncomingStanzaCallback_('test-receive-primary'); | |
129 secondary.onIncomingStanzaCallback_('test-receive-secondary'); | |
130 assert.ok(onIncomingStanzaCallback.calledOnce); | |
131 assert.ok(onIncomingStanzaCallback.calledWith('test-receive-primary')); | |
132 | |
133 assert.ok(!primary.sendMessage.called); | |
134 strategy.sendMessage('test-send'); | |
135 assert.ok(primary.sendMessage.calledOnce); | |
136 assert.ok(primary.sendMessage.calledWith('test-send')); | |
137 | |
138 assert.ok(!primary.dispose.called); | |
139 assert.ok(!secondary.dispose.called); | |
140 setState(assert, primary, remoting.SignalStrategy.State.CLOSED, true); | |
141 strategy.dispose(); | |
142 assert.ok(primary.dispose.calledOnce); | |
143 assert.ok(secondary.dispose.calledOnce); | |
144 } | |
145 ); | |
146 | |
147 QUnit.test('primary fails; secondary succeeds; send & receive routed to it', | |
148 function(assert) { | |
149 assert.ok(!onStateChange.called); | |
150 assert.ok(!primary.connect.called); | |
151 strategy.connect('server', 'username', 'authToken'); | |
152 assert.ok(primary.connect.calledWith('server', 'username', 'authToken')); | |
153 | |
154 setState(assert, primary, remoting.SignalStrategy.State.NOT_CONNECTED, | |
155 true); | |
156 setState(assert, primary, remoting.SignalStrategy.State.CONNECTING, true); | |
157 | |
158 assert.ok(!secondary.connect.called); | |
159 setState(assert, primary, remoting.SignalStrategy.State.FAILED, false); | |
160 assert.ok(secondary.connect.calledWith('server', 'username', 'authToken')); | |
161 | |
162 setState(assert, secondary, remoting.SignalStrategy.State.NOT_CONNECTED, | |
163 false); | |
164 setState(assert, secondary, remoting.SignalStrategy.State.CONNECTING, | |
165 false); | |
166 setState(assert, secondary, remoting.SignalStrategy.State.HANDSHAKE, true); | |
167 | |
168 setState(assert, secondary, remoting.SignalStrategy.State.CONNECTED, true); | |
169 assert.equal(strategy.getJid(), 'secondary-jid'); | |
170 | |
171 strategy.sendConnectionSetupResults(logToServer); | |
172 logToServer.assertProgress( | |
173 remoting.SignalStrategy.Type.XMPP, | |
174 remoting.FallbackSignalStrategy.Progress.FAILED, | |
175 remoting.SignalStrategy.Type.WCS, | |
176 remoting.FallbackSignalStrategy.Progress.SUCCEEDED); | |
177 | |
178 assert.ok(!onIncomingStanzaCallback.called); | |
179 primary.onIncomingStanzaCallback_('test-receive-primary'); | |
180 secondary.onIncomingStanzaCallback_('test-receive-secondary'); | |
181 assert.ok(onIncomingStanzaCallback.calledOnce); | |
182 assert.ok(onIncomingStanzaCallback.calledWith('test-receive-secondary')); | |
183 | |
184 assert.ok(!secondary.sendMessage.called); | |
185 strategy.sendMessage('test-send'); | |
186 assert.ok(!primary.sendMessage.called); | |
187 assert.ok(secondary.sendMessage.calledOnce); | |
188 assert.ok(secondary.sendMessage.calledWith('test-send')); | |
189 } | |
190 ); | |
191 | |
192 QUnit.test('primary fails; secondary fails', | |
193 function(assert) { | |
194 assert.ok(!onStateChange.called); | |
195 assert.ok(!primary.connect.called); | |
196 strategy.connect('server', 'username', 'authToken'); | |
197 assert.ok(primary.connect.calledWith('server', 'username', 'authToken')); | |
198 | |
199 setState(assert, primary, remoting.SignalStrategy.State.NOT_CONNECTED, | |
200 true); | |
201 assert.ok(!secondary.connect.called); | |
202 setState(assert, primary, remoting.SignalStrategy.State.CONNECTING, true); | |
203 setState(assert, primary, remoting.SignalStrategy.State.FAILED, false); | |
204 assert.ok(secondary.connect.calledWith('server', 'username', 'authToken')); | |
205 setState(assert, secondary, remoting.SignalStrategy.State.NOT_CONNECTED, | |
206 false); | |
207 setState(assert, primary, remoting.SignalStrategy.State.CONNECTING, false); | |
208 setState(assert, secondary, remoting.SignalStrategy.State.FAILED, true); | |
209 } | |
210 ); | |
211 | |
212 QUnit.test('primary times out; secondary succeeds', | |
213 function(assert) { | |
214 assert.ok(!onStateChange.called); | |
215 assert.ok(!primary.connect.called); | |
216 strategy.connect('server', 'username', 'authToken'); | |
217 assert.ok(primary.connect.calledWith('server', 'username', 'authToken')); | |
218 | |
219 setState(assert, primary, remoting.SignalStrategy.State.NOT_CONNECTED, | |
220 true); | |
221 setState(assert, primary, remoting.SignalStrategy.State.CONNECTING, true); | |
222 this.clock.tick(strategy.PRIMARY_CONNECT_TIMEOUT_MS_ - 1); | |
223 assert.ok(!secondary.connect.called); | |
224 this.clock.tick(1); | |
225 assert.ok(secondary.connect.calledWith('server', 'username', 'authToken')); | |
226 setState(assert, secondary, remoting.SignalStrategy.State.NOT_CONNECTED, | |
227 false); | |
228 setState(assert, secondary, remoting.SignalStrategy.State.CONNECTING, | |
229 false); | |
230 setState(assert, secondary, remoting.SignalStrategy.State.HANDSHAKE, true); | |
231 setState(assert, secondary, remoting.SignalStrategy.State.CONNECTED, true); | |
232 strategy.sendConnectionSetupResults(logToServer); | |
233 | |
234 setState(assert, secondary, remoting.SignalStrategy.State.CLOSED, true); | |
235 setState(assert, primary, remoting.SignalStrategy.State.FAILED, false); | |
236 | |
237 logToServer.assertProgress( | |
238 remoting.SignalStrategy.Type.XMPP, | |
239 remoting.FallbackSignalStrategy.Progress.TIMED_OUT, | |
240 remoting.SignalStrategy.Type.WCS, | |
241 remoting.FallbackSignalStrategy.Progress.SUCCEEDED, | |
242 remoting.SignalStrategy.Type.XMPP, | |
243 remoting.FallbackSignalStrategy.Progress.FAILED_LATE); | |
244 } | |
245 ); | |
246 | |
247 QUnit.test('primary times out; secondary fails', | |
248 function(assert) { | |
249 assert.ok(!onStateChange.called); | |
250 assert.ok(!primary.connect.called); | |
251 strategy.connect('server', 'username', 'authToken'); | |
252 assert.ok(primary.connect.calledWith('server', 'username', 'authToken')); | |
253 | |
254 setState(assert, primary, remoting.SignalStrategy.State.NOT_CONNECTED, | |
255 true); | |
256 setState(assert, primary, remoting.SignalStrategy.State.CONNECTING, true); | |
257 this.clock.tick(strategy.PRIMARY_CONNECT_TIMEOUT_MS_ - 1); | |
258 assert.ok(!secondary.connect.called); | |
259 this.clock.tick(1); | |
260 assert.ok(secondary.connect.calledWith('server', 'username', 'authToken')); | |
261 setState(assert, secondary, remoting.SignalStrategy.State.NOT_CONNECTED, | |
262 false); | |
263 setState(assert, secondary, remoting.SignalStrategy.State.CONNECTING, | |
264 false); | |
265 setState(assert, secondary, remoting.SignalStrategy.State.FAILED, true); | |
266 } | |
267 ); | |
268 | |
269 QUnit.test('primary times out; secondary succeeds; primary succeeds late', | |
270 function(assert) { | |
271 assert.ok(!onStateChange.called); | |
272 assert.ok(!primary.connect.called); | |
273 strategy.connect('server', 'username', 'authToken'); | |
274 assert.ok(primary.connect.calledWith('server', 'username', 'authToken')); | |
275 | |
276 setState(assert, primary, remoting.SignalStrategy.State.NOT_CONNECTED, | |
277 true); | |
278 setState(assert, primary, remoting.SignalStrategy.State.CONNECTING, true); | |
279 this.clock.tick(strategy.PRIMARY_CONNECT_TIMEOUT_MS_); | |
280 assert.ok(secondary.connect.calledWith('server', 'username', 'authToken')); | |
281 setState(assert, secondary, remoting.SignalStrategy.State.NOT_CONNECTED, | |
282 false); | |
283 setState(assert, secondary, remoting.SignalStrategy.State.CONNECTING, | |
284 false); | |
285 setState(assert, secondary, remoting.SignalStrategy.State.HANDSHAKE, true); | |
286 setState(assert, secondary, remoting.SignalStrategy.State.CONNECTED, true); | |
287 strategy.sendConnectionSetupResults(logToServer); | |
288 | |
289 setState(assert, primary, remoting.SignalStrategy.State.HANDSHAKE, false); | |
290 setState(assert, primary, remoting.SignalStrategy.State.CONNECTED, false); | |
291 | |
292 logToServer.assertProgress( | |
293 remoting.SignalStrategy.Type.XMPP, | |
294 remoting.FallbackSignalStrategy.Progress.TIMED_OUT, | |
295 remoting.SignalStrategy.Type.WCS, | |
296 remoting.FallbackSignalStrategy.Progress.SUCCEEDED, | |
297 remoting.SignalStrategy.Type.XMPP, | |
298 remoting.FallbackSignalStrategy.Progress.SUCCEEDED_LATE); | |
299 } | |
300 ); | |
301 | |
302 })(); | |
OLD | NEW |