1 /* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 import vogar.Expectation; 18 import vogar.ExpectationStore; 19 import vogar.ModeId; 20 import vogar.Result; 21 22 import com.android.tradefed.util.AbiUtils; 23 24 import java.io.File; 25 import java.io.FilenameFilter; 26 import java.io.IOException; 27 import java.util.Arrays; 28 import java.util.HashSet; 29 import java.util.Set; 30 31 public class VogarUtils { 32 33 public static boolean isVogarKnownFailure(ExpectationStore[] expectationStores, 34 final String testClassName, 35 final String testMethodName) { 36 for (ExpectationStore expectationStore : expectationStores) { 37 if (isVogarKnownFailure(expectationStore, testClassName, testMethodName)) { 38 return true; 39 } 40 } 41 return false; 42 } 43 44 /** 45 * @return true iff the class/name is found in the vogar known failure list and it is not 46 * a known failure that is a result of an unsupported abi. 47 */ 48 public static boolean isVogarKnownFailure(ExpectationStore expectationStore, 49 final String testClassName, 50 final String testMethodName) { 51 if (expectationStore == null) { 52 return false; 53 } 54 String fullTestName = buildFullTestName(testClassName, testMethodName); 55 Expectation expectation = expectationStore.get(fullTestName); 56 if (expectation.getResult() == Result.SUCCESS) { 57 return false; 58 } 59 60 String description = expectation.getDescription(); 61 boolean foundAbi = AbiUtils.parseAbiList(description).size() > 0; 62 63 return expectation.getResult() != Result.SUCCESS && !foundAbi; 64 } 65 66 public static ExpectationStore provideExpectationStore(String dir) throws IOException { 67 if (dir == null) { 68 return null; 69 } 70 ExpectationStore result = ExpectationStore.parse(getExpectationFiles(dir), ModeId.DEVICE); 71 return result; 72 } 73 74 private static Set<File> getExpectationFiles(String dir) { 75 Set<File> expectSet = new HashSet<File>(); 76 File[] files = new File(dir).listFiles(new FilenameFilter() { 77 // ignore obviously temporary files 78 public boolean accept(File dir, String name) { 79 return !name.endsWith("~") && !name.startsWith("."); 80 } 81 }); 82 if (files != null) { 83 expectSet.addAll(Arrays.asList(files)); 84 } 85 return expectSet; 86 } 87 88 /** @return the test name in the form of com.android.myclass.TestClass#testMyMethod */ 89 public static String buildFullTestName(String testClass, String testMethodName) { 90 return String.format("%s#%s", testClass, testMethodName); 91 } 92 93 /** 94 * This method looks in the description field of the Vogar entry for the ABI_LIST_MARKER 95 * and returns the list of abis found there. 96 * 97 * @return The Set of supported abis parsed from the {@code expectation}'s description. 98 */ 99 public static Set<String> extractSupportedAbis(String architecture, Expectation expectation) { 100 Set<String> supportedAbiSet = AbiUtils.getAbisForArch(architecture); 101 if (expectation == null || expectation.getDescription().isEmpty()) { 102 // Include all abis since there was no limitation found in the description 103 return supportedAbiSet; 104 } 105 106 // Remove any abis that are not supported for the test. 107 supportedAbiSet.removeAll(AbiUtils.parseAbiList(expectation.getDescription())); 108 109 return supportedAbiSet; 110 } 111 112 /** 113 * Determine the correct set of ABIs for the given className/testName. 114 * 115 * @return the set of ABIs that can be expected to pass for the given combination of 116 * {@code architecture}, {@code className} and {@code testName}. 117 */ 118 public static Set<String> extractSupportedAbis(String architecture, 119 ExpectationStore[] expectationStores, 120 String className, 121 String testName) { 122 123 String fullTestName = buildFullTestName(className, testName); 124 Set<String> supportedAbiSet = AbiUtils.getAbisForArch(architecture); 125 for (ExpectationStore expectationStore : expectationStores) { 126 Expectation expectation = expectationStore.get(fullTestName); 127 supportedAbiSet.retainAll(extractSupportedAbis(architecture, expectation)); 128 } 129 130 return supportedAbiSet; 131 } 132 133 /** 134 * Returns the greatest timeout in minutes for the test in all 135 * expectation stores, or 0 if no timeout was found. 136 */ 137 public static int timeoutInMinutes(ExpectationStore[] expectationStores, 138 final String testClassName, 139 final String testMethodName) { 140 int timeoutInMinutes = 0; 141 for (ExpectationStore expectationStore : expectationStores) { 142 timeoutInMinutes = Math.max(timeoutInMinutes, 143 timeoutInMinutes(expectationStore, 144 testClassName, 145 testMethodName)); 146 } 147 return timeoutInMinutes; 148 } 149 150 /** 151 * Returns the timeout in minutes for the test in the expectation 152 * stores, or 0 if no timeout was found. 153 */ 154 public static int timeoutInMinutes(ExpectationStore expectationStore, 155 final String testClassName, 156 final String testMethodName) { 157 if (expectationStore == null) { 158 return 0; 159 } 160 String fullTestName = buildFullTestName(testClassName, testMethodName); 161 return timeoutInMinutes(expectationStore.get(fullTestName)); 162 } 163 164 /** 165 * Returns the timeout in minutes for the expectation. Currently a 166 * tag of large results in a 60 minute timeout, otherwise 0 is 167 * returned to indicate a default timeout should be used. 168 */ 169 public static int timeoutInMinutes(Expectation expectation) { 170 return expectation.getTags().contains("large") ? 60 : 0; 171 } 172 } 173