Merge pull request #32 from bchallenor/master

Support reading all segments from a single ByteBuffer (e.g. memory mapped file)
This commit is contained in:
David Renshaw 2015-05-04 11:07:51 -04:00
commit 89e3dff2da
8 changed files with 1161 additions and 988 deletions

View file

@ -0,0 +1,571 @@
// 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("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("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("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)
}
}
// to debug, do this:
//Serialize.write((new java.io.FileOutputStream("/Users/dwrensha/Desktop/test.dat")).getChannel(),
// message)
}

View file

@ -1,563 +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("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("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);
var 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("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);
}
}
// to debug, do this:
//Serialize.write((new java.io.FileOutputStream("/Users/dwrensha/Desktop/test.dat")).getChannel(),
// message);
}

View file

@ -19,356 +19,361 @@
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
package org.capnproto;
package org.capnproto
import org.capnproto.Text.Reader
import org.scalatest.Matchers._;
import org.capnproto.test.Test._;
import org.scalatest.Matchers._
import org.capnproto.test.Test._
object TestUtil {
def data(str : String) : Array[Byte] = {
try {
return str.getBytes("ISO_8859-1");
str.getBytes("ISO_8859-1")
} catch {
case e: Exception => throw new Error("could not decode");
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);
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 boolList = subBuilder.initBoolList(5);
boolList.set(0, false);
boolList.set(1, true);
boolList.set(2, false);
boolList.set(3, true);
boolList.set(4, true);
{
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);
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 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 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 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 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);
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");
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 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();
val subSubBuilder = subBuilder.getStructField()
assert(subSubBuilder.getTextField().toString() == "nested")
}
subBuilder.getEnumField() should equal (TestEnum.BAZ);
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);
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);
builder.getEnumField() should equal (TestEnum.CORGE)
assert(builder.getVoidList().size() == 6);
assert(builder.getVoidList().size() == 6)
val boolList = builder.getBoolList();
assert(boolList.get(0) == true);
assert(boolList.get(1) == false);
assert(boolList.get(2) == false);
assert(boolList.get(3) == true);
val boolList = builder.getBoolList()
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);
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 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());
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);
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");
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 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();
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);
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);
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 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);
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 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());
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);
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.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));
(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));
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);
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");
subReader.getTextField().toString() should equal ("baz")
{
val subSubReader = subReader.getStructField();
subSubReader.getTextField().toString() should equal ("nested");
val subSubReader = subReader.getStructField()
subSubReader.getTextField().toString() should equal ("nested")
}
}
reader.getEnumField() should equal (TestEnum.CORGE);
reader.getEnumField() should equal (TestEnum.CORGE)
reader.getVoidList().size() should equal (6)
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.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);
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);
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.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)
}
}

View file

@ -107,6 +107,46 @@ public final class Serialize {
return new MessageReader(segmentSlices, options);
}
public static MessageReader read(ByteBuffer bb) throws IOException {
return read(bb, ReaderOptions.DEFAULT_READER_OPTIONS);
}
public static MessageReader read(ByteBuffer bb, ReaderOptions options) throws IOException {
bb.order(ByteOrder.LITTLE_ENDIAN);
int segmentCount = 1 + bb.getInt();
if (segmentCount > 512) {
throw new IOException("too many segments");
}
ByteBuffer[] segmentSlices = new ByteBuffer[segmentCount];
int segmentSizesBase = bb.position();
int segmentSizesSize = segmentCount * 4;
int align = Constants.BYTES_PER_WORD - 1;
int segmentBase = (segmentSizesBase + segmentSizesSize + align) & ~align;
int totalWords = 0;
for (int ii = 0; ii < segmentCount; ++ii) {
int segmentSize = bb.getInt(segmentSizesBase + ii * 4);
bb.position(segmentBase + totalWords * Constants.BYTES_PER_WORD);
segmentSlices[ii] = bb.slice();
segmentSlices[ii].limit(segmentSize * Constants.BYTES_PER_WORD);
segmentSlices[ii].order(ByteOrder.LITTLE_ENDIAN);
totalWords += segmentSize;
}
if (totalWords > options.traversalLimitInWords) {
throw new DecodeException("Message size exceeds traversal limit.");
}
return new MessageReader(segmentSlices, options);
}
public static void write(WritableByteChannel outputChannel,
MessageBuilder message) throws IOException {
ByteBuffer[] segments = message.getSegmentsForOutput();

View file

@ -0,0 +1,144 @@
// 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)
}
}

View file

@ -1,147 +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 = {
return 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(structSize : StructSize) extends StructBuilder.Factory[StructBuilder] {
def constructBuilder(segment: org.capnproto.SegmentBuilder, data: Int, pointers: Int,
dataSize: Int, pointerCount: Short) : StructBuilder = {
return new StructBuilder(segment,data,pointers,dataSize,pointerCount);
}
def structSize() : StructSize = {
return structSize;
}
}
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);
}
}

View file

@ -19,11 +19,11 @@
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
package org.capnproto;
package org.capnproto
import org.scalatest.FunSuite;
import org.scalatest.Matchers._;
import java.nio.ByteBuffer;
import org.scalatest.FunSuite
import org.scalatest.Matchers._
import java.nio.ByteBuffer
class SerializePackedSuite extends FunSuite {
@ -31,54 +31,54 @@ class SerializePackedSuite extends FunSuite {
// ----
// 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));
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);
(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));
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);
(n) should equal (unpacked.length)
(bytes) should equal (unpacked);
(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(), 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));
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));
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));
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));
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));
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));
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));
Array(0x10,2, 0x40,1, 0,0))
}
}

View file

@ -0,0 +1,123 @@
// 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
))
}
}