gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r18228 - in gnunet-java: . src/org/gnunet/construct src/org


From: gnunet
Subject: [GNUnet-SVN] r18228 - in gnunet-java: . src/org/gnunet/construct src/org/gnunet/messages test/org/gnunet/construct
Date: Mon, 21 Nov 2011 10:51:37 +0100

Author: dold
Date: 2011-11-21 10:51:37 +0100 (Mon, 21 Nov 2011)
New Revision: 18228

Added:
   gnunet-java/src/org/gnunet/construct/FillParser.java
   gnunet-java/src/org/gnunet/construct/TotalSizeParser.java
   gnunet-java/src/org/gnunet/messages/SizeTestMessage.java
   gnunet-java/src/org/gnunet/messages/StringTestMessage.java
   gnunet-java/src/org/gnunet/messages/TestMessage4.java
Modified:
   gnunet-java/ISSUES
   gnunet-java/src/org/gnunet/construct/Construct.java
   gnunet-java/src/org/gnunet/construct/FixedSizeArrayParser.java
   gnunet-java/src/org/gnunet/construct/ObjectParser.java
   gnunet-java/src/org/gnunet/construct/SignedIntegerParser.java
   gnunet-java/src/org/gnunet/construct/StringParser.java
   gnunet-java/src/org/gnunet/construct/UnsignedIntegerParser.java
   gnunet-java/src/org/gnunet/messages/MessageHeader.java
   gnunet-java/src/org/gnunet/messages/TestMessage3.java
   gnunet-java/test/org/gnunet/construct/ConstructTest.java
Log:
fix

Modified: gnunet-java/ISSUES
===================================================================
--- gnunet-java/ISSUES  2011-11-21 01:16:50 UTC (rev 18227)
+++ gnunet-java/ISSUES  2011-11-21 09:51:37 UTC (rev 18228)
@@ -55,5 +55,5 @@
   * parsers are only constructed once per class
  
  
- * what about TotalSize? 
+* what about TotalSize?
  
\ No newline at end of file

Modified: gnunet-java/src/org/gnunet/construct/Construct.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/Construct.java 2011-11-21 01:16:50 UTC 
(rev 18227)
+++ gnunet-java/src/org/gnunet/construct/Construct.java 2011-11-21 09:51:37 UTC 
(rev 18228)
@@ -25,7 +25,20 @@
 public class Construct {
     private static final Logger logger = LoggerFactory
             .getLogger(Construct.class);
+    
+    
+    
+    static class SizeError extends RuntimeException {
+        
+    }
+    
 
+    
+    /**
+     * 
+     * @author Florian Dold
+     *
+     */
     @Retention(RetentionPolicy.RUNTIME)
     @Target(ElementType.FIELD)
     public @interface Nested {
@@ -34,7 +47,7 @@
     /**
      * Acceptable targets: byte, short, int, long, BigInteger.
      * 
-     * @author flodo
+     * @author Florian Dold
      * 
      */
     @Retention(RetentionPolicy.RUNTIME)
@@ -88,7 +101,7 @@
     /**
      * Fill a byte array with the rest of the message in the buffer
      * 
-     * @author dold
+     * @author Florian Dold
      * 
      */
     @Retention(RetentionPolicy.RUNTIME)
@@ -103,58 +116,95 @@
         return (T) rl.get();
     }
 
-    public static ObjectParser makeParser(Class cls) {
+    public static Parser makeParser(Class cls) {
         // TODO: caching
 
         ObjectParser op = new ObjectParser(cls);
 
+        // adds the size of the child parser's object so specific locations
+        TotalSizeParser tsp = new TotalSizeParser(op);
+
         for (Field f : cls.getDeclaredFields()) {
             Annotation[] anns = f.getAnnotations();
-            for (int i = 0; i < anns.length; ++i) {
-                Annotation ann = anns[i];
-                if (ann instanceof SignedInteger) {
-                    if (i != anns.length - 1) {
-                        throw new RuntimeException(
-                                "Further annotations are forbidden after 
@SignedInteger");
-                    }
-                    SignedInteger a = (SignedInteger) ann;
-                    op.add(new SignedIntegerParser(a.value()), f);
-                } else if (ann instanceof UnsignedInteger) {
-                    if (i != anns.length - 1) {
-                        throw new RuntimeException(
-                                "Further annotations are forbidden after 
@UnignedInteger");
-                    }
-                    UnsignedInteger a = (UnsignedInteger) ann;
-                    op.add(new UnsignedIntegerParser(a.value()), f);
-                } else if (ann instanceof TotalSize) {
-                        throw new UnsupportedOperationException("total size 
not yet implemented");
+            if (anns.length == 0) {
+                continue;
+            }
 
-                } else if (ann instanceof Nested) {
-                    // this needs to be the last annotation
-                    if (i != anns.length - 1) {
-                        throw new RuntimeException(
-                                "Futher annotations are forbidden after 
@Nested");
-                    }
-                    ObjectParser child = makeParser(f.getType());
-                    op.add(child, f);
+            if (anns[0] instanceof TotalSize) {
+                Parser child = getFieldParser(f.getType(), anns, 1);
+                tsp.addSizeField(child, f);
+                op.add(child, f);
+            } else {
+                Parser p = getFieldParser(f.getType(), anns, 0);
+                op.add(p, f);
+            }
 
-                } else if (ann instanceof FixedSizeArray) {
-                    FixedSizeArray a = (FixedSizeArray) ann;
-                    
-                    //op.add(new FixedSizeArrayParser(a.length(), ), fields)
-                    //throw new UnsupportedOperationException(
-                    //        "not yet implemented");
-                    // look at anns[i+1]
-                    // [...]
-                } else {
-                    throw new RuntimeException("unknown construct annotation: "
-                            + ann.getClass());
+        }
+        return tsp;
+    }
+
+    /**
+     * get a "simple" parser that only writes to the field in question and has
+     * no other arguments
+     * 
+     * @param f
+     * @param anns
+     * @param start
+     * @return
+     */
+    public static Parser getFieldParser(Class cls, Annotation[] anns, int 
start) {
+        for (int i = start; i < anns.length; ++i) {
+            Annotation ann = anns[i];
+            if (ann instanceof SignedInteger) {
+                if (i != anns.length - 1) {
+                    throw new RuntimeException(
+                            "Further annotations are forbidden after 
@SignedInteger");
                 }
+                SignedInteger a = (SignedInteger) ann;
+                return new SignedIntegerParser(a.value());
+            } else if (ann instanceof UnsignedInteger) {
+                if (i != anns.length - 1) {
+                    throw new RuntimeException(
+                            "Further annotations are forbidden after 
@UnignedInteger");
+                }
+                UnsignedInteger a = (UnsignedInteger) ann;
+                return new UnsignedIntegerParser(a.value());
+            } else if (ann instanceof ZeroTerminatedString) {
+                if (i != anns.length - 1) {
+                    throw new RuntimeException(
+                            "Further annotations are forbidden after 
@ZeroTerminatedString");
+                }
+                ZeroTerminatedString a = (ZeroTerminatedString) ann;
+                return new StringParser();
+            } else if (ann instanceof TotalSize) {
+                throw new UnsupportedOperationException(
+                        "total size not yet implemented");
+
+            } else if (ann instanceof Nested) {
+                // this needs to be the last annotation
+                if (i != anns.length - 1) {
+                    throw new RuntimeException(
+                            "Futher annotations are forbidden after @Nested");
+                }
+                Parser child = makeParser(cls);
+                return child;
+
+            } else if (ann instanceof FixedSizeArray) {
+                FixedSizeArray a = (FixedSizeArray) ann;
+                Parser fp = getFieldParser(cls.getComponentType(), anns,
+                        start + 1);
+                return new FixedSizeArrayParser(a.length(), fp);
+            } else if (ann instanceof Fill) {
+                Parser fp = getFieldParser(cls.getComponentType(), anns,
+                        start + 1);
+                return new FillParser(fp);
+            } else {
+                throw new RuntimeException("unknown construct annotation: "
+                        + ann.getClass());
             }
         }
-        return op;
+        throw new RuntimeException("unreachable");
     }
-    
 
     /**
      * Given a byte array with a message, parse it into an object of type c. 
The
@@ -172,7 +222,7 @@
      *             (ugh)
      */
     public static <T> T parse(byte[] data, int offset, Class<T> cls) {
-        ObjectParser p = makeParser(cls);
+        Parser p = makeParser(cls);
 
         return Construct.parseWith(p, data, offset);
     }
@@ -191,7 +241,7 @@
      * @return number of bytes written to data, -1 on error
      */
     public static int writeTo(Object obj, byte[] data, int offset) {
-        ObjectParser p = makeParser(obj.getClass());
+        Parser p = makeParser(obj.getClass());
         return p.unparse(data, offset, RefLocation.makeLocationsWith(obj));
     }
 
@@ -203,7 +253,7 @@
      * @return number of bytes required, -1 on error
      */
     public static int estimateSize(Object obj) {
-        ObjectParser p = makeParser(obj.getClass());
+        Parser p = makeParser(obj.getClass());
         return p.estimateSize(RefLocation.makeLocationsWith(obj));
     }
 

Added: gnunet-java/src/org/gnunet/construct/FillParser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/FillParser.java                        
        (rev 0)
+++ gnunet-java/src/org/gnunet/construct/FillParser.java        2011-11-21 
09:51:37 UTC (rev 18228)
@@ -0,0 +1,83 @@
+package org.gnunet.construct;
+
+import java.lang.reflect.Array;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * Parse an array that takes up all the available space.
+ * 
+ * @author Florian Dold
+ * 
+ */
+public class FillParser implements Parser {
+    Parser p;
+
+    public FillParser(Parser p) {
+        this.p = p;
+    }
+
+    @Override
+    public int parse(byte[] src_data, int offset, Location[] dst) {
+        assert dst.length == 1;
+        Location loc = dst[0];
+        
+        assert loc.getType().isArray();
+        
+        int parsed = 0;
+        
+        
+        List<Object> lst = new LinkedList<Object>();
+        
+        while (true) {
+            RefLocation rl = new RefLocation(loc.getType().getComponentType());
+            Location[] locs = {rl};
+            
+            try {
+            parsed += p.parse(src_data, offset+parsed, locs);
+            } catch (Construct.SizeError e) {
+                break;
+            }
+            
+            lst.add(rl.get());
+        }
+        
+        loc.put(lst.toArray());
+        
+        return parsed;
+    }
+
+    @Override
+    public int unparse(byte[] dst_data, int offset, Location[] src) {
+        assert src.length == 1;
+
+        Object arr = src[0].get();
+        int parsed = 0;
+
+        for (int i = 0; i < Array.getLength(arr); ++i) {
+            RefLocation rl = new 
RefLocation(arr.getClass().getComponentType());
+            rl.put(Array.get(arr, i));
+            Location[] locs = { rl };
+            parsed += p.unparse(dst_data, offset, locs);
+            offset += p.parse(dst_data, offset, locs);
+        }
+
+        return parsed;
+    }
+
+    @Override
+    public int estimateSize(Location[] args) {
+        assert args.length == 1;
+        int accum = 0;
+        Object arr = args[0].get();
+        for (int i = 0; i < Array.getLength(arr); ++i) {
+            RefLocation rl = new RefLocation();
+            rl.put(Array.get(arr, i));
+            Location[] locs = { rl };
+            accum += p.estimateSize(locs);
+        }
+        return accum;
+
+    }
+
+}

Modified: gnunet-java/src/org/gnunet/construct/FixedSizeArrayParser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/FixedSizeArrayParser.java      
2011-11-21 01:16:50 UTC (rev 18227)
+++ gnunet-java/src/org/gnunet/construct/FixedSizeArrayParser.java      
2011-11-21 09:51:37 UTC (rev 18228)
@@ -19,17 +19,18 @@
         
         assert loc.getType().isArray();
         
-        Object array = Array.newInstance(loc.getType(), size);
+        int parsed = 0;
         
+        Object array = Array.newInstance(loc.getType().getComponentType(), 
size);
+        
         for (int i = 0; i < size; ++i) {
-            RefLocation rl = new RefLocation();
+            RefLocation rl = new RefLocation(loc.getType().getComponentType());
             Location[] locs = {rl};
-            offset += p.parse(src_data, offset, locs);
+            parsed += p.parse(src_data, offset+parsed, locs);
             Array.set(array, i, rl.get());
         }
         
-        
-        return estimateSize(dst);
+        return parsed;
     }
 
     @Override
@@ -40,7 +41,7 @@
         int parsed = 0;
         
         for (int i = 0; i < size; ++i) {
-            RefLocation rl = new RefLocation();
+            RefLocation rl = new 
RefLocation(arr.getClass().getComponentType());
             rl.put(Array.get(arr, i));
             Location[] locs = {rl};
             parsed += p.unparse(dst_data, offset, locs);

Modified: gnunet-java/src/org/gnunet/construct/ObjectParser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/ObjectParser.java      2011-11-21 
01:16:50 UTC (rev 18227)
+++ gnunet-java/src/org/gnunet/construct/ObjectParser.java      2011-11-21 
09:51:37 UTC (rev 18228)
@@ -7,32 +7,28 @@
 
 import org.gnunet.construct.Construct.UnsignedInteger;
 
-class ParserRecord {
-    Parser p;
-    Field[] args;
+public class ObjectParser implements Parser {
 
-    public ParserRecord(Parser p, Field[] args) {
-        this.p = p;
-        this.args = args;
+    static class ParserRecord {
+        Parser p;
+        Field[] args;
+
+        public ParserRecord(Parser p, Field... args) {
+            this.p = p;
+            this.args = args;
+        }
     }
-}
 
-public class ObjectParser implements Parser {
-    
     /*
-    
-    
-    class TotalSizeParser implements Parser {
-    }
-    
-    
-    // the object parser stores the total size in the parsers before unparsing.
-    // TotalSize parsers do not affect parsing, except maybe for consistency 
checks
-    List<TotalSizeParser> total_size_parsers;
-    
-    
-    */
-    
+     * 
+     * 
+     * class TotalSizeParser implements Parser { }
+     * 
+     * 
+     * // the object parser stores the total size in the parsers before
+     * unparsing. // TotalSize parsers do not affect parsing, except maybe for
+     * consistency checks List<TotalSizeParser> total_size_parsers;
+     */
 
     // parser with arguments
     List<ParserRecord> parser_records = new LinkedList<ParserRecord>();
@@ -132,4 +128,28 @@
         }
         return size;
     }
+    
+    public int getParserOffset(Location[] args, Parser p) {
+        assert args.length == 1;
+        Object obj = args[0].get();
+
+        if (obj == null) {
+            throw new RuntimeException(
+                    "cannot deserialize null-reference as object");
+        }
+
+        int size = 0;
+        for (ParserRecord pr : this.parser_records) {
+            if (pr.p == p) {
+                return size;
+            }
+            // create locations from record
+            Location[] locs = getLocs(pr.args, obj);
+            int x = pr.p.estimateSize(locs);
+            assert x >= 0;
+            size += x;
+
+        }
+        throw new RuntimeException("parser not found");
+    }
 }

Modified: gnunet-java/src/org/gnunet/construct/SignedIntegerParser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/SignedIntegerParser.java       
2011-11-21 01:16:50 UTC (rev 18227)
+++ gnunet-java/src/org/gnunet/construct/SignedIntegerParser.java       
2011-11-21 09:51:37 UTC (rev 18228)
@@ -18,6 +18,14 @@
 
     public int parse(byte[] data, int offset, Location[] dest) {
         assert dest.length == 1;
+        
+        
+        
+        if (offset + byte_size > data.length) {
+            throw new Construct.SizeError();
+        }
+        
+        
 
         Location loc = dest[0];
 

Modified: gnunet-java/src/org/gnunet/construct/StringParser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/StringParser.java      2011-11-21 
01:16:50 UTC (rev 18227)
+++ gnunet-java/src/org/gnunet/construct/StringParser.java      2011-11-21 
09:51:37 UTC (rev 18228)
@@ -24,6 +24,9 @@
         }
         
         byte[] str_data = new byte[length];
+        
+        System.arraycopy(src_data, offset, str_data, 0, length);
+        
         String str;
         try {
             str = new String(str_data, cset);
@@ -37,14 +40,32 @@
 
     @Override
     public int unparse(byte[] dst_data, int offset, Location[] src) {
-        // TODO Auto-generated method stub
-        return 0;
+        String s = (String) src[0].get();
+        byte[] b;
+        try {
+            b = s.getBytes(cset);
+        } catch (UnsupportedEncodingException e) {
+            throw new RuntimeException();
+        }
+        
+        System.arraycopy(b, 0, dst_data, offset, b.length);
+        
+        dst_data[b.length] = (byte) 0;
+        
+        
+        // +1 for the 0-byte
+        return b.length + 1;  
     }
 
     @Override
     public int estimateSize(Location[] args) {
-        // TODO Auto-generated method stub
-        return 0;
+        String s = (String) args[0].get();
+        try {
+            byte[] b = s.getBytes(cset);
+            return b.length + 1;
+        } catch (UnsupportedEncodingException e) {
+            throw new RuntimeException();
+        }
     }
 
 

Added: gnunet-java/src/org/gnunet/construct/TotalSizeParser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/TotalSizeParser.java                   
        (rev 0)
+++ gnunet-java/src/org/gnunet/construct/TotalSizeParser.java   2011-11-21 
09:51:37 UTC (rev 18228)
@@ -0,0 +1,69 @@
+package org.gnunet.construct;
+
+import java.lang.reflect.Field;
+import java.util.LinkedList;
+import java.util.List;
+
+class ParserWithField {
+    Parser p;
+    Field f;
+}
+
+
+public class TotalSizeParser implements Parser {
+
+    ObjectParser op;
+
+    List<ParserWithField> size_fields = new LinkedList<ParserWithField>();
+
+    public TotalSizeParser(ObjectParser op) {
+        this.op = op;
+    }
+
+    @Override
+    public int parse(byte[] src_data, int offset, Location[] dst) {
+        // the easy case, just set all size_fields to size
+        int size = op.parse(src_data, offset, dst);
+        
+        Object o = dst[0].get();
+        
+        for (ParserWithField pwf : size_fields) {
+            try {
+                pwf.f.set(o, size);
+            } catch (IllegalArgumentException e) {
+                throw new RuntimeException();
+            } catch (IllegalAccessException e) {
+                throw new RuntimeException();
+            }
+        }
+        
+        // TODO: do sanity check on size / consistency
+        return size;
+    }
+
+    @Override
+    public int unparse(byte[] dst_data, int offset, Location[] src) {
+        int size = estimateSize(src);
+        
+        int ret = op.unparse(dst_data, offset, src);
+        
+        for (ParserWithField pwf : size_fields) {
+            int os = op.getParserOffset(src, pwf.p);
+            pwf.p.unparse(dst_data, offset+os, 
RefLocation.makeLocationsWith(size));
+        }
+        return ret;
+    }
+
+    @Override
+    public int estimateSize(Location[] args) {
+        return op.estimateSize(args);
+    }
+
+    public void addSizeField(Parser p, Field f) {
+        ParserWithField pwf = new ParserWithField();
+        pwf.p = p;
+        pwf.f = f;
+        size_fields.add(pwf);
+    }
+
+}

Modified: gnunet-java/src/org/gnunet/construct/UnsignedIntegerParser.java
===================================================================
--- gnunet-java/src/org/gnunet/construct/UnsignedIntegerParser.java     
2011-11-21 01:16:50 UTC (rev 18227)
+++ gnunet-java/src/org/gnunet/construct/UnsignedIntegerParser.java     
2011-11-21 09:51:37 UTC (rev 18228)
@@ -19,6 +19,11 @@
 
     public int parse(byte[] data, int offset, Location[] dest) {
         assert dest.length == 1;
+        
+        
+        if (offset + byte_size > data.length) {
+            throw new Construct.SizeError();
+        }
 
         Location loc = dest[0];
 

Modified: gnunet-java/src/org/gnunet/messages/MessageHeader.java
===================================================================
--- gnunet-java/src/org/gnunet/messages/MessageHeader.java      2011-11-21 
01:16:50 UTC (rev 18227)
+++ gnunet-java/src/org/gnunet/messages/MessageHeader.java      2011-11-21 
09:51:37 UTC (rev 18228)
@@ -15,6 +15,7 @@
     
     
     @Fill
-    byte[] body;
+    @UnsignedInteger(1)
+    public byte[] body;
        
 }

Added: gnunet-java/src/org/gnunet/messages/SizeTestMessage.java
===================================================================
--- gnunet-java/src/org/gnunet/messages/SizeTestMessage.java                    
        (rev 0)
+++ gnunet-java/src/org/gnunet/messages/SizeTestMessage.java    2011-11-21 
09:51:37 UTC (rev 18228)
@@ -0,0 +1,15 @@
+package org.gnunet.messages;
+
+import org.gnunet.construct.Construct.TotalSize;
+import org.gnunet.construct.Construct.UnsignedInteger;
+
+public class SizeTestMessage {
+    
+    @TotalSize
+    @UnsignedInteger(2)
+    public long total_size;
+    
+    @UnsignedInteger
+    public long someValue;
+
+}

Added: gnunet-java/src/org/gnunet/messages/StringTestMessage.java
===================================================================
--- gnunet-java/src/org/gnunet/messages/StringTestMessage.java                  
        (rev 0)
+++ gnunet-java/src/org/gnunet/messages/StringTestMessage.java  2011-11-21 
09:51:37 UTC (rev 18228)
@@ -0,0 +1,9 @@
+package org.gnunet.messages;
+
+import org.gnunet.construct.Construct.ZeroTerminatedString;
+
+
+public class StringTestMessage {
+    @ZeroTerminatedString
+    public String s;
+}

Modified: gnunet-java/src/org/gnunet/messages/TestMessage3.java
===================================================================
--- gnunet-java/src/org/gnunet/messages/TestMessage3.java       2011-11-21 
01:16:50 UTC (rev 18227)
+++ gnunet-java/src/org/gnunet/messages/TestMessage3.java       2011-11-21 
09:51:37 UTC (rev 18228)
@@ -6,9 +6,6 @@
 public class TestMessage3 {
 
     @FixedSizeArray(length=10)
-    @UnsignedInteger(4)
+    @UnsignedInteger(2)
     public int[] arr;
-    
-    
-    
 }

Added: gnunet-java/src/org/gnunet/messages/TestMessage4.java
===================================================================
--- gnunet-java/src/org/gnunet/messages/TestMessage4.java                       
        (rev 0)
+++ gnunet-java/src/org/gnunet/messages/TestMessage4.java       2011-11-21 
09:51:37 UTC (rev 18228)
@@ -0,0 +1,16 @@
+package org.gnunet.messages;
+
+import org.gnunet.construct.Construct.FixedSizeArray;
+import org.gnunet.construct.Construct.Nested;
+import org.gnunet.construct.Construct.UnsignedInteger;
+
+public class TestMessage4 {
+
+    @UnsignedInteger(2)
+    public int value;
+    
+    @FixedSizeArray(length=3)
+    @Nested
+    public TestMessage3[] tm3s;
+    
+}

Modified: gnunet-java/test/org/gnunet/construct/ConstructTest.java
===================================================================
--- gnunet-java/test/org/gnunet/construct/ConstructTest.java    2011-11-21 
01:16:50 UTC (rev 18227)
+++ gnunet-java/test/org/gnunet/construct/ConstructTest.java    2011-11-21 
09:51:37 UTC (rev 18228)
@@ -3,7 +3,10 @@
 import org.gnunet.messages.MessageHeader;
 import org.gnunet.messages.SimpleTestMessage;
 import org.gnunet.messages.SimpleTestMessage2;
+import org.gnunet.messages.SizeTestMessage;
+import org.gnunet.messages.StringTestMessage;
 import org.gnunet.messages.TestMessage3;
+import org.gnunet.messages.TestMessage4;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -11,7 +14,7 @@
 
     @Test
     public void test_SimpleTestMessage_1() {
-        ObjectParser op = Construct.makeParser(SimpleTestMessage.class);
+        Parser op = Construct.makeParser(SimpleTestMessage.class);
         byte[] a = { 0x02, 0x01, // v1
                 0x00, 0x1c, // v2
                 0x00, 0x00, 0x00, 0x05 // nested
@@ -21,8 +24,6 @@
         Assert.assertTrue(m.v1 == ((0x02 << 8) | 0x01));
         Assert.assertTrue(m.v2 == 0x1c);
 
-        System.out.println(Construct.estimateSize(m));
-
         Assert.assertEquals(8, Construct.estimateSize(m));
     }
 
@@ -32,11 +33,10 @@
 
         m1.v1 = 42;
         m1.v2 = 420;
-        
+
         m1.mn = new SimpleTestMessage2();
         m1.mn.value = 300;
 
-
         byte[] data = Construct.unparse(m1);
 
         SimpleTestMessage m2 = Construct
@@ -45,13 +45,83 @@
         Assert.assertEquals(m1, m2);
 
     }
-    
+
     @Test
     public void test_TestMessage3() {
         TestMessage3 tm3 = new TestMessage3();
         tm3.arr = new int[10];
+
+        int size = Construct.estimateSize(tm3);
+
+        Assert.assertEquals(2 * 10, size);
+
+        byte[] data = Construct.unparse(tm3);
+
+        TestMessage3 tm3_2 = Construct.parse(data, 0, TestMessage3.class);
+    }
+
+    @Test
+    public void test_TestMessage4() {
+        TestMessage4 tm4 = new TestMessage4();
+        tm4.tm3s = new TestMessage3[3];
+
+        for (int i = 0; i < 3; ++i) {
+            TestMessage3 tm3 = new TestMessage3();
+            tm3.arr = new int[10];
+            tm4.tm3s[i] = tm3;
+        }
+
+        tm4.value = 54;
+
+        Assert.assertEquals(10*2*3 + 2, Construct.estimateSize(tm4));
         
-        Assert.assertEquals(10*4, Construct.estimateSize(tm3));
+        byte[] data = Construct.unparse(tm4);
+        
+        TestMessage4 tm4_2 = Construct.parse(data, 0, TestMessage4.class);
+        
+        // do equality check
+        // [...]
+
     }
+    
+    
+    @Test
+    public void test_SizeTestMessage() {
+        SizeTestMessage stm = new SizeTestMessage();
+        
+        byte[] data = Construct.unparse(stm);
+        
+        int size = data[0] << 8 | data[1];
+        
+        Assert.assertEquals(size, Construct.estimateSize(stm));
+        
+        SizeTestMessage stm_2 = Construct.parse(data, 0, 
SizeTestMessage.class);
+        
+        Assert.assertEquals(stm_2.total_size, Construct.estimateSize(stm_2));
+    }
+    
+    @Test
+    public void test_StringTestMessage() {
+        StringTestMessage stm = new StringTestMessage();
+        stm.s = "Hallo, Welt!";
+        
+        byte[] data = Construct.unparse(stm);
+        
+        StringTestMessage stm_2 = Construct.parse(data, 0, 
StringTestMessage.class);
+        
+        Assert.assertEquals(stm.s, stm_2.s);
+        
+    }
+    
+    @Test
+    public void test_MessageHeader() {
+        MessageHeader h = new MessageHeader();
+        h.type = 42;
+        h.body = new byte[20];
+        
+        byte[] data = Construct.unparse(h);
+        
+        MessageHeader h2 = Construct.parse(data, 0, MessageHeader.class);
+    }
 
 }




reply via email to

[Prev in Thread] Current Thread [Next in Thread]