/codec-http/src/test/java/io/netty/handler/codec/http/websocketx/extensions/WebSocketClientExtensionHandlerTest.java

https://gitlab.com/taichu/netty · Java · 252 lines · 178 code · 47 blank · 27 comment · 8 complexity · 6dbc92e27b20c8a6a01c1ecfac3c94b0 MD5 · raw file

  1. /*
  2. * Copyright 2014 The Netty Project
  3. *
  4. * The Netty Project licenses this file to you under the Apache License,
  5. * version 2.0 (the "License"); you may not use this file except in compliance
  6. * with the License. You may obtain a copy of the License at:
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  12. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  13. * License for the specific language governing permissions and limitations
  14. * under the License.
  15. */
  16. package io.netty.handler.codec.http.websocketx.extensions;
  17. import io.netty.channel.embedded.EmbeddedChannel;
  18. import io.netty.handler.codec.CodecException;
  19. import io.netty.handler.codec.http.HttpHeaderNames;
  20. import io.netty.handler.codec.http.HttpRequest;
  21. import io.netty.handler.codec.http.HttpResponse;
  22. import java.util.Collections;
  23. import java.util.List;
  24. import org.junit.Test;
  25. import static io.netty.handler.codec.http.websocketx.extensions.WebSocketExtensionTestUtil.*;
  26. import static org.easymock.EasyMock.*;
  27. import static org.junit.Assert.*;
  28. public class WebSocketClientExtensionHandlerTest {
  29. WebSocketClientExtensionHandshaker mainHandshakerMock =
  30. createMock("mainHandshaker", WebSocketClientExtensionHandshaker.class);
  31. WebSocketClientExtensionHandshaker fallbackHandshakerMock =
  32. createMock("fallbackHandshaker", WebSocketClientExtensionHandshaker.class);
  33. WebSocketClientExtension mainExtensionMock =
  34. createMock("mainExtension", WebSocketClientExtension.class);
  35. WebSocketClientExtension fallbackExtensionMock =
  36. createMock("fallbackExtension", WebSocketClientExtension.class);
  37. @Test
  38. public void testMainSuccess() {
  39. // initialize
  40. expect(mainHandshakerMock.newRequestData()).
  41. andReturn(new WebSocketExtensionData("main", Collections.<String, String>emptyMap())).once();
  42. expect(mainHandshakerMock.handshakeExtension(
  43. anyObject(WebSocketExtensionData.class))).andReturn(mainExtensionMock).once();
  44. replay(mainHandshakerMock);
  45. expect(fallbackHandshakerMock.newRequestData()).
  46. andReturn(new WebSocketExtensionData("fallback", Collections.<String, String>emptyMap())).once();
  47. replay(fallbackHandshakerMock);
  48. expect(mainExtensionMock.rsv()).andReturn(WebSocketExtension.RSV1).anyTimes();
  49. expect(mainExtensionMock.newExtensionEncoder()).andReturn(new DummyEncoder()).once();
  50. expect(mainExtensionMock.newExtensionDecoder()).andReturn(new DummyDecoder()).once();
  51. replay(mainExtensionMock);
  52. // execute
  53. EmbeddedChannel ch = new EmbeddedChannel(new WebSocketClientExtensionHandler(
  54. mainHandshakerMock, fallbackHandshakerMock));
  55. HttpRequest req = newUpgradeRequest(null);
  56. ch.writeOutbound(req);
  57. HttpRequest req2 = ch.readOutbound();
  58. List<WebSocketExtensionData> reqExts = WebSocketExtensionUtil.extractExtensions(
  59. req2.headers().get(HttpHeaderNames.SEC_WEBSOCKET_EXTENSIONS));
  60. HttpResponse res = newUpgradeResponse("main");
  61. ch.writeInbound(res);
  62. HttpResponse res2 = ch.readInbound();
  63. List<WebSocketExtensionData> resExts = WebSocketExtensionUtil.extractExtensions(
  64. res2.headers().get(HttpHeaderNames.SEC_WEBSOCKET_EXTENSIONS));
  65. // test
  66. assertEquals(2, reqExts.size());
  67. assertEquals("main", reqExts.get(0).name());
  68. assertEquals("fallback", reqExts.get(1).name());
  69. assertEquals(1, resExts.size());
  70. assertEquals("main", resExts.get(0).name());
  71. assertTrue(resExts.get(0).parameters().isEmpty());
  72. assertTrue(ch.pipeline().get(DummyDecoder.class) != null);
  73. assertTrue(ch.pipeline().get(DummyEncoder.class) != null);
  74. }
  75. @Test
  76. public void testFallbackSuccess() {
  77. // initialize
  78. expect(mainHandshakerMock.newRequestData()).
  79. andReturn(new WebSocketExtensionData("main", Collections.<String, String>emptyMap())).once();
  80. expect(mainHandshakerMock.handshakeExtension(
  81. anyObject(WebSocketExtensionData.class))).andReturn(null).once();
  82. replay(mainHandshakerMock);
  83. expect(fallbackHandshakerMock.newRequestData()).
  84. andReturn(new WebSocketExtensionData("fallback", Collections.<String, String>emptyMap())).once();
  85. expect(fallbackHandshakerMock.handshakeExtension(
  86. anyObject(WebSocketExtensionData.class))).andReturn(fallbackExtensionMock).once();
  87. replay(fallbackHandshakerMock);
  88. expect(fallbackExtensionMock.rsv()).andReturn(WebSocketExtension.RSV1).anyTimes();
  89. expect(fallbackExtensionMock.newExtensionEncoder()).andReturn(new DummyEncoder()).once();
  90. expect(fallbackExtensionMock.newExtensionDecoder()).andReturn(new DummyDecoder()).once();
  91. replay(fallbackExtensionMock);
  92. // execute
  93. EmbeddedChannel ch = new EmbeddedChannel(new WebSocketClientExtensionHandler(
  94. mainHandshakerMock, fallbackHandshakerMock));
  95. HttpRequest req = newUpgradeRequest(null);
  96. ch.writeOutbound(req);
  97. HttpRequest req2 = ch.readOutbound();
  98. List<WebSocketExtensionData> reqExts = WebSocketExtensionUtil.extractExtensions(
  99. req2.headers().get(HttpHeaderNames.SEC_WEBSOCKET_EXTENSIONS));
  100. HttpResponse res = newUpgradeResponse("fallback");
  101. ch.writeInbound(res);
  102. HttpResponse res2 = ch.readInbound();
  103. List<WebSocketExtensionData> resExts = WebSocketExtensionUtil.extractExtensions(
  104. res2.headers().get(HttpHeaderNames.SEC_WEBSOCKET_EXTENSIONS));
  105. // test
  106. assertEquals(2, reqExts.size());
  107. assertEquals("main", reqExts.get(0).name());
  108. assertEquals("fallback", reqExts.get(1).name());
  109. assertEquals(1, resExts.size());
  110. assertEquals("fallback", resExts.get(0).name());
  111. assertTrue(resExts.get(0).parameters().isEmpty());
  112. assertTrue(ch.pipeline().get(DummyDecoder.class) != null);
  113. assertTrue(ch.pipeline().get(DummyEncoder.class) != null);
  114. }
  115. @Test
  116. public void testAllSuccess() {
  117. // initialize
  118. expect(mainHandshakerMock.newRequestData()).
  119. andReturn(new WebSocketExtensionData("main", Collections.<String, String>emptyMap())).once();
  120. expect(mainHandshakerMock.handshakeExtension(
  121. webSocketExtensionDataEqual("main"))).andReturn(mainExtensionMock).anyTimes();
  122. expect(mainHandshakerMock.handshakeExtension(
  123. webSocketExtensionDataEqual("fallback"))).andReturn(null).anyTimes();
  124. replay(mainHandshakerMock);
  125. expect(fallbackHandshakerMock.newRequestData()).
  126. andReturn(new WebSocketExtensionData("fallback", Collections.<String, String>emptyMap())).once();
  127. expect(fallbackHandshakerMock.handshakeExtension(
  128. webSocketExtensionDataEqual("main"))).andReturn(null).anyTimes();
  129. expect(fallbackHandshakerMock.handshakeExtension(
  130. webSocketExtensionDataEqual("fallback"))).andReturn(fallbackExtensionMock).anyTimes();
  131. replay(fallbackHandshakerMock);
  132. DummyEncoder mainEncoder = new DummyEncoder();
  133. DummyDecoder mainDecoder = new DummyDecoder();
  134. expect(mainExtensionMock.rsv()).andReturn(WebSocketExtension.RSV1).anyTimes();
  135. expect(mainExtensionMock.newExtensionEncoder()).andReturn(mainEncoder).once();
  136. expect(mainExtensionMock.newExtensionDecoder()).andReturn(mainDecoder).once();
  137. replay(mainExtensionMock);
  138. Dummy2Encoder fallbackEncoder = new Dummy2Encoder();
  139. Dummy2Decoder fallbackDecoder = new Dummy2Decoder();
  140. expect(fallbackExtensionMock.rsv()).andReturn(WebSocketExtension.RSV2).anyTimes();
  141. expect(fallbackExtensionMock.newExtensionEncoder()).andReturn(fallbackEncoder).once();
  142. expect(fallbackExtensionMock.newExtensionDecoder()).andReturn(fallbackDecoder).once();
  143. replay(fallbackExtensionMock);
  144. // execute
  145. EmbeddedChannel ch = new EmbeddedChannel(new WebSocketClientExtensionHandler(
  146. mainHandshakerMock, fallbackHandshakerMock));
  147. HttpRequest req = newUpgradeRequest(null);
  148. ch.writeOutbound(req);
  149. HttpRequest req2 = ch.readOutbound();
  150. List<WebSocketExtensionData> reqExts = WebSocketExtensionUtil.extractExtensions(
  151. req2.headers().get(HttpHeaderNames.SEC_WEBSOCKET_EXTENSIONS));
  152. HttpResponse res = newUpgradeResponse("main, fallback");
  153. ch.writeInbound(res);
  154. HttpResponse res2 = ch.readInbound();
  155. List<WebSocketExtensionData> resExts = WebSocketExtensionUtil.extractExtensions(
  156. res2.headers().get(HttpHeaderNames.SEC_WEBSOCKET_EXTENSIONS));
  157. // test
  158. assertEquals(2, reqExts.size());
  159. assertEquals("main", reqExts.get(0).name());
  160. assertEquals("fallback", reqExts.get(1).name());
  161. assertEquals(2, resExts.size());
  162. assertEquals("main", resExts.get(0).name());
  163. assertEquals("fallback", resExts.get(1).name());
  164. assertTrue(ch.pipeline().context(mainEncoder) != null);
  165. assertTrue(ch.pipeline().context(mainDecoder) != null);
  166. assertTrue(ch.pipeline().context(fallbackEncoder) != null);
  167. assertTrue(ch.pipeline().context(fallbackDecoder) != null);
  168. }
  169. @Test(expected = CodecException.class)
  170. public void testIfMainAndFallbackUseRSV1WillFail() {
  171. // initialize
  172. expect(mainHandshakerMock.newRequestData()).
  173. andReturn(new WebSocketExtensionData("main", Collections.<String, String>emptyMap())).once();
  174. expect(mainHandshakerMock.handshakeExtension(
  175. webSocketExtensionDataEqual("main"))).andReturn(mainExtensionMock).anyTimes();
  176. expect(mainHandshakerMock.handshakeExtension(
  177. webSocketExtensionDataEqual("fallback"))).andReturn(null).anyTimes();
  178. replay(mainHandshakerMock);
  179. expect(fallbackHandshakerMock.newRequestData()).
  180. andReturn(new WebSocketExtensionData("fallback", Collections.<String, String>emptyMap())).once();
  181. expect(fallbackHandshakerMock.handshakeExtension(
  182. webSocketExtensionDataEqual("main"))).andReturn(null).anyTimes();
  183. expect(fallbackHandshakerMock.handshakeExtension(
  184. webSocketExtensionDataEqual("fallback"))).andReturn(fallbackExtensionMock).anyTimes();
  185. replay(fallbackHandshakerMock);
  186. expect(mainExtensionMock.rsv()).andReturn(WebSocketExtension.RSV1).anyTimes();
  187. replay(mainExtensionMock);
  188. expect(fallbackExtensionMock.rsv()).andReturn(WebSocketExtension.RSV1).anyTimes();
  189. replay(fallbackExtensionMock);
  190. // execute
  191. EmbeddedChannel ch = new EmbeddedChannel(new WebSocketClientExtensionHandler(
  192. mainHandshakerMock, fallbackHandshakerMock));
  193. HttpRequest req = newUpgradeRequest(null);
  194. ch.writeOutbound(req);
  195. HttpRequest req2 = ch.readOutbound();
  196. List<WebSocketExtensionData> reqExts = WebSocketExtensionUtil.extractExtensions(
  197. req2.headers().get(HttpHeaderNames.SEC_WEBSOCKET_EXTENSIONS));
  198. HttpResponse res = newUpgradeResponse("main, fallback");
  199. ch.writeInbound(res);
  200. // test
  201. assertEquals(2, reqExts.size());
  202. assertEquals("main", reqExts.get(0).name());
  203. assertEquals("fallback", reqExts.get(1).name());
  204. }
  205. }