package org.nutz.mvc.upload.util; import static org.junit.Assert.*; import java.io.IOException; import java.io.InputStream; import org.junit.Test; import org.nutz.lang.Lang; public class BufferRingTest { /** * for issue #617 */ @Test public void test_mark_r_n() throws IOException { RemountBytes boundary = RemountBytes.create("\r\n---"); String str = "\r\n\r\n---"; InputStream ins = Lang.ins(str); BufferRing br = new BufferRing(ins, 3, 10); String s; MarkMode mode; br.load(); mode = br.mark(boundary); assertEquals(MarkMode.FOUND, mode); s = br.dumpAsString(); assertEquals("\r\n", s); } @Test public void test_cross_ring_item() throws IOException { RemountBytes boundary = RemountBytes.create("---"); String str = "ABCDE"; str += "abcde"; str += "1234-"; str += "-1234"; InputStream ins = Lang.ins(str); BufferRing br = new BufferRing(ins, 3, 5); String s; MarkMode mode; br.load(); mode = br.mark(boundary); assertEquals(MarkMode.NOT_FOUND, mode); s = br.dumpAsString(); assertEquals("ABCDEabcde1234", s); br.load(); mode = br.mark(boundary); assertEquals(MarkMode.STREAM_END, mode); s = br.dumpAsString(); assertEquals("--1234", s); } @Test public void test_normal_read() throws IOException { RemountBytes boundary = RemountBytes.create("---"); String str = "12345"; str += "67890"; str += "ABCDE"; str += "fgh--"; str += "-A---"; str += "B----"; str += "--ENDL"; str += "--"; InputStream ins = Lang.ins(str); BufferRing br = new BufferRing(ins, 3, 5); String s; MarkMode mode; RingItem ri; /** * =================================================<br> * 12345 67890 ABCDE */ br.load(); assertEquals(15, br.readed); mode = br.mark(boundary); assertEquals(MarkMode.NOT_FOUND, mode); s = br.dumpAsString(); assertEquals('1', (char) br.item.buffer[0]); assertTrue(br.item.isDone4Mark()); assertFalse(br.item.isLoaded); assertEquals("1234567890ABCDE", s); /** * =================================================<br> * fgh-- -A--- B---- */ br.load(); assertEquals(30, br.readed); mode = br.mark(boundary); assertEquals(MarkMode.FOUND, mode); // ITEM ri = br.item; assertTrue(ri.isLoaded); assertEquals(0, ri.l); assertEquals(3, ri.r); assertEquals(5, ri.nextmark); assertTrue(ri.isDone4Mark()); // ITEM.NEXT ri = br.item.next; assertTrue(ri.isLoaded); assertEquals(1, ri.l); assertEquals(1, ri.r); assertEquals(1, ri.nextmark); assertFalse(ri.isDone4Mark()); // ITEM.NEXT.NEXT ri = br.item.next.next; assertTrue(ri.isLoaded); assertEquals(0, ri.l); assertEquals(0, ri.r); assertEquals(0, ri.nextmark); assertFalse(ri.isDone4Mark()); s = br.dumpAsString(); assertEquals("fgh", s); /** * =================================================<br> * -A--- B---- */ br.load(); assertEquals(30, br.readed); mode = br.mark(boundary); assertEquals(MarkMode.FOUND, mode); // ITEM ri = br.item; assertTrue(ri.isLoaded); assertEquals(1, ri.l); assertEquals(2, ri.r); assertEquals(5, ri.nextmark); assertTrue(ri.isDone4Mark()); // ITEM.NEXT ri = br.item.next; assertTrue(ri.isLoaded); assertEquals(0, ri.l); assertEquals(0, ri.r); assertEquals(0, ri.nextmark); assertFalse(ri.isDone4Mark()); // ITEM.NEXT.NEXT ri = br.item.next.next; assertFalse(ri.isLoaded); s = br.dumpAsString(); assertEquals("A", s); /** * =================================================<br> * B---- */ br.load(); assertEquals(30, br.readed); mode = br.mark(boundary); assertEquals(MarkMode.FOUND, mode); // ITEM ri = br.item; assertTrue(ri.isLoaded); assertEquals(0, ri.l); assertEquals(1, ri.r); assertEquals(4, ri.nextmark); assertFalse(ri.isDone4Mark()); // ITEM.NEXT ri = br.item.next; assertFalse(ri.isLoaded); // ITEM.NEXT.NEXT ri = br.item.next.next; assertFalse(ri.isLoaded); s = br.dumpAsString(); assertEquals("B", s); ri = br.item; assertTrue(ri.isLoaded); assertEquals(4, ri.l); assertEquals(4, ri.r); assertEquals(4, ri.nextmark); assertFalse(ri.isDone4Mark()); /** * =================================================<br> * B---- --END */ br.load(); assertEquals(30, br.readed); mode = br.mark(boundary); assertEquals(35, br.readed); assertEquals(MarkMode.FOUND, mode); // ITEM ri = br.item; assertTrue(ri.isLoaded); assertEquals(4, ri.l); assertEquals(4, ri.r); assertEquals(5, ri.nextmark); assertTrue(ri.isDone4Mark()); // ITEM.NEXT ri = br.item.next; assertTrue(ri.isLoaded); assertEquals(2, ri.l); assertEquals(2, ri.r); assertEquals(2, ri.nextmark); assertFalse(ri.isDone4Mark()); // ITEM.NEXT.NEXT ri = br.item.next.next; assertFalse(ri.isLoaded); s = br.dumpAsString(); assertEquals('-', (char) br.item.buffer[0]); assertEquals("", s); /** * =================================================<br> * --END L-- */ br.load(); assertEquals(35, br.readed); mode = br.mark(boundary); assertEquals(38, br.readed); assertTrue(br.item.next.isStreamEnd); // ITEM ri = br.item; assertTrue(ri.isLoaded); assertEquals(2, ri.l); assertEquals(5, ri.r); assertEquals(5, ri.nextmark); assertTrue(ri.isDone4Mark()); // ITEM.NEXT ri = br.item.next; assertTrue(ri.isLoaded); assertEquals(0, ri.l); assertEquals(3, ri.r); assertEquals(3, ri.nextmark); assertTrue(ri.isDone4Mark()); assertEquals(MarkMode.STREAM_END, mode); s = br.dumpAsString(); assertEquals("ENDL--", s); } @Test public void test_by_buffer() throws IOException { RemountBytes boundary = RemountBytes.create("-----"); String str = "-----"; str += "ABCDE"; str += "-----"; str += "12345"; str += "-----"; str += "RR"; InputStream ins = Lang.ins(str); BufferRing br = new BufferRing(ins, 3, 5); String s; MarkMode mode; br.load(); mode = br.mark(boundary); assertEquals(MarkMode.FOUND, mode); br.skipMark(); br.load(); mode = br.mark(boundary); assertEquals(MarkMode.FOUND, mode); s = br.dumpAsString(); assertEquals("ABCDE", s); br.load(); mode = br.mark(boundary); assertEquals(MarkMode.FOUND, mode); s = br.dumpAsString(); assertEquals("12345", s); br.load(); mode = br.mark(boundary); assertEquals(MarkMode.STREAM_END, mode); s = br.dumpAsString(); assertEquals("RR", s); assertEquals(27, br.readed); } @Test public void test_by_buffer2() throws IOException { RemountBytes boundary = RemountBytes.create("-----"); String str = "-----"; str += "ABCDE"; str += "-----"; str += "12345"; str += "-----"; InputStream ins = Lang.ins(str); BufferRing br = new BufferRing(ins, 3, 5); String s; MarkMode mode; br.load(); mode = br.mark(boundary); assertEquals(MarkMode.FOUND, mode); br.skipMark(); br.load(); mode = br.mark(boundary); assertEquals(MarkMode.FOUND, mode); s = br.dumpAsString(); assertEquals("ABCDE", s); br.load(); mode = br.mark(boundary); assertEquals(MarkMode.FOUND, mode); s = br.dumpAsString(); assertEquals("12345", s); br.load(); mode = br.mark(boundary); assertEquals(MarkMode.STREAM_END, mode); s = br.dumpAsString(); assertEquals("", s); assertEquals(25, br.readed); } @Test public void test_mark_dangerous_char() throws IOException { RemountBytes boundary = RemountBytes.create("**!"); String str = "-***!"; InputStream ins = Lang.ins(str); BufferRing br = new BufferRing(ins, 3, 5); String s; MarkMode mode; br.load(); mode = br.mark(boundary); assertEquals(MarkMode.FOUND, mode); s = br.dumpAsString(); assertEquals("-*", s); } @Test public void test_mark_dangerous_char2() throws IOException { RemountBytes boundary = RemountBytes.create("*!"); String str = "-**!ABC"; InputStream ins = Lang.ins(str); BufferRing br = new BufferRing(ins, 3, 10); String s; MarkMode mode; br.load(); mode = br.mark(boundary); assertEquals(MarkMode.FOUND, mode); s = br.dumpAsString(); assertEquals("-*", s); } @Test public void test_mark_dangerous_char3() throws IOException { RemountBytes boundary = RemountBytes.create("**!"); String str = "---**"; str += "!--"; InputStream ins = Lang.ins(str); BufferRing br = new BufferRing(ins, 3, 5); String s; MarkMode mode; br.load(); mode = br.mark(boundary); assertEquals(MarkMode.FOUND, mode); s = br.dumpAsString(); assertEquals("---", s); mode = br.mark(boundary); assertEquals(MarkMode.STREAM_END, mode); s = br.dumpAsString(); assertEquals("--", s); } }