public void testCrazyProtocolHeader() throws IOException { ConnectionFactory factory = new ConnectionFactory(); // keep the frame handler's socket Socket fhSocket = factory.getSocketFactory().createSocket("localhost", AMQP.PROTOCOL.PORT); SocketFrameHandler fh = new SocketFrameHandler(fhSocket); fh.sendHeader(100, 3); // major, minor DataInputStream in = fh.getInputStream(); // we should get a valid protocol header back byte[] header = new byte[4]; in.read(header); // The protocol header is "AMQP" plus a version that the server // supports. We can really only test for the first bit. assertEquals("AMQP", new String(header)); in.read(header); assertEquals(in.available(), 0); // At this point the socket should have been closed. We can // directly test for this, but since Socket.isClosed is purported to be // unreliable, we can also test whether trying to read more bytes // gives an error. if (!fhSocket.isClosed()) { fh.setTimeout(500); // NB the frame handler will return null if the socket times out try { fh.readFrame(); fail("Expected socket read to fail due to socket being closed"); } catch (MalformedFrameException mfe) { fail("Expected nothing, rather than a badly-formed something"); } catch (IOException ioe) { } } }