am f5ea1065: am 26034f90: am 01c2b49b: Add abi to generated XML
* commit 'f5ea10659a3d1a3931e70a78d6a350e8da4d721c':
Add abi to generated XML
diff --git a/libs/commonutil/Android.mk b/libs/commonutil/Android.mk
new file mode 100644
index 0000000..9c131b0
--- /dev/null
+++ b/libs/commonutil/Android.mk
@@ -0,0 +1,27 @@
+#
+# Copyright (C) 2014 The Android Open Source Project
+#
+# 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.
+#
+
+include $(call all-subdir-makefiles)
+
+# ======================================================
+# Build a static host library for the AbiUtils
+LOCAL_PATH:= $(call my-dir)
+include $(CLEAR_VARS)
+LOCAL_SRC_FILES := src/com/android/cts/util/AbiUtils.java
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_MODULE := ctsabiutilslib
+include $(BUILD_HOST_JAVA_LIBRARY)
diff --git a/libs/commonutil/src/com/android/cts/util/AbiUtils.java b/libs/commonutil/src/com/android/cts/util/AbiUtils.java
index 4a34c6f..6f47d52 100644
--- a/libs/commonutil/src/com/android/cts/util/AbiUtils.java
+++ b/libs/commonutil/src/com/android/cts/util/AbiUtils.java
@@ -163,4 +163,22 @@
public static String getBitness(String name) {
return ABIS_32BIT.contains(name) ? "32" : "64";
}
+
+ /**
+ * @param abilistString A comma separated string containing abis.
+ * @return A List of Strings containing valid ABIs.
+ */
+ public static Set<String> parseAbiList(String unsupportedAbiDescription) {
+ Set<String> abiSet = new HashSet<>();
+ String[] descSegments = unsupportedAbiDescription.split(":");
+ if (descSegments.length == 2) {
+ for (String abi : descSegments[1].split(",")) {
+ String trimmedAbi = abi.trim();
+ if (isAbiSupportedByCts(trimmedAbi)) {
+ abiSet.add(trimmedAbi);
+ }
+ }
+ }
+ return abiSet;
+ }
}
diff --git a/tools/utils/Android.mk b/tools/utils/Android.mk
index 36081ca..0ba5cf4 100644
--- a/tools/utils/Android.mk
+++ b/tools/utils/Android.mk
@@ -25,6 +25,6 @@
LOCAL_CLASSPATH := $(HOST_JDK_TOOLS_JAR)
LOCAL_JAVA_LIBRARIES := junit
-LOCAL_STATIC_JAVA_LIBRARIES := vogarexpectlib
+LOCAL_STATIC_JAVA_LIBRARIES := ctsabiutilslib vogarexpectlib
include $(BUILD_HOST_JAVA_LIBRARY)
diff --git a/tools/utils/CollectAllTests.java b/tools/utils/CollectAllTests.java
index 367fb93..ed74824 100644
--- a/tools/utils/CollectAllTests.java
+++ b/tools/utils/CollectAllTests.java
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+import com.android.cts.util.AbiUtils;
import org.junit.runner.RunWith;
import org.w3c.dom.Document;
@@ -20,6 +21,7 @@
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
+import vogar.Expectation;
import vogar.ExpectationStore;
import java.io.BufferedReader;
@@ -61,9 +63,9 @@
private static final String TEST_TYPE = "LOCAL_TEST_TYPE :";
public static void main(String[] args) {
- if (args.length < 4 || args.length > 6) {
+ if (args.length < 5 || args.length > 7) {
System.err.println("usage: CollectAllTests <output-file> <manifest-file> <jar-file> "
- + "<java-package> [expectation-dir [makefile-file]]");
+ + "<java-package> <architecture> [expectation-dir [makefile-file]]");
if (args.length != 0) {
System.err.println("received:");
for (String arg : args) {
@@ -86,8 +88,14 @@
return;
}
}
- String libcoreExpectationDir = (args.length > 4) ? args[4] : null;
- String androidMakeFile = (args.length > 5) ? args[5] : null;
+ String architecture = args[4];
+ if (architecture == null || architecture.equals("")) {
+ System.err.println("Invalid architecture");
+ System.exit(1);
+ return;
+ }
+ String libcoreExpectationDir = (args.length > 5) ? args[5] : null;
+ String androidMakeFile = (args.length > 6) ? args[6] : null;
final TestType testType = TestType.getTestType(androidMakeFile);
@@ -207,7 +215,7 @@
try {
klass.getConstructor(new Class<?>[] { String.class } );
- addToTests(expectations, testCases, klass);
+ addToTests(expectations, architecture, testCases, klass);
continue;
} catch (NoSuchMethodException e) {
} catch (SecurityException e) {
@@ -218,7 +226,7 @@
try {
klass.getConstructor(new Class<?>[0]);
- addToTests(expectations, testCases, klass);
+ addToTests(expectations, architecture, testCases, klass);
continue;
} catch (NoSuchMethodException e) {
} catch (SecurityException e) {
@@ -356,6 +364,7 @@
}
private static void addToTests(ExpectationStore[] expectations,
+ String architecture,
Map<String,TestClass> testCases,
Class<?> testClass) {
Set<String> testNames = new HashSet<String>();
@@ -386,11 +395,12 @@
}
testNames.add(testName);
- addToTests(expectations, testCases, testClass, testName);
+ addToTests(expectations, architecture, testCases, testClass, testName);
}
}
private static void addToTests(ExpectationStore[] expectations,
+ String architecture,
Map<String,TestClass> testCases,
Class<?> test,
String testName) {
@@ -412,6 +422,10 @@
return;
}
+ Set<String> supportedAbis = VogarUtils.extractSupportedAbis(architecture,
+ expectations,
+ testClassName,
+ testName);
TestClass testClass;
if (testCases.containsKey(testClassName)) {
testClass = testCases.get(testClassName);
@@ -420,7 +434,8 @@
testCases.put(testClassName, testClass);
}
- testClass.mCases.add(new TestMethod(testName, "", "", knownFailure, false, false));
+ testClass.mCases.add(new TestMethod(testName, "", "", supportedAbis,
+ knownFailure, false, false));
}
private static boolean isJunit3Test(Class<?> klass) {
diff --git a/tools/utils/DescriptionGenerator.java b/tools/utils/DescriptionGenerator.java
index 607d2e5..09e1118 100644
--- a/tools/utils/DescriptionGenerator.java
+++ b/tools/utils/DescriptionGenerator.java
@@ -22,6 +22,7 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
+import java.util.Set;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
@@ -38,6 +39,7 @@
import org.w3c.dom.NodeList;
import vogar.ExpectationStore;
+import vogar.Expectation;
import com.sun.javadoc.AnnotationDesc;
import com.sun.javadoc.AnnotationTypeDoc;
@@ -82,11 +84,13 @@
static final String ATTRIBUTE_VALUE_FRAMEWORK = "Android 1.0";
static final String ATTRIBUTE_NAME = "name";
+ static final String ATTRIBUTE_ABIS = "abis";
static final String ATTRIBUTE_HOST_CONTROLLER = "HostController";
static final String XML_OUTPUT_PATH = "./description.xml";
static final String OUTPUT_PATH_OPTION = "-o";
+ static final String ARCHITECTURE_OPTION = "-a";
/**
* Start to parse the classes passed in by javadoc, and generate
@@ -103,12 +107,21 @@
}
String outputPath = XML_OUTPUT_PATH;
+ String architecture = null;
String[][] options = root.options();
for (String[] option : options) {
- if (option.length == 2 && option[0].equals(OUTPUT_PATH_OPTION)) {
- outputPath = option[1];
+ if (option.length == 2) {
+ if (option[0].equals(OUTPUT_PATH_OPTION)) {
+ outputPath = option[1];
+ } else if (option[0].equals(ARCHITECTURE_OPTION)) {
+ architecture = option[1];
+ }
}
}
+ if (architecture == null || architecture.equals("")) {
+ Log.e("Missing architecture!", null);
+ return false;
+ }
XMLGenerator xmlGenerator = null;
try {
@@ -128,7 +141,7 @@
for (ClassDoc clazz : classes) {
if ((!clazz.isAbstract()) && (isValidJUnitTestCase(clazz))) {
- xmlGenerator.addTestClass(new TestClass(clazz, ctsExpectationStore));
+ xmlGenerator.addTestClass(new TestClass(clazz, ctsExpectationStore, architecture));
}
}
@@ -420,6 +433,8 @@
Node caseNode = elem.appendChild(mDoc.createElement(TAG_TEST));
setAttribute(caseNode, ATTRIBUTE_NAME, caze.mName);
+ String abis = caze.mAbis.toString();
+ setAttribute(caseNode, ATTRIBUTE_ABIS, abis.substring(1, abis.length() - 1));
if ((caze.mController != null) && (caze.mController.length() != 0)) {
setAttribute(caseNode, ATTRIBUTE_HOST_CONTROLLER, caze.mController);
}
@@ -509,9 +524,9 @@
*
* @param clazz The specified ClassDoc.
*/
- TestClass(ClassDoc clazz, ExpectationStore expectationStore) {
+ TestClass(ClassDoc clazz, ExpectationStore expectationStore, String architecture) {
mName = clazz.toString();
- mCases = getTestMethods(expectationStore, clazz);
+ mCases = getTestMethods(expectationStore, architecture, clazz);
}
/**
@@ -520,7 +535,8 @@
* @param clazz The specified ClassDoc.
* @return A collection of TestMethod.
*/
- Collection<TestMethod> getTestMethods(ExpectationStore expectationStore, ClassDoc clazz) {
+ Collection<TestMethod> getTestMethods(ExpectationStore expectationStore,
+ String architecture, ClassDoc clazz) {
Collection<MethodDoc> methods = getAllMethods(clazz);
ArrayList<TestMethod> cases = new ArrayList<TestMethod>();
@@ -553,8 +569,13 @@
}
if (name.startsWith("test")) {
- cases.add(new TestMethod(name, method.commentText(), controller, knownFailure,
- isBroken, isSuppressed));
+ Expectation expectation = expectationStore.get(
+ VogarUtils.buildFullTestName(clazz.toString(), name));
+ Set<String> supportedAbis =
+ VogarUtils.extractSupportedAbis(architecture, expectation);
+ cases.add(new TestMethod(
+ name, method.commentText(), controller, supportedAbis,
+ knownFailure, isBroken, isSuppressed));
}
}
@@ -610,6 +631,7 @@
String mName;
String mDescription;
String mController;
+ Set<String> mAbis;
String mKnownFailure;
boolean mIsBroken;
boolean mIsSuppressed;
@@ -621,11 +643,12 @@
* @param description The description of the test case.
* @param knownFailure The reason of known failure.
*/
- TestMethod(String name, String description, String controller, String knownFailure,
- boolean isBroken, boolean isSuppressed) {
+ TestMethod(String name, String description, String controller, Set<String> abis,
+ String knownFailure, boolean isBroken, boolean isSuppressed) {
mName = name;
mDescription = description;
mController = controller;
+ mAbis = abis;
mKnownFailure = knownFailure;
mIsBroken = isBroken;
mIsSuppressed = isSuppressed;
diff --git a/tools/utils/VogarUtils.java b/tools/utils/VogarUtils.java
index c7070a5..5e8b944 100644
--- a/tools/utils/VogarUtils.java
+++ b/tools/utils/VogarUtils.java
@@ -14,6 +14,8 @@
* limitations under the License.
*/
+import com.android.cts.util.AbiUtils;
+
import vogar.Expectation;
import vogar.ExpectationStore;
import vogar.ModeId;
@@ -38,12 +40,26 @@
return false;
}
+ /**
+ * @return true iff the class/name is found in the vogar known failure list and it is not
+ * a known failure that is a result of an unsupported abi.
+ */
public static boolean isVogarKnownFailure(ExpectationStore expectationStore,
final String testClassName,
final String testMethodName) {
- String fullTestName = String.format("%s#%s", testClassName, testMethodName);
- return expectationStore != null
- && expectationStore.get(fullTestName) != Expectation.SUCCESS;
+ if (expectationStore == null) {
+ return false;
+ }
+ String fullTestName = buildFullTestName(testClassName, testMethodName);
+ Expectation expectation = expectationStore.get(fullTestName);
+ if (expectation == Expectation.SUCCESS) {
+ return false;
+ }
+
+ String description = expectation.getDescription();
+ boolean foundAbi = AbiUtils.parseAbiList(description).size() > 0;
+
+ return expectation != Expectation.SUCCESS && !foundAbi;
}
public static ExpectationStore provideExpectationStore(String dir) throws IOException {
@@ -67,4 +83,49 @@
}
return expectSet;
}
+
+ /** @return the test name in the form of com.android.myclass.TestClass#testMyMethod */
+ public static String buildFullTestName(String testClass, String testMethodName) {
+ return String.format("%s#%s", testClass, testMethodName);
+ }
+
+ /**
+ * This method looks in the description field of the Vogar entry for the ABI_LIST_MARKER
+ * and returns the list of abis found there.
+ *
+ * @return The Set of supported abis parsed from the {@code expectation}'s description.
+ */
+ public static Set<String> extractSupportedAbis(String architecture, Expectation expectation) {
+ Set<String> supportedAbiSet = AbiUtils.getAbisForArch(architecture);
+ if (expectation == null || expectation.getDescription().isEmpty()) {
+ // Include all abis since there was no limitation found in the description
+ return supportedAbiSet;
+ }
+
+ // Remove any abis that are not supported for the test.
+ supportedAbiSet.removeAll(AbiUtils.parseAbiList(expectation.getDescription()));
+
+ return supportedAbiSet;
+ }
+
+ /**
+ * Determine the correct set of ABIs for the given className/testName.
+ *
+ * @return the set of ABIs that can be expected to pass for the given combination of
+ * {@code architecture}, {@code className} and {@code testName}.
+ */
+ public static Set<String> extractSupportedAbis(String architecture,
+ ExpectationStore[] expectationStores,
+ String className,
+ String testName) {
+
+ String fullTestName = VogarUtils.buildFullTestName(className, testName);
+ Set<String> supportedAbiSet = AbiUtils.getAbisForArch(architecture);
+ for (ExpectationStore expectationStore : expectationStores) {
+ Expectation expectation = expectationStore.get(fullTestName);
+ supportedAbiSet.retainAll(extractSupportedAbis(architecture, expectation));
+ }
+
+ return supportedAbiSet;
+ }
}