Merge "DO NOT MERGE This CTS will failed in pixel-C, refer to b/28986484. So revert it. Only work for nyc, never merge into L, M Revert "DO NOT MERGE This test is to test the security vulnerability in qhwc::MDPCompLowRes::allocLayerPipes (Qualcomm) and that remote rode execution vulnerabilities in Display Driver is fixed Bug #24163261"" into nyc-dev
diff --git a/common/host-side/tradefed/res/config/common-compatibility-config.xml b/common/host-side/tradefed/res/config/common-compatibility-config.xml
index 1b40f16..7ffbea5 100644
--- a/common/host-side/tradefed/res/config/common-compatibility-config.xml
+++ b/common/host-side/tradefed/res/config/common-compatibility-config.xml
@@ -20,5 +20,6 @@
     <logger class="com.android.tradefed.log.FileLogger">
         <option name="log-level-display" value="WARN" />
     </logger>
+    <result_reporter class="com.android.compatibility.common.tradefed.result.ConsoleReporter" />
     <result_reporter class="com.android.compatibility.common.tradefed.result.ResultReporter" />
 </configuration>
diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/result/ConsoleReporter.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/result/ConsoleReporter.java
new file mode 100644
index 0000000..19adb3f
--- /dev/null
+++ b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/result/ConsoleReporter.java
@@ -0,0 +1,151 @@
+/*
+ * Copyright (C) 2016 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 com.android.compatibility.common.tradefed.result;
+
+import com.android.ddmlib.Log;
+import com.android.ddmlib.Log.LogLevel;
+import com.android.ddmlib.testrunner.TestIdentifier;
+import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.config.Option;
+import com.android.tradefed.config.OptionClass;
+import com.android.tradefed.config.OptionCopier;
+import com.android.tradefed.log.LogUtil.CLog;
+import com.android.tradefed.result.IShardableListener;
+import com.android.tradefed.result.StubTestInvocationListener;
+import com.android.tradefed.util.TimeUtil;
+
+import java.util.Map;
+
+/**
+ * Write test progress to the test console.
+ */
+public class ConsoleReporter extends StubTestInvocationListener implements IShardableListener {
+
+    private static final String UNKNOWN_DEVICE = "unknown_device";
+
+    @Option(name = "quiet-output", description = "Mute display of test results.")
+    private boolean mQuietOutput = false;
+
+    private String mDeviceSerial = UNKNOWN_DEVICE;
+    private boolean mTestFailed;
+    private String mModuleId;
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void invocationStarted(IBuildInfo buildInfo) {
+        if (buildInfo == null) {
+            CLog.w("buildInfo should not be null");
+            return;
+        }
+
+        mDeviceSerial = buildInfo.getDeviceSerial().replace("%", "%%");
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void testRunStarted(String id, int numTests) {
+        mModuleId = id;
+        log("Starting %s with %d test%s", id, numTests, (numTests > 1) ? "s" : "");
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void testStarted(TestIdentifier test) {
+        mTestFailed = false;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void testFailed(TestIdentifier test, String trace) {
+        log("%s fail: %s", test, trace);
+        mTestFailed = true;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void testIgnored(TestIdentifier test) {
+        log("%s ignore", test);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void testAssumptionFailure(TestIdentifier test, String trace) {
+        log("%s failed assumption: %s", test, trace);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void testEnded(TestIdentifier test, Map<String, String> testMetrics) {
+        if (!mTestFailed) {
+            log("%s pass", test);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void testRunFailed(String errorMessage) {
+        log(errorMessage);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void testRunStopped(long elapsedTime) {
+        log("%s stopped (%s)", mModuleId, TimeUtil.formatElapsedTime(elapsedTime));
+    }
+
+    /**
+     * Print out to the console or log silently when mQuietOutput is true.
+     */
+    private void log(String format, Object... args) {
+        // Escape any "%" signs in the device serial.
+        format = String.format("[%s] %s", mDeviceSerial, format);
+
+        if (mQuietOutput) {
+            CLog.i(format, args);
+        } else {
+            CLog.logAndDisplay(LogLevel.INFO, format, args);
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public IShardableListener clone() {
+        ConsoleReporter clone = new ConsoleReporter();
+        OptionCopier.copyOptionsNoThrow(this, clone);
+        return clone;
+    }
+}
diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/result/ResultReporter.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/result/ResultReporter.java
index c609163..ae74c26 100644
--- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/result/ResultReporter.java
+++ b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/result/ResultReporter.java
@@ -64,7 +64,7 @@
 import java.util.Map.Entry;
 
 /**
- * Reporter for Compatibility test results.
+ * Collect test results for an entire invocation and output test results to disk.
  */
 @OptionClass(alias="result-reporter")
 public class ResultReporter implements ILogSaverListener, ITestInvocationListener,
@@ -85,9 +85,6 @@
             importance = Importance.IF_UNSET)
     private Integer mRetrySessionId = null;
 
-    @Option(name = "quiet-output", description = "Mute display of test results.")
-    private boolean mQuietOutput = false;
-
     @Option(name = "result-server", description = "Server to publish test results.")
     private String mResultServer;
 
@@ -154,7 +151,7 @@
                 e.printStackTrace();
             }
             if (mResultDir != null && mResultDir.mkdirs()) {
-                    logResult("Created result dir %s", mResultDir.getAbsolutePath());
+                info("Created result dir %s", mResultDir.getAbsolutePath());
             } else {
                 throw new IllegalArgumentException(String.format("Could not create result dir %s",
                         mResultDir.getAbsolutePath()));
@@ -169,7 +166,7 @@
             e.printStackTrace();
         }
         if (mLogDir != null && mLogDir.mkdirs()) {
-            logResult("Created log dir %s", mLogDir.getAbsolutePath());
+            info("Created log dir %s", mLogDir.getAbsolutePath());
         } else {
             throw new IllegalArgumentException(String.format("Could not create log dir %s",
                     mLogDir.getAbsolutePath()));
@@ -188,7 +185,6 @@
      */
     @Override
     public void testRunStarted(String id, int numTests) {
-        logResult("Starting %s with %d test%s", id, numTests, (numTests > 1) ? "s" : "");
         mCurrentModuleResult = mResult.getOrCreateModule(id);
         if (mDeviceSerial == null || mDeviceSerial.equals("unknown_device")) {
             mResult.addDeviceSerial(mBuild.getDeviceSerial());
@@ -213,7 +209,6 @@
     @Override
     public void testEnded(TestIdentifier test, Map<String, String> metrics) {
         if (mCurrentResult.getResultStatus() == TestStatus.FAIL) {
-            logResult("%s has previously failed", test);
             // Test has previously failed.
             return;
         }
@@ -235,12 +230,6 @@
             // Only claim that we passed when we're certain our result was
             // not any other state.
             mCurrentResult.passed(report);
-            logResult("%s passed", test);
-        } else {
-            // We had some other result (presumably NOT_EXECUTED, but we
-            // leave this more general in case of future expansion of the
-            // TestResult enum.
-            logResult("%s %s", test, mCurrentResult.getResultStatus().getValue());
         }
     }
 
@@ -249,8 +238,7 @@
      */
     @Override
     public void testIgnored(TestIdentifier test) {
-        mCurrentResult.notExecuted();
-        logResult("%s ignored", test);
+        // Ignored tests are not reported
     }
 
     /**
@@ -259,7 +247,6 @@
     @Override
     public void testFailed(TestIdentifier test, String trace) {
         mCurrentResult.failed(trace);
-        logResult("%s failed: %s", test, trace);
     }
 
     /**
@@ -268,7 +255,6 @@
     @Override
     public void testAssumptionFailure(TestIdentifier test, String trace) {
         mCurrentResult.skipped();
-        logResult("%s failed assumption: %s", test, trace);
     }
 
     /**
@@ -276,8 +262,6 @@
      */
     @Override
     public void testRunStopped(long elapsedTime) {
-        logResult("%s stopped after %s", mCurrentModuleResult.getId(),
-                TimeUtil.formatElapsedTime(elapsedTime));
         // ignore
     }
 
@@ -294,7 +278,7 @@
             }
         }
         mCurrentModuleResult.addRuntime(elapsedTime);
-        logResult("%s completed in %s. %d passed, %d failed, %d not executed",
+        info("%s completed in %s. %d passed, %d failed, %d not executed",
                 mCurrentModuleResult.getId(),
                 TimeUtil.formatElapsedTime(elapsedTime),
                 mCurrentModuleResult.countResults(TestStatus.PASS),
@@ -306,8 +290,7 @@
      * {@inheritDoc}
      */
     @Override
-    public void testRunFailed(String id) {
-        logResult("%s failed to run", id);
+    public void testRunFailed(String errorMessage) {
         // ignore
     }
 
@@ -335,7 +318,7 @@
      */
     @Override
     public void invocationEnded(long elapsedTime) {
-        logResult("Invocation completed in %s. %d passed, %d failed, %d not executed",
+        info("Invocation completed in %s. %d passed, %d failed, %d not executed",
                 TimeUtil.formatElapsedTime(elapsedTime),
                 mResult.countResults(TestStatus.PASS),
                 mResult.countResults(TestStatus.FAIL),
@@ -352,11 +335,12 @@
                     mBuildHelper.getSuiteVersion(), mBuildHelper.getSuitePlan(),
                     mBuildHelper.getSuiteBuild(), mResult, mResultDir, mStartTime,
                     elapsedTime + mStartTime, mReferenceUrl);
-            logResult("Result saved at: %s", resultFile.getCanonicalPath());
+            info("Test Result: %s", resultFile.getCanonicalPath());
             copyDynamicConfigFiles(mBuildHelper.getDynamicConfigFiles(), mResultDir);
             copyFormattingFiles(mResultDir);
             // Zip the full test results directory.
             File zippedResults = zipResults(mResultDir);
+            info("Full Result: %s", zippedResults.getCanonicalPath());
             // Save the test result XML.
             if (mUseLogSaver) {
                 FileInputStream fis = null;
@@ -382,8 +366,7 @@
             }
             if (mResultServer != null && !mResultServer.trim().isEmpty() && !mDisableResultPosting) {
                 try {
-                    logResult("Result Server Response: %d",
-                            mUploader.uploadResult(resultFile, mReferenceUrl));
+                    info("Result Server: %d", mUploader.uploadResult(resultFile, mReferenceUrl));
                 } catch (IOException ioe) {
                     CLog.e("[%s] IOException while uploading result.", mDeviceSerial);
                     CLog.e(ioe);
@@ -402,7 +385,7 @@
      */
     @Override
     public void invocationFailed(Throwable cause) {
-        logResult("Invocation failed: %s", cause);
+        warn("Invocation failed: %s", cause);
     }
 
     /**
@@ -413,9 +396,9 @@
         try {
             LogFileSaver saver = new LogFileSaver(mLogDir);
             File logFile = saver.saveAndZipLogData(name, type, stream.createInputStream());
-            logResult("Saved logs for %s in %s", name, logFile.getAbsolutePath());
+            info("Saved logs for %s in %s", name, logFile.getAbsolutePath());
         } catch (IOException e) {
-            logResult("Failed to write log for %s", name);
+            warn("Failed to write log for %s", name);
             e.printStackTrace();
         }
     }
@@ -460,12 +443,10 @@
                 try {
                     FileUtil.writeToFile(configStream, resultFile);
                 } catch (IOException e) {
-                    Log.w(ResultReporter.class.getSimpleName(),
-                            String.format("Failed to write %s to file", resultFileName));
+                    warn("Failed to write %s to file", resultFileName);
                 }
             } else {
-                Log.w(ResultReporter.class.getSimpleName(),
-                        String.format("Failed to load %s from jar", resultFileName));
+                warn("Failed to load %s from jar", resultFileName);
             }
         }
     }
@@ -487,8 +468,7 @@
                 FileUtil.copyFile(configFiles.get(moduleName), resultFile);
                 FileUtil.deleteFile(configFiles.get(moduleName));
             } catch (IOException e) {
-                Log.w(ResultReporter.class.getSimpleName(),
-                        String.format("Failed to copy config file for %s to file", moduleName));
+                warn("Failed to copy config file for %s to file", moduleName);
             }
         }
     }
@@ -506,26 +486,36 @@
                     resultsDir.getName()));
             ZipUtil.createZip(resultsDir, zipResultFile);
         } catch (IOException e) {
-            Log.w(ResultReporter.class.getSimpleName(),
-                    String.format("Failed to create zip for %s", resultsDir.getName()));
+            warn("Failed to create zip for %s", resultsDir.getName());
         }
         return zipResultFile;
     }
 
     /**
-     * @return the mResult
+     *  Log info to the console.
      */
-    public IInvocationResult getResult() {
-        return mResult;
+    private static void info(String format, Object... args) {
+        log(LogLevel.INFO, format, args);
     }
 
-    private void logResult(String format, Object... args) {
-        // Escape any "%" signs in the device serial.
-        format = String.format("[%s] %s", mDeviceSerial.replace("%", "%%"), format);
-        if (mQuietOutput) {
-            CLog.i(format, args);
-        } else {
-            CLog.logAndDisplay(LogLevel.INFO, format, args);
-        }
+    /**
+     *  Log a warning to the console.
+     */
+    private static void warn(String format, Object... args) {
+        log(LogLevel.WARN, format, args);
+    }
+
+    /**
+     * Log a message to the console
+     */
+    private static void log(LogLevel level, String format, Object... args) {
+        CLog.logAndDisplay(level, format, args);
+    }
+
+    /**
+     * For testing
+     */
+    IInvocationResult getResult() {
+        return mResult;
     }
 }
diff --git a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/testtype/ModuleDefTest.java b/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/testtype/ModuleDefTest.java
index 8714c1d..25d6930 100644
--- a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/testtype/ModuleDefTest.java
+++ b/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/testtype/ModuleDefTest.java
@@ -22,7 +22,10 @@
 import com.android.tradefed.result.ITestInvocationListener;
 import com.android.tradefed.targetprep.ITargetPreparer;
 import com.android.tradefed.testtype.IAbi;
+import com.android.tradefed.testtype.IAbiReceiver;
 import com.android.tradefed.testtype.IRemoteTest;
+import com.android.tradefed.testtype.IRuntimeHintProvider;
+import com.android.tradefed.testtype.ITestCollector;
 import com.android.tradefed.testtype.ITestFilterReceiver;
 
 import junit.framework.TestCase;
@@ -62,7 +65,8 @@
         assertEquals("Incorrect exclude filter", TEST_1, mockTest.mExcludeFilters.get(0));
     }
 
-    private class MockRemoteTest implements IRemoteTest, ITestFilterReceiver {
+    private class MockRemoteTest implements IRemoteTest, ITestFilterReceiver, IAbiReceiver,
+            IRuntimeHintProvider, ITestCollector {
 
         private final List<String> mIncludeFilters = new ArrayList<>();
         private final List<String> mExcludeFilters = new ArrayList<>();
@@ -92,6 +96,20 @@
             // Do nothing
         }
 
+        @Override
+        public void setAbi(IAbi abi) {
+            // Do nothing
+        }
+
+        @Override
+        public long getRuntimeHint() {
+            return 1L;
+        }
+
+        @Override
+        public void setCollectTestsOnly(boolean shouldCollectTest) {
+            // Do nothing
+        }
     }
 
     private class MockListener extends NoOpTestInvocationListener {}
diff --git a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/testtype/ShardableTestStub.java b/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/testtype/ShardableTestStub.java
index 52a1aad..d3fe2a7 100644
--- a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/testtype/ShardableTestStub.java
+++ b/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/testtype/ShardableTestStub.java
@@ -19,16 +19,23 @@
 import com.android.tradefed.config.Option;
 import com.android.tradefed.device.DeviceNotAvailableException;
 import com.android.tradefed.result.ITestInvocationListener;
+import com.android.tradefed.testtype.IAbi;
+import com.android.tradefed.testtype.IAbiReceiver;
 import com.android.tradefed.testtype.IBuildReceiver;
 import com.android.tradefed.testtype.IRemoteTest;
+import com.android.tradefed.testtype.IRuntimeHintProvider;
 import com.android.tradefed.testtype.IShardableTest;
+import com.android.tradefed.testtype.ITestCollector;
+import com.android.tradefed.testtype.ITestFilterReceiver;
 
 import junit.framework.Assert;
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.List;
 
-public class ShardableTestStub implements IRemoteTest, IShardableTest, IBuildReceiver {
+public class ShardableTestStub implements IRemoteTest, IShardableTest, IBuildReceiver,
+        IAbiReceiver, IRuntimeHintProvider, ITestCollector, ITestFilterReceiver {
 
     @Option(name = "module")
     String mModule;
@@ -70,4 +77,40 @@
         }
         return mShards;
     }
+
+    @Override
+    public void setAbi(IAbi abi) {
+        // Do nothing
+    }
+
+    @Override
+    public long getRuntimeHint() {
+        return 1L;
+    }
+
+    @Override
+    public void setCollectTestsOnly(boolean shouldCollectTest) {
+        // Do nothing
+    }
+
+    @Override
+    public void addIncludeFilter(String filter) {
+
+    }
+
+    @Override
+    public void addAllIncludeFilters(List<String> filters) {
+
+    }
+
+    @Override
+    public void addExcludeFilter(String filter) {
+
+    }
+
+    @Override
+    public void addAllExcludeFilters(List<String> filters) {
+
+    }
+
 }
diff --git a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/testtype/TestStub.java b/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/testtype/TestStub.java
index 8a6ab69..3acbcb9 100644
--- a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/testtype/TestStub.java
+++ b/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/testtype/TestStub.java
@@ -18,9 +18,19 @@
 import com.android.tradefed.config.Option;
 import com.android.tradefed.device.DeviceNotAvailableException;
 import com.android.tradefed.result.ITestInvocationListener;
+import com.android.tradefed.testtype.IAbi;
+import com.android.tradefed.testtype.IAbiReceiver;
+import com.android.tradefed.testtype.IBuildReceiver;
 import com.android.tradefed.testtype.IRemoteTest;
+import com.android.tradefed.testtype.IRuntimeHintProvider;
+import com.android.tradefed.testtype.IShardableTest;
+import com.android.tradefed.testtype.ITestCollector;
+import com.android.tradefed.testtype.ITestFilterReceiver;
 
-public class TestStub implements IRemoteTest {
+import java.util.List;
+
+public class TestStub implements IRemoteTest, IAbiReceiver, IRuntimeHintProvider, ITestCollector,
+        ITestFilterReceiver {
 
     @Option(name = "module")
     String mModule;
@@ -37,4 +47,39 @@
         // Do nothing
     }
 
+    @Override
+    public void setAbi(IAbi abi) {
+        // Do nothing
+    }
+
+    @Override
+    public long getRuntimeHint() {
+        return 1L;
+    }
+
+    @Override
+    public void setCollectTestsOnly(boolean shouldCollectTest) {
+        // Do nothing
+    }
+
+    @Override
+    public void addIncludeFilter(String filter) {
+
+    }
+
+    @Override
+    public void addAllIncludeFilters(List<String> filters) {
+
+    }
+
+    @Override
+    public void addExcludeFilter(String filter) {
+
+    }
+
+    @Override
+    public void addAllExcludeFilters(List<String> filters) {
+
+    }
+
 }
diff --git a/tests/core/runner/src/com/android/cts/core/runner/AndroidJUnitRunnerConstants.java b/tests/core/runner/src/com/android/cts/core/runner/AndroidJUnitRunnerConstants.java
index 8875c13..8bc2f01 100644
--- a/tests/core/runner/src/com/android/cts/core/runner/AndroidJUnitRunnerConstants.java
+++ b/tests/core/runner/src/com/android/cts/core/runner/AndroidJUnitRunnerConstants.java
@@ -92,6 +92,11 @@
     String ARGUMENT_COUNT = "count";
 
     /**
+     * The per test timeout value.
+     */
+    String ARGUMENT_TIMEOUT = "timeout_msec";
+
+    /**
      * Token representing how long (in seconds) the current test took to execute.
      *
      * <p>The equivalent constant in {@code InstrumentationTestRunner} is private.
diff --git a/tests/core/runner/src/com/android/cts/core/runner/CoreTestRunner.java b/tests/core/runner/src/com/android/cts/core/runner/CoreTestRunner.java
index 58f34c3..887762f 100644
--- a/tests/core/runner/src/com/android/cts/core/runner/CoreTestRunner.java
+++ b/tests/core/runner/src/com/android/cts/core/runner/CoreTestRunner.java
@@ -59,6 +59,7 @@
 import static com.android.cts.core.runner.AndroidJUnitRunnerConstants.ARGUMENT_TEST_CLASS;
 import static com.android.cts.core.runner.AndroidJUnitRunnerConstants.ARGUMENT_TEST_FILE;
 import static com.android.cts.core.runner.AndroidJUnitRunnerConstants.ARGUMENT_TEST_PACKAGE;
+import static com.android.cts.core.runner.AndroidJUnitRunnerConstants.ARGUMENT_TIMEOUT;
 
 /**
  * A drop-in replacement for AndroidJUnitTestRunner, which understands the same arguments, and has
@@ -86,6 +87,9 @@
     /** Only log the number of tests, and not run them. */
     private boolean logOnly;
 
+    /** The amount of time in millis to wait for a single test to complete. */
+    private long testTimeout;
+
     /**
      * The container for any test expectations.
      */
@@ -120,6 +124,7 @@
 
         this.logOnly = "true".equalsIgnoreCase(args.getString(ARGUMENT_LOG_ONLY));
         this.testCountOnly = args.getBoolean(ARGUMENT_COUNT);
+        this.testTimeout = parseUnsignedLong(args.getString(ARGUMENT_TIMEOUT), ARGUMENT_TIMEOUT);
 
         try {
             // Get the set of resource names containing the expectations.
@@ -228,7 +233,7 @@
         }
 
         AndroidRunnerParams runnerParams = new AndroidRunnerParams(this, args,
-                logOnly || testCountOnly, -1, false);
+                logOnly || testCountOnly, testTimeout, false /*ignoreSuiteMethods*/);
 
         JUnitCore core = new JUnitCore();
 
@@ -307,4 +312,22 @@
             throw err;
         }
     }
+
+    /**
+     * Parse long from given value - except either Long or String.
+     *
+     * @return the value, -1 if not found
+     * @throws NumberFormatException if value is negative or not a number
+     */
+    private static long parseUnsignedLong(Object value, String name) {
+        if (value != null) {
+            long longValue = Long.parseLong(value.toString());
+            if (longValue < 0) {
+                throw new NumberFormatException(name + " can not be negative");
+            }
+            return longValue;
+        }
+        return -1;
+    }
+
 }
diff --git a/tests/tests/graphics/src/android/opengl/cts/OpenGlEsVersionTest.java b/tests/tests/graphics/src/android/opengl/cts/OpenGlEsVersionTest.java
index 8b99003..77c6da1 100644
--- a/tests/tests/graphics/src/android/opengl/cts/OpenGlEsVersionTest.java
+++ b/tests/tests/graphics/src/android/opengl/cts/OpenGlEsVersionTest.java
@@ -174,7 +174,6 @@
             "EGL_ANDROID_front_buffer_auto_refresh",
             "EGL_EXT_protected_content",
             "EGL_KHR_mutable_render_buffer",
-            "EGL_KHR_reusable_sync",
             "EGL_KHR_wait_sync",
         };
 
diff --git a/tools/cts-tradefed/Android.mk b/tools/cts-tradefed/Android.mk
index 6ae6066..32babe6 100644
--- a/tools/cts-tradefed/Android.mk
+++ b/tools/cts-tradefed/Android.mk
@@ -25,7 +25,7 @@
 LOCAL_SUITE_TARGET_ARCH := $(TARGET_ARCH)
 LOCAL_SUITE_NAME := CTS
 LOCAL_SUITE_FULLNAME := "Compatibility Test Suite"
-LOCAL_SUITE_VERSION := 5.0
+LOCAL_SUITE_VERSION := 7.0
 
 LOCAL_MODULE := cts-tradefed