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