Collect annotations for JUnit3 tests.

Necessary to support test annotation filtering in Android.

Cherry-pick of Id4c2923bf3f0aff0847dc8b4705a502c7540d80d

Bug: 9567893
Change-Id: Icebde30f7e55f41811b72eb00c355dfea274830d
diff --git a/src/org/junit/internal/runners/JUnit38ClassRunner.java b/src/org/junit/internal/runners/JUnit38ClassRunner.java
index 98c5773..acb18f8 100644
--- a/src/org/junit/internal/runners/JUnit38ClassRunner.java
+++ b/src/org/junit/internal/runners/JUnit38ClassRunner.java
@@ -7,6 +7,7 @@
 import junit.framework.TestListener;
 import junit.framework.TestResult;
 import junit.framework.TestSuite;
+
 import org.junit.runner.Describable;
 import org.junit.runner.Description;
 import org.junit.runner.Runner;
@@ -18,6 +19,10 @@
 import org.junit.runner.notification.Failure;
 import org.junit.runner.notification.RunNotifier;
 
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+
 public class JUnit38ClassRunner extends Runner implements Filterable, Sortable {
 	private final class OldTestClassAdaptingListener implements
 			TestListener {
@@ -95,7 +100,9 @@
 	private static Description makeDescription(Test test) {
 		if (test instanceof TestCase) {
 			TestCase tc= (TestCase) test;
-			return Description.createTestDescription(tc.getClass(), tc.getName());
+			// android-changed - add getAnnotations(test) call
+			return Description.createTestDescription(tc.getClass(), tc.getName(),
+					getAnnotations(tc));
 		} else if (test instanceof TestSuite) {
 			TestSuite ts= (TestSuite) test;
 			String name= ts.getName() == null ? createSuiteDescription(ts) : ts.getName();
@@ -118,6 +125,25 @@
 		}
 	}
 
+	// android-changed added to support annotation filtering
+	/**
+	 * Get the annotations associated with given TestCase.
+	 * @param test
+	 * @return
+	 */
+	private static Annotation[] getAnnotations(TestCase test) {
+		try {
+			Method m = test.getClass().getDeclaredMethod(test.getName());
+			return m.getDeclaredAnnotations();
+		} catch (SecurityException e) {
+			e.printStackTrace();
+		} catch (NoSuchMethodException e) {
+			e.printStackTrace();
+		}
+		return new Annotation[0];
+	}
+	// android-changed end
+
 	private static String createSuiteDescription(TestSuite ts) {
 		int count= ts.countTestCases();
 		String example = count == 0 ? "" : String.format(" [example: %s]", ts.testAt(0));
@@ -162,6 +188,6 @@
 	 * Creates a shallow copy of given {@link TestSuite}.
 	 */
 	protected TestSuite createCopyOfSuite(TestSuite suite) {
-	    return new TestSuite(suite.getName());
+		return new TestSuite(suite.getName());
 	}
 }