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 3 // found in the LICENSE file. 4 5 (function() { 6 7 'use strict'; 8 9 var testUsername = 'testUsername (a] gmail.com'; 10 var testToken = 'testToken'; 11 var socketId = 3; 12 13 var onStateChange = null; 14 var onStanzaStr = null; 15 var connection = null; 16 17 module('XmppConnection', { 18 setup: function() { 19 onStateChange = sinon.spy(); 20 onStanzaStr = sinon.spy(); 21 function onStanza(stanza) { 22 onStanzaStr(new XMLSerializer().serializeToString(stanza)); 23 } 24 25 sinon.stub(chrome.socket, 'create'); 26 sinon.stub(chrome.socket, 'connect'); 27 sinon.stub(chrome.socket, 'write'); 28 sinon.stub(chrome.socket, 'read'); 29 sinon.stub(chrome.socket, 'destroy'); 30 sinon.stub(chrome.socket, 'secure'); 31 32 connection = new remoting.XmppConnection(onStateChange); 33 connection.setIncomingStanzaCallback(onStanza); 34 }, 35 36 teardown: function() { 37 chrome.socket.create.restore(); 38 chrome.socket.connect.restore(); 39 chrome.socket.write.restore(); 40 chrome.socket.read.restore(); 41 chrome.socket.destroy.restore(); 42 chrome.socket.secure.restore(); 43 } 44 }); 45 46 test('should go to FAILED state when failed to connect', function() { 47 connection.connect( 48 'xmpp.example.com:123', 'testUsername (a] gmail.com', 'testToken'); 49 sinon.assert.calledWith(onStateChange, 50 remoting.SignalStrategy.State.CONNECTING); 51 sinon.assert.calledWith(chrome.socket.create, "tcp", {}); 52 chrome.socket.create.getCall(0).args[2]({socketId: socketId}); 53 54 sinon.assert.calledWith( 55 chrome.socket.connect, socketId, "xmpp.example.com", 123); 56 chrome.socket.connect.getCall(0).args[3](-1); 57 58 QUnit.equal(connection.getError(), remoting.Error.NETWORK_FAILURE); 59 }); 60 61 test('should use XmppLoginHandler to complete handshake and read data', 62 function() { 63 connection.connect( 64 'xmpp.example.com:123', 'testUsername (a] gmail.com', 'testToken'); 65 sinon.assert.calledWith(onStateChange, 66 remoting.SignalStrategy.State.CONNECTING); 67 sinon.assert.calledWith(chrome.socket.create, "tcp", {}); 68 chrome.socket.create.getCall(0).args[2]({socketId: socketId}); 69 70 sinon.assert.calledWith( 71 chrome.socket.connect, socketId, "xmpp.example.com", 123); 72 chrome.socket.connect.getCall(0).args[3](0); 73 74 sinon.assert.calledWith(onStateChange, 75 remoting.SignalStrategy.State.HANDSHAKE); 76 77 var parser = new remoting.XmppStreamParser(); 78 var parserMock = sinon.mock(parser); 79 var setCallbacksCalled = parserMock.expects('setCallbacks').once(); 80 connection.loginHandler_.onHandshakeDoneCallback_('test (a] example.com/123123', 81 parser); 82 sinon.assert.calledWith(onStateChange, 83 remoting.SignalStrategy.State.CONNECTED); 84 setCallbacksCalled.verify(); 85 86 // Simulate read() callback with |data|. It should be passed to the parser. 87 var data = base.encodeUtf8('<iq id="1">hello</iq>'); 88 sinon.assert.calledWith(chrome.socket.read, socketId); 89 var appendDataCalled = parserMock.expects('appendData').once().withArgs(data); 90 chrome.socket.read.getCall(0).args[1]({resultCode: 0, data: data}); 91 appendDataCalled.verify(); 92 }); 93 94 })(); 95