/tests/com/limegroup/gnutella/handshaking/AsyncIncomingHandshakerTest.java

https://github.com/r3n/limewire5-ruby · Java · 314 lines · 258 code · 52 blank · 4 comment · 0 complexity · 1a936456638de6432e3d13174b4b1f25 MD5 · raw file

  1. package com.limegroup.gnutella.handshaking;
  2. import java.io.IOException;
  3. import java.net.InetAddress;
  4. import java.net.Socket;
  5. import java.nio.ByteBuffer;
  6. import java.util.Map;
  7. import java.util.Properties;
  8. import org.limewire.nio.channel.ChannelReadObserver;
  9. import org.limewire.nio.channel.ChannelWriter;
  10. import org.limewire.nio.channel.InterestReadableByteChannel;
  11. import org.limewire.nio.channel.InterestWritableByteChannel;
  12. import org.limewire.nio.channel.NIOMultiplexor;
  13. import org.limewire.nio.observer.ReadObserver;
  14. import org.limewire.nio.observer.WriteObserver;
  15. import junit.framework.Test;
  16. import com.limegroup.gnutella.stubs.ReadBufferChannel;
  17. import com.limegroup.gnutella.stubs.WriteBufferChannel;
  18. import com.limegroup.gnutella.util.LimeTestCase;
  19. public class AsyncIncomingHandshakerTest extends LimeTestCase {
  20. public AsyncIncomingHandshakerTest(String name) {
  21. super(name);
  22. }
  23. public static Test suite() {
  24. return buildTestSuite(AsyncIncomingHandshakerTest.class);
  25. }
  26. public static void main(String[] args) {
  27. junit.textui.TestRunner.run(suite());
  28. }
  29. public void testSimpleSuccess() throws Exception {
  30. ReadBufferChannel reader = new ReadBufferChannel(
  31. ("GNUTELLA CONNECT/0.6\r\n" +
  32. "RequestHeader: RequestValue\r\n" +
  33. "\r\n" +
  34. "GNUTELLA/0.6 200 OK DOKIE\r\n" +
  35. "ResponseHeader: ResponseValue\r\n" +
  36. "\r\n").getBytes());
  37. WriteBufferChannel writer = new WriteBufferChannel(2048);
  38. MultiplexingSocket socket = new MultiplexingSocket(reader, writer);
  39. Properties outProps = new Properties();
  40. outProps.put("OutHeader", "OutValue");
  41. StubHandshakeResponder responder = new StubHandshakeResponder(new StubHandshakeResponse(200, "OK!", outProps));
  42. StubHandshakeObserver observer = new StubHandshakeObserver();
  43. Handshaker shaker = new AsyncIncomingHandshaker(responder, socket, observer);
  44. shaker.shake();
  45. socket.exchange(); // do the transfer! -- simulates NIODispatcher notifying
  46. assertFalse(observer.isNoGOK());
  47. assertFalse(observer.isBadHandshake());
  48. assertTrue(observer.isHandshakeFinished());
  49. assertEquals(shaker, observer.getShaker());
  50. Map respondedTo = responder.getRespondedToProps();
  51. assertEquals(respondedTo.toString(), 1, respondedTo.size());
  52. assertEquals("RequestValue", respondedTo.get("RequestHeader"));
  53. assertFalse(responder.isOutgoing());
  54. HandshakeResponse read = shaker.getReadHeaders();
  55. assertEquals(2, read.props().size());
  56. assertEquals("RequestValue", read.props().get("RequestHeader"));
  57. assertEquals("ResponseValue", read.props().get("ResponseHeader"));
  58. HandshakeResponse written = shaker.getWrittenHeaders();
  59. assertEquals(1, written.props().size());
  60. assertEquals("OutValue", written.props().get("OutHeader"));
  61. ByteBuffer out = writer.getBuffer();
  62. assertEquals("GNUTELLA/0.6 200 OK!\r\nOutHeader: OutValue\r\n\r\n", new String(out.array(), 0, out.limit()));
  63. }
  64. public void testBelowPointSixFails() throws Exception {
  65. ReadBufferChannel reader = new ReadBufferChannel(
  66. ("GNUTELLA CONNECT/0.5\r\n").getBytes());
  67. WriteBufferChannel writer = new WriteBufferChannel(2048);
  68. MultiplexingSocket socket = new MultiplexingSocket(reader, writer);
  69. StubHandshakeObserver observer = new StubHandshakeObserver();
  70. Handshaker shaker = new AsyncIncomingHandshaker(new StubHandshakeResponder(), socket, observer);
  71. shaker.shake();
  72. socket.exchange(); // do the transfer! -- simulates NIODispatcher notifying
  73. assertFalse(observer.isNoGOK());
  74. assertTrue(observer.isBadHandshake());
  75. assertFalse(observer.isHandshakeFinished());
  76. assertNull(observer.getShaker());
  77. }
  78. public void testAbovePointSixSucceeds() throws Exception {
  79. ReadBufferChannel reader = new ReadBufferChannel(
  80. ("GNUTELLA CONNECT/0.7\r\n" +
  81. "RequestHeader: RequestValue\r\n" +
  82. "\r\n" +
  83. "GNUTELLA/0.6 200 OK DOKIE\r\n" +
  84. "ResponseHeader: ResponseValue\r\n" +
  85. "\r\n").getBytes());
  86. WriteBufferChannel writer = new WriteBufferChannel(2048);
  87. MultiplexingSocket socket = new MultiplexingSocket(reader, writer);
  88. Properties outProps = new Properties();
  89. outProps.put("OutHeader", "OutValue");
  90. StubHandshakeResponder responder = new StubHandshakeResponder(new StubHandshakeResponse(200, "OK!", outProps));
  91. StubHandshakeObserver observer = new StubHandshakeObserver();
  92. Handshaker shaker = new AsyncIncomingHandshaker(responder, socket, observer);
  93. shaker.shake();
  94. socket.exchange(); // do the transfer! -- simulates NIODispatcher notifying
  95. assertFalse(observer.isNoGOK());
  96. assertFalse(observer.isBadHandshake());
  97. assertTrue(observer.isHandshakeFinished());
  98. assertEquals(shaker, observer.getShaker());
  99. Map respondedTo = responder.getRespondedToProps();
  100. assertEquals(respondedTo.toString(), 1, respondedTo.size());
  101. assertEquals("RequestValue", respondedTo.get("RequestHeader"));
  102. assertFalse(responder.isOutgoing());
  103. HandshakeResponse read = shaker.getReadHeaders();
  104. assertEquals(2, read.props().size());
  105. assertEquals("RequestValue", read.props().get("RequestHeader"));
  106. assertEquals("ResponseValue", read.props().get("ResponseHeader"));
  107. HandshakeResponse written = shaker.getWrittenHeaders();
  108. assertEquals(1, written.props().size());
  109. assertEquals("OutValue", written.props().get("OutHeader"));
  110. ByteBuffer out = writer.getBuffer();
  111. assertEquals("GNUTELLA/0.6 200 OK!\r\nOutHeader: OutValue\r\n\r\n", new String(out.array(), 0, out.limit()));
  112. }
  113. public void testCrawlerDiscosEarly() throws Exception {
  114. ReadBufferChannel reader = new ReadBufferChannel(
  115. ("GNUTELLA CONNECT/0.6\r\n" +
  116. "Crawler: 0.1\r\n" +
  117. "\r\n" +
  118. // pretend it would have sent a good response,
  119. // just to make sure we'll close it anyway.
  120. "GNUTELLA/0.6 200 OK DOKIE\r\n" +
  121. "ResponseHeader: ResponseValue\r\n" +
  122. "\r\n").getBytes());
  123. WriteBufferChannel writer = new WriteBufferChannel(2048);
  124. MultiplexingSocket socket = new MultiplexingSocket(reader, writer);
  125. StubHandshakeObserver observer = new StubHandshakeObserver();
  126. // make sure that even 'cause of the bad response, we close due to BadHandshake,
  127. // not No GOK -- otherwise we can't be sure the response got sent all the way.
  128. HandshakeResponse response = new StubHandshakeResponse(HandshakeResponse.CRAWLER_CODE, "Failed", new Properties());
  129. Handshaker shaker = new AsyncIncomingHandshaker(new StubHandshakeResponder(response), socket, observer);
  130. shaker.shake();
  131. socket.exchange(); // do the transfer! -- simulates NIODispatcher notifying
  132. assertFalse(observer.isNoGOK()); // Not a NGOK
  133. assertTrue(observer.isBadHandshake()); // Instead a BadHandshake
  134. assertFalse(observer.isHandshakeFinished());
  135. assertNull(observer.getShaker());
  136. }
  137. public void testDiscoOnBadResponder() throws Exception {
  138. ReadBufferChannel reader = new ReadBufferChannel(
  139. ("GNUTELLA CONNECT/0.6\r\n" +
  140. "RequestHeader: RequestValue\r\n" +
  141. "\r\n").getBytes());
  142. WriteBufferChannel writer = new WriteBufferChannel(2048);
  143. MultiplexingSocket socket = new MultiplexingSocket(reader, writer);
  144. Properties outProps = new Properties();
  145. outProps.put("OutHeader", "OutValue");
  146. StubHandshakeResponder responder = new StubHandshakeResponder(new StubHandshakeResponse(599, "NOPE", outProps));
  147. StubHandshakeObserver observer = new StubHandshakeObserver();
  148. Handshaker shaker = new AsyncIncomingHandshaker(responder, socket, observer);
  149. shaker.shake();
  150. socket.exchange(); // do the transfer! -- simulates NIODispatcher notifying
  151. assertTrue(observer.isNoGOK());
  152. assertEquals(599, observer.getCode());
  153. assertFalse(observer.isBadHandshake());
  154. assertFalse(observer.isHandshakeFinished());
  155. assertNull(observer.getShaker());
  156. assertEquals(1, shaker.getReadHeaders().props().size());
  157. assertEquals("RequestValue", shaker.getReadHeaders().props().get("RequestHeader"));
  158. assertEquals(1, shaker.getWrittenHeaders().props().size());
  159. assertEquals("OutValue", shaker.getWrittenHeaders().props().get("OutHeader"));
  160. }
  161. public void testDiscoOnBadResponse() throws Exception {
  162. ReadBufferChannel reader = new ReadBufferChannel(
  163. ("GNUTELLA CONNECT/0.6\r\n" +
  164. "RequestHeader: RequestValue\r\n" +
  165. "\r\n" +
  166. "GNUTELLA/0.6 333 SUX\r\n" +
  167. "ResponseHeader: ResponseValue\r\n" +
  168. "\r\n").getBytes());
  169. WriteBufferChannel writer = new WriteBufferChannel(2048);
  170. MultiplexingSocket socket = new MultiplexingSocket(reader, writer);
  171. Properties outProps = new Properties();
  172. outProps.put("OutHeader", "OutValue");
  173. StubHandshakeResponder responder = new StubHandshakeResponder(new StubHandshakeResponse(200, "OK!", outProps));
  174. StubHandshakeObserver observer = new StubHandshakeObserver();
  175. Handshaker shaker = new AsyncIncomingHandshaker(responder, socket, observer);
  176. shaker.shake();
  177. socket.exchange(); // do the transfer! -- simulates NIODispatcher notifying
  178. assertTrue(observer.isNoGOK());
  179. assertEquals(333, observer.getCode());
  180. assertFalse(observer.isBadHandshake());
  181. assertFalse(observer.isHandshakeFinished());
  182. assertNull(observer.getShaker());
  183. Map respondedTo = responder.getRespondedToProps();
  184. assertEquals(respondedTo.toString(), 1, respondedTo.size());
  185. assertEquals("RequestValue", respondedTo.get("RequestHeader"));
  186. assertFalse(responder.isOutgoing());
  187. HandshakeResponse read = shaker.getReadHeaders();
  188. assertEquals(2, read.props().size());
  189. assertEquals("RequestValue", read.props().get("RequestHeader"));
  190. assertEquals("ResponseValue", read.props().get("ResponseHeader"));
  191. HandshakeResponse written = shaker.getWrittenHeaders();
  192. assertEquals(1, written.props().size());
  193. assertEquals("OutValue", written.props().get("OutHeader"));
  194. ByteBuffer out = writer.getBuffer();
  195. assertEquals("GNUTELLA/0.6 200 OK!\r\nOutHeader: OutValue\r\n\r\n", new String(out.array(), 0, out.limit()));
  196. }
  197. public void testDiscoOnBadResponseConnectLine() throws Exception {
  198. ReadBufferChannel reader = new ReadBufferChannel(
  199. ("GNUTELLA CONNECT/0.6\r\n" +
  200. "RequestHeader: RequestValue\r\n" +
  201. "\r\n" +
  202. "HTTP/1.1 543 WHAT ARE YOU DOING?\r\n" +
  203. "ResponseHeader: ResponseValue\r\n" +
  204. "\r\n").getBytes());
  205. WriteBufferChannel writer = new WriteBufferChannel(2048);
  206. MultiplexingSocket socket = new MultiplexingSocket(reader, writer);
  207. Properties outProps = new Properties();
  208. outProps.put("OutHeader", "OutValue");
  209. StubHandshakeResponder responder = new StubHandshakeResponder(new StubHandshakeResponse(200, "OK!", outProps));
  210. StubHandshakeObserver observer = new StubHandshakeObserver();
  211. Handshaker shaker = new AsyncIncomingHandshaker(responder, socket, observer);
  212. shaker.shake();
  213. socket.exchange(); // do the transfer! -- simulates NIODispatcher notifying
  214. assertFalse(observer.isNoGOK());
  215. assertTrue(observer.isBadHandshake());
  216. assertFalse(observer.isHandshakeFinished());
  217. assertNull(observer.getShaker());
  218. Map respondedTo = responder.getRespondedToProps();
  219. assertEquals(respondedTo.toString(), 1, respondedTo.size());
  220. assertEquals("RequestValue", respondedTo.get("RequestHeader"));
  221. assertFalse(responder.isOutgoing());
  222. HandshakeResponse read = shaker.getReadHeaders();
  223. assertEquals(1, read.props().size());
  224. assertEquals("RequestValue", read.props().get("RequestHeader"));
  225. HandshakeResponse written = shaker.getWrittenHeaders();
  226. assertEquals(1, written.props().size());
  227. assertEquals("OutValue", written.props().get("OutHeader"));
  228. ByteBuffer out = writer.getBuffer();
  229. assertEquals("GNUTELLA/0.6 200 OK!\r\nOutHeader: OutValue\r\n\r\n", new String(out.array(), 0, out.limit()));
  230. }
  231. private static class MultiplexingSocket extends Socket implements NIOMultiplexor {
  232. private InterestReadableByteChannel baseReader;
  233. private InterestWritableByteChannel baseWriter;
  234. private ReadObserver reader;
  235. private WriteObserver writer;
  236. MultiplexingSocket(InterestReadableByteChannel baseReader, InterestWritableByteChannel baseWriter) {
  237. this.baseReader = baseReader;
  238. this.baseWriter = baseWriter;
  239. }
  240. @Override
  241. public InetAddress getInetAddress() {
  242. try {
  243. return InetAddress.getByName("127.0.0.1");
  244. } catch(IOException iox) {
  245. return null;
  246. }
  247. }
  248. public void setReadObserver(ChannelReadObserver reader) {
  249. reader.setReadChannel(baseReader);
  250. this.reader = reader;
  251. }
  252. public void setWriteObserver(ChannelWriter writer) {
  253. writer.setWriteChannel(baseWriter);
  254. this.writer = writer;
  255. }
  256. public void exchange() throws IOException {
  257. reader.handleRead();
  258. writer.handleWrite();
  259. reader.handleRead();
  260. }
  261. }
  262. }