TestRequestBuilder.java revision bb23e68d4dc19a37df318b8d169e3dfd0dd1c20e
1bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot/* 2bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot * Copyright (C) 2012 The Android Open Source Project 3bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot * 4bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot * Licensed under the Apache License, Version 2.0 (the "License"); 5bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot * you may not use this file except in compliance with the License. 6bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot * You may obtain a copy of the License at 7bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot * 8bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot * http://www.apache.org/licenses/LICENSE-2.0 9bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot * 10bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot * Unless required by applicable law or agreed to in writing, software 11bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot * distributed under the License is distributed on an "AS IS" BASIS, 12bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot * See the License for the specific language governing permissions and 14bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot * limitations under the License. 15bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot */ 16bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabotpackage com.android.test.runner; 17bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot 18bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabotimport android.util.Log; 19bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot 20bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabotimport com.android.test.runner.ClassPathScanner.ChainedClassNameFilter; 21bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabotimport com.android.test.runner.ClassPathScanner.ExcludePackageNameFilter; 22bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabotimport com.android.test.runner.ClassPathScanner.ExternalClassNameFilter; 23bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabotimport com.android.test.runner.TestLoader.LoadResults; 24bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot 25bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabotimport org.junit.runner.Request; 26bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabotimport org.junit.runner.manipulation.Filter; 27bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot 28bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabotimport java.io.IOException; 29bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabotimport java.io.PrintStream; 30bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabotimport java.util.ArrayList; 31bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabotimport java.util.Arrays; 32bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabotimport java.util.Collection; 33bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabotimport java.util.Collections; 34bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot 35bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot/** 36bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot * Builds a {@link Request} from test classes in given apk paths, filtered on provided set of 37bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot * restrictions. 38bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot */ 39bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabotpublic class TestRequestBuilder { 40bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot 41bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot private static final String LOG_TAG = "TestRequestBuilder"; 42bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot 43bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot private String[] mApkPaths; 44bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot private Collection<String> mTestClasses = new ArrayList<String>(); 45bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot @SuppressWarnings("unused") 46bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot private Filter mFilter = Filter.ALL; 47bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot 48bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot public TestRequestBuilder(String... apkPaths) { 49bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot mApkPaths = apkPaths; 50bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot } 51bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot 52bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot /** 53bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot * Add a test class to be executed 54bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot * @param className 55bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot * 56bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot * TODO: add method support 57bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot */ 58bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot public void addTestClass(String className) { 59bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot mTestClasses.add(className); 60bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot } 61bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot 62bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot TestRequest build(PrintStream writer) { 63bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot if (mTestClasses.isEmpty()) { 64bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot mTestClasses = getClassNames(writer); 65bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot } 66bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot TestLoader loader = new TestLoader(); 67bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot LoadResults loadedTests = loader.loadTests(mTestClasses, writer); 68bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot 69bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot Request request = Request.classes(loadedTests.getLoadedClasses().toArray(new Class[0])); 70bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot return new TestRequest(loadedTests.getLoadFailures(), request); 71bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot } 72bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot 73bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot private Collection<String> getClassNames(PrintStream writer) { 74bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot Log.i(LOG_TAG, String.format("Scanning classpath to find tests in apks %s", 75bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot Arrays.toString(mApkPaths))); 76bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot ClassPathScanner scanner = new ClassPathScanner(mApkPaths); 77bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot try { 78bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot // exclude inner classes, and classes from junit namespace 79bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot return scanner.getClassPathEntries(new ChainedClassNameFilter( 80bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot new ExcludePackageNameFilter("junit"), 81bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot new ExcludePackageNameFilter("org.junit"), 82bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot new ExcludePackageNameFilter("org.hamcrest"), 83bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot new ExternalClassNameFilter())); 84bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot } catch (IOException e) { 85bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot writer.println("failed to scan classes"); 86bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot Log.e(LOG_TAG, "Failed to scan classes", e); 87bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot } 88bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot return Collections.emptyList(); 89bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot } 90bb23e68d4dc19a37df318b8d169e3dfd0dd1c20eBrett Chabot} 91