| /* |
| * Copyright (C) 2008 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.cts; |
| |
| import java.io.IOException; |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.Iterator; |
| |
| /** |
| * Hold information for a suite of test case, provide functions |
| * on storing and executing a test suite from CTS test harness. |
| * |
| */ |
| public class TestSuite implements DeviceObserver { |
| private TestPackage mParentPackage; |
| private Collection<TestCase> mTestCases; |
| private String mName; |
| private String mFullName; |
| private Collection<TestSuite> mSubSuites; |
| |
| private TestCase mCurrentTestCase; |
| private TestSuite mCurrentSubSuite; |
| private boolean mTestStop; |
| |
| /** |
| * Construct a test suite. |
| * |
| * @param pkg TestPakcage as the reference to the parent package. |
| * @param suiteName The current suite name, not the full name. |
| * @param fullName The full suite name along the nested suite path. |
| */ |
| public TestSuite(final TestPackage pkg, final String suiteName, final String fullName) { |
| mParentPackage = pkg; |
| mName = suiteName; |
| mFullName = fullName; |
| mTestCases = new ArrayList<TestCase>(); |
| mSubSuites = new ArrayList<TestSuite>(); |
| |
| mTestStop = false; |
| mCurrentTestCase = null; |
| mCurrentSubSuite = null; |
| } |
| |
| /** |
| * Get parent package. |
| * |
| * @return Parent package. |
| */ |
| public TestPackage getParent() { |
| return mParentPackage; |
| } |
| |
| /** |
| * Add a specific test case. |
| * |
| * @param tc The test case to be added. |
| */ |
| public void addTestCase(final TestCase tc) { |
| mTestCases.add(tc); |
| } |
| |
| /** |
| * Add a specific test suite. |
| * |
| * @param suite The test suite to be added. |
| */ |
| public void addSubSuite(final TestSuite suite) { |
| mSubSuites.add(suite); |
| } |
| |
| /** |
| * Get TestCases. |
| * |
| * @return TestCases |
| */ |
| public Collection<TestCase> getTestCases() { |
| return mTestCases; |
| } |
| |
| /** |
| * Get the suite name of this TestSuite. |
| * |
| * @return The suite name of this TestCase. |
| */ |
| public String getName() { |
| return mName; |
| } |
| |
| /** |
| * Get the full suite name of this TestSuite. |
| * |
| * @return The full suite name of this TestCase. |
| */ |
| public String getFullName() { |
| return mFullName; |
| } |
| |
| /** |
| * Get the nested test suites of this test suite. |
| * |
| * @return The nested test suites. |
| */ |
| public Collection<TestSuite> getSubSuites() { |
| return mSubSuites; |
| } |
| |
| /** |
| * Get all of the test suites contained in this test suite. |
| * |
| * @return All of the test suites. |
| */ |
| public Collection<TestSuite> getAllSuites() { |
| Collection<TestSuite> testSuites = new ArrayList<TestSuite>(); |
| testSuites.add(this); |
| for (TestSuite suite : mSubSuites) { |
| testSuites.addAll(suite.getAllSuites()); |
| } |
| return testSuites; |
| } |
| |
| /** |
| * Search test in this test suite. |
| * |
| * @param testName The test name to be searched against. |
| * @return null if not found, or return founded test |
| */ |
| public Test searchTest(final String testName) { |
| Test test = null; |
| for (TestCase testCase : mTestCases) { |
| test = testCase.searchTest(testName); |
| if (test != null) { |
| return test; |
| } |
| } |
| |
| if (mSubSuites.size() != 0) { |
| for (TestSuite subSuite : mSubSuites) { |
| test = subSuite.searchTest(testName); |
| if (test != null) { |
| return test; |
| } |
| } |
| } |
| |
| return null; |
| } |
| |
| /** |
| * Get the excluded list according to the execution status of each test. |
| * |
| * @param resultType The result type to filter the tests. |
| * @return All excluded list. |
| */ |
| public ArrayList<String> getExcludedList(final String resultType) { |
| ArrayList<String> excludedList = new ArrayList<String>(); |
| ArrayList<String> fullNameList = new ArrayList<String>(); |
| for (TestSuite suite : mSubSuites) { |
| fullNameList.add(suite.getFullName()); |
| ArrayList<String> list = suite.getExcludedList(resultType); |
| if ((list != null) && (list.size() > 0)) { |
| excludedList.addAll(list); |
| } |
| } |
| |
| for (TestCase tc : mTestCases) { |
| fullNameList.add(tc.getFullName()); |
| ArrayList<String> list = tc.getExcludedList(resultType); |
| if ((list != null) && (list.size() > 0)) { |
| excludedList.addAll(list); |
| } |
| } |
| |
| int count = 0; |
| for (String fullName : fullNameList) { |
| if (excludedList.contains(fullName)) { |
| count ++; |
| } |
| } |
| if (count == fullNameList.size()) { |
| //the whole suite is excluded, just need to add the full suite name |
| excludedList.removeAll(excludedList); |
| excludedList.add(getFullName()); |
| } |
| return excludedList; |
| } |
| |
| /** |
| * Get all tests of this test suite. |
| * |
| * @return The tests of this suite. |
| */ |
| public Collection<Test> getTests() { |
| ArrayList<Test> tests = new ArrayList<Test>(); |
| for (TestSuite subSuite : mSubSuites) { |
| tests.addAll(subSuite.getTests()); |
| } |
| |
| for (TestCase testCase : mTestCases) { |
| tests.addAll(testCase.getTests()); |
| } |
| |
| return tests; |
| } |
| |
| /** |
| * Get all test cases of this test suite. |
| * |
| * @return The test cases of this suite. |
| */ |
| public Collection<TestCase> getAllTestCases() { |
| ArrayList<TestCase> testCases = new ArrayList<TestCase>(); |
| testCases.addAll(mTestCases); |
| for (TestSuite subSuite : mSubSuites) { |
| testCases.addAll(subSuite.getAllTestCases()); |
| } |
| |
| return testCases; |
| } |
| |
| /** |
| * Get all test case names contained in the suite. |
| * |
| * @return All test case names. |
| */ |
| public ArrayList<String> getAllTestCaseNames() { |
| ArrayList<String> caseNameList = new ArrayList<String>(); |
| for (TestCase testCase : getAllTestCases()) { |
| caseNameList.add(testCase.getFullName()); |
| } |
| return caseNameList; |
| } |
| |
| /** |
| * Set test stopped; |
| * |
| * @param testStopped If true, it's stopped. Else, still running. |
| */ |
| public void setTestStopped(final boolean testStopped) { |
| mTestStop = testStopped; |
| if (mCurrentTestCase != null) { |
| mCurrentTestCase.setTestStopped(mTestStop); |
| } |
| |
| if (mCurrentSubSuite != null) { |
| mCurrentSubSuite.setTestStopped(mTestStop); |
| } |
| } |
| |
| /** |
| * Run the this test suite or the specific java package contained |
| * in the test suite over device given. |
| * |
| * @param device The device to run the test over. |
| * @param javaPkgName The java package name. |
| */ |
| public void run(final TestDevice device, final String javaPkgName) |
| throws IOException, DeviceDisconnectedException, ADBServerNeedRestartException { |
| Iterator<TestSuite> subSuites = getSubSuites().iterator(); |
| Iterator<TestCase> testCases = getTestCases().iterator(); |
| |
| mTestStop = false; |
| mCurrentTestCase = null; |
| mCurrentSubSuite = null; |
| |
| while (subSuites.hasNext() && (!mTestStop)) { |
| mCurrentSubSuite = subSuites.next(); |
| mCurrentSubSuite.run(device, javaPkgName); |
| } |
| |
| while (testCases.hasNext() && (!mTestStop)) { |
| mCurrentTestCase = testCases.next(); |
| String fullName = mFullName + "." + mCurrentTestCase.getName(); |
| if ((javaPkgName == null) || (javaPkgName.length() == 0) |
| || fullName.startsWith(javaPkgName)) { |
| mCurrentTestCase.run(device); |
| } |
| } |
| } |
| |
| /** |
| * Run the specific test contained in the test suite over device given. |
| * |
| * @param device The device to run the test over. |
| * @param test The specific test to be run. |
| */ |
| public void run(final TestDevice device, final Test test) |
| throws DeviceDisconnectedException, ADBServerNeedRestartException { |
| mTestStop = false; |
| mCurrentTestCase = null; |
| mCurrentSubSuite = null; |
| |
| mCurrentTestCase = test.getTestCase(); |
| mCurrentTestCase.run(device, test); |
| } |
| |
| /** {@inheritDoc} */ |
| public void notifyInstallingComplete(final int resultCode) { |
| if (mCurrentTestCase != null) { |
| mCurrentTestCase.notifyInstallingComplete(resultCode); |
| } |
| |
| if (mCurrentSubSuite != null) { |
| mCurrentSubSuite.notifyInstallingComplete(resultCode); |
| } |
| } |
| |
| /** {@inheritDoc} */ |
| public void notifyUninstallingComplete(final int resultCode) { |
| if (mCurrentTestCase != null) { |
| mCurrentTestCase.notifyUninstallingComplete(resultCode); |
| } |
| |
| if (mCurrentSubSuite != null) { |
| mCurrentSubSuite.notifyUninstallingComplete(resultCode); |
| } |
| } |
| |
| /** {@inheritDoc} */ |
| public void notifyInstallingTimeout(final TestDevice testDevice) { |
| if (mCurrentTestCase != null) { |
| mCurrentTestCase.notifyInstallingTimeout(testDevice); |
| } |
| |
| if (mCurrentSubSuite != null) { |
| mCurrentSubSuite.notifyInstallingTimeout(testDevice); |
| } |
| } |
| |
| /** {@inheritDoc} */ |
| public void notifyUninstallingTimeout(final TestDevice testDevice) { |
| if (mCurrentTestCase != null) { |
| mCurrentTestCase.notifyUninstallingTimeout(testDevice); |
| } |
| |
| if (mCurrentSubSuite != null) { |
| mCurrentSubSuite.notifyUninstallingTimeout(testDevice); |
| } |
| } |
| |
| /** {@inheritDoc} */ |
| public void notifyTestingDeviceDisconnected() { |
| if (mCurrentTestCase != null) { |
| mCurrentTestCase.notifyTestingDeviceDisconnected(); |
| } |
| |
| if (mCurrentSubSuite != null) { |
| mCurrentSubSuite.notifyTestingDeviceDisconnected(); |
| } |
| } |
| } |