Author: ivol37 at gmail.com
Date: Tue Feb 15 12:50:49 2011
New Revision: 785
Log:
[AMDATU-296] Separated config from FS UserAdmin implementation. Added
integration test for FS UserAdmin and fixed issue AMDATU-241 which was still
present in the FS implementation.
Added:
trunk/amdatu-core/useradminstore-fs/src/main/java/org/amdatu/core/useradminstore/fs/service/FSUserAdminStorageConfig.java
trunk/amdatu-core/useradminstore-fs/src/main/java/org/amdatu/core/useradminstore/fs/service/FSUserAdminStorageConfigImpl.java
trunk/integration-tests/src/test/java/org/amdatu/test/integration/base/UserAdminStoreTestBase.java
trunk/integration-tests/src/test/java/org/amdatu/test/integration/tests/UserAdminCassandraStoreTest.java
- copied, changed from r784,
/trunk/integration-tests/src/test/java/org/amdatu/test/integration/tests/UserAdminStoreTest.java
trunk/integration-tests/src/test/java/org/amdatu/test/integration/tests/UserAdminFSStoreTest.java
Removed:
trunk/integration-tests/src/test/java/org/amdatu/test/integration/tests/UserAdminStoreTest.java
Modified:
trunk/amdatu-core/useradminstore-fs/src/main/java/org/amdatu/core/useradminstore/fs/osgi/FSUserAdminStorageProviderActivator.java
trunk/amdatu-core/useradminstore-fs/src/main/java/org/amdatu/core/useradminstore/fs/service/FSUserAdminStorageProvider.java
trunk/amdatu-core/useradminstore-fs/src/test/java/org/amdatu/core/useradminstore/fs/osgi/FSUserAdminStorageProviderActivatorTest.java
trunk/integration-tests/src/test/java/org/amdatu/test/integration/base/IntegrationTestBase.java
Modified:
trunk/amdatu-core/useradminstore-fs/src/main/java/org/amdatu/core/useradminstore/fs/osgi/FSUserAdminStorageProviderActivator.java
==============================================================================
---
trunk/amdatu-core/useradminstore-fs/src/main/java/org/amdatu/core/useradminstore/fs/osgi/FSUserAdminStorageProviderActivator.java
(original)
+++
trunk/amdatu-core/useradminstore-fs/src/main/java/org/amdatu/core/useradminstore/fs/osgi/FSUserAdminStorageProviderActivator.java
Tue Feb 15 12:50:49 2011
@@ -1,5 +1,4 @@
/*
-/*
Copyright (C) 2010 Amdatu.org
This program is free software: you can redistribute it and/or modify
@@ -21,12 +20,15 @@
import java.util.Hashtable;
import org.amdatu.core.tenant.Tenant;
+import org.amdatu.core.useradminstore.fs.service.FSUserAdminStorageConfig;
+import org.amdatu.core.useradminstore.fs.service.FSUserAdminStorageConfigImpl;
import org.amdatu.core.useradminstore.fs.service.FSUserAdminStorageProvider;
import org.apache.felix.dm.DependencyActivatorBase;
import org.apache.felix.dm.DependencyManager;
import org.ops4j.pax.useradmin.service.spi.StorageProvider;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
+import org.osgi.service.cm.ManagedService;
import org.osgi.service.log.LogService;
/**
@@ -36,15 +38,21 @@
@Override
public void init(BundleContext context, DependencyManager manager) throws
Exception {
- // We register the FS tenant store as an adapter service for tenant,
which makes it tenant aware.
- // An instance of this store will be available for each tenant.
+ manager.add(
+ createComponent()
+ .setImplementation(FSUserAdminStorageConfigImpl.class)
+ .setInterface(new
String[]{FSUserAdminStorageConfig.class.getName(),
ManagedService.class.getName()}, null)
+
.add(createConfigurationDependency().setPid(FSUserAdminStorageConfigImpl.CONFIGURATION_PID)));
+
+ // We register the FS tenant store as an adapter service for tenant,
which makes it tenant aware.
+ // An instance of this store will be available for each tenant.
Dictionary<String, Object> properties = new Hashtable<String,
Object>();
properties.put(Constants.SERVICE_RANKING, 0);
manager.add(
createAdapterService(Tenant.class, null)
.setImplementation(FSUserAdminStorageProvider.class)
.setInterface(StorageProvider.class.getName(), properties)
-
.add(createConfigurationDependency().setPid(FSUserAdminStorageProvider.CONFIGURATION_PID))
+
.add(createServiceDependency().setService(FSUserAdminStorageConfig.class).setRequired(true))
.add(createServiceDependency().setService(LogService.class).setRequired(false)));
}
Added:
trunk/amdatu-core/useradminstore-fs/src/main/java/org/amdatu/core/useradminstore/fs/service/FSUserAdminStorageConfig.java
==============================================================================
--- (empty file)
+++
trunk/amdatu-core/useradminstore-fs/src/main/java/org/amdatu/core/useradminstore/fs/service/FSUserAdminStorageConfig.java
Tue Feb 15 12:50:49 2011
@@ -0,0 +1,30 @@
+/*
+ Copyright (C) 2010 Amdatu.org
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.amdatu.core.useradminstore.fs.service;
+
+/**
+ * Interface for the configuration of the FS User Admin storage provider
service.
+ *
+ * @author ivol
+ */
+public interface FSUserAdminStorageConfig {
+ /**
+ * Returns the directory name to store the persistent files in.
+ * @return the directory name.
+ */
+ String getDataDirectoryName();
+}
Added:
trunk/amdatu-core/useradminstore-fs/src/main/java/org/amdatu/core/useradminstore/fs/service/FSUserAdminStorageConfigImpl.java
==============================================================================
--- (empty file)
+++
trunk/amdatu-core/useradminstore-fs/src/main/java/org/amdatu/core/useradminstore/fs/service/FSUserAdminStorageConfigImpl.java
Tue Feb 15 12:50:49 2011
@@ -0,0 +1,51 @@
+/*
+ Copyright (C) 2010 Amdatu.org
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.amdatu.core.useradminstore.fs.service;
+
+import java.util.Dictionary;
+
+import org.osgi.service.cm.ConfigurationException;
+import org.osgi.service.cm.ManagedService;
+
+/**
+ * This class manages the configuration of the FS User Admin storage provider.
Note that the FSUserAdminStorageProvider
+ * cannot be a ManagedService itself, since it is also an adapter service for
Tenant. A service cannot be both an
+ * adapter service and a managed service (see
http://jira.amdatu.org/jira/browse/AMDATU-296).
+ *
+ * @author ivol
+ */
+public class FSUserAdminStorageConfigImpl implements ManagedService,
FSUserAdminStorageConfig {
+ // The PID and configuration properties
+ public static final String CONFIGURATION_PID =
"org.amdatu.core.useradminstore-fs";
+ public final static String DATA_DIRECTORY = "datadir";
+
+ private String m_dataDirectoryName;
+
+ @SuppressWarnings("unchecked")
+ public void updated(Dictionary properties) throws ConfigurationException {
+ if (properties != null) {
+ m_dataDirectoryName = (String) properties.get(DATA_DIRECTORY);
+ if (m_dataDirectoryName == null || "".equals(m_dataDirectoryName))
{
+ throw new ConfigurationException(DATA_DIRECTORY, "Missing
mandatory data directory configuration");
+ }
+ }
+ }
+
+ public String getDataDirectoryName() {
+ return m_dataDirectoryName;
+ }
+}
Modified:
trunk/amdatu-core/useradminstore-fs/src/main/java/org/amdatu/core/useradminstore/fs/service/FSUserAdminStorageProvider.java
==============================================================================
---
trunk/amdatu-core/useradminstore-fs/src/main/java/org/amdatu/core/useradminstore/fs/service/FSUserAdminStorageProvider.java
(original)
+++
trunk/amdatu-core/useradminstore-fs/src/main/java/org/amdatu/core/useradminstore/fs/service/FSUserAdminStorageProvider.java
Tue Feb 15 12:50:49 2011
@@ -1,3 +1,19 @@
+/*
+ Copyright (C) 2010 Amdatu.org
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
package org.amdatu.core.useradminstore.fs.service;
import java.io.File;
@@ -25,7 +41,6 @@
import org.osgi.framework.Filter;
import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.service.cm.ConfigurationException;
import org.osgi.service.log.LogService;
import org.osgi.service.useradmin.Group;
import org.osgi.service.useradmin.Role;
@@ -36,17 +51,12 @@
* This service is tenant aware.
*/
public final class FSUserAdminStorageProvider implements StorageProvider {
-
- // The PID and configuration properties
- public static final String CONFIGURATION_PID =
"org.amdatu.core.useradminstore-fs";
- public final static String DATA_DIRECTORY = "datadir";
-
+ private volatile FSUserAdminStorageConfig m_config;
private volatile LogService m_logService;
private volatile Tenant m_tenant;
private volatile Component m_component;
-
+
private FSRoleStorage m_storage;
- private String m_dataDirectoryName;
public FSUserAdminStorageProvider() throws StorageException {
}
@@ -54,38 +64,30 @@
public FSRoleStorage getFSStorage() {
return m_storage;
}
-
+
@SuppressWarnings("unchecked")
- public void init() throws StorageException {
- // Postfix tenantid to the data directory, making it tenant specific
- // FIXME bad..
- m_dataDirectoryName += "/" + m_tenant.getId();
-
+ public void init() throws StorageException {
+ // Postfix tenantid to the data directory, making it tenant specific
+ // FIXME bad..
+ String dirName = m_config.getDataDirectoryName() + "/" +
m_tenant.getId();
Dictionary properties = m_component.getServiceProperties();
properties.put(UserAdminConstants.STORAGEPROVIDER_TYPE, "FS_" +
m_tenant.getId());
properties.put(Tenant.TENANT_ID_SERVICEPROPERTY, m_tenant.getId());
m_component.setServiceProperties(properties);
-
- File dataDirectory = new File(m_dataDirectoryName);
+
+ File dataDirectory = new File(dirName);
setDataDirectory(dataDirectory);
}
public synchronized void start() throws StorageException {
- if (m_logService != null)
+ if (m_logService != null) {
m_logService.log(LogService.LOG_INFO, "Filesystem UserAdmin
storage provider started for tenant '" + m_tenant.getId() + "'");
+ }
}
public synchronized void stop() {
- if (m_logService != null)
+ if (m_logService != null) {
m_logService.log(LogService.LOG_INFO, "Filesystem UserAdmin
storage provider stopped for tenant '" + m_tenant.getId() + "'");
- }
-
- public synchronized void updated(Dictionary<String, Object> dictionary)
throws ConfigurationException {
- if (dictionary != null) {
- m_dataDirectoryName = (String) dictionary.get(DATA_DIRECTORY);
- if (m_dataDirectoryName == null || "".equals(m_dataDirectoryName))
{
- throw new ConfigurationException(DATA_DIRECTORY, "Missing
mandatory data directory configuration");
- }
}
}
@@ -95,7 +97,7 @@
dataDirectory = new File(userDirectory, dataDirectory.getPath());
}
if (!((dataDirectory.exists() && dataDirectory.canRead() &&
dataDirectory.canWrite()) || dataDirectory
- .mkdirs())) {
+ .mkdirs())) {
throw new StorageException("Unable to access data directory: "
+ dataDirectory.getAbsolutePath());
}
@@ -105,9 +107,10 @@
catch (IOException e) {
throw new StorageException(e.getMessage());
}
- if (m_logService != null)
+ if (m_logService != null) {
m_logService.log(LogService.LOG_DEBUG, "Datadirectory set to: "
+ m_storage.getDataDirectory().getAbsolutePath());
+ }
}
/*
@@ -165,7 +168,7 @@
try {
FSRole internalRole = m_storage.getEntity(user.getName());
if (internalRole != null && internalRole.getType() == Role.USER
- && ((FSUser) internalRole).getCredentials() !=
null) {
+ && ((FSUser) internalRole).getCredentials() !=
null) {
((FSUser) internalRole).setCredentials(null);
m_storage.addEntity(internalRole);
}
@@ -176,7 +179,7 @@
}
public Group createGroup(final UserAdminFactory userAdminFactory, final
String groupName)
- throws StorageException {
+ throws StorageException {
checkState();
final Group group = userAdminFactory.createGroup(groupName, null,
null);
try {
@@ -189,7 +192,7 @@
}
public User createUser(final UserAdminFactory userAdminFactory, final
String userName)
- throws StorageException {
+ throws StorageException {
checkState();
final User user = userAdminFactory.createUser(userName, null, null);
try {
@@ -205,8 +208,12 @@
checkState();
try {
FSRole internalRole = m_storage.removeEntity(role.getName());
- if (internalRole != null)
+ if (role.getType() == Role.USER) {
+ removeUserFromAllGroups(role);
+ }
+ if (internalRole != null) {
return true;
+ }
return false;
}
catch (IOException e) {
@@ -215,7 +222,7 @@
}
public Collection<Role> findRoles(final UserAdminFactory userAdminFactory,
final String filterString)
- throws StorageException {
+ throws StorageException {
checkState();
List<Role> matchingRoles = new LinkedList<Role>();
try {
@@ -237,7 +244,7 @@
}
public Collection<Role> getMembers(final UserAdminFactory
userAdminFactory, final Group group)
- throws StorageException {
+ throws StorageException {
checkState();
Set<Role> members = new HashSet<Role>();
try {
@@ -246,14 +253,14 @@
for (Role role : ((FSGroup) internalRole).getMembers()) {
if (role.getType() == Role.USER) {
User newuser =
-
userAdminFactory.createUser(role.getName(),
dictionaryToMap(role.getProperties()),
- dictionaryToMap(((User)
role).getCredentials()));
+ userAdminFactory.createUser(role.getName(),
dictionaryToMap(role.getProperties()),
+ dictionaryToMap(((User)
role).getCredentials()));
members.add(newuser);
}
else if (role.getType() == Role.GROUP) {
Group newgroup =
-
userAdminFactory.createGroup(role.getName(),
dictionaryToMap(role.getProperties()),
- dictionaryToMap(((Group)
role).getCredentials()));
+ userAdminFactory.createGroup(role.getName(),
dictionaryToMap(role.getProperties()),
+ dictionaryToMap(((Group)
role).getCredentials()));
members.add(newgroup);
}
}
@@ -266,7 +273,7 @@
}
public Collection<Role> getRequiredMembers(final UserAdminFactory
userAdminFactory, final Group group)
- throws StorageException {
+ throws StorageException {
checkState();
Set<Role> members = new HashSet<Role>();
try {
@@ -275,15 +282,15 @@
for (Role role : ((FSGroup)
internalRole).getRequiredMembers()) {
if (role.getType() == Role.USER) {
User newuser =
-
userAdminFactory.createUser(role.getName(),
dictionaryToMap(role.getProperties()),
- dictionaryToMap(((User)
role).getCredentials()));
+ userAdminFactory.createUser(role.getName(),
dictionaryToMap(role.getProperties()),
+ dictionaryToMap(((User)
role).getCredentials()));
members.add(newuser);
}
else if (role.getType() == Role.GROUP) {
Group newgroup =
userAdminFactory.createGroup(internalRole.getName(),
- dictionaryToMap(internalRole.getProperties()),
- dictionaryToMap(((Group)
internalRole).getCredentials()));
+ dictionaryToMap(internalRole.getProperties()),
+ dictionaryToMap(((Group)
internalRole).getCredentials()));
for (Role member : ((FSGroup)
internalRole).getMembers()) {
newgroup.addMember(getRole(userAdminFactory,
member.getName()));
}
@@ -302,20 +309,20 @@
}
public Role getRole(final UserAdminFactory userAdminFactory, final String
roleName)
- throws StorageException {
+ throws StorageException {
checkState();
try {
FSRole internalRole = m_storage.getEntity(roleName);
if (internalRole != null) {
if (internalRole.getType() == Role.USER) {
return userAdminFactory.createUser(internalRole.getName(),
- dictionaryToMap(internalRole.getProperties()),
- dictionaryToMap(((User)
internalRole).getCredentials()));
+ dictionaryToMap(internalRole.getProperties()),
+ dictionaryToMap(((User)
internalRole).getCredentials()));
}
else if (internalRole.getType() == Role.GROUP) {
Group newgroup =
userAdminFactory.createGroup(internalRole.getName(),
- dictionaryToMap(internalRole.getProperties()),
- dictionaryToMap(((Group)
internalRole).getCredentials()));
+ dictionaryToMap(internalRole.getProperties()),
+ dictionaryToMap(((Group)
internalRole).getCredentials()));
for (Role member : ((FSGroup) internalRole).getMembers()) {
newgroup.addMember(getRole(userAdminFactory,
member.getName()));
}
@@ -333,7 +340,7 @@
}
public User getUser(final UserAdminFactory userAdminFactory, final String
key, final String value)
- throws StorageException {
+ throws StorageException {
checkState();
List<User> matchingUsers = new LinkedList<User>();
try {
@@ -363,7 +370,7 @@
try {
FSRole internalRole = m_storage.getEntity(group.getName());
if (internalRole != null && internalRole.getType() == Role.GROUP
- && ((FSGroup)
internalRole).removeMember(role)) {
+ && ((FSGroup) internalRole).removeMember(role)) {
m_storage.addEntity(internalRole);
return true;
}
@@ -408,7 +415,7 @@
}
public void setRoleAttribute(final Role role, final String key, final
Object value)
- throws StorageException {
+ throws StorageException {
checkState();
try {
FSRole internalRole = m_storage.getEntity(role.getName());
@@ -423,7 +430,7 @@
}
public void setUserCredential(final User user, final String key, final
Object value)
- throws StorageException {
+ throws StorageException {
checkState();
try {
FSRole internalRole = m_storage.getEntity(user.getName());
@@ -451,8 +458,20 @@
}
private void checkState() throws StorageException {
- if (m_storage == null)
+ if (m_storage == null) {
throw new StorageException("Storage backend is not configured");
+ }
}
+ private void removeUserFromAllGroups(Role user) throws IOException {
+ List<FSRole> fsRoles = m_storage.getAll();
+ for (FSRole fsRole : fsRoles) {
+ if (fsRole instanceof FSGroup) {
+ // This is a group, remove the user as member of this group
(if it is a member)
+ if (((FSGroup) fsRole).removeMember(user)) {
+ m_storage.addEntity(fsRole);
+ }
+ }
+ }
+ }
}
\ No newline at end of file
Modified:
trunk/amdatu-core/useradminstore-fs/src/test/java/org/amdatu/core/useradminstore/fs/osgi/FSUserAdminStorageProviderActivatorTest.java
==============================================================================
---
trunk/amdatu-core/useradminstore-fs/src/test/java/org/amdatu/core/useradminstore/fs/osgi/FSUserAdminStorageProviderActivatorTest.java
(original)
+++
trunk/amdatu-core/useradminstore-fs/src/test/java/org/amdatu/core/useradminstore/fs/osgi/FSUserAdminStorageProviderActivatorTest.java
Tue Feb 15 12:50:49 2011
@@ -27,6 +27,8 @@
import junit.framework.Assert;
import org.amdatu.core.tenant.Tenant;
+import org.amdatu.core.useradminstore.fs.service.FSUserAdminStorageConfig;
+import org.amdatu.core.useradminstore.fs.service.FSUserAdminStorageConfigImpl;
import org.amdatu.core.useradminstore.fs.service.FSUserAdminStorageProvider;
import org.amdatu.core.useradminstore.fs.service.mock.MockUserAdminFactory;
import org.apache.felix.dm.ComponentDeclaration;
@@ -88,6 +90,9 @@
final Tenant tenantService = mockContext.mock(Tenant.class);
final Bundle tenantBundle = mockContext.mock(Bundle.class);
final ServiceReference tenantServiceReference =
mockContext.mock(ServiceReference.class);
+ final FSUserAdminStorageConfig configService =
mockContext.mock(FSUserAdminStorageConfig.class);
+ final ServiceReference configServiceReference =
mockContext.mock(ServiceReference.class, "configServiceReference");
+ final Bundle configBundle = mockContext.mock(Bundle.class,
"configBundle");
final File bundleStorageDir = new File(m_absoluteTestRootDirectory,
m_testName.getMethodName());
bundleStorageDir.mkdir();
@@ -128,6 +133,25 @@
allowing(bundleContext).getService(with(tenantServiceReference));
will(returnValue(tenantService));
+ // setup expected calls to config service
+ allowing(configService).getDataDirectoryName();
+ will(returnValue(bundleStorageDir.getAbsolutePath()));
+
+ allowing(configServiceReference).getPropertyKeys();
+ will(returnValue(new String[] {}));
+
allowing(configServiceReference).getProperty(Constants.SERVICE_ID);
+ will(returnValue(1234));
+ allowing(configServiceReference).getBundle();
+ will(returnValue(configBundle));
+
+ // assert that the service will get the config service
+
allowing(bundleContext).getServiceReference(with(FSUserAdminStorageConfig.class.getName()));
+ will(returnValue(configServiceReference));
+
allowing(bundleContext).getServiceReferences(with(FSUserAdminStorageConfig.class.getName()),
with(any(String.class)));
+ will(returnValue(new ServiceReference[] {
configServiceReference }));
+
allowing(bundleContext).getService(with(configServiceReference));
+ will(returnValue(configService));
+
// assert that DM registers a component and store it for
callback
allowing(bundleContext).registerService(with(ComponentDeclaration.class.getName()),
with(aNonNull(Object.class)), with(any(Dictionary.class)));
@@ -141,6 +165,11 @@
one(bundleContext).registerService(with(new String[] {
StorageProvider.class.getName() }),
with(aNonNull(FSUserAdminStorageProvider.class)),
with(any(Dictionary.class)));
will(addRegisteredService());
+
+ // assert that the FSUserAdminStorageConfig is registered and
store it for callback
+ one(bundleContext).registerService(with(new String[] {
FSUserAdminStorageConfig.class.getName(), ManagedService.class.getName() }),
+ with(aNonNull(FSUserAdminStorageConfigImpl.class)),
with(any(Dictionary.class)));
+ will(addRegisteredService());
}
});
@@ -150,12 +179,12 @@
// simulate config admin callback
Dictionary<String, String> dict = new Hashtable<String, String>();
- dict.put(FSUserAdminStorageProvider.DATA_DIRECTORY,
bundleStorageDir.getAbsolutePath());
+ dict.put(FSUserAdminStorageConfigImpl.DATA_DIRECTORY,
bundleStorageDir.getAbsolutePath());
((ManagedService) m_registeredServices.get(0)).updated(dict);
- ((ManagedService) m_registeredServices.get(1)).updated(dict);
+ ((ManagedService) m_registeredServices.get(2)).updated(dict);
// invoke the storage provider to get it persist something
- StorageProvider provider = (StorageProvider)
m_registeredServices.get(2);
+ StorageProvider provider = (StorageProvider)
m_registeredServices.get(1);
provider.createUser(new MockUserAdminFactory(), "Bram");
// assert that the bundleContext storage directory was used
@@ -174,6 +203,9 @@
final Tenant tenantService = mockContext.mock(Tenant.class);
final Bundle tenantBundle = mockContext.mock(Bundle.class);
final ServiceReference tenantServiceReference =
mockContext.mock(ServiceReference.class);
+ final FSUserAdminStorageConfig configService =
mockContext.mock(FSUserAdminStorageConfig.class);
+ final ServiceReference configServiceReference =
mockContext.mock(ServiceReference.class, "configServiceReference");
+ final Bundle configBundle = mockContext.mock(Bundle.class,
"configBundle");
final String relativeStorageDirectoryPath =
m_relativeTestRootDirectory + File.separator +
m_testName.getMethodName();
@@ -216,6 +248,25 @@
allowing(bundleContext).getService(with(tenantServiceReference));
will(returnValue(tenantService));
+ // setup expected calls to config service
+ allowing(configService).getDataDirectoryName();
+
will(returnValue(absolutebundleStorageDirectory.getAbsolutePath()));
+
+ allowing(configServiceReference).getPropertyKeys();
+ will(returnValue(new String[] {}));
+
allowing(configServiceReference).getProperty(Constants.SERVICE_ID);
+ will(returnValue(1234));
+ allowing(configServiceReference).getBundle();
+ will(returnValue(configBundle));
+
+ // assert that the service will get the config service
+
allowing(bundleContext).getServiceReference(with(FSUserAdminStorageConfig.class.getName()));
+ will(returnValue(configServiceReference));
+
allowing(bundleContext).getServiceReferences(with(FSUserAdminStorageConfig.class.getName()),
with(any(String.class)));
+ will(returnValue(new ServiceReference[] {
configServiceReference }));
+
allowing(bundleContext).getService(with(configServiceReference));
+ will(returnValue(configService));
+
// assert that DM registers a component and store it for
callback
allowing(bundleContext).registerService(with(ComponentDeclaration.class.getName()),
with(aNonNull(Object.class)), with(any(Dictionary.class)));
@@ -229,6 +280,11 @@
one(bundleContext).registerService(with(new String[] {
StorageProvider.class.getName() }),
with(aNonNull(FSUserAdminStorageProvider.class)),
with(any(Dictionary.class)));
will(addRegisteredService());
+
+ // assert that the FSUserAdminStorageConfig is registered and
store it for callback
+ one(bundleContext).registerService(with(new String[] {
FSUserAdminStorageConfig.class.getName(), ManagedService.class.getName() }),
+ with(aNonNull(FSUserAdminStorageConfigImpl.class)),
with(any(Dictionary.class)));
+ will(addRegisteredService());
}
});
@@ -239,12 +295,12 @@
// simulate config admin callback with relative dir
System.setProperty("user.dir", JAVA_IO_TMPDIR);
Dictionary<String, String> dict = new Hashtable<String, String>();
- dict.put(FSUserAdminStorageProvider.DATA_DIRECTORY,
relativeStorageDirectoryPath);
+ dict.put(FSUserAdminStorageConfigImpl.DATA_DIRECTORY,
relativeStorageDirectoryPath);
((ManagedService) m_registeredServices.get(0)).updated(dict);
- ((ManagedService) m_registeredServices.get(1)).updated(dict);
+ ((ManagedService) m_registeredServices.get(2)).updated(dict);
// invoke the storage provider to get it persist something
- StorageProvider provider = (StorageProvider)
m_registeredServices.get(2);
+ StorageProvider provider = (StorageProvider)
m_registeredServices.get(1);
provider.createUser(new MockUserAdminFactory(), "Bram");
// assert that the correct storage directory was actually used
@@ -273,8 +329,8 @@
public void describeTo(Description description) {
description.appendText("adds ")
- .appendValueList("", ", ", "", m_services)
- .appendText(" to a collection");
+ .appendValueList("", ", ", "", m_services)
+ .appendText(" to a collection");
}
public Object invoke(Invocation invocation) throws Throwable {
Modified:
trunk/integration-tests/src/test/java/org/amdatu/test/integration/base/IntegrationTestBase.java
==============================================================================
---
trunk/integration-tests/src/test/java/org/amdatu/test/integration/base/IntegrationTestBase.java
(original)
+++
trunk/integration-tests/src/test/java/org/amdatu/test/integration/base/IntegrationTestBase.java
Tue Feb 15 12:50:49 2011
@@ -301,19 +301,19 @@
// //////////////////////////////////////////////////////////
// A load of Pax Exam definitions for easier (typo-free) provisioning
-
+
protected static MavenArtifactProvisionOption amdatuDispatcher() {
return
mavenBundle().groupId("org.amdatu.web").artifactId("dispatcher").versionAsInProject();
}
-
+
protected static MavenArtifactProvisionOption
amdatuHostnameTenantResolver() {
return
mavenBundle().groupId("org.amdatu.web").artifactId("tenantresolver-hostname").versionAsInProject();
}
-
+
protected static MavenArtifactProvisionOption amdatuParameterResolver() {
return
mavenBundle().groupId("org.amdatu.web").artifactId("tenantresolver-parameter").versionAsInProject();
}
-
+
protected static MavenArtifactProvisionOption amdatuJaxRs() {
return
mavenBundle().groupId("org.amdatu.web.rest").artifactId("jaxrs").versionAsInProject();
}
@@ -337,7 +337,7 @@
protected static MavenArtifactProvisionOption amdatuTenantService() {
return
mavenBundle().groupId("org.amdatu.core").artifactId("tenant").versionAsInProject();
}
-
+
protected static MavenArtifactProvisionOption
amdatuTenantUserAdminDecoratorService() {
return
mavenBundle().groupId("org.amdatu.core").artifactId("tenantuseradmindecorator").versionAsInProject();
}
@@ -429,7 +429,7 @@
protected static MavenArtifactProvisionOption felixHttpServiceJetty() {
return
mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.http.jetty").versionAsInProject();
}
-
+
protected static MavenArtifactProvisionOption felixLog() {
return
mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.log").versionAsInProject();
}
Added:
trunk/integration-tests/src/test/java/org/amdatu/test/integration/base/UserAdminStoreTestBase.java
==============================================================================
--- (empty file)
+++
trunk/integration-tests/src/test/java/org/amdatu/test/integration/base/UserAdminStoreTestBase.java
Tue Feb 15 12:50:49 2011
@@ -0,0 +1,215 @@
+package org.amdatu.test.integration.base;
+
+import junit.framework.Assert;
+
+import org.apache.felix.dm.Component;
+import org.apache.felix.dm.DependencyManager;
+import org.junit.Test;
+import org.ops4j.pax.exam.Inject;
+import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.junit.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.useradmin.Group;
+import org.osgi.service.useradmin.Role;
+import org.osgi.service.useradmin.User;
+import org.osgi.service.useradmin.UserAdmin;
+
+public abstract class UserAdminStoreTestBase extends IntegrationTestBase {
+ //Amount of milliseconds to wait between WRITE and READ operations
concerning the same row and same column.
+ // See AMDATU-137.
+ private static int WAIT = 20;
+
+ private final static String ADMIN_USER = "TestAdministrator";
+ private final static String EDITOR_USER = "TestEditor";
+ private final static String GUEST_USER = "TestGuest";
+
+ private final static String ADMIN_GROUP = "TestAdminUsers";
+ private final static String EDITOR_GROUP = "TestEditUsers";
+ private final static String GUEST_GROUP = "TestGuestUsers";
+
+ @Inject
+ protected volatile ConfigurationAdmin m_configAdmin;
+ protected volatile UserAdmin m_userAdmin;
+
+ @Configuration
+ public Option[] configure() {
+ return super.configure();
+ }
+
+ public Component[] getDependencies(DependencyManager manager) {
+ return new Component[] {
+ manager.createComponent().setImplementation(this)
+
.add(manager.createServiceDependency().setService(ConfigurationAdmin.class).setRequired(true))
+ .add(manager.createServiceDependency().setService(UserAdmin.class))
+ };
+ }
+
+ private void sleep() throws InterruptedException {
+ // Wait for 100 milliseconds, remember that Cassandra write operations
are asynchronously
+ Thread.sleep(WAIT);
+ }
+
+ @SuppressWarnings("unchecked")
+ @Test
+ public void testAdminStore() throws Exception {
+ // Start the test, first remove all existing roles
+ Role[] allRoles = m_userAdmin.getRoles(null);
+ if (allRoles != null) {
+ for (Role role : allRoles) {
+ String roleName = role.getName();
+ m_userAdmin.removeRole(roleName);
+ sleep();
+ Assert.assertTrue("Role '" + roleName + "' removed but still
returned", m_userAdmin
+ .getRole(roleName) == null);
+ }
+ }
+
+ // Test if all roles have been removed
+ Assert.assertTrue("All roles were removed, but getRoles() still
returns roles",
+ m_userAdmin.getRoles(null) == null
+ || m_userAdmin.getRoles(null).length == 0);
+
+ // Create three test users and set the credentials
+ User adminUser = (User) m_userAdmin.createRole(ADMIN_USER, Role.USER);
+ User editorUser = (User) m_userAdmin.createRole(EDITOR_USER,
Role.USER);
+ User guestUser = (User) m_userAdmin.createRole(GUEST_USER, Role.USER);
+
+ Assert.assertTrue("All users were removed, but still creating a user
failed since it already exists",
+ adminUser != null && editorUser != null && guestUser != null);
+ adminUser.getCredentials().put("password", "adminpasswd");
+ editorUser.getCredentials().put("password", "editorpasswd");
+ guestUser.getCredentials().put("password", "guestpasswd");
+
+ // Now see if we can find these users from credentials
+ sleep();
+ Assert.assertTrue("TestAdmin user could not be found",
m_userAdmin.getRole(ADMIN_USER) != null);
+ Assert.assertTrue("TestEditor user could not be found",
m_userAdmin.getRole(EDITOR_USER) != null);
+ Assert.assertTrue("TestGuest user could not be found",
m_userAdmin.getRole(GUEST_USER) != null);
+
+ // Set user properties of admin
+ adminUser.getProperties().put("firstName", "John".getBytes());
+ adminUser.getProperties().put("lastName", "Doe".getBytes());
+
+ // And check if they were set correctly
+ sleep();
+ byte[] firstName = (byte[])
m_userAdmin.getRole(ADMIN_USER).getProperties().get("firstName");
+ Assert.assertTrue("firstName not properly set", new String(firstName,
"UTF-8").equals("John"));
+ byte[] lastName = (byte[])
m_userAdmin.getRole(ADMIN_USER).getProperties().get("lastName");
+ Assert.assertTrue("lastName not properly set", new String(lastName,
"UTF-8").equals("Doe"));
+
+ // Remove last name
+ adminUser.getProperties().remove("lastName");
+ sleep();
+ Assert.assertTrue("lastName not properly removed from property set",
+ m_userAdmin.getRole(ADMIN_USER).getProperties().get("lastName") ==
null);
+
+ // Now create "Administrator", "Editor" and "Guest" group and do some
assignments
+ Group adminGroup = (Group) m_userAdmin.createRole(ADMIN_GROUP,
Role.GROUP);
+ Group editorGroup = (Group) m_userAdmin.createRole(EDITOR_GROUP,
Role.GROUP);
+ Group guestGroup = (Group) m_userAdmin.createRole(GUEST_GROUP,
Role.GROUP);
+ adminGroup.addMember(adminUser);
+ adminGroup.addRequiredMember(adminUser);
+
+ // Excessive test of TestEditUsers group since this failed before
+ sleep();
+ assertBasicMemberCount(EDITOR_GROUP, 0);
+ assertRequiredMemberCount(EDITOR_GROUP, 0);
+ editorGroup.addMember(adminUser);
+ sleep();
+ assertBasicMemberCount(EDITOR_GROUP, 1);
+ assertRequiredMemberCount(EDITOR_GROUP, 0);
+ editorGroup.addMember(editorUser);
+ sleep();
+ assertBasicMemberCount(EDITOR_GROUP, 2);
+ assertRequiredMemberCount(EDITOR_GROUP, 0);
+ editorGroup.addRequiredMember(adminUser);
+ sleep();
+ assertBasicMemberCount(EDITOR_GROUP, 2);
+ assertRequiredMemberCount(EDITOR_GROUP, 1);
+ editorGroup.addRequiredMember(editorUser);
+ sleep();
+ assertBasicMemberCount(EDITOR_GROUP, 2);
+ assertRequiredMemberCount(EDITOR_GROUP, 2);
+
+ guestGroup.addMember(adminUser);
+ sleep();
+ guestGroup.addMember(editorUser);
+ sleep();
+ guestGroup.addMember(guestUser);
+ sleep();
+
+ assertBasicMemberCount(ADMIN_GROUP, 1);
+ assertRequiredMemberCount(ADMIN_GROUP, 1);
+ assertBasicMemberCount(EDITOR_GROUP, 2);
+ assertRequiredMemberCount(EDITOR_GROUP, 2);
+ assertBasicMemberCount(GUEST_GROUP, 3);
+ assertRequiredMemberCount(GUEST_GROUP, 0);
+
+ // Now remove some members
+ guestGroup.removeMember(adminUser);
+ sleep();
+ assertBasicMemberCount(GUEST_GROUP, 2);
+
+ // Remove the editor user, is it removed from the admin group?
+ m_userAdmin.removeRole(EDITOR_USER);
+ sleep();
+ assertBasicMemberCount(EDITOR_GROUP, 1);
+ assertRequiredMemberCount(EDITOR_GROUP, 1);
+ Assert.assertTrue("TestEditor should have been removed",
m_userAdmin.getRole(EDITOR_USER) == null);
+
+ // Now remove a user and verify that it is also removed as member of
all groups it was member of
+ m_userAdmin.removeRole(ADMIN_USER);
+ assertBasicMemberCount(ADMIN_GROUP, 0);
+ assertRequiredMemberCount(ADMIN_GROUP, 0);
+ assertBasicMemberCount(GUEST_GROUP, 1);
+
+ m_userAdmin.removeRole(GUEST_USER);
+ assertBasicMemberCount(GUEST_GROUP, 0);
+
+ // Finally, remove all test users and groups
+ allRoles = m_userAdmin.getRoles(null);
+ if (allRoles != null) {
+ for (Role role : allRoles) {
+ String roleName = role.getName();
+ m_userAdmin.removeRole(roleName);
+ sleep();
+ Assert.assertTrue("Role '" + roleName + "' removed but still
returned", m_userAdmin
+ .getRole(roleName) == null);
+ }
+ }
+ }
+
+ private void assertBasicMemberCount(String group, int expected) {
+ Assert.assertTrue("Group '" + group + "' is unknown by UserAdmin",
m_userAdmin.getRole(group) != null);
+ int count =
+ ((Group) m_userAdmin.getRole(group)).getMembers() != null ?
((Group) m_userAdmin.getRole(group))
+ .getMembers().length : 0;
+ if (count != expected) {
+ Role[] members = ((Group)
m_userAdmin.getRole(group)).getMembers();
+ String sMembers = toString(members);
+ Assert.assertTrue("Group '" + group + "' has " + count + "
basic members. Expected: " + expected
+ + ". Members found: " + sMembers, false);
+ }
+ }
+
+ private void assertRequiredMemberCount(String group, int expected) {
+ Assert.assertTrue("Group '" + group + "' is unknown by UserAdmin",
m_userAdmin.getRole(group) != null);
+ int count =
+ ((Group) m_userAdmin.getRole(group)).getRequiredMembers() != null
? ((Group) m_userAdmin.getRole(group))
+ .getRequiredMembers().length : 0;
+ if (count != expected) {
+ Role[] members = ((Group)
m_userAdmin.getRole(group)).getRequiredMembers();
+ String sMembers = toString(members);
+ Assert.assertTrue("Group '" + group + "' has " + count + "
required members. Expected: " + expected
+ + ". Members found: " + sMembers, false);
+ }
+ }
+
+ private String toString(Role[] members) {
+ String sMembers = "";
+ for (Role role : members) {
+ sMembers += role.getName() + " ";
+ }
+ return sMembers;
+ }
+}
Copied:
trunk/integration-tests/src/test/java/org/amdatu/test/integration/tests/UserAdminCassandraStoreTest.java
(from r784,
/trunk/integration-tests/src/test/java/org/amdatu/test/integration/tests/UserAdminStoreTest.java)
==============================================================================
---
/trunk/integration-tests/src/test/java/org/amdatu/test/integration/tests/UserAdminStoreTest.java
(original)
+++
trunk/integration-tests/src/test/java/org/amdatu/test/integration/tests/UserAdminCassandraStoreTest.java
Tue Feb 15 12:50:49 2011
@@ -20,50 +20,32 @@
import java.io.IOException;
-import junit.framework.Assert;
-
import org.amdatu.test.integration.base.ConfigProvider;
-import org.amdatu.test.integration.base.IntegrationTestBase;
-import org.apache.felix.dm.Component;
-import org.apache.felix.dm.DependencyManager;
-import org.junit.Test;
+import org.amdatu.test.integration.base.UserAdminStoreTestBase;
import org.junit.runner.RunWith;
-import org.ops4j.pax.exam.Inject;
import org.ops4j.pax.exam.Option;
-import org.ops4j.pax.exam.junit.Configuration;
import org.ops4j.pax.exam.junit.JUnit4TestRunner;
import org.osgi.service.cm.ConfigurationAdmin;
-import org.osgi.service.useradmin.Group;
-import org.osgi.service.useradmin.Role;
-import org.osgi.service.useradmin.User;
import org.osgi.service.useradmin.UserAdmin;
/**
- * This class provides an integration test for testing the User Admin store.
+ * This class provides an integration test for testing the User Admin
Cassandra store.
*
* @author ivol
*/
@RunWith(JUnit4TestRunner.class)
-public class UserAdminStoreTest extends IntegrationTestBase {
- // Amount of milliseconds to wait between WRITE and READ operations
concerning the same row and same column.
- // See AMDATU-137.
- private static int WAIT = 20;
-
- private final static String ADMIN_USER = "TestAdministrator";
- private final static String EDITOR_USER = "TestEditor";
- private final static String GUEST_USER = "TestGuest";
-
- private final static String ADMIN_GROUP = "TestAdminUsers";
- private final static String EDITOR_GROUP = "TestEditUsers";
- private final static String GUEST_GROUP = "TestGuestUsers";
+public class UserAdminCassandraStoreTest extends UserAdminStoreTestBase {
+ protected void initConfiguration() throws IOException {
+ m_configAdmin = getService(ConfigurationAdmin.class);
- @Inject
- private volatile ConfigurationAdmin m_configAdmin;
- private volatile UserAdmin m_userAdmin;
+ // Add cassandra and templates configs
+ ConfigProvider configProvider = new ConfigProvider();
+ configProvider.addTenantConfig(m_configAdmin);
+ configProvider.addFSTenantStoreConfig(m_configAdmin);
+ configProvider.addCassandraConfig(m_configAdmin);
+ configProvider.addTemplateConfig(m_configAdmin);
- @Configuration
- public Option[] configure() {
- return super.configure();
+ m_userAdmin = getService(UserAdmin.class);
}
protected Option provisionBundles() {
@@ -83,195 +65,4 @@
paxUserAdmin(),
amdatuUserAdminCassandraStore());
}
-
- public Component[] getDependencies(DependencyManager manager) {
- return new Component[] {
- manager.createComponent().setImplementation(this)
-
.add(manager.createServiceDependency().setService(ConfigurationAdmin.class).setRequired(true))
- .add(manager.createServiceDependency().setService(UserAdmin.class))
- };
- }
-
- private void sleep() throws InterruptedException {
- // Wait for 100 milliseconds, remember that Cassandra write operations
are asynchronously
- Thread.sleep(WAIT);
- }
-
- protected void initConfiguration() throws IOException {
- m_configAdmin = getService(ConfigurationAdmin.class);
-
- // Add cassandra and templates configs
- ConfigProvider configProvider = new ConfigProvider();
- configProvider.addTenantConfig(m_configAdmin);
- configProvider.addFSTenantStoreConfig(m_configAdmin);
- configProvider.addCassandraConfig(m_configAdmin);
- configProvider.addTemplateConfig(m_configAdmin);
-
- m_userAdmin = getService(UserAdmin.class);
- }
-
- @SuppressWarnings("unchecked")
- @Test
- public void testAdminStore() throws Exception {
- // Start the test, first remove all existing roles
- Role[] allRoles = m_userAdmin.getRoles(null);
- if (allRoles != null) {
- for (Role role : allRoles) {
- String roleName = role.getName();
- m_userAdmin.removeRole(roleName);
- sleep();
- Assert.assertTrue("Role '" + roleName + "' removed but still
returned", m_userAdmin
- .getRole(roleName) == null);
- }
- }
-
- // Test if all roles have been removed
- Assert.assertTrue("All roles were removed, but getRoles() still
returns roles",
- m_userAdmin.getRoles(null) == null
- || m_userAdmin.getRoles(null).length == 0);
-
- // Create three test users and set the credentials
- User adminUser = (User) m_userAdmin.createRole(ADMIN_USER, Role.USER);
- User editorUser = (User) m_userAdmin.createRole(EDITOR_USER,
Role.USER);
- User guestUser = (User) m_userAdmin.createRole("TestGuest", Role.USER);
-
- Assert.assertTrue("All users were removed, but still creating a user
failed since it already exists",
- adminUser != null && editorUser != null && guestUser != null);
- adminUser.getCredentials().put("password", "adminpasswd");
- editorUser.getCredentials().put("password", "editorpasswd");
- guestUser.getCredentials().put("password", "guestpasswd");
-
- // Now see if we can find these users from credentials
- sleep();
- Assert
- .assertTrue("TestAdmin user could not be found",
m_userAdmin.getUser("name", ADMIN_USER) != null);
- Assert.assertTrue("TestEditor user could not be found",
m_userAdmin.getUser("name", EDITOR_USER) != null);
- Assert.assertTrue("TestGuest user could not be found",
m_userAdmin.getUser("name", GUEST_USER) != null);
-
- // Set user properties of admin
- adminUser.getProperties().put("firstName", "John".getBytes());
- adminUser.getProperties().put("lastName", "Doe".getBytes());
-
- // And check if they were set correctly
- sleep();
- byte[] firstName = (byte[]) m_userAdmin.getUser("name",
ADMIN_USER).getProperties().get("firstName");
- Assert.assertTrue("firstName not properly set", new String(firstName,
"UTF-8").equals("John"));
- byte[] lastName = (byte[]) m_userAdmin.getUser("name",
ADMIN_USER).getProperties().get("lastName");
- Assert.assertTrue("lastName not properly set", new String(lastName,
"UTF-8").equals("Doe"));
-
- // Remove last name
- adminUser.getProperties().remove("lastName");
- sleep();
- Assert.assertTrue("lastName not properly removed from property set",
- m_userAdmin.getUser("name",
ADMIN_USER).getProperties().get("lastName") == null);
-
- // Now create "Administrator", "Editor" and "Guest" group and do some
assignments
- Group adminGroup = (Group) m_userAdmin.createRole(ADMIN_GROUP,
Role.GROUP);
- Group editorGroup = (Group) m_userAdmin.createRole(EDITOR_GROUP,
Role.GROUP);
- Group guestGroup = (Group) m_userAdmin.createRole(GUEST_GROUP,
Role.GROUP);
- adminGroup.addMember(adminUser);
- adminGroup.addRequiredMember(adminUser);
-
- // Excessive test of TestEditUsers group since this failed before
- sleep();
- assertBasicMemberCount(EDITOR_GROUP, 0);
- assertRequiredMemberCount(EDITOR_GROUP, 0);
- editorGroup.addMember(adminUser);
- sleep();
- assertBasicMemberCount(EDITOR_GROUP, 1);
- assertRequiredMemberCount(EDITOR_GROUP, 0);
- editorGroup.addMember(editorUser);
- sleep();
- assertBasicMemberCount(EDITOR_GROUP, 2);
- assertRequiredMemberCount(EDITOR_GROUP, 0);
- editorGroup.addRequiredMember(adminUser);
- sleep();
- assertBasicMemberCount(EDITOR_GROUP, 2);
- assertRequiredMemberCount(EDITOR_GROUP, 1);
- editorGroup.addRequiredMember(editorUser);
- sleep();
- assertBasicMemberCount(EDITOR_GROUP, 2);
- assertRequiredMemberCount(EDITOR_GROUP, 2);
-
- guestGroup.addMember(adminUser);
- sleep();
- guestGroup.addMember(editorUser);
- sleep();
- guestGroup.addMember(guestUser);
- sleep();
-
- assertBasicMemberCount(ADMIN_GROUP, 1);
- assertRequiredMemberCount(ADMIN_GROUP, 1);
- assertBasicMemberCount(EDITOR_GROUP, 2);
- assertRequiredMemberCount(EDITOR_GROUP, 2);
- assertBasicMemberCount(GUEST_GROUP, 3);
- assertRequiredMemberCount(GUEST_GROUP, 0);
-
- // Now remove some members
- guestGroup.removeMember(adminUser);
- sleep();
- assertBasicMemberCount(GUEST_GROUP, 2);
-
- // Remove the editor user, is it removed from the admin group?
- m_userAdmin.removeRole(EDITOR_USER);
- sleep();
- assertBasicMemberCount(EDITOR_GROUP, 1);
- assertRequiredMemberCount(EDITOR_GROUP, 1);
- Assert.assertTrue("TestEditor should have been removed",
m_userAdmin.getRole(EDITOR_USER) == null);
-
- // Now remove a user and verify that it is also removed as member of
all groups it was member of
- m_userAdmin.removeRole(ADMIN_USER);
- assertBasicMemberCount(ADMIN_GROUP, 0);
- assertRequiredMemberCount(ADMIN_GROUP, 0);
- assertBasicMemberCount(GUEST_GROUP, 1);
-
- m_userAdmin.removeRole(GUEST_USER);
- assertBasicMemberCount(GUEST_GROUP, 0);
-
- // Finally, remove all test users and groups
- allRoles = m_userAdmin.getRoles(null);
- if (allRoles != null) {
- for (Role role : allRoles) {
- String roleName = role.getName();
- m_userAdmin.removeRole(roleName);
- sleep();
- Assert.assertTrue("Role '" + roleName + "' removed but still
returned", m_userAdmin
- .getRole(roleName) == null);
- }
- }
- }
-
- private void assertBasicMemberCount(String group, int expected) {
- Assert.assertTrue("Group '" + group + "' is unknown by UserAdmin",
m_userAdmin.getRole(group) != null);
- int count =
- ((Group) m_userAdmin.getRole(group)).getMembers() != null ?
((Group) m_userAdmin.getRole(group))
- .getMembers().length : 0;
- if (count != expected) {
- Role[] members = ((Group)
m_userAdmin.getRole(group)).getMembers();
- String sMembers = toString(members);
- Assert.assertTrue("Group '" + group + "' has " + count + "
basic members. Expected: " + expected
- + ". Members found: " + sMembers, false);
- }
- }
-
- private void assertRequiredMemberCount(String group, int expected) {
- Assert.assertTrue("Group '" + group + "' is unknown by UserAdmin",
m_userAdmin.getRole(group) != null);
- int count =
- ((Group) m_userAdmin.getRole(group)).getRequiredMembers() != null
? ((Group) m_userAdmin.getRole(group))
- .getRequiredMembers().length : 0;
- if (count != expected) {
- Role[] members = ((Group)
m_userAdmin.getRole(group)).getRequiredMembers();
- String sMembers = toString(members);
- Assert.assertTrue("Group '" + group + "' has " + count + "
required members. Expected: " + expected
- + ". Members found: " + sMembers, false);
- }
- }
-
- private String toString(Role[] members) {
- String sMembers = "";
- for (Role role : members) {
- sMembers += role.getName() + " ";
- }
- return sMembers;
- }
}
Added:
trunk/integration-tests/src/test/java/org/amdatu/test/integration/tests/UserAdminFSStoreTest.java
==============================================================================
--- (empty file)
+++
trunk/integration-tests/src/test/java/org/amdatu/test/integration/tests/UserAdminFSStoreTest.java
Tue Feb 15 12:50:49 2011
@@ -0,0 +1,68 @@
+/*
+ Copyright (C) 2010 Amdatu.org
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package org.amdatu.test.integration.tests;
+
+import static org.ops4j.pax.exam.CoreOptions.provision;
+
+import java.io.IOException;
+
+import org.amdatu.test.integration.base.ConfigProvider;
+import org.amdatu.test.integration.base.UserAdminStoreTestBase;
+import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.junit.JUnit4TestRunner;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.useradmin.UserAdmin;
+
+/**
+ * This class provides an integration test for testing the User Admin
Cassandra store.
+ *
+ * @author ivol
+ */
+ at RunWith(JUnit4TestRunner.class)
+public class UserAdminFSStoreTest extends UserAdminStoreTestBase {
+ protected void initConfiguration() throws IOException {
+ m_configAdmin = getService(ConfigurationAdmin.class);
+
+ // Add cassandra and templates configs
+ ConfigProvider configProvider = new ConfigProvider();
+ configProvider.addTenantConfig(m_configAdmin);
+ configProvider.addFSTenantStoreConfig(m_configAdmin);
+ configProvider.addFSUserAdminConfig(m_configAdmin);
+ configProvider.addTemplateConfig(m_configAdmin);
+
+ m_userAdmin = getService(UserAdmin.class);
+ }
+
+ protected Option provisionBundles() {
+ return provision(
+ amdatuTenantService(),
+ amdatuTenantStoreFSService(),
+ amdatuTenantUserAdminDecoratorService(),
+ javaxServlet(), // Required if the httpservice is not deployed
+ amdatuConfigTemplateManager(), // Required for placeholders in
cassandra.yaml
+ amdatuHttpContext(), // needed by cassandra useradmin store
+ amdatuJaxRs(), // needed by cassandra useradmin store
+ amdatuCassandraApplication(),
+ amdatuCassandraListener(),
+ amdatuCassandraPersistenceManager(),
+ slingCommons(),
+ slingMime(),
+ paxUserAdmin(),
+ amdatuUserAdminFSStore());
+ }
+}