From 57792529e763644169c77eb43596887ebb5f52e7 Mon Sep 17 00:00:00 2001 From: Aaron Holden Date: Mon, 6 Jun 2016 16:51:56 -0700 Subject: [PATCH] Deqptestrunner efficient filtering bug:28245788 Change-Id: I2c28fb7aed7a13c4f011b76b699cf0845c821f7c --- .../drawelements/deqp/runner/DeqpTestRunner.java | 51 ++++++++++++++-------- .../deqp/runner/DeqpTestRunnerTest.java | 19 +++++--- 2 files changed, 47 insertions(+), 23 deletions(-) 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 bb8ff68..ef6034a 100644 --- a/android/cts/runner/src/com/drawelements/deqp/runner/DeqpTestRunner.java +++ b/android/cts/runner/src/com/drawelements/deqp/runner/DeqpTestRunner.java @@ -1882,14 +1882,26 @@ public class DeqpTestRunner implements IBuildReceiver, IDeviceTest, } } - private static List buildPatternList(List filters) { - List patterns = new ArrayList(filters.size()); + private static List getPatternFilters(List filters) { + List patterns = new ArrayList(); for (String filter : filters) { - patterns.add(Pattern.compile(filter.replace(".","\\.").replace("*",".*"))); + if (filter.contains("*")) { + patterns.add(Pattern.compile(filter.replace(".","\\.").replace("*",".*"))); + } } return patterns; } + private static Set getNonPatternFilters(List filters) { + Set nonPatternFilters = new HashSet(); + for (String filter : filters) { + if (!filter.contains("*")) { + nonPatternFilters.add(filter); + } + } + return nonPatternFilters; + } + private static boolean matchesAny(TestIdentifier test, List patterns) { for (Pattern pattern : patterns) { if (pattern.matcher(test.toString()).matches()) { @@ -1900,32 +1912,35 @@ public class DeqpTestRunner implements IBuildReceiver, IDeviceTest, } /** - * Filter tests. - * - * '*' is 0 or more characters. '.' is interpreted verbatim. - * - * Optimized for small number of filters against many tests. + * Filter tests with the option of filtering by pattern. * + * '*' is 0 or more characters. + * '.' is interpreted verbatim. */ private static void filterTests(Map> tests, List includeFilters, List excludeFilters) { // We could filter faster by building the test case tree. // Let's see if this is fast enough. - List includes = buildPatternList(includeFilters); - List excludes = buildPatternList(excludeFilters); + Set includeStrings = getNonPatternFilters(includeFilters); + Set excludeStrings = getNonPatternFilters(excludeFilters); + List includePatterns = getPatternFilters(includeFilters); + List excludePatterns = getPatternFilters(excludeFilters); List testList = new ArrayList(tests.keySet()); for (TestIdentifier test : testList) { - // Remove test if it does not match includes or matches - // excludes. - // Empty include filter includes everything. - if (includes.isEmpty() || matchesAny(test, includes)) { - if (!matchesAny(test, excludes)) { - continue; - } + if (excludeStrings.contains(test.toString())) { + tests.remove(test); // remove test if explicitly excluded + continue; + } + boolean includesExist = !includeStrings.isEmpty() || !includePatterns.isEmpty(); + boolean testIsIncluded = includeStrings.contains(test.toString()) + || matchesAny(test, includePatterns); + if ((includesExist && !testIsIncluded) || matchesAny(test, excludePatterns)) { + // if this test isn't included and other tests are, + // or if test matches exclude pattern, exclude test + tests.remove(test); } - tests.remove(test); } } 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 5e994bb..b11377c 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 @@ -640,7 +640,7 @@ public class DeqpTestRunnerTest extends TestCase { String expectedTrie, List expectedTests) throws Exception { - + boolean thereAreTests = !expectedTests.isEmpty(); ITestDevice mockDevice = EasyMock.createMock(ITestDevice.class); ITestInvocationListener mockListener = EasyMock.createStrictMock(ITestInvocationListener.class); @@ -658,16 +658,21 @@ public class DeqpTestRunnerTest extends TestCase { EasyMock.expect(mockDevice.getProperty("ro.opengles.version")) .andReturn(Integer.toString(version)).atLeastOnce(); - EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG))).andReturn("") + if (thereAreTests) + { + // only expect to install/uninstall packages if there are any tests + EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG))).andReturn("") .once(); - EasyMock.expect(mockDevice.installPackage(EasyMock.anyObject(), + EasyMock.expect(mockDevice.installPackage(EasyMock.anyObject(), EasyMock.eq(true), EasyMock.eq(AbiUtils.createAbiFlag(ABI.getName())))) .andReturn(null).once(); + } + mockListener.testRunStarted(getTestId(deqpTest), expectedTests.size()); EasyMock.expectLastCall().once(); - if (expectedTests.size() > 0) + if (thereAreTests) { expectRenderConfigQuery(mockDevice, 3, 0); @@ -688,8 +693,12 @@ public class DeqpTestRunnerTest extends TestCase { mockListener.testRunEnded(EasyMock.anyLong(), EasyMock.>notNull()); EasyMock.expectLastCall().once(); - EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG))).andReturn("") + if (thereAreTests) + { + // package will only be installed if there are tests to run + EasyMock.expect(mockDevice.uninstallPackage(EasyMock.eq(DEQP_ONDEVICE_PKG))).andReturn("") .once(); + } EasyMock.replay(mockDevice, mockIDevice); EasyMock.replay(mockListener); -- 2.7.4