Rename Commons bundles
[lgpl/argeo-commons.git] / org.argeo.enterprise / ext / test / org / argeo / osgi / useradmin / LdifUserAdminTest.java
diff --git a/org.argeo.enterprise/ext/test/org/argeo/osgi/useradmin/LdifUserAdminTest.java b/org.argeo.enterprise/ext/test/org/argeo/osgi/useradmin/LdifUserAdminTest.java
new file mode 100644 (file)
index 0000000..a8a7d22
--- /dev/null
@@ -0,0 +1,191 @@
+package org.argeo.osgi.useradmin;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.InputStream;
+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 javax.transaction.TransactionManager;
+
+import org.osgi.service.useradmin.Authorization;
+import org.osgi.service.useradmin.Group;
+import org.osgi.service.useradmin.Role;
+import org.osgi.service.useradmin.User;
+
+import bitronix.tm.BitronixTransactionManager;
+import bitronix.tm.TransactionManagerServices;
+import bitronix.tm.resource.ehcache.EhCacheXAResourceProducer;
+import junit.framework.TestCase;
+
+public class LdifUserAdminTest extends TestCase implements BasicTestConstants {
+       private BitronixTransactionManager tm;
+       private URI uri;
+       private AbstractUserDirectory userAdmin;
+
+       public void testConcurrent() throws Exception {
+       }
+
+       @SuppressWarnings("unchecked")
+       public void testEdition() throws Exception {
+               User demoUser = (User) userAdmin.getRole(DEMO_USER_DN);
+               assertNotNull(demoUser);
+
+               tm.begin();
+               String newName = "demo";
+               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)");
+               assertEquals(1, search.length);
+               Group editorGroup = (Group) userAdmin.getRole(EDITORS_GROUP_DN);
+               assertNotNull(editorGroup);
+               Role[] members = editorGroup.getMembers();
+               assertEquals(1, members.length);
+       }
+
+       public void testRetrieve() throws Exception {
+               // users
+               User rootUser = (User) userAdmin.getRole(ROOT_USER_DN);
+               assertNotNull(rootUser);
+               User demoUser = (User) userAdmin.getRole(DEMO_USER_DN);
+               assertNotNull(demoUser);
+
+               // groups
+               Group adminGroup = (Group) userAdmin.getRole(ADMIN_GROUP_DN);
+               assertNotNull(adminGroup);
+               Role[] members = adminGroup.getMembers();
+               assertEquals(1, members.length);
+               assertEquals(rootUser, members[0]);
+
+               Group editorGroup = (Group) userAdmin.getRole(EDITORS_GROUP_DN);
+               assertNotNull(editorGroup);
+               members = editorGroup.getMembers();
+               assertEquals(2, members.length);
+               assertEquals(adminGroup, members[0]);
+               assertEquals(demoUser, members[1]);
+
+               Authorization rootAuth = userAdmin.getAuthorization(rootUser);
+               List<String> rootRoles = Arrays.asList(rootAuth.getRoles());
+               assertEquals(3, rootRoles.size());
+               assertTrue(rootRoles.contains(ROOT_USER_DN));
+               assertTrue(rootRoles.contains(ADMIN_GROUP_DN));
+               assertTrue(rootRoles.contains(EDITORS_GROUP_DN));
+
+               // properties
+               assertEquals("root@localhost", rootUser.getProperties().get("mail"));
+
+               // credentials
+               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));
+
+               // search
+               Role[] search = userAdmin.getRoles(null);
+               assertEquals(4, search.length);
+               search = userAdmin.getRoles("(objectClass=groupOfNames)");
+               assertEquals(2, search.length);
+               search = userAdmin.getRoles("(objectclass=inetOrgPerson)");
+               assertEquals(2, search.length);
+               search = userAdmin.getRoles("(&(objectclass=inetOrgPerson)(uid=demo))");
+               assertEquals(1, search.length);
+       }
+
+       public void testReadWriteRead() throws Exception {
+               if (userAdmin instanceof LdifUserAdmin) {
+                       Dictionary<String, Object> props = userAdmin.getProperties();
+                       ByteArrayOutputStream out = new ByteArrayOutputStream();
+                       ((LdifUserAdmin) userAdmin).save(out);
+                       byte[] arr = out.toByteArray();
+                       out.close();
+                       userAdmin.destroy();
+                       // String written = new String(arr);
+                       // System.out.print(written);
+                       try (ByteArrayInputStream in = new ByteArrayInputStream(arr)) {
+                               userAdmin = new LdifUserAdmin(props);
+                               ((LdifUserAdmin) userAdmin).load(in);
+                       }
+                       Role[] search = userAdmin.getRoles(null);
+                       assertEquals(4, search.length);
+               } else {
+                       // test not relevant for LDAP
+               }
+       }
+
+       @Override
+       protected void setUp() throws Exception {
+               Path tempDir = Files.createTempDirectory(getClass().getName());
+               String uriProp = System.getProperty("argeo.userdirectory.uri");
+               if (uriProp != null)
+                       uri = new URI(uriProp);
+               else {
+                       tempDir.toFile().deleteOnExit();
+                       Path ldifPath = tempDir.resolve(BASE_DN + ".ldif");
+                       try (InputStream in = getClass().getResource("basic.ldif").openStream()) {
+                               Files.copy(in, ldifPath);
+                       }
+                       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();
+               // 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
+       protected void tearDown() throws Exception {
+               EhCacheXAResourceProducer.unregisterXAResource(UserDirectory.class.getName(), userAdmin.getXaResource());
+               tm.shutdown();
+               if (userAdmin != null)
+                       userAdmin.destroy();
+       }
+
+}