Index: core/src/test/java/quickfix/mina/message/FIXMessageDecoderTest.java =================================================================== --- core/src/test/java/quickfix/mina/message/FIXMessageDecoderTest.java (.../vendor-1.5.0) (revision 52) +++ core/src/test/java/quickfix/mina/message/FIXMessageDecoderTest.java (.../IG-1.5.0) (revision 61) @@ -137,7 +137,20 @@ assertEquals("wrong result", MessageDecoderResult.NEED_DATA, decoder .decodable(null, buffer)); } - + @Test + public void testPartialHeader2() throws Exception { + setUpBuffer("8=FIX.4.2\0019"); + assertEquals("wrong result", MessageDecoderResult.NEED_DATA, decoder + .decodable(null, buffer)); + } + + @Test + public void testPartialHeaderFixt() throws Exception { + setUpBuffer("8=FIXT.1.1\0019"); + assertEquals("wrong result", MessageDecoderResult.NEED_DATA, decoder + .decodable(null, buffer)); + } + // QFJ-376 @Test public void testGarbageData() throws Exception { @@ -157,18 +170,24 @@ public void testSplitMessage() throws Exception { String data = "8=FIX.4.2\0019=12\00135=X\001108=30\00110=049\001"; for (int i = 1; i < data.length(); i++) { - doSplitMessageTest(i, data); + doSplitMessageTest(i, data,12); } } - - private void doSplitMessageTest(int splitOffset, String data) throws ProtocolCodecException { + @Test + public void testSplitMessageFixt() throws Exception { + String data = "8=FIXT.1.1\0019=12\00135=X\001108=30\00110=049\001"; + for (int i = 1; i < data.length(); i++) { + doSplitMessageTest(i, data,13); + } + } + private void doSplitMessageTest(int splitOffset, String data, int headerSize) throws ProtocolCodecException { String firstChunk = data.substring(0, splitOffset); String remaining = data.substring(splitOffset); buffer.put(firstChunk.getBytes()); buffer.flip(); decoderOutput.reset(); - if (splitOffset < 12) { + if (splitOffset < headerSize) { assertEquals("shouldn't recognize header; offset=" + splitOffset, MessageDecoderResult.NEED_DATA, decoder.decodable(null, buffer)); } else { @@ -327,7 +346,22 @@ @Test public void testMinaDemux() throws Exception { - DemuxingProtocolCodecFactory codecFactory = new DemuxingProtocolCodecFactory(); + String message = "8=FIX.4.2\0019=12\00135=X\001108=30\00110=036\001"; + + doTestMinaDemux(message); + + } + + @Test + public void testMinaDemuxFixt() throws Exception { + String message = "8=FIXT.1.1\0019=12\00135=X\001108=30\00110=036\001"; + + doTestMinaDemux(message); + + } + + private void doTestMinaDemux(String message) throws Exception, UnsupportedEncodingException { + DemuxingProtocolCodecFactory codecFactory = new DemuxingProtocolCodecFactory(); codecFactory.register(FIXMessageDecoder.class); ProtocolDecoder decoder = codecFactory.getDecoder(); @@ -338,7 +372,7 @@ int count = 5; String data = ""; for (int i = 0; i < count; i++) { - data += "8=FIX.4.2\0019=12\00135=X\001108=30\00110=036\001"; + data += message; } for (int i = 1; i < data.length(); i++) { @@ -358,9 +392,8 @@ output.reset(); buffer.clear(); } + } - } - private void assertMessageFound(String data) throws ProtocolCodecException { assertMessageFound(data, 1); } Index: core/src/main/java/quickfix/mina/message/FIXMessageDecoder.java =================================================================== --- core/src/main/java/quickfix/mina/message/FIXMessageDecoder.java (.../vendor-1.5.0) (revision 52) +++ core/src/main/java/quickfix/mina/message/FIXMessageDecoder.java (.../IG-1.5.0) (revision 61) @@ -123,7 +123,7 @@ } if (messageCount > 0) { // Mina will compact the buffer because we can't detect a header - if (in.remaining() < minMaskLength(HEADER_PATTERN)) { + if (state == SEEKING_HEADER) { position = 0; } return MessageDecoderResult.OK; @@ -337,6 +337,10 @@ return -1; } } + if(dataOffset != data.length){ + // when minMaskLength(data) != data.length we might run out of buffer before we run out of data + return -1; + } return bufferOffset - initOffset; }