From a5b84b6f37935ff7b4714e8e1945bd391c2140dd Mon Sep 17 00:00:00 2001
From: Jean-Noel Rouvignac <jean-noel.rouvignac@forgerock.com>
Date: Mon, 09 Dec 2013 10:08:04 +0000
Subject: [PATCH] ChangeNumberIndexerTest.java: Test cleanup: stop the indexer thread after each test method has finished running.

---
 opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/je/ChangeNumberIndexerTest.java |   15 ++-
 opends/tests/unit-tests-testng/src/server/org/opends/server/TestListener.java                                            |  184 ++++++++++++++++++++++-----------------------
 2 files changed, 100 insertions(+), 99 deletions(-)

diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/TestListener.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/TestListener.java
index 1789f8f..0cdfe18 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/TestListener.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/TestListener.java
@@ -27,41 +27,23 @@
  */
 package org.opends.server;
 
-import org.testng.TestListenerAdapter;
-import org.testng.IReporter;
-import org.testng.ISuite;
-import org.testng.ITestResult;
-import org.testng.IClass;
-import org.testng.ITestNGMethod;
-import org.testng.ITestContext;
-import org.testng.annotations.Test;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.PrintStream;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+import org.testng.*;
 import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
 import org.testng.xml.XmlSuite;
 
-import static org.opends.server.util.ServerConstants.EOL;
-import static org.opends.server.TestCaseUtils.originalSystemErr;
-
-import java.text.SimpleDateFormat;
-import java.util.List;
-import java.util.LinkedHashMap;
-import java.util.Collection;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.Set;
-import java.util.HashSet;
-import java.util.IdentityHashMap;
-import java.util.LinkedHashSet;
-import java.util.Iterator;
-import java.util.Arrays;
-import java.io.PrintStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.FileNotFoundException;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Method;
-import java.lang.reflect.InvocationTargetException;
+import static org.opends.server.TestCaseUtils.*;
+import static org.opends.server.util.ServerConstants.*;
 
 /**
  * This class is our replacement for the test results that TestNG generates.
@@ -72,8 +54,10 @@
 
   private static final String REPORT_FILE_NAME = "results.txt";
 
-  // This is used to communicate with build.xml.  So that even when a test
-  // fails, we can do the coverage report before failing the build.
+  /**
+   * This is used to communicate with build.xml. So that even when a test fails,
+   * we can do the coverage report before failing the build.
+   */
   private static final String ANT_TESTS_FAILED_FILE_NAME = ".tests-failed-marker";
 
 
@@ -87,7 +71,8 @@
   private static final String TEST_PROGRESS_TIME = "time";
   private static final String TEST_PROGRESS_TEST_COUNT = "count";
   private static final String TEST_PROGRESS_MEMORY = "memory";
-  private static final String TEST_PROGRESS_MEMORY_GCS = "gcs";  // Hidden for now, since it's not useful to most developers
+  /** Hidden for now, since it's not useful to most developers. */
+  private static final String TEST_PROGRESS_MEMORY_GCS = "gcs";
   private static final String TEST_PROGRESS_RESTARTS = "restarts";
   private static final String TEST_PROGRESS_THREAD_COUNT = "threadcount";
   private static final String TEST_PROGRESS_THREAD_CHANGE = "threadchange";
@@ -112,7 +97,7 @@
     prop = prop.toLowerCase();
     List<String> progressValues = Arrays.asList(prop.split("\\s*\\W+\\s*"));
 
-    if ((prop.length() == 0) || progressValues.isEmpty()) {
+    if (prop.length() == 0 || progressValues.isEmpty()) {
       // Accept the defaults
     } else if (progressValues.contains(TEST_PROGRESS_NONE)) {
       doProgressNone = true;
@@ -158,6 +143,7 @@
 
   private static final String DIVIDER_LINE = "-------------------------------------------------------------------------------" + EOL;
 
+  @Override
   public void onStart(ITestContext testContext) {
     super.onStart(testContext);
 
@@ -165,6 +151,7 @@
     new File(testContext.getOutputDirectory(), REPORT_FILE_NAME).delete();
   }
 
+  @Override
   public void generateReport(List<XmlSuite> xmlSuites, List<ISuite> suites, String outputDirectory) {
     File reportFile = new File(outputDirectory, REPORT_FILE_NAME);
 
@@ -176,8 +163,8 @@
   private void writeAntTestsFailedMarker(String outputDirectory) {
     // Signal 'ant' that all of the tests passed by removing this
     // special file.
-    if ((countTestsWithStatus(ITestResult.FAILURE) == 0) &&
-        (countTestsWithStatus(ITestResult.SKIP) == 0))
+    if (countTestsWithStatus(ITestResult.FAILURE) == 0
+        && countTestsWithStatus(ITestResult.SKIP) == 0)
     {
       new File(outputDirectory, ANT_TESTS_FAILED_FILE_NAME).delete();
     }
@@ -195,7 +182,7 @@
 
     reportStream.println(center("UNIT TEST REPORT"));
     reportStream.println(center("----------------") + EOL);
-    reportStream.println("Finished at: " + (new Date()));
+    reportStream.println("Finished at: " + new Date());
     reportStream.println("# Test classes: " + _classResults.size());
     reportStream.println("# Test classes interleaved: " + _classesWithTestsRunInterleaved.size());
     reportStream.println("# Test methods: " + countTestMethods());
@@ -204,10 +191,8 @@
     reportStream.println(EOL + DIVIDER_LINE + DIVIDER_LINE + EOL + EOL);
     reportStream.println(center("TEST CLASSES RUN INTERLEAVED"));
     reportStream.println(EOL + EOL);
-    for (Iterator<Class<?>> iterator = _classesWithTestsRunInterleaved
-        .iterator(); iterator.hasNext();)
+    for (Class<?> cls : _classesWithTestsRunInterleaved)
     {
-      Class<?> cls = iterator.next();
       reportStream.println("  " + cls.getName());
     }
 
@@ -222,8 +207,8 @@
 
     reportStream.close();
 
-    if ((countTestsWithStatus(ITestResult.FAILURE) == 0) &&
-        (countTestsWithStatus(ITestResult.SKIP) != 0)) {
+    if (countTestsWithStatus(ITestResult.FAILURE) == 0
+        && countTestsWithStatus(ITestResult.SKIP) != 0) {
       originalSystemErr.println("There were no explicit test failures, but some tests were skipped (possibly due to errors in @Before* or @After* methods).");
       System.exit(-1);
     }
@@ -238,7 +223,7 @@
 
   private void writeReportToScreen(File reportFile) {
     // HACK: print out status for the last test object
-    outputTestProgress(_lastTestObject, true);
+    outputTestProgress(_lastTestObject);
 
     List<ITestResult> failedTests = getFailedTests();
     StringBuilder failed = new StringBuilder();
@@ -248,8 +233,8 @@
       int numFailures = 1;
       // Peek ahead to see if we had multiple failures for the same method
       // In which case, we list it once with a count of the failures.
-      while (((i + 1) < failedTests.size()) &&
-              fqMethod.equals(getFqMethod(failedTests.get(i+1)))) {
+      while (i + 1 < failedTests.size()
+          && fqMethod.equals(getFqMethod(failedTests.get(i+1)))) {
         numFailures++;
         i++;
       }
@@ -257,7 +242,7 @@
       failed.append("  ").append(fqMethod);
 
       if (numFailures > 1) {
-        failed.append(" (x " + numFailures + ")");
+        failed.append(" (x ").append(numFailures).append(")");
       }
 
       failed.append(EOL);
@@ -315,6 +300,7 @@
   }
 
 
+  @Override
   public void onTestStart(ITestResult tr) {
     super.onTestStart(tr);
 
@@ -330,11 +316,13 @@
     addTestResult(tr);
   }
 
+  @Override
   public void onTestSuccess(ITestResult tr) {
     super.onTestSuccess(tr);
     onTestFinished(tr);
   }
 
+  @Override
   public void onTestFailure(ITestResult tr) {
     super.onTestFailure(tr);
 
@@ -353,14 +341,15 @@
       failureInfo.append("Failure Cause:  ").append(getTestngLessStack(cause));
     }
 
-    for (int i = 0; (parameters != null) && (i < parameters.length); i++) {
+    for (int i = 0; parameters != null && i < parameters.length; i++) {
       Object parameter = parameters[i];
-      failureInfo.append("parameter[" + i + "]: ").append(parameter).append(EOL);
+      failureInfo.append("parameter[").append(i).append("]: ")
+          .append(parameter).append(EOL);
     }
 
     appendFailureInfo(failureInfo);
 
-    failureInfo.append(EOL + EOL);
+    failureInfo.append(EOL).append(EOL);
     originalSystemErr.print(EOL + EOL + EOL + "                 T E S T   F A I L U R E ! ! !" + EOL + EOL);
     originalSystemErr.print(failureInfo);
     originalSystemErr.print(DIVIDER_LINE + EOL + EOL);
@@ -368,7 +357,7 @@
     _bufferedTestFailures.append(failureInfo);
 
     String pauseStr = System.getProperty("org.opends.test.pauseOnFailure");
-    if ((pauseStr != null) && pauseStr.equalsIgnoreCase("true"))
+    if ("true".equalsIgnoreCase(pauseStr))
     {
       pauseOnFailure();
     }
@@ -401,7 +390,7 @@
            "JVM when you're done investigating the problem.");
     }
 
-    while ((tempFile != null) && tempFile.exists())
+    while (tempFile != null && tempFile.exists())
     {
       try
       {
@@ -418,6 +407,7 @@
     TestCaseUtils.appendLogsContents(failureInfo);
   }
 
+  @Override
   public void onConfigurationFailure(ITestResult tr) {
     super.onConfigurationFailure(tr);
 
@@ -436,7 +426,7 @@
 
     appendFailureInfo(failureInfo);
 
-    failureInfo.append(EOL + EOL);
+    failureInfo.append(EOL).append(EOL);
     originalSystemErr.print(EOL + EOL + EOL + "         C O N F I G U R A T I O N   F A I L U R E ! ! !" + EOL + EOL);
     originalSystemErr.print(failureInfo);
     originalSystemErr.print(DIVIDER_LINE + EOL + EOL);
@@ -452,7 +442,7 @@
     for (lowestOpenDSFrame = elements.length - 1; lowestOpenDSFrame >= 0; lowestOpenDSFrame--) {
       StackTraceElement element = elements[lowestOpenDSFrame];
       String clsName = element.getClassName();
-      if (clsName.startsWith("org.opends.") && !clsName.equals("org.opends.server.SuiteRunner")) {
+      if (clsName.startsWith("org.opends.") && !"org.opends.server.SuiteRunner".equals(clsName)) {
         break;
       }
     }
@@ -464,18 +454,17 @@
     }
 
     Throwable cause = t.getCause();
-    if (t != null) {
-      if (cause instanceof InvocationTargetException) {
-        InvocationTargetException invocation = ((InvocationTargetException)cause);
-        buffer.append("Invocation Target Exception: " + getTestngLessStack(invocation));
-      }
+    if (cause instanceof InvocationTargetException) {
+      InvocationTargetException invocation = (InvocationTargetException) cause;
+      buffer.append("Invocation Target Exception: ").append(
+          getTestngLessStack(invocation));
     }
 
     return buffer.toString();
   }
 
 
-  private final static int PAGE_WIDTH = 80;
+  private static final int PAGE_WIDTH = 80;
   private static String center(String header) {
     StringBuilder buffer = new StringBuilder();
     int indent = (PAGE_WIDTH - header.length()) / 2;
@@ -487,11 +476,13 @@
   }
 
 
+  @Override
   public void onTestSkipped(ITestResult tr) {
     super.onTestSkipped(tr);
     onTestFinished(tr);
   }
 
+  @Override
   public void onTestFailedButWithinSuccessPercentage(ITestResult tr) {
     super.onTestFailedButWithinSuccessPercentage(tr);
     onTestFinished(tr);
@@ -503,8 +494,8 @@
     // Read the comments in DirectoryServerTestCase to understand what's
     // going on here.
     Object[] testInstances = result.getMethod().getInstances();
-    for (int i = 0; i < testInstances.length; i++) {
-      Object testInstance = testInstances[i];
+    for (Object testInstance : testInstances)
+    {
       if (testInstance instanceof DirectoryServerTestCase) {
         DirectoryServerTestCase dsTestCase = (DirectoryServerTestCase)testInstance;
         Object[] parameters = result.getParameters();
@@ -520,9 +511,7 @@
           // or DN), so go ahead and convert it to a String now.
           result.setParameters(convertToStringParameters(parameters));
         }
-      } else {
-        // We already warned about it.
-      }
+      } // else we already warned about it.
     }
   }
 
@@ -609,7 +598,7 @@
     }
 
     // Output progress info since we're running a new class
-    outputTestProgress(_lastTestObject, false);
+    outputTestProgress(_lastTestObject);
 
     // And make sure we don't have a test object that we already ran tests with.
     if (_previousTestObjects.containsKey(testInstance)) {
@@ -632,7 +621,7 @@
     Annotation testAnnotation = testMethod.getAnnotation(Test.class);
     Annotation dataProviderAnnotation = testMethod.getAnnotation(DataProvider.class);
 
-    if ((testAnnotation == null) && (dataProviderAnnotation == null)) {
+    if (testAnnotation == null && dataProviderAnnotation == null) {
       String errorMessage =
               "The test method " + testMethod + " does not have a @Test annotation.  " +
               "However, TestNG assumes it is a test method because it's a public method " +
@@ -643,15 +632,16 @@
   }
 
 
-  // Return the class in cls's inheritence hierarchy that has the @Test
-  // annotation defined.
+  /**
+   * Return the class in cls's inheritance hierarchy that has the @Test
+   * annotation defined.
+   */
   private Class<?> findClassWithTestAnnotation(Class<?> cls) {
     while (cls != null) {
       if (cls.getAnnotation(Test.class) != null) {
         return cls;
-      } else {
-        cls = cls.getSuperclass();
       }
+      cls = cls.getSuperclass();
     }
     return null;
   }
@@ -709,7 +699,7 @@
   private long maxMemInUse = 0;
   private boolean isFirstTest = true;
 
-  private void outputTestProgress(Object finishedTestObject, boolean isLastTest)
+  private void outputTestProgress(Object finishedTestObject)
   {
     if (doProgressNone)
     {
@@ -818,7 +808,7 @@
     long curMem = usedMemory();
     long prevMem = Long.MAX_VALUE;
     StringBuilder gcConvergence = new StringBuilder();
-    for (numGcs = 0; (prevMem > curMem) && numGcs < 100; numGcs++) {
+    for (numGcs = 0; prevMem > curMem && numGcs < 100; numGcs++) {
         runtime.runFinalization();
         runtime.gc();
         Thread.yield();
@@ -827,7 +817,8 @@
         prevMem = curMem;
         curMem = usedMemory();
 
-        gcConvergence.append("[" + numGcs + "]: " + (prevMem - curMem)).append("  ");
+        gcConvergence.append("[").append(numGcs).append("]: ").append(
+            prevMem - curMem).append("  ");
     }
     return numGcs;
   }
@@ -869,12 +860,14 @@
   synchronized StringBuilder getTimingInfo() {
     StringBuilder timingOutput = new StringBuilder();
     timingOutput.append(center("TESTS RUN BY CLASS")).append(EOL);
-    timingOutput.append(center("[method-name total-time (total-invocations)]")).append(EOL + EOL);
+    timingOutput.append(center("[method-name total-time (total-invocations)]"))
+        .append(EOL).append(EOL);
     for (TestClassResults results: _classResults.values()) {
       results.getTimingInfo(timingOutput);
     }
 
-    timingOutput.append(EOL + DIVIDER_LINE + DIVIDER_LINE + EOL);
+    timingOutput.append(EOL).append(DIVIDER_LINE).append(DIVIDER_LINE).append(
+        EOL);
 
     getSlowestTestsOutput(timingOutput);
     return timingOutput;
@@ -904,7 +897,7 @@
     return count;
   }
 
-  synchronized private List<TestMethodResults> getAllMethodResults() {
+  private synchronized List<TestMethodResults> getAllMethodResults() {
     List<TestMethodResults> allResults = new ArrayList<TestMethodResults>();
     for (TestClassResults results: _classResults.values()) {
       allResults.addAll(results.getAllMethodResults());
@@ -916,7 +909,8 @@
 
   private void getSlowestTestsOutput(StringBuilder timingOutput) {
     timingOutput.append(center("CLASS SUMMARY SORTED BY DURATION")).append(EOL);
-    timingOutput.append(center("[class-name total-time (total-invocations)]")).append(EOL + EOL);
+    timingOutput.append(center("[class-name total-time (total-invocations)]"))
+        .append(EOL).append(EOL);
     List<TestClassResults> sortedClasses = getClassesDescendingSortedByDuration();
     for (int i = 0; i < sortedClasses.size(); i++) {
       TestClassResults results = sortedClasses.get(i);
@@ -925,9 +919,10 @@
       timingOutput.append(EOL);
     }
 
-    timingOutput.append(EOL + DIVIDER_LINE + EOL + EOL);
+    timingOutput.append(EOL).append(DIVIDER_LINE).append(EOL).append(EOL);
     timingOutput.append(center("SLOWEST METHODS")).append(EOL);
-    timingOutput.append(center("[method-name total-time (total-invocations)]")).append(EOL + EOL);
+    timingOutput.append(center("[method-name total-time (total-invocations)]"))
+        .append(EOL).append(EOL);
     List<TestMethodResults> sortedMethods = getMethodsDescendingSortedByDuration();
     for (int i = 0; i < Math.min(sortedMethods.size(), NUM_SLOWEST_METHODS); i++) {
       TestMethodResults results = sortedMethods.get(i);
@@ -939,6 +934,7 @@
   private List<TestMethodResults> getMethodsDescendingSortedByDuration() {
     List<TestMethodResults> allMethods = getAllMethodResults();
     Collections.sort(allMethods, new Comparator<TestMethodResults>() {
+      @Override
       public int compare(TestMethodResults o1, TestMethodResults o2) {
         if (o1._totalDurationMs > o2._totalDurationMs) {
           return -1;
@@ -955,6 +951,7 @@
   private List<TestClassResults> getClassesDescendingSortedByDuration() {
     List<TestClassResults> allClasses = new ArrayList<TestClassResults>(_classResults.values());
     Collections.sort(allClasses, new Comparator<TestClassResults>() {
+      @Override
       public int compare(TestClassResults o1, TestClassResults o2) {
         if (o1._totalDurationMs > o2._totalDurationMs) {
           return -1;
@@ -968,20 +965,17 @@
     return allClasses;
   }
 
-  private final static String[] STATUSES =
+  private static final String[] STATUSES =
           {"<<invalid>>", "Success", "Failure", "Skip", "Success Percentage Failure"};
 
 
-  /**
-   *
-   */
   private static class TestClassResults {
     private final IClass _cls;
     private final LinkedHashMap<ITestNGMethod, TestMethodResults> _methods = new LinkedHashMap<ITestNGMethod, TestMethodResults>();
     private int _totalInvocations = 0;
     private long _totalDurationMs = 0;
 
-    // Indexed by SUCCESS, FAILURE, SKIP, SUCCESS_PERCENTAGE_FAILURE
+    /** Indexed by SUCCESS, FAILURE, SKIP, SUCCESS_PERCENTAGE_FAILURE. */
     private int[] _resultCounts = new int[STATUSES.length];
 
     public TestClassResults(IClass cls) {
@@ -1010,8 +1004,9 @@
     }
 
     synchronized void getSummaryTimingInfo(StringBuilder timingOutput) {
-      timingOutput.append(_cls.getRealClass().getName() + "    ");
-      timingOutput.append(getTotalDurationMs() + " ms" + " (" + getTotalInvocations() + ")");
+      timingOutput.append(_cls.getRealClass().getName()).append("    ");
+      timingOutput.append(getTotalDurationMs()).append(" ms")
+          .append(" (").append(getTotalInvocations()).append(")");
     }
 
     synchronized Collection<TestMethodResults> getAllMethodResults() {
@@ -1038,15 +1033,12 @@
   }
 
 
-  /**
-   *
-   */
   private static class TestMethodResults {
     private final ITestNGMethod _method;
     int _totalInvocations = 0;
     long _totalDurationMs = 0;
 
-    // Indexed by SUCCESS, FAILURE, SKIP, SUCCESS_PERCENTAGE_FAILURE
+    /** Indexed by SUCCESS, FAILURE, SKIP, SUCCESS_PERCENTAGE_FAILURE. */
     private int[] _resultCounts = new int[STATUSES.length];
 
     public TestMethodResults(ITestNGMethod method) {
@@ -1069,10 +1061,12 @@
       if (includeClassName) {
         timingOutput.append(_method.getRealClass().getName()).append("#");
       }
-      timingOutput.append(_method.getMethodName() + "  ");
-      timingOutput.append(_totalDurationMs + " ms" + " (" + _totalInvocations + ")");
+      timingOutput.append(_method.getMethodName()).append("  ");
+      timingOutput.append(_totalDurationMs).append(" ms")
+          .append(" (").append(_totalInvocations).append(")");
       if (_resultCounts[ITestResult.FAILURE] > 0) {
-        timingOutput.append(" " + _resultCounts[ITestResult.FAILURE] + " failure(s)");
+        timingOutput.append(" ").append(_resultCounts[ITestResult.FAILURE])
+            .append(" failure(s)");
       }
       timingOutput.append(EOL);
     }
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/je/ChangeNumberIndexerTest.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/je/ChangeNumberIndexerTest.java
index 2b1cf65..a0fe363 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/je/ChangeNumberIndexerTest.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/replication/server/changelog/je/ChangeNumberIndexerTest.java
@@ -45,10 +45,7 @@
 import org.opends.server.replication.server.changelog.api.ChangelogDB;
 import org.opends.server.replication.server.changelog.api.ReplicationDomainDB;
 import org.opends.server.types.DN;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
+import org.testng.annotations.*;
 
 import com.forgerock.opendj.util.Pair;
 
@@ -135,6 +132,11 @@
     initialCookie = new MultiDomainServerState();
   }
 
+  @AfterMethod
+  public void tearDown() throws Exception
+  {
+    stopIndexer();
+  }
 
   private static final String EMPTY_DB_NO_DS = "emptyDBNoDS";
 
@@ -298,6 +300,11 @@
     waitForWaitingState(indexer);
   }
 
+  private void stopIndexer()
+  {
+    indexer.initiateShutdown();
+  }
+
   private ReplicatedUpdateMsg msg(DN baseDN, int serverId, long time)
   {
     return new ReplicatedUpdateMsg(baseDN, new CSN(time, 0, serverId));

--
Gitblit v1.10.0