in tools/device_broker/java/com/google/android/apps/common/testing/suite/dex/DumpUtils.java [443:542]
public void run() {
checkState(null != classData, "run twice?");
Optional<TestRelatedClassData> myParentData = null;
try {
myParentData = myParentFutureTestData.get();
} catch (InterruptedException ie) {
throw new RuntimeException(ie);
} catch (ExecutionException ee) {
throwIfUnchecked(ee.getCause());
throw new RuntimeException(ee.getCause());
}
if (myParentData.isPresent() && myParentData.get().defaultAnnotationData.isPresent()) {
// parent is default annotation data.
myFutureTestData.set(Optional.<TestRelatedClassData>absent());
return;
}
if (!myParentData.isPresent() && !hasJUnit4TestData(classData)) {
// nope - not a j4 test, not a j3 test.
myFutureTestData.set(Optional.<TestRelatedClassData>absent());
return;
}
TestRelatedClassData parentData = myParentData.or(new TestRelatedClassData(false));
TestRelatedClassData myTestRelatedData =
new TestRelatedClassData(parentData.descendsFromJUnit3TestCase);
if (classData.isUiTest() || parentData.isUiTest) {
myTestRelatedData.isUiTest = true;
}
List<AnnotationPb> myAggregatedClassAnnotations =
Lists.newArrayList(classData.getAnnotations());
Set<String> myAnnotationClassNames = Sets.newHashSet();
for (AnnotationPb anno : myAggregatedClassAnnotations) {
myAnnotationClassNames.add(anno.getClassName());
}
if (parentData.aggregatedClassAnnotations.isPresent()) {
for (AnnotationPb parentAnno : parentData.aggregatedClassAnnotations.get()) {
if (!myAnnotationClassNames.contains(parentAnno.getClassName())) {
myAggregatedClassAnnotations.add(parentAnno);
}
}
}
myTestRelatedData.aggregatedClassAnnotations = Optional.of(myAggregatedClassAnnotations);
Map<String, MethodData> myAggregatedTestMethods = Maps.newHashMap();
myAggregatedTestMethods.putAll(
FluentIterable.from(classData.getMethods())
.filter(Predicates.or(IS_J3_TEST_METHOD, IS_J4_TEST_METHOD))
.uniqueIndex(EXTRACT_METHOD_NAME));
if (parentData.aggregatedTestMethods.isPresent()) {
// merge the parent test methods to the sub class test methods
// append any annotation present on the parent method to our method.
for (MethodData parentMeth : parentData.aggregatedTestMethods.get()) {
MethodData myOverride = myAggregatedTestMethods.get(parentMeth.getMethodName());
if (null == myOverride) {
myAggregatedTestMethods.put(parentMeth.getMethodName(), parentMeth);
} else {
Set<String> myOverrideAnnotationNames = Sets.newHashSet();
for (AnnotationPb myOverrideAnnotation : myOverride.getAnnotations()) {
myOverrideAnnotationNames.add(myOverrideAnnotation.getClassName());
}
List<AnnotationPb> myAggregatedAnnotations =
Lists.newArrayList(myOverride.getAnnotations());
for (AnnotationPb parentAnno : parentMeth.getAnnotations()) {
if (!myOverrideAnnotationNames.contains(parentAnno.getClassName())) {
myAggregatedAnnotations.add(parentAnno);
}
}
if (myAggregatedAnnotations.size() != myOverride.getAnnotations().size()) {
MethodData.MethodBuilder builder = myOverride.toBuilder().clearAnnotations();
for (AnnotationPb anno : myAggregatedAnnotations) {
builder.addAnnotation(anno);
}
myOverride = builder.build();
myAggregatedTestMethods.put(myOverride.getMethodName(), myOverride);
}
}
}
}
myTestRelatedData.aggregatedTestMethods =
Optional.<List<MethodData>>of(Lists.newArrayList(myAggregatedTestMethods.values()));
if (!classData.isAbstract()) {
myTestRelatedData.executableTests =
Optional.<List<InfoPb>>of(
FluentIterable.from(myTestRelatedData.aggregatedTestMethods.get())
.filter(runnerFilter(myTestRelatedData))
.transform(
new MethodToTestInfoConvertor(
classData,
myTestRelatedData.aggregatedClassAnnotations.get(),
myTestRelatedData.isUiTest))
.toList());
}
classData = null;
myFutureTestData.set(Optional.<TestRelatedClassData>of(myTestRelatedData));
}