@Override public byte[] deserialize(InputStream inputStream) throws IOException { PushbackInputStream pbis = (PushbackInputStream) inputStream; int first = pbis.read(); if (first < 0) { throw new SoftEndOfStreamException(); } pbis.unread(first); if (first == ByteArrayStxEtxSerializer.STX) { this.receivedStxEtx = true; return this.stxEtx.deserialize(pbis); } else { this.receivedCrLf = true; return this.crlf.deserialize(pbis); } }
@Test public void testReadCrLf() throws Exception { ServerSocket server = ServerSocketFactory.getDefault().createServerSocket(0); int port = server.getLocalPort(); server.setSoTimeout(10000); CountDownLatch done = SocketTestUtils.testSendCrLf(port, null); Socket socket = server.accept(); socket.setSoTimeout(5000); ByteArrayCrLfSerializer serializer = new ByteArrayCrLfSerializer(); byte[] out = serializer.deserialize(socket.getInputStream()); assertEquals("Data", SocketTestUtils.TEST_STRING + SocketTestUtils.TEST_STRING, new String(out)); out = serializer.deserialize(socket.getInputStream()); assertEquals("Data", SocketTestUtils.TEST_STRING + SocketTestUtils.TEST_STRING, new String(out)); server.close(); done.countDown(); }
@Test public void testReadCrLfTimeout() throws Exception { ServerSocket server = ServerSocketFactory.getDefault().createServerSocket(0); int port = server.getLocalPort(); server.setSoTimeout(10000); CountDownLatch latch = SocketTestUtils.testSendCrLfOverflow(port); Socket socket = server.accept(); socket.setSoTimeout(500); ByteArrayCrLfSerializer serializer = new ByteArrayCrLfSerializer(); try { serializer.deserialize(socket.getInputStream()); fail("Expected timout exception"); } catch (IOException e) { if (!e.getMessage().startsWith("Read timed out")) { e.printStackTrace(); fail("Unexpected IO Error:" + e.getMessage()); } } server.close(); latch.countDown(); }
@Test public void testReadCrLfOverflow() throws Exception { ServerSocket server = ServerSocketFactory.getDefault().createServerSocket(0); int port = server.getLocalPort(); server.setSoTimeout(10000); CountDownLatch latch = SocketTestUtils.testSendCrLfOverflow(port); Socket socket = server.accept(); socket.setSoTimeout(5000); ByteArrayCrLfSerializer serializer = new ByteArrayCrLfSerializer(); serializer.setMaxMessageSize(1024); try { serializer.deserialize(socket.getInputStream()); fail("Expected message length exceeded exception"); } catch (IOException e) { if (!e.getMessage().startsWith("CRLF not found")) { e.printStackTrace(); fail("Unexpected IO Error:" + e.getMessage()); } } server.close(); latch.countDown(); }
@Test public void testCRLF() throws IOException { ByteArrayCrLfSerializer deser = new ByteArrayCrLfSerializer(); deser.setPoolSize(2); ByteArrayInputStream bais = new ByteArrayInputStream("foo\r\n".getBytes()); for (int i = 0; i < 5; i++) { bais.reset(); byte[] bytes = deser.deserialize(bais); assertEquals("foo", new String(bytes)); } try { deser.deserialize(bais); fail("Expected SoftEndOfStreamException"); } catch (SoftEndOfStreamException e) { // expected } assertEquals(1, TestUtils.getPropertyValue(deser, "pool.allocated", Set.class).size()); assertEquals(0, TestUtils.getPropertyValue(deser, "pool.inUse", Set.class).size()); }