webchannelbasetransport_test.js 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. // Copyright 2013 The Closure Library Authors. All Rights Reserved.
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS-IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. /**
  15. * @fileoverview Unit tests for goog.labs.net.webChannel.WebChannelBase.
  16. * @suppress {accessControls} Private methods are accessed for test purposes.
  17. *
  18. */
  19. goog.provide('goog.labs.net.webChannel.webChannelBaseTransportTest');
  20. goog.require('goog.events');
  21. goog.require('goog.functions');
  22. goog.require('goog.json');
  23. goog.require('goog.labs.net.webChannel.ChannelRequest');
  24. goog.require('goog.labs.net.webChannel.WebChannelBase');
  25. goog.require('goog.labs.net.webChannel.WebChannelBaseTransport');
  26. goog.require('goog.net.WebChannel');
  27. goog.require('goog.testing.PropertyReplacer');
  28. goog.require('goog.testing.jsunit');
  29. goog.setTestOnly('goog.labs.net.webChannel.webChannelBaseTransportTest');
  30. var webChannel;
  31. var channelUrl = 'http://127.0.0.1:8080/channel';
  32. var stubs = new goog.testing.PropertyReplacer();
  33. function shouldRunTests() {
  34. return goog.labs.net.webChannel.ChannelRequest.supportsXhrStreaming();
  35. }
  36. function setUp() {}
  37. function tearDown() {
  38. goog.dispose(webChannel);
  39. stubs.reset();
  40. }
  41. /**
  42. * Stubs goog.labs.net.webChannel.ChannelRequest.
  43. */
  44. function stubChannelRequest() {
  45. stubs.set(
  46. goog.labs.net.webChannel.ChannelRequest, 'supportsXhrStreaming',
  47. goog.functions.FALSE);
  48. }
  49. function testUnsupportedTransports() {
  50. stubChannelRequest();
  51. var err = assertThrows(function() {
  52. var webChannelTransport =
  53. new goog.labs.net.webChannel.WebChannelBaseTransport();
  54. });
  55. assertContains('error', err.message);
  56. }
  57. function testOpenWithUrl() {
  58. var webChannelTransport =
  59. new goog.labs.net.webChannel.WebChannelBaseTransport();
  60. webChannel = webChannelTransport.createWebChannel(channelUrl);
  61. var eventFired = false;
  62. goog.events.listen(
  63. webChannel, goog.net.WebChannel.EventType.OPEN,
  64. function(e) { eventFired = true; });
  65. webChannel.open();
  66. assertFalse(eventFired);
  67. var channel = webChannel.channel_;
  68. assertNotNull(channel);
  69. simulateOpenEvent(channel);
  70. assertTrue(eventFired);
  71. }
  72. function testOpenWithTestUrl() {
  73. var webChannelTransport =
  74. new goog.labs.net.webChannel.WebChannelBaseTransport();
  75. var options = {'testUrl': channelUrl + '/footest'};
  76. webChannel = webChannelTransport.createWebChannel(channelUrl, options);
  77. webChannel.open();
  78. var testPath = webChannel.channel_.connectionTest_.path_;
  79. assertNotNullNorUndefined(testPath);
  80. }
  81. function testOpenWithCustomHeaders() {
  82. var webChannelTransport =
  83. new goog.labs.net.webChannel.WebChannelBaseTransport();
  84. var options = {'messageHeaders': {'foo-key': 'foo-value'}};
  85. webChannel = webChannelTransport.createWebChannel(channelUrl, options);
  86. webChannel.open();
  87. var extraHeaders_ = webChannel.channel_.extraHeaders_;
  88. assertNotNullNorUndefined(extraHeaders_);
  89. assertEquals('foo-value', extraHeaders_['foo-key']);
  90. assertEquals(undefined, extraHeaders_['X-Client-Protocol']);
  91. }
  92. function testOpenWithInitHeaders() {
  93. var webChannelTransport =
  94. new goog.labs.net.webChannel.WebChannelBaseTransport();
  95. var options = {'initMessageHeaders': {'foo-key': 'foo-value'}};
  96. webChannel = webChannelTransport.createWebChannel(channelUrl, options);
  97. webChannel.open();
  98. var initHeaders_ = webChannel.channel_.initHeaders_;
  99. assertNotNullNorUndefined(initHeaders_);
  100. assertEquals('foo-value', initHeaders_['foo-key']);
  101. }
  102. function testClientProtocolHeaderRequired() {
  103. var webChannelTransport =
  104. new goog.labs.net.webChannel.WebChannelBaseTransport();
  105. var options = {'clientProtocolHeaderRequired': true};
  106. webChannel = webChannelTransport.createWebChannel(channelUrl, options);
  107. webChannel.open();
  108. var extraHeaders_ = webChannel.channel_.extraHeaders_;
  109. assertNotNullNorUndefined(extraHeaders_);
  110. assertEquals('webchannel', extraHeaders_['X-Client-Protocol']);
  111. }
  112. function testClientProtocolHeaderNotRequiredByDefault() {
  113. var webChannelTransport =
  114. new goog.labs.net.webChannel.WebChannelBaseTransport();
  115. webChannel = webChannelTransport.createWebChannel(channelUrl);
  116. webChannel.open();
  117. var extraHeaders_ = webChannel.channel_.extraHeaders_;
  118. assertNull(extraHeaders_);
  119. }
  120. function testClientProtocolHeaderRequiredWithCustomHeader() {
  121. var webChannelTransport =
  122. new goog.labs.net.webChannel.WebChannelBaseTransport();
  123. var options = {
  124. 'clientProtocolHeaderRequired': true,
  125. 'messageHeaders': {'foo-key': 'foo-value'}
  126. };
  127. webChannel = webChannelTransport.createWebChannel(channelUrl, options);
  128. webChannel.open();
  129. var extraHeaders_ = webChannel.channel_.extraHeaders_;
  130. assertNotNullNorUndefined(extraHeaders_);
  131. assertEquals('foo-value', extraHeaders_['foo-key']);
  132. assertEquals('webchannel', extraHeaders_['X-Client-Protocol']);
  133. }
  134. function testOpenWithCustomParams() {
  135. var webChannelTransport =
  136. new goog.labs.net.webChannel.WebChannelBaseTransport();
  137. var options = {'messageUrlParams': {'foo-key': 'foo-value'}};
  138. webChannel = webChannelTransport.createWebChannel(channelUrl, options);
  139. webChannel.open();
  140. var extraParams = webChannel.channel_.extraParams_;
  141. assertNotNullNorUndefined(extraParams);
  142. }
  143. function testOpenWithHttpSessionIdParam() {
  144. var webChannelTransport =
  145. new goog.labs.net.webChannel.WebChannelBaseTransport();
  146. var options = {'httpSessionIdParam': 'xsessionid'};
  147. webChannel = webChannelTransport.createWebChannel(channelUrl, options);
  148. webChannel.open();
  149. var httpSessionIdParam = webChannel.channel_.getHttpSessionIdParam();
  150. assertEquals('xsessionid', httpSessionIdParam);
  151. }
  152. function testOpenWithDuplicatedHttpSessionIdParam() {
  153. var webChannelTransport =
  154. new goog.labs.net.webChannel.WebChannelBaseTransport();
  155. var options = {
  156. 'messageUrlParams': {'xsessionid': 'abcd1234'},
  157. 'httpSessionIdParam': 'xsessionid'
  158. };
  159. webChannel = webChannelTransport.createWebChannel(channelUrl, options);
  160. webChannel.open();
  161. var httpSessionIdParam = webChannel.channel_.getHttpSessionIdParam();
  162. assertEquals('xsessionid', httpSessionIdParam);
  163. var extraParams = webChannel.channel_.extraParams_;
  164. assertUndefined(extraParams['xsessionid']);
  165. }
  166. function testOpenWithCorsEnabled() {
  167. var webChannelTransport =
  168. new goog.labs.net.webChannel.WebChannelBaseTransport();
  169. var options = {'supportsCrossDomainXhr': true};
  170. webChannel = webChannelTransport.createWebChannel(channelUrl, options);
  171. webChannel.open();
  172. assertTrue(webChannel.channel_.supportsCrossDomainXhrs_);
  173. }
  174. function testSendRawJson() {
  175. var channelMsg;
  176. stubs.set(
  177. goog.labs.net.webChannel.WebChannelBase.prototype, 'sendMap',
  178. function(message) { channelMsg = message; });
  179. var webChannelTransport =
  180. new goog.labs.net.webChannel.WebChannelBaseTransport();
  181. var options = {'sendRawJson': true};
  182. webChannel = webChannelTransport.createWebChannel(channelUrl, options);
  183. webChannel.open();
  184. webChannel.send({foo: 'bar'});
  185. var receivedMsg = goog.json.parse(channelMsg['__data__']);
  186. assertEquals('bar', receivedMsg.foo);
  187. }
  188. function testOpenThenCloseChannel() {
  189. var webChannelTransport =
  190. new goog.labs.net.webChannel.WebChannelBaseTransport();
  191. webChannel = webChannelTransport.createWebChannel(channelUrl);
  192. var eventFired = false;
  193. goog.events.listen(
  194. webChannel, goog.net.WebChannel.EventType.CLOSE,
  195. function(e) { eventFired = true; });
  196. webChannel.open();
  197. assertFalse(eventFired);
  198. var channel = webChannel.channel_;
  199. assertNotNull(channel);
  200. simulateCloseEvent(channel);
  201. assertTrue(eventFired);
  202. }
  203. function testChannelError() {
  204. var webChannelTransport =
  205. new goog.labs.net.webChannel.WebChannelBaseTransport();
  206. webChannel = webChannelTransport.createWebChannel(channelUrl);
  207. var eventFired = false;
  208. goog.events.listen(
  209. webChannel, goog.net.WebChannel.EventType.ERROR, function(e) {
  210. eventFired = true;
  211. assertEquals(goog.net.WebChannel.ErrorStatus.NETWORK_ERROR, e.status);
  212. });
  213. webChannel.open();
  214. assertFalse(eventFired);
  215. var channel = webChannel.channel_;
  216. assertNotNull(channel);
  217. simulateErrorEvent(channel);
  218. assertTrue(eventFired);
  219. }
  220. function testChannelMessage() {
  221. var webChannelTransport =
  222. new goog.labs.net.webChannel.WebChannelBaseTransport();
  223. webChannel = webChannelTransport.createWebChannel(channelUrl);
  224. var eventFired = false;
  225. var data = 'foo';
  226. goog.events.listen(
  227. webChannel, goog.net.WebChannel.EventType.MESSAGE, function(e) {
  228. eventFired = true;
  229. assertEquals(e.data, data);
  230. });
  231. webChannel.open();
  232. assertFalse(eventFired);
  233. var channel = webChannel.channel_;
  234. assertNotNull(channel);
  235. simulateMessageEvent(channel, data);
  236. assertTrue(eventFired);
  237. }
  238. /**
  239. * Simulates the WebChannelBase firing the open event for the given channel.
  240. * @param {!goog.labs.net.webChannel.WebChannelBase} channel The WebChannelBase.
  241. */
  242. function simulateOpenEvent(channel) {
  243. assertNotNull(channel.getHandler());
  244. channel.getHandler().channelOpened();
  245. }
  246. /**
  247. * Simulates the WebChannelBase firing the close event for the given channel.
  248. * @param {!goog.labs.net.webChannel.WebChannelBase} channel The WebChannelBase.
  249. */
  250. function simulateCloseEvent(channel) {
  251. assertNotNull(channel.getHandler());
  252. channel.getHandler().channelClosed();
  253. }
  254. /**
  255. * Simulates the WebChannelBase firing the error event for the given channel.
  256. * @param {!goog.labs.net.webChannel.WebChannelBase} channel The WebChannelBase.
  257. */
  258. function simulateErrorEvent(channel) {
  259. assertNotNull(channel.getHandler());
  260. channel.getHandler().channelError();
  261. }
  262. /**
  263. * Simulates the WebChannelBase firing the message event for the given channel.
  264. * @param {!goog.labs.net.webChannel.WebChannelBase} channel The WebChannelBase.
  265. * @param {String} data The message data.
  266. */
  267. function simulateMessageEvent(channel, data) {
  268. assertNotNull(channel.getHandler());
  269. channel.getHandler().channelHandleArray(channel, data);
  270. }