/*
* Copyright (C) 2007 ETH Zurich
*
* This file is part of Fosstrak (www.fosstrak.org).
*
* Fosstrak is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License version 2.1, as published by the Free Software Foundation.
*
* Fosstrak is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with Fosstrak; if not, write to the Free
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA
*/
package org.fosstrak.ale.util.test;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.CharArrayWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.util.GregorianCalendar;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import junit.framework.Assert;
import org.fosstrak.ale.util.DeserializerUtil;
import org.fosstrak.ale.util.ECTimeUnit;
import org.fosstrak.ale.util.SerializerUtil;
import org.fosstrak.ale.wsdl.alelr.epcglobal.AddReaders;
import org.fosstrak.ale.wsdl.alelr.epcglobal.RemoveReaders;
import org.fosstrak.ale.wsdl.alelr.epcglobal.SetProperties;
import org.fosstrak.ale.wsdl.alelr.epcglobal.SetReaders;
import org.fosstrak.ale.xsd.ale.epcglobal.ECBoundarySpec;
import org.fosstrak.ale.xsd.ale.epcglobal.ECFilterSpec;
import org.fosstrak.ale.xsd.ale.epcglobal.ECFilterSpec.ExcludePatterns;
import org.fosstrak.ale.xsd.ale.epcglobal.ECFilterSpec.IncludePatterns;
import org.fosstrak.ale.xsd.ale.epcglobal.ECGroupSpec;
import org.fosstrak.ale.xsd.ale.epcglobal.ECReport;
import org.fosstrak.ale.xsd.ale.epcglobal.ECReportGroup;
import org.fosstrak.ale.xsd.ale.epcglobal.ECReportOutputSpec;
import org.fosstrak.ale.xsd.ale.epcglobal.ECReportSetSpec;
import org.fosstrak.ale.xsd.ale.epcglobal.ECReportSpec;
import org.fosstrak.ale.xsd.ale.epcglobal.ECReports;
import org.fosstrak.ale.xsd.ale.epcglobal.ECReports.Reports;
import org.fosstrak.ale.xsd.ale.epcglobal.ECSpec;
import org.fosstrak.ale.xsd.ale.epcglobal.ECSpec.LogicalReaders;
import org.fosstrak.ale.xsd.ale.epcglobal.ECSpec.ReportSpecs;
import org.fosstrak.ale.xsd.ale.epcglobal.ECTime;
import org.fosstrak.ale.xsd.ale.epcglobal.LRProperty;
import org.fosstrak.ale.xsd.ale.epcglobal.LRSpec;
import org.junit.Test;
/**
* @author swieland
* Test the serializer and deserializer utils. The tests only test the serializer and
* the deserializer algorithm (writing to and reading from JAXB) but not the JAXB serializer
* itself (we safely assume it to work correctly :-) ).
*/
public class SerializerAndDeserializerUtilsTest {
private static final long DEFAULT_ECTIME_VALUE = 1000L;
private static final long ECTIME_REPEAT_VALUE = 2000L;
private static final long ECTIME_STABLESET_VALUE = 3000L;
private static final String START_TRIGGER = "startTrigger";
private static final String STOP_TRIGGER = "stopTrigger";
private static final String FILTER_SPEC_EXCLUDE_PATTERN = "filterSpecExcludePattern";
private static final String FILTER_SPEC_INCLUDE_PATTERN = "filterSpecIncludePattern";
private static final String GROUP_SPEC_PATTERN = "groupSpecPattern";
private static final String REPORT_NAME = "reportName";
private static final String REPORT_SET = "reportSet";
private static final String READER_NAME = "readerName";
private static final String ADD_READER_NAME = "addReaderName";
private static final String SET_READER_NAME = "setReaderName";
private static final String REMOVE_READER_NAME = "setReaderName";
private static final String SET_PROPERTY_NAME = "setPropertyName";
private static final String SET_PROPERTY_NAMEVALUE_NAME = "setPropertyName";
private static final String SET_PROPERTY_NAMEVALUE_VALUE = "setPropertyValue";
private static final String ALE_ID = "aleID";
private static final long TOTAL_MS = 2000L;
private static final String TERMINATION_TRIGGER = "terminationTrigger";
private static final String TERMINATION_CONDITION = "terminationCondition";
private static final String INITIATION_TRIGGER = "initiationTrigger";
private static final String INITIATION_CONDITION = "initiationCondition";
private static final String REPORT_SPEC_NAME = "reportSpecName";
@Test
public void testSerializeECSpec() throws Exception {
ECSpec ecSpec = createDummyECSpec();
CharArrayWriter writer = new CharArrayWriter();
SerializerUtil.serializeECSpec(ecSpec, writer);
String str = writer.toString();
ECSpec ecSpec2 = DeserializerUtil.deserializeECSpec(new ByteArrayInputStream(str.getBytes()));
ensureSame(ecSpec, ecSpec2);
}
@Test
public void testSerializeECSpecWithOutputStream() throws Exception {
ECSpec ecSpec = createDummyECSpec();
ByteArrayOutputStream bous = new ByteArrayOutputStream();
SerializerUtil.serializeECSpec(ecSpec, bous);
String str = bous.toString();
ECSpec ecSpec2 = DeserializerUtil.deserializeECSpec(new ByteArrayInputStream(str.getBytes()));
ensureSame(ecSpec, ecSpec2);
}
@Test
public void testSerializeECSpecPretty() throws Exception {
ECSpec ecSpec = createDummyECSpec();
ByteArrayOutputStream bous = new ByteArrayOutputStream();
SerializerUtil.serializeECSpecPretty(ecSpec, bous);
String str = bous.toString();
ECSpec ecSpec2 = DeserializerUtil.deserializeECSpec(new ByteArrayInputStream(str.getBytes()));
ensureSame(ecSpec, ecSpec2);
}
/**
* test the deserialization of the ECSpec from File.
* @throws Exception test failure.
*/
@Test
public void testDeserializeECSpec() throws Exception {
ECSpec ecSpec = createDummyECSpec();
File f = File.createTempFile("testDeserializeECSpec", ".xml");
FileOutputStream fof = new FileOutputStream(f);
SerializerUtil.serializeECSpec(ecSpec, fof);
fof.close();
ECSpec deserialized = DeserializerUtil.deserializeECSpec(f.getAbsolutePath());
ensureSame(ecSpec, deserialized);
}
@Test
public void testSerializeECReports() throws Exception {
ECReports ecReports = createDummyECReports();
CharArrayWriter writer = new CharArrayWriter();
SerializerUtil.serializeECReports(ecReports, writer);
String str = writer.toString();
ECReports ecReports2 = DeserializerUtil.deserializeECReports(new ByteArrayInputStream(str.getBytes()));
ensureSame(ecReports, ecReports2);
}
@Test
public void testSerializeECReportsPretty() throws Exception {
ECReports ecReports = createDummyECReports();
CharArrayWriter writer = new CharArrayWriter();
SerializerUtil.serializeECReportsPretty(ecReports, writer);
String str = writer.toString();
ECReports ecReports2 = DeserializerUtil.deserializeECReports(new ByteArrayInputStream(str.getBytes()));
ensureSame(ecReports, ecReports2);
}
@Test
public void testSerializeLRSpec() throws Exception {
LRSpec lrSpec = createDummyLRSpec();
CharArrayWriter writer = new CharArrayWriter();
SerializerUtil.serializeLRSpec(lrSpec, writer);
String str = writer.toString();
LRSpec lrSpec2 = DeserializerUtil.deserializeLRSpec(new ByteArrayInputStream(str.getBytes()));
ensureSame(lrSpec, lrSpec2);
}
@Test
public void testSerializeSetProperties() throws Exception {
String fn = createTemporaryFileName();
SetProperties setProperties = createDummySetProperties();
SerializerUtil.serializeSetProperties(setProperties, fn);
SetProperties setProperties2 = DeserializerUtil.deserializeSetProperties(fn);
ensureSame(setProperties, setProperties2);
}
@Test
public void testSerializeRemoveReaders() throws Exception {
String fn = createTemporaryFileName();
RemoveReaders removeReaders = createDummyRemoveReaders();
SerializerUtil.serializeRemoveReaders(removeReaders, fn);
RemoveReaders removeReaders2 = DeserializerUtil.deserializeRemoveReaders(fn);
ensureSame(removeReaders, removeReaders2);
}
@Test
public void testSerializeSetReaders() throws Exception {
String fn = createTemporaryFileName();
SetReaders setReaders = createDummySetReaders();
SerializerUtil.serializeSetReaders(setReaders, fn);
SetReaders setReaders2 = DeserializerUtil.deserializeSetReaders(fn);
ensureSame(setReaders, setReaders2);
}
@Test
public void testSerializeAddReaders() throws Exception {
String fn = createTemporaryFileName();
AddReaders addReaders = createDummyAddReaders();
SerializerUtil.serializeAddReaders(addReaders, fn);
AddReaders addReaders2 = DeserializerUtil.deserializeAddReaders(fn);
ensureSame(addReaders, addReaders2);
}
private String createTemporaryFileName() {
String tempdir = System.getProperty("java.io.tmpdir");
if (!(tempdir.endsWith("/") || tempdir.endsWith("\\"))) {
tempdir = tempdir + System.getProperty("file.separator");
}
return tempdir + String.format("aleSerializerTest_%d.temp", System.currentTimeMillis());
}
public SetProperties createDummySetProperties() {
SetProperties setProperties = new SetProperties();
SetProperties.Properties properties = new SetProperties.Properties();
LRProperty property = new LRProperty();
property.setName(SET_PROPERTY_NAMEVALUE_NAME);
property.setValue(SET_PROPERTY_NAMEVALUE_VALUE);
properties.getProperty().add(property);
setProperties.setName(SET_PROPERTY_NAME);
setProperties.setProperties(properties);
return setProperties;
}
public RemoveReaders createDummyRemoveReaders() {
RemoveReaders removeReaders = new RemoveReaders();
RemoveReaders.Readers readers = new RemoveReaders.Readers();
readers.getReader().add(READER_NAME);
removeReaders.setName(REMOVE_READER_NAME);
removeReaders.setReaders(readers);
return removeReaders;
}
public SetReaders createDummySetReaders() {
SetReaders setReaders = new SetReaders();
SetReaders.Readers readers = new SetReaders.Readers();
readers.getReader().add(READER_NAME);
setReaders.setName(SET_READER_NAME);
setReaders.setReaders(readers);
return setReaders;
}
public AddReaders createDummyAddReaders() {
AddReaders addReaders = new AddReaders();
AddReaders.Readers readers = new AddReaders.Readers();
readers.getReader().add(READER_NAME);
addReaders.setName(ADD_READER_NAME);
addReaders.setReaders(readers);
return addReaders;
}
public ECSpec createDummyECSpec() throws Exception {
ECSpec spec = new ECSpec();
spec.setBoundarySpec(createDummyECBoundarySpec());
spec.setCreationDate(createDummyCalendar());
spec.setIncludeSpecInReports(true);
spec.setLogicalReaders(createDummyLogicalReaders(new String[] {
"LogicalReader1", "LogicalReader2" }));
spec.setReportSpecs(createDummyReportSpecs());
return spec;
}
public ECBoundarySpec createDummyECBoundarySpec() {
ECBoundarySpec spec = new ECBoundarySpec();
spec.setDuration(createDummyECTime(DEFAULT_ECTIME_VALUE));
spec.setRepeatPeriod(createDummyECTime(ECTIME_REPEAT_VALUE));
spec.setStableSetInterval(createDummyECTime(ECTIME_STABLESET_VALUE));
spec.setStartTrigger(START_TRIGGER);
spec.setStopTrigger(STOP_TRIGGER);
return spec;
}
public ECTime createDummyECTime(long t) {
ECTime time = new ECTime();
time.setUnit(ECTimeUnit.MS);
time.setValue(t);
return time;
}
public XMLGregorianCalendar createDummyCalendar() throws Exception {
return DatatypeFactory.newInstance().newXMLGregorianCalendar(new GregorianCalendar(2000, 10, 10));
}
public LogicalReaders createDummyLogicalReaders(String[] readers) {
LogicalReaders spec = new LogicalReaders();
for (String reader : readers) {
spec.getLogicalReader().add(reader);
}
return spec;
}
public ReportSpecs createDummyReportSpecs() {
ExcludePatterns excludePatterns = new ExcludePatterns();
excludePatterns.getExcludePattern().add(FILTER_SPEC_EXCLUDE_PATTERN);
IncludePatterns includePatterns = new IncludePatterns();
includePatterns.getIncludePattern().add(FILTER_SPEC_INCLUDE_PATTERN);
ECFilterSpec filterSpec = new ECFilterSpec();
filterSpec.setExcludePatterns(excludePatterns);
filterSpec.setIncludePatterns(includePatterns);
ECGroupSpec groupSpec = new ECGroupSpec();
groupSpec.getPattern().add(GROUP_SPEC_PATTERN);
ECReportOutputSpec outputSpec = new ECReportOutputSpec();
outputSpec.setIncludeCount(true);
outputSpec.setIncludeEPC(true);
outputSpec.setIncludeRawDecimal(true);
outputSpec.setIncludeRawHex(true);
outputSpec.setIncludeTag(true);
ECReportSetSpec reportSet = new ECReportSetSpec();
reportSet.setSet(REPORT_SET);
ECReportSpec reportSpec = new ECReportSpec();
reportSpec.setFilterSpec(filterSpec);
reportSpec.setGroupSpec(groupSpec);
reportSpec.setOutput(outputSpec);
reportSpec.setReportIfEmpty(true);
reportSpec.setReportName(REPORT_NAME);
reportSpec.setReportOnlyOnChange(true);
reportSpec.setReportSet(reportSet);
ReportSpecs specs = new ReportSpecs();
specs.getReportSpec().add(reportSpec);
return specs;
}
public ECReports createDummyECReports() throws Exception {
ECReports reports = new ECReports();
reports.setALEID(ALE_ID);
reports.setCreationDate(createDummyCalendar());
reports.setDate(createDummyCalendar());
reports.setECSpec(createDummyECSpec());
reports.setInitiationCondition(INITIATION_CONDITION);
reports.setInitiationTrigger(INITIATION_TRIGGER);
reports.setReports(createDummyReports());
reports.setSpecName(REPORT_SPEC_NAME);
reports.setTerminationCondition(TERMINATION_CONDITION);
reports.setTerminationTrigger(TERMINATION_TRIGGER);
reports.setTotalMilliseconds(TOTAL_MS);
return reports;
}
public Reports createDummyReports() {
Reports reports = new Reports();
reports.getReport().add(createDummyECReport());
return reports;
}
public ECReport createDummyECReport() {
ECReport report = new ECReport();
report.setReportName(REPORT_NAME);
report.getGroup().add(createDummyECReportGroup());
return report;
}
public ECReportGroup createDummyECReportGroup() {
ECReportGroup group = new ECReportGroup();
return group;
}
public LRSpec createDummyLRSpec() throws Exception {
LRSpec lrSpec = new LRSpec();
lrSpec.setCreationDate(createDummyCalendar());
lrSpec.setIsComposite(false);
LRSpec.Properties properties = new LRSpec.Properties();
LRProperty property = new LRProperty();
property.setName(SET_PROPERTY_NAMEVALUE_NAME);
property.setValue(SET_PROPERTY_NAMEVALUE_VALUE);
properties.getProperty().add(property);
lrSpec.setProperties(properties);
LRSpec.Readers readers = new LRSpec.Readers();
readers.getReader().add(READER_NAME);
lrSpec.setReaders(readers);
return lrSpec;
}
private void ensureSame(SetProperties expected, SetProperties actual) {
Assert.assertNotNull(actual);
Assert.assertEquals(expected.getName(), actual.getName());
Assert.assertNotNull(actual.getProperties());
Assert.assertEquals(expected.getProperties().getProperty().size(), actual.getProperties().getProperty().size());
}
private void ensureSame(RemoveReaders expected, RemoveReaders actual) {
Assert.assertNotNull(actual);
Assert.assertEquals(expected.getName(), actual.getName());
Assert.assertNotNull(actual.getReaders());
Assert.assertEquals(expected.getReaders().getReader().size(), actual.getReaders().getReader().size());
}
private void ensureSame(SetReaders expected, SetReaders actual) {
Assert.assertNotNull(actual);
Assert.assertEquals(expected.getName(), actual.getName());
Assert.assertNotNull(actual.getReaders());
Assert.assertEquals(expected.getReaders().getReader().size(), actual.getReaders().getReader().size());
}
private void ensureSame(AddReaders expected, AddReaders actual) {
Assert.assertNotNull(actual);
Assert.assertEquals(expected.getName(), actual.getName());
Assert.assertNotNull(actual.getReaders());
Assert.assertEquals(expected.getReaders().getReader().size(), actual.getReaders().getReader().size());
}
private void ensureSame(ECSpec expected, ECSpec actual) {
Assert.assertNotNull(actual);
Assert.assertNotNull(actual.getCreationDate());
Assert.assertEquals(expected.getCreationDate().getDay(), actual.getCreationDate().getDay());
Assert.assertEquals(expected.getCreationDate().getMonth(), actual.getCreationDate().getMonth());
Assert.assertEquals(expected.getCreationDate().getYear(), actual.getCreationDate().getYear());
}
private void ensureSame(ECReports expected, ECReports actual) {
Assert.assertNotNull(actual);
}
private void ensureSame(LRSpec expected, LRSpec actual) {
Assert.assertNotNull(actual);
}
}