]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - org.argeo.server.jcr/src/org/argeo/jcr/unit/AbstractJcrTestCase.java
Improve Jackrabbit unit tests.
[lgpl/argeo-commons.git] / org.argeo.server.jcr / src / org / argeo / jcr / unit / AbstractJcrTestCase.java
index 530605eac6d4a62c4a8a366ac833d2a3576755d7..1d9eedc4d880826210df15837de507dfe63d8688 100644 (file)
 package org.argeo.jcr.unit;
 
 import java.io.File;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
 
 import javax.jcr.Repository;
 import javax.jcr.Session;
 import javax.jcr.SimpleCredentials;
+import javax.security.auth.Subject;
+import javax.security.auth.login.LoginContext;
+import javax.security.auth.login.LoginException;
 
 import junit.framework.TestCase;
 
@@ -34,10 +39,15 @@ public abstract class AbstractJcrTestCase extends TestCase {
        private Repository repository;
        private Session session = null;
 
-       protected abstract File getRepositoryFile() throws Exception;
+       public final static String LOGIN_CONTEXT_TEST_SYSTEM = "TEST_SYSTEM";
+
+       // protected abstract File getRepositoryFile() throws Exception;
 
        protected abstract Repository createRepository() throws Exception;
 
+       protected abstract void clearRepository(Repository repository)
+                       throws Exception;
+
        @Override
        protected void setUp() throws Exception {
                File homeDir = getHomeDir();
@@ -45,34 +55,60 @@ public abstract class AbstractJcrTestCase extends TestCase {
                repository = createRepository();
        }
 
-       protected File getHomeDir() {
-               File homeDir = new File(System.getProperty("java.io.tmpdir"),
-                               AbstractJcrTestCase.class.getSimpleName() + "-"
-                                               + System.getProperty("user.name"));
-               return homeDir;
-       }
-
        @Override
        protected void tearDown() throws Exception {
                if (session != null) {
                        session.logout();
-                       if (log.isDebugEnabled())
-                               log.debug("Logout session");
+                       if (log.isTraceEnabled())
+                               log.trace("Logout session");
                }
+               clearRepository(repository);
        }
 
        protected Session session() {
-               if (session == null) {
+               if (session != null && session.isLive())
+                       return session;
+               Session session;
+               if (getLoginContext() != null) {
+                       LoginContext lc;
                        try {
-                               if (log.isDebugEnabled())
-                                       log.debug("Login session");
-                               session = getRepository().login(
-                                               new SimpleCredentials("demo", "demo".toCharArray()));
-                       } catch (Exception e) {
-                               throw new ArgeoException("Cannot login to repository", e);
+                               lc = new LoginContext(getLoginContext());
+                               lc.login();
+                       } catch (LoginException e) {
+                               throw new ArgeoException("JAAS login failed", e);
                        }
+                       session = Subject.doAs(lc.getSubject(),
+                                       new PrivilegedAction<Session>() {
+
+                                               @Override
+                                               public Session run() {
+                                                       return login();
+                                               }
+
+                                       });
+               } else
+                       session = login();
+               this.session = session;
+               return this.session;
+       }
+
+       protected String getLoginContext() {
+               return null;
+       }
+
+       protected Session login() {
+               try {
+                       if (log.isTraceEnabled())
+                               log.trace("Login session");
+                       Subject subject = Subject.getSubject(AccessController.getContext());
+                       if (subject != null)
+                               return getRepository().login();
+                       else
+                               return getRepository().login(
+                                               new SimpleCredentials("demo", "demo".toCharArray()));
+               } catch (Exception e) {
+                       throw new ArgeoException("Cannot login to repository", e);
                }
-               return session;
        }
 
        protected Repository getRepository() {
@@ -83,7 +119,39 @@ public abstract class AbstractJcrTestCase extends TestCase {
         * enables children class to set an existing repository in case it is not
         * deleted on startup, to test migration by instance
         */
-       protected void setRepository(Repository repository) {
+       public void setRepository(Repository repository) {
                this.repository = repository;
        }
+
+       // public void logout() {
+       // if (session != null && session.isLive())
+       // JcrUtils.logoutQuietly(session);
+       // }
+       //
+       // protected static TestSuite defaultTestSuite(Class<? extends TestCase>
+       // clss) {
+       // String testSuiteClassName =
+       // "org.argeo.jackrabbit.unit.JackrabbitTestSuite";
+       // try {
+       // Class<?> testSuiteClass = AbstractJcrTestCase.class
+       // .getClassLoader().loadClass(testSuiteClassName);
+       // if (clss == null) {
+       // return (TestSuite) testSuiteClass.newInstance();
+       // } else {
+       // return (TestSuite) testSuiteClass.getConstructor(Class.class)
+       // .newInstance(clss);
+       // }
+       // } catch (Exception e) {
+       // throw new ArgeoException("Cannot find default test suite "
+       // + testSuiteClassName, e);
+       // }
+       // }
+
+       protected File getHomeDir() {
+               File homeDir = new File(System.getProperty("java.io.tmpdir"),
+                               AbstractJcrTestCase.class.getSimpleName() + "-"
+                                               + System.getProperty("user.name"));
+               return homeDir;
+       }
+
 }