Improve and simplify OSGi Boot
[lgpl/argeo-commons.git] / org.argeo.security.core / ext / test / org / argeo / osgi / useradmin / LdifUserAdminTest.java
index d2e3f6290894cd4decf674b3ce9c3b128b48baa4..a8a7d226a1aa124c135d038882782af8e93bf291 100644 (file)
@@ -8,14 +8,14 @@ import java.net.URI;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Arrays;
+import java.util.Base64;
 import java.util.Dictionary;
 import java.util.Hashtable;
 import java.util.List;
 import java.util.UUID;
 
-import org.apache.commons.codec.binary.Base64;
-import org.apache.commons.codec.digest.DigestUtils;
-import org.apache.commons.io.IOUtils;
+import javax.transaction.TransactionManager;
+
 import org.osgi.service.useradmin.Authorization;
 import org.osgi.service.useradmin.Group;
 import org.osgi.service.useradmin.Role;
@@ -27,8 +27,12 @@ import bitronix.tm.resource.ehcache.EhCacheXAResourceProducer;
 import junit.framework.TestCase;
 
 public class LdifUserAdminTest extends TestCase implements BasicTestConstants {
-       private AbstractUserDirectory userAdmin;
        private BitronixTransactionManager tm;
+       private URI uri;
+       private AbstractUserDirectory userAdmin;
+
+       public void testConcurrent() throws Exception {
+       }
 
        @SuppressWarnings("unchecked")
        public void testEdition() throws Exception {
@@ -40,11 +44,13 @@ public class LdifUserAdminTest extends TestCase implements BasicTestConstants {
                demoUser.getProperties().put("cn", newName);
                assertEquals(newName, demoUser.getProperties().get("cn"));
                tm.commit();
+               persistAndRestart();
                assertEquals(newName, demoUser.getProperties().get("cn"));
 
                tm.begin();
                userAdmin.removeRole(DEMO_USER_DN);
                tm.commit();
+               persistAndRestart();
 
                // check data
                Role[] search = userAdmin.getRoles("(objectclass=inetOrgPerson)");
@@ -87,7 +93,8 @@ public class LdifUserAdminTest extends TestCase implements BasicTestConstants {
                assertEquals("root@localhost", rootUser.getProperties().get("mail"));
 
                // credentials
-               byte[] hashedPassword = ("{SHA}" + Base64.encodeBase64String(DigestUtils.sha1("demo".getBytes()))).getBytes();
+               byte[] hashedPassword = ("{SHA}" + Base64.getEncoder().encodeToString(DigestUtils.sha1("demo".getBytes())))
+                               .getBytes();
                assertTrue(rootUser.hasCredential(LdifName.userPassword.name(), hashedPassword));
                assertTrue(demoUser.hasCredential(LdifName.userPassword.name(), hashedPassword));
 
@@ -108,10 +115,10 @@ public class LdifUserAdminTest extends TestCase implements BasicTestConstants {
                        ByteArrayOutputStream out = new ByteArrayOutputStream();
                        ((LdifUserAdmin) userAdmin).save(out);
                        byte[] arr = out.toByteArray();
-                       IOUtils.closeQuietly(out);
+                       out.close();
                        userAdmin.destroy();
-                       String written = new String(arr);
-                       System.out.print(written);
+                       // String written = new String(arr);
+                       // System.out.print(written);
                        try (ByteArrayInputStream in = new ByteArrayInputStream(arr)) {
                                userAdmin = new LdifUserAdmin(props);
                                ((LdifUserAdmin) userAdmin).load(in);
@@ -126,8 +133,7 @@ public class LdifUserAdminTest extends TestCase implements BasicTestConstants {
        @Override
        protected void setUp() throws Exception {
                Path tempDir = Files.createTempDirectory(getClass().getName());
-               URI uri;
-               String uriProp = System.getProperty("argeo.useradmin.uri");
+               String uriProp = System.getProperty("argeo.userdirectory.uri");
                if (uriProp != null)
                        uri = new URI(uriProp);
                else {
@@ -139,25 +145,39 @@ public class LdifUserAdminTest extends TestCase implements BasicTestConstants {
                        uri = ldifPath.toUri();
                }
 
+               bitronix.tm.Configuration tmConf = TransactionManagerServices.getConfiguration();
+               tmConf.setServerId(UUID.randomUUID().toString());
+               tmConf.setLogPart1Filename(new File(tempDir.toFile(), "btm1.tlog").getAbsolutePath());
+               tmConf.setLogPart2Filename(new File(tempDir.toFile(), "btm2.tlog").getAbsolutePath());
+               tm = TransactionManagerServices.getTransactionManager();
+
+               userAdmin = initUserAdmin(uri, tm);
+       }
+
+       private AbstractUserDirectory initUserAdmin(URI uri, TransactionManager tm) {
                Dictionary<String, Object> props = new Hashtable<>();
                props.put(UserAdminConf.uri.name(), uri.toString());
                props.put(UserAdminConf.baseDn.name(), BASE_DN);
                props.put(UserAdminConf.userBase.name(), "ou=users");
                props.put(UserAdminConf.groupBase.name(), "ou=groups");
+               AbstractUserDirectory userAdmin;
                if (uri.getScheme().startsWith("ldap"))
                        userAdmin = new LdapUserAdmin(props);
                else
                        userAdmin = new LdifUserAdmin(props);
                userAdmin.init();
-
-               bitronix.tm.Configuration tmConf = TransactionManagerServices.getConfiguration();
-               tmConf.setServerId(UUID.randomUUID().toString());
-               tmConf.setLogPart1Filename(new File(tempDir.toFile(), "btm1.tlog").getAbsolutePath());
-               tmConf.setLogPart2Filename(new File(tempDir.toFile(), "btm2.tlog").getAbsolutePath());
-               tm = TransactionManagerServices.getTransactionManager();
+               // JTA
                EhCacheXAResourceProducer.registerXAResource(UserDirectory.class.getName(), userAdmin.getXaResource());
-
                userAdmin.setTransactionManager(tm);
+               return userAdmin;
+       }
+
+       private void persistAndRestart() {
+               EhCacheXAResourceProducer.unregisterXAResource(UserDirectory.class.getName(), userAdmin.getXaResource());
+               if (userAdmin instanceof LdifUserAdmin)
+                       ((LdifUserAdmin) userAdmin).save();
+               userAdmin.destroy();
+               userAdmin = initUserAdmin(uri, tm);
        }
 
        @Override