package org.geoserver.security;
import static org.easymock.EasyMock.anyObject;
import static org.easymock.EasyMock.createNiceMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import java.io.ByteArrayOutputStream;
import java.util.Collections;
import java.util.Iterator;
import java.util.Properties;
import junit.framework.TestCase;
import org.geoserver.catalog.Catalog;
import org.geoserver.catalog.impl.LayerInfoImpl;
import org.geoserver.catalog.impl.WorkspaceInfoImpl;
public class DataAccessRuleDAOTest extends TestCase {
DataAccessRuleDAO dao;
Properties props;
@Override
protected void setUp() throws Exception {
// make a nice little catalog that does always tell us stuff is there
Catalog catalog = createNiceMock(Catalog.class);
expect(catalog.getWorkspaceByName((String) anyObject())).andReturn(new WorkspaceInfoImpl()).anyTimes();
expect(catalog.getLayerByName((String) anyObject())).andReturn(new LayerInfoImpl()).anyTimes();
replay(catalog);
// prepare some base rules
props = new Properties();
props.put("mode", "CHALLENGE");
props.put("topp.states.w", "ROLE_TSW");
props.put("topp.*.w", "ROLE_TW");
props.put("*.*.r", "*");
dao = new MemoryDataAccessRuleDAO(catalog, props);
}
public void testParse() {
assertEquals(3, dao.getRules().size());
// check the first rule
DataAccessRule rule = dao.getRules().get(0);
assertEquals("*.*.r", rule.getKey());
assertEquals(1, rule.getRoles().size());
assertEquals("*", rule.getRoles().iterator().next());
}
public void testAdd() {
assertEquals(3, dao.getRules().size());
DataAccessRule newRule = dao.parseDataAccessRule("*.*.w", "ROLE_GENERIC_W");
assertTrue(dao.addRule(newRule));
assertEquals(4, dao.getRules().size());
assertEquals(newRule, dao.getRules().get(1));
assertFalse(dao.addRule(newRule));
}
public void testRemove() {
DataAccessRule newRule = dao.parseDataAccessRule("*.*.w", "ROLE_GENERIC_W");
assertFalse(dao.removeRule(newRule));
DataAccessRule first = dao.getRules().get(0);
assertTrue(dao.removeRule(first));
assertFalse(dao.removeRule(first));
assertEquals(2, dao.getRules().size());
}
public void testStore() {
Properties newProps = dao.toProperties();
// properties equality does not seem to work...
assertEquals(newProps.size(), props.size());
for (Object key : newProps.keySet()) {
Object newValue = newProps.get(key);
Object oldValue = newProps.get(key);
assertEquals(newValue, oldValue);
}
}
public void testParsePlain() {
DataAccessRule rule = dao.parseDataAccessRule("a.b.r", "ROLE_WHO_CARES");
assertEquals("a", rule.getWorkspace());
assertEquals("b", rule.getLayer());
assertEquals(AccessMode.READ, rule.getAccessMode());
}
public void testParseSpaces() {
DataAccessRule rule = dao.parseDataAccessRule(" a . b . r ", "ROLE_WHO_CARES");
assertEquals("a", rule.getWorkspace());
assertEquals("b", rule.getLayer());
assertEquals(AccessMode.READ, rule.getAccessMode());
}
public void testParseEscapedDots() {
DataAccessRule rule = dao.parseDataAccessRule("w. a\\.b . r ", "ROLE_WHO_CARES");
assertEquals("w", rule.getWorkspace());
assertEquals("a.b", rule.getLayer());
assertEquals(AccessMode.READ, rule.getAccessMode());
}
public void testStoreEscapedDots() throws Exception {
dao.clear();
dao.addRule(new DataAccessRule("it.geosolutions", "layer.dots",
AccessMode.READ, Collections.singleton("ROLE_ABC")));
Properties ps = dao.toProperties();
assertEquals(2, ps.size());
assertEquals("ROLE_ABC", ps.getProperty("it\\.geosolutions.layer\\.dots.r"));
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ps.store(bos, null);
}
}