[Top][All Lists]
[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);
+ }
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r18228 - in gnunet-java: . src/org/gnunet/construct src/org/gnunet/messages test/org/gnunet/construct,
gnunet <=