/* (c) 2014 Open Source Geospatial Foundation - all rights reserved * (c) 2001 - 2013 OpenPlans * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.security.file; import static org.junit.Assert.*; import java.io.File; import java.io.IOException; import java.util.concurrent.TimeUnit; import java.util.logging.Logger; import org.geoserver.platform.resource.FileSystemWatcher; import org.geoserver.platform.resource.Files; import org.geoserver.security.GeoServerRoleService; import org.geoserver.security.GeoServerUserGroupService; import org.geoserver.security.config.SecurityNamedServiceConfig; import org.geoserver.security.impl.AbstractRoleService; import org.geoserver.security.impl.AbstractUserGroupService; import org.junit.Ignore; import org.junit.Test; import org.junit.Assert; import junit.framework.TestCase; /** * @author christian * */ public class FileTest { static Logger LOGGER = org.geotools.util.logging.Logging.getLogger("org.geoserver.security.xml"); int gaCounter=0,ugCounter=0; GeoServerRoleService gaService = new AbstractRoleService() { public String getName() { return "TestGAService"; }; @Override protected void deserialize() throws IOException { gaCounter++; } @Override public void initializeFromConfig(SecurityNamedServiceConfig config) throws IOException { super.initializeFromConfig(config); } }; GeoServerUserGroupService ugService = new AbstractUserGroupService() { public String getName() { return "TestUGService"; }; @Override protected void deserialize() throws IOException { ugCounter++; } @Override public void initializeFromConfig(SecurityNamedServiceConfig config) throws IOException { } }; @Test public void testFileWatcher() throws Exception { Files.schedule(100,TimeUnit.MILLISECONDS); try { File ugFile = File.createTempFile("users", ".xml"); ugFile.deleteOnExit(); File gaFile = File.createTempFile("roles", ".xml"); gaFile.deleteOnExit(); RoleFileWatcher gaWatcher = new RoleFileWatcher(gaFile,gaService); assertEquals(1, gaCounter); gaWatcher.setDelay(10); // 10 millisecs gaWatcher.start(); UserGroupFileWatcher ugWatcher = new UserGroupFileWatcher(ugFile,ugService); assertEquals(1, ugCounter); ugWatcher.setDelay(10); ugWatcher.start(); LOGGER.info(gaWatcher.toString()); LOGGER.info(ugWatcher.toString()); // now, modifiy last access ugFile.setLastModified(ugFile.lastModified()+1000); gaFile.setLastModified(gaFile.lastModified()+1000); // Try for two seconds int maxTries=10; boolean failed = true; for (int i=0; i <maxTries;i++) { if (ugCounter==2 && gaCounter==2) { failed=false; break; } Thread.sleep(100); } if (failed) { Assert.fail("FileWatchers not working" ); } ugWatcher.setTerminate(true); gaWatcher.setTerminate(true); ugFile.delete(); gaFile.delete(); } finally { Files.schedule(10, TimeUnit.SECONDS); } } // @Test // @Ignore // public void testLockFile() { // // try { // File fileToLock = File.createTempFile("test", ".xml"); // fileToLock.deleteOnExit(); // // LockFile lf1 = new LockFile(fileToLock); // LockFile lf2 = new LockFile(fileToLock); // // assertFalse(lf1.hasWriteLock()); // assertFalse(lf1.hasForeignWriteLock()); // // lf2.writeLock(); // // assertFalse(lf1.hasWriteLock()); // assertTrue(lf1.hasForeignWriteLock()); // assertTrue(lf2.hasWriteLock()); // assertFalse(lf2.hasForeignWriteLock()); // // lf2.writeUnLock(); // // assertFalse(lf1.hasWriteLock()); // assertFalse(lf1.hasForeignWriteLock()); // assertFalse(lf2.hasWriteLock()); // assertFalse(lf2.hasForeignWriteLock()); // // lf2.writeLock(); // // boolean fail = true; // try { // lf1.writeLock(); // } catch (IOException ex) { // fail = false; // LOGGER.info(ex.getMessage()); // } // if (fail) { // Assert.fail("IOException not thrown for concurrent write lock" ); // } // // lf2.writeUnLock(); // lf1.writeLock(); // // assertTrue(lf1.hasWriteLock()); // assertFalse(lf1.hasForeignWriteLock()); // assertFalse(lf2.hasWriteLock()); // assertTrue(lf2.hasForeignWriteLock()); // // lf1.finalize(); // // assertFalse(lf1.hasWriteLock()); // assertFalse(lf1.hasForeignWriteLock()); // assertFalse(lf2.hasWriteLock()); // assertFalse(lf2.hasForeignWriteLock()); // // // } catch (Throwable ex) { // Assert.fail(ex.getMessage()); // } // } }