blob: a6567ffe1ff25f6bfe41e239f7003b0d79bae3ff [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.filestore;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Dictionary;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import junit.framework.TestCase;
import org.apache.felix.useradmin.RoleFactory;
import org.osgi.service.useradmin.Group;
import org.osgi.service.useradmin.Role;
import org.osgi.service.useradmin.User;
/**
* Test case for {@link RoleRepositorySerializer}.
*/
public class RoleRepositorySerializerTest extends TestCase {
private Role m_userAnyone;
private User m_user1;
private User m_user2;
private User m_user3;
private User m_user4;
private Group m_group1;
private Group m_group2;
private Group m_group3;
private Map m_repository;
private RoleRepositorySerializer m_serializer;
/**
* Tests that writing and reading a repository with a role, four users and a three group works as expected.
*/
public void testRWRepositoryWithRolesUsersAndGroupsOk() throws Exception {
m_group1.addRequiredMember(m_userAnyone);
m_group1.addMember(m_user1);
m_group2.addMember(m_group1);
m_group2.addMember(m_user2);
m_group2.addRequiredMember(m_user1);
m_group3.addMember(m_user3);
m_group3.addMember(m_user4);
m_group3.addRequiredMember(m_userAnyone);
addToRepository(m_user1);
addToRepository(m_user2);
addToRepository(m_user3);
addToRepository(m_user4);
addToRepository(m_group1);
addToRepository(m_group2);
addToRepository(m_group3);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
m_serializer.serialize(m_repository, dos); // should succeed!
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
DataInputStream dis = new DataInputStream(bais);
Map result = m_serializer.deserialize(dis);
assertNotNull(result);
assertEquals(7, result.size());
assertEquals(m_user1, (User) result.get(m_user1.getName()));
assertEquals(m_user2, (User) result.get(m_user2.getName()));
assertEquals(m_user3, (User) result.get(m_user3.getName()));
assertEquals(m_user4, (User) result.get(m_user4.getName()));
assertEquals(m_group1, (Group) result.get(m_group1.getName()));
assertEquals(m_group2, (Group) result.get(m_group2.getName()));
assertEquals(m_group3, (Group) result.get(m_group3.getName()));
}
/**
* Tests that writing and reading a repository with a single group works as expected.
*/
public void testRWRepositoryWithSingleGroupOk() throws Exception {
addToRepository(m_group1);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
m_serializer.serialize(m_repository, dos); // should succeed!
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
DataInputStream dis = new DataInputStream(bais);
Map result = m_serializer.deserialize(dis);
assertNotNull(result);
assertEquals(1, result.size());
assertEquals(m_group1, (Role) result.get(m_group1.getName()));
}
/**
* Tests that writing and reading a repository without roles works as expected.
*/
public void testRWRepositoryWithoutRolesOk() throws Exception {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
m_serializer.serialize(m_repository, dos); // should succeed!
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
DataInputStream dis = new DataInputStream(bais);
Map result = m_serializer.deserialize(dis);
assertNotNull(result);
assertEquals(0, result.size());
}
/**
* Tests that writing and reading a repository with a single user role works as expected.
*/
public void testRWRepositoryWithSingleUserOk() throws Exception {
addToRepository(m_user1);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
m_serializer.serialize(m_repository, dos); // should succeed!
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
DataInputStream dis = new DataInputStream(bais);
Map result = m_serializer.deserialize(dis);
assertNotNull(result);
assertEquals(1, result.size());
assertEquals(m_user1, (User) result.get(m_user1.getName()));
}
/**
* Tests that writing and reading a repository with two user roles works as expected.
*/
public void testRWRepositoryWithTwoUsersOk() throws Exception {
addToRepository(m_user1);
addToRepository(m_user2);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
m_serializer.serialize(m_repository, dos); // should succeed!
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
DataInputStream dis = new DataInputStream(bais);
Map result = m_serializer.deserialize(dis);
assertNotNull(result);
assertEquals(2, result.size());
assertEquals(m_user1, (User) result.get(m_user1.getName()));
assertEquals(m_user2, (User) result.get(m_user2.getName()));
}
/**
* Tests that reading a repository that has a cyclic group reference can be read ok.
*/
public void testRWRepositoryWithCyclicGroupReference() throws Exception {
m_group1.addMember(m_group2);
m_group2.addMember(m_group1);
m_group2.addMember(m_user1);
addToRepository(m_user1);
addToRepository(m_group2);
addToRepository(m_group1);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
m_serializer.serialize(m_repository, dos); // should succeed!
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
DataInputStream dis = new DataInputStream(bais);
Map result = m_serializer.deserialize(dis);
assertNotNull(result);
assertEquals(3, result.size());
assertEquals(m_group1, (Group) result.get(m_group1.getName()));
assertEquals(m_group2, (Group) result.get(m_group2.getName()));
assertEquals(m_user1, (User) result.get(m_user1.getName()));
}
/**
* Tests that reading a repository that is missing a referenced basic role from a group fails.
*/
public void testRWRepositoryWithUnreferencedBasicRoleInGroupFail() throws Exception {
m_group1.addMember(m_userAnyone);
m_group1.addRequiredMember(m_user1);
// "Forget" to add the user1
addToRepository(m_group1);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
m_serializer.serialize(m_repository, dos); // should succeed!
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
DataInputStream dis = new DataInputStream(bais);
try {
m_serializer.deserialize(dis);
fail("IOException expected!");
} catch (IOException e) {
// Ok; expected
}
}
/**
* Tests that reading a repository that is missing a referenced required role from a group fails.
*/
public void testRWRepositoryWithUnreferencedRequiredRoleInGroupFail() throws Exception {
m_group1.addRequiredMember(m_userAnyone);
m_group1.addMember(m_user1);
// "Forget" to add the user1!
addToRepository(m_group1);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
m_serializer.serialize(m_repository, dos); // should succeed!
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
DataInputStream dis = new DataInputStream(bais);
try {
m_serializer.deserialize(dis);
fail("IOException expected!");
} catch (IOException e) {
// Ok; expected
}
}
/**
* {@inheritDoc}
*/
protected void setUp() throws Exception {
super.setUp();
m_serializer = new RoleRepositorySerializer();
m_repository = new HashMap();
m_userAnyone = RoleFactory.createRole(Role.USER_ANYONE);
setProperties(m_userAnyone);
m_user1 = createUser(1);
m_user2 = createUser(2);
m_user3 = createUser(3);
m_user4 = createUser(4);
m_group1 = createGroup(1);
m_group2 = createGroup(2);
m_group3 = createGroup(3);
}
/**
* {@inheritDoc}
*/
protected void tearDown() throws Exception {
super.tearDown();
}
private void addToRepository(Role role) {
if (!Role.USER_ANYONE.equals(role.getName())) {
m_repository.put(role.getName(), role);
}
}
private void assertEquals(Dictionary expected, Dictionary obtained) {
assertNotNull(expected);
assertNotNull(obtained);
assertEquals(expected.size(), obtained.size());
Enumeration enumeration = expected.keys();
while (enumeration.hasMoreElements()) {
Object expectedKey = enumeration.nextElement();
Object expectedValue = expected.get(expectedKey);
Object obtainedValue = obtained.get(expectedKey);
if (expectedValue == null) {
assertNull(obtainedValue);
} else if (expectedValue.getClass().isArray()) {
assertTrue(Arrays.equals((byte[]) expectedValue, (byte[]) obtainedValue));
} else {
assertEquals(expectedValue, obtainedValue);
}
}
}
private void assertEquals(Group expected, Group obtained) {
assertEquals((Object) expected, (Object) obtained);
assertEquals(expected.getProperties(), obtained.getProperties());
assertEquals(expected.getCredentials(), obtained.getCredentials());
assertEquals(expected.getMembers(), obtained.getMembers());
assertEquals(expected.getRequiredMembers(), obtained.getRequiredMembers());
}
private void assertEquals(Role expected, Role obtained) {
assertEquals((Object) expected, (Object) obtained);
assertEquals(expected.getProperties(), obtained.getProperties());
}
private void assertEquals(User expected, User obtained) {
assertEquals((Object) expected, (Object) obtained);
assertEquals(expected.getProperties(), obtained.getProperties());
assertEquals(expected.getCredentials(), obtained.getCredentials());
}
private void assertEquals(Role[] expected, Role[] obtained) {
if (expected != null) {
assertNotNull(obtained);
assertEquals(expected.length, obtained.length);
List e = new ArrayList(Arrays.asList(expected));
e.removeAll(Arrays.asList(obtained));
assertTrue("Roles not obtained: " + e, e.isEmpty());
Map m = new HashMap();
for (int i = 0; i < expected.length; i++) {
m.put(expected[i].getName(), expected[i]);
}
for (int i = 0; i < obtained.length; i++) {
assertEquals(m.get(obtained[i].getName()), obtained[i]);
}
} else {
assertNull(obtained);
}
}
private User createUser(int idx) {
String name = "User" + idx;
User result = RoleFactory.createUser(name);
setCredentials(result);
setProperties(result);
return result;
}
private Group createGroup(int idx) {
String name = "Group" + idx;
Group result = RoleFactory.createGroup(name);
setCredentials(result);
setProperties(result);
return result;
}
private void setCredentials(User user) {
user.getCredentials().put(user.getName(), user.getName());
user.getCredentials().put("password", user.getName());
user.getCredentials().put("certificate", new byte[] { (byte) 0x55, (byte) 0xAA } );
}
private void setProperties(Role role) {
role.getProperties().put(role.getName(), role.getName());
role.getProperties().put("key1", role.getName());
role.getProperties().put("key2", "hello world".getBytes());
}
}