Package org.jberet.runtime

Source Code of org.jberet.runtime.SerializationTests

/*
* Copyright (c) 2014 Red Hat, Inc. and/or its affiliates.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/

package org.jberet.runtime;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import javax.batch.runtime.JobInstance;

import org.jberet.testapps.common.AbstractIT;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

/**
* @author <a href="mailto:jperkins@redhat.com">James R. Perkins</a>
*/
public class SerializationTests extends AbstractIT {

    @Before
    public void setup() throws Exception {
        params.clear();
    }

    @Test
    public void testJobInstance() throws Exception {
        // Start the job
        startJobAndWait("no-op-batchlet.xml");

        // Get the current job instance
        final JobInstance jobInstance = jobExecution.getJobInstance();
        // Serialize, then deserialize the JobInstance
        final JobInstance serializedJobInstance = doSerialization(jobInstance, JobInstance.class);

        /// The job instance checks equals checks the id which should always be equal
        Assert.assertEquals(jobInstance, serializedJobInstance);
        // Check each field in the JobInstance only for equality, currently each field overrides equals which will work
        // for now. If this changes this test may break and this really could be removed.
        reflectiveEquals(jobInstance, serializedJobInstance, false);
    }

    protected <T> T doSerialization(final T instance, final Class<? extends T> type) throws IOException, ClassNotFoundException {
        // Serialize the instance
        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
        final ObjectOutputStream objectOutputStream = new ObjectOutputStream(baos);
        objectOutputStream.writeObject(instance);

        // Deserialize the instance and return it
        final ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
        final ObjectInputStream objectInputStream = new ObjectInputStream(bais);
        return type.cast(objectInputStream.readObject());
    }

    protected void reflectiveEquals(final Object one, final Object two, final boolean recursive) throws IllegalAccessException {
        final Class<?> type = one.getClass();
        Assert.assertEquals(String.format("Type for %s doesn't match type for %s", one, two), type, two.getClass());
        // Get all the fields
        final Field[] fields = one.getClass().getDeclaredFields();
        for (Field field : fields) {
            if (!Modifier.isTransient(field.getModifiers())) {
                if (!field.isAccessible()) field.setAccessible(true);
                final Class<?> fieldType = field.getType();
                final Object valueOne = field.get(one);
                final Object valueTwo = field.get(two);
                // Only recursively check non-jdk objects
                if (recursive && !(fieldType.isPrimitive() || fieldType.getName().startsWith("java"))) {
                    reflectiveEquals(valueOne, valueTwo, false);
                }
                Assert.assertEquals(String.format("Value %s not equal to %s for field %s in class %s", valueOne, valueTwo, field, type), valueOne, valueTwo);
            }
        }
    }
}
TOP

Related Classes of org.jberet.runtime.SerializationTests

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.