/* * Copyright 2013, CMM, University of Queensland. * * This file is part of Paul. * * Paul is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Paul 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Paul. If not, see <http://www.gnu.org/licenses/>. */ package au.edu.uq.cmm.paul.servlet; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Persistence; import javax.persistence.TypedQuery; import org.apache.log4j.Logger; import org.easymock.EasyMock; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import au.edu.uq.cmm.aclslib.config.ConfigurationException; import au.edu.uq.cmm.eccles.FacilitySession; import au.edu.uq.cmm.eccles.StaticEcclesProxyConfiguration; import au.edu.uq.cmm.paul.GrabberFacilityConfig; import au.edu.uq.cmm.paul.Paul; import au.edu.uq.cmm.paul.StaticPaulConfiguration; import au.edu.uq.cmm.paul.StaticPaulFacilities; import au.edu.uq.cmm.paul.StaticPaulFacility; import au.edu.uq.cmm.paul.status.Facility; import au.edu.uq.cmm.paul.watcher.DummyUncPathnameMapper; import au.edu.uq.cmm.paul.watcher.UncPathnameMapper; public class ConfigurationManagerTest { private static EntityManagerFactory EMF; private static Logger LOG = Logger.getLogger(ConfigurationManagerTest.class); @BeforeClass public static void setup() { EMF = Persistence.createEntityManagerFactory("au.edu.uq.cmm.paul"); EntityManager em = EMF.createEntityManager(); try { em.getTransaction().begin(); TypedQuery<FacilitySession> query = em.createQuery( "From FacilitySession", FacilitySession.class); for (FacilitySession session : query.getResultList()) { em.remove(session); } em.getTransaction().commit(); } finally { emClose(em); } } @AfterClass public static void teardown() { LOG.debug("closing EMF"); EMF.close(); } @Test public void testConstructor() throws ConfigurationException { buildConfigurationManager(); } @Test public void testLoadStaticFacilities() throws ConfigurationException { StaticPaulFacilities facilities = buildStaticFacilities(); List<StaticPaulFacility> list = facilities.getFacilities(); assertEquals(1, list.size()); StaticPaulFacility facility = list.get(0); assertEquals(GrabberFacilityConfig.FileArrivalMode.DIRECT, facility.getFileArrivalMode()); } @Test public void testBuildFacility1() throws ConfigurationException { Facility f = new Facility(); ConfigurationManager cm = buildConfigurationManager(); EntityManager em = EMF.createEntityManager(); try { Map<?, ?> params = buildParamMap( "facilityName", "fred", "localHostId", "", "address", "127.0.0.1", "accessPassword", "", "lastTemplate", "0", "driveName", "", "fileSettlingTime", "1000", "folderName", "//foo/bar", "accessName", "", "facilityDescription", "", "fileArrivalMode", "DIRECT"); assertEquals("{}", cm.buildFacility(f, params, em).toString()); } finally { emClose(em); } } @Test public void testBuildFacility2() throws ConfigurationException { Facility f = new Facility(); ConfigurationManager cm = buildConfigurationManager(); EntityManager em = EMF.createEntityManager(); try { Map<?, ?> params = buildParamMap( "facilityName", "fred", "localHostId", "", "address", "127.0.0.1", "accessPassword", "", "lastTemplate", "x", "driveName", "", "fileSettlingTime", "1000", "folderName", "//foo/bar", "accessName", "", "facilityDescription", "", "fileArrivalMode", "DIRECT"); assertEquals( "{lastTemplate=this value is not a valid integer}", cm.buildFacility(f, params, em).toString()); } finally { emClose(em); } } @Test public void testBuildFacility3() throws ConfigurationException { Facility f = new Facility(); ConfigurationManager cm = buildConfigurationManager(); EntityManager em = EMF.createEntityManager(); try { Map<?, ?> params = buildParamMap( "facilityName", "fred", "localHostId", "", "address", "127.0.0.1", "accessPassword", "", "lastTemplate", "0", "driveName", "", "fileSettlingTime", "zzz", "folderName", "//foo/bar", "accessName", "", "facilityDescription", "", "fileArrivalMode", "DIRECT"); assertEquals( "{fileSettlingTime=this value is not a valid integer}", cm.buildFacility(f, params, em).toString()); } finally { emClose(em); } } @Test public void testBuildFacility4() throws ConfigurationException { Facility f = new Facility(); ConfigurationManager cm = buildConfigurationManager(); EntityManager em = EMF.createEntityManager(); try { Map<?, ?> params = buildParamMap( "facilityName", "", "localHostId", "", "address", "127.0.0.1", "accessPassword", "", "lastTemplate", "0", "driveName", "", "fileSettlingTime", "1000", "folderName", "//foo/bar", "accessName", "", "facilityDescription", "", "fileArrivalMode", "DIRECT"); assertEquals( "{facilityName=this field must not be empty}", cm.buildFacility(f, params, em).toString()); } finally { emClose(em); } } @Test public void testBuildFacility5() throws ConfigurationException { Facility f = new Facility(); ConfigurationManager cm = buildConfigurationManager(); EntityManager em = EMF.createEntityManager(); try { Map<?, ?> params = buildParamMap( "facilityName", "fred", "localHostId", "", "address", "", "accessPassword", "", "lastTemplate", "0", "driveName", "", "fileSettlingTime", "1000", "folderName", "//foo/bar", "accessName", "", "facilityDescription", "", "fileArrivalMode", "DIRECT"); assertEquals( "{localHostId=the local host id must be non-empty if address is empty}", cm.buildFacility(f, params, em).toString()); } finally { emClose(em); } } @Test public void testBuildFacility6() throws ConfigurationException { Facility f = new Facility(); ConfigurationManager cm = buildConfigurationManager(); EntityManager em = EMF.createEntityManager(); try { Map<?, ?> params = buildParamMap( "facilityName", "fred", "localHostId", "1234", "address", "", "accessPassword", "", "lastTemplate", "0", "driveName", "", "fileSettlingTime", "1000", "folderName", "", "accessName", "", "facilityDescription", "", "fileArrivalMode", "DIRECT"); assertEquals( "{folderName=this field must not be empty}", cm.buildFacility(f, params, em).toString()); } finally { emClose(em); } } @Test public void testBuildFacility7() throws ConfigurationException { Facility f = new Facility(); ConfigurationManager cm = buildConfigurationManager(); EntityManager em = EMF.createEntityManager(); try { Map<?, ?> params = buildParamMap( "facilityName", "fred", "localHostId", "1234", "address", "", "accessPassword", "", "lastTemplate", "0", "driveName", "9", "fileSettlingTime", "1000", "folderName", "//foo/bar", "accessName", "", "facilityDescription", "", "fileArrivalMode", "DIRECT"); assertEquals( "{driveName=the drive name must be a single uppercase letter}", cm.buildFacility(f, params, em).toString()); } finally { emClose(em); } } @Test public void testBuildFacility8() throws ConfigurationException { Facility f = new Facility(); ConfigurationManager cm = buildConfigurationManager(); EntityManager em = EMF.createEntityManager(); try { Map<?, ?> params = buildParamMap( "facilityName", "fred", "localHostId", "1234", "address", "", "accessPassword", "", "lastTemplate", "0", "driveName", "ZZ", "fileSettlingTime", "1000", "folderName", "//foo/bar", "accessName", "", "facilityDescription", "", "fileArrivalMode", "DIRECT"); assertEquals( "{driveName=the drive name must be a single uppercase letter}", cm.buildFacility(f, params, em).toString()); } finally { emClose(em); } } @Test public void testBuildFacility9() throws ConfigurationException { Facility f = new Facility(); ConfigurationManager cm = buildConfigurationManager(); EntityManager em = EMF.createEntityManager(); try { Map<?, ?> params = buildParamMap( "facilityName", "fred", "localHostId", "1234", "address", "", "accessPassword", "", "lastTemplate", "0", "driveName", "Z", "fileSettlingTime", "-11000", "folderName", "//foo/bar", "accessName", "", "facilityDescription", "", "fileArrivalMode", "DIRECT"); assertEquals( "{fileSettlingTime=the file setting time cannot be negative}", cm.buildFacility(f, params, em).toString()); } finally { emClose(em); } } @Test public void testBuildFacility10() throws ConfigurationException { Facility f = new Facility(); ConfigurationManager cm = buildConfigurationManager(); EntityManager em = EMF.createEntityManager(); try { Map<?, ?> params = buildParamMap( "facilityName", "fred", "localHostId", "1234", "address", "1.2.3.5.6", "accessPassword", "", "lastTemplate", "0", "driveName", "Z", "fileSettlingTime", "1000", "folderName", "//foo/bar", "accessName", "", "facilityDescription", "", "fileArrivalMode", "DIRECT"); assertEquals( "{address=1.2.3.5.6: Name or service not known}", cm.buildFacility(f, params, em).toString()); } finally { emClose(em); } } @Test public void testBuildFacility11() throws ConfigurationException { Facility f = new Facility(); ConfigurationManager cm = buildConfigurationManager(); EntityManager em = EMF.createEntityManager(); try { Map<?, ?> params = buildParamMap( "facilityName", "fred", "localHostId", "1234", "address", "wurzle.example.com", "accessPassword", "", "lastTemplate", "0", "driveName", "Z", "fileSettlingTime", "1000", "folderName", "//foo/bar", "accessName", "", "facilityDescription", "", "fileArrivalMode", "DIRECT"); assertEquals( "{address=wurzle.example.com: Name or service not known}", cm.buildFacility(f, params, em).toString()); } finally { emClose(em); } } @Test public void testBuildFacility12() throws ConfigurationException { Facility f = new Facility(); ConfigurationManager cm = buildConfigurationManager(); EntityManager em = EMF.createEntityManager(); ValidationResult<Facility> vr = null; try { Map<?, ?> params = buildParamMap( "facilityName", "fred", "localHostId", "1234", "address", "127.0.0.1", "accessPassword", "", "lastTemplate", "0", "driveName", "Z", "fileSettlingTime", "1000", "folderName", "//foo/bar", "accessName", "", "facilityDescription", "", "fileArrivalMode", "DIRECT"); vr = cm.createFacility(params); assertTrue(vr.getDiags().isEmpty()); params = buildParamMap( "facilityName", "bert", "localHostId", "1234", "address", "127.0.0.2", "accessPassword", "", "lastTemplate", "0", "driveName", "Z", "fileSettlingTime", "1000", "folderName", "//foo/baz", "accessName", "", "facilityDescription", "", "fileArrivalMode", "DIRECT"); assertEquals( "{localHostId=local host id '1234' already assigned to facility 'fred'}", cm.buildFacility(f, params, em).toString()); } finally { if (vr.isValid()) { cm.deleteFacility(vr.getTarget().getFacilityName()); } emClose(em); } } @Test public void testBuildFacility13() throws ConfigurationException { Facility f = new Facility(); ConfigurationManager cm = buildConfigurationManager(); EntityManager em = EMF.createEntityManager(); ValidationResult<Facility> vr = null; try { Map<?, ?> params = buildParamMap( "facilityName", "fred", "localHostId", "1234", "address", "127.0.0.1", "accessPassword", "", "lastTemplate", "0", "driveName", "Z", "fileSettlingTime", "1000", "folderName", "//foo/bar", "accessName", "", "facilityDescription", "", "fileArrivalMode", "DIRECT"); vr = cm.createFacility(params); assertTrue(vr.getDiags().isEmpty()); params = buildParamMap( "facilityName", "bert", "localHostId", "1235", "address", "127.0.0.1", "accessPassword", "", "lastTemplate", "0", "driveName", "Z", "fileSettlingTime", "1000", "folderName", "//foo/baz", "accessName", "", "facilityDescription", "", "fileArrivalMode", "DIRECT"); assertEquals( "{address=address also used by facility 'fred'. " + "Resolve the address conflict or mark both " + "facilities as 'multiplexed'}", cm.buildFacility(f, params, em).toString()); } finally { if (vr.isValid()) { cm.deleteFacility(vr.getTarget().getFacilityName()); } emClose(em); } } @Test public void testBuildFacility14() throws ConfigurationException { Facility f = new Facility(); ConfigurationManager cm = buildConfigurationManager(); EntityManager em = EMF.createEntityManager(); ValidationResult<Facility> vr = null; try { Map<?, ?> params = buildParamMap( "facilityName", "fred", "localHostId", "1234", "address", "127.0.0.2", "accessPassword", "", "lastTemplate", "0", "driveName", "Z", "fileSettlingTime", "1000", "folderName", "//foo/bar", "accessName", "", "facilityDescription", "", "fileArrivalMode", "DIRECT"); vr = cm.createFacility(params); assertTrue(vr.getDiags().isEmpty()); params = buildParamMap( "facilityName", "bert", "localHostId", "1235", "address", "127.0.0.1", "accessPassword", "", "lastTemplate", "0", "driveName", "Z", "fileSettlingTime", "1000", "folderName", "//foo/bar", "accessName", "", "facilityDescription", "", "fileArrivalMode", "DIRECT"); assertEquals( "{folderName=this Samba share is already used " + "for Facility 'fred'}", cm.buildFacility(f, params, em).toString()); } finally { if (vr.isValid()) { cm.deleteFacility(vr.getTarget().getFacilityName()); } emClose(em); } } @Test public void testBuildFacility15() throws ConfigurationException { Facility f = new Facility(); ConfigurationManager cm = buildConfigurationManager(); EntityManager em = EMF.createEntityManager(); ValidationResult<Facility> vr = null; try { Map<?, ?> params = buildParamMap( "facilityName", "fred", "localHostId", "1234", "address", "127.0.0.2", "accessPassword", "", "lastTemplate", "0", "driveName", "Z", "fileSettlingTime", "1000", "folderName", "//foo/bar", "accessName", "", "facilityDescription", "", "fileArrivalMode", "DIRECT"); vr = cm.createFacility(params); assertTrue(vr.getDiags().isEmpty()); params = buildParamMap( "facilityName", "bert", "localHostId", "1235", "address", "127.0.0.1", "accessPassword", "", "lastTemplate", "0", "driveName", "Z", "fileSettlingTime", "1000", "folderName", "//you/bar", "accessName", "", "facilityDescription", "", "fileArrivalMode", "DIRECT"); assertEquals( "{folderName=the directory tree for this Samba share " + "overlaps with the directory tree for Facility 'fred'}", cm.buildFacility(f, params, em).toString()); } finally { if (vr.isValid()) { cm.deleteFacility(vr.getTarget().getFacilityName()); } emClose(em); } } @Test public void testBuildFacility16() throws ConfigurationException { Facility f = new Facility(); ConfigurationManager cm = buildConfigurationManager(); EntityManager em = EMF.createEntityManager(); try { Map<?, ?> params = buildParamMap( "facilityName", "fred", "localHostId", "", "address", "127.0.0.1", "accessPassword", "", "lastTemplate", "0", "driveName", "", "fileSettlingTime", "1000", "folderName", "//foo/bar", "accessName", "", "facilityDescription", "", "fileArrivalMode", "CHEESE"); assertEquals( "{fileArrivalMode=unrecognized mode 'CHEESE'}", cm.buildFacility(f, params, em).toString()); } finally { emClose(em); } } private ConfigurationManager buildConfigurationManager() throws ConfigurationException { Paul paul = EasyMock.createMock(Paul.class); UncPathnameMapper mapper = new DummyUncPathnameMapper("/"); EasyMock.expect(paul.getUncNameMapper()).andReturn(mapper).anyTimes(); EasyMock.replay(paul); return new ConfigurationManager( paul, EMF, buildStaticConfig(), buildStaticProxyConfig(), buildStaticFacilities()); } private Map<?, ?> buildParamMap(String ... args) { Map<String, String[]> res = new HashMap<>(); for (int i = 0; i < args.length; i += 2) { res.put(args[i], new String[]{args[i + 1]}); } return res; } private static void emClose(EntityManager em) { EntityTransaction t = em.getTransaction(); if (t.isActive()) { LOG.error("Rolling back a stale transaction!!"); t.rollback(); } LOG.debug("Closing em"); em.close(); } private StaticPaulFacilities buildStaticFacilities() throws ConfigurationException { return StaticPaulFacilities.loadFacilities( getClass().getResourceAsStream("/test-facilities.json")); } private StaticPaulConfiguration buildStaticConfig() throws ConfigurationException { return StaticPaulConfiguration.loadConfiguration( getClass().getResourceAsStream("/test-config.json")); } private StaticEcclesProxyConfiguration buildStaticProxyConfig() throws ConfigurationException { return StaticEcclesProxyConfiguration.loadConfiguration( getClass().getResourceAsStream("/test-proxy-config.json")); } }