Merge "Replace TestIdentifier by TestDescription"
diff --git a/android/cts/runner/src/com/drawelements/deqp/runner/DeqpTestRunner.java b/android/cts/runner/src/com/drawelements/deqp/runner/DeqpTestRunner.java
index 1f8f369..dea9360 100644
--- a/android/cts/runner/src/com/drawelements/deqp/runner/DeqpTestRunner.java
+++ b/android/cts/runner/src/com/drawelements/deqp/runner/DeqpTestRunner.java
@@ -21,7 +21,6 @@
 import com.android.ddmlib.MultiLineReceiver;
 import com.android.ddmlib.ShellCommandUnresponsiveException;
 import com.android.ddmlib.TimeoutException;
-import com.android.ddmlib.testrunner.TestIdentifier;
 import com.android.tradefed.build.IBuildInfo;
 import com.android.tradefed.config.Option;
 import com.android.tradefed.config.OptionClass;
@@ -31,6 +30,7 @@
 import com.android.tradefed.result.ByteArrayInputStreamSource;
 import com.android.tradefed.result.ITestInvocationListener;
 import com.android.tradefed.result.LogDataType;
+import com.android.tradefed.result.TestDescription;
 import com.android.tradefed.testtype.IAbi;
 import com.android.tradefed.testtype.IAbiReceiver;
 import com.android.tradefed.testtype.IBuildReceiver;
@@ -141,10 +141,10 @@
             description="The estimated config runtime. Defaults to 200ms x num tests.")
     private long mRuntimeHint = -1;
 
-    private Collection<TestIdentifier> mRemainingTests = null;
-    private Map<TestIdentifier, Set<BatchRunConfiguration>> mTestInstances = null;
+    private Collection<TestDescription> mRemainingTests = null;
+    private Map<TestDescription, Set<BatchRunConfiguration>> mTestInstances = null;
     private final TestInstanceResultListener mInstanceListerner = new TestInstanceResultListener();
-    private final Map<TestIdentifier, Integer> mTestInstabilityRatings = new HashMap<>();
+    private final Map<TestDescription, Integer> mTestInstabilityRatings = new HashMap<>();
     private IAbi mAbi;
     private CompatibilityBuildHelper mBuildHelper;
     private boolean mLogData = false;
@@ -163,7 +163,7 @@
     }
 
     private DeqpTestRunner(DeqpTestRunner optionTemplate,
-                Map<TestIdentifier, Set<BatchRunConfiguration>> tests) {
+                Map<TestDescription, Set<BatchRunConfiguration>> tests) {
         copyOptions(this, optionTemplate);
         mTestInstances = tests;
     }
@@ -262,7 +262,7 @@
         private ITestInvocationListener mSink;
         private BatchRunConfiguration mRunConfig;
 
-        private TestIdentifier mCurrentTestId;
+        private TestDescription mCurrentTestId;
         private boolean mGotTestResult;
         private String mCurrentTestLog;
 
@@ -273,7 +273,7 @@
             Set<BatchRunConfiguration> remainingConfigs;
         }
 
-        private final Map<TestIdentifier, PendingResult> mPendingResults = new HashMap<>();
+        private final Map<TestDescription, PendingResult> mPendingResults = new HashMap<>();
 
         public void setSink(ITestInvocationListener sink) {
             mSink = sink;
@@ -286,14 +286,14 @@
         /**
          * Get currently processed test id, or null if not currently processing a test case
          */
-        public TestIdentifier getCurrentTestId() {
+        public TestDescription getCurrentTestId() {
             return mCurrentTestId;
         }
 
         /**
          * Forward result to sink
          */
-        private void forwardFinalizedPendingResult(TestIdentifier testId) {
+        private void forwardFinalizedPendingResult(TestDescription testId) {
             if (mRemainingTests.contains(testId)) {
                 final PendingResult result = mPendingResults.get(testId);
 
@@ -342,7 +342,7 @@
         /**
          * Declare existence of a test and instances
          */
-        public void setTestInstances(TestIdentifier testId, Set<BatchRunConfiguration> configs) {
+        public void setTestInstances(TestDescription testId, Set<BatchRunConfiguration> configs) {
             // Test instances cannot change at runtime, ignore if we have already set this
             if (!mPendingResults.containsKey(testId)) {
                 final PendingResult pendingResult = new PendingResult();
@@ -357,7 +357,7 @@
         /**
          * Query if test instance has not yet been executed
          */
-        public boolean isPendingTestInstance(TestIdentifier testId,
+        public boolean isPendingTestInstance(TestDescription testId,
                 BatchRunConfiguration config) {
             final PendingResult result = mPendingResults.get(testId);
             if (result == null) {
@@ -379,7 +379,7 @@
         /**
          * Fake execution of an instance with current config
          */
-        public void skipTest(TestIdentifier testId) {
+        public void skipTest(TestDescription testId) {
             final PendingResult result = mPendingResults.get(testId);
 
             result.errorMessages.put(mRunConfig, SKIPPED_INSTANCE_LOG_MESSAGE);
@@ -394,7 +394,7 @@
         /**
          * Fake failure of an instance with current config
          */
-        public void abortTest(TestIdentifier testId, String errorMessage) {
+        public void abortTest(TestDescription testId, String errorMessage) {
             final PendingResult result = mPendingResults.get(testId);
 
             // Mark as executed
@@ -1020,12 +1020,12 @@
         }
     }
 
-    private static Map<TestIdentifier, Set<BatchRunConfiguration>> generateTestInstances(
+    private static Map<TestDescription, Set<BatchRunConfiguration>> generateTestInstances(
             Reader testlist, String configName, String screenRotation, String surfaceType,
             boolean required) {
         // Note: This is specifically a LinkedHashMap to guarantee that tests are iterated
         // in the insertion order.
-        final Map<TestIdentifier, Set<BatchRunConfiguration>> instances = new LinkedHashMap<>();
+        final Map<TestDescription, Set<BatchRunConfiguration>> instances = new LinkedHashMap<>();
         try {
             BufferedReader testlistReader = new BufferedReader(testlist);
             String testName;
@@ -1034,7 +1034,7 @@
                 final Set<BatchRunConfiguration> testInstanceSet = new LinkedHashSet<>();
                 BatchRunConfiguration config = new BatchRunConfiguration(configName, screenRotation, surfaceType, required);
                 testInstanceSet.add(config);
-                TestIdentifier test = pathToIdentifier(testName);
+                TestDescription test = pathToIdentifier(testName);
                 instances.put(test, testInstanceSet);
             }
             testlistReader.close();
@@ -1047,26 +1047,26 @@
         return instances;
     }
 
-    private Set<BatchRunConfiguration> getTestRunConfigs(TestIdentifier testId) {
+    private Set<BatchRunConfiguration> getTestRunConfigs(TestDescription testId) {
         return mTestInstances.get(testId);
     }
 
     /**
      * Get the test instance of the runner. Exposed for testing.
      */
-    Map<TestIdentifier, Set<BatchRunConfiguration>> getTestInstance() {
+    Map<TestDescription, Set<BatchRunConfiguration>> getTestInstance() {
         return mTestInstances;
     }
 
     /**
-     * Converts dEQP testcase path to TestIdentifier.
+     * Converts dEQP testcase path to TestDescription.
      */
-    private static TestIdentifier pathToIdentifier(String testPath) {
+    private static TestDescription pathToIdentifier(String testPath) {
         int indexOfLastDot = testPath.lastIndexOf('.');
         String className = testPath.substring(0, indexOfLastDot);
         String testName = testPath.substring(indexOfLastDot+1);
 
-        return new TestIdentifier(className, testName);
+        return new TestDescription(className, testName);
     }
 
     // \todo [2015-10-16 kalle] How unique should this be?
@@ -1128,12 +1128,12 @@
     }
 
     /**
-     * Generates testcase trie from TestIdentifiers.
+     * Generates testcase trie from TestDescriptions.
      */
-    private static String generateTestCaseTrie(Collection<TestIdentifier> tests) {
+    private static String generateTestCaseTrie(Collection<TestDescription> tests) {
         ArrayList<String> testPaths = new ArrayList<String>();
 
-        for (TestIdentifier test : tests) {
+        for (TestDescription test : tests) {
             testPaths.add(test.getClassName() + "." + test.getTestName());
         }
 
@@ -1142,7 +1142,7 @@
 
     private static class TestBatch {
         public BatchRunConfiguration config;
-        public List<TestIdentifier> tests;
+        public List<TestDescription> tests;
     }
 
     /**
@@ -1152,13 +1152,13 @@
      *  @param requiredConfig Select only instances with pending requiredConfig, or null to select
      *         any run configuration.
      */
-    private TestBatch selectRunBatch(Collection<TestIdentifier> pool,
+    private TestBatch selectRunBatch(Collection<TestDescription> pool,
             BatchRunConfiguration requiredConfig) {
         // select one test (leading test) that is going to be executed and then pack along as many
         // other compatible instances as possible.
 
-        TestIdentifier leadingTest = null;
-        for (TestIdentifier test : pool) {
+        TestDescription leadingTest = null;
+        for (TestDescription test : pool) {
             if (!mRemainingTests.contains(test)) {
                 continue;
             }
@@ -1199,7 +1199,7 @@
         runBatch.tests = new ArrayList<>();
         runBatch.tests.add(leadingTest);
 
-        for (TestIdentifier test : pool) {
+        for (TestDescription test : pool) {
             if (test == leadingTest) {
                 // do not re-select the leading tests
                 continue;
@@ -1226,7 +1226,7 @@
 
     private int getBatchNumPendingCases(TestBatch batch) {
         int numPending = 0;
-        for (TestIdentifier test : batch.tests) {
+        for (TestDescription test : batch.tests) {
             if (mInstanceListerner.isPendingTestInstance(test, batch.config)) {
                 ++numPending;
             }
@@ -1239,7 +1239,7 @@
         return Math.max(1, TESTCASE_BATCH_LIMIT / (1 << batchInstabilityRating));
     }
 
-    private int getTestInstabilityRating(TestIdentifier testId) {
+    private int getTestInstabilityRating(TestDescription testId) {
         if (mTestInstabilityRatings.containsKey(testId)) {
             return mTestInstabilityRatings.get(testId);
         } else {
@@ -1247,11 +1247,11 @@
         }
     }
 
-    private void recordTestInstability(TestIdentifier testId) {
+    private void recordTestInstability(TestDescription testId) {
         mTestInstabilityRatings.put(testId, getTestInstabilityRating(testId) + 1);
     }
 
-    private void clearTestInstability(TestIdentifier testId) {
+    private void clearTestInstability(TestDescription testId) {
         mTestInstabilityRatings.put(testId, 0);
     }
 
@@ -1277,7 +1277,7 @@
             CapabilityQueryFailureException {
         // prepare instance listener
         mInstanceListerner.setCurrentConfig(batch.config);
-        for (TestIdentifier test : batch.tests) {
+        for (TestDescription test : batch.tests) {
             mInstanceListerner.setTestInstances(test, getTestRunConfigs(test));
         }
 
@@ -1365,17 +1365,17 @@
 
         // split remaining tests to two sub batches and execute both. This will terminate
         // since executeTestRunBatchRun will always progress for a batch of size 1.
-        final ArrayList<TestIdentifier> pendingTests = new ArrayList<>();
+        final ArrayList<TestDescription> pendingTests = new ArrayList<>();
 
-        for (TestIdentifier test : batch.tests) {
+        for (TestDescription test : batch.tests) {
             if (mInstanceListerner.isPendingTestInstance(test, batch.config)) {
                 pendingTests.add(test);
             }
         }
 
         final int divisorNdx = pendingTests.size() / 2;
-        final List<TestIdentifier> headList = pendingTests.subList(0, divisorNdx);
-        final List<TestIdentifier> tailList = pendingTests.subList(divisorNdx, pendingTests.size());
+        final List<TestDescription> headList = pendingTests.subList(0, divisorNdx);
+        final List<TestDescription> tailList = pendingTests.subList(divisorNdx, pendingTests.size());
 
         // head
         for (;;) {
@@ -1486,7 +1486,7 @@
 
         // Progress guarantees.
         if (batch.tests.size() == 1) {
-            final TestIdentifier onlyTest = batch.tests.iterator().next();
+            final TestDescription onlyTest = batch.tests.iterator().next();
             final boolean wasTestExecuted =
                     !mInstanceListerner.isPendingTestInstance(onlyTest, batch.config) &&
                     mInstanceListerner.getCurrentTestId() == null;
@@ -1518,7 +1518,7 @@
             //
             // A successful run of tests clears instability rating.
             if (mInstanceListerner.getCurrentTestId() == null) {
-                for (TestIdentifier test : batch.tests) {
+                for (TestDescription test : batch.tests) {
                     if (mInstanceListerner.isPendingTestInstance(test, batch.config)) {
                         recordTestInstability(test);
                     } else {
@@ -1527,7 +1527,7 @@
                 }
             } else {
                 recordTestInstability(mInstanceListerner.getCurrentTestId());
-                for (TestIdentifier test : batch.tests) {
+                for (TestDescription test : batch.tests) {
                     // \note: isPendingTestInstance is false for getCurrentTestId. Current ID is
                     // considered 'running' and will be restored to 'pending' in endBatch().
                     if (!test.equals(mInstanceListerner.getCurrentTestId()) &&
@@ -1566,7 +1566,7 @@
 
     private int getNumRemainingInstances() {
         int retVal = 0;
-        for (TestIdentifier testId : mRemainingTests) {
+        for (TestDescription testId : mRemainingTests) {
             // If case is in current working set, sum only not yet executed instances.
             // If case is not in current working set, sum all instances (since they are not yet
             // executed).
@@ -1592,7 +1592,7 @@
      * Pass given batch tests without running it
      */
     private void fakePassTestRunBatch(TestBatch batch) {
-        for (TestIdentifier test : batch.tests) {
+        for (TestDescription test : batch.tests) {
             CLog.d("Marking '%s' invocation in config '%s' as passed without running", test.toString(),
                     batch.config.getId());
             mInstanceListerner.skipTest(test);
@@ -1603,7 +1603,7 @@
      * Fail given batch tests without running it
      */
     private void fakeFailTestRunBatch(TestBatch batch) {
-        for (TestIdentifier test : batch.tests) {
+        for (TestDescription test : batch.tests) {
             CLog.d("Marking '%s' invocation in config '%s' as failed without running", test.toString(),
                     batch.config.getId());
             mInstanceListerner.abortTest(test, "Required config not supported");
@@ -1615,7 +1615,7 @@
      */
     private void fakePassTests(ITestInvocationListener listener) {
         Map <String, String> emptyMap = Collections.emptyMap();
-        for (TestIdentifier test : mRemainingTests) {
+        for (TestDescription test : mRemainingTests) {
             CLog.d("Skipping test '%s', Opengl ES version not supported", test.toString());
             listener.testStarted(test);
             listener.testEnded(test, emptyMap);
@@ -1883,7 +1883,7 @@
         return nonPatternFilters;
     }
 
-    private static boolean matchesAny(TestIdentifier test, List<Pattern> patterns) {
+    private static boolean matchesAny(TestDescription test, List<Pattern> patterns) {
         for (Pattern pattern : patterns) {
             if (pattern.matcher(test.toString()).matches()) {
                 return true;
@@ -1898,7 +1898,7 @@
      * '*' is 0 or more characters.
      * '.' is interpreted verbatim.
      */
-    private static void filterTests(Map<TestIdentifier, Set<BatchRunConfiguration>> tests,
+    private static void filterTests(Map<TestDescription, Set<BatchRunConfiguration>> tests,
                                     List<String> includeFilters,
                                     List<String> excludeFilters) {
         // We could filter faster by building the test case tree.
@@ -1908,8 +1908,8 @@
         List<Pattern> includePatterns = getPatternFilters(includeFilters);
         List<Pattern> excludePatterns = getPatternFilters(excludeFilters);
 
-        List<TestIdentifier> testList = new ArrayList<>(tests.keySet());
-        for (TestIdentifier test : testList) {
+        List<TestDescription> testList = new ArrayList<>(tests.keySet());
+        for (TestDescription test : testList) {
             if (excludeStrings.contains(test.toString())) {
                 tests.remove(test); // remove test if explicitly excluded
                 continue;
@@ -2165,8 +2165,8 @@
 
         Collection<IRemoteTest> runners = new ArrayList<>();
         // NOTE: Use linked hash map to keep the insertion order in iteration
-        Map<TestIdentifier, Set<BatchRunConfiguration>> currentSet = new LinkedHashMap<>();
-        Map<TestIdentifier, Set<BatchRunConfiguration>> iterationSet = this.mTestInstances;
+        Map<TestDescription, Set<BatchRunConfiguration>> currentSet = new LinkedHashMap<>();
+        Map<TestDescription, Set<BatchRunConfiguration>> iterationSet = this.mTestInstances;
 
         if (iterationSet.keySet().isEmpty()) {
             CLog.i("Cannot split deqp tests, no tests to run");
@@ -2174,7 +2174,7 @@
         }
 
         // Go through tests, split
-        for (TestIdentifier test: iterationSet.keySet()) {
+        for (TestDescription test: iterationSet.keySet()) {
             currentSet.put(test, iterationSet.get(test));
             if (currentSet.size() >= TESTCASE_BATCH_LIMIT) {
                 runners.add(new DeqpTestRunner(this, currentSet));
@@ -2203,13 +2203,13 @@
 
         List<IRemoteTest> runners = new ArrayList<>();
         // NOTE: Use linked hash map to keep the insertion order in iteration
-        Map<TestIdentifier, Set<BatchRunConfiguration>> currentSet = new LinkedHashMap<>();
-        Map<TestIdentifier, Set<BatchRunConfiguration>> iterationSet = this.mTestInstances;
+        Map<TestDescription, Set<BatchRunConfiguration>> currentSet = new LinkedHashMap<>();
+        Map<TestDescription, Set<BatchRunConfiguration>> iterationSet = this.mTestInstances;
 
         int batchLimit = iterationSet.keySet().size() / shardCount;
         int i = 1;
         // Go through tests, split
-        for (TestIdentifier test: iterationSet.keySet()) {
+        for (TestDescription test: iterationSet.keySet()) {
             currentSet.put(test, iterationSet.get(test));
             if (currentSet.size() >= batchLimit && i < shardCount) {
                 runners.add(new DeqpTestRunner(this, currentSet));
@@ -2227,7 +2227,7 @@
         if (runners.size() < shardCount) {
             for (int j = runners.size(); j < shardCount; j++) {
                 runners.add(new DeqpTestRunner(this,
-                        new LinkedHashMap<TestIdentifier, Set<BatchRunConfiguration>>()));
+                        new LinkedHashMap<TestDescription, Set<BatchRunConfiguration>>()));
             }
         }
 
diff --git a/android/cts/runner/tests/src/com/drawelements/deqp/runner/DeqpTestRunnerTest.java b/android/cts/runner/tests/src/com/drawelements/deqp/runner/DeqpTestRunnerTest.java
index ee2810c..5aaae41 100644
--- a/android/cts/runner/tests/src/com/drawelements/deqp/runner/DeqpTestRunnerTest.java
+++ b/android/cts/runner/tests/src/com/drawelements/deqp/runner/DeqpTestRunnerTest.java
@@ -18,13 +18,13 @@
 import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelper;
 import com.android.ddmlib.IDevice;
 import com.android.ddmlib.IShellOutputReceiver;
-import com.android.ddmlib.testrunner.TestIdentifier;
 import com.android.tradefed.build.IFolderBuildInfo;
 import com.android.tradefed.config.ConfigurationException;
 import com.android.tradefed.config.OptionSetter;
 import com.android.tradefed.device.DeviceNotAvailableException;
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.result.ITestInvocationListener;
+import com.android.tradefed.result.TestDescription;
 import com.android.tradefed.testtype.Abi;
 import com.android.tradefed.testtype.IAbi;
 import com.android.tradefed.testtype.IRemoteTest;
@@ -119,10 +119,10 @@
 
     private static DeqpTestRunner buildGlesTestRunner(int majorVersion,
                                                       int minorVersion,
-                                                      Collection<TestIdentifier> tests,
+                                                      Collection<TestDescription> tests,
                                                       File testsDir) throws ConfigurationException, FileNotFoundException {
         StringWriter testlist = new StringWriter();
-        for (TestIdentifier test : tests) {
+        for (TestDescription test : tests) {
             testlist.write(test.getClassName() + "." + test.getTestName() + "\n");
         }
         return buildGlesTestRunner(majorVersion, minorVersion, testlist.toString(), testsDir);
@@ -165,7 +165,7 @@
      * Test version of OpenGL ES.
      */
     private void testGlesVersion(int requiredMajorVersion, int requiredMinorVersion, int majorVersion, int minorVersion) throws Exception {
-        final TestIdentifier testId = new TestIdentifier("dEQP-GLES"
+        final TestDescription testId = new TestDescription("dEQP-GLES"
                 + Integer.toString(requiredMajorVersion) + Integer.toString(requiredMinorVersion)
                 + ".info", "version");
 
@@ -211,7 +211,7 @@
         ITestInvocationListener mockListener
                 = EasyMock.createStrictMock(ITestInvocationListener.class);
         IDevice mockIDevice = EasyMock.createMock(IDevice.class);
-        Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
+        Collection<TestDescription> tests = new ArrayList<TestDescription>();
         tests.add(testId);
 
         DeqpTestRunner deqpTest = buildGlesTestRunner(requiredMajorVersion, requiredMinorVersion, tests, mTestsDir);
@@ -316,7 +316,7 @@
      * Test that result code produces correctly pass or fail.
      */
     private void testResultCode(final String resultCode, boolean pass) throws Exception {
-        final TestIdentifier testId = new TestIdentifier("dEQP-GLES3.info", "version");
+        final TestDescription testId = new TestDescription("dEQP-GLES3.info", "version");
         final String testPath = "dEQP-GLES3.info.version";
         final String testTrie = "{dEQP-GLES3{info{version}}}";
 
@@ -353,7 +353,7 @@
                 = EasyMock.createStrictMock(ITestInvocationListener.class);
         IDevice mockIDevice = EasyMock.createMock(IDevice.class);
 
-        Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
+        Collection<TestDescription> tests = new ArrayList<TestDescription>();
         tests.add(testId);
 
         DeqpTestRunner deqpTest = buildGlesTestRunner(3, 0, tests, mTestsDir);
@@ -491,13 +491,13 @@
                 + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
                 + "INSTRUMENTATION_CODE: 0\r\n";
 
-        final TestIdentifier[] testIds = {
-                new TestIdentifier("dEQP-GLES3.info", "vendor"),
-                new TestIdentifier("dEQP-GLES3.info", "renderer"),
-                new TestIdentifier("dEQP-GLES3.info", "version"),
-                new TestIdentifier("dEQP-GLES3.info", "shading_language_version"),
-                new TestIdentifier("dEQP-GLES3.info", "extensions"),
-                new TestIdentifier("dEQP-GLES3.info", "render_target")
+        final TestDescription[] testIds = {
+                new TestDescription("dEQP-GLES3.info", "vendor"),
+                new TestDescription("dEQP-GLES3.info", "renderer"),
+                new TestDescription("dEQP-GLES3.info", "version"),
+                new TestDescription("dEQP-GLES3.info", "shading_language_version"),
+                new TestDescription("dEQP-GLES3.info", "extensions"),
+                new TestDescription("dEQP-GLES3.info", "render_target")
         };
 
         final String[] testPaths = {
@@ -517,9 +517,9 @@
                 = EasyMock.createStrictMock(ITestInvocationListener.class);
         IDevice mockIDevice = EasyMock.createMock(IDevice.class);
 
-        Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
+        Collection<TestDescription> tests = new ArrayList<TestDescription>();
 
-        for (TestIdentifier id : testIds) {
+        for (TestDescription id : testIds) {
             tests.add(id);
         }
 
@@ -576,7 +576,7 @@
         EasyMock.verify(mockDevice, mockIDevice);
     }
 
-    static private String buildTestProcessOutput(List<TestIdentifier> tests) {
+    static private String buildTestProcessOutput(List<TestDescription> tests) {
         /* MultiLineReceiver expects "\r\n" line ending. */
         final String outputHeader = "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseName\r\n"
                 + "INSTRUMENTATION_STATUS: dEQP-EventType=SessionInfo\r\n"
@@ -599,7 +599,7 @@
 
         StringWriter output = new StringWriter();
         output.write(outputHeader);
-        for (TestIdentifier test : tests) {
+        for (TestDescription test : tests) {
             output.write("INSTRUMENTATION_STATUS: dEQP-EventType=BeginTestCase\r\n");
             output.write("INSTRUMENTATION_STATUS: dEQP-BeginTestCase-TestCasePath=");
             output.write(test.getClassName());
@@ -620,7 +620,7 @@
 
     private void testFiltering(DeqpTestRunner deqpTest,
                                String expectedTrie,
-                               List<TestIdentifier> expectedTests) throws Exception {
+                               List<TestDescription> expectedTests) throws Exception {
         int version = 3 << 16;
         ITestDevice mockDevice = EasyMock.createMock(ITestDevice.class);
         EasyMock.expect(mockDevice.getProperty("ro.opengles.version"))
@@ -682,21 +682,21 @@
     }
 
     public void testRun_trivialIncludeFilter() throws Exception {
-        final TestIdentifier[] testIds = {
-                new TestIdentifier("dEQP-GLES3.missing", "no"),
-                new TestIdentifier("dEQP-GLES3.missing", "nope"),
-                new TestIdentifier("dEQP-GLES3.missing", "donotwant"),
-                new TestIdentifier("dEQP-GLES3.pick_me", "yes"),
-                new TestIdentifier("dEQP-GLES3.pick_me", "ok"),
-                new TestIdentifier("dEQP-GLES3.pick_me", "accepted"),
+        final TestDescription[] testIds = {
+                new TestDescription("dEQP-GLES3.missing", "no"),
+                new TestDescription("dEQP-GLES3.missing", "nope"),
+                new TestDescription("dEQP-GLES3.missing", "donotwant"),
+                new TestDescription("dEQP-GLES3.pick_me", "yes"),
+                new TestDescription("dEQP-GLES3.pick_me", "ok"),
+                new TestDescription("dEQP-GLES3.pick_me", "accepted"),
         };
 
-        List<TestIdentifier> allTests = new ArrayList<TestIdentifier>();
-        for (TestIdentifier id : testIds) {
+        List<TestDescription> allTests = new ArrayList<TestDescription>();
+        for (TestDescription id : testIds) {
             allTests.add(id);
         }
 
-        List<TestIdentifier> activeTests = new ArrayList<TestIdentifier>();
+        List<TestDescription> activeTests = new ArrayList<TestDescription>();
         activeTests.add(testIds[3]);
         activeTests.add(testIds[4]);
         activeTests.add(testIds[5]);
@@ -709,21 +709,21 @@
     }
 
     public void testRun_trivialExcludeFilter() throws Exception {
-        final TestIdentifier[] testIds = {
-                new TestIdentifier("dEQP-GLES3.missing", "no"),
-                new TestIdentifier("dEQP-GLES3.missing", "nope"),
-                new TestIdentifier("dEQP-GLES3.missing", "donotwant"),
-                new TestIdentifier("dEQP-GLES3.pick_me", "yes"),
-                new TestIdentifier("dEQP-GLES3.pick_me", "ok"),
-                new TestIdentifier("dEQP-GLES3.pick_me", "accepted"),
+        final TestDescription[] testIds = {
+                new TestDescription("dEQP-GLES3.missing", "no"),
+                new TestDescription("dEQP-GLES3.missing", "nope"),
+                new TestDescription("dEQP-GLES3.missing", "donotwant"),
+                new TestDescription("dEQP-GLES3.pick_me", "yes"),
+                new TestDescription("dEQP-GLES3.pick_me", "ok"),
+                new TestDescription("dEQP-GLES3.pick_me", "accepted"),
         };
 
-        List<TestIdentifier> allTests = new ArrayList<TestIdentifier>();
-        for (TestIdentifier id : testIds) {
+        List<TestDescription> allTests = new ArrayList<TestDescription>();
+        for (TestDescription id : testIds) {
             allTests.add(id);
         }
 
-        List<TestIdentifier> activeTests = new ArrayList<TestIdentifier>();
+        List<TestDescription> activeTests = new ArrayList<TestDescription>();
         activeTests.add(testIds[3]);
         activeTests.add(testIds[4]);
         activeTests.add(testIds[5]);
@@ -736,21 +736,21 @@
     }
 
     public void testRun_includeAndExcludeFilter() throws Exception {
-        final TestIdentifier[] testIds = {
-                new TestIdentifier("dEQP-GLES3.group1", "foo"),
-                new TestIdentifier("dEQP-GLES3.group1", "nope"),
-                new TestIdentifier("dEQP-GLES3.group1", "donotwant"),
-                new TestIdentifier("dEQP-GLES3.group2", "foo"),
-                new TestIdentifier("dEQP-GLES3.group2", "yes"),
-                new TestIdentifier("dEQP-GLES3.group2", "thoushallnotpass"),
+        final TestDescription[] testIds = {
+                new TestDescription("dEQP-GLES3.group1", "foo"),
+                new TestDescription("dEQP-GLES3.group1", "nope"),
+                new TestDescription("dEQP-GLES3.group1", "donotwant"),
+                new TestDescription("dEQP-GLES3.group2", "foo"),
+                new TestDescription("dEQP-GLES3.group2", "yes"),
+                new TestDescription("dEQP-GLES3.group2", "thoushallnotpass"),
         };
 
-        List<TestIdentifier> allTests = new ArrayList<TestIdentifier>();
-        for (TestIdentifier id : testIds) {
+        List<TestDescription> allTests = new ArrayList<TestDescription>();
+        for (TestDescription id : testIds) {
             allTests.add(id);
         }
 
-        List<TestIdentifier> activeTests = new ArrayList<TestIdentifier>();
+        List<TestDescription> activeTests = new ArrayList<TestDescription>();
         activeTests.add(testIds[4]);
 
         String expectedTrie = "{dEQP-GLES3{group2{yes}}}";
@@ -769,17 +769,17 @@
     }
 
     public void testRun_includeAll() throws Exception {
-        final TestIdentifier[] testIds = {
-                new TestIdentifier("dEQP-GLES3.group1", "mememe"),
-                new TestIdentifier("dEQP-GLES3.group1", "yeah"),
-                new TestIdentifier("dEQP-GLES3.group1", "takeitall"),
-                new TestIdentifier("dEQP-GLES3.group2", "jeba"),
-                new TestIdentifier("dEQP-GLES3.group2", "yes"),
-                new TestIdentifier("dEQP-GLES3.group2", "granted"),
+        final TestDescription[] testIds = {
+                new TestDescription("dEQP-GLES3.group1", "mememe"),
+                new TestDescription("dEQP-GLES3.group1", "yeah"),
+                new TestDescription("dEQP-GLES3.group1", "takeitall"),
+                new TestDescription("dEQP-GLES3.group2", "jeba"),
+                new TestDescription("dEQP-GLES3.group2", "yes"),
+                new TestDescription("dEQP-GLES3.group2", "granted"),
         };
 
-        List<TestIdentifier> allTests = new ArrayList<TestIdentifier>();
-        for (TestIdentifier id : testIds) {
+        List<TestDescription> allTests = new ArrayList<TestDescription>();
+        for (TestDescription id : testIds) {
             allTests.add(id);
         }
 
@@ -791,17 +791,17 @@
     }
 
     public void testRun_excludeAll() throws Exception {
-        final TestIdentifier[] testIds = {
-                new TestIdentifier("dEQP-GLES3.group1", "no"),
-                new TestIdentifier("dEQP-GLES3.group1", "nope"),
-                new TestIdentifier("dEQP-GLES3.group1", "nottoday"),
-                new TestIdentifier("dEQP-GLES3.group2", "banned"),
-                new TestIdentifier("dEQP-GLES3.group2", "notrecognized"),
-                new TestIdentifier("dEQP-GLES3.group2", "-2"),
+        final TestDescription[] testIds = {
+                new TestDescription("dEQP-GLES3.group1", "no"),
+                new TestDescription("dEQP-GLES3.group1", "nope"),
+                new TestDescription("dEQP-GLES3.group1", "nottoday"),
+                new TestDescription("dEQP-GLES3.group2", "banned"),
+                new TestDescription("dEQP-GLES3.group2", "notrecognized"),
+                new TestDescription("dEQP-GLES3.group2", "-2"),
         };
 
-        List<TestIdentifier> allTests = new ArrayList<TestIdentifier>();
-        for (TestIdentifier id : testIds) {
+        List<TestDescription> allTests = new ArrayList<TestDescription>();
+        for (TestDescription id : testIds) {
             allTests.add(id);
         }
 
@@ -842,10 +842,10 @@
                 + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
                 + "INSTRUMENTATION_CODE: 0\r\n";
 
-        final TestIdentifier[] testIds = {
-                new TestIdentifier("dEQP-GLES3.missing", "no"),
-                new TestIdentifier("dEQP-GLES3.missing", "nope"),
-                new TestIdentifier("dEQP-GLES3.missing", "donotwant"),
+        final TestDescription[] testIds = {
+                new TestDescription("dEQP-GLES3.missing", "no"),
+                new TestDescription("dEQP-GLES3.missing", "nope"),
+                new TestDescription("dEQP-GLES3.missing", "donotwant"),
         };
 
         final String[] testPaths = {
@@ -859,9 +859,9 @@
                 = EasyMock.createStrictMock(ITestInvocationListener.class);
         IDevice mockIDevice = EasyMock.createMock(IDevice.class);
 
-        Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
+        Collection<TestDescription> tests = new ArrayList<TestDescription>();
 
-        for (TestIdentifier id : testIds) {
+        for (TestDescription id : testIds) {
             tests.add(id);
         }
 
@@ -939,12 +939,12 @@
      */
     public void testRun_queryPmListFailure()
             throws Exception {
-        final TestIdentifier testId = new TestIdentifier("dEQP-GLES3.orientation", "test");
+        final TestDescription testId = new TestDescription("dEQP-GLES3.orientation", "test");
 
         ITestDevice mockDevice = EasyMock.createMock(ITestDevice.class);
         ITestInvocationListener mockListener
                 = EasyMock.createStrictMock(ITestInvocationListener.class);
-        Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
+        Collection<TestDescription> tests = new ArrayList<TestDescription>();
         tests.add(testId);
 
         DeqpTestRunner deqpTest = buildGlesTestRunner(3, 0, tests, mTestsDir);
@@ -990,13 +990,13 @@
      */
     public void testRun_queryRenderabilityFailure()
             throws Exception {
-        final TestIdentifier testId = new TestIdentifier("dEQP-GLES3.orientation", "test");
+        final TestDescription testId = new TestDescription("dEQP-GLES3.orientation", "test");
 
         ITestDevice mockDevice = EasyMock.createMock(ITestDevice.class);
         ITestInvocationListener mockListener
                 = EasyMock.createStrictMock(ITestInvocationListener.class);
 
-        Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
+        Collection<TestDescription> tests = new ArrayList<TestDescription>();
         tests.add(testId);
 
         DeqpTestRunner deqpTest = buildGlesTestRunner(3, 0, tests, mTestsDir);
@@ -1043,7 +1043,7 @@
      */
     private void testOrientation(final String rotation, final String featureString)
             throws Exception {
-        final TestIdentifier testId = new TestIdentifier("dEQP-GLES3.orientation", "test");
+        final TestDescription testId = new TestDescription("dEQP-GLES3.orientation", "test");
         final String testPath = "dEQP-GLES3.orientation.test";
         final String testTrie = "{dEQP-GLES3{orientation{test}}}";
         final String output = "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseName\r\n"
@@ -1078,7 +1078,7 @@
                 = EasyMock.createStrictMock(ITestInvocationListener.class);
         IDevice mockIDevice = EasyMock.createMock(IDevice.class);
 
-        Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
+        Collection<TestDescription> tests = new ArrayList<TestDescription>();
         tests.add(testId);
 
         DeqpTestRunner deqpTest = buildGlesTestRunner(3, 0, tests, mTestsDir);
@@ -1322,13 +1322,13 @@
      */
     public void testRun_unsupportedPixelFormat() throws Exception {
         final String pixelFormat = "rgba5658d16m4";
-        final TestIdentifier testId = new TestIdentifier("dEQP-GLES3.pixelformat", "test");
+        final TestDescription testId = new TestDescription("dEQP-GLES3.pixelformat", "test");
 
         ITestDevice mockDevice = EasyMock.createMock(ITestDevice.class);
         ITestInvocationListener mockListener
                 = EasyMock.createStrictMock(ITestInvocationListener.class);
 
-        Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
+        Collection<TestDescription> tests = new ArrayList<TestDescription>();
         tests.add(testId);
 
         DeqpTestRunner deqpTest = buildGlesTestRunner(3, 0, tests, mTestsDir);
@@ -1688,9 +1688,9 @@
      * Test external interruption before batch run.
      */
     public void testInterrupt_killBeforeBatch() throws Exception {
-        final TestIdentifier testId = new TestIdentifier("dEQP-GLES3.interrupt", "test");
+        final TestDescription testId = new TestDescription("dEQP-GLES3.interrupt", "test");
 
-        Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
+        Collection<TestDescription> tests = new ArrayList<TestDescription>();
         tests.add(testId);
 
         ITestInvocationListener mockListener
@@ -1726,7 +1726,7 @@
 
         mockListener.testRunStarted(getTestId(deqpTest), 1);
         EasyMock.expectLastCall().once();
-        mockListener.testRunEnded(EasyMock.anyLong(), EasyMock.anyObject());
+        mockListener.testRunEnded(EasyMock.anyLong(), (Map<String, String>) EasyMock.anyObject());
         EasyMock.expectLastCall().once();
 
         EasyMock.replay(mockDevice, mockIDevice);
@@ -1743,10 +1743,10 @@
         EasyMock.verify(mockDevice, mockIDevice);
     }
 
-    private void runShardedTest(TestIdentifier[] testIds,
-            ArrayList<ArrayList<TestIdentifier>> testsForShard) throws Exception {
-        Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
-        for (TestIdentifier id : testIds) tests.add(id);
+    private void runShardedTest(TestDescription[] testIds,
+            ArrayList<ArrayList<TestDescription>> testsForShard) throws Exception {
+        Collection<TestDescription> tests = new ArrayList<TestDescription>();
+        for (TestDescription id : testIds) tests.add(id);
 
         DeqpTestRunner runner = buildGlesTestRunner(3, 0, tests, mTestsDir);
         ArrayList<IRemoteTest> shards = (ArrayList<IRemoteTest>)runner.split();
@@ -1755,7 +1755,7 @@
             DeqpTestRunner shard = (DeqpTestRunner)shards.get(shardIndex);
             shard.setBuildHelper(getMockBuildHelper(mTestsDir));
 
-            ArrayList<TestIdentifier> shardTests = testsForShard.get(shardIndex);
+            ArrayList<TestDescription> shardTests = testsForShard.get(shardIndex);
 
             ITestDevice mockDevice = EasyMock.createMock(ITestDevice.class);
             ITestInvocationListener mockListener
@@ -1808,16 +1808,16 @@
     }
 
     public void testSharding_smallTrivial() throws Exception {
-        final TestIdentifier[] testIds = {
-                new TestIdentifier("dEQP-GLES3.info", "vendor"),
-                new TestIdentifier("dEQP-GLES3.info", "renderer"),
-                new TestIdentifier("dEQP-GLES3.info", "version"),
-                new TestIdentifier("dEQP-GLES3.info", "shading_language_version"),
-                new TestIdentifier("dEQP-GLES3.info", "extensions"),
-                new TestIdentifier("dEQP-GLES3.info", "render_target")
+        final TestDescription[] testIds = {
+                new TestDescription("dEQP-GLES3.info", "vendor"),
+                new TestDescription("dEQP-GLES3.info", "renderer"),
+                new TestDescription("dEQP-GLES3.info", "version"),
+                new TestDescription("dEQP-GLES3.info", "shading_language_version"),
+                new TestDescription("dEQP-GLES3.info", "extensions"),
+                new TestDescription("dEQP-GLES3.info", "render_target")
         };
-        ArrayList<ArrayList<TestIdentifier>> shardedTests = new ArrayList<>();
-        ArrayList<TestIdentifier> shardOne = new ArrayList<>();
+        ArrayList<ArrayList<TestDescription>> shardedTests = new ArrayList<>();
+        ArrayList<TestDescription> shardOne = new ArrayList<>();
         for (int i = 0; i < testIds.length; i++) {
             shardOne.add(testIds[i]);
         }
@@ -1829,13 +1829,13 @@
         final int TEST_COUNT = 1237;
         final int SHARD_SIZE = 1000;
 
-        ArrayList<TestIdentifier> testIds = new ArrayList<>(TEST_COUNT);
+        ArrayList<TestDescription> testIds = new ArrayList<>(TEST_COUNT);
         for (int i = 0; i < TEST_COUNT; i++) {
-            testIds.add(new TestIdentifier("dEQP-GLES3.funny.group", String.valueOf(i)));
+            testIds.add(new TestDescription("dEQP-GLES3.funny.group", String.valueOf(i)));
         }
 
-        ArrayList<ArrayList<TestIdentifier>> shardedTests = new ArrayList<>();
-        ArrayList<TestIdentifier> shard = new ArrayList<>();
+        ArrayList<ArrayList<TestDescription>> shardedTests = new ArrayList<>();
+        ArrayList<TestDescription> shard = new ArrayList<>();
         for (int i = 0; i < testIds.size(); i++) {
             if (i == SHARD_SIZE) {
                 shardedTests.add(shard);
@@ -1844,11 +1844,11 @@
             shard.add(testIds.get(i));
         }
         shardedTests.add(shard);
-        runShardedTest(testIds.toArray(new TestIdentifier[testIds.size()]), shardedTests);
+        runShardedTest(testIds.toArray(new TestDescription[testIds.size()]), shardedTests);
     }
 
     public void testSharding_empty() throws Exception {
-        DeqpTestRunner runner = buildGlesTestRunner(3, 0, new ArrayList<TestIdentifier>(), mTestsDir);
+        DeqpTestRunner runner = buildGlesTestRunner(3, 0, new ArrayList<TestDescription>(), mTestsDir);
         ArrayList<IRemoteTest> shards = (ArrayList<IRemoteTest>)runner.split();
         // Returns null when cannot be sharded.
         assertNull(shards);
@@ -1858,7 +1858,7 @@
      * Test external interruption in testFailed().
      */
     public void testInterrupt_killReportTestFailed() throws Exception {
-        final TestIdentifier testId = new TestIdentifier("dEQP-GLES3.interrupt", "test");
+        final TestDescription testId = new TestDescription("dEQP-GLES3.interrupt", "test");
         final String testPath = "dEQP-GLES3.interrupt.test";
         final String testTrie = "{dEQP-GLES3{interrupt{test}}}";
         final String output = "INSTRUMENTATION_STATUS: dEQP-SessionInfo-Name=releaseName\r\n"
@@ -1888,7 +1888,7 @@
                 + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
                 + "INSTRUMENTATION_CODE: 0\r\n";
 
-        Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
+        Collection<TestDescription> tests = new ArrayList<TestDescription>();
         tests.add(testId);
 
         ITestInvocationListener mockListener
@@ -1942,7 +1942,7 @@
         mockListener.testFailed(EasyMock.eq(testId), EasyMock.<String>notNull());
         EasyMock.expectLastCall().andThrow(new RunInterruptedException());
 
-        mockListener.testRunEnded(EasyMock.anyLong(), EasyMock.anyObject());
+        mockListener.testRunEnded(EasyMock.anyLong(), (Map<String, String>) EasyMock.anyObject());
         EasyMock.expectLastCall().once();
         EasyMock.replay(mockDevice, mockIDevice);
         EasyMock.replay(mockListener);
@@ -2032,13 +2032,13 @@
                 + "INSTRUMENTATION_STATUS_CODE: 0\r\n"
                 + "INSTRUMENTATION_CODE: 0\r\n";
 
-        final TestIdentifier[] testIds = {
-                new TestIdentifier("dEQP-GLES3.info", "vendor"),
-                new TestIdentifier("dEQP-GLES3.info", "renderer"),
-                new TestIdentifier("dEQP-GLES3.info", "version"),
-                new TestIdentifier("dEQP-GLES3.info", "shading_language_version"),
-                new TestIdentifier("dEQP-GLES3.info", "extensions"),
-                new TestIdentifier("dEQP-GLES3.info", "render_target")
+        final TestDescription[] testIds = {
+                new TestDescription("dEQP-GLES3.info", "vendor"),
+                new TestDescription("dEQP-GLES3.info", "renderer"),
+                new TestDescription("dEQP-GLES3.info", "version"),
+                new TestDescription("dEQP-GLES3.info", "shading_language_version"),
+                new TestDescription("dEQP-GLES3.info", "extensions"),
+                new TestDescription("dEQP-GLES3.info", "render_target")
         };
 
         final String[] testPaths = {
@@ -2058,9 +2058,9 @@
                 = EasyMock.createStrictMock(ITestInvocationListener.class);
         IDevice mockIDevice = EasyMock.createMock(IDevice.class);
 
-        Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
+        Collection<TestDescription> tests = new ArrayList<TestDescription>();
 
-        for (TestIdentifier id : testIds) {
+        for (TestDescription id : testIds) {
             tests.add(id);
         }
 
@@ -2128,9 +2128,9 @@
         final int TEST_COUNT = 1237;
         final int SHARD_SIZE = 1000;
 
-        ArrayList<TestIdentifier> testIds = new ArrayList<>(TEST_COUNT);
+        ArrayList<TestDescription> testIds = new ArrayList<>(TEST_COUNT);
         for (int i = 0; i < TEST_COUNT; i++) {
-            testIds.add(new TestIdentifier("dEQP-GLES3.funny.group", String.valueOf(i)));
+            testIds.add(new TestDescription("dEQP-GLES3.funny.group", String.valueOf(i)));
         }
 
         DeqpTestRunner deqpTest = buildGlesTestRunner(3, 0, testIds, mTestsDir);
@@ -2154,9 +2154,9 @@
         final int TEST_COUNT = 2237;
         final int SHARD_COUNT = 4;
 
-        ArrayList<TestIdentifier> testIds = new ArrayList<>(TEST_COUNT);
+        ArrayList<TestDescription> testIds = new ArrayList<>(TEST_COUNT);
         for (int i = 0; i < TEST_COUNT; i++) {
-            testIds.add(new TestIdentifier("dEQP-GLES3.funny.group", String.valueOf(i)));
+            testIds.add(new TestDescription("dEQP-GLES3.funny.group", String.valueOf(i)));
         }
 
         DeqpTestRunner deqpTest = buildGlesTestRunner(3, 0, testIds, mTestsDir);
@@ -2168,28 +2168,28 @@
         assertEquals(559, shard1.getTestInstance().size());
         int j = 0;
         // Ensure numbers, and that order is stable
-        for (TestIdentifier t : shard1.getTestInstance().keySet()) {
+        for (TestDescription t : shard1.getTestInstance().keySet()) {
             assertEquals(String.format("dEQP-GLES3.funny.group#%s", j),
                     String.format("%s#%s", t.getClassName(), t.getTestName()));
             j++;
         }
         DeqpTestRunner shard2 = (DeqpTestRunner)deqpTest.getTestShard(SHARD_COUNT, 1);
         assertEquals(559, shard2.getTestInstance().size());
-        for (TestIdentifier t : shard2.getTestInstance().keySet()) {
+        for (TestDescription t : shard2.getTestInstance().keySet()) {
             assertEquals(String.format("dEQP-GLES3.funny.group#%s", j),
                     String.format("%s#%s", t.getClassName(), t.getTestName()));
             j++;
         }
         DeqpTestRunner shard3 = (DeqpTestRunner)deqpTest.getTestShard(SHARD_COUNT, 2);
         assertEquals(559, shard3.getTestInstance().size());
-        for (TestIdentifier t : shard3.getTestInstance().keySet()) {
+        for (TestDescription t : shard3.getTestInstance().keySet()) {
             assertEquals(String.format("dEQP-GLES3.funny.group#%s", j),
                     String.format("%s#%s", t.getClassName(), t.getTestName()));
             j++;
         }
         DeqpTestRunner shard4 = (DeqpTestRunner)deqpTest.getTestShard(SHARD_COUNT, 3);
         assertEquals(560, shard4.getTestInstance().size());
-        for (TestIdentifier t : shard4.getTestInstance().keySet()) {
+        for (TestDescription t : shard4.getTestInstance().keySet()) {
             assertEquals(String.format("dEQP-GLES3.funny.group#%s", j),
                     String.format("%s#%s", t.getClassName(), t.getTestName()));
             j++;
@@ -2205,9 +2205,9 @@
         final int TEST_COUNT = 2;
         final int SHARD_COUNT = 3;
 
-        ArrayList<TestIdentifier> testIds = new ArrayList<>(TEST_COUNT);
+        ArrayList<TestDescription> testIds = new ArrayList<>(TEST_COUNT);
         for (int i = 0; i < TEST_COUNT; i++) {
-            testIds.add(new TestIdentifier("dEQP-GLES3.funny.group", String.valueOf(i)));
+            testIds.add(new TestDescription("dEQP-GLES3.funny.group", String.valueOf(i)));
         }
         DeqpTestRunner deqpTest = buildGlesTestRunner(3, 0, testIds, mTestsDir);
         OptionSetter setter = new OptionSetter(deqpTest);
@@ -2217,14 +2217,14 @@
         assertEquals(1, shard1.getTestInstance().size());
         int j = 0;
         // Ensure numbers, and that order is stable
-        for (TestIdentifier t : shard1.getTestInstance().keySet()) {
+        for (TestDescription t : shard1.getTestInstance().keySet()) {
             assertEquals(String.format("dEQP-GLES3.funny.group#%s", j),
                     String.format("%s#%s", t.getClassName(), t.getTestName()));
             j++;
         }
         DeqpTestRunner shard2 = (DeqpTestRunner)deqpTest.getTestShard(SHARD_COUNT, 1);
         assertEquals(1, shard2.getTestInstance().size());
-        for (TestIdentifier t : shard2.getTestInstance().keySet()) {
+        for (TestDescription t : shard2.getTestInstance().keySet()) {
             assertEquals(String.format("dEQP-GLES3.funny.group#%s", j),
                     String.format("%s#%s", t.getClassName(), t.getTestName()));
             j++;
@@ -2235,24 +2235,24 @@
         ITestInvocationListener mockListener
                 = EasyMock.createStrictMock(ITestInvocationListener.class);
         mockListener.testRunStarted(EasyMock.anyObject(), EasyMock.eq(0));
-        mockListener.testRunEnded(EasyMock.anyLong(), EasyMock.anyObject());
+        mockListener.testRunEnded(EasyMock.anyLong(), (Map<String, String>) EasyMock.anyObject());
         EasyMock.replay(mockListener);
         shard3.run(mockListener);
         EasyMock.verify(mockListener);
     }
 
     public void testRuntimeHint_optionNotSet() throws Exception {
-        final TestIdentifier[] testIds = {
-                new TestIdentifier("dEQP-GLES3.info", "vendor"),
-                new TestIdentifier("dEQP-GLES3.info", "renderer"),
-                new TestIdentifier("dEQP-GLES3.info", "version"),
-                new TestIdentifier("dEQP-GLES3.info", "shading_language_version"),
-                new TestIdentifier("dEQP-GLES3.info", "extensions"),
-                new TestIdentifier("dEQP-GLES3.info", "render_target")
+        final TestDescription[] testIds = {
+                new TestDescription("dEQP-GLES3.info", "vendor"),
+                new TestDescription("dEQP-GLES3.info", "renderer"),
+                new TestDescription("dEQP-GLES3.info", "version"),
+                new TestDescription("dEQP-GLES3.info", "shading_language_version"),
+                new TestDescription("dEQP-GLES3.info", "extensions"),
+                new TestDescription("dEQP-GLES3.info", "render_target")
         };
-        Collection<TestIdentifier> tests = new ArrayList<TestIdentifier>();
+        Collection<TestDescription> tests = new ArrayList<TestDescription>();
 
-        for (TestIdentifier id : testIds) {
+        for (TestDescription id : testIds) {
             tests.add(id);
         }
 
@@ -2333,21 +2333,21 @@
     }
 
     public void testIncludeFilterFile() throws Exception {
-        final TestIdentifier[] testIds = {
-                new TestIdentifier("dEQP-GLES3.missing", "no"),
-                new TestIdentifier("dEQP-GLES3.missing", "nope"),
-                new TestIdentifier("dEQP-GLES3.missing", "donotwant"),
-                new TestIdentifier("dEQP-GLES3.pick_me", "yes"),
-                new TestIdentifier("dEQP-GLES3.pick_me", "ok"),
-                new TestIdentifier("dEQP-GLES3.pick_me", "accepted"),
+        final TestDescription[] testIds = {
+                new TestDescription("dEQP-GLES3.missing", "no"),
+                new TestDescription("dEQP-GLES3.missing", "nope"),
+                new TestDescription("dEQP-GLES3.missing", "donotwant"),
+                new TestDescription("dEQP-GLES3.pick_me", "yes"),
+                new TestDescription("dEQP-GLES3.pick_me", "ok"),
+                new TestDescription("dEQP-GLES3.pick_me", "accepted"),
         };
 
-        List<TestIdentifier> allTests = new ArrayList<TestIdentifier>();
-        for (TestIdentifier id : testIds) {
+        List<TestDescription> allTests = new ArrayList<TestDescription>();
+        for (TestDescription id : testIds) {
             allTests.add(id);
         }
 
-        List<TestIdentifier> activeTests = new ArrayList<TestIdentifier>();
+        List<TestDescription> activeTests = new ArrayList<TestDescription>();
         activeTests.add(testIds[3]);
         activeTests.add(testIds[4]);
         activeTests.add(testIds[5]);
@@ -2362,14 +2362,14 @@
     }
 
     public void testMissingIncludeFilterFile() throws Exception {
-        final TestIdentifier[] testIds = {
-                new TestIdentifier("dEQP-GLES3.pick_me", "yes"),
-                new TestIdentifier("dEQP-GLES3.pick_me", "ok"),
-                new TestIdentifier("dEQP-GLES3.pick_me", "accepted"),
+        final TestDescription[] testIds = {
+                new TestDescription("dEQP-GLES3.pick_me", "yes"),
+                new TestDescription("dEQP-GLES3.pick_me", "ok"),
+                new TestDescription("dEQP-GLES3.pick_me", "accepted"),
         };
 
-        List<TestIdentifier> allTests = new ArrayList<TestIdentifier>();
-        for (TestIdentifier id : testIds) {
+        List<TestDescription> allTests = new ArrayList<TestDescription>();
+        for (TestDescription id : testIds) {
             allTests.add(id);
         }
 
@@ -2386,21 +2386,21 @@
     }
 
     public void testExcludeFilterFile() throws Exception {
-        final TestIdentifier[] testIds = {
-                new TestIdentifier("dEQP-GLES3.missing", "no"),
-                new TestIdentifier("dEQP-GLES3.missing", "nope"),
-                new TestIdentifier("dEQP-GLES3.missing", "donotwant"),
-                new TestIdentifier("dEQP-GLES3.pick_me", "yes"),
-                new TestIdentifier("dEQP-GLES3.pick_me", "ok"),
-                new TestIdentifier("dEQP-GLES3.pick_me", "accepted"),
+        final TestDescription[] testIds = {
+                new TestDescription("dEQP-GLES3.missing", "no"),
+                new TestDescription("dEQP-GLES3.missing", "nope"),
+                new TestDescription("dEQP-GLES3.missing", "donotwant"),
+                new TestDescription("dEQP-GLES3.pick_me", "yes"),
+                new TestDescription("dEQP-GLES3.pick_me", "ok"),
+                new TestDescription("dEQP-GLES3.pick_me", "accepted"),
         };
 
-        List<TestIdentifier> allTests = new ArrayList<TestIdentifier>();
-        for (TestIdentifier id : testIds) {
+        List<TestDescription> allTests = new ArrayList<TestDescription>();
+        for (TestDescription id : testIds) {
             allTests.add(id);
         }
 
-        List<TestIdentifier> activeTests = new ArrayList<TestIdentifier>();
+        List<TestDescription> activeTests = new ArrayList<TestDescription>();
         activeTests.add(testIds[3]);
         activeTests.add(testIds[4]);
         activeTests.add(testIds[5]);
@@ -2415,22 +2415,22 @@
     }
 
     public void testFilterComboWithFiles() throws Exception {
-        final TestIdentifier[] testIds = {
-                new TestIdentifier("dEQP-GLES3.group1", "footah"),
-                new TestIdentifier("dEQP-GLES3.group1", "foo"),
-                new TestIdentifier("dEQP-GLES3.group1", "nope"),
-                new TestIdentifier("dEQP-GLES3.group1", "nonotwant"),
-                new TestIdentifier("dEQP-GLES3.group2", "foo"),
-                new TestIdentifier("dEQP-GLES3.group2", "yes"),
-                new TestIdentifier("dEQP-GLES3.group2", "thoushallnotpass"),
+        final TestDescription[] testIds = {
+                new TestDescription("dEQP-GLES3.group1", "footah"),
+                new TestDescription("dEQP-GLES3.group1", "foo"),
+                new TestDescription("dEQP-GLES3.group1", "nope"),
+                new TestDescription("dEQP-GLES3.group1", "nonotwant"),
+                new TestDescription("dEQP-GLES3.group2", "foo"),
+                new TestDescription("dEQP-GLES3.group2", "yes"),
+                new TestDescription("dEQP-GLES3.group2", "thoushallnotpass"),
         };
 
-        List<TestIdentifier> allTests = new ArrayList<TestIdentifier>();
-        for (TestIdentifier id : testIds) {
+        List<TestDescription> allTests = new ArrayList<TestDescription>();
+        for (TestDescription id : testIds) {
             allTests.add(id);
         }
 
-        List<TestIdentifier> activeTests = new ArrayList<TestIdentifier>();
+        List<TestDescription> activeTests = new ArrayList<TestDescription>();
         activeTests.add(testIds[0]);
         activeTests.add(testIds[5]);
 
@@ -2458,18 +2458,18 @@
     }
 
     public void testDotToHashConversionInFilters() throws Exception {
-        final TestIdentifier[] testIds = {
-                new TestIdentifier("dEQP-GLES3.missing", "no"),
-                new TestIdentifier("dEQP-GLES3.pick_me", "donotwant"),
-                new TestIdentifier("dEQP-GLES3.pick_me", "yes")
+        final TestDescription[] testIds = {
+                new TestDescription("dEQP-GLES3.missing", "no"),
+                new TestDescription("dEQP-GLES3.pick_me", "donotwant"),
+                new TestDescription("dEQP-GLES3.pick_me", "yes")
         };
 
-        List<TestIdentifier> allTests = new ArrayList<TestIdentifier>();
-        for (TestIdentifier id : testIds) {
+        List<TestDescription> allTests = new ArrayList<TestDescription>();
+        for (TestDescription id : testIds) {
             allTests.add(id);
         }
 
-        List<TestIdentifier> activeTests = new ArrayList<TestIdentifier>();
+        List<TestDescription> activeTests = new ArrayList<TestDescription>();
         activeTests.add(testIds[2]);
 
         String expectedTrie = "{dEQP-GLES3{pick_me{yes}}}";