/** * Copyright (C) 2014 KAIST * @author Janggwan Im <limg00n@kaist.ac.kr> */ package org.fosstrak.ale.server.test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.StringWriter; import java.util.ArrayList; import java.util.List; import junit.framework.Assert; import org.apache.log4j.Logger; import org.fosstrak.ale.exception.DuplicateNameException; import org.fosstrak.ale.exception.ImmutableReaderException; import org.fosstrak.ale.exception.ImplementationException; import org.fosstrak.ale.exception.InUseException; import org.fosstrak.ale.exception.NoSuchNameException; import org.fosstrak.ale.exception.NonCompositeReaderException; import org.fosstrak.ale.exception.ReaderLoopException; import org.fosstrak.ale.exception.SecurityException; import org.fosstrak.ale.exception.ValidationException; import org.fosstrak.ale.server.ALE; import org.fosstrak.ale.server.cc.ALECC; import org.fosstrak.ale.server.readers.LogicalReaderManager; import org.fosstrak.ale.util.DeserializerUtil; import org.fosstrak.ale.util.SerializerUtil; import org.fosstrak.ale.xsd.ale.epcglobal.CCSpec; import org.fosstrak.ale.xsd.ale.epcglobal.ECSpec; import org.fosstrak.ale.xsd.ale.epcglobal.LRProperty; import org.fosstrak.ale.xsd.ale.epcglobal.LRSpec; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class ALELRConformanceTest { /** logger. */ private static final Logger LOG = Logger.getLogger(ALELRConformanceTest.class); static LogicalReaderManager alelr; static ALE ale; static ALECC alecc; @BeforeClass public static void beforeClass() throws Exception { // please connect readers of EPC 000011112222333344445555 and aaaa11112222333344445555 LOG.info("Initializing Spring context."); ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/applicationContext.xml"); LOG.info("Spring context initialized."); alelr = (LogicalReaderManager) applicationContext.getBean("logicalReaderManager"); ale = (ALE) applicationContext.getBean("ale"); alecc = (ALECC) applicationContext.getBean("alecc"); LRSpec lrspec = DeserializerUtil.deserializeLRSpec(ALELRConformanceTest.class.getResourceAsStream("/lrspecs/LRSpec_LR.xml")); System.out.println("Please connect reader... (timeout: 5000ms)"); Thread.sleep(5000); alelr.define("limg00n_emulator", lrspec); System.out.println("Waiting for reader initialization..."); Thread.sleep(5000); } @Before public void beforeEachTest() throws Exception, ImplementationException, NoSuchNameException, InUseException, ImmutableReaderException { } @Test public void test_L1() throws ImplementationException { assertEquals("1.1", alelr.getStandardVersion()); assertEquals("", alelr.getVendorVersion()); } @Test public void test_L2() throws Exception { // step 1 LRSpec lrspec = DeserializerUtil.deserializeLRSpec(ALELRConformanceTest.class.getResourceAsStream("/lrspecs/LRSpec_L2.xml")); alelr.define("L1", lrspec); // step 2 assertTrue(alelr.getLogicalReaderNames().contains("L1")); // step 3 assertEquals(lrspec, alelr.getLRSpec("L1")); // step 4 alelr.define("L2", lrspec); // step 5 List<String> lrNames = alelr.getLogicalReaderNames(); assertTrue(lrNames.contains("L1") && lrNames.contains("L2")); // step 6 alelr.undefine("L1"); // step 7 assertEquals("L2", alelr.getLogicalReaderNames().get(0)); // step 8 LRSpec lrspec2 = DeserializerUtil.deserializeLRSpec(ALELRConformanceTest.class.getResourceAsStream("/lrspecs/LRSpec_L2_2.xml")); alelr.update("L2", lrspec2); // step 9 assertEquals(lrspec2, alelr.getLRSpec("L2")); // step 10 alelr.undefine("L2"); // step 11 lrNames = alelr.getLogicalReaderNames(); assertTrue(!lrNames.contains("L2")); } @Test public void test_L3() throws Exception { // step 1 LRSpec lrspec = DeserializerUtil.deserializeLRSpec(ALELRConformanceTest.class.getResourceAsStream("/lrspecs/LRSpec_L3_1_Composite.xml")); alelr.define("L1", lrspec); // step 2 List<String> readerNames = alelr.getLogicalReaderNames(); assertTrue(readerNames.contains("L1")); // step 3 List<String> lrNames = new ArrayList<String>(); lrNames.add("limg00n_emulator"); alelr.addReaders("L1", lrNames); // step 4 LRSpec spec = alelr.getLRSpec("L1"); //SerializerUtil.serializeLRSpec(spec, new OutputStreamWriter(System.out)); StringWriter sw = new StringWriter(); SerializerUtil.serializeLRSpec(spec, sw); String outString = sw.toString(); LRSpec expected = DeserializerUtil.deserializeLRSpec(ALELRConformanceTest.class.getResourceAsStream("/lrspecs/LRSpec_L3_4_Expected.xml")); StringWriter expectedSw = new StringWriter(); SerializerUtil.serializeLRSpec(expected, expectedSw); String outExpectedString = expectedSw.toString(); Assert.assertEquals(outExpectedString.substring(outExpectedString.indexOf("<isComposite>")), outString.substring(outString.indexOf("<isComposite>"))); // step 5 alelr.removeReaders("L1", lrNames); spec = alelr.getLRSpec("L1"); //SerializerUtil.serializeLRSpec(spec, new OutputStreamWriter(System.out)); sw = new StringWriter(); SerializerUtil.serializeLRSpec(spec, sw); outString = sw.toString(); expected = DeserializerUtil.deserializeLRSpec(ALELRConformanceTest.class.getResourceAsStream("/lrspecs/LRSpec_L3_5_Expected.xml")); expectedSw = new StringWriter(); SerializerUtil.serializeLRSpec(expected, expectedSw); outExpectedString = expectedSw.toString(); Assert.assertEquals(outExpectedString.substring(outExpectedString.indexOf("<isComposite>")), outString.substring(outString.indexOf("<isComposite>"))); // step 6 alelr.setReaders("L1", lrNames); // step 7 spec = alelr.getLRSpec("L1"); //SerializerUtil.serializeLRSpec(spec, new OutputStreamWriter(System.out)); sw = new StringWriter(); SerializerUtil.serializeLRSpec(spec, sw); outString = sw.toString(); expected = DeserializerUtil.deserializeLRSpec(ALELRConformanceTest.class.getResourceAsStream("/lrspecs/LRSpec_L3_7_Expected.xml")); expectedSw = new StringWriter(); SerializerUtil.serializeLRSpec(expected, expectedSw); outExpectedString = expectedSw.toString(); Assert.assertEquals(outExpectedString.substring(outExpectedString.indexOf("<isComposite>")), outString.substring(outString.indexOf("<isComposite>"))); // step 8 alelr.undefine("L1"); assertTrue(!alelr.getLogicalReaderNames().contains("L1")); } @Test public void test_L5() throws Exception { // step 1 LRSpec lrspec = DeserializerUtil.deserializeLRSpec(ALELRConformanceTest.class.getResourceAsStream("/lrspecs/LRSpec_L5_1.xml")); alelr.define("LR1", lrspec); // step 2 boolean successFlag = true; try { alelr.define("LR1", lrspec); successFlag = true; } catch(DuplicateNameException e) { successFlag = false; } finally { if(successFlag) Assert.fail(); } // step 3: parameters for Tag Smoothing => skip // step 4 successFlag = true; try { alelr.update("LR3", lrspec); successFlag = true; } catch(NoSuchNameException e) { successFlag = false; } finally { if(successFlag) Assert.fail(); } //---------------- result confirmed // step 5 LRSpec invalidLrspec = DeserializerUtil.deserializeLRSpec(ALELRConformanceTest.class.getResourceAsStream("/lrspecs/LRSpec_L5_invalid.xml")); successFlag = true; try { alelr.update("LR1", invalidLrspec); successFlag = true; } catch(ValidationException e) { successFlag = false; } finally { if(successFlag) Assert.fail(); } // step 6 LRSpec lrspec_6 = DeserializerUtil.deserializeLRSpec(ALELRConformanceTest.class.getResourceAsStream("/lrspecs/LRSpec_L5_6.xml")); alelr.define("LR2", lrspec_6); // step 7 ECSpec ecspec_7 = DeserializerUtil.deserializeECSpec(ALELRConformanceTest.class.getResourceAsStream("/ecspecs/ECSpec_L5_7.xml")); ale.define("EC1", ecspec_7); // step 8 ale.subscribe("EC1", "http://localhost:9999"); // step 9 synchronized(this) { this.wait(2000); } // step 10 successFlag = true; try { LRSpec lrspec_10 = DeserializerUtil.deserializeLRSpec(ALELRConformanceTest.class.getResourceAsStream("/lrspecs/LRSpec_L5_10.xml")); alelr.update("LR2", lrspec_10); successFlag = true; } catch(InUseException e) { successFlag = false; } finally { if(successFlag) Assert.fail(); } // step 11 ale.unsubscribe("EC1", "http://localhost:9999"); // step 12 : externally-defined reader => skip // step 13 successFlag = true; try { LRSpec lrspec_13 = DeserializerUtil.deserializeLRSpec(ALELRConformanceTest.class.getResourceAsStream("/lrspecs/LRSpec_L5_13.xml")); alelr.update("LR1", lrspec_13); successFlag = true; } catch(ReaderLoopException e) { successFlag = false; } finally { if(successFlag) Assert.fail(); } // step 14 successFlag = true; try { alelr.undefine("LR3"); successFlag = true; } catch(NoSuchNameException e) { successFlag = false; } finally { if(successFlag) Assert.fail(); } ale.subscribe("EC1", "http://localhost:9999"); synchronized (this) { this.wait(2000); } successFlag = true; try { alelr.undefine("LR2"); successFlag = true; } catch(InUseException e) { successFlag = false; } finally { if(successFlag) Assert.fail(); } ale.unsubscribe("EC1", "http://localhost:9999"); // step 15 successFlag = true; try { alelr.getLRSpec("LR3"); successFlag = true; } catch(NoSuchNameException e) { successFlag = false; } finally { if(successFlag) Assert.fail(); } // step 16 successFlag = true; try { alelr.addReaders("LR3", new ArrayList<String>()); successFlag = true; } catch(NoSuchNameException e) { successFlag = false; } finally { if(successFlag) Assert.fail(); } // step 17 successFlag = true; try { List<String> readerList = new ArrayList<String>(); readerList.add("unknown_reader"); alelr.addReaders("LR1", readerList); successFlag = true; } catch(ValidationException e) { successFlag = false; } finally { if(successFlag) Assert.fail(); } // step 18 ale.subscribe("EC1", "http://localhost:9999"); synchronized (this) { this.wait(2000); } successFlag = true; try { List<String> readerList = new ArrayList<String>(); readerList.add("LR1"); alelr.addReaders("LR2", readerList); successFlag = true; } catch(InUseException e) { successFlag = false; } finally { if(successFlag) Assert.fail(); } ale.unsubscribe("EC1", "http://localhost:9999"); // step 19 : externally-defined reader name => skip // step 20 LRSpec lrspec_20 = DeserializerUtil.deserializeLRSpec(ALELRConformanceTest.class.getResourceAsStream("/lrspecs/LRSpec_L5_20.xml")); alelr.define("LR4", lrspec_20); // step 21 try { List<String> readerList = new ArrayList<String>(); readerList.add("limg00n_emulator"); alelr.addReaders("LR4", readerList); successFlag = true; } catch(NonCompositeReaderException e) { successFlag = false; } finally { if(successFlag) Assert.fail(); } // step 22 try { List<String> readerList = new ArrayList<String>(); readerList.add("LR1"); alelr.addReaders("LR1", readerList); successFlag = true; } catch(ReaderLoopException e) { successFlag = false; } finally { if(successFlag) Assert.fail(); } // step 23 // step 16 successFlag = true; try { alelr.setReaders("LR3", new ArrayList<String>()); successFlag = true; } catch(NoSuchNameException e) { successFlag = false; } finally { if(successFlag) Assert.fail(); } // step 17 successFlag = true; try { List<String> readerList = new ArrayList<String>(); readerList.add("unknown_reader"); alelr.setReaders("LR1", readerList); successFlag = true; } catch(ValidationException e) { successFlag = false; } finally { if(successFlag) Assert.fail(); } // step 18 ale.subscribe("EC1", "http://localhost:9999"); synchronized (this) { this.wait(2000); } successFlag = true; try { List<String> readerList = new ArrayList<String>(); readerList.add("LR1"); alelr.setReaders("LR2", readerList); successFlag = true; } catch(InUseException e) { successFlag = false; } finally { if(successFlag) Assert.fail(); } ale.unsubscribe("EC1", "http://localhost:9999"); // step 19 : externally-defined reader name => skip // step 20 try { LRSpec lrspec_23 = DeserializerUtil.deserializeLRSpec(ALELRConformanceTest.class.getResourceAsStream("/lrspecs/LRSpec_L5_23.xml")); alelr.define("LR4", lrspec_23); successFlag = true; } catch(DuplicateNameException e) { successFlag = false; } finally { if(successFlag) Assert.fail(); } // step 21 try { List<String> readerList = new ArrayList<String>(); readerList.add("limg00n_emulator"); alelr.setReaders("LR4", readerList); successFlag = true; } catch(NonCompositeReaderException e) { successFlag = false; } finally { if(successFlag) Assert.fail(); } // step 22 try { List<String> readerList = new ArrayList<String>(); readerList.add("LR1"); alelr.setReaders("LR1", readerList); successFlag = true; } catch(ReaderLoopException e) { successFlag = false; } finally { if(successFlag) Assert.fail(); } // step 24 // step 16 successFlag = true; try { alelr.removeReaders("LR3", new ArrayList<String>()); successFlag = true; } catch(NoSuchNameException e) { successFlag = false; } finally { if(successFlag) Assert.fail(); } // step 18 ale.subscribe("EC1", "http://localhost:9999"); synchronized(this) { this.wait(2000); } successFlag = true; try { List<String> readerList = new ArrayList<String>(); readerList.add("LR1"); alelr.removeReaders("LR2", readerList); successFlag = true; } catch(InUseException e) { successFlag = false; } finally { if(successFlag) Assert.fail(); } ale.unsubscribe("EC1", "http://localhost:9999"); // step 19 : externally-defined reader name => skip // step 20 try { LRSpec lrspec_24 = DeserializerUtil.deserializeLRSpec(ALELRConformanceTest.class.getResourceAsStream("/lrspecs/LRSpec_L5_24.xml")); alelr.define("LR4", lrspec_24); successFlag = true; } catch(DuplicateNameException e) { successFlag = false; } finally { if(successFlag) Assert.fail(); } // step 21 try { List<String> readerList = new ArrayList<String>(); readerList.add("limg00n_emulator"); alelr.removeReaders("LR4", readerList); successFlag = true; } catch(NonCompositeReaderException e) { successFlag = false; } finally { if(successFlag) Assert.fail(); } // step 25 try { List<LRProperty> properties = new ArrayList<LRProperty>(); LRProperty e = new LRProperty(); e.setName("Description"); e.setValue("LLRP Reader"); properties.add(e); alelr.setProperties("LR3", properties); successFlag = true; } catch(NoSuchNameException e) { successFlag = false; } finally { if(successFlag) Assert.fail(); } // step 26 try { List<LRProperty> properties = new ArrayList<LRProperty>(); LRProperty e = new LRProperty(); e.setName("isComposite"); e.setValue("I don't know"); properties.add(e); alelr.setProperties("LR1", properties); successFlag = true; } catch(ValidationException e) { successFlag = false; } finally { if(successFlag) Assert.fail(); } // step 27 // step 8 ale.subscribe("EC1", "http://localhost:9999"); // step 9 synchronized(this) { this.wait(2000); } // step 10 successFlag = true; try { List<LRProperty> properties = new ArrayList<LRProperty>(); LRProperty e = new LRProperty(); e.setName("Description"); e.setValue("LLRP Reader"); properties.add(e); alelr.setProperties("LR2", properties); successFlag = true; } catch(InUseException e) { successFlag = false; } finally { if(successFlag) Assert.fail(); } // step 11 ale.unsubscribe("EC1", "http://localhost:9999"); // step 28 : externally-defined reader name => skip // step 29 System.out.println(alelr.getLogicalReaderNames()); successFlag = true; try { alelr.undefine("LR2"); successFlag = true; } catch(InUseException e) { successFlag = false; } finally { if(successFlag) Assert.fail(); } // step 30 ale.undefine("EC1"); // step 31 alelr.undefine("LR1"); alelr.undefine("LR2"); alelr.undefine("LR4"); } @Test public void test_L6() throws Exception { // step 1 LRSpec lrspec = DeserializerUtil.deserializeLRSpec(ALELRConformanceTest.class.getResourceAsStream("/lrspecs/LRSpec_L6.xml")); alelr.define("L1", lrspec); // step 2 assertEquals(lrspec, alelr.getLRSpec("L1")); // step 3 ECSpec ecspec = (ECSpec) DeserializerUtil.deserializeECSpec(getClass().getResourceAsStream("/ecspecs/ECSpec_L6.xml")); ale.define("eventcycle1", ecspec); // step 4 : TODO repeat step 3 for a CCSpec CCSpec ccspec = DeserializerUtil.deserializeCCSpec(getClass().getResourceAsStream("/ccspecs/CCSpec_L6.xml"));; alecc.define("commandcycle1", ccspec); } }