/* (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.flow.config;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
import java.util.Properties;
import org.geoserver.flow.ControllerPriorityComparator;
import org.geoserver.flow.FlowController;
import org.geoserver.flow.controller.BasicOWSController;
import org.geoserver.flow.controller.GlobalFlowController;
import org.geoserver.flow.controller.IpFlowController;
import org.geoserver.flow.controller.IpRequestMatcher;
import org.geoserver.flow.controller.RateFlowController;
import org.geoserver.flow.controller.SingleIpFlowController;
import org.geoserver.flow.controller.UserConcurrentFlowController;
import org.geoserver.platform.GeoServerResourceLoader;
import org.geoserver.platform.resource.Files;
import org.geoserver.platform.resource.Resource;
import org.geoserver.platform.resource.Resources;
import org.geoserver.security.PropertyFileWatcher;
import org.junit.Test;
public class DefaultControlFlowConfigurationTest {
@Test
public void testParsing() throws Exception {
Properties p = new Properties();
p.put("timeout", "10");
p.put("ows.global", "100");
p.put("ows.wms.getmap", "8");
p.put("user", "6");
p.put("ip", "12");
p.put("ip.192.168.1.8", "14");
p.put("ip.192.168.1.10", "15");
p.put("user.ows", "20/s");
p.put("user.ows.wms", "300/m;3s");
p.put("ip.ows.wms.getmap", "100/m;3s");
p.put("ip.ows.wps.execute", "50/d;60s");
DefaultControlFlowConfigurator configurator = new DefaultControlFlowConfigurator(
new FixedWatcher(p));
assertTrue(configurator.isStale());
List<FlowController> controllers = configurator.buildFlowControllers();
Collections.sort(controllers, new ControllerPriorityComparator());
assertFalse(configurator.isStale());
assertEquals(10 * 1000, configurator.getTimeout());
assertEquals(10, controllers.size());
assertTrue(controllers.get(0) instanceof RateFlowController);
RateFlowController rfc = (RateFlowController) controllers.get(0);
assertEquals("wps.execute", rfc.getMatcher().toString());
assertEquals(50, rfc.getMaxRequests());
assertEquals(Intervals.d.getDuration(), rfc.getTimeInterval());
assertEquals(60000, rfc.getDelay());
assertTrue(controllers.get(1) instanceof RateFlowController);
rfc = (RateFlowController) controllers.get(1);
assertEquals("wms.getmap", rfc.getMatcher().toString());
assertEquals(100, rfc.getMaxRequests());
assertEquals(Intervals.m.getDuration(), rfc.getTimeInterval());
assertEquals(3000, rfc.getDelay());
assertTrue(controllers.get(2) instanceof RateFlowController);
rfc = (RateFlowController) controllers.get(2);
assertEquals("wms", rfc.getMatcher().toString());
assertEquals(300, rfc.getMaxRequests());
assertEquals(Intervals.m.getDuration(), rfc.getTimeInterval());
assertEquals(3000, rfc.getDelay());
assertTrue(controllers.get(3) instanceof RateFlowController);
rfc = (RateFlowController) controllers.get(3);
assertEquals("Any OGC request", rfc.getMatcher().toString());
assertEquals(20, rfc.getMaxRequests());
assertEquals(Intervals.s.getDuration(), rfc.getTimeInterval());
assertEquals(0, rfc.getDelay());
assertTrue(controllers.get(4) instanceof UserConcurrentFlowController);
UserConcurrentFlowController uc = (UserConcurrentFlowController) controllers.get(4);
assertEquals(6, uc.getPriority());
assertTrue(controllers.get(5) instanceof BasicOWSController);
BasicOWSController oc = (BasicOWSController) controllers.get(5);
assertEquals(8, oc.getPriority());
assertEquals("wms.getmap", oc.getMatcher().toString());
assertTrue(controllers.get(6) instanceof IpFlowController);
IpFlowController ipFc = (IpFlowController) controllers.get(6);
assertEquals(12, ipFc.getPriority());
assertTrue(controllers.get(7) instanceof SingleIpFlowController);
SingleIpFlowController ipSc = (SingleIpFlowController) controllers.get(7);
assertEquals(14, ipSc.getPriority());
IpRequestMatcher ipMatcher = (IpRequestMatcher) ipSc.getMatcher();
assertEquals("192.168.1.8", ipMatcher.getIp());
assertTrue(controllers.get(8) instanceof SingleIpFlowController);
ipMatcher = (IpRequestMatcher) ((SingleIpFlowController) controllers.get(8)).getMatcher();
assertEquals("192.168.1.10", ipMatcher.getIp());
assertTrue(controllers.get(9) instanceof GlobalFlowController);
GlobalFlowController gc = (GlobalFlowController) controllers.get(9);
assertEquals(100, gc.getPriority());
// store the properties into a temp folder and relaod
assertTrue(configurator.getFileLocations().isEmpty());
File tmpDir = createTempDir();
GeoServerResourceLoader resourceLoader = new GeoServerResourceLoader(tmpDir);
configurator.saveConfiguration(resourceLoader);
Resource controlFlowProps = Files.asResource(resourceLoader.find("controlflow.properties"));
assertTrue(Resources.exists(controlFlowProps));
PropertyFileWatcher savedProps = new PropertyFileWatcher(controlFlowProps);
assertEquals(savedProps.getProperties(), p);
}
static class FixedWatcher extends PropertyFileWatcher {
boolean stale = true;
Properties properties;
public FixedWatcher(Properties properties) {
super((Resource)null);
this.properties = properties;
}
@Override
public boolean isStale() {
if (stale) {
stale = false;
return true;
} else {
return false;
}
}
@Override
public Properties getProperties() throws IOException {
return properties;
}
}
static File createTempDir() throws IOException {
File f = File.createTempFile("controlFlow", "data", new File("target"));
f.delete();
f.mkdirs();
return f;
}
}