]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.core/src/org/argeo/jcr/unit/AbstractJcrTestCase.java
Merge remote-tracking branch 'origin/master' into v2.x
[lgpl/argeo-commons.git] / org.argeo.core / src / org / argeo / jcr / unit / AbstractJcrTestCase.java
1 package org.argeo.jcr.unit;
2
3 import java.io.File;
4 import java.security.AccessController;
5 import java.security.PrivilegedAction;
6
7 import javax.jcr.Repository;
8 import javax.jcr.RepositoryException;
9 import javax.jcr.Session;
10 import javax.jcr.SimpleCredentials;
11 import javax.security.auth.Subject;
12 import javax.security.auth.login.LoginContext;
13 import javax.security.auth.login.LoginException;
14
15 import org.apache.commons.io.FileUtils;
16 import org.apache.commons.logging.Log;
17 import org.apache.commons.logging.LogFactory;
18 import org.argeo.jcr.JcrException;
19
20 import junit.framework.TestCase;
21
22 /** Base for unit tests with a JCR repository. */
23 public abstract class AbstractJcrTestCase extends TestCase {
24 private final static Log log = LogFactory.getLog(AbstractJcrTestCase.class);
25
26 private Repository repository;
27 private Session session = null;
28
29 public final static String LOGIN_CONTEXT_TEST_SYSTEM = "TEST_JACKRABBIT_ADMIN";
30
31 // protected abstract File getRepositoryFile() throws Exception;
32
33 protected abstract Repository createRepository() throws Exception;
34
35 protected abstract void clearRepository(Repository repository) throws Exception;
36
37 @Override
38 protected void setUp() throws Exception {
39 File homeDir = getHomeDir();
40 FileUtils.deleteDirectory(homeDir);
41 repository = createRepository();
42 }
43
44 @Override
45 protected void tearDown() throws Exception {
46 if (session != null) {
47 session.logout();
48 if (log.isTraceEnabled())
49 log.trace("Logout session");
50 }
51 clearRepository(repository);
52 }
53
54 protected Session session() {
55 if (session != null && session.isLive())
56 return session;
57 Session session;
58 if (getLoginContext() != null) {
59 LoginContext lc;
60 try {
61 lc = new LoginContext(getLoginContext());
62 lc.login();
63 } catch (LoginException e) {
64 throw new IllegalStateException("JAAS login failed", e);
65 }
66 session = Subject.doAs(lc.getSubject(), new PrivilegedAction<Session>() {
67
68 @Override
69 public Session run() {
70 return login();
71 }
72
73 });
74 } else
75 session = login();
76 this.session = session;
77 return this.session;
78 }
79
80 protected String getLoginContext() {
81 return null;
82 }
83
84 protected Session login() {
85 try {
86 if (log.isTraceEnabled())
87 log.trace("Login session");
88 Subject subject = Subject.getSubject(AccessController.getContext());
89 if (subject != null)
90 return getRepository().login();
91 else
92 return getRepository().login(new SimpleCredentials("demo", "demo".toCharArray()));
93 } catch (RepositoryException e) {
94 throw new JcrException("Cannot login to repository", e);
95 }
96 }
97
98 protected Repository getRepository() {
99 return repository;
100 }
101
102 /**
103 * enables children class to set an existing repository in case it is not
104 * deleted on startup, to test migration by instance
105 */
106 public void setRepository(Repository repository) {
107 this.repository = repository;
108 }
109
110 protected File getHomeDir() {
111 File homeDir = new File(System.getProperty("java.io.tmpdir"),
112 AbstractJcrTestCase.class.getSimpleName() + "-" + System.getProperty("user.name"));
113 return homeDir;
114 }
115
116 }