/*
* 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.persistence.test;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.util.Arrays;
import java.util.Properties;
import org.easymock.EasyMock;
import org.fosstrak.ale.server.ALE;
import org.fosstrak.ale.server.llrp.LLRPControllerManager;
import org.fosstrak.ale.server.persistence.impl.ReadConfigImpl;
import org.fosstrak.ale.server.persistence.type.PersistenceConfig;
import org.fosstrak.ale.server.persistence.util.FileUtils;
import org.fosstrak.ale.server.readers.LogicalReaderManager;
import org.fosstrak.ale.util.SerializerUtil;
import org.fosstrak.ale.xsd.ale.epcglobal.ECSpec;
import org.fosstrak.ale.xsd.ale.epcglobal.LRSpec;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import org.llrp.ltk.generated.messages.ADD_ACCESSSPEC;
import org.llrp.ltk.generated.messages.ADD_ROSPEC;
import util.ECElementsUtils;
/**
* test the loading API of the persistence API.
*
* @author swieland
*
*/
public class ReadConfigTest {
@Rule
public TemporaryFolder tempFolder = new TemporaryFolder();
/**
* test the creation of persisted ECSpecs.
* @throws Exception test failure.
*/
@Test
public void testReadECSpecs() throws Exception {
tempFolder.create();
File f = tempFolder.newFile("ecspec.xml");
final String fileName = f.getName();
// absolute path encodes the filename, thus remove it.
final String path = f.getAbsolutePath().replace(fileName, "");
ECSpec spec = ECElementsUtils.createECSpec();
SerializerUtil.serializeECSpec(spec, new FileOutputStream(f));
FileUtils fileUtils = EasyMock.createMock(FileUtils.class);
EasyMock.expect(fileUtils.getFilesName(path, FileUtils.FILE_ENDING_XML)).andReturn(Arrays.asList(new String[] { fileName } ));
EasyMock.replay(fileUtils);
PersistenceConfig persistenceConfig = EasyMock.createMock(PersistenceConfig.class);
EasyMock.expect(persistenceConfig.getRealPathECSpecDir()).andReturn(path).atLeastOnce();
EasyMock.replay(persistenceConfig);
ALE ale = EasyMock.createMock(ALE.class);
ale.define(EasyMock.eq("ecspec"), EasyMock.isA(ECSpec.class));
EasyMock.expectLastCall();
EasyMock.replay(ale);
ReadConfigImpl readConfig = new ReadConfigImpl();
readConfig.setFileUtils(fileUtils);
readConfig.setPersistenceConfig(persistenceConfig);
readConfig.setAle(ale);
// TEST
readConfig.readECSpecs();
EasyMock.verify(fileUtils);
EasyMock.verify(persistenceConfig);
EasyMock.verify(ale);
}
/**
* test the subscription.
* @throws Exception test failure.
*/
@Test
public void testReadECSpecsSubscriber() throws Exception {
tempFolder.create();
File f = tempFolder.newFile("current.properties");
final String fileName = f.getName();
// absolute path encodes the filename, thus remove it.
final String path = f.getAbsolutePath().replace(fileName, "");
final String url1 = "url1";
final String url2 = "url2";
Properties p = new Properties();
p.setProperty("url_1", url1);
p.setProperty("url_2", url2);
p.store(new FileOutputStream(f), null);
FileUtils fileUtils = EasyMock.createMock(FileUtils.class);
EasyMock.expect(fileUtils.getFilesName(path, FileUtils.FILE_ENDING_PROPERTES)).andReturn(Arrays.asList(new String[] { fileName } ));
EasyMock.replay(fileUtils);
PersistenceConfig persistenceConfig = EasyMock.createMock(PersistenceConfig.class);
EasyMock.expect(persistenceConfig.getRealPathECSpecSubscriberDir()).andReturn(path).atLeastOnce();
EasyMock.replay(persistenceConfig);
ALE ale = EasyMock.createMock(ALE.class);
ale.subscribe("current", url1);
EasyMock.expectLastCall();
ale.subscribe("current", url2);
EasyMock.expectLastCall();
EasyMock.replay(ale);
ReadConfigImpl readConfig = new ReadConfigImpl();
readConfig.setFileUtils(fileUtils);
readConfig.setPersistenceConfig(persistenceConfig);
readConfig.setAle(ale);
// TEST
readConfig.readECSpecsSubscriber();
EasyMock.verify(fileUtils);
EasyMock.verify(persistenceConfig);
EasyMock.verify(ale);
}
/**
* test the loading of the logical readers.
* @throws Exception test failure.
*/
@Test
public void testReadLRSpec() throws Exception {
tempFolder.create();
File f = tempFolder.newFile("LogicalReader1.xml");
final String fileName = f.getName();
// absolute path encodes the filename, thus remove it.
final String path = f.getAbsolutePath().replace(fileName, "");
FileOutputStream fos = new FileOutputStream(f);
BufferedOutputStream bfos = new BufferedOutputStream(fos);
bfos.write("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><ns3:LRSpec xmlns:ns2=\"urn:epcglobal:ale:wsdl:1\" xmlns:ns3=\"urn:epcglobal:ale:xsd:1\"><isComposite>false</isComposite><readers/><properties><property><name>ReaderType</name><value>org.fosstrak.ale.server.readers.hal.HALAdaptor</value></property><property><name>Description</name><value>My first HAL device reader</value></property><property><name>PhysicalReaderName</name><value>MyReader1</value></property><property><name>ReadTimeInterval</name><value>1000</value></property><property><name>PropertiesFile</name><value>/props/SimulatorController.xml</value></property></properties></ns3:LRSpec>".getBytes());
bfos.close();
FileUtils fileUtils = EasyMock.createMock(FileUtils.class);
EasyMock.expect(fileUtils.getFilesName(path, FileUtils.FILE_ENDING_XML)).andReturn(Arrays.asList(new String[] { fileName } ));
EasyMock.replay(fileUtils);
PersistenceConfig persistenceConfig = EasyMock.createMock(PersistenceConfig.class);
EasyMock.expect(persistenceConfig.getRealPathLRSpecDir()).andReturn(path).atLeastOnce();
EasyMock.replay(persistenceConfig);
LogicalReaderManager logicalReaderManager = EasyMock.createMock(LogicalReaderManager.class);
logicalReaderManager.define(EasyMock.eq("LogicalReader1"), EasyMock.isA(LRSpec.class));
EasyMock.replay(logicalReaderManager);
ReadConfigImpl readConfig = new ReadConfigImpl();
readConfig.setFileUtils(fileUtils);
readConfig.setPersistenceConfig(persistenceConfig);
readConfig.setLogicalReaderManager(logicalReaderManager);
// TEST
readConfig.readLRSpecs();
EasyMock.verify(fileUtils);
EasyMock.verify(persistenceConfig);
EasyMock.verify(logicalReaderManager);
}
/**
* test the loading of the ro specs.
* @throws Exception test failure.
*/
@Test
public void testReadAddROSpec() throws Exception {
tempFolder.create();
File f = tempFolder.newFile("rospec.llrp");
final String fileName = f.getName();
// absolute path encodes the filename, thus remove it.
final String path = f.getAbsolutePath().replace(fileName, "");
FileOutputStream fos = new FileOutputStream(f);
BufferedOutputStream bfos = new BufferedOutputStream(fos);
bfos.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?><llrp:ADD_ROSPEC xmlns:llrp=\"http://www.llrp.org/ltk/schema/core/encoding/xml/1.0\" xmlns:Impinj=\"http://developer.impinj.com/ltk/schema/encoding/xml/1.0\" Version=\"1\" MessageID=\"4\"><llrp:ROSpec><llrp:ROSpecID>1</llrp:ROSpecID><llrp:Priority>0</llrp:Priority><llrp:CurrentState>Disabled</llrp:CurrentState><llrp:ROBoundarySpec><llrp:ROSpecStartTrigger><llrp:ROSpecStartTriggerType>Null</llrp:ROSpecStartTriggerType></llrp:ROSpecStartTrigger><llrp:ROSpecStopTrigger><llrp:ROSpecStopTriggerType>Null</llrp:ROSpecStopTriggerType><llrp:DurationTriggerValue>0</llrp:DurationTriggerValue></llrp:ROSpecStopTrigger></llrp:ROBoundarySpec><llrp:AISpec><llrp:AntennaIDs>0</llrp:AntennaIDs><llrp:AISpecStopTrigger><llrp:AISpecStopTriggerType>Null</llrp:AISpecStopTriggerType><llrp:DurationTrigger>0</llrp:DurationTrigger></llrp:AISpecStopTrigger><llrp:InventoryParameterSpec><llrp:InventoryParameterSpecID>9</llrp:InventoryParameterSpecID><llrp:ProtocolID>EPCGlobalClass1Gen2</llrp:ProtocolID></llrp:InventoryParameterSpec></llrp:AISpec></llrp:ROSpec></llrp:ADD_ROSPEC>".getBytes());
bfos.close();
FileUtils fileUtils = EasyMock.createMock(FileUtils.class);
EasyMock.expect(fileUtils.getFilesName(path, FileUtils.FILE_ENDING_LLRP)).andReturn(Arrays.asList(new String[] { fileName } ));
EasyMock.replay(fileUtils);
PersistenceConfig persistenceConfig = EasyMock.createMock(PersistenceConfig.class);
EasyMock.expect(persistenceConfig.getRealPathROSpecDir()).andReturn(path).atLeastOnce();
EasyMock.replay(persistenceConfig);
LLRPControllerManager logicalReaderManager = EasyMock.createMock(LLRPControllerManager.class);
logicalReaderManager.define(EasyMock.eq("rospec"), EasyMock.isA(ADD_ROSPEC.class));
EasyMock.replay(logicalReaderManager);
ReadConfigImpl readConfig = new ReadConfigImpl();
readConfig.setFileUtils(fileUtils);
readConfig.setPersistenceConfig(persistenceConfig);
readConfig.setLlrpControllerManager(logicalReaderManager);
// TEST
readConfig.readAddROSpecs();
EasyMock.verify(fileUtils);
EasyMock.verify(persistenceConfig);
EasyMock.verify(logicalReaderManager);
}
/**
* test the loading of the access specs.
* @throws Exception test failure.
*/
@Test
public void testAddAccessSpec() throws Exception {
tempFolder.create();
File f = tempFolder.newFile("access.llrp");
final String fileName = f.getName();
// absolute path encodes the filename, thus remove it.
final String path = f.getAbsolutePath().replace(fileName, "");
FileOutputStream fos = new FileOutputStream(f);
BufferedOutputStream bfos = new BufferedOutputStream(fos);
bfos.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?><llrp:ADD_ACCESSSPEC xmlns:llrp=\"http://www.llrp.org/ltk/schema/core/encoding/xml/1.0\" xmlns:Impinj=\"http://developer.impinj.com/ltk/schema/encoding/xml/1.0\" Version=\"1\" MessageID=\"5\"><llrp:AccessSpec><llrp:AccessSpecID>1</llrp:AccessSpecID><llrp:AntennaID>0</llrp:AntennaID><llrp:ProtocolID>EPCGlobalClass1Gen2</llrp:ProtocolID><llrp:CurrentState>Disabled</llrp:CurrentState><llrp:ROSpecID>1</llrp:ROSpecID><llrp:AccessSpecStopTrigger><llrp:AccessSpecStopTrigger>Null</llrp:AccessSpecStopTrigger><llrp:OperationCountValue>0</llrp:OperationCountValue></llrp:AccessSpecStopTrigger><llrp:AccessCommand><llrp:C1G2TagSpec><llrp:C1G2TargetTag><llrp:MB>0</llrp:MB><llrp:Match>1</llrp:Match><llrp:Pointer>0</llrp:Pointer><llrp:TagMask>ffffffff</llrp:TagMask><llrp:TagData>01010101</llrp:TagData></llrp:C1G2TargetTag></llrp:C1G2TagSpec><llrp:C1G2Write><llrp:OpSpecID>1</llrp:OpSpecID><llrp:AccessPassword>0</llrp:AccessPassword><llrp:MB>0</llrp:MB><llrp:WordPointer>0</llrp:WordPointer><llrp:WriteData>ffff ffff</llrp:WriteData></llrp:C1G2Write></llrp:AccessCommand></llrp:AccessSpec></llrp:ADD_ACCESSSPEC>".getBytes());
bfos.close();
FileUtils fileUtils = EasyMock.createMock(FileUtils.class);
EasyMock.expect(fileUtils.getFilesName(path, FileUtils.FILE_ENDING_LLRP)).andReturn(Arrays.asList(new String[] { fileName } ));
EasyMock.replay(fileUtils);
PersistenceConfig persistenceConfig = EasyMock.createMock(PersistenceConfig.class);
EasyMock.expect(persistenceConfig.getRealPathAccessSpecDir()).andReturn(path).atLeastOnce();
EasyMock.replay(persistenceConfig);
LLRPControllerManager logicalReaderManager = EasyMock.createMock(LLRPControllerManager.class);
logicalReaderManager.defineAccessSpec(EasyMock.eq("access"), EasyMock.isA(ADD_ACCESSSPEC.class));
EasyMock.replay(logicalReaderManager);
ReadConfigImpl readConfig = new ReadConfigImpl();
readConfig.setFileUtils(fileUtils);
readConfig.setPersistenceConfig(persistenceConfig);
readConfig.setLlrpControllerManager(logicalReaderManager);
// TEST
readConfig.readAddAccessSpecs();
EasyMock.verify(fileUtils);
EasyMock.verify(persistenceConfig);
EasyMock.verify(logicalReaderManager);
}
}