| | |
| | | |
| | | |
| | | /** |
| | | * This class defines a base test case that should be subclassed by all |
| | | * unit tests used by OpenDS. |
| | | * This class defines a base test case that should be subclassed by all unit |
| | | * tests used by OpenDS. |
| | | * <p> |
| | | * This class adds the ability to print error messages and automatically |
| | | * have them include the class name. |
| | | * This class adds the ability to print error messages and automatically have |
| | | * them include the class name. |
| | | */ |
| | | @Test(sequential = true) |
| | | public abstract class OpenDSTestCase |
| | |
| | | // |
| | | |
| | | /** |
| | | * A list of all parameters that were generated by a @DataProvider and |
| | | * passed to a test method of this class. TestListener helps us keep |
| | | * this so that once all of the tests are finished, we can clear it |
| | | * out in an @AfterClass method. We can't just clear it out right away |
| | | * in the TestListener because some methods share a @DataProvider. |
| | | * A list of all parameters that were generated by a @DataProvider and passed |
| | | * to a test method of this class. TestListener helps us keep this so that |
| | | * once all of the tests are finished, we can clear it out in an @AfterClass |
| | | * method. We can't just clear it out right away in the TestListener because |
| | | * some methods share a @DataProvider. |
| | | */ |
| | | private final IdentityHashMap<Object[], Object> successfulTestParams = new IdentityHashMap<Object[], Object>(); |
| | | |
| | | /** |
| | | * These are test parameters from a test that has failed. We need to |
| | | * keep these around because the test report expects to find them when |
| | | * printing out failures. |
| | | * These are test parameters from a test that has failed. We need to keep |
| | | * these around because the test report expects to find them when printing out |
| | | * failures. |
| | | */ |
| | | private final IdentityHashMap<Object[], Object> failedTestParams = new IdentityHashMap<Object[], Object>(); |
| | | |
| | | |
| | | |
| | | /** |
| | | * Adds testParams to the list of all test parameters, so it can be |
| | | * null'ed out later if it's not part. |
| | | */ |
| | | void addParamsFromSuccessfulTests(Object[] testParams) |
| | | { |
| | | if (testParams != null) |
| | | { |
| | | successfulTestParams.put(testParams, testParams); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Adds testParams to the list of all failed test parameters, so that |
| | | * we know to NOT null it out later. |
| | | */ |
| | | void addParamsFromFailedTest(Object[] testParams) |
| | | { |
| | | if (testParams != null) |
| | | { |
| | | failedTestParams.put(testParams, testParams); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * null out all test parameters except the ones used in failed tests |
| | | * since we might need these again. |
| | | * null out all test parameters except the ones used in failed tests since we |
| | | * might need these again. |
| | | */ |
| | | @AfterClass(alwaysRun = true) |
| | | public void clearSuccessfulTestParams() |
| | | { |
| | | Set<Object[]> paramsSet = successfulTestParams.keySet(); |
| | | final Set<Object[]> paramsSet = successfulTestParams.keySet(); |
| | | if (paramsSet == null) |
| | | { // Can this ever happen? |
| | | return; |
| | | } |
| | | for (Object[] params : paramsSet) |
| | | for (final Object[] params : paramsSet) |
| | | { |
| | | if (failedTestParams.containsKey(params)) |
| | | { |
| | |
| | | |
| | | |
| | | /** |
| | | * The member variables of a test class can prevent lots of memory |
| | | * from being reclaimed, so we use reflection to null out all of the |
| | | * member variables after the tests have run. Since all tests must |
| | | * inherit from DirectoryServerTestCase, TestNG guarantees that this |
| | | * method runs after all of the subclass methods, so this isn't too |
| | | * dangerous. |
| | | * The member variables of a test class can prevent lots of memory from being |
| | | * reclaimed, so we use reflection to null out all of the member variables |
| | | * after the tests have run. Since all tests must inherit from |
| | | * DirectoryServerTestCase, TestNG guarantees that this method runs after all |
| | | * of the subclass methods, so this isn't too dangerous. |
| | | */ |
| | | @AfterClass(alwaysRun = true) |
| | | public void nullMemberVariablesAfterTest() |
| | |
| | | while (OpenDSTestCase.class.isAssignableFrom(cls) |
| | | && !OpenDSTestCase.class.equals(cls)) |
| | | { |
| | | Field fields[] = cls.getDeclaredFields(); |
| | | for (int i = 0; i < fields.length; i++) |
| | | final Field fields[] = cls.getDeclaredFields(); |
| | | for (final Field field : fields) |
| | | { |
| | | Field field = fields[i]; |
| | | int modifiers = field.getModifiers(); |
| | | Class<?> fieldClass = field.getType(); |
| | | final int modifiers = field.getModifiers(); |
| | | final Class<?> fieldClass = field.getType(); |
| | | // If it's a non-static non-final non-primitive type, then null |
| | | // it out |
| | | // so that the garbage collector can reclaim it and everything |
| | | // it |
| | | // references. |
| | | if (!fieldClass.isPrimitive() && !fieldClass.isEnum() |
| | | && !Modifier.isFinal(modifiers) |
| | | && !Modifier.isStatic(modifiers)) |
| | | && !Modifier.isFinal(modifiers) && !Modifier.isStatic(modifiers)) |
| | | { |
| | | field.setAccessible(true); |
| | | try |
| | | { |
| | | field.set(this, null); |
| | | } |
| | | catch (IllegalAccessException e) |
| | | catch (final IllegalAccessException e) |
| | | { |
| | | // We're only doing this to save memory, so it's no big deal |
| | | // if we can't set it. |
| | |
| | | cls = cls.getSuperclass(); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Adds testParams to the list of all failed test parameters, so that we know |
| | | * to NOT null it out later. |
| | | */ |
| | | void addParamsFromFailedTest(final Object[] testParams) |
| | | { |
| | | if (testParams != null) |
| | | { |
| | | failedTestParams.put(testParams, testParams); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Adds testParams to the list of all test parameters, so it can be null'ed |
| | | * out later if it's not part. |
| | | */ |
| | | void addParamsFromSuccessfulTests(final Object[] testParams) |
| | | { |
| | | if (testParams != null) |
| | | { |
| | | successfulTestParams.put(testParams, testParams); |
| | | } |
| | | } |
| | | } |