/* * Copyright 2009 Aleksandar Seovic * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.seovic.pof; import com.tangosol.io.pof.EnumPofSerializer; import com.tangosol.io.pof.PortableObjectSerializer; import com.tangosol.io.pof.SimplePofContext; import com.tangosol.util.Binary; import com.tangosol.util.BinaryEntry; import com.tangosol.util.ExternalizableHelper; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import org.junit.Before; import org.junit.Test; import test.Color; import static org.junit.Assert.*; public class PofUtilTest { private SimplePofContext ctx; private ClassLoader loader = new PortableTypeLoader(); @Before public void setup() throws Exception { ctx = new SimplePofContext(); ctx.registerUserType( 1, loader.loadClass("test.v3.Pet"), new PortableTypeSerializer(1, loader.loadClass("test.v3.Pet"))); ctx.registerUserType( 2, loader.loadClass("test.v3.Dog"), new PortableTypeSerializer(2, loader.loadClass("test.v3.Dog"))); ctx.registerUserType( 3, loader.loadClass("test.v3.Animal"), new PortableTypeSerializer(3, loader.loadClass("test.v3.Animal"))); ctx.registerUserType( 4, loader.loadClass("test.v3.Zoo"), new PortableTypeSerializer(4, loader.loadClass("test.v3.Zoo"))); ctx.registerUserType( 5, loader.loadClass("test.Color"), new EnumPofSerializer()); ctx.registerUserType(10, loader.loadClass("test.v3.Address"), new PortableTypeSerializer(10, loader.loadClass("test.v3.Address"))); ctx.registerUserType(11, loader.loadClass("test.Person"), new PortableObjectSerializer(11)); } @Test public void testSimplePath() throws Exception { Class dogClass = loader.loadClass("test.v3.Dog"); Constructor dogCtor = dogClass.getConstructor(String.class, Integer.TYPE, String.class, Color.class); Object dog = dogCtor.newInstance("Nadia", 10, "Boxer", Color.BRINDLE); Binary binDog = ExternalizableHelper.toBinary(dog, ctx); BinaryEntry entry = new TestBinaryEntry(null, binDog, ctx); assertEquals("Nadia", PofUtil.getPofExtractor(dogClass, "name").extractFromEntry(entry)); assertEquals(10, PofUtil.getPofExtractor(dogClass, "age").extractFromEntry(entry)); PofUtil.getPofUpdater(dogClass, "age").updateEntry(entry, 9); Object dog2 = ExternalizableHelper.fromBinary(entry.getBinaryValue(), ctx); Method getAge = loader.loadClass("test.v3.Pet").getDeclaredMethod("getAge"); assertEquals(9, getAge.invoke(dog2)); } @Test public void testComplexPath() throws Exception { Class addressClass = loader.loadClass("test.v3.Address"); Constructor addressCtor = addressClass.getConstructor(String.class, String.class, String.class); Object address = addressCtor.newInstance("123 Main St", "Portland", "Oregon"); Class zooClass = loader.loadClass("test.v3.Zoo"); Constructor zooCtor = zooClass.getConstructor(addressClass); Object zoo = zooCtor.newInstance(address); Binary binZoo = ExternalizableHelper.toBinary(zoo, ctx); BinaryEntry entry = new TestBinaryEntry(null, binZoo, ctx); assertEquals("Portland", PofUtil.getPofExtractor(zooClass, "address.city").extractFromEntry(entry)); assertEquals("Oregon", PofUtil.getPofExtractor(zooClass, "address.state").extractFromEntry(entry)); PofUtil.getPofUpdater(zooClass, "address.state").updateEntry(entry, "OR"); Object zoo2 = ExternalizableHelper.fromBinary(entry.getBinaryValue(), ctx); Method getAddress = zooClass.getDeclaredMethod("getAddress"); Method getState = addressClass.getDeclaredMethod("getState"); assertEquals("OR", getState.invoke(getAddress.invoke(zoo2))); } }