Merge Chromium + Blink git repositories
[chromium-blink-merge.git] / remoting / webapp / base / js / protocol_extension_manager_unittest.js
blobec8348a3fe4516bf779b23ed19568c4e5de920f4
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.
5 /**
6  * @fileoverview
7  */
9 (function() {
11 'use strict';
13 /** @type {remoting.ProtocolExtensionManager} */
14 var extensionManager;
16 /** @type {(sinon.Spy|function(string, string))} */
17 var sendClientMessage;
19 /**
20  * @constructor
21  * @param {Array<string>} types
22  * @implements {remoting.ProtocolExtension}
23  */
24 var DummyExtension = function(types) {
25   /** @private {?function(string, string)} */
26   this.sendMessageToHost_ = null;
27   /** @private */
28   this.types_ = types;
31 DummyExtension.prototype.getExtensionTypes = function() {
32   return this.types_.slice(0);
35 /**
36  * @param {function(string,string)} sendMessageToHost Callback to send a message
37  *     to the host.
38  */
39 DummyExtension.prototype.startExtension = function(sendMessageToHost) {
40   this.sendMessageToHost_ = sendMessageToHost;
43 /**
44  * Called when an extension message of a matching type is received.
45  *
46  * @param {string} type The message type.
47  * @param {Object} message The parsed extension message data.
48  * @return {boolean} True if the extension message was handled.
49  */
50 DummyExtension.prototype.onExtensionMessage = function(type, message){
51   return this.types_.indexOf(type) !== 1;
55 QUnit.module('ProtocolExtensionManager', {
56   beforeEach: function() {
57     sendClientMessage = /** @type {function(string, string)} */ (sinon.spy());
58     extensionManager = new remoting.ProtocolExtensionManager(sendClientMessage);
59   },
60   afterEach: function() {
61   }
62 });
64 QUnit.test('should route message to extension by type', function(assert) {
65   var extension = new DummyExtension(['type1', 'type2']);
66   var onExtensionMessage = /** @type {(sinon.Spy|function(string, string))} */ (
67       sinon.spy(extension, 'onExtensionMessage'));
68   assert.ok(extensionManager.register(extension));
69   extensionManager.start();
71   extensionManager.onProtocolExtensionMessage('type1', '{"message": "hello"}');
72   assert.ok(onExtensionMessage.called);
73   onExtensionMessage.reset();
75   extensionManager.onProtocolExtensionMessage('type2', '{"message": "hello"}');
76   assert.ok(onExtensionMessage.called);
77   onExtensionMessage.reset();
79   extensionManager.onProtocolExtensionMessage('type3', '{"message": "hello"}');
80   assert.ok(!onExtensionMessage.called);
81   onExtensionMessage.reset();
82 });
84 QUnit.test('startExtension() should only be called once', function(assert) {
85   var extension = new DummyExtension(['type1', 'type2']);
86   var startExtension = /** @type {(sinon.Spy|Function)} */ (
87       sinon.spy(extension, 'startExtension'));
89   assert.ok(extensionManager.register(extension));
90   extensionManager.start();
91   assert.ok(startExtension.calledOnce);
92 });
95 QUnit.test('should not register extensions of the same type', function(assert) {
96   var extension1 = new DummyExtension(['type1']);
97   var extension2 = new DummyExtension(['type1']);
99   var onExtensionMessage1 = /** @type {(sinon.Spy|function(string, string))} */(
100       sinon.spy(extension1, 'onExtensionMessage'));
101   var onExtensionMessage2 = /** @type {(sinon.Spy|function(string, string))} */(
102       sinon.spy(extension2, 'onExtensionMessage'));
104   assert.ok(extensionManager.register(extension1));
105   assert.ok(!extensionManager.register(extension2));
106   extensionManager.start();
108   extensionManager.onProtocolExtensionMessage('type1', '{"message": "hello"}');
109   assert.ok(onExtensionMessage1.called);
110   assert.ok(!onExtensionMessage2.called);
113 QUnit.test('should handle extensions registration after it is started',
114     function(assert) {
115   var extension = new DummyExtension(['type']);
117   var onExtensionMessage = /** @type {(sinon.Spy|function(string, string))} */(
118       sinon.spy(extension, 'onExtensionMessage'));
120   extensionManager.start();
121   assert.ok(extensionManager.register(extension));
123   extensionManager.onProtocolExtensionMessage('type', '{"message": "hello"}');
124   assert.ok(onExtensionMessage.called);
127 })();