Home | History | Annotate | Download | only in unittests
      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 appLauncher = null;
     10 var hangoutPort = null;
     11 var webappPort = null;
     12 var it2meService = null;
     13 
     14 function createPort(name, senderId) {
     15   var port = new chromeMocks.runtime.Port();
     16   port.name = (senderId) ? name +'@' + senderId : name;
     17   port.postMessage = sinon.spy(port, 'postMessage');
     18   port.disconnect = sinon.spy(port, 'disconnect');
     19 
     20   return port;
     21 }
     22 
     23 function promiseResolveSynchronous(value) {
     24   return {
     25     then: function(callback) {
     26       callback(value);
     27     }
     28   };
     29 }
     30 
     31 module('It2MeService', {
     32   setup: function() {
     33     // App Launcher.
     34     appLauncher = {
     35       launch: function () {
     36         return promiseResolveSynchronous('tabId');
     37       },
     38       close: function () {}
     39     };
     40     // HangoutPort.
     41     hangoutPort = createPort('it2me.helper.hangout');
     42     it2meService = new remoting.It2MeService(appLauncher);
     43     it2meService.onConnectExternal_(hangoutPort);
     44     webappPort = createPort('it2me.helper.webapp', 'tabId');
     45   }
     46 });
     47 
     48 test('should establish a channel two way channel when the webapp connects',
     49   function() {
     50     // Hangout ---- connect ----> It2MeService.
     51     hangoutPort.onMessage.mock$fire({
     52       method: 'connect',
     53       accessCode: "123412341234"
     54     });
     55 
     56     // Webapp ---- connect ----> It2MeService.
     57     it2meService.onWebappConnect_(webappPort);
     58 
     59     // Webapp ---- sessionStateChanged ----> It2MeService.
     60     webappPort.onMessage.mock$fire({
     61       method: 'sessionStateChanged',
     62       state: remoting.ClientSession.State.CONNECTED
     63     });
     64 
     65     // verify that hangout can receive message events.
     66     sinon.assert.calledWith(hangoutPort.postMessage, {
     67       method: 'sessionStateChanged',
     68       state: remoting.ClientSession.State.CONNECTED
     69     });
     70 
     71     hangoutPort.onDisconnect.mock$fire();
     72     QUnit.equal(it2meService.helpers_.length, 0);
     73 });
     74 
     75 test('should handle multiple helper connections', function() {
     76     // Hangout ---- connect ----> It2MeService.
     77     hangoutPort.onMessage.mock$fire({
     78       method: 'connect',
     79       accessCode: "123412341234"
     80     });
     81 
     82     // Hangout2 ---- connect ----> It2MeService.
     83     var hangoutPort2 = createPort('it2me.helper.hangout');
     84     it2meService.onConnectExternal_(hangoutPort2);
     85 
     86     appLauncher.launch = function () {
     87       return promiseResolveSynchronous('tabId2');
     88     };
     89 
     90     hangoutPort2.onMessage.mock$fire({
     91       method: 'connect',
     92       accessCode: "123412341234"
     93     });
     94 
     95     it2meService.onWebappConnect_(webappPort);
     96 
     97     var webappPort2 = createPort('it2me.helper.webapp', 'tabId2');
     98     it2meService.onWebappConnect_(webappPort2);
     99 
    100     webappPort.onMessage.mock$fire({
    101       method: 'sessionStateChanged',
    102       state: remoting.ClientSession.State.CONNECTED
    103     });
    104 
    105     // verify that hangout can receive message events from webapp 1
    106     sinon.assert.calledWith(hangoutPort.postMessage, {
    107       method: 'sessionStateChanged',
    108       state: remoting.ClientSession.State.CONNECTED
    109     });
    110 
    111     webappPort2.onMessage.mock$fire({
    112       method: 'sessionStateChanged',
    113       state: remoting.ClientSession.State.CLOSED
    114     });
    115 
    116     // verify that hangout can receive message events from webapp 2.
    117     sinon.assert.calledWith(hangoutPort2.postMessage, {
    118       method: 'sessionStateChanged',
    119       state: remoting.ClientSession.State.CLOSED
    120     });
    121 });
    122 
    123 test('should reject unknown connection', function() {
    124   it2meService.onWebappConnect_(webappPort);
    125   sinon.assert.called(webappPort.disconnect);
    126 
    127   var randomPort = createPort('unsupported.port.name');
    128   it2meService.onConnectExternal_(randomPort);
    129   sinon.assert.called(randomPort.disconnect);
    130 });
    131 
    132 })();