/*
* Copyright 2012-2016 the original author or authors.
*
* 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 org.springframework.batch.core.repository.dao;
import org.junit.Test;
import org.springframework.batch.core.repository.ExecutionContextSerializer;
import java.io.*;
import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.hasEntry;
/**
* Abstract test class for {@code ExecutionContextSerializer} implementations. Provides a minimum on test methods
* that should pass for each {@code ExecutionContextSerializer} implementation.
*
* @author Thomas Risberg
* @author Michael Minella
* @author Marten Deinum
*/
public abstract class AbstractExecutionContextSerializerTests {
@Test
public void testSerializeAMap() throws Exception {
Map<String, Object> m1 = new HashMap<String, Object>();
m1.put("object1", Long.valueOf(12345L));
m1.put("object2", "OBJECT TWO");
// Use a date after 1971 (otherwise daylight saving screws up)...
m1.put("object3", new Date(123456790123L));
m1.put("object4", new Double(1234567.1234D));
Map<String, Object> m2 = serializationRoundTrip(m1);
compareContexts(m1, m2);
}
@Test
public void testComplexObject() throws Exception {
Map<String, Object> m1 = new HashMap<String, Object>();
ComplexObject o1 = new ComplexObject();
o1.setName("02345");
Map<String, Object> m = new HashMap<String, Object>();
m.put("object1", Long.valueOf(12345L));
m.put("object2", "OBJECT TWO");
o1.setMap(m);
o1.setNumber(new BigDecimal("12345.67"));
ComplexObject o2 = new ComplexObject();
o2.setName("Inner Object");
o2.setMap(m);
o2.setNumber(new BigDecimal("98765.43"));
o1.setObj(o2);
m1.put("co", o1);
Map<String, Object> m2 = serializationRoundTrip(m1);
compareContexts(m1, m2);
}
@Test (expected=IllegalArgumentException.class)
public void testNullSerialization() throws Exception {
getSerializer().serialize(null, null);
}
protected void compareContexts(Map<String, Object> m1, Map<String, Object> m2) {
for (Map.Entry<String, Object> entry : m1.entrySet()) {
assertThat(m2, hasEntry(entry.getKey(), entry.getValue()));
}
}
protected Map<String, Object> serializationRoundTrip(Map<String, Object> m1) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
getSerializer().serialize(m1, out);
String s = new String(out.toByteArray(), "ISO-8859-1");
InputStream in = new ByteArrayInputStream(s.getBytes("ISO-8859-1"));
Map<String, Object> m2 = getSerializer().deserialize(in);
return m2;
}
protected abstract ExecutionContextSerializer getSerializer();
public static class ComplexObject implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private BigDecimal number;
private ComplexObject obj;
private Map<String,Object> map;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public BigDecimal getNumber() {
return number;
}
public void setNumber(BigDecimal number) {
this.number = number;
}
public ComplexObject getObj() {
return obj;
}
public void setObj(ComplexObject obj) {
this.obj = obj;
}
public Map<String,Object> getMap() {
return map;
}
public void setMap(Map<String,Object> map) {
this.map = map;
}
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
ComplexObject that = (ComplexObject) o;
if (map != null ? !map.equals(that.map) : that.map != null) {
return false;
}
if (name != null ? !name.equals(that.name) : that.name != null) {
return false;
}
if (number != null ? !number.equals(that.number) : that.number != null) {
return false;
}
if (obj != null ? !obj.equals(that.obj) : that.obj != null) {
return false;
}
return true;
}
@Override
public int hashCode() {
int result;
result = (name != null ? name.hashCode() : 0);
result = 31 * result + (number != null ? number.hashCode() : 0);
result = 31 * result + (obj != null ? obj.hashCode() : 0);
result = 31 * result + (map != null ? map.hashCode() : 0);
return result;
}
@Override
public String toString() {
return "ComplexObject [name=" + name + ", number=" + number + "]";
}
}
}