blob: 78a00792e84419ec3d3f199873f01ad07a1c6808 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.felix.useradmin.impl;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import junit.framework.TestCase;
import org.osgi.service.useradmin.Group;
import org.osgi.service.useradmin.Role;
import org.osgi.service.useradmin.User;
/**
* Test cases for {@link RoleRepository}.
*/
public class RoleRepositoryTest extends TestCase {
private RoleRepository m_roleRepository;
private CountDownLatch m_latch;
/**
* Tests whether adding a new role to a group causes an event to be emitted to the {@link RoleRepository}.
*/
public void testAddBasicRoleYieldsEventOk() throws Exception {
final Group role = (Group) m_roleRepository.addRole("foo", Role.GROUP);
m_latch = new CountDownLatch(1);
new Thread(new Runnable() {
public void run() {
Role anyone = m_roleRepository.getRoleByName(Role.USER_ANYONE);
role.addMember(anyone);
};
}).start();
assertTrue(m_latch.await(1, TimeUnit.SECONDS));
}
/**
* Tests that adding a null {@link RoleChangeListener} instance does not work.
*/
public void testAddNullRoleChangeListenerFail() throws Exception {
try {
m_roleRepository.addRoleChangeListener(null);
fail("Expected IllegalArgumentException!");
} catch (IllegalArgumentException e) {
// Ok; expected...
}
}
/**
* Tests that adding a predefined role is not allowed.
*/
public void testAddPredefineRoleFails() {
try {
assertNull(m_roleRepository.addRole(Role.USER_ANYONE, Role.ROLE));
fail("IllegalArgumentException expected!");
}
catch (IllegalArgumentException e)
{
// Ok; expected
}
}
/**
* Tests whether adding a new role to a group causes an event to be emitted to the {@link RoleRepository}.
*/
public void testAddRequiredRoleYieldsEventOk() throws Exception {
final Group role = (Group) m_roleRepository.addRole("foo", Role.GROUP);
m_latch = new CountDownLatch(1);
new Thread(new Runnable() {
public void run() {
Role anyone = m_roleRepository.getRoleByName(Role.USER_ANYONE);
role.addRequiredMember(anyone);
};
}).start();
assertTrue(m_latch.await(1, TimeUnit.SECONDS));
}
/**
* Tests that adding a valid {@link RoleChangeListener} instance works.
*/
public void testAddRoleChangeListenerOk() throws Exception {
// Should succeed...
m_roleRepository.addRoleChangeListener(new RoleChangeListener() {
public void propertyAdded(Role role, Object key, Object value) {
}
public void propertyChanged(Role role, Object key, Object oldValue, Object newValue) {
}
public void propertyRemoved(Role role, Object key) {
}
public void roleAdded(Role role) {
}
public void roleRemoved(Role role) {
}
});
}
/**
* Test method for {@link org.apache.felix.useradmin.impl.RoleRepository#addRole(Role)}.
*/
public void testAddRoleOfSameTypeTwiceFail() {
assertNotNull(m_roleRepository.addRole("foo", Role.USER));
assertEquals(1, m_roleRepository.getRoles(null).size());
assertNull(m_roleRepository.addRole("foo", Role.USER));
assertEquals(1, m_roleRepository.getRoles(null).size());
}
/**
* Tests that adding a role works.
*/
public void testAddRoleOk() {
assertNotNull(m_roleRepository.addRole("foo", Role.USER));
assertEquals(1, m_roleRepository.getRoles(null).size());
}
/**
* Tests whether adding a new property to a role causes an event to be emitted to the {@link RoleRepository}.
*/
public void testAddRolePropertyYieldsEventOk() throws Exception {
m_latch = new CountDownLatch(1);
final Role role = m_roleRepository.addRole("john.doe", Role.USER);
new Thread(new Runnable() {
public void run() {
role.getProperties().put("key", "value");
};
}).start();
assertTrue(m_latch.await(1, TimeUnit.SECONDS));
}
/**
* Tests that adding a null-role does not work and yields an exception.
*/
public void testAddRoleWithNullRoleFail() {
try {
m_roleRepository.addRole(null, Role.USER);
fail("Exception expected!");
} catch (IllegalArgumentException e) {
// Ok; expected
}
}
/**
* Tests that adding a role with an invalid type does not work and yields an exception.
*/
public void testAddRoleWithInvalidRoleTypeFail() {
try {
m_roleRepository.addRole("role", Role.ROLE);
fail("Exception expected!");
} catch (IllegalArgumentException e) {
// Ok; expected
}
}
/**
* Test method for {@link org.apache.felix.useradmin.impl.RoleRepository#addRole(Role)}.
*/
public void testAddRoleWithSameNameTwiceFail() {
assertNotNull(m_roleRepository.addRole("foo", Role.USER));
assertEquals(1, m_roleRepository.getRoles(null).size());
assertNull(m_roleRepository.addRole("foo", Role.GROUP));
assertEquals(1, m_roleRepository.getRoles(null).size());
}
/**
* Tests whether adding a new credential to a user causes an event to be emitted to the {@link RoleRepository}.
*/
public void testAddUserCredentialYieldsEventOk() throws Exception {
m_latch = new CountDownLatch(1);
final User role = (User) m_roleRepository.addRole("john.doe", Role.USER);
new Thread(new Runnable() {
public void run() {
role.getCredentials().put("key", "value");
};
}).start();
assertTrue(m_latch.await(1, TimeUnit.SECONDS));
}
/**
* Tests whether changing an existing property to a role causes an event to be emitted to the {@link RoleRepository}.
*/
public void testChangeRolePropertyYieldsEventOk() throws Exception {
final Role role = m_roleRepository.addRole("john.doe", Role.USER);
role.getProperties().put("key", "value");
m_latch = new CountDownLatch(1);
new Thread(new Runnable() {
public void run() {
role.getProperties().put("key", "other-value");
};
}).start();
assertTrue(m_latch.await(1, TimeUnit.SECONDS));
}
/**
* Tests whether changing an existing credential for a user causes an event to be emitted to the {@link RoleRepository}.
*/
public void testChangeUserCredentialYieldsEventOk() throws Exception {
final User role = (User) m_roleRepository.addRole("john.doe", Role.USER);
role.getCredentials().put("key", "value");
m_latch = new CountDownLatch(1);
new Thread(new Runnable() {
public void run() {
role.getCredentials().put("key", "other-value");
};
}).start();
assertTrue(m_latch.await(1, TimeUnit.SECONDS));
}
/**
* Test method for {@link org.apache.felix.useradmin.impl.RoleRepository#getRoleByName(java.lang.String)}.
*/
public void testGetRoleByName() {
Role role1 = m_roleRepository.addRole("foo", Role.USER);
Role role2 = m_roleRepository.addRole("bar", Role.GROUP);
assertEquals(role1, m_roleRepository.getRoleByName("foo"));
assertEquals(role2, m_roleRepository.getRoleByName("bar"));
assertNull(m_roleRepository.getRoleByName("qux"));
}
/**
* Test method for {@link org.apache.felix.useradmin.impl.RoleRepository#getRoles(org.osgi.framework.Filter)}.
*/
public void testGetRolesWithFilterOk() throws Exception {
Role role1 = m_roleRepository.addRole("foo", Role.USER);
role1.getProperties().put("key", "value1");
role1.getProperties().put("keyA", "valueA");
Role role2 = m_roleRepository.addRole("bar", Role.GROUP);
role2.getProperties().put("key", "value2");
role2.getProperties().put("keyB", "value1");
String filter;
filter = "(key=value1)";
assertSameRoles(new Role[]{ role1 }, m_roleRepository.getRoles(filter));
filter = "(key=value2)";
assertSameRoles(new Role[]{ role2 }, m_roleRepository.getRoles(filter));
filter = "(key=value*)";
assertSameRoles(new Role[]{ role1, role2 }, m_roleRepository.getRoles(filter));
filter = "(|(key=value1)(keyB=value1))";
assertSameRoles(new Role[]{ role1, role2 }, m_roleRepository.getRoles(filter));
}
/**
* Test method for {@link org.apache.felix.useradmin.impl.RoleRepository#getRoles(String, String)}.
*/
public void testGetRolesWithKeyValuePairOk() throws Exception {
Role role1 = m_roleRepository.addRole("foo", Role.USER);
role1.getProperties().put("key", "value1");
role1.getProperties().put("keyA", "valueA");
Role role2 = m_roleRepository.addRole("bar", Role.GROUP);
role2.getProperties().put("key", "value2");
role2.getProperties().put("keyB", "value1");
assertSameRoles(new Role[]{ role1 }, m_roleRepository.getRoles("key", "value1"));
assertSameRoles(new Role[]{ role2 }, m_roleRepository.getRoles("key", "value2"));
assertSameRoles(new Role[0], m_roleRepository.getRoles("key", "value"));
}
/**
* Test method for {@link org.apache.felix.useradmin.impl.RoleRepository#getRoles(org.osgi.framework.Filter)}.
*/
public void testGetRolesWithoutFilterOk() {
Role role1 = m_roleRepository.addRole("foo", Role.USER);
Role role2 = m_roleRepository.addRole("bar", Role.GROUP);
assertSameRoles(new Role[]{ role2, role1 }, m_roleRepository.getRoles(null));
}
/**
* Test method for {@link org.apache.felix.useradmin.impl.RoleRepository#getRoleByName(java.lang.String)}.
*/
public void testGetUserAnyoneRoleByName() {
Role anyone = m_roleRepository.getRoleByName(Role.USER_ANYONE);
assertEquals(Role.USER_ANYONE, anyone.getName());
assertEquals(Role.ROLE, anyone.getType());
}
/**
* Tests whether removing a role from a group causes an event to be emitted to the {@link RoleRepository}.
*/
public void testRemoveBasicRoleYieldsEventOk() throws Exception {
final Role anyone = m_roleRepository.getRoleByName(Role.USER_ANYONE);
final Group role = (Group) m_roleRepository.addRole("bar", Role.GROUP);
role.addMember(anyone);
m_latch = new CountDownLatch(1);
new Thread(new Runnable() {
public void run() {
role.removeMember(anyone);
};
}).start();
assertTrue(m_latch.await(1, TimeUnit.SECONDS));
}
/**
* Test method for {@link org.apache.felix.useradmin.impl.RoleRepository#removeRole(Role)}.
*/
public void testRemoveExistingRoleOk() {
assertNotNull(m_roleRepository.addRole("foo", Role.USER));
assertTrue(m_roleRepository.removeRole("foo"));
assertEquals(0, m_roleRepository.getRoles(null).size());
}
/**
* Test method for {@link org.apache.felix.useradmin.impl.RoleRepository#removeRole(Role)}.
*/
public void testRemoveNonExistingRoleOk() {
assertNotNull(m_roleRepository.addRole("foo", Role.USER));
assertFalse(m_roleRepository.removeRole("qux"));
assertEquals(1, m_roleRepository.getRoles(null).size());
}
/**
* Tests that removing a null {@link RoleChangeListener} instance does not work.
*/
public void testRemoveNullRoleChangeListenerFail() throws Exception {
try {
m_roleRepository.removeRoleChangeListener(null);
fail("Expected IllegalArgumentException!");
} catch (IllegalArgumentException e) {
// Ok; expected...
}
}
/**
* Test method for {@link org.apache.felix.useradmin.impl.RoleRepository#removeRole(Role)}.
*/
public void testRemovePredefinedRoleFails() {
m_roleRepository.addRole("foo", Role.USER);
assertFalse(m_roleRepository.removeRole(Role.USER_ANYONE));
assertEquals(1, m_roleRepository.getRoles(null).size());
}
/**
* Tests whether removing a role from a group causes an event to be emitted to the {@link RoleRepository}.
*/
public void testRemoveRequiredRoleYieldsEventOk() throws Exception {
final Role anyone = m_roleRepository.getRoleByName(Role.USER_ANYONE);
final Group role = (Group) m_roleRepository.addRole("bar", Role.GROUP);
role.addRequiredMember(anyone);
m_latch = new CountDownLatch(1);
new Thread(new Runnable() {
public void run() {
role.removeMember(anyone);
};
}).start();
assertTrue(m_latch.await(1, TimeUnit.SECONDS));
}
/**
* Tests that removing a valid {@link RoleChangeListener} instance works.
*/
public void testRemoveRoleChangeListenerOk() throws Exception {
// Should succeed...
m_roleRepository.removeRoleChangeListener(new RoleChangeListener() {
public void propertyAdded(Role role, Object key, Object value) {
}
public void propertyChanged(Role role, Object key, Object oldValue, Object newValue) {
}
public void propertyRemoved(Role role, Object key) {
}
public void roleAdded(Role role) {
}
public void roleRemoved(Role role) {
}
});
}
/**
* Tests whether removing a property from a role causes an event to be emitted to the {@link RoleRepository}.
*/
public void testRemoveRolePropertyYieldsEventOk() throws Exception {
final Role role = m_roleRepository.addRole("john.doe", Role.USER);
role.getProperties().put("key", "value");
m_latch = new CountDownLatch(1);
new Thread(new Runnable() {
public void run() {
role.getProperties().remove("key");
};
}).start();
assertTrue(m_latch.await(1, TimeUnit.SECONDS));
}
/**
* Tests that removing a null-role does not work and yields an exception.
*/
public void testRemoveRoleWithNullRoleFail() {
try {
m_roleRepository.removeRole(null);
fail("Exception expected!");
} catch (IllegalArgumentException e) {
// Ok; expected
}
}
/**
* Tests whether removing a credential from a user causes an event to be emitted to the {@link RoleRepository}.
*/
public void testRemoveUserCredentialYieldsEventOk() throws Exception {
final User role = (User) m_roleRepository.addRole("john.doe", Role.USER);
role.getCredentials().put("key", "value");
m_latch = new CountDownLatch(1);
new Thread(new Runnable() {
public void run() {
role.getCredentials().remove("key");
};
}).start();
assertTrue(m_latch.await(1, TimeUnit.SECONDS));
}
/**
* {@inheritDoc}
*/
protected void setUp() throws Exception {
super.setUp();
m_roleRepository = new RoleRepository(new MemoryRoleRepositoryStore());
m_roleRepository.addRoleChangeListener(new RoleChangeListener() {
public void propertyAdded(Role role, Object key, Object value) {
if (m_latch != null) {
m_latch.countDown();
}
}
public void propertyChanged(Role role, Object key, Object oldValue, Object newValue) {
if (m_latch != null) {
m_latch.countDown();
}
}
public void propertyRemoved(Role role, Object key) {
if (m_latch != null) {
m_latch.countDown();
}
}
public void roleAdded(Role role) {
if (m_latch != null) {
m_latch.countDown();
}
}
public void roleRemoved(Role role) {
if (m_latch != null) {
m_latch.countDown();
}
}
});
}
/**
* Asserts that a given collection of roles has the correct expected contents.
*
* @param expected
* @param roles
*/
private void assertSameRoles(Role[] expected, Collection roles) {
assertTrue("Expected " + expected.length + " roles, got " + roles.size() + "!", expected.length == roles.size());
List e = new ArrayList(Arrays.asList(expected));
e.removeAll(roles);
assertTrue("Not seen: " + e, e.isEmpty());
}
}