PageRenderTime 41ms CodeModel.GetById 12ms RepoModel.GetById 0ms app.codeStats 0ms

/jetty-8.1.5.v20120716/jetty-spdy/spdy-jetty/src/test/java/org/eclipse/jetty/spdy/SynReplyTest.java

#
Java | 367 lines | 311 code | 44 blank | 12 comment | 6 complexity | ef469ab96ec7bc2e9750741d60627581 MD5 | raw file
Possible License(s): Apache-2.0
  1. //========================================================================
  2. //Copyright 2011-2012 Mort Bay Consulting Pty. Ltd.
  3. //------------------------------------------------------------------------
  4. //All rights reserved. This program and the accompanying materials
  5. //are made available under the terms of the Eclipse Public License v1.0
  6. //and Apache License v2.0 which accompanies this distribution.
  7. //The Eclipse Public License is available at
  8. //http://www.eclipse.org/legal/epl-v10.html
  9. //The Apache License v2.0 is available at
  10. //http://www.opensource.org/licenses/apache2.0.php
  11. //You may elect to redistribute this code under either of these licenses.
  12. //========================================================================
  13. package org.eclipse.jetty.spdy;
  14. import java.io.ByteArrayOutputStream;
  15. import java.nio.ByteBuffer;
  16. import java.nio.charset.Charset;
  17. import java.util.Arrays;
  18. import java.util.concurrent.CountDownLatch;
  19. import java.util.concurrent.TimeUnit;
  20. import java.util.concurrent.atomic.AtomicInteger;
  21. import java.util.concurrent.atomic.AtomicReference;
  22. import org.eclipse.jetty.spdy.api.BytesDataInfo;
  23. import org.eclipse.jetty.spdy.api.DataInfo;
  24. import org.eclipse.jetty.spdy.api.Handler;
  25. import org.eclipse.jetty.spdy.api.Headers;
  26. import org.eclipse.jetty.spdy.api.ReplyInfo;
  27. import org.eclipse.jetty.spdy.api.Session;
  28. import org.eclipse.jetty.spdy.api.SessionFrameListener;
  29. import org.eclipse.jetty.spdy.api.Stream;
  30. import org.eclipse.jetty.spdy.api.StreamFrameListener;
  31. import org.eclipse.jetty.spdy.api.StringDataInfo;
  32. import org.eclipse.jetty.spdy.api.SynInfo;
  33. import org.eclipse.jetty.spdy.api.server.ServerSessionFrameListener;
  34. import org.junit.Assert;
  35. import org.junit.Test;
  36. public class SynReplyTest extends AbstractTest
  37. {
  38. @Test
  39. public void testSynReply() throws Exception
  40. {
  41. final AtomicReference<Session> sessionRef = new AtomicReference<>();
  42. final CountDownLatch sessionLatch = new CountDownLatch(1);
  43. final CountDownLatch synLatch = new CountDownLatch(1);
  44. ServerSessionFrameListener serverSessionFrameListener = new ServerSessionFrameListener.Adapter()
  45. {
  46. @Override
  47. public void onConnect(Session session)
  48. {
  49. sessionRef.set(session);
  50. sessionLatch.countDown();
  51. }
  52. @Override
  53. public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
  54. {
  55. Assert.assertTrue(stream.isHalfClosed());
  56. stream.reply(new ReplyInfo(new Headers(), true));
  57. synLatch.countDown();
  58. return null;
  59. }
  60. };
  61. Session session = startClient(startServer(serverSessionFrameListener), null);
  62. Assert.assertTrue(sessionLatch.await(5, TimeUnit.SECONDS));
  63. Session serverSession = sessionRef.get();
  64. Assert.assertNotNull(serverSession);
  65. final CountDownLatch streamCreatedLatch = new CountDownLatch(1);
  66. final CountDownLatch streamRemovedLatch = new CountDownLatch(1);
  67. session.addListener(new Session.StreamListener()
  68. {
  69. @Override
  70. public void onStreamCreated(Stream stream)
  71. {
  72. streamCreatedLatch.countDown();
  73. }
  74. @Override
  75. public void onStreamClosed(Stream stream)
  76. {
  77. streamRemovedLatch.countDown();
  78. }
  79. });
  80. final CountDownLatch replyLatch = new CountDownLatch(1);
  81. Stream stream = session.syn(new SynInfo(new Headers(), true), new StreamFrameListener.Adapter()
  82. {
  83. @Override
  84. public void onReply(Stream stream, ReplyInfo replyInfo)
  85. {
  86. Assert.assertTrue(stream.isClosed());
  87. replyLatch.countDown();
  88. }
  89. }).get(5, TimeUnit.SECONDS);
  90. Assert.assertTrue(synLatch.await(5, TimeUnit.SECONDS));
  91. Assert.assertTrue(streamCreatedLatch.await(5, TimeUnit.SECONDS));
  92. Assert.assertTrue(replyLatch.await(5, TimeUnit.SECONDS));
  93. Assert.assertTrue(stream.isClosed());
  94. Assert.assertTrue(streamRemovedLatch.await(5, TimeUnit.SECONDS));
  95. Assert.assertEquals(0, session.getStreams().size());
  96. }
  97. @Test
  98. public void testSynDataReply() throws Exception
  99. {
  100. final byte[] dataBytes = "foo".getBytes(Charset.forName("UTF-8"));
  101. final CountDownLatch synLatch = new CountDownLatch(1);
  102. final CountDownLatch dataLatch = new CountDownLatch(1);
  103. ServerSessionFrameListener serverSessionFrameListener = new ServerSessionFrameListener.Adapter()
  104. {
  105. @Override
  106. public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
  107. {
  108. Assert.assertFalse(stream.isHalfClosed());
  109. Assert.assertFalse(stream.isClosed());
  110. synLatch.countDown();
  111. return new StreamFrameListener.Adapter()
  112. {
  113. @Override
  114. public void onData(Stream stream, DataInfo dataInfo)
  115. {
  116. ByteArrayOutputStream bytes = new ByteArrayOutputStream();
  117. ByteBuffer buffer = ByteBuffer.allocate(2);
  118. while (dataInfo.available() > 0)
  119. {
  120. dataInfo.readInto(buffer);
  121. buffer.flip();
  122. bytes.write(buffer.array(), buffer.arrayOffset(), buffer.remaining());
  123. buffer.clear();
  124. }
  125. Assert.assertTrue(Arrays.equals(dataBytes, bytes.toByteArray()));
  126. Assert.assertTrue(stream.isHalfClosed());
  127. Assert.assertFalse(stream.isClosed());
  128. stream.reply(new ReplyInfo(true));
  129. Assert.assertTrue(stream.isClosed());
  130. dataLatch.countDown();
  131. }
  132. };
  133. }
  134. };
  135. Session session = startClient(startServer(serverSessionFrameListener), null);
  136. final CountDownLatch streamRemovedLatch = new CountDownLatch(1);
  137. session.addListener(new Session.StreamListener.Adapter()
  138. {
  139. @Override
  140. public void onStreamClosed(Stream stream)
  141. {
  142. streamRemovedLatch.countDown();
  143. }
  144. });
  145. final CountDownLatch replyLatch = new CountDownLatch(1);
  146. Stream stream = session.syn(new SynInfo(false), new StreamFrameListener.Adapter()
  147. {
  148. @Override
  149. public void onReply(Stream stream, ReplyInfo replyInfo)
  150. {
  151. replyLatch.countDown();
  152. }
  153. }).get(5, TimeUnit.SECONDS);
  154. stream.data(new BytesDataInfo(dataBytes, true));
  155. Assert.assertTrue(synLatch.await(5, TimeUnit.SECONDS));
  156. Assert.assertTrue(dataLatch.await(5, TimeUnit.SECONDS));
  157. Assert.assertTrue(replyLatch.await(5, TimeUnit.SECONDS));
  158. Assert.assertTrue(streamRemovedLatch.await(5, TimeUnit.SECONDS));
  159. Assert.assertEquals(0, session.getStreams().size());
  160. }
  161. @Test
  162. public void testSynReplyDataData() throws Exception
  163. {
  164. final String data1 = "foo";
  165. final String data2 = "bar";
  166. Session session = startClient(startServer(new ServerSessionFrameListener.Adapter()
  167. {
  168. @Override
  169. public StreamFrameListener onSyn(final Stream stream, SynInfo synInfo)
  170. {
  171. Assert.assertTrue(stream.isHalfClosed());
  172. stream.reply(new ReplyInfo(false));
  173. stream.data(new StringDataInfo(data1, false), 5, TimeUnit.SECONDS, new Handler.Adapter<Void>()
  174. {
  175. @Override
  176. public void completed(Void context)
  177. {
  178. stream.data(new StringDataInfo(data2, true));
  179. }
  180. });
  181. return null;
  182. }
  183. }), null);
  184. final CountDownLatch replyLatch = new CountDownLatch(1);
  185. final CountDownLatch dataLatch1 = new CountDownLatch(1);
  186. final CountDownLatch dataLatch2 = new CountDownLatch(1);
  187. session.syn(new SynInfo(true), new StreamFrameListener.Adapter()
  188. {
  189. private AtomicInteger dataCount = new AtomicInteger();
  190. @Override
  191. public void onReply(Stream stream, ReplyInfo replyInfo)
  192. {
  193. Assert.assertFalse(replyInfo.isClose());
  194. replyLatch.countDown();
  195. }
  196. @Override
  197. public void onData(Stream stream, DataInfo dataInfo)
  198. {
  199. int dataCount = this.dataCount.incrementAndGet();
  200. if (dataCount == 1)
  201. {
  202. String chunk1 = dataInfo.asString("UTF-8", true);
  203. Assert.assertEquals(data1, chunk1);
  204. dataLatch1.countDown();
  205. }
  206. else if (dataCount == 2)
  207. {
  208. String chunk2 = dataInfo.asString("UTF-8", true);
  209. Assert.assertEquals(data2, chunk2);
  210. dataLatch2.countDown();
  211. }
  212. }
  213. });
  214. Assert.assertTrue(replyLatch.await(5, TimeUnit.SECONDS));
  215. Assert.assertTrue(dataLatch1.await(5, TimeUnit.SECONDS));
  216. Assert.assertTrue(dataLatch2.await(5, TimeUnit.SECONDS));
  217. }
  218. @Test
  219. public void testServerSynDataReplyData() throws Exception
  220. {
  221. final String serverData = "server";
  222. final String clientData = "client";
  223. final CountDownLatch replyLatch = new CountDownLatch(1);
  224. final CountDownLatch clientDataLatch = new CountDownLatch(1);
  225. ServerSessionFrameListener serverSessionFrameListener = new ServerSessionFrameListener.Adapter()
  226. {
  227. @Override
  228. public void onConnect(Session session)
  229. {
  230. session.syn(new SynInfo(false), new StreamFrameListener.Adapter()
  231. {
  232. @Override
  233. public void onReply(Stream stream, ReplyInfo replyInfo)
  234. {
  235. replyLatch.countDown();
  236. }
  237. @Override
  238. public void onData(Stream stream, DataInfo dataInfo)
  239. {
  240. String data = dataInfo.asString("UTF-8", true);
  241. Assert.assertEquals(clientData, data);
  242. clientDataLatch.countDown();
  243. }
  244. }, 0, TimeUnit.MILLISECONDS, new Handler.Adapter<Stream>()
  245. {
  246. @Override
  247. public void completed(Stream stream)
  248. {
  249. stream.data(new StringDataInfo(serverData, true));
  250. }
  251. });
  252. }
  253. };
  254. final CountDownLatch synLatch = new CountDownLatch(1);
  255. final CountDownLatch serverDataLatch = new CountDownLatch(1);
  256. SessionFrameListener clientSessionFrameListener = new SessionFrameListener.Adapter()
  257. {
  258. @Override
  259. public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
  260. {
  261. Assert.assertEquals(0, stream.getId() % 2);
  262. stream.reply(new ReplyInfo(false));
  263. stream.data(new StringDataInfo(clientData, true));
  264. synLatch.countDown();
  265. return new StreamFrameListener.Adapter()
  266. {
  267. @Override
  268. public void onData(Stream stream, DataInfo dataInfo)
  269. {
  270. ByteBuffer buffer = dataInfo.asByteBuffer(false);
  271. String data = Charset.forName("UTF-8").decode(buffer).toString();
  272. Assert.assertEquals(serverData, data);
  273. serverDataLatch.countDown();
  274. }
  275. };
  276. }
  277. };
  278. startClient(startServer(serverSessionFrameListener), clientSessionFrameListener);
  279. Assert.assertTrue(synLatch.await(5, TimeUnit.SECONDS));
  280. Assert.assertTrue(replyLatch.await(5, TimeUnit.SECONDS));
  281. Assert.assertTrue(serverDataLatch.await(5, TimeUnit.SECONDS));
  282. Assert.assertTrue(clientDataLatch.await(5, TimeUnit.SECONDS));
  283. }
  284. @Test
  285. public void testSynReplyDataSynReplyData() throws Exception
  286. {
  287. final String data = "foo";
  288. ServerSessionFrameListener serverSessionFrameListener = new ServerSessionFrameListener.Adapter()
  289. {
  290. @Override
  291. public StreamFrameListener onSyn(Stream stream, SynInfo synInfo)
  292. {
  293. Assert.assertTrue(stream.isHalfClosed());
  294. stream.reply(new ReplyInfo(false));
  295. stream.data(new StringDataInfo(data, true));
  296. return null;
  297. }
  298. };
  299. Session session = startClient(startServer(serverSessionFrameListener), null);
  300. final CountDownLatch replyLatch = new CountDownLatch(2);
  301. final CountDownLatch dataLatch = new CountDownLatch(2);
  302. StreamFrameListener clientStreamFrameListener = new StreamFrameListener.Adapter()
  303. {
  304. @Override
  305. public void onReply(Stream stream, ReplyInfo replyInfo)
  306. {
  307. Assert.assertFalse(replyInfo.isClose());
  308. replyLatch.countDown();
  309. }
  310. @Override
  311. public void onData(Stream stream, DataInfo dataInfo)
  312. {
  313. String chunk = dataInfo.asString("UTF-8", true);
  314. Assert.assertEquals(data, chunk);
  315. dataLatch.countDown();
  316. }
  317. };
  318. session.syn(new SynInfo(true), clientStreamFrameListener);
  319. session.syn(new SynInfo(true), clientStreamFrameListener);
  320. Assert.assertTrue(replyLatch.await(5, TimeUnit.SECONDS));
  321. Assert.assertTrue(dataLatch.await(5, TimeUnit.SECONDS));
  322. }
  323. }