CORDA-601 - Start adding whitelist support to the carpenter

Set things up so that the carpenter must be constructed with a Corda
white list object. Right now we don't do anything with it but this will
capture all the changes in the tests to make it "jsut work" as is before
getting into the meat of the change

Externally this is a "no op" as the serialiser factory already takes a
white list as a construction parameter and the carpenter should use that
anyway
This commit is contained in:
Katelyn Baker
2017-09-22 17:47:43 +01:00
parent addd3b34c8
commit 5a66433266
13 changed files with 196 additions and 182 deletions

View File

@ -34,7 +34,7 @@ class SerializerFactory(val whitelist: ClassWhitelist, cl: ClassLoader) {
private val serializersByType = ConcurrentHashMap<Type, AMQPSerializer<Any>>() private val serializersByType = ConcurrentHashMap<Type, AMQPSerializer<Any>>()
private val serializersByDescriptor = ConcurrentHashMap<Any, AMQPSerializer<Any>>() private val serializersByDescriptor = ConcurrentHashMap<Any, AMQPSerializer<Any>>()
private val customSerializers = CopyOnWriteArrayList<CustomSerializer<out Any>>() private val customSerializers = CopyOnWriteArrayList<CustomSerializer<out Any>>()
val classCarpenter = ClassCarpenter(cl) val classCarpenter = ClassCarpenter(cl, whitelist)
val classloader: ClassLoader val classloader: ClassLoader
get() = classCarpenter.classloader get() = classCarpenter.classloader
@ -61,24 +61,24 @@ class SerializerFactory(val whitelist: ClassWhitelist, cl: ClassLoader) {
val actualType: Type = inferTypeVariables(actualClass, declaredClass, declaredType) ?: declaredType val actualType: Type = inferTypeVariables(actualClass, declaredClass, declaredType) ?: declaredType
val serializer = when { val serializer = when {
// Declared class may not be set to Collection, but actual class could be a collection. // Declared class may not be set to Collection, but actual class could be a collection.
// In this case use of CollectionSerializer is perfectly appropriate. // In this case use of CollectionSerializer is perfectly appropriate.
(Collection::class.java.isAssignableFrom(declaredClass) || (Collection::class.java.isAssignableFrom(declaredClass) ||
(actualClass != null && Collection::class.java.isAssignableFrom(actualClass))) && (actualClass != null && Collection::class.java.isAssignableFrom(actualClass))) &&
!EnumSet::class.java.isAssignableFrom(actualClass ?: declaredClass) -> { !EnumSet::class.java.isAssignableFrom(actualClass ?: declaredClass) -> {
val declaredTypeAmended= CollectionSerializer.deriveParameterizedType(declaredType, declaredClass, actualClass) val declaredTypeAmended = CollectionSerializer.deriveParameterizedType(declaredType, declaredClass, actualClass)
serializersByType.computeIfAbsent(declaredTypeAmended) { serializersByType.computeIfAbsent(declaredTypeAmended) {
CollectionSerializer(declaredTypeAmended, this) CollectionSerializer(declaredTypeAmended, this)
} }
} }
// Declared class may not be set to Map, but actual class could be a map. // Declared class may not be set to Map, but actual class could be a map.
// In this case use of MapSerializer is perfectly appropriate. // In this case use of MapSerializer is perfectly appropriate.
(Map::class.java.isAssignableFrom(declaredClass) || (Map::class.java.isAssignableFrom(declaredClass) ||
(actualClass != null && Map::class.java.isAssignableFrom(actualClass))) -> { (actualClass != null && Map::class.java.isAssignableFrom(actualClass))) -> {
val declaredTypeAmended= MapSerializer.deriveParameterizedType(declaredType, declaredClass, actualClass) val declaredTypeAmended = MapSerializer.deriveParameterizedType(declaredType, declaredClass, actualClass)
serializersByType.computeIfAbsent(declaredTypeAmended) { serializersByType.computeIfAbsent(declaredTypeAmended) {
makeMapSerializer(declaredTypeAmended) makeMapSerializer(declaredTypeAmended)
} }
} }
Enum::class.java.isAssignableFrom(actualClass ?: declaredClass) -> serializersByType.computeIfAbsent(actualClass ?: declaredClass) { Enum::class.java.isAssignableFrom(actualClass ?: declaredClass) -> serializersByType.computeIfAbsent(actualClass ?: declaredClass) {
EnumSerializer(actualType, actualClass ?: declaredClass, this) EnumSerializer(actualType, actualClass ?: declaredClass, this)
@ -99,7 +99,7 @@ class SerializerFactory(val whitelist: ClassWhitelist, cl: ClassLoader) {
private fun inferTypeVariables(actualClass: Class<*>?, declaredClass: Class<*>, declaredType: Type): Type? = private fun inferTypeVariables(actualClass: Class<*>?, declaredClass: Class<*>, declaredType: Type): Type? =
when (declaredType) { when (declaredType) {
is ParameterizedType -> inferTypeVariables(actualClass, declaredClass, declaredType) is ParameterizedType -> inferTypeVariables(actualClass, declaredClass, declaredType)
// Nothing to infer, otherwise we'd have ParameterizedType // Nothing to infer, otherwise we'd have ParameterizedType
is Class<*> -> actualClass is Class<*> -> actualClass
is GenericArrayType -> { is GenericArrayType -> {
val declaredComponent = declaredType.genericComponentType val declaredComponent = declaredType.genericComponentType

View File

@ -1,5 +1,6 @@
package net.corda.nodeapi.internal.serialization.carpenter package net.corda.nodeapi.internal.serialization.carpenter
import net.corda.core.serialization.ClassWhitelist
import net.corda.core.serialization.CordaSerializable import net.corda.core.serialization.CordaSerializable
import org.objectweb.asm.ClassWriter import org.objectweb.asm.ClassWriter
import org.objectweb.asm.MethodVisitor import org.objectweb.asm.MethodVisitor
@ -79,7 +80,8 @@ private val jlClass get() = Type.getInternalName(Class::class.java)
* *
* Equals/hashCode methods are not yet supported. * Equals/hashCode methods are not yet supported.
*/ */
class ClassCarpenter(cl: ClassLoader = Thread.currentThread().contextClassLoader) { class ClassCarpenter(cl: ClassLoader = Thread.currentThread().contextClassLoader,
val whitelist: ClassWhitelist) {
// TODO: Generics. // TODO: Generics.
// TODO: Sandbox the generated code when a security manager is in use. // TODO: Sandbox the generated code when a security manager is in use.
// TODO: Generate equals/hashCode. // TODO: Generate equals/hashCode.

View File

@ -62,7 +62,7 @@ data class CarpenterMetaSchema(
* @property cc a reference to the actual class carpenter we're using to constuct classes * @property cc a reference to the actual class carpenter we're using to constuct classes
* @property objects a list of carpented classes loaded into the carpenters class loader * @property objects a list of carpented classes loaded into the carpenters class loader
*/ */
abstract class MetaCarpenterBase(val schemas: CarpenterMetaSchema, val cc: ClassCarpenter = ClassCarpenter()) { abstract class MetaCarpenterBase(val schemas: CarpenterMetaSchema, val cc: ClassCarpenter) {
val objects = mutableMapOf<String, Class<*>>() val objects = mutableMapOf<String, Class<*>>()
fun step(newObject: Schema) { fun step(newObject: Schema) {
@ -91,8 +91,7 @@ abstract class MetaCarpenterBase(val schemas: CarpenterMetaSchema, val cc: Class
get() = cc.classloader get() = cc.classloader
} }
class MetaCarpenter(schemas: CarpenterMetaSchema, class MetaCarpenter(schemas: CarpenterMetaSchema, cc: ClassCarpenter) : MetaCarpenterBase(schemas, cc) {
cc: ClassCarpenter = ClassCarpenter()) : MetaCarpenterBase(schemas, cc) {
override fun build() { override fun build() {
while (schemas.carpenterSchemas.isNotEmpty()) { while (schemas.carpenterSchemas.isNotEmpty()) {
val newObject = schemas.carpenterSchemas.removeAt(0) val newObject = schemas.carpenterSchemas.removeAt(0)
@ -101,8 +100,7 @@ class MetaCarpenter(schemas: CarpenterMetaSchema,
} }
} }
class TestMetaCarpenter(schemas: CarpenterMetaSchema, class TestMetaCarpenter(schemas: CarpenterMetaSchema, cc: ClassCarpenter) : MetaCarpenterBase(schemas, cc) {
cc: ClassCarpenter = ClassCarpenter()) : MetaCarpenterBase(schemas, cc) {
override fun build() { override fun build() {
if (schemas.carpenterSchemas.isEmpty()) return if (schemas.carpenterSchemas.isEmpty()) return
step(schemas.carpenterSchemas.removeAt(0)) step(schemas.carpenterSchemas.removeAt(0))

View File

@ -1,10 +1,11 @@
package net.corda.nodeapi.internal.serialization.amqp package net.corda.nodeapi.internal.serialization.amqp
import net.corda.nodeapi.internal.serialization.AllWhitelist
import org.junit.Test import org.junit.Test
import kotlin.test.* import kotlin.test.*
import net.corda.nodeapi.internal.serialization.carpenter.* import net.corda.nodeapi.internal.serialization.carpenter.*
class DeserializeNeedingCarpentryOfEnumsTest : AmqpCarpenterBase() { class DeserializeNeedingCarpentryOfEnumsTest : AmqpCarpenterBase(AllWhitelist) {
companion object { companion object {
/** /**
* If you want to see the schema encoded into the envelope after serialisation change this to true * If you want to see the schema encoded into the envelope after serialisation change this to true

View File

@ -1,5 +1,6 @@
package net.corda.nodeapi.internal.serialization.amqp package net.corda.nodeapi.internal.serialization.amqp
import net.corda.nodeapi.internal.serialization.AllWhitelist
import org.junit.Test import org.junit.Test
import kotlin.test.* import kotlin.test.*
import net.corda.nodeapi.internal.serialization.carpenter.* import net.corda.nodeapi.internal.serialization.carpenter.*
@ -8,7 +9,7 @@ import net.corda.nodeapi.internal.serialization.carpenter.*
// those classes don't exist within the system's Class Loader the deserialiser will be forced to carpent // those classes don't exist within the system's Class Loader the deserialiser will be forced to carpent
// versions of them up using its own internal class carpenter (each carpenter houses it's own loader). This // versions of them up using its own internal class carpenter (each carpenter houses it's own loader). This
// replicates the situation where a receiver doesn't have some or all elements of a schema present on it's classpath // replicates the situation where a receiver doesn't have some or all elements of a schema present on it's classpath
class DeserializeNeedingCarpentrySimpleTypesTest : AmqpCarpenterBase() { class DeserializeNeedingCarpentrySimpleTypesTest : AmqpCarpenterBase(AllWhitelist) {
companion object { companion object {
/** /**
* If you want to see the schema encoded into the envelope after serialisation change this to true * If you want to see the schema encoded into the envelope after serialisation change this to true
@ -16,12 +17,12 @@ class DeserializeNeedingCarpentrySimpleTypesTest : AmqpCarpenterBase() {
private const val VERBOSE = false private const val VERBOSE = false
} }
private val sf = testDefaultFactory() private val sf = testDefaultFactory()
private val sf2 = testDefaultFactory() private val sf2 = testDefaultFactory()
@Test @Test
fun singleInt() { fun singleInt() {
val clazz = ClassCarpenter().build(ClassSchema(testName(), mapOf( val clazz = ClassCarpenter(whitelist = AllWhitelist).build(ClassSchema(testName(), mapOf(
"int" to NonNullableField(Integer::class.javaPrimitiveType!!) "int" to NonNullableField(Integer::class.javaPrimitiveType!!)
))) )))
@ -31,9 +32,9 @@ class DeserializeNeedingCarpentrySimpleTypesTest : AmqpCarpenterBase() {
// despite being carpented, and thus not on the class path, we should've cached clazz // despite being carpented, and thus not on the class path, we should've cached clazz
// inside the serialiser object and thus we should have created the same type // inside the serialiser object and thus we should have created the same type
assertEquals (db::class.java, clazz) assertEquals(db::class.java, clazz)
assertNotEquals (db2::class.java, clazz) assertNotEquals(db2::class.java, clazz)
assertNotEquals (db::class.java, db2::class.java) assertNotEquals(db::class.java, db2::class.java)
assertEquals(1, db::class.java.getMethod("getInt").invoke(db)) assertEquals(1, db::class.java.getMethod("getInt").invoke(db))
assertEquals(1, db2::class.java.getMethod("getInt").invoke(db2)) assertEquals(1, db2::class.java.getMethod("getInt").invoke(db2))
@ -41,7 +42,7 @@ class DeserializeNeedingCarpentrySimpleTypesTest : AmqpCarpenterBase() {
@Test @Test
fun singleIntNullable() { fun singleIntNullable() {
val clazz = ClassCarpenter().build(ClassSchema(testName(), mapOf( val clazz = ClassCarpenter(whitelist = AllWhitelist).build(ClassSchema(testName(), mapOf(
"int" to NullableField(Integer::class.java) "int" to NullableField(Integer::class.java)
))) )))
@ -57,7 +58,7 @@ class DeserializeNeedingCarpentrySimpleTypesTest : AmqpCarpenterBase() {
@Test @Test
fun singleIntNullableNull() { fun singleIntNullableNull() {
val clazz = ClassCarpenter().build(ClassSchema(testName(), mapOf( val clazz = ClassCarpenter(whitelist = AllWhitelist).build(ClassSchema(testName(), mapOf(
"int" to NullableField(Integer::class.java) "int" to NullableField(Integer::class.java)
))) )))
@ -73,7 +74,7 @@ class DeserializeNeedingCarpentrySimpleTypesTest : AmqpCarpenterBase() {
@Test @Test
fun singleChar() { fun singleChar() {
val clazz = ClassCarpenter().build(ClassSchema(testName(), mapOf( val clazz = ClassCarpenter(whitelist = AllWhitelist).build(ClassSchema(testName(), mapOf(
"char" to NonNullableField(Character::class.javaPrimitiveType!!) "char" to NonNullableField(Character::class.javaPrimitiveType!!)
))) )))
@ -86,7 +87,7 @@ class DeserializeNeedingCarpentrySimpleTypesTest : AmqpCarpenterBase() {
@Test @Test
fun singleCharNullable() { fun singleCharNullable() {
val clazz = ClassCarpenter().build(ClassSchema(testName(), mapOf( val clazz = ClassCarpenter(whitelist = AllWhitelist).build(ClassSchema(testName(), mapOf(
"char" to NullableField(Character::class.javaObjectType) "char" to NullableField(Character::class.javaObjectType)
))) )))
@ -99,7 +100,7 @@ class DeserializeNeedingCarpentrySimpleTypesTest : AmqpCarpenterBase() {
@Test @Test
fun singleCharNullableNull() { fun singleCharNullableNull() {
val clazz = ClassCarpenter().build(ClassSchema(testName(), mapOf( val clazz = ClassCarpenter(whitelist = AllWhitelist).build(ClassSchema(testName(), mapOf(
"char" to NullableField(java.lang.Character::class.java) "char" to NullableField(java.lang.Character::class.java)
))) )))
@ -112,11 +113,11 @@ class DeserializeNeedingCarpentrySimpleTypesTest : AmqpCarpenterBase() {
@Test @Test
fun singleLong() { fun singleLong() {
val clazz = ClassCarpenter().build(ClassSchema(testName(), mapOf( val clazz = ClassCarpenter(whitelist = AllWhitelist).build(ClassSchema(testName(), mapOf(
"long" to NonNullableField(Long::class.javaPrimitiveType!!) "long" to NonNullableField(Long::class.javaPrimitiveType!!)
))) )))
val l : Long = 1 val l: Long = 1
val sb = TestSerializationOutput(VERBOSE, sf).serialize(clazz.constructors.first().newInstance(l)) val sb = TestSerializationOutput(VERBOSE, sf).serialize(clazz.constructors.first().newInstance(l))
val db = DeserializationInput(sf2).deserialize(sb) val db = DeserializationInput(sf2).deserialize(sb)
@ -126,11 +127,11 @@ class DeserializeNeedingCarpentrySimpleTypesTest : AmqpCarpenterBase() {
@Test @Test
fun singleLongNullable() { fun singleLongNullable() {
val clazz = ClassCarpenter().build(ClassSchema(testName(), mapOf( val clazz = ClassCarpenter(whitelist = AllWhitelist).build(ClassSchema(testName(), mapOf(
"long" to NullableField(Long::class.javaObjectType) "long" to NullableField(Long::class.javaObjectType)
))) )))
val l : Long = 1 val l: Long = 1
val sb = TestSerializationOutput(VERBOSE, sf).serialize(clazz.constructors.first().newInstance(l)) val sb = TestSerializationOutput(VERBOSE, sf).serialize(clazz.constructors.first().newInstance(l))
val db = DeserializationInput(sf2).deserialize(sb) val db = DeserializationInput(sf2).deserialize(sb)
@ -140,7 +141,7 @@ class DeserializeNeedingCarpentrySimpleTypesTest : AmqpCarpenterBase() {
@Test @Test
fun singleLongNullableNull() { fun singleLongNullableNull() {
val clazz = ClassCarpenter().build(ClassSchema(testName(), mapOf( val clazz = ClassCarpenter(whitelist = AllWhitelist).build(ClassSchema(testName(), mapOf(
"long" to NullableField(Long::class.javaObjectType) "long" to NullableField(Long::class.javaObjectType)
))) )))
@ -153,7 +154,7 @@ class DeserializeNeedingCarpentrySimpleTypesTest : AmqpCarpenterBase() {
@Test @Test
fun singleBoolean() { fun singleBoolean() {
val clazz = ClassCarpenter().build(ClassSchema(testName(), mapOf( val clazz = ClassCarpenter(whitelist = AllWhitelist).build(ClassSchema(testName(), mapOf(
"boolean" to NonNullableField(Boolean::class.javaPrimitiveType!!) "boolean" to NonNullableField(Boolean::class.javaPrimitiveType!!)
))) )))
@ -166,7 +167,7 @@ class DeserializeNeedingCarpentrySimpleTypesTest : AmqpCarpenterBase() {
@Test @Test
fun singleBooleanNullable() { fun singleBooleanNullable() {
val clazz = ClassCarpenter().build(ClassSchema(testName(), mapOf( val clazz = ClassCarpenter(whitelist = AllWhitelist).build(ClassSchema(testName(), mapOf(
"boolean" to NullableField(Boolean::class.javaObjectType) "boolean" to NullableField(Boolean::class.javaObjectType)
))) )))
@ -179,7 +180,7 @@ class DeserializeNeedingCarpentrySimpleTypesTest : AmqpCarpenterBase() {
@Test @Test
fun singleBooleanNullableNull() { fun singleBooleanNullableNull() {
val clazz = ClassCarpenter().build(ClassSchema(testName(), mapOf( val clazz = ClassCarpenter(whitelist = AllWhitelist).build(ClassSchema(testName(), mapOf(
"boolean" to NullableField(Boolean::class.javaObjectType) "boolean" to NullableField(Boolean::class.javaObjectType)
))) )))
@ -192,7 +193,7 @@ class DeserializeNeedingCarpentrySimpleTypesTest : AmqpCarpenterBase() {
@Test @Test
fun singleDouble() { fun singleDouble() {
val clazz = ClassCarpenter().build(ClassSchema(testName(), mapOf( val clazz = ClassCarpenter(whitelist = AllWhitelist).build(ClassSchema(testName(), mapOf(
"double" to NonNullableField(Double::class.javaPrimitiveType!!) "double" to NonNullableField(Double::class.javaPrimitiveType!!)
))) )))
@ -205,7 +206,7 @@ class DeserializeNeedingCarpentrySimpleTypesTest : AmqpCarpenterBase() {
@Test @Test
fun singleDoubleNullable() { fun singleDoubleNullable() {
val clazz = ClassCarpenter().build(ClassSchema(testName(), mapOf( val clazz = ClassCarpenter(whitelist = AllWhitelist).build(ClassSchema(testName(), mapOf(
"double" to NullableField(Double::class.javaObjectType) "double" to NullableField(Double::class.javaObjectType)
))) )))
@ -218,7 +219,7 @@ class DeserializeNeedingCarpentrySimpleTypesTest : AmqpCarpenterBase() {
@Test @Test
fun singleDoubleNullableNull() { fun singleDoubleNullableNull() {
val clazz = ClassCarpenter().build(ClassSchema(testName(), mapOf( val clazz = ClassCarpenter(whitelist = AllWhitelist).build(ClassSchema(testName(), mapOf(
"double" to NullableField(Double::class.javaObjectType) "double" to NullableField(Double::class.javaObjectType)
))) )))
@ -231,7 +232,7 @@ class DeserializeNeedingCarpentrySimpleTypesTest : AmqpCarpenterBase() {
@Test @Test
fun singleShort() { fun singleShort() {
val clazz = ClassCarpenter().build(ClassSchema(testName(), mapOf( val clazz = ClassCarpenter(whitelist = AllWhitelist).build(ClassSchema(testName(), mapOf(
"short" to NonNullableField(Short::class.javaPrimitiveType!!) "short" to NonNullableField(Short::class.javaPrimitiveType!!)
))) )))
@ -244,7 +245,7 @@ class DeserializeNeedingCarpentrySimpleTypesTest : AmqpCarpenterBase() {
@Test @Test
fun singleShortNullable() { fun singleShortNullable() {
val clazz = ClassCarpenter().build(ClassSchema(testName(), mapOf( val clazz = ClassCarpenter(whitelist = AllWhitelist).build(ClassSchema(testName(), mapOf(
"short" to NullableField(Short::class.javaObjectType) "short" to NullableField(Short::class.javaObjectType)
))) )))
@ -257,7 +258,7 @@ class DeserializeNeedingCarpentrySimpleTypesTest : AmqpCarpenterBase() {
@Test @Test
fun singleShortNullableNull() { fun singleShortNullableNull() {
val clazz = ClassCarpenter().build(ClassSchema(testName(), mapOf( val clazz = ClassCarpenter(whitelist = AllWhitelist).build(ClassSchema(testName(), mapOf(
"short" to NullableField(Short::class.javaObjectType) "short" to NullableField(Short::class.javaObjectType)
))) )))
@ -270,7 +271,7 @@ class DeserializeNeedingCarpentrySimpleTypesTest : AmqpCarpenterBase() {
@Test @Test
fun singleFloat() { fun singleFloat() {
val clazz = ClassCarpenter().build(ClassSchema(testName(), mapOf( val clazz = ClassCarpenter(whitelist = AllWhitelist).build(ClassSchema(testName(), mapOf(
"float" to NonNullableField(Float::class.javaPrimitiveType!!) "float" to NonNullableField(Float::class.javaPrimitiveType!!)
))) )))
@ -283,7 +284,7 @@ class DeserializeNeedingCarpentrySimpleTypesTest : AmqpCarpenterBase() {
@Test @Test
fun singleFloatNullable() { fun singleFloatNullable() {
val clazz = ClassCarpenter().build(ClassSchema(testName(), mapOf( val clazz = ClassCarpenter(whitelist = AllWhitelist).build(ClassSchema(testName(), mapOf(
"float" to NullableField(Float::class.javaObjectType) "float" to NullableField(Float::class.javaObjectType)
))) )))
@ -296,7 +297,7 @@ class DeserializeNeedingCarpentrySimpleTypesTest : AmqpCarpenterBase() {
@Test @Test
fun singleFloatNullableNull() { fun singleFloatNullableNull() {
val clazz = ClassCarpenter().build(ClassSchema(testName(), mapOf( val clazz = ClassCarpenter(whitelist = AllWhitelist).build(ClassSchema(testName(), mapOf(
"float" to NullableField(Float::class.javaObjectType) "float" to NullableField(Float::class.javaObjectType)
))) )))
@ -309,11 +310,11 @@ class DeserializeNeedingCarpentrySimpleTypesTest : AmqpCarpenterBase() {
@Test @Test
fun singleByte() { fun singleByte() {
val clazz = ClassCarpenter().build(ClassSchema(testName(), mapOf( val clazz = ClassCarpenter(whitelist = AllWhitelist).build(ClassSchema(testName(), mapOf(
"byte" to NonNullableField(Byte::class.javaPrimitiveType!!) "byte" to NonNullableField(Byte::class.javaPrimitiveType!!)
))) )))
val b : Byte = 0b0101 val b: Byte = 0b0101
val sb = TestSerializationOutput(VERBOSE, sf).serialize(clazz.constructors.first().newInstance(b)) val sb = TestSerializationOutput(VERBOSE, sf).serialize(clazz.constructors.first().newInstance(b))
val db = DeserializationInput(sf2).deserialize(sb) val db = DeserializationInput(sf2).deserialize(sb)
@ -324,11 +325,11 @@ class DeserializeNeedingCarpentrySimpleTypesTest : AmqpCarpenterBase() {
@Test @Test
fun singleByteNullable() { fun singleByteNullable() {
val clazz = ClassCarpenter().build(ClassSchema(testName(), mapOf( val clazz = ClassCarpenter(whitelist = AllWhitelist).build(ClassSchema(testName(), mapOf(
"byte" to NullableField(Byte::class.javaObjectType) "byte" to NullableField(Byte::class.javaObjectType)
))) )))
val b : Byte = 0b0101 val b: Byte = 0b0101
val sb = TestSerializationOutput(VERBOSE, sf).serialize(clazz.constructors.first().newInstance(b)) val sb = TestSerializationOutput(VERBOSE, sf).serialize(clazz.constructors.first().newInstance(b))
val db = DeserializationInput(sf2).deserialize(sb) val db = DeserializationInput(sf2).deserialize(sb)
@ -339,7 +340,7 @@ class DeserializeNeedingCarpentrySimpleTypesTest : AmqpCarpenterBase() {
@Test @Test
fun singleByteNullableNull() { fun singleByteNullableNull() {
val clazz = ClassCarpenter().build(ClassSchema(testName(), mapOf( val clazz = ClassCarpenter(whitelist = AllWhitelist).build(ClassSchema(testName(), mapOf(
"byte" to NullableField(Byte::class.javaObjectType) "byte" to NullableField(Byte::class.javaObjectType)
))) )))
@ -352,9 +353,9 @@ class DeserializeNeedingCarpentrySimpleTypesTest : AmqpCarpenterBase() {
@Test @Test
fun simpleTypeKnownInterface() { fun simpleTypeKnownInterface() {
val clazz = ClassCarpenter().build (ClassSchema( val clazz = ClassCarpenter(whitelist = AllWhitelist).build(ClassSchema(
testName(), mapOf("name" to NonNullableField(String::class.java)), testName(), mapOf("name" to NonNullableField(String::class.java)),
interfaces = listOf (I::class.java))) interfaces = listOf(I::class.java)))
val testVal = "Some Person" val testVal = "Some Person"
val classInstance = clazz.constructors[0].newInstance(testVal) val classInstance = clazz.constructors[0].newInstance(testVal)
val serialisedBytes = TestSerializationOutput(VERBOSE, sf).serialize(classInstance) val serialisedBytes = TestSerializationOutput(VERBOSE, sf).serialize(classInstance)
@ -367,34 +368,34 @@ class DeserializeNeedingCarpentrySimpleTypesTest : AmqpCarpenterBase() {
@Test @Test
fun manyTypes() { fun manyTypes() {
val manyClass = ClassCarpenter().build (ClassSchema(testName(), mapOf( val manyClass = ClassCarpenter(whitelist = AllWhitelist).build(ClassSchema(testName(), mapOf(
"intA" to NonNullableField (Int::class.java), "intA" to NonNullableField(Int::class.java),
"intB" to NullableField (Integer::class.java), "intB" to NullableField(Integer::class.java),
"intC" to NullableField (Integer::class.java), "intC" to NullableField(Integer::class.java),
"strA" to NonNullableField (String::class.java), "strA" to NonNullableField(String::class.java),
"strB" to NullableField (String::class.java), "strB" to NullableField(String::class.java),
"strC" to NullableField (String::class.java), "strC" to NullableField(String::class.java),
"charA" to NonNullableField (Char::class.java), "charA" to NonNullableField(Char::class.java),
"charB" to NullableField (Character::class.javaObjectType), "charB" to NullableField(Character::class.javaObjectType),
"charC" to NullableField (Character::class.javaObjectType), "charC" to NullableField(Character::class.javaObjectType),
"shortA" to NonNullableField (Short::class.javaPrimitiveType!!), "shortA" to NonNullableField(Short::class.javaPrimitiveType!!),
"shortB" to NullableField (Short::class.javaObjectType), "shortB" to NullableField(Short::class.javaObjectType),
"shortC" to NullableField (Short::class.javaObjectType), "shortC" to NullableField(Short::class.javaObjectType),
"longA" to NonNullableField (Long::class.javaPrimitiveType!!), "longA" to NonNullableField(Long::class.javaPrimitiveType!!),
"longB" to NullableField(Long::class.javaObjectType), "longB" to NullableField(Long::class.javaObjectType),
"longC" to NullableField(Long::class.javaObjectType), "longC" to NullableField(Long::class.javaObjectType),
"booleanA" to NonNullableField (Boolean::class.javaPrimitiveType!!), "booleanA" to NonNullableField(Boolean::class.javaPrimitiveType!!),
"booleanB" to NullableField (Boolean::class.javaObjectType), "booleanB" to NullableField(Boolean::class.javaObjectType),
"booleanC" to NullableField (Boolean::class.javaObjectType), "booleanC" to NullableField(Boolean::class.javaObjectType),
"doubleA" to NonNullableField (Double::class.javaPrimitiveType!!), "doubleA" to NonNullableField(Double::class.javaPrimitiveType!!),
"doubleB" to NullableField (Double::class.javaObjectType), "doubleB" to NullableField(Double::class.javaObjectType),
"doubleC" to NullableField (Double::class.javaObjectType), "doubleC" to NullableField(Double::class.javaObjectType),
"floatA" to NonNullableField (Float::class.javaPrimitiveType!!), "floatA" to NonNullableField(Float::class.javaPrimitiveType!!),
"floatB" to NullableField (Float::class.javaObjectType), "floatB" to NullableField(Float::class.javaObjectType),
"floatC" to NullableField (Float::class.javaObjectType), "floatC" to NullableField(Float::class.javaObjectType),
"byteA" to NonNullableField (Byte::class.javaPrimitiveType!!), "byteA" to NonNullableField(Byte::class.javaPrimitiveType!!),
"byteB" to NullableField (Byte::class.javaObjectType), "byteB" to NullableField(Byte::class.javaObjectType),
"byteC" to NullableField (Byte::class.javaObjectType)))) "byteC" to NullableField(Byte::class.javaObjectType))))
val serialisedBytes = TestSerializationOutput(VERBOSE, factory).serialize( val serialisedBytes = TestSerializationOutput(VERBOSE, factory).serialize(
manyClass.constructors.first().newInstance( manyClass.constructors.first().newInstance(
@ -411,33 +412,33 @@ class DeserializeNeedingCarpentrySimpleTypesTest : AmqpCarpenterBase() {
val deserializedObj = DeserializationInput(sf2).deserialize(serialisedBytes) val deserializedObj = DeserializationInput(sf2).deserialize(serialisedBytes)
assertNotEquals(manyClass, deserializedObj::class.java) assertNotEquals(manyClass, deserializedObj::class.java)
assertEquals(1, deserializedObj::class.java.getMethod("getIntA").invoke(deserializedObj)) assertEquals(1, deserializedObj::class.java.getMethod("getIntA").invoke(deserializedObj))
assertEquals(2, deserializedObj::class.java.getMethod("getIntB").invoke(deserializedObj)) assertEquals(2, deserializedObj::class.java.getMethod("getIntB").invoke(deserializedObj))
assertEquals(null, deserializedObj::class.java.getMethod("getIntC").invoke(deserializedObj)) assertEquals(null, deserializedObj::class.java.getMethod("getIntC").invoke(deserializedObj))
assertEquals("a", deserializedObj::class.java.getMethod("getStrA").invoke(deserializedObj)) assertEquals("a", deserializedObj::class.java.getMethod("getStrA").invoke(deserializedObj))
assertEquals("b", deserializedObj::class.java.getMethod("getStrB").invoke(deserializedObj)) assertEquals("b", deserializedObj::class.java.getMethod("getStrB").invoke(deserializedObj))
assertEquals(null, deserializedObj::class.java.getMethod("getStrC").invoke(deserializedObj)) assertEquals(null, deserializedObj::class.java.getMethod("getStrC").invoke(deserializedObj))
assertEquals('c', deserializedObj::class.java.getMethod("getCharA").invoke(deserializedObj)) assertEquals('c', deserializedObj::class.java.getMethod("getCharA").invoke(deserializedObj))
assertEquals('d', deserializedObj::class.java.getMethod("getCharB").invoke(deserializedObj)) assertEquals('d', deserializedObj::class.java.getMethod("getCharB").invoke(deserializedObj))
assertEquals(null, deserializedObj::class.java.getMethod("getCharC").invoke(deserializedObj)) assertEquals(null, deserializedObj::class.java.getMethod("getCharC").invoke(deserializedObj))
assertEquals(3.toShort(), deserializedObj::class.java.getMethod("getShortA").invoke(deserializedObj)) assertEquals(3.toShort(), deserializedObj::class.java.getMethod("getShortA").invoke(deserializedObj))
assertEquals(4.toShort(), deserializedObj::class.java.getMethod("getShortB").invoke(deserializedObj)) assertEquals(4.toShort(), deserializedObj::class.java.getMethod("getShortB").invoke(deserializedObj))
assertEquals(null, deserializedObj::class.java.getMethod("getShortC").invoke(deserializedObj)) assertEquals(null, deserializedObj::class.java.getMethod("getShortC").invoke(deserializedObj))
assertEquals(100.toLong(), deserializedObj::class.java.getMethod("getLongA").invoke(deserializedObj)) assertEquals(100.toLong(), deserializedObj::class.java.getMethod("getLongA").invoke(deserializedObj))
assertEquals(200.toLong(), deserializedObj::class.java.getMethod("getLongB").invoke(deserializedObj)) assertEquals(200.toLong(), deserializedObj::class.java.getMethod("getLongB").invoke(deserializedObj))
assertEquals(null, deserializedObj::class.java.getMethod("getLongC").invoke(deserializedObj)) assertEquals(null, deserializedObj::class.java.getMethod("getLongC").invoke(deserializedObj))
assertEquals(true, deserializedObj::class.java.getMethod("getBooleanA").invoke(deserializedObj)) assertEquals(true, deserializedObj::class.java.getMethod("getBooleanA").invoke(deserializedObj))
assertEquals(false, deserializedObj::class.java.getMethod("getBooleanB").invoke(deserializedObj)) assertEquals(false, deserializedObj::class.java.getMethod("getBooleanB").invoke(deserializedObj))
assertEquals(null, deserializedObj::class.java.getMethod("getBooleanC").invoke(deserializedObj)) assertEquals(null, deserializedObj::class.java.getMethod("getBooleanC").invoke(deserializedObj))
assertEquals(10.0, deserializedObj::class.java.getMethod("getDoubleA").invoke(deserializedObj)) assertEquals(10.0, deserializedObj::class.java.getMethod("getDoubleA").invoke(deserializedObj))
assertEquals(20.0, deserializedObj::class.java.getMethod("getDoubleB").invoke(deserializedObj)) assertEquals(20.0, deserializedObj::class.java.getMethod("getDoubleB").invoke(deserializedObj))
assertEquals(null, deserializedObj::class.java.getMethod("getDoubleC").invoke(deserializedObj)) assertEquals(null, deserializedObj::class.java.getMethod("getDoubleC").invoke(deserializedObj))
assertEquals(10.0F, deserializedObj::class.java.getMethod("getFloatA").invoke(deserializedObj)) assertEquals(10.0F, deserializedObj::class.java.getMethod("getFloatA").invoke(deserializedObj))
assertEquals(20.0F, deserializedObj::class.java.getMethod("getFloatB").invoke(deserializedObj)) assertEquals(20.0F, deserializedObj::class.java.getMethod("getFloatB").invoke(deserializedObj))
assertEquals(null, deserializedObj::class.java.getMethod("getFloatC").invoke(deserializedObj)) assertEquals(null, deserializedObj::class.java.getMethod("getFloatC").invoke(deserializedObj))
assertEquals(0b0101.toByte(), deserializedObj::class.java.getMethod("getByteA").invoke(deserializedObj)) assertEquals(0b0101.toByte(), deserializedObj::class.java.getMethod("getByteA").invoke(deserializedObj))
assertEquals(0b1010.toByte(), deserializedObj::class.java.getMethod("getByteB").invoke(deserializedObj)) assertEquals(0b1010.toByte(), deserializedObj::class.java.getMethod("getByteB").invoke(deserializedObj))
assertEquals(null, deserializedObj::class.java.getMethod("getByteC").invoke(deserializedObj)) assertEquals(null, deserializedObj::class.java.getMethod("getByteC").invoke(deserializedObj))
} }
} }

View File

@ -8,7 +8,7 @@ import net.corda.nodeapi.internal.serialization.AllWhitelist
@CordaSerializable @CordaSerializable
interface I { interface I {
fun getName() : String fun getName(): String
} }
// These tests work by having the class carpenter build the classes we serialise and then deserialise them // These tests work by having the class carpenter build the classes we serialise and then deserialise them
@ -19,7 +19,7 @@ interface I {
// However, those classes don't exist within the system's Class Loader and thus the deserialiser will be forced // However, those classes don't exist within the system's Class Loader and thus the deserialiser will be forced
// to carpent versions of them up using its own internal class carpenter (each carpenter houses it's own loader). This // to carpent versions of them up using its own internal class carpenter (each carpenter houses it's own loader). This
// replicates the situation where a receiver doesn't have some or all elements of a schema present on it's classpath // replicates the situation where a receiver doesn't have some or all elements of a schema present on it's classpath
class DeserializeNeedingCarpentryTests : AmqpCarpenterBase() { class DeserializeNeedingCarpentryTests : AmqpCarpenterBase(AllWhitelist) {
companion object { companion object {
/** /**
* If you want to see the schema encoded into the envelope after serialisation change this to true * If you want to see the schema encoded into the envelope after serialisation change this to true
@ -27,38 +27,40 @@ class DeserializeNeedingCarpentryTests : AmqpCarpenterBase() {
private const val VERBOSE = false private const val VERBOSE = false
} }
val sf1 = testDefaultFactory() private val sf1 = testDefaultFactory()
val sf2 = testDefaultFactoryWithWhitelist() // Deserialize with whitelisting on to check that `CordaSerializable` annotation present.
// Deserialize with whitelisting on to check that `CordaSerializable` annotation present.
private val sf2 = testDefaultFactoryWithWhitelist()
@Test @Test
fun verySimpleType() { fun verySimpleType() {
val testVal = 10 val testVal = 10
val clazz = ClassCarpenter().build(ClassSchema(testName(), mapOf("a" to NonNullableField(Int::class.java)))) val clazz = ClassCarpenter(whitelist = AllWhitelist).build(ClassSchema(testName(),
mapOf("a" to NonNullableField(Int::class.java))))
val classInstance = clazz.constructors[0].newInstance(testVal) val classInstance = clazz.constructors[0].newInstance(testVal)
val serialisedBytes = TestSerializationOutput(VERBOSE, sf1).serialize(classInstance) val serialisedBytes = TestSerializationOutput(VERBOSE, sf1).serialize(classInstance)
val deserializedObj1 = DeserializationInput(sf1).deserialize(serialisedBytes) val deserializedObj1 = DeserializationInput(sf1).deserialize(serialisedBytes)
assertEquals(clazz, deserializedObj1::class.java) assertEquals(clazz, deserializedObj1::class.java)
assertEquals (testVal, deserializedObj1::class.java.getMethod("getA").invoke(deserializedObj1)) assertEquals(testVal, deserializedObj1::class.java.getMethod("getA").invoke(deserializedObj1))
val deserializedObj2 = DeserializationInput(sf1).deserialize(serialisedBytes) val deserializedObj2 = DeserializationInput(sf1).deserialize(serialisedBytes)
assertEquals(clazz, deserializedObj2::class.java) assertEquals(clazz, deserializedObj2::class.java)
assertEquals(deserializedObj1::class.java, deserializedObj2::class.java) assertEquals(deserializedObj1::class.java, deserializedObj2::class.java)
assertEquals (testVal, deserializedObj2::class.java.getMethod("getA").invoke(deserializedObj2)) assertEquals(testVal, deserializedObj2::class.java.getMethod("getA").invoke(deserializedObj2))
val deserializedObj3 = DeserializationInput(sf2).deserialize(serialisedBytes) val deserializedObj3 = DeserializationInput(sf2).deserialize(serialisedBytes)
assertNotEquals(clazz, deserializedObj3::class.java) assertNotEquals(clazz, deserializedObj3::class.java)
assertNotEquals(deserializedObj1::class.java, deserializedObj3::class.java) assertNotEquals(deserializedObj1::class.java, deserializedObj3::class.java)
assertNotEquals(deserializedObj2::class.java, deserializedObj3::class.java) assertNotEquals(deserializedObj2::class.java, deserializedObj3::class.java)
assertEquals (testVal, deserializedObj3::class.java.getMethod("getA").invoke(deserializedObj3)) assertEquals(testVal, deserializedObj3::class.java.getMethod("getA").invoke(deserializedObj3))
val deserializedObj4 = DeserializationInput(sf2).deserialize(serialisedBytes) val deserializedObj4 = DeserializationInput(sf2).deserialize(serialisedBytes)
assertNotEquals(clazz, deserializedObj4::class.java) assertNotEquals(clazz, deserializedObj4::class.java)
assertNotEquals(deserializedObj1::class.java, deserializedObj4::class.java) assertNotEquals(deserializedObj1::class.java, deserializedObj4::class.java)
assertNotEquals(deserializedObj2::class.java, deserializedObj4::class.java) assertNotEquals(deserializedObj2::class.java, deserializedObj4::class.java)
assertEquals(deserializedObj3::class.java, deserializedObj4::class.java) assertEquals(deserializedObj3::class.java, deserializedObj4::class.java)
assertEquals (testVal, deserializedObj4::class.java.getMethod("getA").invoke(deserializedObj4)) assertEquals(testVal, deserializedObj4::class.java.getMethod("getA").invoke(deserializedObj4))
} }
@ -67,7 +69,7 @@ class DeserializeNeedingCarpentryTests : AmqpCarpenterBase() {
val testValA = 10 val testValA = 10
val testValB = 20 val testValB = 20
val testValC = 20 val testValC = 20
val clazz = ClassCarpenter().build(ClassSchema("${testName()}_clazz", val clazz = ClassCarpenter(whitelist = AllWhitelist).build(ClassSchema("${testName()}_clazz",
mapOf("a" to NonNullableField(Int::class.java)))) mapOf("a" to NonNullableField(Int::class.java))))
val concreteA = clazz.constructors[0].newInstance(testValA) val concreteA = clazz.constructors[0].newInstance(testValA)
@ -77,13 +79,13 @@ class DeserializeNeedingCarpentryTests : AmqpCarpenterBase() {
val deserialisedA = DeserializationInput(sf2).deserialize( val deserialisedA = DeserializationInput(sf2).deserialize(
TestSerializationOutput(VERBOSE, sf1).serialize(concreteA)) TestSerializationOutput(VERBOSE, sf1).serialize(concreteA))
assertEquals (testValA, deserialisedA::class.java.getMethod("getA").invoke(deserialisedA)) assertEquals(testValA, deserialisedA::class.java.getMethod("getA").invoke(deserialisedA))
val deserialisedB = DeserializationInput(sf2).deserialize( val deserialisedB = DeserializationInput(sf2).deserialize(
TestSerializationOutput(VERBOSE, sf1).serialize(concreteB)) TestSerializationOutput(VERBOSE, sf1).serialize(concreteB))
assertEquals (testValB, deserialisedA::class.java.getMethod("getA").invoke(deserialisedB)) assertEquals(testValB, deserialisedA::class.java.getMethod("getA").invoke(deserialisedB))
assertEquals (deserialisedA::class.java, deserialisedB::class.java) assertEquals(deserialisedA::class.java, deserialisedB::class.java)
// C is deseriliased with a different factory, meaning a different class carpenter, so the type // C is deseriliased with a different factory, meaning a different class carpenter, so the type
// won't already exist and it will be carpented a second time showing that when A and B are the // won't already exist and it will be carpented a second time showing that when A and B are the
@ -93,16 +95,16 @@ class DeserializeNeedingCarpentryTests : AmqpCarpenterBase() {
val deserialisedC = DeserializationInput(lfactory).deserialize( val deserialisedC = DeserializationInput(lfactory).deserialize(
TestSerializationOutput(VERBOSE, lfactory).serialize(concreteC)) TestSerializationOutput(VERBOSE, lfactory).serialize(concreteC))
assertEquals (testValC, deserialisedC::class.java.getMethod("getA").invoke(deserialisedC)) assertEquals(testValC, deserialisedC::class.java.getMethod("getA").invoke(deserialisedC))
assertNotEquals (deserialisedA::class.java, deserialisedC::class.java) assertNotEquals(deserialisedA::class.java, deserialisedC::class.java)
assertNotEquals (deserialisedB::class.java, deserialisedC::class.java) assertNotEquals(deserialisedB::class.java, deserialisedC::class.java)
} }
@Test @Test
fun simpleTypeKnownInterface() { fun simpleTypeKnownInterface() {
val clazz = ClassCarpenter().build (ClassSchema( val clazz = ClassCarpenter(whitelist = AllWhitelist).build(ClassSchema(
testName(), mapOf("name" to NonNullableField(String::class.java)), testName(), mapOf("name" to NonNullableField(String::class.java)),
interfaces = listOf (I::class.java))) interfaces = listOf(I::class.java)))
val testVal = "Some Person" val testVal = "Some Person"
val classInstance = clazz.constructors[0].newInstance(testVal) val classInstance = clazz.constructors[0].newInstance(testVal)
@ -115,12 +117,13 @@ class DeserializeNeedingCarpentryTests : AmqpCarpenterBase() {
@Test @Test
fun arrayOfTypes() { fun arrayOfTypes() {
val clazz = ClassCarpenter().build(ClassSchema(testName(), mapOf("a" to NonNullableField(Int::class.java)))) val clazz = ClassCarpenter(whitelist = AllWhitelist).build(ClassSchema(testName(),
mapOf("a" to NonNullableField(Int::class.java))))
@CordaSerializable @CordaSerializable
data class Outer (val a : Array<Any>) data class Outer(val a: Array<Any>)
val outer = Outer (arrayOf ( val outer = Outer(arrayOf(
clazz.constructors[0].newInstance(1), clazz.constructors[0].newInstance(1),
clazz.constructors[0].newInstance(2), clazz.constructors[0].newInstance(2),
clazz.constructors[0].newInstance(3))) clazz.constructors[0].newInstance(3)))
@ -148,7 +151,7 @@ class DeserializeNeedingCarpentryTests : AmqpCarpenterBase() {
@Test @Test
fun reusedClasses() { fun reusedClasses() {
val cc = ClassCarpenter() val cc = ClassCarpenter(whitelist = AllWhitelist)
val innerType = cc.build(ClassSchema("${testName()}.inner", mapOf("a" to NonNullableField(Int::class.java)))) val innerType = cc.build(ClassSchema("${testName()}.inner", mapOf("a" to NonNullableField(Int::class.java))))
val outerType = cc.build(ClassSchema("${testName()}.outer", mapOf("a" to NonNullableField(innerType)))) val outerType = cc.build(ClassSchema("${testName()}.outer", mapOf("a" to NonNullableField(innerType))))
@ -157,21 +160,21 @@ class DeserializeNeedingCarpentryTests : AmqpCarpenterBase() {
val serializedI = TestSerializationOutput(VERBOSE, sf1).serialize(inner) val serializedI = TestSerializationOutput(VERBOSE, sf1).serialize(inner)
val deserialisedI = DeserializationInput(sf2).deserialize(serializedI) val deserialisedI = DeserializationInput(sf2).deserialize(serializedI)
val serialisedO = TestSerializationOutput(VERBOSE, sf1).serialize(outer) val serialisedO = TestSerializationOutput(VERBOSE, sf1).serialize(outer)
val deserialisedO = DeserializationInput(sf2).deserialize(serialisedO) val deserialisedO = DeserializationInput(sf2).deserialize(serialisedO)
// ensure out carpented version of inner is reused // ensure out carpented version of inner is reused
assertEquals (deserialisedI::class.java, assertEquals(deserialisedI::class.java,
(deserialisedO::class.java.getMethod("getA").invoke(deserialisedO))::class.java) (deserialisedO::class.java.getMethod("getA").invoke(deserialisedO))::class.java)
} }
@Test @Test
fun nestedTypes() { fun nestedTypes() {
val cc = ClassCarpenter() val cc = ClassCarpenter(whitelist = AllWhitelist)
val nestedClass = cc.build (ClassSchema("nestedType", val nestedClass = cc.build(ClassSchema("nestedType",
mapOf("name" to NonNullableField(String::class.java)))) mapOf("name" to NonNullableField(String::class.java))))
val outerClass = cc.build (ClassSchema("outerType", val outerClass = cc.build(ClassSchema("outerType",
mapOf("inner" to NonNullableField(nestedClass)))) mapOf("inner" to NonNullableField(nestedClass))))
val classInstance = outerClass.constructors.first().newInstance(nestedClass.constructors.first().newInstance("name")) val classInstance = outerClass.constructors.first().newInstance(nestedClass.constructors.first().newInstance("name"))
@ -184,33 +187,34 @@ class DeserializeNeedingCarpentryTests : AmqpCarpenterBase() {
@Test @Test
fun repeatedNestedTypes() { fun repeatedNestedTypes() {
val cc = ClassCarpenter() val cc = ClassCarpenter(whitelist = AllWhitelist)
val nestedClass = cc.build (ClassSchema("nestedType", val nestedClass = cc.build(ClassSchema("nestedType",
mapOf("name" to NonNullableField(String::class.java)))) mapOf("name" to NonNullableField(String::class.java))))
@CordaSerializable @CordaSerializable
data class outer(val a: Any, val b: Any) data class outer(val a: Any, val b: Any)
val classInstance = outer ( val classInstance = outer(
nestedClass.constructors.first().newInstance("foo"), nestedClass.constructors.first().newInstance("foo"),
nestedClass.constructors.first().newInstance("bar")) nestedClass.constructors.first().newInstance("bar"))
val serialisedBytes = TestSerializationOutput(VERBOSE, sf1).serialize(classInstance) val serialisedBytes = TestSerializationOutput(VERBOSE, sf1).serialize(classInstance)
val deserializedObj = DeserializationInput(sf2).deserialize(serialisedBytes) val deserializedObj = DeserializationInput(sf2).deserialize(serialisedBytes)
assertEquals ("foo", deserializedObj.a::class.java.getMethod("getName").invoke(deserializedObj.a)) assertEquals("foo", deserializedObj.a::class.java.getMethod("getName").invoke(deserializedObj.a))
assertEquals ("bar", deserializedObj.b::class.java.getMethod("getName").invoke(deserializedObj.b)) assertEquals("bar", deserializedObj.b::class.java.getMethod("getName").invoke(deserializedObj.b))
} }
@Test @Test
fun listOfType() { fun listOfType() {
val unknownClass = ClassCarpenter().build (ClassSchema(testName(), mapOf( val unknownClass = ClassCarpenter(whitelist = AllWhitelist).build(ClassSchema(testName(), mapOf(
"v1" to NonNullableField(Int::class.java), "v1" to NonNullableField(Int::class.java),
"v2" to NonNullableField(Int::class.java)))) "v2" to NonNullableField(Int::class.java))))
@CordaSerializable @CordaSerializable
data class outer (val l : List<Any>) data class outer(val l: List<Any>)
val toSerialise = outer (listOf (
val toSerialise = outer(listOf(
unknownClass.constructors.first().newInstance(1, 2), unknownClass.constructors.first().newInstance(1, 2),
unknownClass.constructors.first().newInstance(3, 4), unknownClass.constructors.first().newInstance(3, 4),
unknownClass.constructors.first().newInstance(5, 6), unknownClass.constructors.first().newInstance(5, 6),
@ -227,16 +231,16 @@ class DeserializeNeedingCarpentryTests : AmqpCarpenterBase() {
@Test @Test
fun unknownInterface() { fun unknownInterface() {
val cc = ClassCarpenter() val cc = ClassCarpenter(whitelist = AllWhitelist)
val interfaceClass = cc.build (InterfaceSchema( val interfaceClass = cc.build(InterfaceSchema(
"gen.Interface", "gen.Interface",
mapOf("age" to NonNullableField (Int::class.java)))) mapOf("age" to NonNullableField(Int::class.java))))
val concreteClass = cc.build (ClassSchema (testName(), mapOf( val concreteClass = cc.build(ClassSchema(testName(), mapOf(
"age" to NonNullableField (Int::class.java), "age" to NonNullableField(Int::class.java),
"name" to NonNullableField(String::class.java)), "name" to NonNullableField(String::class.java)),
interfaces = listOf (I::class.java, interfaceClass))) interfaces = listOf(I::class.java, interfaceClass)))
val serialisedBytes = TestSerializationOutput(VERBOSE, sf1).serialize( val serialisedBytes = TestSerializationOutput(VERBOSE, sf1).serialize(
concreteClass.constructors.first().newInstance(12, "timmy")) concreteClass.constructors.first().newInstance(12, "timmy"))

View File

@ -1,5 +1,6 @@
package net.corda.nodeapi.internal.serialization.carpenter package net.corda.nodeapi.internal.serialization.carpenter
import net.corda.nodeapi.internal.serialization.AllWhitelist
import org.junit.Test import org.junit.Test
import java.beans.Introspector import java.beans.Introspector
import java.lang.reflect.Field import java.lang.reflect.Field
@ -15,7 +16,7 @@ class ClassCarpenterTest {
val b: Int val b: Int
} }
private val cc = ClassCarpenter() private val cc = ClassCarpenter(whitelist = AllWhitelist)
// We have to ignore synthetic fields even though ClassCarpenter doesn't create any because the JaCoCo // We have to ignore synthetic fields even though ClassCarpenter doesn't create any because the JaCoCo
// coverage framework auto-magically injects one method and one field into every class loaded into the JVM. // coverage framework auto-magically injects one method and one field into every class loaded into the JVM.
@ -266,7 +267,7 @@ class ClassCarpenterTest {
mapOf("a" to NonNullableField(Int::class.java))) mapOf("a" to NonNullableField(Int::class.java)))
val clazz = cc.build(schema) val clazz = cc.build(schema)
val a : Int? = null val a: Int? = null
clazz.constructors[0].newInstance(a) clazz.constructors[0].newInstance(a)
} }
@ -288,10 +289,10 @@ class ClassCarpenterTest {
mapOf("a" to NullableField(Integer::class.java))) mapOf("a" to NullableField(Integer::class.java)))
val clazz = cc.build(schema) val clazz = cc.build(schema)
val a1 : Int? = null val a1: Int? = null
clazz.constructors[0].newInstance(a1) clazz.constructors[0].newInstance(a1)
val a2 : Int? = 10 val a2: Int? = 10
clazz.constructors[0].newInstance(a2) clazz.constructors[0].newInstance(a2)
} }
@ -304,7 +305,7 @@ class ClassCarpenterTest {
val clazz = cc.build(schema) val clazz = cc.build(schema)
val a : Int? = 10 val a: Int? = 10
clazz.constructors[0].newInstance(a) clazz.constructors[0].newInstance(a)
} }
@ -317,7 +318,7 @@ class ClassCarpenterTest {
val clazz = cc.build(schema) val clazz = cc.build(schema)
val a : Int? = null val a: Int? = null
clazz.constructors[0].newInstance(a) clazz.constructors[0].newInstance(a)
} }
@ -350,7 +351,7 @@ class ClassCarpenterTest {
val clazz = cc.build(schema) val clazz = cc.build(schema)
val a : IntArray? = null val a: IntArray? = null
clazz.constructors[0].newInstance(a) clazz.constructors[0].newInstance(a)
} }
@ -472,14 +473,14 @@ class ClassCarpenterTest {
val clazz = cc.build(schema) val clazz = cc.build(schema)
assertEquals (2, clazz.declaredFields.size) assertEquals(2, clazz.declaredFields.size)
assertEquals (1, clazz.getDeclaredField("a").annotations.size) assertEquals(1, clazz.getDeclaredField("a").annotations.size)
assertEquals(Nullable::class.java, clazz.getDeclaredField("a").annotations[0].annotationClass.java) assertEquals(Nullable::class.java, clazz.getDeclaredField("a").annotations[0].annotationClass.java)
assertEquals (1, clazz.getDeclaredField("b").annotations.size) assertEquals(1, clazz.getDeclaredField("b").annotations.size)
assertEquals(Nonnull::class.java, clazz.getDeclaredField("b").annotations[0].annotationClass.java) assertEquals(Nonnull::class.java, clazz.getDeclaredField("b").annotations[0].annotationClass.java)
assertEquals (1, clazz.getMethod("getA").annotations.size) assertEquals(1, clazz.getMethod("getA").annotations.size)
assertEquals(Nullable::class.java, clazz.getMethod("getA").annotations[0].annotationClass.java) assertEquals(Nullable::class.java, clazz.getMethod("getA").annotations[0].annotationClass.java)
assertEquals (1, clazz.getMethod("getB").annotations.size) assertEquals(1, clazz.getMethod("getB").annotations.size)
assertEquals(Nonnull::class.java, clazz.getMethod("getB").annotations[0].annotationClass.java) assertEquals(Nonnull::class.java, clazz.getMethod("getB").annotations[0].annotationClass.java)
} }

View File

@ -1,5 +1,6 @@
package net.corda.nodeapi.internal.serialization.carpenter package net.corda.nodeapi.internal.serialization.carpenter
import net.corda.core.serialization.ClassWhitelist
import net.corda.nodeapi.internal.serialization.amqp.* import net.corda.nodeapi.internal.serialization.amqp.*
import net.corda.nodeapi.internal.serialization.amqp.Field import net.corda.nodeapi.internal.serialization.amqp.Field
import net.corda.nodeapi.internal.serialization.amqp.Schema import net.corda.nodeapi.internal.serialization.amqp.Schema
@ -34,9 +35,9 @@ fun Schema.mangleNames(names: List<String>): Schema {
return Schema(types = newTypes) return Schema(types = newTypes)
} }
open class AmqpCarpenterBase { open class AmqpCarpenterBase(whitelist: ClassWhitelist) {
var cc = ClassCarpenter() var cc = ClassCarpenter(whitelist = whitelist)
var factory = SerializerFactory(AllWhitelist, cc.classloader) var factory = SerializerFactory(AllWhitelist, cc.classloader)
fun serialise(clazz: Any) = SerializationOutput(factory).serialize(clazz) fun serialise(clazz: Any) = SerializationOutput(factory).serialize(clazz)
fun testName(): String = Thread.currentThread().stackTrace[2].methodName fun testName(): String = Thread.currentThread().stackTrace[2].methodName

View File

@ -1,6 +1,7 @@
package net.corda.nodeapi.internal.serialization.carpenter package net.corda.nodeapi.internal.serialization.carpenter
import net.corda.core.serialization.CordaSerializable import net.corda.core.serialization.CordaSerializable
import net.corda.nodeapi.internal.serialization.AllWhitelist
import net.corda.nodeapi.internal.serialization.amqp.CompositeType import net.corda.nodeapi.internal.serialization.amqp.CompositeType
import net.corda.nodeapi.internal.serialization.amqp.DeserializationInput import net.corda.nodeapi.internal.serialization.amqp.DeserializationInput
import org.junit.Test import org.junit.Test
@ -13,7 +14,7 @@ interface I_ {
val a: Int val a: Int
} }
class CompositeMembers : AmqpCarpenterBase() { class CompositeMembers : AmqpCarpenterBase(AllWhitelist) {
@Test @Test
fun bothKnown() { fun bothKnown() {
val testA = 10 val testA = 10
@ -42,7 +43,7 @@ class CompositeMembers : AmqpCarpenterBase() {
var amqpSchemaB: CompositeType? = null var amqpSchemaB: CompositeType? = null
for (type in obj.envelope.schema.types) { for (type in obj.envelope.schema.types) {
when (type.name.split ("$").last()) { when (type.name.split("$").last()) {
"A" -> amqpSchemaA = type as CompositeType "A" -> amqpSchemaA = type as CompositeType
"B" -> amqpSchemaB = type as CompositeType "B" -> amqpSchemaB = type as CompositeType
} }
@ -88,7 +89,7 @@ class CompositeMembers : AmqpCarpenterBase() {
val b = B(A(testA), testB) val b = B(A(testA), testB)
val obj = DeserializationInput(factory).deserializeAndReturnEnvelope(serialise(b)) val obj = DeserializationInput(factory).deserializeAndReturnEnvelope(serialise(b))
val amqpSchema = obj.envelope.schema.mangleNames(listOf (classTestName ("A"))) val amqpSchema = obj.envelope.schema.mangleNames(listOf(classTestName("A")))
assert(obj.obj is B) assert(obj.obj is B)
@ -116,7 +117,7 @@ class CompositeMembers : AmqpCarpenterBase() {
assertEquals(1, carpenterSchema.size) assertEquals(1, carpenterSchema.size)
val metaCarpenter = MetaCarpenter(carpenterSchema) val metaCarpenter = MetaCarpenter(carpenterSchema, ClassCarpenter(whitelist = AllWhitelist))
metaCarpenter.build() metaCarpenter.build()
@ -151,7 +152,7 @@ class CompositeMembers : AmqpCarpenterBase() {
assertEquals(1, carpenterSchema.dependsOn.size) assertEquals(1, carpenterSchema.dependsOn.size)
assert(mangleName(classTestName("A")) in carpenterSchema.dependsOn) assert(mangleName(classTestName("A")) in carpenterSchema.dependsOn)
val metaCarpenter = TestMetaCarpenter(carpenterSchema) val metaCarpenter = TestMetaCarpenter(carpenterSchema, ClassCarpenter(whitelist = AllWhitelist))
assertEquals(0, metaCarpenter.objects.size) assertEquals(0, metaCarpenter.objects.size)
@ -251,7 +252,8 @@ class CompositeMembers : AmqpCarpenterBase() {
assert(obj.obj is C) assert(obj.obj is C)
val carpenterSchema = obj.envelope.schema.mangleNames(listOf(classTestName("A"), classTestName("B"))) val carpenterSchema = obj.envelope.schema.mangleNames(listOf(classTestName("A"), classTestName("B")))
TestMetaCarpenter(carpenterSchema.carpenterSchema(ClassLoader.getSystemClassLoader())) TestMetaCarpenter(carpenterSchema.carpenterSchema(
ClassLoader.getSystemClassLoader()), ClassCarpenter(whitelist = AllWhitelist))
} }
/* /*

View File

@ -1,10 +1,11 @@
package net.corda.nodeapi.internal.serialization.carpenter package net.corda.nodeapi.internal.serialization.carpenter
import net.corda.nodeapi.internal.serialization.AllWhitelist
import org.junit.Test import org.junit.Test
import kotlin.test.assertEquals import kotlin.test.assertEquals
import kotlin.test.assertTrue import kotlin.test.assertTrue
class EnumClassTests : AmqpCarpenterBase() { class EnumClassTests : AmqpCarpenterBase(AllWhitelist) {
@Test @Test
fun oneValue() { fun oneValue() {
@ -84,7 +85,7 @@ class EnumClassTests : AmqpCarpenterBase() {
// exception, hence the lack of asserts // exception, hence the lack of asserts
@Test @Test
fun assignAndTest() { fun assignAndTest() {
val cc2 = ClassCarpenter() val cc2 = ClassCarpenter(whitelist = AllWhitelist)
val schema1 = EnumSchema("gen.enum", val schema1 = EnumSchema("gen.enum",
listOf("AAA", "BBB", "CCC", "DDD", "EEE", "FFF").associateBy({ it }, { EnumField() })) listOf("AAA", "BBB", "CCC", "DDD", "EEE", "FFF").associateBy({ it }, { EnumField() }))

View File

@ -1,6 +1,7 @@
package net.corda.nodeapi.internal.serialization.carpenter package net.corda.nodeapi.internal.serialization.carpenter
import net.corda.core.serialization.CordaSerializable import net.corda.core.serialization.CordaSerializable
import net.corda.nodeapi.internal.serialization.AllWhitelist
import net.corda.nodeapi.internal.serialization.amqp.DeserializationInput import net.corda.nodeapi.internal.serialization.amqp.DeserializationInput
import org.junit.Test import org.junit.Test
import kotlin.test.* import kotlin.test.*
@ -32,7 +33,7 @@ interface IIII {
val i: I val i: I
} }
class InheritanceSchemaToClassCarpenterTests : AmqpCarpenterBase() { class InheritanceSchemaToClassCarpenterTests : AmqpCarpenterBase(AllWhitelist) {
@Test @Test
fun interfaceParent1() { fun interfaceParent1() {
class A(override val j: Int) : J class A(override val j: Int) : J
@ -61,7 +62,7 @@ class InheritanceSchemaToClassCarpenterTests : AmqpCarpenterBase() {
assertEquals(1, aSchema.interfaces.size) assertEquals(1, aSchema.interfaces.size)
assertEquals(J::class.java, aSchema.interfaces[0]) assertEquals(J::class.java, aSchema.interfaces[0])
val aBuilder = ClassCarpenter().build(aSchema) val aBuilder = ClassCarpenter(whitelist = AllWhitelist).build(aSchema)
val objJ = aBuilder.constructors[0].newInstance(testJ) val objJ = aBuilder.constructors[0].newInstance(testJ)
val j = objJ as J val j = objJ as J
@ -106,7 +107,7 @@ class InheritanceSchemaToClassCarpenterTests : AmqpCarpenterBase() {
assertEquals(1, aSchema.interfaces.size) assertEquals(1, aSchema.interfaces.size)
assertEquals(J::class.java, aSchema.interfaces[0]) assertEquals(J::class.java, aSchema.interfaces[0])
val aBuilder = ClassCarpenter().build(aSchema) val aBuilder = ClassCarpenter(whitelist = AllWhitelist).build(aSchema)
val objJ = aBuilder.constructors[0].newInstance(testJ, testJJ) val objJ = aBuilder.constructors[0].newInstance(testJ, testJJ)
val j = objJ as J val j = objJ as J
@ -154,7 +155,7 @@ class InheritanceSchemaToClassCarpenterTests : AmqpCarpenterBase() {
assertTrue(I::class.java in aSchema.interfaces) assertTrue(I::class.java in aSchema.interfaces)
assertTrue(II::class.java in aSchema.interfaces) assertTrue(II::class.java in aSchema.interfaces)
val aBuilder = ClassCarpenter().build(aSchema) val aBuilder = ClassCarpenter(whitelist = AllWhitelist).build(aSchema)
val objA = aBuilder.constructors[0].newInstance(testI, testII) val objA = aBuilder.constructors[0].newInstance(testI, testII)
val i = objA as I val i = objA as I
val ii = objA as II val ii = objA as II
@ -200,7 +201,7 @@ class InheritanceSchemaToClassCarpenterTests : AmqpCarpenterBase() {
assertTrue(I::class.java in aSchema.interfaces) assertTrue(I::class.java in aSchema.interfaces)
assertTrue(III::class.java in aSchema.interfaces) assertTrue(III::class.java in aSchema.interfaces)
val aBuilder = ClassCarpenter().build(aSchema) val aBuilder = ClassCarpenter(whitelist = AllWhitelist).build(aSchema)
val objA = aBuilder.constructors[0].newInstance(testI, testIII) val objA = aBuilder.constructors[0].newInstance(testI, testIII)
val i = objA as I val i = objA as I
val iii = objA as III val iii = objA as III
@ -247,8 +248,8 @@ class InheritanceSchemaToClassCarpenterTests : AmqpCarpenterBase() {
assertNotEquals(null, aCarpenterSchema) assertNotEquals(null, aCarpenterSchema)
assertNotEquals(null, bCarpenterSchema) assertNotEquals(null, bCarpenterSchema)
val cc = ClassCarpenter() val cc = ClassCarpenter(whitelist = AllWhitelist)
val cc2 = ClassCarpenter() val cc2 = ClassCarpenter(whitelist = AllWhitelist)
val bBuilder = cc.build(bCarpenterSchema!!) val bBuilder = cc.build(bCarpenterSchema!!)
bBuilder.constructors[0].newInstance(a, testIIII) bBuilder.constructors[0].newInstance(a, testIIII)
@ -332,7 +333,7 @@ class InheritanceSchemaToClassCarpenterTests : AmqpCarpenterBase() {
assertEquals(1, carpenterSchema.dependsOn[iName]!!.size) assertEquals(1, carpenterSchema.dependsOn[iName]!!.size)
assertEquals(aName, carpenterSchema.dependsOn[iName]!![0]) assertEquals(aName, carpenterSchema.dependsOn[iName]!![0])
val mc = MetaCarpenter(carpenterSchema) val mc = MetaCarpenter(carpenterSchema, ClassCarpenter(whitelist = AllWhitelist))
mc.build() mc.build()
assertEquals(0, mc.schemas.carpenterSchemas.size) assertEquals(0, mc.schemas.carpenterSchemas.size)
@ -385,7 +386,7 @@ class InheritanceSchemaToClassCarpenterTests : AmqpCarpenterBase() {
assertNotNull(carpenterSchema.dependencies[aName]!!.second.find { it == iName }) assertNotNull(carpenterSchema.dependencies[aName]!!.second.find { it == iName })
assertNotNull(carpenterSchema.dependencies[aName]!!.second.find { it == iiName }) assertNotNull(carpenterSchema.dependencies[aName]!!.second.find { it == iiName })
val mc = MetaCarpenter(carpenterSchema) val mc = MetaCarpenter(carpenterSchema, ClassCarpenter(whitelist = AllWhitelist))
mc.build() mc.build()
assertEquals(0, mc.schemas.carpenterSchemas.size) assertEquals(0, mc.schemas.carpenterSchemas.size)
@ -445,7 +446,7 @@ class InheritanceSchemaToClassCarpenterTests : AmqpCarpenterBase() {
assertNotNull(carpenterSchema.dependencies[aName]!!.second.find { it == iiiName }) assertNotNull(carpenterSchema.dependencies[aName]!!.second.find { it == iiiName })
assertNotNull(carpenterSchema.dependencies[aName]!!.second.find { it == iName }) assertNotNull(carpenterSchema.dependencies[aName]!!.second.find { it == iName })
val mc = MetaCarpenter(carpenterSchema) val mc = MetaCarpenter(carpenterSchema, ClassCarpenter(whitelist = AllWhitelist))
mc.build() mc.build()
assertEquals(0, mc.schemas.carpenterSchemas.size) assertEquals(0, mc.schemas.carpenterSchemas.size)

View File

@ -1,13 +1,14 @@
package net.corda.nodeapi.internal.serialization.carpenter package net.corda.nodeapi.internal.serialization.carpenter
import net.corda.core.serialization.CordaSerializable import net.corda.core.serialization.CordaSerializable
import net.corda.nodeapi.internal.serialization.AllWhitelist
import net.corda.nodeapi.internal.serialization.amqp.CompositeType import net.corda.nodeapi.internal.serialization.amqp.CompositeType
import net.corda.nodeapi.internal.serialization.amqp.DeserializationInput import net.corda.nodeapi.internal.serialization.amqp.DeserializationInput
import org.junit.Test import org.junit.Test
import kotlin.test.assertEquals import kotlin.test.assertEquals
import kotlin.test.assertNotEquals import kotlin.test.assertNotEquals
class MultiMemberCompositeSchemaToClassCarpenterTests : AmqpCarpenterBase() { class MultiMemberCompositeSchemaToClassCarpenterTests : AmqpCarpenterBase(AllWhitelist) {
@Test @Test
fun twoInts() { fun twoInts() {
@ -46,7 +47,7 @@ class MultiMemberCompositeSchemaToClassCarpenterTests : AmqpCarpenterBase() {
assertNotEquals(null, aSchema) assertNotEquals(null, aSchema)
val pinochio = ClassCarpenter().build(aSchema!!) val pinochio = ClassCarpenter(whitelist = AllWhitelist).build(aSchema!!)
val p = pinochio.constructors[0].newInstance(testA, testB) val p = pinochio.constructors[0].newInstance(testA, testB)
assertEquals(pinochio.getMethod("getA").invoke(p), amqpObj.a) assertEquals(pinochio.getMethod("getA").invoke(p), amqpObj.a)
@ -90,7 +91,7 @@ class MultiMemberCompositeSchemaToClassCarpenterTests : AmqpCarpenterBase() {
assertNotEquals(null, aSchema) assertNotEquals(null, aSchema)
val pinochio = ClassCarpenter().build(aSchema!!) val pinochio = ClassCarpenter(whitelist = AllWhitelist).build(aSchema!!)
val p = pinochio.constructors[0].newInstance(testA, testB) val p = pinochio.constructors[0].newInstance(testA, testB)
assertEquals(pinochio.getMethod("getA").invoke(p), amqpObj.a) assertEquals(pinochio.getMethod("getA").invoke(p), amqpObj.a)

View File

@ -1,12 +1,13 @@
package net.corda.nodeapi.internal.serialization.carpenter package net.corda.nodeapi.internal.serialization.carpenter
import net.corda.core.serialization.CordaSerializable import net.corda.core.serialization.CordaSerializable
import net.corda.nodeapi.internal.serialization.AllWhitelist
import net.corda.nodeapi.internal.serialization.amqp.CompositeType import net.corda.nodeapi.internal.serialization.amqp.CompositeType
import net.corda.nodeapi.internal.serialization.amqp.DeserializationInput import net.corda.nodeapi.internal.serialization.amqp.DeserializationInput
import org.junit.Test import org.junit.Test
import kotlin.test.assertEquals import kotlin.test.assertEquals
class SingleMemberCompositeSchemaToClassCarpenterTests : AmqpCarpenterBase() { class SingleMemberCompositeSchemaToClassCarpenterTests : AmqpCarpenterBase(AllWhitelist) {
@Test @Test
fun singleInteger() { fun singleInteger() {
@CordaSerializable @CordaSerializable
@ -36,7 +37,7 @@ class SingleMemberCompositeSchemaToClassCarpenterTests : AmqpCarpenterBase() {
force = true) force = true)
val aSchema = carpenterSchema.carpenterSchemas.find { it.name == classTestName("A") }!! val aSchema = carpenterSchema.carpenterSchemas.find { it.name == classTestName("A") }!!
val aBuilder = ClassCarpenter().build(aSchema) val aBuilder = ClassCarpenter(whitelist = AllWhitelist).build(aSchema)
val p = aBuilder.constructors[0].newInstance(test) val p = aBuilder.constructors[0].newInstance(test)
assertEquals(aBuilder.getMethod("getA").invoke(p), amqpObj.a) assertEquals(aBuilder.getMethod("getA").invoke(p), amqpObj.a)
@ -67,7 +68,7 @@ class SingleMemberCompositeSchemaToClassCarpenterTests : AmqpCarpenterBase() {
force = true) force = true)
val aSchema = carpenterSchema.carpenterSchemas.find { it.name == classTestName("A") }!! val aSchema = carpenterSchema.carpenterSchemas.find { it.name == classTestName("A") }!!
val aBuilder = ClassCarpenter().build(aSchema) val aBuilder = ClassCarpenter(whitelist = AllWhitelist).build(aSchema)
val p = aBuilder.constructors[0].newInstance(test) val p = aBuilder.constructors[0].newInstance(test)
assertEquals(aBuilder.getMethod("getA").invoke(p), amqpObj.a) assertEquals(aBuilder.getMethod("getA").invoke(p), amqpObj.a)
@ -102,7 +103,7 @@ class SingleMemberCompositeSchemaToClassCarpenterTests : AmqpCarpenterBase() {
force = true) force = true)
val aSchema = carpenterSchema.carpenterSchemas.find { it.name == classTestName("A") }!! val aSchema = carpenterSchema.carpenterSchemas.find { it.name == classTestName("A") }!!
val aBuilder = ClassCarpenter().build(aSchema) val aBuilder = ClassCarpenter(whitelist = AllWhitelist).build(aSchema)
val p = aBuilder.constructors[0].newInstance(test) val p = aBuilder.constructors[0].newInstance(test)
assertEquals(aBuilder.getMethod("getA").invoke(p), amqpObj.a) assertEquals(aBuilder.getMethod("getA").invoke(p), amqpObj.a)
@ -137,7 +138,7 @@ class SingleMemberCompositeSchemaToClassCarpenterTests : AmqpCarpenterBase() {
force = true) force = true)
val aSchema = carpenterSchema.carpenterSchemas.find { it.name == classTestName("A") }!! val aSchema = carpenterSchema.carpenterSchemas.find { it.name == classTestName("A") }!!
val aBuilder = ClassCarpenter().build(aSchema) val aBuilder = ClassCarpenter(whitelist = AllWhitelist).build(aSchema)
val p = aBuilder.constructors[0].newInstance(test) val p = aBuilder.constructors[0].newInstance(test)
assertEquals(aBuilder.getMethod("getA").invoke(p), amqpObj.a) assertEquals(aBuilder.getMethod("getA").invoke(p), amqpObj.a)
@ -172,7 +173,7 @@ class SingleMemberCompositeSchemaToClassCarpenterTests : AmqpCarpenterBase() {
force = true) force = true)
val aSchema = carpenterSchema.carpenterSchemas.find { it.name == classTestName("A") }!! val aSchema = carpenterSchema.carpenterSchemas.find { it.name == classTestName("A") }!!
val aBuilder = ClassCarpenter().build(aSchema) val aBuilder = ClassCarpenter(whitelist = AllWhitelist).build(aSchema)
val p = aBuilder.constructors[0].newInstance(test) val p = aBuilder.constructors[0].newInstance(test)
assertEquals(aBuilder.getMethod("getA").invoke(p), amqpObj.a) assertEquals(aBuilder.getMethod("getA").invoke(p), amqpObj.a)
@ -183,7 +184,7 @@ class SingleMemberCompositeSchemaToClassCarpenterTests : AmqpCarpenterBase() {
@CordaSerializable @CordaSerializable
data class A(val a: Float) data class A(val a: Float)
val test: Float = 10.0F val test = 10.0F
val a = A(test) val a = A(test)
val obj = DeserializationInput(factory).deserializeAndReturnEnvelope(serialise(a)) val obj = DeserializationInput(factory).deserializeAndReturnEnvelope(serialise(a))
@ -207,7 +208,7 @@ class SingleMemberCompositeSchemaToClassCarpenterTests : AmqpCarpenterBase() {
force = true) force = true)
val aSchema = carpenterSchema.carpenterSchemas.find { it.name == classTestName("A") }!! val aSchema = carpenterSchema.carpenterSchemas.find { it.name == classTestName("A") }!!
val aBuilder = ClassCarpenter().build(aSchema) val aBuilder = ClassCarpenter(whitelist = AllWhitelist).build(aSchema)
val p = aBuilder.constructors[0].newInstance(test) val p = aBuilder.constructors[0].newInstance(test)
assertEquals(aBuilder.getMethod("getA").invoke(p), amqpObj.a) assertEquals(aBuilder.getMethod("getA").invoke(p), amqpObj.a)