it2me_service_unittest.js revision 6e8cce623b6e4fe0c9e4af605d675dd9d0338c38
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
9var appLauncher = null;
10var hangoutPort = null;
11var webappPort = null;
12var it2meService = null;
13
14function 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
23function promiseResolveSynchronous(value) {
24  return {
25    then: function(callback) {
26      callback(value);
27    }
28  };
29}
30
31module('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
48test('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
75test('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
123test('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
132test('messageExternal("hello") should return supportedFeatures', function() {
133  var response = null;
134  function callback(msg) {
135    response = msg;
136  }
137
138  it2meService.onMessageExternal_({
139    method: 'hello'
140  }, null, callback);
141
142  QUnit.ok(response.supportedFeatures instanceof Array);
143});
144
145})();