/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.activiti.test.ldap;
import java.lang.reflect.Method;
import java.util.Vector;
import javax.annotation.Resource;
import junit.framework.Test;
import org.activiti.spring.impl.test.SpringActivitiTestCase;
import org.springframework.security.ldap.server.ApacheDSContainer;
/**
* Parts of this class come from
* http://www.kimchy.org/before_after_testcase_with_junit/
*
* @author Joram Barrez
*/
public class LDAPTestCase extends SpringActivitiTestCase {
private static int testCount = 0;
private static int totalTestCount = -1;
private static boolean disableAfterTestCase = false;
@Resource(name="org.springframework.security.apacheDirectoryServerContainer")
private ApacheDSContainer apacheDSContainer;
protected LDAPTestCase() {
super();
}
public void runBare() throws Throwable {
Throwable exception = null;
if (totalTestCount == -1) {
totalTestCount = countTotalTests();
}
if (testCount == 0) {
beforeTestCase();
}
testCount++;
try {
super.runBare();
} catch (Throwable running) {
exception = running;
}
if (testCount == totalTestCount) {
totalTestCount = -1;
testCount = 0;
if (!disableAfterTestCase) {
try {
afterTestCase();
} catch (Exception afterTestCase) {
if (exception == null)
exception = afterTestCase;
}
} else {
disableAfterTestCase = false;
}
}
if (exception != null)
throw exception;
}
protected static void disableAfterTestCase() {
disableAfterTestCase = true;
}
protected void beforeTestCase() throws Exception {
}
protected void afterTestCase() throws Exception {
// Need to do this 'manually', or otherwise the ldap server won't be shut down properly
// on the QA machine, failing the next tests
apacheDSContainer.stop();
}
private int countTotalTests() {
int count = 0;
Class superClass = getClass();
Vector names = new Vector();
while (Test.class.isAssignableFrom(superClass)) {
Method[] methods = superClass.getDeclaredMethods();
for (Method method : methods) {
String name = method.getName();
if (names.contains(name))
continue;
names.addElement(name);
if (isTestMethod(method)) {
count++;
}
}
superClass = superClass.getSuperclass();
}
return count;
}
private boolean isTestMethod(Method m) {
String name = m.getName();
Class[] parameters = m.getParameterTypes();
Class returnType = m.getReturnType();
return parameters.length == 0 && name.startsWith("test") && returnType.equals(Void.TYPE);
}
}