diff options
Diffstat (limited to 'main/client/test/src/ClientTests.java')
-rw-r--r-- | main/client/test/src/ClientTests.java | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/main/client/test/src/ClientTests.java b/main/client/test/src/ClientTests.java new file mode 100644 index 00000000..f3fcf154 --- /dev/null +++ b/main/client/test/src/ClientTests.java @@ -0,0 +1,151 @@ +package mill.main.client; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.OutputStream; +import java.util.*; + +public class ClientTests { + @Test + public void readWriteInt() throws Exception{ + int[] examples = { + 0, 1, 126, 127, 128, 254, 255, 256, 1024, 99999, 1234567, + Integer.MAX_VALUE, Integer.MAX_VALUE / 2, Integer.MIN_VALUE + }; + for(int example0: examples){ + for(int example: new int[]{-example0, example0}){ + ByteArrayOutputStream o = new ByteArrayOutputStream(); + Util.writeInt(o, example); + ByteArrayInputStream i = new ByteArrayInputStream(o.toByteArray()); + int s = Util.readInt(i); + assertEquals(example, s); + assertEquals(i.available(), 0); + } + } + } + @Test + public void readWriteString() throws Exception{ + String[] examples = { + "", + "hello", + "i am cow", + "i am cow\nhear me moo\ni weight twice as much as you", + "我是一个叉烧包", + }; + for(String example: examples){ + checkStringRoundTrip(example); + } + } + + @Test + public void readWriteBigString() throws Exception{ + int[] lengths = {0, 1, 126, 127, 128, 254, 255, 256, 1024, 99999, 1234567}; + for(int i = 0; i < lengths.length; i++){ + final char[] bigChars = new char[lengths[i]]; + java.util.Arrays.fill(bigChars, 'X'); + checkStringRoundTrip(new String(bigChars)); + } + } + + public void checkStringRoundTrip(String example) throws Exception{ + ByteArrayOutputStream o = new ByteArrayOutputStream(); + Util.writeString(o, example); + ByteArrayInputStream i = new ByteArrayInputStream(o.toByteArray()); + String s = Util.readString(i); + assertEquals(example, s); + assertEquals(i.available(), 0); + } + + public byte[] readSamples(String ...samples) throws Exception{ + ByteArrayOutputStream out = new ByteArrayOutputStream(); + for(String sample: samples) { + byte[] bytes = java.nio.file.Files.readAllBytes( + java.nio.file.Paths.get(getClass().getResource(sample).getFile()) + ); + out.write(bytes); + } + return out.toByteArray(); + } + @Test + public void tinyProxyInputOutputStream() throws Exception{ + proxyInputOutputStreams( + Arrays.copyOf(readSamples("/bandung.jpg"), 30), + readSamples(), + 10 + ); + } + @Test + public void leftProxyInputOutputStream() throws Exception{ + proxyInputOutputStreams( + readSamples("/bandung.jpg", "/akanon.mid", "/gettysburg.txt", "/pip.tar.gz"), + readSamples(), + 2950 + ); + } + @Test + public void rightProxyInputOutputStream() throws Exception{ + proxyInputOutputStreams( + readSamples(), + readSamples("/bandung.jpg", "/akanon.mid", "/gettysburg.txt", "/pip.tar.gz"), + 3000 + ); + } + @Test + public void mixedProxyInputOutputStream() throws Exception{ + proxyInputOutputStreams( + readSamples("/bandung.jpg", "/gettysburg.txt"), + readSamples("/akanon.mid", "/pip.tar.gz"), + 3050 + ); + } + + /** + * Make sure that when we shove data through both ProxyOutputStreams in + * variously sized chunks, we get the exact same bytes back out from the + * ProxyStreamPumper. + */ + public void proxyInputOutputStreams(byte[] samples1, + byte[] samples2, + int chunkMax) throws Exception{ + + ByteArrayOutputStream pipe = new ByteArrayOutputStream(); + OutputStream src1 = new ProxyOutputStream(pipe, 1); + OutputStream src2 = new ProxyOutputStream(pipe, -1); + + Random random = new Random(31337); + + int i1 = 0; + int i2 = 0; + while(i1 < samples1.length || i2 < samples2.length){ + int chunk = random.nextInt(chunkMax); + if (random.nextBoolean() && i1 < samples1.length){ + src1.write(samples1, i1, Math.min(samples1.length-i1, chunk)); + src1.flush(); + i1 += chunk; + }else if (i2 < samples2.length){ + src2.write(samples2, i2, Math.min(samples2.length-i2, chunk)); + src2.flush(); + i2 += chunk; + } + } + + byte[] bytes = pipe.toByteArray(); + + + ByteArrayOutputStream dest1 = new ByteArrayOutputStream(); + ByteArrayOutputStream dest2 = new ByteArrayOutputStream(); + ProxyStreamPumper pumper = new ProxyStreamPumper( + new ByteArrayInputStream(bytes), + dest1, dest2 + ); + pumper.run(); + assertTrue(Arrays.equals(samples1, dest1.toByteArray())); + assertTrue(Arrays.equals(samples2, dest2.toByteArray())); + } + +}
\ No newline at end of file |