/**
*
*/
package org.fosstrak.ale.server.readers.test;
import java.util.LinkedList;
import java.util.List;
import org.easymock.EasyMock;
import org.fosstrak.ale.exception.ImplementationException;
import org.fosstrak.ale.server.Tag;
import org.fosstrak.ale.server.readers.CompositeReader;
import org.fosstrak.ale.server.readers.LogicalReader;
import org.fosstrak.ale.server.readers.LogicalReaderManager;
import org.fosstrak.ale.xsd.ale.epcglobal.LRProperty;
import org.fosstrak.ale.xsd.ale.epcglobal.LRSpec;
import org.junit.Assert;
import org.junit.Test;
/**
* test the composite reader.
* @author swieland
*
*/
public class CompositeReaderTest {
/**
* test that a reader can be added.
*/
@Test
public void testAddAndRemoveReader() {
CompositeReader compositeReader = new CompositeReader();
final String readerName = "logicalReader";
LogicalReader logicalReader = EasyMock.createMock(LogicalReader.class);
EasyMock.expect(logicalReader.getName()).andReturn(readerName).atLeastOnce();
// composite reader must add itself as an observer to the logical reader when adding.
logicalReader.addObserver(compositeReader);
EasyMock.expectLastCall();
// composite reader must remove itself as an observer to the logical reader when removing.
logicalReader.deleteObserver(compositeReader);
EasyMock.expectLastCall();
EasyMock.replay(logicalReader);
compositeReader.addReader(logicalReader);
Assert.assertTrue(compositeReader.containsReader(readerName));
compositeReader.removeReader(logicalReader);
Assert.assertFalse(compositeReader.containsReader(readerName));
EasyMock.verify(logicalReader);
}
/**
* test the initialization method.
* @throws ImplementationException expected.
*/
@Test(expected = ImplementationException.class)
public void testInitializeNoReaderName() throws ImplementationException {
CompositeReader compositeReader = new CompositeReader();
compositeReader.initialize(null, null);
}
/**
* test the initialization method.
* @throws ImplementationException expected.
*/
@Test(expected = ImplementationException.class)
public void testInitializeNoSpec() throws ImplementationException {
CompositeReader compositeReader = new CompositeReader();
compositeReader.initialize("compositeReader", null);
}
/**
* test the initialization method.
* @throws ImplementationException expected.
*/
@Test(expected = ImplementationException.class)
public void testInitializeNoProperties() throws ImplementationException {
CompositeReader compositeReader = new CompositeReader();
LRSpec spec = EasyMock.createMock(LRSpec.class);
EasyMock.expect(spec.getProperties()).andReturn(null);
EasyMock.replay(spec);
compositeReader.initialize("compositeReader", spec);
}
/**
* test the initialization method.
* @throws ImplementationException failure.
*/
@Test
public void testInitializeAddProperties() throws ImplementationException {
final String propertyName = "propertyName";
final String propertyValue = "propertyValue";
LRSpec.Properties properties = new LRSpec.Properties();
LRProperty p = EasyMock.createMock(LRProperty.class);
EasyMock.expect(p.getName()).andReturn(propertyName);
EasyMock.expect(p.getValue()).andReturn(propertyValue);
EasyMock.replay(p);
properties.getProperty().add(p);
CompositeReader compositeReader = new CompositeReader();
LRSpec spec = EasyMock.createMock(LRSpec.class);
EasyMock.expect(spec.getProperties()).andReturn(properties).atLeastOnce();
EasyMock.expect(spec.getReaders()).andReturn(new LRSpec.Readers()).atLeastOnce();
EasyMock.replay(spec);
compositeReader.initialize("compositeReader", spec);
LRProperty p2 = compositeReader.getProperties().get(0);
Assert.assertEquals(p, p2);
EasyMock.verify(spec);
EasyMock.verify(p);
}
/**
* test the initialization method complete with all steps.
* @throws ImplementationException failure.
*/
@Test
public void testInitializeAddReaders() throws ImplementationException {
final String propertyName = "propertyName";
final String propertyValue = "propertyValue";
LRSpec.Properties properties = new LRSpec.Properties();
LRProperty p = EasyMock.createMock(LRProperty.class);
EasyMock.expect(p.getName()).andReturn(propertyName);
EasyMock.expect(p.getValue()).andReturn(propertyValue);
EasyMock.replay(p);
properties.getProperty().add(p);
final String logicalReaderName1 = "logicalReader1";
LRSpec.Readers readers = new LRSpec.Readers();
readers.getReader().add(logicalReaderName1);
CompositeReader compositeReader = new CompositeReader();
LRSpec spec = EasyMock.createMock(LRSpec.class);
EasyMock.expect(spec.getProperties()).andReturn(properties).atLeastOnce();
EasyMock.expect(spec.getReaders()).andReturn(readers).atLeastOnce();
EasyMock.replay(spec);
LogicalReader logicalReader = EasyMock.createMock(LogicalReader.class);
EasyMock.expect(logicalReader.getName()).andReturn(logicalReaderName1).atLeastOnce();
logicalReader.addObserver(compositeReader);
EasyMock.expectLastCall();
logicalReader.deleteObserver(compositeReader);
EasyMock.expectLastCall();
EasyMock.replay(logicalReader);
LogicalReaderManager lrm = EasyMock.createMock(LogicalReaderManager.class);
EasyMock.expect(lrm.getLogicalReader(logicalReaderName1)).andReturn(logicalReader);
EasyMock.replay(lrm);
compositeReader.setLogicalReaderManager(lrm);
compositeReader.initialize("compositeReader", spec);
compositeReader.unregisterAsObserver();
LRProperty p2 = compositeReader.getProperties().get(0);
Assert.assertEquals(p, p2);
EasyMock.verify(spec);
EasyMock.verify(p);
EasyMock.verify(lrm);
EasyMock.verify(logicalReader);
}
/**
* test that incoming tags are notified
* @throws ImplementationException failure.
*/
@Test
public void testUpdateFromTag() throws ImplementationException {
Tag tag = new Tag();
tag.setTagID("hello".getBytes());
TestUpdateHelper reader = new TestUpdateHelper();
reader.setName("reader");
reader.stop();
reader.update(reader, tag);
Assert.assertFalse(reader.changed);
reader.start();
reader.update(reader, this);
Assert.assertFalse(reader.changed);
reader.update(reader, tag);
Assert.assertTrue(reader.changed);
Assert.assertEquals("hello", new String(((Tag) reader.object).getTagID()));
Assert.assertEquals("reader", ((Tag) reader.object).getReader());
}
/**
* test that incoming tags are notified
* @throws ImplementationException failure.
*/
@Test
public void testUpdateFromTags() throws ImplementationException {
Tag tag = new Tag();
tag.setTagID("hello".getBytes());
List<Tag> tags = new LinkedList<Tag> ();
tags.add(tag);
TestUpdateHelper reader = new TestUpdateHelper();
reader.setName("reader");
reader.stop();
reader.update(reader, tags);
Assert.assertFalse(reader.changed);
reader.start();
reader.update(reader, this);
Assert.assertFalse(reader.changed);
reader.update(reader, tags);
Assert.assertTrue(reader.changed);
@SuppressWarnings("unchecked")
List<Tag> res = (List<Tag>) reader.object;
Assert.assertEquals(1, res.size());
Tag resTag = res.get(0);
Assert.assertEquals("hello", new String(resTag.getTagID()));
Assert.assertEquals("reader", resTag.getReader());
}
/**
* helper class we need for testing the notify mechanisms.
* @author swieland
*
*/
private class TestUpdateHelper extends CompositeReader {
public Object object;
public boolean changed;
@Override
public void notifyObservers(Object arg) {
object = arg;
}
@Override
public synchronized void setChanged() {
changed = true;
}
}
}