OSDN Git Service

original
[gb-231r1-is01/GB_2.3_IS01.git] / cts / tools / host / src / com / android / cts / TestSuite.java
diff --git a/cts/tools/host/src/com/android/cts/TestSuite.java b/cts/tools/host/src/com/android/cts/TestSuite.java
new file mode 100644 (file)
index 0000000..136fc3f
--- /dev/null
@@ -0,0 +1,365 @@
+/*
+ * 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();
+        }
+    }
+}