/*
* 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.server.test;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;
import junit.framework.Assert;
import org.easymock.EasyMock;
import org.fosstrak.ale.exception.DuplicateSubscriptionException;
import org.fosstrak.ale.exception.InvalidURIException;
import org.fosstrak.ale.exception.NoSuchSubscriberException;
import org.fosstrak.ale.server.EventCycle;
import org.fosstrak.ale.server.ReportsGenerator;
import org.fosstrak.ale.server.Tag;
import org.fosstrak.ale.server.impl.EventCycleImpl;
import org.fosstrak.ale.server.readers.LogicalReader;
import org.fosstrak.ale.server.readers.LogicalReaderManager;
import org.fosstrak.ale.util.DeserializerUtil;
import org.fosstrak.ale.xsd.ale.epcglobal.ECReport;
import org.fosstrak.ale.xsd.ale.epcglobal.ECReportGroupListMember;
import org.fosstrak.ale.xsd.ale.epcglobal.ECReports;
import org.fosstrak.ale.xsd.ale.epcglobal.ECSpec;
import org.fosstrak.tdt.TDTEngine;
import org.junit.Test;
/**
* small test suite in order to test a minimum of the eventcycles behavior.<br/>
* basically this means:<br/>
* <ol>
* <li>start an event cycle</li>
* <li>deliver some tags into the cycle</li>
* <li>wait for the cycle to go through and obtain the reports</li>
* <li>check the report contains the given tags</li>
* </ol>
* @author swieland
*
*/
public class EventCycleTest {
private final String TAG1_BINARY = "001100000110100011100101110101100011000011001101000011110010100100011011111001011110100011011100";
private final String TAG1_PURE_URI = "urn:epc:tag:sgtin-96:3.3856019661.060.176561711324";
private final String TAG2_BINARY = "001100000010001110010110110100010010101001000111010100001001010010100000100000001010110100111011";
private final String TAG2_PURE_URI = "urn:epc:tag:sgtin-96:1.986572296660.2.88592133435";
private final String TAG3_BINARY = "001100000011100110110100111011000100110010011100001110000111001000001011010101011110101100111111";
private final String TAG3_PURE_URI = "urn:epc:tag:sgtin-96:1.447409.3305697.214938544959";
@Test
public void testPrintHex() throws Exception {
TDTEngine tdt = new TDTEngine();
Map<String, String> extraparms = new HashMap<String, String> ();
extraparms.put("taglength", "96");
extraparms.put("filter", "3");
extraparms.put("gs1companyprefixlength", "7");
//String hex = tdt.convert(line, extraparms, LevelTypeList.TAG_ENCODING);
System.out.println(tdt.bin2hex(TAG1_BINARY));
System.out.println(tdt.bin2hex(TAG2_BINARY));
System.out.println(tdt.bin2hex(TAG3_BINARY));
}
@Test
public void testCycleWithOneRound() throws Exception {
ECSpec ecspec = DeserializerUtil.deserializeECSpec(EventCycleTest.class.getResourceAsStream("/ecspecs/eventCycle-testOneRound.xml"));
final String logicalReaderName1 = "LogicalReader1";
LogicalReader lr1 = EasyMock.createMock(LogicalReader.class);
EasyMock.expect(lr1.getName()).andReturn(logicalReaderName1).anyTimes();
lr1.addObserver(EasyMock.isA(EventCycle.class));
EasyMock.expectLastCall().anyTimes();
EasyMock.replay(lr1);
LogicalReaderManager manager = EasyMock.createMock(LogicalReaderManager.class);
EasyMock.expect(manager.contains(logicalReaderName1)).andReturn(true).anyTimes();
EasyMock.expect(manager.getLogicalReader(logicalReaderName1)).andReturn(lr1).anyTimes();
EasyMock.replay(manager);
ReportsGenerator reportsGenerator = EasyMock.createMock(ReportsGenerator.class);
EasyMock.expect(reportsGenerator.getName()).andReturn("generator").anyTimes();
EasyMock.expect(reportsGenerator.getSpec()).andReturn(ecspec).anyTimes();
EasyMock.expect(reportsGenerator.isWhenDataAvailable()).andReturn(false).anyTimes(); // limg00n added
reportsGenerator.notifySubscribers(EasyMock.isA(ECReports.class), EasyMock.isA(EventCycle.class));
// need a handle onto the spec delivered for the reader creation.
final AtomicReference<ECReports> ref = new AtomicReference<ECReports>();
EasyMock.expectLastCall().andDelegateTo(new ReportsGenerator() {
@Override
public void unsubscribe(String notificationURI) throws NoSuchSubscriberException, InvalidURIException { }
@Override
public void subscribe(String notificationURI) throws DuplicateSubscriptionException, InvalidURIException { }
@Override
public void poll() { }
@Override
public void notifySubscribers(ECReports reports, EventCycle ec) {
// store the reports for later test analysis
ref.set(reports);
}
@Override
public List<String> getSubscribers() { return null; }
@Override
public boolean isStateRequested() { return true; }
@Override
public ECSpec getSpec() { return null; }
@Override
public ECReports getPollReports() { return null; }
@Override
public String getName() { return null; }
@Override
public void setStateRequested() { }
@Override
public void setStateUnRequested() { }
@Override
public boolean isStateUnRequested() { return false; }
@Override
public boolean isWhenDataAvailable() {
return false;
}
});
EasyMock.replay(reportsGenerator);
final EventCycle cycle = new EventCycleImpl(reportsGenerator, manager);
final Tag t1 = new Tag();
t1.setTagAsBinary(TAG1_BINARY);
t1.setTagIDAsPureURI(TAG1_PURE_URI);
final Tag t2 = new Tag();
t2.setTagAsBinary(TAG2_BINARY);
t2.setTagIDAsPureURI(TAG2_PURE_URI);
final Tag t3 = new Tag();
t3.setTagAsBinary(TAG3_BINARY);
t3.setTagIDAsPureURI(TAG3_PURE_URI);
final List<Tag> tags = new LinkedList<Tag> ();
tags.add(t2);
tags.add(t3);
Assert.assertFalse(((EventCycleImpl) cycle).isRoundOver());
Thread sender = new Thread(new Runnable(){
@Override
public void run() {
try {
while (true) {
cycle.update(null, t1);
cycle.update(null, tags);
Thread.sleep(100);
}
} catch (InterruptedException e) {
System.out.println("got interrupted - quitting.");
}
}
});
sender.start();
// execute the eventcycle once and check the result...
cycle.launch();
Thread.sleep(2000L);
sender.interrupt();
EasyMock.verify(lr1);
EasyMock.verify(manager);
EasyMock.verify(reportsGenerator);
ECReports reports = ref.get();
Assert.assertNotNull(reports);
Assert.assertEquals("DURATION", reports.getTerminationCondition());
List<ECReport> ecReports = reports.getReports().getReport();
Assert.assertNotNull(ecReports);
Assert.assertEquals(1, ecReports.size());
ECReport report = ecReports.get(0);
Assert.assertNotNull(report);
List<ECReportGroupListMember> gmember = report.getGroup().get(0).getGroupList().getMember();
Assert.assertEquals(3, gmember.size());
boolean t1Contained = false;
boolean t2Contained = false;
boolean t3Contained = false;
for (ECReportGroupListMember member : gmember) {
if (TAG1_PURE_URI.equalsIgnoreCase(member.getTag().getValue())) {
t1Contained = true;
}
if (TAG2_PURE_URI.equalsIgnoreCase(member.getTag().getValue())) {
t2Contained = true;
}
if (TAG3_PURE_URI.equalsIgnoreCase(member.getTag().getValue())) {
t3Contained = true;
}
}
Assert.assertTrue(t1Contained);
Assert.assertTrue(t2Contained);
Assert.assertTrue(t3Contained);
Assert.assertNotNull(cycle.getLastReports());
Assert.assertTrue(((EventCycleImpl) cycle).isRoundOver());
Assert.assertEquals(1, cycle.getRounds());
}
}