summaryrefslogtreecommitdiff
path: root/main/client/test/src/ClientTests.java
diff options
context:
space:
mode:
Diffstat (limited to 'main/client/test/src/ClientTests.java')
-rw-r--r--main/client/test/src/ClientTests.java151
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