From 79ffb37b4c3e81a3e8b1f6a3d1a6c41ff6d7bf7a Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Tue, 12 May 2020 20:16:47 -0400 Subject: [PATCH] sbt -> maven, scalatest -> junit --- .travis.yml | 5 +- Makefile | 5 - benchmark/pom.xml | 92 ++ compiler/pom.xml | 98 ++ .../test/java/org/capnproto/EncodingTest.java | 851 ++++++++++++++++++ .../src/test/java/org/capnproto/TestUtil.java | 348 +++++++ .../scala/org/capnproto/EncodingSuite.scala | 848 ----------------- .../test/scala/org/capnproto/TestUtil.scala | 379 -------- examples/pom.xml | 90 ++ pom.xml | 34 + project/build.properties | 1 - project/build.scala | 179 ---- project/plugins.sbt | 7 - runtime/pom.xml | 40 + .../org/capnproto/ArrayInputStreamTest.java} | 33 +- .../test/java/org/capnproto/LayoutTest.java | 127 +++ .../org/capnproto/SerializePackedTest.java | 85 ++ .../java/org/capnproto/SerializeTest.java | 128 +++ .../scala/org/capnproto/LayoutSuite.scala | 144 --- .../org/capnproto/SerializePackedSuite.scala | 89 -- .../scala/org/capnproto/SerializeSuite.scala | 123 --- version.sbt | 1 - 22 files changed, 1913 insertions(+), 1794 deletions(-) create mode 100644 benchmark/pom.xml create mode 100644 compiler/pom.xml create mode 100644 compiler/src/test/java/org/capnproto/EncodingTest.java create mode 100644 compiler/src/test/java/org/capnproto/TestUtil.java delete mode 100644 compiler/src/test/scala/org/capnproto/EncodingSuite.scala delete mode 100644 compiler/src/test/scala/org/capnproto/TestUtil.scala create mode 100644 examples/pom.xml create mode 100644 pom.xml delete mode 100644 project/build.properties delete mode 100644 project/build.scala delete mode 100644 project/plugins.sbt create mode 100644 runtime/pom.xml rename runtime/src/test/{scala/org/capnproto/ArrayInputStreamSuite.scala => java/org/capnproto/ArrayInputStreamTest.java} (64%) create mode 100644 runtime/src/test/java/org/capnproto/LayoutTest.java create mode 100644 runtime/src/test/java/org/capnproto/SerializePackedTest.java create mode 100644 runtime/src/test/java/org/capnproto/SerializeTest.java delete mode 100644 runtime/src/test/scala/org/capnproto/LayoutSuite.scala delete mode 100644 runtime/src/test/scala/org/capnproto/SerializePackedSuite.scala delete mode 100644 runtime/src/test/scala/org/capnproto/SerializeSuite.scala delete mode 100644 version.sbt diff --git a/.travis.yml b/.travis.yml index add81f7..fef94bd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,7 +28,6 @@ jdk: - openjdk8 script: - make CC=gcc-7 CXX=g++-7 - - make CC=gcc-7 CXX=g++-7 addressbook - - sbt test - - sbt doc + - mvn compile + - mvn test diff --git a/Makefile b/Makefile index 1c3ef13..1e041a5 100644 --- a/Makefile +++ b/Makefile @@ -28,8 +28,3 @@ MINGW_CXX=i686-w64-mingw32-g++ MINGW_FLAGS=-O2 -DNDEBUG -I/usr/local/include -std=c++14 -static -static-libgcc -static-libstdc++ capnpc-java.exe : $(CAPNPC_JAVA_SOURCES) $(MINGW_CXX) $(MINGW_FLAGS) $(CAPNPC_JAVA_SOURCES) $(MINGW_LIBS) -o capnpc-java.exe - -addressbook : capnpc-java - PWD=pwd - mkdir -p examples/src/main/generated - capnp compile -I$(PWD)/compiler/src/main/schema --src-prefix=examples/src/main/schema -o./capnpc-java:examples/src/main/generated examples/src/main/schema/addressbook.capnp diff --git a/benchmark/pom.xml b/benchmark/pom.xml new file mode 100644 index 0000000..474d7ff --- /dev/null +++ b/benchmark/pom.xml @@ -0,0 +1,92 @@ + + + 4.0.0 + org.capnproto + benchmark + jar + capnproto-java benchmark + 0.1.4 + capnproto-java benchmark + + org.capnproto + + https://capnproto.org/ + + + MIT + http://opensource.org/licenses/MIT + repo + + + + git@github.com:capnproto/capnproto-java.git + scm:git@github.com:capnproto/capnproto-java.git + + + + dwrensha + David Renshaw + https://github.com/dwrensha + + + + + org.capnproto + runtime + 0.1.4 + + + + + + + maven-antrun-plugin + 3.0.0 + + + generate-sources + generate-sources + + + + + + + + + + + + + + + + + run + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + 3.1.0 + + + add-generated-sources + generate-sources + + add-source + + + + src/main/generated + + + + + + + + diff --git a/compiler/pom.xml b/compiler/pom.xml new file mode 100644 index 0000000..4cbede3 --- /dev/null +++ b/compiler/pom.xml @@ -0,0 +1,98 @@ + + + 4.0.0 + org.capnproto + compiler + jar + schema compiler plugin for java + 0.1.4 + capnpc-java + + org.capnproto + + https://capnproto.org/ + + + MIT + http://opensource.org/licenses/MIT + repo + + + + git@github.com:capnproto/capnproto-java.git + scm:git@github.com:capnproto/capnproto-java.git + + + + dwrensha + David Renshaw + https://github.com/dwrensha + + + + + junit + junit + 4.12 + test + + + + org.capnproto + runtime + 0.1.4 + + + + + + + maven-antrun-plugin + 3.0.0 + + + generate-test-sources + generate-test-sources + + + + + + + + + + + + + + + + run + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + 3.1.0 + + + add-generated-test-sources + generate-test-sources + + add-test-source + + + + src/test/generated + + + + + + + + diff --git a/compiler/src/test/java/org/capnproto/EncodingTest.java b/compiler/src/test/java/org/capnproto/EncodingTest.java new file mode 100644 index 0000000..ca1a702 --- /dev/null +++ b/compiler/src/test/java/org/capnproto/EncodingTest.java @@ -0,0 +1,851 @@ +package org.capnproto.test; + +import org.capnproto.*; +import org.capnproto.Void; +import org.junit.Assert; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +public class EncodingTest { + @org.junit.Test + public void testAllTypes() { + MessageBuilder message = new MessageBuilder(); + Test.TestAllTypes.Builder allTypes = message.initRoot(Test.TestAllTypes.factory); + TestUtil.initTestMessage(allTypes); + TestUtil.checkTestMessage(allTypes); + TestUtil.checkTestMessage(allTypes.asReader()); + } + + @org.junit.Test + public void testAllTypesMultiSegment() { + MessageBuilder message = new MessageBuilder(5, BuilderArena.AllocationStrategy.FIXED_SIZE); + Test.TestAllTypes.Builder allTypes = message.initRoot(Test.TestAllTypes.factory); + TestUtil.initTestMessage(allTypes); + + TestUtil.checkTestMessage(allTypes); + TestUtil.checkTestMessage(allTypes.asReader()); + } + + @org.junit.Test + public void testSetters() { + MessageBuilder message = new MessageBuilder(); + Test.TestAllTypes.Builder allTypes = message.initRoot(Test.TestAllTypes.factory); + TestUtil.initTestMessage(allTypes); + + MessageBuilder message2 = new MessageBuilder(); + Test.TestAllTypes.Builder allTypes2 = message2.initRoot(Test.TestAllTypes.factory); + + allTypes2.setStructField(allTypes.asReader()); + TestUtil.checkTestMessage(allTypes2.getStructField()); + + Test.TestAllTypes.Reader reader = allTypes2.asReader().getStructField(); + TestUtil.checkTestMessage(reader); + } + + @org.junit.Test + public void testZeroing() { + MessageBuilder message = new MessageBuilder(); + Test.TestAllTypes.Builder allTypes = message.initRoot(Test.TestAllTypes.factory); + + StructList.Builder structList = allTypes.initStructList(3); + TestUtil.initTestMessage(structList.get(0)); + + Test.TestAllTypes.Builder structField = allTypes.initStructField(); + TestUtil.initTestMessage(structField); + + TestUtil.initTestMessage(structList.get(1)); + TestUtil.initTestMessage(structList.get(2)); + TestUtil.checkTestMessage(structList.get(0)); + allTypes.initStructList(0); + + TestUtil.checkTestMessage(allTypes.getStructField()); + Test.TestAllTypes.Reader allTypesReader = allTypes.asReader(); + TestUtil.checkTestMessage(allTypesReader.getStructField()); + + AnyPointer.Builder any = message.initRoot(AnyPointer.factory); + ByteBuffer[] segments = message.getSegmentsForOutput(); + for (ByteBuffer segment : segments) { + for (int j = 0; j < segment.limit(); j++) { + Assert.assertEquals(segment.get(j), 0); + } + } + } + + @org.junit.Test + public void testDoubleFarPointers() throws IOException { + byte[] bytes = new byte[]{2, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, + 6, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 1, 7, -1, 127, 0, 0, 0, 0}; + + ArrayInputStream input = new ArrayInputStream(java.nio.ByteBuffer.wrap(bytes)); + MessageReader message = org.capnproto.Serialize.read(input); + Test.TestAllTypes.Reader root = message.getRoot(Test.TestAllTypes.factory); + + Assert.assertTrue(root.getBoolField()); + Assert.assertEquals(root.getInt8Field(), 7); + Assert.assertEquals(root.getInt16Field(), 32767); + } + + @org.junit.Test + public void testUpgradeStruct() { + MessageBuilder builder = new MessageBuilder(); + Test.TestAnyPointer.Builder root = builder.initRoot(Test.TestAnyPointer.factory); + + { + Test.TestOldVersion.Builder oldVersion = root.getAnyPointerField().initAs(Test.TestOldVersion.factory); + oldVersion.setOld1(123); + oldVersion.setOld2("foo"); + Test.TestOldVersion.Builder sub = oldVersion.initOld3(); + sub.setOld1(456); + sub.setOld2("bar"); + } + + { + Test.TestNewVersion.Reader newVersion = root.getAnyPointerField().asReader().getAs(Test.TestNewVersion.factory); + Assert.assertEquals(newVersion.getOld1(), 123); + Assert.assertEquals(newVersion.getOld2().toString(), "foo"); + Assert.assertEquals(newVersion.getNew2().toString(), "baz"); + Assert.assertEquals(newVersion.hasNew2(), false); + Assert.assertEquals(newVersion.hasNew3(), false); + } + } + + @org.junit.Test + public void testUpgradeStructInBuilder() { + MessageBuilder builder = new MessageBuilder(); + Test.TestAnyPointer.Builder root = builder.initRoot(Test.TestAnyPointer.factory); + + { + Test.TestOldVersion.Builder oldVersion = root.getAnyPointerField().initAs(Test.TestOldVersion.factory); + oldVersion.setOld1(123); + oldVersion.setOld2("foo"); + Test.TestOldVersion.Builder sub = oldVersion.initOld3(); + sub.setOld1(456); + sub.setOld2("bar"); + } + { + Test.TestNewVersion.Builder newVersion = root.getAnyPointerField().getAs(Test.TestNewVersion.factory); + Assert.assertEquals(newVersion.getOld1(), 123); + Assert.assertEquals(newVersion.getOld2().toString(), "foo"); + Assert.assertEquals(newVersion.getNew1(), 987); + Assert.assertEquals(newVersion.getNew2().toString(), "baz"); + Test.TestNewVersion.Builder sub = newVersion.getOld3(); + Assert.assertEquals(sub.getOld1(), 456); + Assert.assertEquals(sub.getOld2().toString(), "bar"); + + newVersion.setOld1(234); + newVersion.setOld2("qux"); + newVersion.setNew1(654); + newVersion.setNew2("quux"); + } + { + Test.TestOldVersion.Builder oldVersion = root.getAnyPointerField().getAs(Test.TestOldVersion.factory); + Assert.assertEquals(oldVersion.getOld1(), 234); + Assert.assertEquals(oldVersion.getOld2().toString(), "qux"); + } + } + + @org.junit.Test + public void testStructListUpgrade() { + MessageBuilder message = new MessageBuilder(); + Test.TestAnyPointer.Builder root = message.initRoot(Test.TestAnyPointer.factory); + AnyPointer.Builder any = root.getAnyPointerField(); + + { + PrimitiveList.Long.Builder longs = any.initAs(PrimitiveList.Long.factory, 3); + longs.set(0, 123); + longs.set(1, 456); + longs.set(2, 789); + } + { + StructList.Reader olds = any.asReader().getAs(Test.TestOldVersion.listFactory); + Assert.assertEquals(olds.get(0).getOld1(), 123); + Assert.assertEquals(olds.get(1).getOld1(), 456); + Assert.assertEquals(olds.get(2).getOld1(), 789); + } + { + StructList.Builder olds = any.getAs(Test.TestOldVersion.listFactory); + Assert.assertEquals(olds.size(), 3); + Assert.assertEquals(olds.get(0).getOld1(), 123); + Assert.assertEquals(olds.get(1).getOld1(), 456); + Assert.assertEquals(olds.get(2).getOld1(), 789); + + olds.get(0).setOld2("zero"); + olds.get(1).setOld2("one"); + olds.get(2).setOld2("two"); + } + { + StructList.Builder news = any.getAs(Test.TestNewVersion.listFactory); + Assert.assertEquals(news.size(), 3); + Assert.assertEquals(news.get(0).getOld1(), 123); + Assert.assertEquals(news.get(0).getOld2().toString(), "zero"); + + Assert.assertEquals(news.get(1).getOld1(), 456); + Assert.assertEquals(news.get(1).getOld2().toString(), "one"); + + Assert.assertEquals(news.get(2).getOld1(), 789); + Assert.assertEquals(news.get(2).getOld2().toString(), "two"); + } + } + + @org.junit.Test + public void testStructListUpgradeDoubleFar() { + byte[] bytes = new byte[]{ + 1,0,0,0,0x1f,0,0,0, // list, inline composite, 3 words + 4, 0, 0, 0, 1, 0, 2, 0, // struct tag. 1 element, 1 word data, 2 pointers. + 91,0,0,0,0,0,0,0, // data: 91 + 0x05,0,0,0, 0x42,0,0,0, // list pointer, offset 1, type = BYTE, length 8. + 0,0,0,0,0,0,0,0, // null pointer + 0x68,0x65,0x6c,0x6c,0x6f,0x21,0x21,0}; // "hello!!" + + ByteBuffer segment = java.nio.ByteBuffer.wrap(bytes); + segment.order(java.nio.ByteOrder.LITTLE_ENDIAN); + MessageReader messageReader = new MessageReader(new ByteBuffer[]{segment}, ReaderOptions.DEFAULT_READER_OPTIONS); + + StructList.Factory oldFactory = + new StructList.Factory(Test.TestOldVersion.factory); + StructList.Reader oldVersion = messageReader.getRoot(oldFactory); + + Assert.assertEquals(oldVersion.size(), 1); + Assert.assertEquals(oldVersion.get(0).getOld1(), 91); + Assert.assertEquals(oldVersion.get(0).getOld2().toString(), "hello!!"); + + // Make the first segment exactly large enough to fit the original message. + // This leaves no room for a far pointer landing pad in the first segment. + MessageBuilder message = new MessageBuilder(6); + message.setRoot(oldFactory, oldVersion); + + ByteBuffer[] segments = message.getSegmentsForOutput(); + Assert.assertEquals(segments.length, 1); + Assert.assertEquals(segments[0].limit(), 6 * 8); + + StructList.Factory newFactory = + new StructList.Factory(Test.TestNewVersion.factory); + StructList.Builder newVersion = message.getRoot(newFactory); + Assert.assertEquals(newVersion.size(), 1); + Assert.assertEquals(newVersion.get(0).getOld1(), 91); + Assert.assertEquals(newVersion.get(0).getOld2().toString(), "hello!!"); + + ByteBuffer[] segments1 = message.getSegmentsForOutput(); + Assert.assertEquals(segments[0].limit(), 6 * 8); + for (int ii = 8; ii < (5 * 8) - 1; ++ii) { + // Check the the old list, including the tag, was zeroed. + Assert.assertEquals(segments[0].get(ii), 0); + } + } + + @org.junit.Test + public void testListBuilderAsReader() { + MessageBuilder message = new MessageBuilder(); + Test.TestAllTypes.Builder allTypes = message.initRoot(Test.TestAllTypes.factory); + + allTypes.initVoidList(10); + Assert.assertEquals(allTypes.getVoidList().asReader().size(), 10); + + PrimitiveList.Boolean.Builder boolList = allTypes.initBoolList(7); + boolList.set(3, true); + PrimitiveList.Boolean.Reader boolListReader = boolList.asReader(); + Assert.assertEquals(boolListReader.size(), 7); + Assert.assertEquals(boolListReader.get(0), false); + Assert.assertEquals(boolListReader.get(1), false); + Assert.assertEquals(boolListReader.get(2), false); + Assert.assertEquals(boolListReader.get(3), true); + Assert.assertEquals(boolListReader.get(4), false); + + PrimitiveList.Byte.Builder int8List = allTypes.initInt8List(9); + int8List.set(4, (byte)100); + int8List.set(8, (byte)11); + PrimitiveList.Byte.Reader int8ListReader = int8List.asReader(); + Assert.assertEquals(int8ListReader.size(), 9); + Assert.assertEquals(int8ListReader.get(0), 0); + Assert.assertEquals(int8ListReader.get(4), 100); + Assert.assertEquals(int8ListReader.get(8), 11); + + PrimitiveList.Short.Builder int16List = allTypes.initInt16List(2); + int16List.set(0, (short)1); + PrimitiveList.Short.Reader int16ListReader = int16List.asReader(); + Assert.assertEquals(int16ListReader.size(), 2); + Assert.assertEquals(int16ListReader.get(0), 1); + Assert.assertEquals(int16ListReader.get(1), 0); + + // TODO other primitive lists + + TextList.Builder textList = allTypes.initTextList(1); + textList.set(0, new Text.Reader("abcdefg")); + TextList.Reader textListReader = textList.asReader(); + Assert.assertEquals(textListReader.size(), 1); + Assert.assertEquals(textListReader.get(0).toString(), "abcdefg"); + + DataList.Builder dataList = allTypes.initDataList(1); + dataList.set(0, new Data.Reader(new byte[]{1,2,3,4})); + DataList.Reader dataListReader = dataList.asReader(); + Assert.assertEquals(dataListReader.size(), 1); + Assert.assertTrue(java.util.Arrays.equals(dataListReader.get(0).toArray(), new byte[]{1,2,3,4})); + + StructList.Builder structList = allTypes.initStructList(2); + structList.get(0).setInt8Field((byte)5); + structList.get(1).setInt8Field((byte)9); + StructList.Reader structListReader = structList.asReader(Test.TestAllTypes.factory); + Assert.assertEquals(structListReader.size(), 2); + Assert.assertEquals(structListReader.get(0).getInt8Field(), 5); + Assert.assertEquals(structListReader.get(1).getInt8Field(), 9); + + EnumList.Builder enumList = allTypes.initEnumList(3); + enumList.set(0, Test.TestEnum.FOO); + enumList.set(1, Test.TestEnum.BAR); + enumList.set(2, Test.TestEnum.BAZ); + EnumList.Reader enumListReader = enumList.asReader(); + Assert.assertEquals(enumListReader.size(), 3); + Assert.assertEquals(enumListReader.get(0), Test.TestEnum.FOO); + Assert.assertEquals(enumListReader.get(1), Test.TestEnum.BAR); + Assert.assertEquals(enumListReader.get(2), Test.TestEnum.BAZ); + } + + @org.junit.Test + public void testNestedListBuilderAsReader() { + MessageBuilder builder = new MessageBuilder(); + Test.TestLists.Builder root = builder.initRoot(Test.TestLists.factory); + + ListList.Builder> structListList = root.initStructListList(3); + StructList.Builder structList0 = structListList.init(0, 1); + structList0.get(0).setInt16Field((short)1); + // leave structList1 as default + StructList.Builder structList2 = structListList.init(2, 3); + structList2.get(0).setInt16Field((short)22); + structList2.get(1).setInt16Field((short)333); + structList2.get(2).setInt16Field((short)4444); + + ListList.Reader> structListListReader = + structListList.asReader(new StructList.Factory(Test.TestAllTypes.factory)); + Assert.assertEquals(structListListReader.size(), 3); + StructList.Reader structList0Reader = structListListReader.get(0); + Assert.assertEquals(structList0Reader.size(), 1); + Assert.assertEquals(structList0Reader.get(0).getInt16Field(), 1); + Assert.assertEquals(structListListReader.get(1).size(), 0); + StructList.Reader structList2Reader = structListListReader.get(2); + Assert.assertEquals(structList2Reader.size(), 3); + Assert.assertEquals(structList2Reader.get(0).getInt16Field(), 22); + Assert.assertEquals(structList2Reader.get(1).getInt16Field(), 333); + Assert.assertEquals(structList2Reader.get(2).getInt16Field(), 4444); + } + + @org.junit.Test + public void testGenerics() { + MessageBuilder message = new MessageBuilder(); + Test.TestGenerics.Factory factory = Test.TestGenerics.newFactory(Test.TestAllTypes.factory, Text.factory); + + Test.TestGenerics.Builder root = (Test.TestGenerics.Builder) message.initRoot(factory); + TestUtil.initTestMessage(root.getFoo()); + root.getDub().setFoo(Text.factory, new Text.Reader("Hello")); + + PrimitiveList.Byte.Builder bar = root.getDub().initBar(1); + bar.set(0, (byte) 11); + Test.TestAllTypes.Builder revBar = root.getRev().getBar(); + revBar.setInt8Field((byte) 111); + PrimitiveList.Boolean.Builder boolList = revBar.initBoolList(2); + boolList.set(0, false); + boolList.set(1, true); + + TestUtil.checkTestMessage(root.getFoo()); + Test.TestGenerics.Reader rootReader = root.asReader(factory); + TestUtil.checkTestMessage(rootReader.getFoo()); + Test.TestGenerics.Builder dubReader = root.getDub(); + Assert.assertEquals(dubReader.getFoo().toString(), "Hello"); + PrimitiveList.Byte.Builder barReader = dubReader.getBar(); + Assert.assertEquals(1, barReader.size()); + Assert.assertEquals(11, barReader.get(0)); + } + + @org.junit.Test + public void testUseGenerics() { + MessageBuilder message = new MessageBuilder(); + Test.TestUseGenerics.Builder root = message.initRoot(Test.TestUseGenerics.factory); + { + MessageBuilder message2 = new MessageBuilder(); + Test.TestGenerics.Factory factory2 = Test.TestGenerics.newFactory(AnyPointer.factory, AnyPointer.factory); + Test.TestGenerics.Builder root2 = message2.initRoot(factory2); + root2.initDub().setFoo(Text.factory, new Text.Reader("foobar")); + + root.setUnspecified(factory2, root2.asReader(factory2)); + } + + Assert.assertEquals("foobar", root.getUnspecified().getDub().getFoo().toString()); + } + + @org.junit.Test + public void testDefaults() { + MessageBuilder message = new MessageBuilder(); + Test.TestDefaults.Builder defaults = message.initRoot(Test.TestDefaults.factory); + TestUtil.checkDefaultMessage(defaults); + TestUtil.checkDefaultMessage(defaults.asReader()); + TestUtil.setDefaultMessage(defaults); + TestUtil.checkSettedDefaultMessage(defaults.asReader()); + } + + @org.junit.Test + public void testUnions() { + MessageBuilder builder = new MessageBuilder(); + Test.TestUnion.Builder root = builder.initRoot(Test.TestUnion.factory); + Test.TestUnion.Union0.Builder u0 = root.initUnion0(); + u0.initU0f1sp(10); + Assert.assertEquals(u0.which(), Test.TestUnion.Union0.Which.U0F1SP); + + u0.initPrimitiveList(10); + Assert.assertEquals(u0.which(), Test.TestUnion.Union0.Which.PRIMITIVE_LIST); + } + + @org.junit.Test + public void testGroups() { + MessageBuilder builder = new MessageBuilder(); + Test.TestGroups.Builder root = builder.initRoot(Test.TestGroups.factory); + { + Test.TestGroups.Groups.Foo.Builder foo = root.getGroups().initFoo(); + foo.setCorge(12345678); + foo.setGrault(123456789012345L); + foo.setGarply(new Text.Reader("foobar")); + + Assert.assertEquals(12345678, foo.getCorge()); + Assert.assertEquals(123456789012345L, foo.getGrault()); + Assert.assertEquals("foobar", foo.getGarply().toString()); + } + { + Test.TestGroups.Groups.Bar.Builder bar = root.getGroups().initBar(); + bar.setCorge(23456789); + bar.setGrault(new Text.Reader("barbaz")); + bar.setGarply(234567890123456L); + + Assert.assertEquals(23456789, bar.getCorge()); + Assert.assertEquals("barbaz", bar.getGrault().toString()); + Assert.assertEquals(234567890123456L, bar.getGarply()); + } + { + Test.TestGroups.Groups.Baz.Builder baz = root.getGroups().initBaz(); + baz.setCorge(34567890); + baz.setGrault(new Text.Reader("bazqux")); + baz.setGarply(new Text.Reader("quxquux")); + + Assert.assertEquals(34567890, baz.getCorge()); + Assert.assertEquals("bazqux", baz.getGrault().toString()); + Assert.assertEquals("quxquux", baz.getGarply().toString()); + } + } + + @org.junit.Test + public void testNestedLists() { + MessageBuilder builder = new MessageBuilder(); + Test.TestLists.Builder root = builder.initRoot(Test.TestLists.factory); + { + ListList.Builder intListList = root.initInt32ListList(2); + PrimitiveList.Int.Builder intList0 = intListList.init(0, 4); + intList0.set(0, 1); + intList0.set(1, 2); + intList0.set(2, 3); + intList0.set(3, 4); + PrimitiveList.Int.Builder intList1 = intListList.init(1, 1); + intList1.set(0, 100); + } + { + Test.TestLists.Reader reader = root.asReader(); + ListList.Reader intListList = reader.getInt32ListList(); + Assert.assertEquals(2, intListList.size()); + PrimitiveList.Int.Reader intList0 = intListList.get(0); + Assert.assertEquals(4, intList0.size()); + Assert.assertEquals(1, intList0.get(0)); + Assert.assertEquals(2, intList0.get(1)); + Assert.assertEquals(3, intList0.get(2)); + Assert.assertEquals(4, intList0.get(3)); + PrimitiveList.Int.Reader intList1 = intListList.get(1); + Assert.assertEquals(1, intList1.size()); + Assert.assertEquals(100, intList1.get(0)); + } + } + + @org.junit.Test + public void testConstants() { + Assert.assertEquals(Void.VOID, Test.TestConstants.VOID_CONST); + Assert.assertEquals(true, Test.TestConstants.BOOL_CONST); + Assert.assertEquals(-123, Test.TestConstants.INT8_CONST); + Assert.assertEquals(-12345, Test.TestConstants.INT16_CONST); + Assert.assertEquals(-12345678, Test.TestConstants.INT32_CONST); + Assert.assertEquals(-123456789012345L, Test.TestConstants.INT64_CONST); + + Assert.assertEquals(-22, Test.TestConstants.UINT8_CONST); + Assert.assertEquals(-19858, Test.TestConstants.UINT16_CONST); + Assert.assertEquals(-838178284, Test.TestConstants.UINT32_CONST); + Assert.assertEquals(-6101065172474983726L, Test.TestConstants.UINT64_CONST); + + Assert.assertEquals(1234.5f, Test.TestConstants.FLOAT32_CONST, TestUtil.DELTA); + Assert.assertEquals(-123e45, Test.TestConstants.FLOAT64_CONST, TestUtil.DELTA); + + Assert.assertEquals("foo", Test.TestConstants.TEXT_CONST.toString()); + Assert.assertArrayEquals(TestUtil.data("bar"), Test.TestConstants.DATA_CONST.toArray()); + + Assert.assertEquals(Test.TestEnum.CORGE, Test.TestConstants.ENUM_CONST); + { + Test.TestAllTypes.Reader subReader = Test.TestConstants.STRUCT_CONST; + Assert.assertEquals(subReader.getBoolField(), true); + Assert.assertEquals(subReader.getInt8Field(), -12); + Assert.assertEquals(subReader.getInt16Field(), 3456); + Assert.assertEquals(subReader.getInt32Field(), -78901234); + Assert.assertEquals(subReader.getInt64Field(), 56789012345678L); + Assert.assertEquals(subReader.getUInt8Field(), 90); + Assert.assertEquals(subReader.getUInt16Field(), 1234); + Assert.assertEquals(subReader.getUInt32Field(), 56789012); + Assert.assertEquals(subReader.getUInt64Field(), 345678901234567890L); + Assert.assertEquals(subReader.getFloat32Field(), -1.25e-10f, TestUtil.DELTA); + Assert.assertEquals(subReader.getFloat64Field(), 345, TestUtil.DELTA); + Assert.assertEquals(subReader.getTextField().toString(), "baz"); + } + + Assert.assertEquals(6, Test.TestConstants.VOID_LIST_CONST.size()); + + { + PrimitiveList.Boolean.Reader listReader = Test.TestConstants.BOOL_LIST_CONST; + Assert.assertEquals(4, listReader.size()); + Assert.assertEquals(true, listReader.get(0)); + Assert.assertEquals(false, listReader.get(1)); + Assert.assertEquals(false, listReader.get(2)); + Assert.assertEquals(true, listReader.get(3)); + } + + { + TextList.Reader listReader = Test.TestConstants.TEXT_LIST_CONST; + Assert.assertEquals(3, listReader.size()); + Assert.assertEquals("plugh", listReader.get(0).toString()); + Assert.assertEquals("xyzzy", listReader.get(1).toString()); + Assert.assertEquals("thud", listReader.get(2).toString()); + } + + { + StructList.Reader listReader = Test.TestConstants.STRUCT_LIST_CONST; + Assert.assertEquals(3, listReader.size()); + Assert.assertEquals("structlist 1", listReader.get(0).getTextField().toString()); + Assert.assertEquals("structlist 2", listReader.get(1).getTextField().toString()); + Assert.assertEquals("structlist 3", listReader.get(2).getTextField().toString()); + } + } + + @org.junit.Test + public void testGlobalConstants() { + Assert.assertEquals(Test.GLOBAL_INT, 12345); + } + + @org.junit.Test + public void testEmptyStruct() { + MessageBuilder builder = new MessageBuilder(); + Test.TestAnyPointer.Builder root = builder.initRoot(Test.TestAnyPointer.factory); + + Assert.assertFalse(root.hasAnyPointerField()); + + AnyPointer.Builder any = root.getAnyPointerField(); + Assert.assertTrue(any.isNull()); + any.initAs(Test.TestEmptyStruct.factory); + Assert.assertFalse(any.isNull()); + Assert.assertTrue(root.hasAnyPointerField()); + + { + Test.TestAnyPointer.Reader reader = root.asReader(); + Assert.assertTrue(reader.hasAnyPointerField()); + Assert.assertNotNull(reader.getAnyPointerField()); + } + } + + @org.junit.Test(expected=DecodeException.class) + public void testTextBuilderIntUnderflow() { + MessageBuilder builder = new MessageBuilder(); + Test.TestAnyPointer.Builder root = builder.initRoot(Test.TestAnyPointer.factory); + root.getAnyPointerField().initAs(Data.factory, 0); + root.getAnyPointerField().getAs(Text.factory); + } + + @org.junit.Test(expected=DecodeException.class) + public void testInlineCompositeListIntOverflow() throws DecodeException { + + byte[] bytes = new byte[]{0,0,0,0, 0,0,1,0, 1,0,0,0, 0x17,0,0,0, 0,0,0,-128, 16,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0}; + + ByteBuffer segment = ByteBuffer.wrap(bytes); + segment.order(ByteOrder.LITTLE_ENDIAN); + MessageReader message = new MessageReader(new ByteBuffer[]{segment}, ReaderOptions.DEFAULT_READER_OPTIONS); + + Test.TestAnyPointer.Reader root = message.getRoot(Test.TestAnyPointer.factory); + root.getAnyPointerField().getAs(new StructList.Factory(Test.TestAllTypes.factory)); + } + + @org.junit.Test(expected=DecodeException.class) + public void testInlineCompositeListIntOverflow2() throws DecodeException { + + byte[] bytes = new byte[]{0,0,0,0, 0,0,1,0, 1,0,0,0, 0x17,0,0,0, 0,0,0,-128, 16,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0}; + + ByteBuffer segment = ByteBuffer.wrap(bytes); + segment.order(ByteOrder.LITTLE_ENDIAN); + MessageReader message = new MessageReader(new ByteBuffer[]{segment}, ReaderOptions.DEFAULT_READER_OPTIONS); + + Test.TestAnyPointer.Reader root = message.getRoot(Test.TestAnyPointer.factory); + + MessageBuilder messageBuilder = new MessageBuilder(); + Test.TestAnyPointer.Builder builderRoot = messageBuilder.initRoot(Test.TestAnyPointer.factory); + builderRoot.getAnyPointerField().setAs(Test.TestAnyPointer.factory, root); + } + + @org.junit.Test(expected=DecodeException.class) + public void testVoidListAmplification() throws DecodeException { + MessageBuilder builder = new MessageBuilder(); + builder.initRoot(Test.TestAnyPointer.factory).getAnyPointerField().initAs(PrimitiveList.Void.factory, 1 << 28); + + ByteBuffer[] segments = builder.getSegmentsForOutput(); + Assert.assertEquals(1, segments.length); + + MessageReader reader = new MessageReader(segments, ReaderOptions.DEFAULT_READER_OPTIONS); + Test.TestAnyPointer.Reader root = reader.getRoot(Test.TestAnyPointer.factory); + root.getAnyPointerField().getAs(new StructList.Factory(Test.TestAllTypes.factory)); + } + + @org.junit.Test(expected=DecodeException.class) + public void testEmptyStructListAmplification() { + MessageBuilder builder = new MessageBuilder(); + builder.initRoot(Test.TestAnyPointer.factory).getAnyPointerField() + .initAs(new StructList.Factory(Test.TestEmptyStruct.factory), (1 << 29) - 1); + + ByteBuffer[] segments = builder.getSegmentsForOutput(); + Assert.assertEquals(1, segments.length); + + MessageReader reader = new MessageReader(segments, ReaderOptions.DEFAULT_READER_OPTIONS); + Test.TestAnyPointer.Reader root = reader.getRoot(Test.TestAnyPointer.factory); + root.getAnyPointerField().getAs(new StructList.Factory(Test.TestAllTypes.factory)); + } + + @org.junit.Test + public void testLongUint8List() { + MessageBuilder message = new MessageBuilder(); + Test.TestAllTypes.Builder allTypes = message.initRoot(Test.TestAllTypes.factory); + int length = (1 << 28) + 1; + PrimitiveList.Byte.Builder list = allTypes.initUInt8List(length); + Assert.assertEquals(list.size(), length); + list.set(length - 1, (byte)3); + Assert.assertEquals(list.get(length - 1), 3); + Assert.assertEquals(allTypes.asReader().getUInt8List().get(length - 1), 3); + } + + @org.junit.Test + public void testLongUint16List() { + MessageBuilder message = new MessageBuilder(); + Test.TestAllTypes.Builder allTypes = message.initRoot(Test.TestAllTypes.factory); + int length = (1 << 27) + 1; + PrimitiveList.Short.Builder list = allTypes.initUInt16List(length); + Assert.assertEquals(list.size(), length); + list.set(length - 1, (short)3); + Assert.assertEquals(list.get(length - 1), 3); + Assert.assertEquals(allTypes.asReader().getUInt16List().get(length - 1), 3); + } + + @org.junit.Test + public void testLongUint32List() { + MessageBuilder message = new MessageBuilder(); + Test.TestAllTypes.Builder allTypes = message.initRoot(Test.TestAllTypes.factory); + int length = (1 << 26) + 1; + PrimitiveList.Int.Builder list = allTypes.initUInt32List(length); + Assert.assertEquals(list.size(), length); + list.set(length - 1, 3); + Assert.assertEquals(list.get(length - 1), 3); + Assert.assertEquals(allTypes.asReader().getUInt32List().get(length - 1), 3); + } + + @org.junit.Test + public void testLongUint64List() { + MessageBuilder message = new MessageBuilder(); + Test.TestAllTypes.Builder allTypes = message.initRoot(Test.TestAllTypes.factory); + int length = (1 << 25) + 1; + PrimitiveList.Long.Builder list = allTypes.initUInt64List(length); + Assert.assertEquals(list.size(), length); + list.set(length - 1, 3); + Assert.assertEquals(list.get(length - 1), 3); + Assert.assertEquals(allTypes.asReader().getUInt64List().get(length - 1), 3); + } + + @org.junit.Test + public void testLongFloat32List() { + MessageBuilder message = new MessageBuilder(); + Test.TestAllTypes.Builder allTypes = message.initRoot(Test.TestAllTypes.factory); + int length = (1 << 26) + 1; + PrimitiveList.Float.Builder list = allTypes.initFloat32List(length); + Assert.assertEquals(list.size(), length); + list.set(length - 1, 3.14f); + Assert.assertEquals(list.get(length - 1), 3.14f, 0.0f); + Assert.assertEquals(allTypes.asReader().getFloat32List().get(length - 1), 3.14f, 0.0f); + } + + @org.junit.Test + public void testLongFloat64List() { + MessageBuilder message = new MessageBuilder(); + Test.TestAllTypes.Builder allTypes = message.initRoot(Test.TestAllTypes.factory); + int length = (1 << 25) + 1; + PrimitiveList.Double.Builder list = allTypes.initFloat64List(length); + Assert.assertEquals(list.size(), length); + list.set(length - 1, 3.14); + Assert.assertEquals(list.get(length - 1), 3.14, 0.0); + Assert.assertEquals(allTypes.asReader().getFloat64List().get(length - 1), 3.14, 0.0); + } + + @org.junit.Test + public void testLongStructList() { + MessageBuilder message = new MessageBuilder(); + Test.TestAllTypes.Builder allTypes = message.initRoot(Test.TestAllTypes.factory); + int length = (1 << 21) + 1; + StructList.Builder list = allTypes.initStructList(length); + Assert.assertEquals(list.size(), length); + list.get(length - 1).setUInt8Field((byte)3); + Assert.assertEquals(list.get(length - 1).getUInt8Field(), 3); + Assert.assertEquals(allTypes.asReader().getStructList().get(length - 1).getUInt8Field(), 3); + } + + @org.junit.Test + public void testLongTextList() { + MessageBuilder message = new MessageBuilder(); + Test.TestAllTypes.Builder allTypes = message.initRoot(Test.TestAllTypes.factory); + int length = (1 << 25) + 1; + TextList.Builder list = allTypes.initTextList(length); + Assert.assertEquals(list.size(), length); + list.set(length - 1, new Text.Reader("foo")); + Assert.assertEquals(list.get(length - 1).toString(), "foo"); + Assert.assertEquals(allTypes.asReader().getTextList().get(length - 1).toString(), "foo"); + } + + @org.junit.Test + public void testLongListList() { + MessageBuilder message = new MessageBuilder(); + Test.TestLists.Builder root = message.initRoot(Test.TestLists.factory); + int length = (1 << 25) + 1; + ListList.Builder> list = root.initStructListList(length); + Assert.assertEquals(list.size(), length); + list.init(length - 1, 3); + Assert.assertEquals(list.get(length - 1).size(), 3); + Assert.assertEquals(root.asReader().getStructListList().get(length - 1).size(), 3); + } + + @org.junit.Test + public void testStructSetters() { + MessageBuilder builder = new MessageBuilder(); + Test.TestAllTypes.Builder root = builder.initRoot(Test.TestAllTypes.factory); + TestUtil.initTestMessage(root); + + { + MessageBuilder builder2 = new MessageBuilder(); + builder2.setRoot(Test.TestAllTypes.factory, root.asReader()); + TestUtil.checkTestMessage(builder2.getRoot(Test.TestAllTypes.factory)); + } + + { + MessageBuilder builder2 = new MessageBuilder(); + Test.TestAllTypes.Builder root2 = builder2.getRoot(Test.TestAllTypes.factory); + root2.setStructField(root.asReader()); + TestUtil.checkTestMessage(root2.getStructField()); + } + + { + MessageBuilder builder2 = new MessageBuilder(); + Test.TestAnyPointer.Builder root2 = builder2.getRoot(Test.TestAnyPointer.factory); + root2.getAnyPointerField().setAs(Test.TestAllTypes.factory, root.asReader()); + TestUtil.checkTestMessage(root2.getAnyPointerField().getAs(Test.TestAllTypes.factory)); + } + } + + @org.junit.Test + public void testSerializedSize() { + MessageBuilder builder = new MessageBuilder(); + Test.TestAnyPointer.Builder root = builder.initRoot(Test.TestAnyPointer.factory); + root.getAnyPointerField().setAs(Text.factory, new Text.Reader("12345")); + + // one word for segment table, one for the root pointer, + // one for the body of the TestAnyPointer struct, + // and one for the body of the Text. + Assert.assertEquals(Serialize.computeSerializedSizeInWords(builder), 4); + } + + @org.junit.Test + public void testImport() { + MessageBuilder builder = new MessageBuilder(); + org.capnproto.testimport.TestImport.Foo.Builder root = builder.initRoot(org.capnproto.testimport.TestImport.Foo.factory); + Test.TestAllTypes.Builder field = root.initImportedStruct(); + TestUtil.initTestMessage(field); + TestUtil.checkTestMessage(field); + TestUtil.checkTestMessage(field.asReader()); + } + + @org.junit.Test + public void testGenericMap() { + MessageBuilder builder = new MessageBuilder(); + Test.GenericMap.Factory mapFactory + = new Test.GenericMap.Factory(Text.factory, Test.TestAllTypes.factory); + + StructList.Factory, + Test.GenericMap.Entry.Reader> entryFactory + = new StructList.Factory(new Test.GenericMap.Entry.Factory(Text.factory, Test.TestAllTypes.factory)); + + Test.GenericMap.Builder root = builder.initRoot(mapFactory); + + { + StructList.Builder> entries = root.initEntries(entryFactory, 3); + + Test.GenericMap.Entry.Builder entry0 = entries.get(0); + entry0.setKey(Text.factory, new Text.Reader("foo")); + Test.TestAllTypes.Builder value0 = entry0.initValue(); + value0.setInt64Field(101); + + Test.GenericMap.Entry.Builder entry1 = entries.get(1); + entry1.setKey(Text.factory, new Text.Reader("bar")); + Test.TestAllTypes.Builder value1 = entry1.initValue(); + value1.setInt64Field(202); + + Test.GenericMap.Entry.Builder entry2 = entries.get(2); + entry2.setKey(Text.factory, new Text.Reader("baz")); + Test.TestAllTypes.Builder value2 = entry2.initValue(); + value2.setInt64Field(303); + } + + { + StructList.Reader> entries = + root.asReader(mapFactory).getEntries(entryFactory); + + Test.GenericMap.Entry.Reader entry0 = entries.get(0); + Assert.assertEquals(entry0.getKey().toString(), "foo"); + Assert.assertEquals(entry0.getValue().getInt64Field(), 101); + + Test.GenericMap.Entry.Reader entry1 = entries.get(1); + Assert.assertEquals(entry1.getKey().toString(), "bar"); + Assert.assertEquals(entry1.getValue().getInt64Field(), 202); + + Test.GenericMap.Entry.Reader entry2 = entries.get(2); + Assert.assertEquals(entry2.getKey().toString(), "baz"); + Assert.assertEquals(entry2.getValue().getInt64Field(), 303); + } + } + + @org.junit.Test + public void testSetWithCaveats() { + MessageBuilder builder = new MessageBuilder(); + Test.TestAllTypes.Builder root = builder.initRoot(Test.TestAllTypes.factory); + StructList.Builder list = root.initStructList(2); + + { + MessageBuilder message1 = new MessageBuilder(); + Test.TestAllTypes.Builder root1 = message1.initRoot(Test.TestAllTypes.factory); + root1.setInt8Field((byte)11); + list.setWithCaveats(Test.TestAllTypes.factory, 0, root1.asReader()); + } + + { + MessageBuilder message2 = new MessageBuilder(); + Test.TestAllTypes.Builder root2 = message2.initRoot(Test.TestAllTypes.factory); + TestUtil.initTestMessage(root2); + list.setWithCaveats(Test.TestAllTypes.factory, 1, root2.asReader()); + } + + StructList.Reader listReader = list.asReader(Test.TestAllTypes.factory); + Assert.assertEquals(listReader.get(0).getInt8Field(), 11); + TestUtil.checkTestMessage(listReader.get(1)); + } +} + + diff --git a/compiler/src/test/java/org/capnproto/TestUtil.java b/compiler/src/test/java/org/capnproto/TestUtil.java new file mode 100644 index 0000000..5128451 --- /dev/null +++ b/compiler/src/test/java/org/capnproto/TestUtil.java @@ -0,0 +1,348 @@ +package org.capnproto.test; + +import org.capnproto.*; +import org.junit.Assert; + +import java.io.UnsupportedEncodingException; + +public class TestUtil { + public static byte[] data(String string) { + try { + return string.getBytes("ISO_8859-1"); + } catch (UnsupportedEncodingException e) { + Assert.fail("Could not decode"); + return null; + } + } + + public static final double DELTA = 1e-15; + + public static void initTestMessage(Test.TestAllTypes.Builder builder) { + builder.setVoidField(org.capnproto.Void.VOID); + builder.setBoolField(true); + builder.setInt8Field((byte) -123); + builder.setInt16Field((short) -12345); + builder.setInt32Field(-12345678); + builder.setInt64Field(-123456789012345L); + builder.setUInt8Field((byte) 0xea); + builder.setUInt16Field((short) 0x4567); + builder.setUInt32Field(0x34567890); + builder.setUInt64Field(0x1234567890123456L); + builder.setFloat32Field(1234.5f); + builder.setFloat64Field(-123e45); + builder.setTextField("foo"); + builder.setDataField(data("bar")); + { + Test.TestAllTypes.Builder subBuilder = builder.initStructField(); + subBuilder.setVoidField(org.capnproto.Void.VOID); + subBuilder.setBoolField(true); + subBuilder.setInt8Field((byte) -12); + subBuilder.setInt16Field((short) 3456); + subBuilder.setInt32Field(-78901234); + subBuilder.setInt64Field(56789012345678L); + subBuilder.setUInt8Field((byte) 90); + subBuilder.setUInt16Field((short) 1234); + subBuilder.setUInt32Field(56789012); + subBuilder.setUInt64Field(345678901234567890L); + subBuilder.setFloat32Field(-1.25e-10f); + subBuilder.setFloat64Field(345); + subBuilder.setTextField(new Text.Reader("baz")); + subBuilder.setDataField(data("qux")); + { + Test.TestAllTypes.Builder subSubBuilder = subBuilder.initStructField(); + subSubBuilder.setTextField(new Text.Reader("nested")); + subSubBuilder.initStructField().setTextField(new Text.Reader("really nested")); + } + subBuilder.setEnumField(Test.TestEnum.BAZ); + + PrimitiveList.Boolean.Builder boolList = subBuilder.initBoolList(5); + boolList.set(0, false); + boolList.set(1, true); + boolList.set(2, false); + boolList.set(3, true); + boolList.set(4, true); + } + + builder.setEnumField(Test.TestEnum.CORGE); + builder.initVoidList(6); + + PrimitiveList.Boolean.Builder boolList = builder.initBoolList(4); + boolList.set(0, true); + boolList.set(1, false); + boolList.set(2, false); + boolList.set(3, true); + + PrimitiveList.Double.Builder float64List = builder.initFloat64List(4); + float64List.set(0, 7777.75); + float64List.set(1, Double.POSITIVE_INFINITY); + float64List.set(2, Double.NEGATIVE_INFINITY); + float64List.set(3, Double.NaN); + + TextList.Builder textList = builder.initTextList(3); + textList.set(0, new Text.Reader("plugh")); + textList.set(1, new Text.Reader("xyzzy")); + textList.set(2, new Text.Reader("thud")); + + StructList.Builder structList = builder.initStructList(3); + structList.get(0).setTextField(new Text.Reader("structlist 1")); + structList.get(1).setTextField(new Text.Reader("structlist 2")); + structList.get(2).setTextField(new Text.Reader("structlist 3")); + + EnumList.Builder enumList = builder.initEnumList(2); + enumList.set(0, Test.TestEnum.FOO); + enumList.set(1, Test.TestEnum.GARPLY); + } + + public static void checkTestMessage(Test.TestAllTypes.Builder builder) { + builder.getVoidField(); + Assert.assertEquals(builder.getBoolField(), true); + Assert.assertEquals(builder.getInt8Field(), -123); + Assert.assertEquals(builder.getInt16Field(), -12345); + Assert.assertEquals(builder.getInt32Field(), -12345678); + Assert.assertEquals(builder.getInt64Field(), -123456789012345L); + Assert.assertEquals(builder.getUInt8Field(), (byte) 0xea); + Assert.assertEquals(builder.getUInt16Field(), 0x4567); + Assert.assertEquals(builder.getUInt32Field(), 0x34567890); + Assert.assertEquals(builder.getUInt64Field(), 0x1234567890123456L); + Assert.assertEquals(builder.getFloat32Field(), 1234.5f, DELTA); + Assert.assertEquals(builder.getFloat64Field(), -123e45, DELTA); + Assert.assertEquals(builder.getTextField().toString(), "foo"); + + { + Test.TestAllTypes.Builder subBuilder = builder.getStructField(); + subBuilder.getVoidField(); + Assert.assertEquals(subBuilder.getBoolField(), true); + Assert.assertEquals(subBuilder.getInt8Field(), -12); + Assert.assertEquals(subBuilder.getInt16Field(), 3456); + Assert.assertEquals(subBuilder.getInt32Field(), -78901234); + Assert.assertEquals(subBuilder.getInt64Field(), 56789012345678L); + Assert.assertEquals(subBuilder.getUInt8Field(), 90); + Assert.assertEquals(subBuilder.getUInt16Field(), 1234); + Assert.assertEquals(subBuilder.getUInt32Field(), 56789012); + Assert.assertEquals(subBuilder.getUInt64Field(), 345678901234567890L); + Assert.assertEquals(subBuilder.getFloat32Field(), -1.25e-10f, DELTA); + Assert.assertEquals(subBuilder.getFloat64Field(), 345, DELTA); + + { + Test.TestAllTypes.Builder subSubBuilder = subBuilder.getStructField(); + Assert.assertEquals(subSubBuilder.getTextField().toString(), "nested"); + } + + Assert.assertEquals(subBuilder.getEnumField(), Test.TestEnum.BAZ); + + PrimitiveList.Boolean.Builder boolList = subBuilder.getBoolList(); + Assert.assertEquals(boolList.get(0), false); + Assert.assertEquals(boolList.get(1), true); + Assert.assertEquals(boolList.get(2), false); + Assert.assertEquals(boolList.get(3), true); + Assert.assertEquals(boolList.get(4), true); + + } + Assert.assertEquals(builder.getEnumField(), Test.TestEnum.CORGE); + + Assert.assertEquals(builder.getVoidList().size(), 6); + + PrimitiveList.Boolean.Builder boolList = builder.getBoolList(); + Assert.assertEquals(boolList.get(0), true); + Assert.assertEquals(boolList.get(1), false); + Assert.assertEquals(boolList.get(2), false); + Assert.assertEquals(boolList.get(3), true); + + PrimitiveList.Double.Builder float64List = builder.getFloat64List(); + Assert.assertEquals(float64List.get(0), 7777.75, DELTA); + Assert.assertEquals(float64List.get(1), Double.POSITIVE_INFINITY, DELTA); + Assert.assertEquals(float64List.get(2), Double.NEGATIVE_INFINITY, DELTA); + Assert.assertEquals(float64List.get(3), Double.NaN, DELTA); + + TextList.Builder textList = builder.getTextList(); + Assert.assertEquals(textList.size(), 3); + Assert.assertEquals(textList.get(0).toString(), "plugh"); + Assert.assertEquals(textList.get(1).toString(), "xyzzy"); + Assert.assertEquals(textList.get(2).toString(), "thud"); + + StructList.Builder structList = builder.getStructList(); + Assert.assertEquals(3, structList.size()); + Assert.assertEquals(structList.get(0).getTextField().toString(), "structlist 1"); + Assert.assertEquals(structList.get(1).getTextField().toString(), "structlist 2"); + Assert.assertEquals(structList.get(2).getTextField().toString(), "structlist 3"); + + EnumList.Builder enumList = builder.getEnumList(); + Assert.assertEquals(enumList.get(0), Test.TestEnum.FOO); + Assert.assertEquals(enumList.get(1), Test.TestEnum.GARPLY); + } + + public static void checkTestMessage(Test.TestAllTypes.Reader reader) { + reader.getVoidField(); + Assert.assertEquals(reader.getBoolField(), true); + Assert.assertEquals(reader.getInt8Field(), -123); + Assert.assertEquals(reader.getInt16Field(), -12345); + Assert.assertEquals(reader.getInt32Field(), -12345678); + Assert.assertEquals(reader.getInt64Field(), -123456789012345L); + Assert.assertEquals(reader.getUInt8Field(), (byte)0xea); + Assert.assertEquals(reader.getUInt16Field(), 0x4567); + Assert.assertEquals(reader.getUInt32Field(), 0x34567890); + Assert.assertEquals(reader.getUInt64Field(), 0x1234567890123456L); + Assert.assertEquals(reader.getFloat32Field(), 1234.5f, DELTA); + Assert.assertEquals(reader.getFloat64Field(), -123e45, DELTA); + Assert.assertEquals(reader.getTextField().toString(), "foo"); + + { + Test.TestAllTypes.Reader subReader = reader.getStructField(); + subReader.getVoidField(); + Assert.assertEquals(subReader.getBoolField(), true); + Assert.assertEquals(subReader.getInt8Field(), -12); + Assert.assertEquals(subReader.getInt16Field(), 3456); + Assert.assertEquals(subReader.getInt32Field(), -78901234); + Assert.assertEquals(subReader.getInt64Field(), 56789012345678L); + Assert.assertEquals(subReader.getUInt8Field(), 90); + Assert.assertEquals(subReader.getUInt16Field(), 1234); + Assert.assertEquals(subReader.getUInt32Field(), 56789012); + Assert.assertEquals(subReader.getUInt64Field(), 345678901234567890L); + Assert.assertEquals(subReader.getFloat32Field(), -1.25e-10f, DELTA); + Assert.assertEquals(subReader.getFloat64Field(), 345, DELTA); + + { + Test.TestAllTypes.Reader subSubReader = subReader.getStructField(); + Assert.assertEquals(subSubReader.getTextField().toString(), "nested"); + } + PrimitiveList.Boolean.Reader boolList = subReader.getBoolList(); + Assert.assertEquals(boolList.get(0), false); + Assert.assertEquals(boolList.get(1), true); + Assert.assertEquals(boolList.get(2), false); + Assert.assertEquals(boolList.get(3), true); + Assert.assertEquals(boolList.get(4), true); + + } + + Assert.assertEquals(reader.getVoidList().size(), 6); + + PrimitiveList.Boolean.Reader boolList = reader.getBoolList(); + Assert.assertEquals(boolList.get(0), true); + Assert.assertEquals(boolList.get(1), false); + Assert.assertEquals(boolList.get(2), false); + Assert.assertEquals(boolList.get(3), true); + + PrimitiveList.Double.Reader float64List = reader.getFloat64List(); + Assert.assertEquals(float64List.get(0), 7777.75, DELTA); + Assert.assertEquals(float64List.get(1), Double.POSITIVE_INFINITY, DELTA); + Assert.assertEquals(float64List.get(2), Double.NEGATIVE_INFINITY, DELTA); + Assert.assertEquals(float64List.get(3), Double.NaN, DELTA); + + TextList.Reader textList = reader.getTextList(); + Assert.assertEquals(textList.size(), 3); + Assert.assertEquals(textList.get(0).toString(), "plugh"); + Assert.assertEquals(textList.get(1).toString(), "xyzzy"); + Assert.assertEquals(textList.get(2).toString(), "thud"); + StructList.Reader structList = reader.getStructList(); + Assert.assertEquals(3, structList.size()); + Assert.assertEquals(structList.get(0).getTextField().toString(), "structlist 1"); + Assert.assertEquals(structList.get(1).getTextField().toString(), "structlist 2"); + Assert.assertEquals(structList.get(2).getTextField().toString(), "structlist 3"); + + EnumList.Reader enumList = reader.getEnumList(); + Assert.assertEquals(enumList.get(0), Test.TestEnum.FOO); + Assert.assertEquals(enumList.get(1), Test.TestEnum.GARPLY); + } + + public static void checkDefaultMessage(Test.TestDefaults.Builder builder) { + builder.getVoidField(); + Assert.assertTrue(builder.getBoolField()); + Assert.assertEquals(builder.getInt8Field(), -123); + Assert.assertEquals(builder.getInt16Field(), -12345); + Assert.assertEquals(builder.getInt32Field(), -12345678); + Assert.assertEquals(builder.getInt64Field(), -123456789012345L); + Assert.assertEquals(builder.getUInt8Field(), (byte)0xea); + Assert.assertEquals(builder.getUInt16Field(), (short)45678); + Assert.assertEquals(builder.getUInt32Field(), 0xce0a6a14); + Assert.assertEquals(builder.getUInt64Field(), 0xab54a98ceb1f0ad2L); + Assert.assertEquals(builder.getFloat32Field(), 1234.5f, DELTA); + Assert.assertEquals(builder.getFloat64Field(), -123e45, DELTA); + Assert.assertEquals(builder.getEnumField(), Test.TestEnum.CORGE); + + Assert.assertEquals(builder.getTextField().toString(), "foo"); + Assert.assertArrayEquals(builder.getDataField().toArray(), new byte[]{0x62, 0x61, 0x72}); + } + + public static void checkDefaultMessage(Test.TestDefaults.Reader reader) { + reader.getVoidField(); + Assert.assertEquals(reader.getBoolField(), true); + Assert.assertEquals(reader.getInt8Field(), -123); + Assert.assertEquals(reader.getInt16Field(), -12345); + Assert.assertEquals(reader.getInt32Field(), -12345678); + Assert.assertEquals(reader.getInt64Field(), -123456789012345L); + Assert.assertEquals(reader.getUInt8Field(), (byte)0xea); + Assert.assertEquals(reader.getUInt16Field(), (short)45678); + Assert.assertEquals(reader.getUInt32Field(), 0xce0a6a14); + Assert.assertEquals(reader.getUInt64Field(), 0xab54a98ceb1f0ad2L); + Assert.assertEquals(reader.getFloat32Field(), 1234.5f, DELTA); + Assert.assertEquals(reader.getFloat64Field(), -123e45, DELTA); + Assert.assertEquals(reader.getTextField().toString(), "foo"); + Assert.assertArrayEquals(reader.getDataField().toArray(), new byte[]{0x62, 0x61, 0x72}); + { + Test.TestAllTypes.Reader subReader = reader.getStructField(); + subReader.getVoidField(); + Assert.assertTrue(subReader.getBoolField()); + Assert.assertEquals(subReader.getInt8Field(), -12); + Assert.assertEquals(subReader.getInt16Field(), 3456); + Assert.assertEquals(subReader.getInt32Field(), -78901234); + // ... + Assert.assertEquals(subReader.getTextField().toString(), "baz"); + + { + Test.TestAllTypes.Reader subSubReader = subReader.getStructField(); + Assert.assertEquals(subSubReader.getTextField().toString(), "nested"); + } + + } + + Assert.assertEquals(reader.getEnumField(), Test.TestEnum.CORGE); + Assert.assertEquals(reader.getVoidList().size(), 6); + + { + PrimitiveList.Boolean.Reader listReader = reader.getBoolList(); + Assert.assertEquals(listReader.size(), 4); + Assert.assertTrue(listReader.get(0)); + Assert.assertFalse(listReader.get(1)); + Assert.assertFalse(listReader.get(2)); + Assert.assertTrue(listReader.get(3)); + } + + { + PrimitiveList.Byte.Reader listReader = reader.getInt8List(); + Assert.assertEquals(listReader.size(), 2); + Assert.assertEquals(listReader.get(0), 111); + Assert.assertEquals(listReader.get(1), -111); + } + } + + public static void setDefaultMessage(Test.TestDefaults.Builder builder) { + builder.setBoolField(false); + builder.setInt8Field((byte) -122); + builder.setInt16Field((short) -12344); + builder.setInt32Field(-12345677); + builder.setInt64Field(-123456789012344L); + builder.setUInt8Field((byte) 0xe9); + builder.setUInt16Field((short) 45677); + builder.setUInt32Field(0xce0a6a13); + builder.setUInt64Field(0xab54a98ceb1f0ad1L); + builder.setFloat32Field(1234.4f); + builder.setFloat64Field(-123e44); + builder.setTextField(new Text.Reader("bar")); + builder.setEnumField(Test.TestEnum.QUX); + } + + public static void checkSettedDefaultMessage(Test.TestDefaults.Reader reader) { + Assert.assertEquals(reader.getBoolField(), false); + Assert.assertEquals(reader.getInt8Field(), -122); + Assert.assertEquals(reader.getInt16Field(), -12344); + Assert.assertEquals(reader.getInt32Field(), -12345677); + Assert.assertEquals(reader.getInt64Field(), -123456789012344L); + Assert.assertEquals(reader.getUInt8Field(), (byte) 0xe9); + Assert.assertEquals(reader.getUInt16Field(), (short) 45677); + Assert.assertEquals(reader.getUInt32Field(), 0xce0a6a13); + Assert.assertEquals(reader.getUInt64Field(), 0xab54a98ceb1f0ad1L); + Assert.assertEquals(reader.getFloat32Field(), 1234.4f, DELTA); + Assert.assertEquals(reader.getFloat64Field(), -123e44, DELTA); + Assert.assertEquals(reader.getEnumField(), Test.TestEnum.QUX); + } +} diff --git a/compiler/src/test/scala/org/capnproto/EncodingSuite.scala b/compiler/src/test/scala/org/capnproto/EncodingSuite.scala deleted file mode 100644 index 42b6cc3..0000000 --- a/compiler/src/test/scala/org/capnproto/EncodingSuite.scala +++ /dev/null @@ -1,848 +0,0 @@ -// Copyright (c) 2013-2014 Sandstorm Development Group, Inc. and contributors -// Licensed under the MIT License: -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -package org.capnproto - -import org.capnproto.test.Test._ -import org.scalatest.FunSuite -import org.scalatest.Matchers._ - -class EncodingSuite extends FunSuite { - test("AllTypes") { - val message = new MessageBuilder() - val allTypes = message.initRoot(TestAllTypes.factory) - TestUtil.initTestMessage(allTypes) - TestUtil.checkTestMessage(allTypes) - TestUtil.checkTestMessage(allTypes.asReader()) - } - - test("AllTypesMultiSegment") { - val message = new MessageBuilder(5, BuilderArena.AllocationStrategy.FIXED_SIZE) - val allTypes = message.initRoot(TestAllTypes.factory) - TestUtil.initTestMessage(allTypes) - - TestUtil.checkTestMessage(allTypes) - TestUtil.checkTestMessage(allTypes.asReader()) - } - - test("Setters") { - val message = new MessageBuilder() - val allTypes = message.initRoot(TestAllTypes.factory) - TestUtil.initTestMessage(allTypes) - - val message2 = new MessageBuilder() - val allTypes2 = message2.initRoot(TestAllTypes.factory) - - allTypes2.setStructField(allTypes.asReader()) - TestUtil.checkTestMessage(allTypes2.getStructField()) - val reader = allTypes2.asReader().getStructField() - TestUtil.checkTestMessage(reader) - } - - test("Zeroing") { - val message = new MessageBuilder() - val allTypes = message.initRoot(TestAllTypes.factory) - - val structList = allTypes.initStructList(3) - TestUtil.initTestMessage(structList.get(0)) - - val structField = allTypes.initStructField() - TestUtil.initTestMessage(structField) - - TestUtil.initTestMessage(structList.get(1)) - TestUtil.initTestMessage(structList.get(2)) - TestUtil.checkTestMessage(structList.get(0)) - allTypes.initStructList(0) - - TestUtil.checkTestMessage(allTypes.getStructField()) - val allTypesReader = allTypes.asReader() - TestUtil.checkTestMessage(allTypesReader.getStructField()) - - val any = message.initRoot(AnyPointer.factory) - val segments = message.getSegmentsForOutput() - for (segment <- segments) { - for (jj <- 0 to segment.limit - 1) { - segment.get(jj) should equal (0) - } - } - } - - test("DoubleFarPointers") { - val bytes = Array[Byte](2,0,0,0, 1,0,0,0, 2,0,0,0, 1,0,0,0, - 6,0,0,0, 1,0,0,0, 2,0,0,0, 2,0,0,0, - 0,0,0,0, 1,0,0,0, 1,7, -1, 127, 0,0,0,0) - - val input = new ArrayInputStream (java.nio.ByteBuffer.wrap(bytes)) - val message = org.capnproto.Serialize.read(input) - val root = message.getRoot(TestAllTypes.factory) - root.getBoolField() should equal (true) - root.getInt8Field() should equal (7) - root.getInt16Field() should equal (32767) - } - - test("UpgradeStruct") { - val builder = new MessageBuilder() - val root = builder.initRoot(TestAnyPointer.factory) - - { - val oldVersion = root.getAnyPointerField().initAs(TestOldVersion.factory) - oldVersion.setOld1(123) - oldVersion.setOld2("foo") - val sub = oldVersion.initOld3() - sub.setOld1(456) - sub.setOld2("bar") - } - - { - val newVersion = root.getAnyPointerField().asReader().getAs(TestNewVersion.factory) - newVersion.getOld1() should equal (123) - newVersion.getOld2().toString() should equal ("foo") - newVersion.getNew2().toString() should equal ("baz") - newVersion.hasNew2() should equal (false) - newVersion.hasNew3() should equal (false) - } - } - - test("UpgradeStructInBuilder") { - val builder = new MessageBuilder() - val root = builder.initRoot(TestAnyPointer.factory) - - { - val oldVersion = root.getAnyPointerField().initAs(TestOldVersion.factory) - oldVersion.setOld1(123) - oldVersion.setOld2("foo") - val sub = oldVersion.initOld3() - sub.setOld1(456) - sub.setOld2("bar") - } - - { - val newVersion = root.getAnyPointerField().getAs(TestNewVersion.factory) - newVersion.getOld1() should equal (123) - newVersion.getOld2().toString() should equal ("foo") - newVersion.getNew1() should equal (987) - newVersion.getNew2().toString() should equal ("baz") - val sub = newVersion.getOld3() - sub.getOld1() should equal (456) - sub.getOld2().toString() should equal ("bar") - - newVersion.setOld1(234) - newVersion.setOld2("qux") - newVersion.setNew1(654) - newVersion.setNew2("quux") - - } - - { - val oldVersion = root.getAnyPointerField().getAs(TestOldVersion.factory) - oldVersion.getOld1() should equal (234) - oldVersion.getOld2.toString() should equal ("qux") - } - } - - test("StructListUpgrade") { - val message = new MessageBuilder() - val root = message.initRoot(TestAnyPointer.factory) - val any = root.getAnyPointerField() - - { - val longs = any.initAs(PrimitiveList.Long.factory, 3) - longs.set(0, 123) - longs.set(1, 456) - longs.set(2, 789) - } - - { - val olds = any.asReader().getAs(TestOldVersion.listFactory) - olds.get(0).getOld1() should equal (123) - olds.get(1).getOld1() should equal (456) - olds.get(2).getOld1() should equal (789) - } - - { - val olds = any.getAs(TestOldVersion.listFactory) - olds.size() should equal (3) - olds.get(0).getOld1() should equal (123) - olds.get(1).getOld1() should equal (456) - olds.get(2).getOld1() should equal (789) - - olds.get(0).setOld2("zero") - olds.get(1).setOld2("one") - olds.get(2).setOld2("two") - } - - { - val news = any.getAs(TestNewVersion.listFactory) - news.size() should equal (3) - news.get(0).getOld1() should equal (123) - news.get(0).getOld2().toString() should equal ("zero") - - news.get(1).getOld1() should equal (456) - news.get(1).getOld2().toString() should equal ("one") - - news.get(2).getOld1() should equal (789) - news.get(2).getOld2().toString() should equal ("two") - } - } - - test("StructListUpgradeDoubleFar") { - val bytes = Array[Byte]( - 1,0,0,0,0x1f,0,0,0, // list, inline composite, 3 words - 4, 0, 0, 0, 1, 0, 2, 0, // struct tag. 1 element, 1 word data, 2 pointers. - 91,0,0,0,0,0,0,0, // data: 91 - 0x05,0,0,0, 0x42,0,0,0, // list pointer, offset 1, type = BYTE, length 8. - 0,0,0,0,0,0,0,0, // null pointer - 0x68,0x65,0x6c,0x6c,0x6f,0x21,0x21,0) // "hello!!" - - val segment = java.nio.ByteBuffer.wrap(bytes) - segment.order(java.nio.ByteOrder.LITTLE_ENDIAN) - val messageReader = new MessageReader(Array(segment), ReaderOptions.DEFAULT_READER_OPTIONS) - - val oldFactory = new StructList.Factory(TestOldVersion.factory) - val oldVersion = messageReader.getRoot(oldFactory) - - oldVersion.size() should equal (1) - oldVersion.get(0).getOld1() should equal (91) - oldVersion.get(0).getOld2().toString() should equal ("hello!!") - - // Make the first segment exactly large enough to fit the original message. - // This leaves no room for a far pointer landing pad in the first segment. - val message = new MessageBuilder(6) - message.setRoot(oldFactory, oldVersion) - - val segments = message.getSegmentsForOutput() - segments.length should equal (1) - segments(0).limit() should equal (6 * 8) - - val newVersion = message.getRoot(new StructList.Factory(TestNewVersion.factory)) - newVersion.size() should equal (1) - newVersion.get(0).getOld1() should equal (91) - newVersion.get(0).getOld2().toString() should equal ("hello!!") - - val segments1 = message.getSegmentsForOutput() - segments(0).limit() should equal (6 * 8) - for (ii <- 8 to (5 * 8) - 1) { - // Check the the old list, including the tag, was zeroed. - segments(0).get(ii) should equal (0) - } - } - - test("ListBuilderAsReader") { - val message = new MessageBuilder() - val allTypes = message.initRoot(TestAllTypes.factory) - - allTypes.initVoidList(10) - allTypes.getVoidList().asReader().size() should equal (10) - - val boolList = allTypes.initBoolList(7) - boolList.set(3, true) - val boolListReader = boolList.asReader() - boolListReader.size() should equal (7) - boolListReader.get(0) should equal (false) - boolListReader.get(1) should equal (false) - boolListReader.get(2) should equal (false) - boolListReader.get(3) should equal (true) - boolListReader.get(4) should equal (false) - - val int8List = allTypes.initInt8List(9) - int8List.set(4, 100) - int8List.set(8, 11) - val int8ListReader = int8List.asReader() - int8ListReader.size() should equal (9) - int8ListReader.get(0) should equal (0) - int8ListReader.get(4) should equal (100) - int8ListReader.get(8) should equal (11) - - val int16List = allTypes.initInt16List(2) - int16List.set(0, 1) - val int16ListReader = int16List.asReader() - int16ListReader.size() should equal (2) - int16ListReader.get(0) should equal (1) - int16ListReader.get(1) should equal (0) - - // TODO other primitive lists - - val textList = allTypes.initTextList(1) - textList.set(0, new Text.Reader("abcdefg")) - val textListReader = textList.asReader() - textListReader.size() should equal (1) - textListReader.get(0).toString() should equal ("abcdefg") - - val dataList = allTypes.initDataList(1) - dataList.set(0, new Data.Reader(Array(1,2,3,4))) - val dataListReader = dataList.asReader() - dataListReader.size() should equal (1) - dataListReader.get(0).toArray() should equal (Array(1,2,3,4)) - - val structList = allTypes.initStructList(2) - structList.get(0).setInt8Field(5) - structList.get(1).setInt8Field(9) - val structListReader = structList.asReader(TestAllTypes.factory) - structListReader.size() should equal (2) - structListReader.get(0).getInt8Field() should equal (5) - structListReader.get(1).getInt8Field() should equal (9) - - val enumList = allTypes.initEnumList(3) - enumList.set(0, TestEnum.FOO) - enumList.set(1, TestEnum.BAR) - enumList.set(2, TestEnum.BAZ) - val enumListReader = enumList.asReader() - enumListReader.size() should equal (3) - enumListReader.get(0) should equal (TestEnum.FOO) - enumListReader.get(1) should equal (TestEnum.BAR) - enumListReader.get(2) should equal (TestEnum.BAZ) - } - - test("NestedListBuilderAsReader") { - val builder = new MessageBuilder() - val root = builder.initRoot(TestLists.factory) - - val structListList = root.initStructListList(3) - val structList0 = structListList.init(0, 1) - structList0.get(0).setInt16Field(1) - // leave structList1 as default - val structList2 = structListList.init(2, 3) - structList2.get(0).setInt16Field(22) - structList2.get(1).setInt16Field(333) - structList2.get(2).setInt16Field(4444) - - val structListListReader = structListList.asReader(new StructList.Factory(TestAllTypes.factory)) - structListListReader.size() should equal (3) - val structList0Reader = structListListReader.get(0) - structList0Reader.size() should equal(1) - structList0Reader.get(0).getInt16Field() should equal (1) - structListListReader.get(1).size() should equal (0) - val structList2Reader = structListListReader.get(2) - structList2Reader.size() should equal (3) - structList2Reader.get(0).getInt16Field() should equal (22) - structList2Reader.get(1).getInt16Field() should equal (333) - structList2Reader.get(2).getInt16Field() should equal (4444) - } - - test("Generics") { - val message = new MessageBuilder() - val factory = TestGenerics.newFactory(TestAllTypes.factory, Text.factory) - val root = message.initRoot(factory) - TestUtil.initTestMessage(root.getFoo()) - root.getDub().setFoo(Text.factory, new Text.Reader("Hello")) - val bar = root.getDub().initBar(1) - bar.set(0, 11) - val revBar = root.getRev().getBar() - revBar.setInt8Field(111) - val boolList = revBar.initBoolList(2) - boolList.set(0, false) - boolList.set(1, true) - - TestUtil.checkTestMessage(root.getFoo()) - val rootReader = root.asReader(factory) - TestUtil.checkTestMessage(rootReader.getFoo()) - val dubReader = root.getDub() - dubReader.getFoo().toString() should equal ("Hello") - val barReader = dubReader.getBar() - barReader.size() should equal (1) - barReader.get(0) should equal (11) - } - - test("UseGenerics") { - val message = new MessageBuilder() - val root = message.initRoot(TestUseGenerics.factory) - - { - val message2 = new MessageBuilder() - val factory2 = TestGenerics.newFactory(AnyPointer.factory, AnyPointer.factory) - val root2 = message2.initRoot(factory2) - val dub2 = root2.initDub().setFoo(Text.factory, new Text.Reader("foobar")) - - root.setUnspecified(factory2, root2.asReader(factory2)) - } - - val rootReader = root.asReader() - root.getUnspecified().getDub().getFoo().toString() should equal ("foobar") - } - - test("Defaults") { - val message = new MessageBuilder() - val defaults = message.initRoot(TestDefaults.factory) - TestUtil.checkDefaultMessage(defaults) - TestUtil.checkDefaultMessage(defaults.asReader()) - TestUtil.setDefaultMessage(defaults) - TestUtil.checkSettedDefaultMessage(defaults.asReader()) - } - - test("Unions") { - val builder = new MessageBuilder() - val root = builder.initRoot(TestUnion.factory) - val u0 = root.initUnion0() - u0.initU0f1sp(10) - assert(u0.which() == TestUnion.Union0.Which.U0F1SP) - - u0.initPrimitiveList(10) - assert(u0.which() == TestUnion.Union0.Which.PRIMITIVE_LIST) - } - - test("Groups") { - val builder = new MessageBuilder() - val root = builder.initRoot(TestGroups.factory) - - { - val foo = root.getGroups().initFoo() - foo.setCorge(12345678) - foo.setGrault(123456789012345L) - foo.setGarply(new Text.Reader("foobar")) - - assert(12345678 == foo.getCorge()) - assert(123456789012345L == foo.getGrault()) - assert("foobar" == foo.getGarply().toString()) - } - - { - val bar = root.getGroups.initBar() - bar.setCorge(23456789) - bar.setGrault(new Text.Reader("barbaz")) - bar.setGarply(234567890123456L) - - assert(23456789 == bar.getCorge()) - assert("barbaz" == bar.getGrault().toString()) - assert(234567890123456L == bar.getGarply()) - } - - { - val baz = root.getGroups().initBaz() - baz.setCorge(34567890) - baz.setGrault(new Text.Reader("bazqux")) - baz.setGarply(new Text.Reader("quxquux")) - - assert(34567890 == baz.getCorge()) - assert("bazqux" == baz.getGrault().toString()) - assert("quxquux" == baz.getGarply().toString()) - } - } - - test("NestedLists") { - val builder = new MessageBuilder() - val root = builder.initRoot(TestLists.factory) - - { - val intListList = root.initInt32ListList(2) - val intList0 = intListList.init(0, 4) - intList0.set(0, 1) - intList0.set(1, 2) - intList0.set(2, 3) - intList0.set(3, 4) - val intList1 = intListList.init(1, 1) - intList1.set(0, 100) - } - - { - val reader = root.asReader() - val intListList = root.getInt32ListList() - intListList.size() should equal (2) - val intList0 = intListList.get(0) - intList0.size() should equal (4) - intList0.get(0) should equal (1) - intList0.get(1) should equal (2) - intList0.get(2) should equal (3) - intList0.get(3) should equal (4) - val intList1 = intListList.get(1) - intList1.size() should equal (1) - intList1.get(0) should equal(100) - } - } - - test("Constants") { - assert(Void.VOID == TestConstants.VOID_CONST) - assert(true == TestConstants.BOOL_CONST) - assert(-123 == TestConstants.INT8_CONST) - assert(-12345 == TestConstants.INT16_CONST) - assert(-12345678 == TestConstants.INT32_CONST) - assert(-123456789012345L == TestConstants.INT64_CONST) - - assert(-22 == TestConstants.UINT8_CONST) - assert(-19858 == TestConstants.UINT16_CONST) - assert(-838178284 == TestConstants.UINT32_CONST) - assert(-6101065172474983726L == TestConstants.UINT64_CONST) - - assert(1234.5f == TestConstants.FLOAT32_CONST) - (-123e45) should equal (TestConstants.FLOAT64_CONST) - - (TestConstants.TEXT_CONST.toString()) should equal ("foo") - (TestConstants.DATA_CONST.toArray()) should equal (TestUtil.data("bar")) - - (TestConstants.ENUM_CONST) should equal (TestEnum.CORGE) - - { - val subReader = TestConstants.STRUCT_CONST - subReader.getBoolField() should equal (true) - subReader.getInt8Field() should equal (-12) - subReader.getInt16Field() should equal(3456) - subReader.getInt32Field() should equal (-78901234) - subReader.getInt64Field() should equal (56789012345678L) - subReader.getUInt8Field() should equal (90) - subReader.getUInt16Field should equal (1234) - subReader.getUInt32Field() should equal (56789012) - subReader.getUInt64Field() should equal (345678901234567890L) - subReader.getFloat32Field() should equal (-1.25e-10f) - subReader.getFloat64Field() should equal (345) - subReader.getTextField().toString() should equal ("baz") - // ... - } - - TestConstants.VOID_LIST_CONST.size() should equal (6) - - { - val listReader = TestConstants.BOOL_LIST_CONST - listReader.size() should equal (4) - listReader.get(0) should equal (true) - listReader.get(1) should equal (false) - listReader.get(2) should equal (false) - listReader.get(3) should equal (true) - } - - // ... - { - val listReader = TestConstants.TEXT_LIST_CONST - listReader.size() should equal(3) - listReader.get(0).toString() should equal ("plugh") - listReader.get(1).toString() should equal ("xyzzy") - listReader.get(2).toString() should equal ("thud") - } - - { - val listReader = TestConstants.STRUCT_LIST_CONST - listReader.size() should equal(3) - listReader.get(0).getTextField().toString() should equal ("structlist 1") - listReader.get(1).getTextField().toString() should equal ("structlist 2") - listReader.get(2).getTextField().toString() should equal ("structlist 3") - } - - } - - test("GlobalConstants") { - assert(12345 == GLOBAL_INT) - } - - test("EmptyStruct") { - val builder = new MessageBuilder() - val root = builder.initRoot(TestAnyPointer.factory) - root.hasAnyPointerField() should equal (false) - val any = root.getAnyPointerField() - any.isNull() should equal (true) - any.initAs(TestEmptyStruct.factory) - any.isNull() should equal (false) - root.hasAnyPointerField() should equal (true) - - { - val rootReader = root.asReader() - rootReader.hasAnyPointerField() should equal (true) - rootReader.getAnyPointerField().isNull() should equal (false) - } - } - - test("TextBuilderIntUnderflow") { - val message = new MessageBuilder() - val root = message.initRoot(TestAnyPointer.factory) - root.getAnyPointerField.initAs(org.capnproto.Data.factory, 0) - a [DecodeException] should be thrownBy root.getAnyPointerField.getAs(org.capnproto.Text.factory) - } - - test("InlineCompositeListIntOverflow") { - val bytes = Array[Byte](0,0,0,0, 0,0,1,0, - 1,0,0,0, 0x17,0,0,0, 0,0,0,-128, 16,0,0,0, - 0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0) - - val segment = java.nio.ByteBuffer.wrap(bytes) - segment.order(java.nio.ByteOrder.LITTLE_ENDIAN) - val message = new MessageReader(Array(segment), ReaderOptions.DEFAULT_READER_OPTIONS) - - val root = message.getRoot(TestAnyPointer.factory) - // TODO add this after we impelement totalSize(): - //root.totalSize() - - a [DecodeException] should be thrownBy - root.getAnyPointerField.getAs(new StructList.Factory(TestAllTypes.factory)) - - val messageBuilder = new MessageBuilder() - val builderRoot = messageBuilder.initRoot(TestAnyPointer.factory) - a [DecodeException] should be thrownBy - builderRoot.getAnyPointerField.setAs(TestAnyPointer.factory, root) - - } - - test("VoidListAmplification") { - val builder = new MessageBuilder() - builder.initRoot(TestAnyPointer.factory).getAnyPointerField().initAs(PrimitiveList.Void.factory, 1 << 28) - - val segments = builder.getSegmentsForOutput() - segments.length should equal (1) - - val reader = new MessageReader(segments, ReaderOptions.DEFAULT_READER_OPTIONS) - val root = reader.getRoot(TestAnyPointer.factory) - a [DecodeException] should be thrownBy - root.getAnyPointerField().getAs(new StructList.Factory(TestAllTypes.factory)) - } - - test("EmptyStructListAmplification") { - val builder = new MessageBuilder() - builder.initRoot(TestAnyPointer.factory).getAnyPointerField() - .initAs(new StructList.Factory(TestEmptyStruct.factory), (1 << 29) - 1) - - val segments = builder.getSegmentsForOutput() - segments.length should equal (1) - - val reader = new MessageReader(segments, ReaderOptions.DEFAULT_READER_OPTIONS) - val root = reader.getRoot(TestAnyPointer.factory) - a [DecodeException] should be thrownBy - root.getAnyPointerField().getAs(new StructList.Factory(TestAllTypes.factory)) - } - - test("LongUint8List") { - { - val message = new MessageBuilder() - val allTypes = message.initRoot(TestAllTypes.factory) - val length = (1 << 28) + 1 - val list = allTypes.initUInt8List(length) - list.size() should equal (length) - list.set(length - 1, 3) - list.get(length - 1) should equal (3) - allTypes.asReader().getUInt8List().get(length - 1) should equal (3) - } - } - - - test("LongUint16List") { - { - val message = new MessageBuilder() - val allTypes = message.initRoot(TestAllTypes.factory) - val length = (1 << 27) + 1 - val list = allTypes.initUInt16List(length) - list.size() should equal (length) - list.set(length - 1, 3) - list.get(length - 1) should equal (3) - allTypes.asReader().getUInt16List().get(length - 1) should equal (3) - } - } - - test("LongUint32List") { - { - val message = new MessageBuilder() - val allTypes = message.initRoot(TestAllTypes.factory) - val length = (1 << 26) + 1 - val list = allTypes.initUInt32List(length) - list.size() should equal (length) - list.set(length - 1, 3) - list.get(length - 1) should equal (3) - allTypes.asReader().getUInt32List().get(length - 1) should equal (3) - } - } - - test("LongUint64List") { - { - val message = new MessageBuilder() - val allTypes = message.initRoot(TestAllTypes.factory) - val length = (1 << 25) + 1 - val list = allTypes.initUInt64List(length) - list.size() should equal (length) - list.set(length - 1, 3) - list.get(length - 1) should equal (3) - allTypes.asReader().getUInt64List().get(length - 1) should equal (3) - } - } - - test("LongFloat32List") { - { - val message = new MessageBuilder() - val allTypes = message.initRoot(TestAllTypes.factory) - val length = (1 << 26) + 1 - val list = allTypes.initFloat32List(length) - list.size() should equal (length) - list.set(length - 1, 3.14f) - list.get(length - 1) should equal (3.14f) - allTypes.asReader().getFloat32List().get(length - 1) should equal (3.14f) - } - } - - test("LongFloat64List") { - { - val message = new MessageBuilder() - val allTypes = message.initRoot(TestAllTypes.factory) - val length = (1 << 25) + 1 - val list = allTypes.initFloat64List(length) - list.size() should equal (length) - list.set(length - 1, 3.14) - list.get(length - 1) should equal (3.14) - allTypes.asReader().getFloat64List().get(length - 1) should equal (3.14) - } - } - - test("LongStructList") { - { - val message = new MessageBuilder() - val allTypes = message.initRoot(TestAllTypes.factory) - val length = (1 << 21) + 1 - val list = allTypes.initStructList(length) - list.size() should equal (length) - list.get(length - 1).setUInt8Field(3) - allTypes.asReader().getStructList().get(length - 1).getUInt8Field() should equal (3) - } - } - - test("LongTextList") { - { - val message = new MessageBuilder() - val allTypes = message.initRoot(TestAllTypes.factory) - val length = (1 << 25) + 1 - val list = allTypes.initTextList(length) - list.size() should equal (length) - list.set(length - 1, new Text.Reader("foo")) - allTypes.asReader().getTextList().get(length - 1).toString() should equal ("foo") - } - } - - - test("LongListList") { - { - val message = new MessageBuilder() - val root = message.initRoot(TestLists.factory) - val length = (1 << 25) + 1 - val list = root.initStructListList(length) - list.size() should equal (length) - list.init(length - 1, 3) - list.get(length - 1).size() should equal (3) - root.asReader().getStructListList().get(length - 1).size() should equal (3) - } - } - - test("StructSetters") { - val builder = new MessageBuilder() - val root = builder.initRoot(TestAllTypes.factory) - TestUtil.initTestMessage(root) - - { - val builder2 = new MessageBuilder() - builder2.setRoot(TestAllTypes.factory, root.asReader()) - TestUtil.checkTestMessage(builder2.getRoot(TestAllTypes.factory)) - } - - { - val builder2 = new MessageBuilder() - val root2 = builder2.getRoot(TestAllTypes.factory) - root2.setStructField(root.asReader()) - TestUtil.checkTestMessage(root2.getStructField()) - } - - { - val builder2 = new MessageBuilder() - val root2 = builder2.getRoot(TestAnyPointer.factory) - root2.getAnyPointerField().setAs(TestAllTypes.factory, root.asReader()) - TestUtil.checkTestMessage(root2.getAnyPointerField.getAs(TestAllTypes.factory)) - } - } - - test("SerializedSize") { - val builder = new MessageBuilder() - val root = builder.initRoot(TestAnyPointer.factory) - root.getAnyPointerField().setAs(Text.factory, new Text.Reader("12345")) - - // one word for segment table, one for the root pointer, - // one for the body of the TestAnyPointer struct, - // and one for the body of the Text. - Serialize.computeSerializedSizeInWords(builder) should equal (4) - } - - test("Import") { - val builder = new MessageBuilder() - val root = builder.initRoot(org.capnproto.testimport.TestImport.Foo.factory) - val field = root.initImportedStruct() - TestUtil.initTestMessage(field) - TestUtil.checkTestMessage(field) - TestUtil.checkTestMessage(field.asReader()) - } - - test("GenericMap") { - val builder = new MessageBuilder() - val mapFactory = new GenericMap.Factory(Text.factory, TestAllTypes.factory) - val entryFactory = new StructList.Factory(new GenericMap.Entry.Factory(Text.factory, TestAllTypes.factory)); - val root = builder.initRoot(mapFactory) - - { - val entries = root.initEntries(entryFactory, 3); - - val entry0 = entries.get(0) - entry0.setKey(Text.factory, new Text.Reader("foo")) - val value0 = entry0.initValue() - value0.setInt64Field(101); - - val entry1 = entries.get(1) - entry1.setKey(Text.factory, new Text.Reader("bar")) - val value1 = entry1.initValue() - value1.setInt64Field(202); - - val entry2 = entries.get(2) - entry2.setKey(Text.factory, new Text.Reader("baz")) - val value2 = entry2.initValue() - value2.setInt64Field(303); - } - - { - val entries = root.asReader(mapFactory).getEntries(entryFactory) - val entry0 = entries.get(0) - assert(entry0.getKey().toString() == "foo") - assert(entry0.getValue().getInt64Field() == 101) - - val entry1 = entries.get(1) - assert(entry1.getKey().toString() == "bar") - assert(entry1.getValue().getInt64Field() == 202) - - val entry2 = entries.get(2) - assert(entry2.getKey().toString() == "baz") - assert(entry2.getValue().getInt64Field == 303) - } - } - - test("setWithCaveats") { - val builder = new MessageBuilder() - val root = builder.initRoot(TestAllTypes.factory) - val list = root.initStructList(2) - - { - val message1 = new MessageBuilder() - val root1 = message1.initRoot(TestAllTypes.factory) - root1.setInt8Field(11) - list.setWithCaveats(TestAllTypes.factory, 0, root1.asReader()) - } - - { - val message2 = new MessageBuilder() - val root2 = message2.initRoot(TestAllTypes.factory) - TestUtil.initTestMessage(root2) - list.setWithCaveats(TestAllTypes.factory, 1, root2.asReader()) - } - - val listReader = list.asReader(TestAllTypes.factory) - listReader.get(0).getInt8Field() should equal (11) - TestUtil.checkTestMessage(listReader.get(1)) - } - - // to debug, do this: - //Serialize.write((new java.io.FileOutputStream("/Users/dwrensha/Desktop/test.dat")).getChannel(), - // message) - -} diff --git a/compiler/src/test/scala/org/capnproto/TestUtil.scala b/compiler/src/test/scala/org/capnproto/TestUtil.scala deleted file mode 100644 index 1f9ee0e..0000000 --- a/compiler/src/test/scala/org/capnproto/TestUtil.scala +++ /dev/null @@ -1,379 +0,0 @@ -// Copyright (c) 2013-2014 Sandstorm Development Group, Inc. and contributors -// Licensed under the MIT License: -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -package org.capnproto - -import org.capnproto.Text.Reader -import org.scalatest.Matchers._ -import org.capnproto.test.Test._ - - -object TestUtil { - - def data(str : String) : Array[Byte] = { - try { - str.getBytes("ISO_8859-1") - } catch { - case e: Exception => throw new Error("could not decode") - } - } - - def initTestMessage(builder : TestAllTypes.Builder) { - builder.setVoidField(org.capnproto.Void.VOID) - builder.setBoolField(true) - builder.setInt8Field(-123) - builder.setInt16Field(-12345) - builder.setInt32Field(-12345678) - builder.setInt64Field(-123456789012345L) - builder.setUInt8Field(0xea.toByte) - builder.setUInt16Field(0x4567) - builder.setUInt32Field(0x34567890) - builder.setUInt64Field(0x1234567890123456L) - builder.setFloat32Field(1234.5f) - builder.setFloat64Field(-123e45) - builder.setTextField("foo") - builder.setDataField(data("bar")) - - { - val subBuilder = builder.initStructField() - subBuilder.setVoidField(org.capnproto.Void.VOID) - subBuilder.setBoolField(true) - subBuilder.setInt8Field(-12) - subBuilder.setInt16Field(3456) - subBuilder.setInt32Field(-78901234) - subBuilder.setInt64Field(56789012345678L) - subBuilder.setUInt8Field(90) - subBuilder.setUInt16Field(1234) - subBuilder.setUInt32Field(56789012) - subBuilder.setUInt64Field(345678901234567890L) - subBuilder.setFloat32Field(-1.25e-10f) - subBuilder.setFloat64Field(345) - subBuilder.setTextField(new Text.Reader("baz")) - subBuilder.setDataField(data("qux")) - - { - val subSubBuilder = subBuilder.initStructField() - subSubBuilder.setTextField(new Text.Reader("nested")) - subSubBuilder.initStructField().setTextField(new Text.Reader("really nested")) - } - - subBuilder.setEnumField(TestEnum.BAZ) - - val boolList = subBuilder.initBoolList(5) - boolList.set(0, false) - boolList.set(1, true) - boolList.set(2, false) - boolList.set(3, true) - boolList.set(4, true) - } - - builder.setEnumField(TestEnum.CORGE) - builder.initVoidList(6) - - val boolList = builder.initBoolList(4) - boolList.set(0, true) - boolList.set(1, false) - boolList.set(2, false) - boolList.set(3, true) - - val float64List = builder.initFloat64List(4) - float64List.set(0, 7777.75) - float64List.set(1, Double.PositiveInfinity) - float64List.set(2, Double.NegativeInfinity) - float64List.set(3, Double.NaN) - - val textList = builder.initTextList(3) - textList.set(0, new Text.Reader("plugh")) - textList.set(1, new Text.Reader("xyzzy")) - textList.set(2, new Text.Reader("thud")) - - val structList = builder.initStructList(3) - structList.get(0).setTextField(new Text.Reader("structlist 1")) - structList.get(1).setTextField(new Text.Reader("structlist 2")) - structList.get(2).setTextField(new Text.Reader("structlist 3")) - - - val enumList = builder.initEnumList(2) - enumList.set(0, TestEnum.FOO) - enumList.set(1, TestEnum.GARPLY) - } - - def checkTestMessage(builder : TestAllTypes.Builder) { - builder.getVoidField() - assert(builder.getBoolField() == true) - assert(builder.getInt8Field() == -123) - assert(builder.getInt16Field() == -12345) - assert(builder.getInt32Field() == -12345678) - assert(builder.getInt64Field() == -123456789012345L) - assert(builder.getUInt8Field() == 0xea.toByte) - assert(builder.getUInt16Field() == 0x4567) - assert(builder.getUInt32Field() == 0x34567890) - assert(builder.getUInt64Field() == 0x1234567890123456L) - assert(builder.getFloat32Field() == 1234.5f) - assert(builder.getFloat64Field() == -123e45) - assert(builder.getTextField().toString() == "foo") - - { - val subBuilder = builder.getStructField() - subBuilder.getVoidField() - assert(subBuilder.getBoolField() == true) - assert(subBuilder.getInt8Field() == -12) - assert(subBuilder.getInt16Field() == 3456) - assert(subBuilder.getInt32Field() == -78901234) - assert(subBuilder.getInt64Field() == 56789012345678L) - assert(subBuilder.getUInt8Field() == 90) - assert(subBuilder.getUInt16Field() == 1234) - assert(subBuilder.getUInt32Field() == 56789012) - assert(subBuilder.getUInt64Field() == 345678901234567890L) - assert(subBuilder.getFloat32Field() == -1.25e-10f) - assert(subBuilder.getFloat64Field() == 345) - - { - val subSubBuilder = subBuilder.getStructField() - assert(subSubBuilder.getTextField().toString() == "nested") - } - - subBuilder.getEnumField() should equal (TestEnum.BAZ) - - val boolList = subBuilder.getBoolList() - assert(boolList.get(0) == false) - assert(boolList.get(1) == true) - assert(boolList.get(2) == false) - assert(boolList.get(3) == true) - assert(boolList.get(4) == true) - - } - builder.getEnumField() should equal (TestEnum.CORGE) - - assert(builder.getVoidList().size() == 6) - - val boolList = builder.getBoolList() - assert(boolList.size() == 4) - assert(boolList.get(0) == true) - assert(boolList.get(1) == false) - assert(boolList.get(2) == false) - assert(boolList.get(3) == true) - - val float64List = builder.getFloat64List() - assert(float64List.get(0) == 7777.75) - assert(float64List.get(1) == Double.PositiveInfinity) - assert(float64List.get(2) == Double.NegativeInfinity) - assert(float64List.get(3) != float64List.get(3)); // NaN - - val textList = builder.getTextList() - assert(textList.size() == 3) - assert(textList.get(0).toString() == "plugh") - assert(textList.get(1).toString() == "xyzzy") - assert(textList.get(2).toString() == "thud") - - val structList = builder.getStructList() - assert(3 == structList.size()) - assert(structList.get(0).getTextField().toString() == "structlist 1") - assert(structList.get(1).getTextField().toString() == "structlist 2") - assert(structList.get(2).getTextField().toString() == "structlist 3") - - val enumList = builder.getEnumList() - (enumList.get(0)) should equal (TestEnum.FOO) - (enumList.get(1)) should equal (TestEnum.GARPLY) - } - - def checkTestMessage(reader : TestAllTypes.Reader) { - reader.getVoidField() - assert(reader.getBoolField() == true) - assert(reader.getInt8Field() == -123) - assert(reader.getInt16Field() == -12345) - assert(reader.getInt32Field() == -12345678) - assert(reader.getInt64Field() == -123456789012345L) - assert(reader.getUInt8Field() == 0xea.toByte) - assert(reader.getUInt16Field() == 0x4567) - assert(reader.getUInt32Field() == 0x34567890) - assert(reader.getUInt64Field() == 0x1234567890123456L) - assert(reader.getFloat32Field() == 1234.5f) - assert(reader.getFloat64Field() == -123e45) - assert(reader.getTextField().toString() == "foo") - - { - val subReader = reader.getStructField() - subReader.getVoidField() - assert(subReader.getBoolField() == true) - assert(subReader.getInt8Field() == -12) - assert(subReader.getInt16Field() == 3456) - assert(subReader.getInt32Field() == -78901234) - assert(subReader.getInt64Field() == 56789012345678L) - assert(subReader.getUInt8Field() == 90) - assert(subReader.getUInt16Field() == 1234) - assert(subReader.getUInt32Field() == 56789012) - assert(subReader.getUInt64Field() == 345678901234567890L) - assert(subReader.getFloat32Field() == -1.25e-10f) - assert(subReader.getFloat64Field() == 345) - - { - val subSubReader = subReader.getStructField() - assert(subSubReader.getTextField().toString() == "nested") - } - val boolList = subReader.getBoolList() - assert(boolList.get(0) == false) - assert(boolList.get(1) == true) - assert(boolList.get(2) == false) - assert(boolList.get(3) == true) - assert(boolList.get(4) == true) - - } - - assert(reader.getVoidList().size() == 6) - - val boolList = reader.getBoolList() - assert(boolList.get(0) == true) - assert(boolList.get(1) == false) - assert(boolList.get(2) == false) - assert(boolList.get(3) == true) - - val float64List = reader.getFloat64List() - assert(float64List.get(0) == 7777.75) - assert(float64List.get(1) == Double.PositiveInfinity) - assert(float64List.get(2) == Double.NegativeInfinity) - assert(float64List.get(3) != float64List.get(3)); // NaN - - val textList = reader.getTextList() - assert(textList.size() == 3) - assert(textList.get(0).toString() == "plugh") - assert(textList.get(1).toString() == "xyzzy") - assert(textList.get(2).toString() == "thud") - - - val structList = reader.getStructList() - assert(3 == structList.size()) - assert(structList.get(0).getTextField().toString() == "structlist 1") - assert(structList.get(1).getTextField().toString() == "structlist 2") - assert(structList.get(2).getTextField().toString() == "structlist 3") - - val enumList = reader.getEnumList() - (enumList.get(0)) should equal (TestEnum.FOO) - (enumList.get(1)) should equal (TestEnum.GARPLY) - - } - - def checkDefaultMessage(builder : TestDefaults.Builder) { - builder.getVoidField() - assert(builder.getBoolField() == true) - assert(builder.getInt8Field() == -123) - assert(builder.getInt16Field() == -12345) - assert(builder.getInt32Field() == -12345678) - assert(builder.getInt64Field() == -123456789012345L) - assert(builder.getUInt8Field() == 0xea.toByte) - assert(builder.getUInt16Field() == 45678.toShort) - assert(builder.getUInt32Field() == 0xce0a6a14) - assert(builder.getUInt64Field() == 0xab54a98ceb1f0ad2L) - assert(builder.getFloat32Field() == 1234.5f) - assert(builder.getFloat64Field() == -123e45) - assert(builder.getEnumField() == TestEnum.CORGE) - - (builder.getTextField().toString()) should equal ("foo") - (builder.getDataField().toArray()) should equal (Array(0x62,0x61,0x72)) - } - - def checkDefaultMessage(reader : TestDefaults.Reader) { - reader.getVoidField() - assert(reader.getBoolField() == true) - assert(reader.getInt8Field() == -123) - assert(reader.getInt16Field() == -12345) - assert(reader.getInt32Field() == -12345678) - assert(reader.getInt64Field() == -123456789012345L) - assert(reader.getUInt8Field() == 0xea.toByte) - assert(reader.getUInt16Field() == 45678.toShort) - assert(reader.getUInt32Field() == 0xce0a6a14) - assert(reader.getUInt64Field() == 0xab54a98ceb1f0ad2L) - assert(reader.getFloat32Field() == 1234.5f) - assert(reader.getFloat64Field() == -123e45) - (reader.getTextField().toString()) should equal ("foo") - (reader.getDataField().toArray()) should equal (Array(0x62,0x61,0x72)) - - { - val subReader = reader.getStructField() - subReader.getVoidField() - subReader.getBoolField() should equal (true) - subReader.getInt8Field() should equal (-12) - subReader.getInt16Field() should equal (3456) - subReader.getInt32Field() should equal (-78901234) - // ... - subReader.getTextField().toString() should equal ("baz") - - { - val subSubReader = subReader.getStructField() - subSubReader.getTextField().toString() should equal ("nested") - } - - } - - reader.getEnumField() should equal (TestEnum.CORGE) - - reader.getVoidList().size() should equal (6) - - { - val listReader = reader.getBoolList() - listReader.size() should equal (4) - listReader.get(0) should equal (true) - listReader.get(1) should equal (false) - listReader.get(2) should equal (false) - listReader.get(3) should equal (true) - } - - { - val listReader = reader.getInt8List() - listReader.size() should equal (2) - listReader.get(0) should equal (111) - listReader.get(1) should equal (-111) - } - - } - - - def setDefaultMessage(builder : TestDefaults.Builder) { - builder.setBoolField(false) - builder.setInt8Field(-122) - builder.setInt16Field(-12344) - builder.setInt32Field(-12345677) - builder.setInt64Field(-123456789012344L) - builder.setUInt8Field(0xe9.toByte) - builder.setUInt16Field(45677.toShort) - builder.setUInt32Field(0xce0a6a13) - builder.setUInt64Field(0xab54a98ceb1f0ad1L) - builder.setFloat32Field(1234.4f) - builder.setFloat64Field(-123e44) - builder.setTextField(new Reader("bar")) - builder.setEnumField(TestEnum.QUX) - } - - def checkSettedDefaultMessage(reader : TestDefaults.Reader) { - assert(reader.getBoolField() == false) - assert(reader.getInt8Field() == -122) - assert(reader.getInt16Field() == -12344) - assert(reader.getInt32Field() == -12345677) - assert(reader.getInt64Field() == -123456789012344L) - assert(reader.getUInt8Field() == 0xe9.toByte) - assert(reader.getUInt16Field() == 45677.toShort) - assert(reader.getUInt32Field() == 0xce0a6a13) - assert(reader.getUInt64Field() == 0xab54a98ceb1f0ad1L) - assert(reader.getFloat32Field() == 1234.4f) - assert(reader.getFloat64Field() == -123e44) - assert(reader.getEnumField() == TestEnum.QUX) - } -} diff --git a/examples/pom.xml b/examples/pom.xml new file mode 100644 index 0000000..462450a --- /dev/null +++ b/examples/pom.xml @@ -0,0 +1,90 @@ + + + 4.0.0 + org.capnproto + examples + jar + capnproto-java examples + 0.1.4 + capnproto-java examples + + org.capnproto + + https://capnproto.org/ + + + MIT + http://opensource.org/licenses/MIT + repo + + + + git@github.com:capnproto/capnproto-java.git + scm:git@github.com:capnproto/capnproto-java.git + + + + dwrensha + David Renshaw + https://github.com/dwrensha + + + + + org.capnproto + runtime + 0.1.4 + + + + + + + maven-antrun-plugin + 3.0.0 + + + generate-sources + generate-sources + + + + + + + + + + + + + + + run + + + + + + + org.codehaus.mojo + build-helper-maven-plugin + 3.1.0 + + + add-generated-sources + generate-sources + + add-source + + + + src/main/generated + + + + + + + + diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..0e14bd2 --- /dev/null +++ b/pom.xml @@ -0,0 +1,34 @@ + + + 4.0.0 + org.capnproto + capnproto-java + pom + 0.1.4 + Cap'n Proto for Java + https://capnproto.org/ + + runtime + compiler + examples + benchmark + + + + MIT + http://opensource.org/licenses/MIT + repo + + + + git@github.com:capnproto/capnproto-java.git + scm:git@github.com:capnproto/capnproto-java.git + + + + dwrensha + David Renshaw + https://github.com/dwrensha + + + diff --git a/project/build.properties b/project/build.properties deleted file mode 100644 index 8ac605a..0000000 --- a/project/build.properties +++ /dev/null @@ -1 +0,0 @@ -sbt.version=0.13.2 diff --git a/project/build.scala b/project/build.scala deleted file mode 100644 index 03f468d..0000000 --- a/project/build.scala +++ /dev/null @@ -1,179 +0,0 @@ -import sbt.Keys._ -import sbt._ - -object Build extends sbt.Build { - - lazy val root = - project( - id = "capnproto-java", - base = file(".") - ).aggregate(compiler, runtime, examples) - .settings(cleanFiles <+= baseDirectory { base => base / "capnpc-java"}) - - lazy val compiler = - project( - id = "compiler", - base = file("compiler") - ).dependsOn(runtime) - .settings(makeCppTask) - .settings(compile <<= compile in Compile dependsOn makeCpp) - .settings(compileTestSchemaTask) - .settings(test <<= test in Test dependsOn compileTestSchema) - .settings(unmanagedSourceDirectories in Test += sourceDirectory.value / "test" / "generated") - .settings(cleanFiles += sourceDirectory.value / "test" / "generated") - - lazy val runtime = - project( - id = "runtime", - base = file("runtime") - ).settings(publishArtifact := true) - .settings(crossPaths := false) // disable outputting the _ suffix - - lazy val examples = - project( - id = "examples", - base = file("examples") - ).dependsOn(runtime, compiler) - .settings(makeExamplesTask) - .settings(test <<= test in Test dependsOn makeExamples) - .settings(compile <<= compile in Compile dependsOn makeExamples) - .settings(unmanagedSourceDirectories in Compile += sourceDirectory.value / "main" / "generated") - .settings(cleanFiles += sourceDirectory.value / "main" / "generated") - .settings(crossPaths := false) // disable outputting the _ suffix - - lazy val benchmark = - project( - id = "benchmark", - base = file("benchmark") - ).dependsOn(runtime, compiler) - .settings(compileBenchmarkSchemaTask) - .settings(compile <<= compile in Compile dependsOn compileBenchmarkSchema) - .settings(unmanagedSourceDirectories in Compile += sourceDirectory.value / "main" / "generated") - .settings(cleanFiles += sourceDirectory.value / "main" / "generated") - .settings(crossPaths := false) // disable outputting the _ suffix - - def project(id: String, base: File) = - Project( - id = id, - base = base, - settings = - Project.defaultSettings ++ - Shared.settings ++ - Seq(libraryDependencies ++= Shared.testDeps) - ).configs(IntegrationTest) - - val compileTestSchema = taskKey[Unit]("Run capnpc-java on test schema") - val compileTestSchemaTask = compileTestSchema := { - val result0 = "mkdir -p compiler/src/test/generated".!! - val result = "capnp compile -I compiler/src/main/schema/ --src-prefix=compiler/src/test/schema/ -o./capnpc-java:compiler/src/test/generated compiler/src/test/schema/test.capnp compiler/src/test/schema/test-import.capnp".!! - println(s"**** CodeGen for test.capnp started\n$result\n**** CodeGen complete."); - } - - val makeCpp = taskKey[Unit]("Run make against the C++ code to create the Java code generator") - val makeCppTask = makeCpp := { - val makeResult = "make capnpc-java".!! - println(s"**** C++ Build Started\n$makeResult\n**** C++ Build Complete") - } - - val makeExamples = taskKey[Unit]("Run capnpc-java compiler against the addressbook schema") - val makeExamplesTask = makeExamples := { - Thread.sleep(1000) - val makeResult = "make addressbook".!! - println(s"**** CodeGen for Addressbook Started\n$makeResult\n**** CodeGen for Addressbook Complete") - } - - val compileBenchmarkSchema = taskKey[Unit]("Run capnpc-java on benchmark schema") - val compileBenchmarkSchemaTask = compileBenchmarkSchema := { - val result0 = "mkdir -p benchmark/src/main/generated".!! - val result = "capnp compile -I compiler/src/main/schema/ --src-prefix=benchmark/src/main/schema/ -o./capnpc-java:benchmark/src/main/generated benchmark/src/main/schema/eval.capnp benchmark/src/main/schema/carsales.capnp benchmark/src/main/schema/catrank.capnp".!! - println(s"**** CodeGen for benchmark started\n$result\n**** CodeGen complete."); - } - -} - -object Shared { - - val testDeps = Seq( - "org.scalatest" %% "scalatest" % "2.1.6" % "it,test" -// "org.scalacheck" %% "scalacheck" % "1.11.4" % "it,test", - ) - - val settings = Seq( - scalaVersion := "2.11.0", - scalacOptions := Seq( - "-deprecation", - "-feature", - "-optimise", - "-Yinline-warnings", - "-unchecked", - "-feature" - ), - javacOptions in (Compile, compile) ++= Seq("-source", "1.7", "-target", "1.7"), - resolvers += Resolver.sonatypeRepo("snapshots"), - resolvers += Resolver.sonatypeRepo("releases"), - shellPrompt := ShellPrompt.buildShellPrompt, - organization := "org.capnproto", - publishArtifact := false, - publishTo := { - val nexus = "https://oss.sonatype.org/" - if (isSnapshot.value) - Some("snapshots" at nexus + "content/repositories/snapshots") - else - Some("releases" at nexus + "service/local/staging/deploy/maven2") - }, - credentials += Credentials(Path.userHome / ".ivy2" / ".credentials"), - publishMavenStyle := true, - version := "0.1.4", - autoScalaLibrary := false, - publishArtifact in Test := false, - autoScalaLibrary in test := false, - pomIncludeRepository := { x => false }, - pomExtra := ( - https://capnproto.org/ - - - MIT - http://opensource.org/licenses/MIT - repo - - - - git@github.com:capnproto/capnproto-java.git - scm:git@github.com:capnproto/capnproto-java.git - - - - dwrensha - David Renshaw - https://github.com/dwrensha - - - ) - - ) - -} - -object ShellPrompt { - object devnull extends ProcessLogger { - def info(s: => String) {} - def error(s: => String) {} - def buffer[T](f: => T): T = f - } - - def currBranch = ( - ("git status -sb" lines_! devnull headOption) - getOrElse "-" stripPrefix "## " - ) - - val buildShellPrompt = { - (state: State) => { - val currProject = Project.extract(state).currentProject.id - "[%s](%s)$ ".format( - currProject, currBranch /*, BuildSettings.buildVersion*/ - ) - } - } -} - - diff --git a/project/plugins.sbt b/project/plugins.sbt deleted file mode 100644 index 368f9d8..0000000 --- a/project/plugins.sbt +++ /dev/null @@ -1,7 +0,0 @@ -addSbtPlugin("com.github.mpeltonen" % "sbt-idea" % "1.5.2") - -addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.7.4") - -resolvers += Resolver.url("scalasbt", new URL("http://scalasbt.artifactoryonline.com/scalasbt/sbt-plugin-releases")) (Resolver.ivyStylePatterns) - -addSbtPlugin("com.typesafe.sbt" % "sbt-pgp" % "0.8.3") diff --git a/runtime/pom.xml b/runtime/pom.xml new file mode 100644 index 0000000..1f34c56 --- /dev/null +++ b/runtime/pom.xml @@ -0,0 +1,40 @@ + + + 4.0.0 + org.capnproto + runtime + jar + runtime + 0.1.4 + Cap'n Proto runtime library + + org.capnproto + + https://capnproto.org/ + + + MIT + http://opensource.org/licenses/MIT + repo + + + + git@github.com:capnproto/capnproto-java.git + scm:git@github.com:capnproto/capnproto-java.git + + + + dwrensha + David Renshaw + https://github.com/dwrensha + + + + + junit + junit + 4.12 + test + + + diff --git a/runtime/src/test/scala/org/capnproto/ArrayInputStreamSuite.scala b/runtime/src/test/java/org/capnproto/ArrayInputStreamTest.java similarity index 64% rename from runtime/src/test/scala/org/capnproto/ArrayInputStreamSuite.scala rename to runtime/src/test/java/org/capnproto/ArrayInputStreamTest.java index 18da8d9..57c61e9 100644 --- a/runtime/src/test/scala/org/capnproto/ArrayInputStreamSuite.scala +++ b/runtime/src/test/java/org/capnproto/ArrayInputStreamTest.java @@ -19,27 +19,30 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. -package org.capnproto +package org.capnproto; -import java.nio.ByteBuffer -import org.scalatest.FunSuite -import org.scalatest.Matchers._ +import org.junit.Assert; +import org.junit.Test; -class ArrayInputStreamSuite extends FunSuite { - test("EmptyArray") { - val stream = new ArrayInputStream(ByteBuffer.allocate(0)) - val dst = ByteBuffer.allocate(10) +import java.nio.ByteBuffer; + +public class ArrayInputStreamTest { + @Test + public void testEmptyArray() throws java.io.IOException { + ArrayInputStream stream = new ArrayInputStream(ByteBuffer.allocate(0)); + ByteBuffer dst = ByteBuffer.allocate(10); // read() should return -1 at the end of the stream // https://docs.oracle.com/javase/7/docs/api/java/nio/channels/ReadableByteChannel.html - stream.read(dst) should equal (-1) + Assert.assertEquals(stream.read(dst), -1); } - test("Request more bytes than are present") { - val oneByte: Array[Byte] = Array(42) - val stream = new ArrayInputStream(ByteBuffer.wrap(oneByte)) - val dst = ByteBuffer.allocate(10) - stream.read(dst) should equal (1) - stream.read(dst) should equal (-1) // end of stream + @Test + public void testRequestMoreBytesThanArePresent() throws java.io.IOException { + byte[] oneByte = new byte[]{42}; + ArrayInputStream stream = new ArrayInputStream(ByteBuffer.wrap(oneByte)); + ByteBuffer dst = ByteBuffer.allocate(10); + Assert.assertEquals(stream.read(dst), 1); + Assert.assertEquals(stream.read(dst), -1); // end of stream } } diff --git a/runtime/src/test/java/org/capnproto/LayoutTest.java b/runtime/src/test/java/org/capnproto/LayoutTest.java new file mode 100644 index 0000000..4ed6042 --- /dev/null +++ b/runtime/src/test/java/org/capnproto/LayoutTest.java @@ -0,0 +1,127 @@ +package org.capnproto; + +import org.junit.Assert; +import org.junit.Test; + +import java.nio.ByteBuffer; +import java.nio.ByteOrder; + +public class LayoutTest { + private class BareStructReader implements StructReader.Factory { + @Override + public StructReader constructReader(SegmentReader segment, int data, int pointers, int dataSize, short pointerCount, int nestingLimit) { + return new StructReader(segment, data, pointers, dataSize, pointerCount, nestingLimit); + } + } + + @Test + public void testSimpleRawDataStruct() { + byte[] data = new byte[] { + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x23, 0x45, (byte)0x467, (byte)0x89, (byte)0xab, (byte)0xcd, (byte)0xef + }; + + ByteBuffer buffer = ByteBuffer.wrap(data); + buffer.order(ByteOrder.LITTLE_ENDIAN); + + ReaderArena arena = new ReaderArena(new ByteBuffer[]{ buffer }, 0x7fffffffffffffffL); + + StructReader reader = WireHelpers.readStructPointer(new BareStructReader(), arena.tryGetSegment(0), 0, null, 0, 0x7fffffff); + + Assert.assertEquals(reader._getLongField(0), 0xefcdab8967452301L); + Assert.assertEquals(reader._getLongField(1), 0L); + + Assert.assertEquals(reader._getIntField(0), 0x67452301); + Assert.assertEquals(reader._getIntField(1), 0xefcdab89); + Assert.assertEquals(reader._getIntField(2), 0); + + Assert.assertEquals(reader._getShortField(0), (short)0x2301); + Assert.assertEquals(reader._getShortField(1), (short)0x6745); + Assert.assertEquals(reader._getShortField(2), (short)0xab89); + Assert.assertEquals(reader._getShortField(3), (short)0xefcd); + Assert.assertEquals(reader._getShortField(4), (short)0); + + Assert.assertEquals(reader._getBooleanField(0), true); + Assert.assertEquals(reader._getBooleanField(1), false); + Assert.assertEquals(reader._getBooleanField(2), false); + + Assert.assertEquals(reader._getBooleanField(3), false); + Assert.assertEquals(reader._getBooleanField(4), false); + Assert.assertEquals(reader._getBooleanField(5), false); + Assert.assertEquals(reader._getBooleanField(6), false); + Assert.assertEquals(reader._getBooleanField(7), false); + + Assert.assertEquals(reader._getBooleanField(8), true); + Assert.assertEquals(reader._getBooleanField(9), true); + Assert.assertEquals(reader._getBooleanField(10), false); + Assert.assertEquals(reader._getBooleanField(11), false); + Assert.assertEquals(reader._getBooleanField(12), false); + Assert.assertEquals(reader._getBooleanField(13), true); + Assert.assertEquals(reader._getBooleanField(14), false); + Assert.assertEquals(reader._getBooleanField(15), false); + + Assert.assertEquals(reader._getBooleanField(63), true); + Assert.assertEquals(reader._getBooleanField(64), false); + } + + private class BareStructBuilder implements StructBuilder.Factory { + private StructSize structSize; + + public BareStructBuilder(StructSize structSize) { + this.structSize = structSize; + } + + @Override + public StructBuilder constructBuilder(SegmentBuilder segment, int data, int pointers, int dataSize, short pointerCount) { + return new StructBuilder(segment, data, pointers, dataSize, pointerCount); + } + + @Override + public StructSize structSize() { + return this.structSize; + } + } + + @Test + public void testStructRoundTripOneSegment() { + ByteBuffer buffer = ByteBuffer.allocate(1024*8); + buffer.order(ByteOrder.LITTLE_ENDIAN); + + SegmentBuilder segment = new SegmentBuilder(buffer, new BuilderArena(BuilderArena.SUGGESTED_FIRST_SEGMENT_WORDS, + BuilderArena.SUGGESTED_ALLOCATION_STRATEGY)); + BareStructBuilder factory = new BareStructBuilder(new StructSize((short) 2, (short) 4)); + StructBuilder builder = WireHelpers.initStructPointer(factory, 0, segment, factory.structSize()); + + setUpStruct(builder); + checkStruct(builder); + } + + private void setUpStruct(StructBuilder builder) { + builder._setLongField(0, 0x1011121314151617L); + builder._setIntField(2, 0x20212223); + builder._setShortField(6, (short)0x3031); + builder._setByteField(14, (byte)0x40); + builder._setBooleanField(120, false); + builder._setBooleanField(121, false); + builder._setBooleanField(122, true); + builder._setBooleanField(123, false); + builder._setBooleanField(124, true); + builder._setBooleanField(125, true); + builder._setBooleanField(126, true); + builder._setBooleanField(127, false); + } + + private void checkStruct(StructBuilder builder) { + Assert.assertEquals(0x1011121314151617L, builder._getLongField(0)); + Assert.assertEquals(0x20212223, builder._getIntField(2)); + Assert.assertEquals(0x3031, builder._getShortField(6)); + Assert.assertEquals(0x40, builder._getByteField(14)); + Assert.assertEquals(false, builder._getBooleanField(120)); + Assert.assertEquals(false, builder._getBooleanField(121)); + Assert.assertEquals(true, builder._getBooleanField(122)); + Assert.assertEquals(false, builder._getBooleanField(123)); + Assert.assertEquals(true, builder._getBooleanField(124)); + Assert.assertEquals(true, builder._getBooleanField(125)); + Assert.assertEquals(true, builder._getBooleanField(126)); + Assert.assertEquals(false, builder._getBooleanField(127)); + } +} diff --git a/runtime/src/test/java/org/capnproto/SerializePackedTest.java b/runtime/src/test/java/org/capnproto/SerializePackedTest.java new file mode 100644 index 0000000..f4197f0 --- /dev/null +++ b/runtime/src/test/java/org/capnproto/SerializePackedTest.java @@ -0,0 +1,85 @@ +package org.capnproto; + +import org.junit.Assert; +import org.junit.Test; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.Arrays; + +public class SerializePackedTest { + + @Test + public void testSimplePacking() { + assertPacksTo(new byte[0], new byte[0]); + + assertPacksTo(new byte[]{0,0,0,0,0,0,0,0}, new byte[]{0,0}); + + assertPacksTo(new byte[]{0,0,12,0,0,34,0,0}, new byte[]{0x24,12,34}); + + assertPacksTo(new byte[]{1,3,2,4,5,7,6,8}, new byte[]{(byte)0xff,1,3,2,4,5,7,6,8,0}); + + assertPacksTo(new byte[]{0,0,0,0,0,0,0,0, 1,3,2,4,5,7,6,8}, + new byte[]{0,0,(byte)0xff,1,3,2,4,5,7,6,8,0}); + + assertPacksTo(new byte[]{0,0,12,0,0,34,0,0, 1,3,2,4,5,7,6,8}, + new byte[]{0x24, 12, 34, (byte)0xff,1,3,2,4,5,7,6,8,0}); + + assertPacksTo(new byte[]{1,3,2,4,5,7,6,8, 8,6,7,4,5,2,3,1}, + new byte[]{(byte)0xff,1,3,2,4,5,7,6,8,1,8,6,7,4,5,2,3,1}); + + assertPacksTo(new byte[]{1,2,3,4,5,6,7,8, 1,2,3,4,5,6,7,8, 1,2,3,4,5,6,7,8, 1,2,3,4,5,6,7,8, 0,2,4,0,9,0,5,1}, + new byte[]{(byte)0xff,1,2,3,4,5,6,7,8, 3, 1,2,3,4,5,6,7,8, 1,2,3,4,5,6,7,8, 1,2,3,4,5,6,7,8, + (byte)0xd6,2,4,9,5,1}); + + assertPacksTo(new byte[]{1,2,3,4,5,6,7,8, 1,2,3,4,5,6,7,8, 6,2,4,3,9,0,5,1, 1,2,3,4,5,6,7,8, 0,2,4,0,9,0,5,1}, + new byte[]{(byte)0xff,1,2,3,4,5,6,7,8, 3, 1,2,3,4,5,6,7,8, 6,2,4,3,9,0,5,1, 1,2,3,4,5,6,7,8, + (byte)0xd6,2,4,9,5,1}); + + assertPacksTo(new byte[]{8,0,100,6,0,1,1,2, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,1,0,2,0,3,1}, + new byte[]{(byte)0xed,8,100,6,1,1,2, 0,2, (byte)0xd4,1,2,3,1}); + + assertPacksTo(new byte[]{0,0,0,0,2,0,0,0, 0,0,0,0,0,0,1,0, 0,0,0,0,0,0,0,0}, + new byte[]{0x10,2, 0x40,1, 0,0}); + + assertPacksTo(new byte[8 * 200], new byte[]{0, (byte)199}); + + byte[] ones = new byte[8 * 200]; + Arrays.fill(ones, (byte)1); + byte[] packedOnes = new byte[10 + 8 * 199]; + Arrays.fill(packedOnes, (byte)1); + packedOnes[0] = (byte)255; + packedOnes[9] = (byte)199; + assertPacksTo(ones,packedOnes); + } + + private void assertPacksTo(byte[] unpacked, byte[] packed) { + { + byte[] bytes = new byte[packed.length]; + ArrayOutputStream writer = new ArrayOutputStream(ByteBuffer.wrap(bytes)); + PackedOutputStream packedOutputStream = new PackedOutputStream(writer); + try { + packedOutputStream.write(ByteBuffer.wrap(unpacked)); + } catch (IOException e) { + Assert.fail("Failed writing to PackedOutputStream"); + } + + Assert.assertTrue(Arrays.equals(bytes, packed)); + } + + { + ArrayInputStream reader = new ArrayInputStream(ByteBuffer.wrap(packed)); + PackedInputStream stream = new PackedInputStream(reader); + byte[] bytes = new byte[unpacked.length]; + int n = 0; + try { + n = stream.read(ByteBuffer.wrap(bytes)); + } catch (IOException e) { + Assert.fail("Failed reading from PackedInputStream"); + } + + Assert.assertEquals(n, unpacked.length); + Assert.assertTrue(Arrays.equals(bytes, unpacked)); + } + } +} diff --git a/runtime/src/test/java/org/capnproto/SerializeTest.java b/runtime/src/test/java/org/capnproto/SerializeTest.java new file mode 100644 index 0000000..5b5c5f4 --- /dev/null +++ b/runtime/src/test/java/org/capnproto/SerializeTest.java @@ -0,0 +1,128 @@ +// Copyright (c) 2013-2014 Sandstorm Development Group, Inc. and contributors +// Licensed under the MIT License: +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +package org.capnproto; + +import java.nio.ByteBuffer; + +import org.junit.Assert; +import org.junit.Test; + +public class SerializeTest { + + /** + * @param arena: segment `i` contains `i` words each set to `i` + */ + private void checkSegmentContents(int exampleSegmentCount, ReaderArena arena) { + Assert.assertEquals(arena.segments.size(), exampleSegmentCount); + for (int i = 0; i < exampleSegmentCount; ++i) { + SegmentReader segment = arena.segments.get(i); + java.nio.LongBuffer segmentWords = segment.buffer.asLongBuffer(); + + Assert.assertEquals(segmentWords.capacity(), i); + segmentWords.rewind(); + while (segmentWords.hasRemaining()) { + Assert.assertEquals(segmentWords.get(), i); + } + } + } + + /** + * @param exampleSegmentCount number of segments + * @param exampleBytes byte array containing `segmentCount` segments; segment `i` contains `i` words each set to `i` + */ + private void expectSerializesTo(int exampleSegmentCount, byte[] exampleBytes) throws java.io.IOException { + // ---- + // read via ReadableByteChannel + { + MessageReader messageReader = Serialize.read(new ArrayInputStream(ByteBuffer.wrap(exampleBytes))); + checkSegmentContents(exampleSegmentCount, messageReader.arena); + } + + // ------ + // read via ByteBuffer + { + MessageReader messageReader = Serialize.read(ByteBuffer.wrap(exampleBytes)); + checkSegmentContents(exampleSegmentCount, messageReader.arena); + } + } + + @Test + public void testSegmentReading() throws java.io.IOException { + // When transmitting over a stream, the following should be sent. All integers are unsigned and little-endian. + // - (4 bytes) The number of segments, minus one (since there is always at least one segment). + // - (N * 4 bytes) The size of each segment, in words. + // - (0 or 4 bytes) Padding up to the next word boundary. + // - The content of each segment, in order. + + expectSerializesTo(1, new byte[]{ + 0, 0, 0, 0, // 1 segment + 0, 0, 0, 0 // Segment 0 contains 0 bytes + // No padding + // Segment 0 (empty) + }); + + expectSerializesTo(2, new byte[]{ + 1, 0, 0, 0, // 2 segments + 0, 0, 0, 0, // Segment 0 contains 0 words + 1, 0, 0, 0, // Segment 1 contains 1 words + // Padding + 0, 0, 0, 0, + // Segment 0 (empty) + // Segment 1 + 1, 0, 0, 0, 0, 0, 0, 0 + }); + + expectSerializesTo(3, new byte[] { + 2, 0, 0, 0, // 3 segments + 0, 0, 0, 0, // Segment 0 contains 0 words + 1, 0, 0, 0, // Segment 1 contains 1 words + 2, 0, 0, 0, // Segment 2 contains 2 words + // No padding + // Segment 0 (empty) + // Segment 1 + 1, 0, 0, 0, 0, 0, 0, 0, + // Segment 2 + 2, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0 + }); + + expectSerializesTo(4, new byte[]{ + 3, 0, 0, 0, // 4 segments + 0, 0, 0, 0, // Segment 0 contains 0 words + 1, 0, 0, 0, // Segment 1 contains 1 words + 2, 0, 0, 0, // Segment 2 contains 2 words + 3, 0, 0, 0, // Segment 3 contains 3 words + // Padding + 0, 0, 0, 0, + // Segment 0 (empty) + // Segment 1 + 1, 0, 0, 0, 0, 0, 0, 0, + // Segment 2 + 2, 0, 0, 0, 0, 0, 0, 0, + 2, 0, 0, 0, 0, 0, 0, 0, + // Segment 3 + 3, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0, + 3, 0, 0, 0, 0, 0, 0, 0 + }); + } +} diff --git a/runtime/src/test/scala/org/capnproto/LayoutSuite.scala b/runtime/src/test/scala/org/capnproto/LayoutSuite.scala deleted file mode 100644 index 2a8f778..0000000 --- a/runtime/src/test/scala/org/capnproto/LayoutSuite.scala +++ /dev/null @@ -1,144 +0,0 @@ -// Copyright (c) 2013-2014 Sandstorm Development Group, Inc. and contributors -// Licensed under the MIT License: -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -package org.capnproto - -import org.scalatest.FunSuite - - -class LayoutSuite extends FunSuite { - - class BareStructReader extends StructReader.Factory[StructReader] { - def constructReader(segment: org.capnproto.SegmentReader, data: Int, pointers: Int, - dataSize: Int, pointerCount: Short, nestingLimit:Int) : StructReader = { - new StructReader(segment,data,pointers,dataSize,pointerCount,nestingLimit) - } - } - - test("SimpleRawDataStruct") { - val data : Array[Byte] = - Array(0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x01, 0x23, 0x45, 0x67, 0x89.toByte, 0xab.toByte, - 0xcd.toByte, 0xef.toByte) - - val buffer = java.nio.ByteBuffer.wrap(data) - buffer.order(java.nio.ByteOrder.LITTLE_ENDIAN) - - val arena = new ReaderArena(Array(buffer), 0x7fffffffffffffffL) - - val reader = WireHelpers.readStructPointer(new BareStructReader(), - arena.tryGetSegment(0), - 0, null, 0, 0x7fffffff) - - assert(reader._getLongField(0) === 0xefcdab8967452301L) - assert(reader._getLongField(1) === 0L) - - assert(reader._getIntField(0) === 0x67452301) - assert(reader._getIntField(1) === 0xefcdab89) - assert(reader._getIntField(2) === 0) - assert(reader._getShortField(0) === 0x2301.toShort) - assert(reader._getShortField(1) === 0x6745.toShort) - assert(reader._getShortField(2) === 0xab89.toShort) - assert(reader._getShortField(3) === 0xefcd.toShort) - assert(reader._getShortField(4) === 0.toShort) - - // TODO masking - - assert(reader._getBooleanField(0) === true) - assert(reader._getBooleanField(1) === false) - assert(reader._getBooleanField(2) === false) - - assert(reader._getBooleanField(3) === false) - assert(reader._getBooleanField(4) === false) - assert(reader._getBooleanField(5) === false) - assert(reader._getBooleanField(6) === false) - assert(reader._getBooleanField(7) == false) - - assert(reader._getBooleanField(8) === true) - assert(reader._getBooleanField(9) === true) - assert(reader._getBooleanField(10) === false) - assert(reader._getBooleanField(11) === false) - assert(reader._getBooleanField(12) === false) - assert(reader._getBooleanField(13) === true) - assert(reader._getBooleanField(14) === false) - assert(reader._getBooleanField(15) === false) - - assert(reader._getBooleanField(63) === true) - assert(reader._getBooleanField(64) === false) - - // TODO masking - - } - - def setupStruct(builder : StructBuilder) = { - builder._setLongField(0, 0x1011121314151617L) - builder._setIntField(2, 0x20212223) - builder._setShortField(6, 0x3031.toShort) - builder._setByteField(14, 0x40) - builder._setBooleanField(120, false) - builder._setBooleanField(121, false) - builder._setBooleanField(122, true) - builder._setBooleanField(123, false) - builder._setBooleanField(124, true) - builder._setBooleanField(125, true) - builder._setBooleanField(126, true) - builder._setBooleanField(127, false) - } - - def checkStruct(builder : StructBuilder) { - assert(0x1011121314151617L === builder._getLongField(0)) - assert(0x20212223 == builder._getIntField(2)) - assert(0x3031 === builder._getShortField(6)) - assert(0x40 === builder._getByteField(14)) - assert(false === builder._getBooleanField(120)) - assert(false === builder._getBooleanField(121)) - assert(true === builder._getBooleanField(122)) - assert(false === builder._getBooleanField(123)) - assert(true === builder._getBooleanField(124)) - assert(true === builder._getBooleanField(125)) - assert(true === builder._getBooleanField(126)) - assert(false === builder._getBooleanField(127)) - } - - - class BareStructBuilder(val structSize : StructSize) extends StructBuilder.Factory[StructBuilder] { - - def constructBuilder(segment: org.capnproto.SegmentBuilder, data: Int, pointers: Int, - dataSize: Int, pointerCount: Short) : StructBuilder = { - new StructBuilder(segment,data,pointers,dataSize,pointerCount) - } - } - - - test("StructRoundTrip_OneSegment") { - val buffer = java.nio.ByteBuffer.allocate(1024 * 8) - buffer.order(java.nio.ByteOrder.LITTLE_ENDIAN) - - val segment = new SegmentBuilder(buffer, new BuilderArena(BuilderArena.SUGGESTED_FIRST_SEGMENT_WORDS, - BuilderArena.SUGGESTED_ALLOCATION_STRATEGY)) - val factory = new BareStructBuilder(new StructSize(2, 4)) - val builder = WireHelpers.initStructPointer(factory, 0, segment, factory.structSize) - setupStruct(builder) - checkStruct(builder) - } - -} - diff --git a/runtime/src/test/scala/org/capnproto/SerializePackedSuite.scala b/runtime/src/test/scala/org/capnproto/SerializePackedSuite.scala deleted file mode 100644 index 65247ba..0000000 --- a/runtime/src/test/scala/org/capnproto/SerializePackedSuite.scala +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright (c) 2013-2014 Sandstorm Development Group, Inc. and contributors -// Licensed under the MIT License: -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -package org.capnproto - -import org.scalatest.FunSuite -import org.scalatest.Matchers._ -import java.nio.ByteBuffer - -class SerializePackedSuite extends FunSuite { - - def expectPacksTo(unpacked : Array[Byte], packed : Array[Byte]) { - // ---- - // write - { - val bytes = new Array[Byte](packed.length) - val writer = new ArrayOutputStream(ByteBuffer.wrap(bytes)) - val packedOutputStream = new PackedOutputStream(writer) - packedOutputStream.write(ByteBuffer.wrap(unpacked)) - - (bytes) should equal (packed) - } - - // ------ - // read - { - val reader = new ArrayInputStream(ByteBuffer.wrap(packed)) - val packedInputStream = new PackedInputStream(reader) - val bytes = new Array[Byte](unpacked.length) - val n = packedInputStream.read(ByteBuffer.wrap(bytes)) - - (n) should equal (unpacked.length) - - (bytes) should equal (unpacked) - } - } - - test("SimplePacking") { - expectPacksTo(Array(), Array()) - expectPacksTo(Array(0,0,0,0,0,0,0,0), Array(0,0)) - expectPacksTo(Array(0,0,12,0,0,34,0,0), Array(0x24,12,34)) - expectPacksTo(Array(1,3,2,4,5,7,6,8), Array(0xff.toByte,1,3,2,4,5,7,6,8,0)) - expectPacksTo(Array(0,0,0,0,0,0,0,0, 1,3,2,4,5,7,6,8), - Array(0,0,0xff.toByte,1,3,2,4,5,7,6,8,0)) - expectPacksTo(Array(0,0,12,0,0,34,0,0, 1,3,2,4,5,7,6,8), - Array(0x24, 12, 34, 0xff.toByte,1,3,2,4,5,7,6,8,0)) - expectPacksTo(Array(1,3,2,4,5,7,6,8, 8,6,7,4,5,2,3,1), - Array(0xff.toByte,1,3,2,4,5,7,6,8,1,8,6,7,4,5,2,3,1)) - - expectPacksTo(Array(1,2,3,4,5,6,7,8, 1,2,3,4,5,6,7,8, 1,2,3,4,5,6,7,8, 1,2,3,4,5,6,7,8, 0,2,4,0,9,0,5,1), - Array(0xff.toByte,1,2,3,4,5,6,7,8, 3, 1,2,3,4,5,6,7,8, 1,2,3,4,5,6,7,8, 1,2,3,4,5,6,7,8, - 0xd6.toByte,2,4,9,5,1)) - - expectPacksTo(Array(1,2,3,4,5,6,7,8, 1,2,3,4,5,6,7,8, 6,2,4,3,9,0,5,1, 1,2,3,4,5,6,7,8, 0,2,4,0,9,0,5,1), - Array(0xff.toByte,1,2,3,4,5,6,7,8, 3, 1,2,3,4,5,6,7,8, 6,2,4,3,9,0,5,1, 1,2,3,4,5,6,7,8, - 0xd6.toByte,2,4,9,5,1)) - - expectPacksTo(Array(8,0,100,6,0,1,1,2, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,1,0,2,0,3,1), - Array(0xed.toByte,8,100,6,1,1,2, 0,2, 0xd4.toByte,1,2,3,1)) - - expectPacksTo(Array(0,0,0,0,2,0,0,0, 0,0,0,0,0,0,1,0, 0,0,0,0,0,0,0,0), - Array(0x10,2, 0x40,1, 0,0)) - - expectPacksTo(Array.tabulate[Byte](8 * 200)((n) => 0), - Array(0, 199.toByte)) - - expectPacksTo(Array.tabulate[Byte](8 * 200)((n) => 1), - Array.concat(Array(0xff.toByte, 1,1,1,1,1,1,1,1, 199.toByte), - Array.tabulate[Byte](8 * 199)((n) => 1))) - } -} diff --git a/runtime/src/test/scala/org/capnproto/SerializeSuite.scala b/runtime/src/test/scala/org/capnproto/SerializeSuite.scala deleted file mode 100644 index a1a1c6c..0000000 --- a/runtime/src/test/scala/org/capnproto/SerializeSuite.scala +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright (c) 2013-2014 Sandstorm Development Group, Inc. and contributors -// Licensed under the MIT License: -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to deal -// in the Software without restriction, including without limitation the rights -// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -// copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -// THE SOFTWARE. - -package org.capnproto - -import java.nio.ByteBuffer - -import org.scalatest.FunSuite -import org.scalatest.Matchers._ - -class SerializeSuite extends FunSuite { - /** - * @param exampleSegmentCount number of segments - * @param exampleBytes byte array containing `segmentCount` segments; segment `i` contains `i` words each set to `i` - */ - def expectSerializesTo(exampleSegmentCount: Int, exampleBytes: Array[Byte]): Unit = { - def checkSegmentContents(arena: ReaderArena): Unit = { - arena.segments should have length exampleSegmentCount - for (i <- 0 until exampleSegmentCount) { - val segment = arena.segments.get(i) - val segmentWords = segment.buffer.asLongBuffer() - - segmentWords.capacity should equal (i) - segmentWords.rewind() - while (segmentWords.hasRemaining) { - segmentWords.get should equal (i) - } - } - } - - // ---- - // read via ReadableByteChannel - { - val messageReader = Serialize.read(new ArrayInputStream(ByteBuffer.wrap(exampleBytes))) - checkSegmentContents(messageReader.arena) - } - - // ------ - // read via ByteBuffer - { - val messageReader = Serialize.read(ByteBuffer.wrap(exampleBytes)) - checkSegmentContents(messageReader.arena) - } - } - - test("SegmentReading") { - // When transmitting over a stream, the following should be sent. All integers are unsigned and little-endian. - // - (4 bytes) The number of segments, minus one (since there is always at least one segment). - // - (N * 4 bytes) The size of each segment, in words. - // - (0 or 4 bytes) Padding up to the next word boundary. - // - The content of each segment, in order. - - expectSerializesTo(1, Array[Byte]( - 0, 0, 0, 0, // 1 segment - 0, 0, 0, 0 // Segment 0 contains 0 bytes - // No padding - // Segment 0 (empty) - )) - - expectSerializesTo(2, Array[Byte]( - 1, 0, 0, 0, // 2 segments - 0, 0, 0, 0, // Segment 0 contains 0 words - 1, 0, 0, 0, // Segment 1 contains 1 words - // Padding - 0, 0, 0, 0, - // Segment 0 (empty) - // Segment 1 - 1, 0, 0, 0, 0, 0, 0, 0 - )) - - expectSerializesTo(3, Array[Byte]( - 2, 0, 0, 0, // 3 segments - 0, 0, 0, 0, // Segment 0 contains 0 words - 1, 0, 0, 0, // Segment 1 contains 1 words - 2, 0, 0, 0, // Segment 2 contains 2 words - // No padding - // Segment 0 (empty) - // Segment 1 - 1, 0, 0, 0, 0, 0, 0, 0, - // Segment 2 - 2, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 0, 0 - )) - - expectSerializesTo(4, Array[Byte]( - 3, 0, 0, 0, // 4 segments - 0, 0, 0, 0, // Segment 0 contains 0 words - 1, 0, 0, 0, // Segment 1 contains 1 words - 2, 0, 0, 0, // Segment 2 contains 2 words - 3, 0, 0, 0, // Segment 3 contains 3 words - // Padding - 0, 0, 0, 0, - // Segment 0 (empty) - // Segment 1 - 1, 0, 0, 0, 0, 0, 0, 0, - // Segment 2 - 2, 0, 0, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 0, 0, 0, - // Segment 3 - 3, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0, - 3, 0, 0, 0, 0, 0, 0, 0 - )) - } -} diff --git a/version.sbt b/version.sbt deleted file mode 100644 index e765444..0000000 --- a/version.sbt +++ /dev/null @@ -1 +0,0 @@ -version in ThisBuild := "0.1.0"