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