summaryrefslogtreecommitdiffstats
path: root/tools/dalvik_jtreg/java/dalvik/jtreg/JtregFinder.java
diff options
context:
space:
mode:
Diffstat (limited to 'tools/dalvik_jtreg/java/dalvik/jtreg/JtregFinder.java')
-rw-r--r--tools/dalvik_jtreg/java/dalvik/jtreg/JtregFinder.java116
1 files changed, 116 insertions, 0 deletions
diff --git a/tools/dalvik_jtreg/java/dalvik/jtreg/JtregFinder.java b/tools/dalvik_jtreg/java/dalvik/jtreg/JtregFinder.java
new file mode 100644
index 0000000..1bbf1f1
--- /dev/null
+++ b/tools/dalvik_jtreg/java/dalvik/jtreg/JtregFinder.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2009 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.
+ */
+
+package dalvik.jtreg;
+
+import com.sun.javatest.TestDescription;
+import com.sun.javatest.TestResult;
+import com.sun.javatest.TestResultTable;
+import com.sun.javatest.TestSuite;
+import com.sun.javatest.WorkDirectory;
+import com.sun.javatest.regtest.RegressionTestSuite;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
+import java.util.Set;
+import java.util.logging.Logger;
+
+/**
+ * Create {@link TestRun}s for {@code .java} files with jtreg tests in them.
+ */
+class JtregFinder {
+
+ private static final Logger logger = Logger.getLogger(JtregFinder.class.getName());
+
+ /**
+ * The subpath of a platform implementation under which tests live. Used to
+ * derive relative test paths like {@code /java/io/Reader} from an absolute
+ * path like {@code /home/jessewilson/platform_v6/test/java/io/Reader}.
+ */
+ static final String TEST_ROOT = "/test/";
+
+ private final File localTemp;
+
+ JtregFinder(File localTemp) {
+ this.localTemp = localTemp;
+ }
+
+ /**
+ * Returns the tests in {@code directoryToScan}.
+ */
+ public Set<TestRun> findTests(File directoryToScan)
+ throws TestSuite.Fault, WorkDirectory.InitializationFault,
+ FileNotFoundException, WorkDirectory.WorkDirectoryExistsFault,
+ WorkDirectory.BadDirectoryFault, TestResult.Fault {
+ logger.fine("scanning " + directoryToScan + " for jtreg tests");
+ File workDirectory = new File(localTemp, "JTwork");
+ workDirectory.mkdirs();
+
+ /*
+ * This code is capable of extracting test descriptions using jtreg 4.0
+ * and its bundled copy of jtharness. As a command line tool, jtreg's
+ * API wasn't intended for this style of use. As a consequence, this
+ * code is fragile and may be incompatible with newer versions of jtreg.
+ */
+ TestSuite testSuite = new RegressionTestSuite(directoryToScan);
+ WorkDirectory wd = WorkDirectory.convert(workDirectory, testSuite);
+ TestResultTable resultTable = wd.getTestResultTable();
+
+ Set<TestRun> result = new LinkedHashSet<TestRun>();
+ for (Iterator i = resultTable.getIterator(); i.hasNext(); ) {
+ TestResult testResult = (TestResult) i.next();
+ TestDescription description = testResult.getDescription();
+ String qualifiedName = qualifiedName(description);
+ String suiteName = suiteName(description);
+ String testName = description.getName();
+ String testClass = description.getName();
+ result.add(new TestRun(description.getDir(), description.getFile(),
+ testClass, suiteName, testName, qualifiedName,
+ description.getTitle(), JtregRunner.class));
+ }
+ return result;
+ }
+
+ /**
+ * Returns a fully qualified name of the form {@code
+ * java.lang.Math.PowTests} from the given test description. The returned
+ * name is appropriate for use in a filename.
+ */
+ String qualifiedName(TestDescription testDescription) {
+ return suiteName(testDescription) + "." + escape(testDescription.getName());
+ }
+
+ /**
+ * Returns the name of the class under test, such as {@code java.lang.Math}.
+ */
+ String suiteName(TestDescription testDescription) {
+ String dir = testDescription.getDir().toString();
+ int separatorIndex = dir.indexOf(TEST_ROOT);
+ return separatorIndex != -1
+ ? escape(dir.substring(separatorIndex + TEST_ROOT.length()))
+ : escape(dir);
+ }
+
+ /**
+ * Returns a similar string with filename-unsafe characters replaced by
+ * filename-safe ones.
+ */
+ private String escape(String s) {
+ return s.replace('/', '.');
+ }
+}