11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved.
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file.
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci(function() {
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci'use strict';
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivar testUsername = 'testUsername@gmail.com';
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivar testToken = 'testToken';
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivar socketId = 3;
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivar onStateChange = null;
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivar onStanzaStr = null;
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivar connection = null;
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccimodule('XmppConnection', {
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  setup: function() {
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    onStateChange = sinon.spy();
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    onStanzaStr = sinon.spy();
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    function onStanza(stanza) {
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      onStanzaStr(new XMLSerializer().serializeToString(stanza));
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    sinon.stub(chrome.socket, 'create');
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    sinon.stub(chrome.socket, 'connect');
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    sinon.stub(chrome.socket, 'write');
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    sinon.stub(chrome.socket, 'read');
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    sinon.stub(chrome.socket, 'destroy');
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    sinon.stub(chrome.socket, 'secure');
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    connection = new remoting.XmppConnection(onStateChange);
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    connection.setIncomingStanzaCallback(onStanza);
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  },
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  teardown: function() {
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    chrome.socket.create.restore();
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    chrome.socket.connect.restore();
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    chrome.socket.write.restore();
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    chrome.socket.read.restore();
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    chrome.socket.destroy.restore();
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    chrome.socket.secure.restore();
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci});
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitest('should go to FAILED state when failed to connect', function() {
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  connection.connect(
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      'xmpp.example.com:123', 'testUsername@gmail.com', 'testToken');
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  sinon.assert.calledWith(onStateChange,
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          remoting.SignalStrategy.State.CONNECTING);
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  sinon.assert.calledWith(chrome.socket.create, "tcp", {});
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  chrome.socket.create.getCall(0).args[2]({socketId: socketId});
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  sinon.assert.calledWith(
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      chrome.socket.connect, socketId, "xmpp.example.com", 123);
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  chrome.socket.connect.getCall(0).args[3](-1);
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  QUnit.equal(connection.getError(), remoting.Error.NETWORK_FAILURE);
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci});
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitest('should use XmppLoginHandler to complete handshake and read data',
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci     function() {
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  connection.connect(
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      'xmpp.example.com:123', 'testUsername@gmail.com', 'testToken');
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  sinon.assert.calledWith(onStateChange,
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          remoting.SignalStrategy.State.CONNECTING);
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  sinon.assert.calledWith(chrome.socket.create, "tcp", {});
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  chrome.socket.create.getCall(0).args[2]({socketId: socketId});
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  sinon.assert.calledWith(
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      chrome.socket.connect, socketId, "xmpp.example.com", 123);
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  chrome.socket.connect.getCall(0).args[3](0);
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  sinon.assert.calledWith(onStateChange,
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          remoting.SignalStrategy.State.HANDSHAKE);
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  var parser = new remoting.XmppStreamParser();
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  var parserMock = sinon.mock(parser);
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  var setCallbacksCalled = parserMock.expects('setCallbacks').once();
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  connection.loginHandler_.onHandshakeDoneCallback_('test@example.com/123123',
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                                    parser);
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  sinon.assert.calledWith(onStateChange,
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          remoting.SignalStrategy.State.CONNECTED);
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  setCallbacksCalled.verify();
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Simulate read() callback with |data|. It should be passed to the parser.
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  var data = base.encodeUtf8('<iq id="1">hello</iq>');
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  sinon.assert.calledWith(chrome.socket.read, socketId);
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  var appendDataCalled = parserMock.expects('appendData').once().withArgs(data);
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  chrome.socket.read.getCall(0).args[1]({resultCode: 0, data: data});
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  appendDataCalled.verify();
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci});
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci})();
95