OSDN Git Service

original
[gb-231r1-is01/GB_2.3_IS01.git] / cts / tools / host / test / com / android / cts / TestSessionBuilderTests.java
diff --git a/cts/tools/host/test/com/android/cts/TestSessionBuilderTests.java b/cts/tools/host/test/com/android/cts/TestSessionBuilderTests.java
new file mode 100644 (file)
index 0000000..d0f5230
--- /dev/null
@@ -0,0 +1,1445 @@
+/*
+ * 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.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactoryConfigurationError;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.xml.sax.SAXException;
+
+import android.annotation.cts.Profile;
+
+import com.android.cts.TestDevice.DeviceParameterCollector;
+
+/**
+ * Test the session builder.
+ */
+public class TestSessionBuilderTests extends CtsTestBase {
+    private static final String mTmpPlanFileName = "plan";
+
+    private static final String ATTRIBUTE_DEVICE_ID = "deviceID";
+    private static final String ATTRIBUTE_BUILD_ID = "buildID";
+    private static final String ATTRIBUTE_BUILD_VERSION = "buildVersion";
+    private static final String ATTRIBUTE_BUILD_NAME = "buildName";
+
+    private String mTestPackageBinaryName = "CtsTestPackage";
+
+    /** {@inheritDoc} */
+    @Override
+    public void tearDown() {
+        HostConfig.getInstance().removeTestPacakges();
+        deleteTestPackage(mTestPackageBinaryName);
+
+        super.tearDown();
+    }
+
+    /**
+     * Test building simple test session.
+     */
+    public void testBuildSimpleSession() throws IOException,
+            ParserConfigurationException, SAXException, TestPlanNotFoundException,
+            TestNotFoundException, NoSuchAlgorithmException {
+        final String appPackageName = "com.google.android.cts" + ".CtsTest";
+        final String suiteName = appPackageName;
+        final String caseName = "CtsTestHello";
+        final String runner = "android.test.InstrumentationTestRunner";
+
+        final String serialNum = "serialNum";
+        final String buildID = "buildid";
+        final String buildName = "buildname";
+        final String buildVersion = "buildVersion";
+        final String testPlanConfigStr = "<TestPlan version=\"1.0\">\n"
+                + "\t<Description>Demo test plan</Description>\n"
+                + "\t\t<PlanSettings>\n"
+                + "\t\t\t<RequiredDevice amount=\"" + 1 + "\"" + "/>\n"
+                + "\t\t</PlanSettings>\n"
+                + "\t<Entry uri=\""
+                + appPackageName
+                + "\"/>\n"
+                + "</TestPlan>";
+
+        final String descriptionConfigStr = "<TestPackage name=\""
+                + mTestPackageBinaryName+ "\" "
+                + "appPackageName=\"" + appPackageName
+                + "\" version=\"1.0\" AndroidFramework=\"Android 1.0\""
+                + " runner=\"" + runner + "\">\n"
+                + " <Description>something extracted from java doc</Description>\n"
+                + " <TestSuite name=\"" + suiteName + "\"" + ">\n"
+                + "     <TestCase name=\"" + caseName + "\"" + " priority=\"mandatory\">\n"
+                + "         <Description>" + "something extracted from java doc"
+                + "         </Description>\n"
+                + "         <!-- Test Methods -->\n"
+                + "         <Test name=\"testHello\"" + " type=\"automatic\"" + "/>\n"
+                + "     </TestCase>\n"
+                + " </TestSuite>\n"
+                + "</TestPackage>\n";
+
+        HostConfig.getInstance().removeTestPacakges();
+        String planPath =
+            HostConfig.getInstance().getPlanRepository().getPlanPath(mTmpPlanFileName);
+        createFile(testPlanConfigStr, planPath);
+
+        createTestPackage(descriptionConfigStr, mTestPackageBinaryName);
+        HostConfig.getInstance().loadTestPackages();
+
+        TestSession ts = TestSessionBuilder.getInstance().build(planPath, Profile.ALL);
+        assertEquals(1, ts.getNumOfRequiredDevices());
+
+        TestSessionLog tsl = ts.getSessionLog();
+        assertEquals(1, tsl.getTestPackages().size());
+
+        TestPackage testPackage = tsl.getTestPackages().iterator().next();
+        assertEquals(1, testPackage.getTestSuites().size());
+        assertEquals(mTestPackageBinaryName, testPackage.getAppBinaryName());
+        assertEquals(appPackageName, testPackage.getAppPackageName());
+        assertEquals("1.0", testPackage.getVersion());
+        assertEquals("Android 1.0", testPackage.getAndroidVersion());
+        assertEquals(runner, testPackage.getInstrumentationRunner());
+
+        TestSuite testSuite = testPackage.getTestSuites().iterator().next();
+        assertEquals(1, testSuite.getTestCases().size());
+        assertEquals(suiteName, testSuite.getFullName());
+
+        TestCase testCase = testSuite.getTestCases().iterator().next();
+        assertEquals(caseName, testCase.getName());
+        assertEquals("mandatory", testCase.getPriority());
+
+        Test test = testCase.getTests().iterator().next();
+        assertEquals("automatic", test.getType());
+        assertEquals(CtsTestResult.CODE_NOT_EXECUTED, test.getResult().getResultCode());
+        assertEquals(runner, test.getInstrumentationRunner());
+
+        // test build information
+        DeviceParameterCollector deviceParam = new DeviceParameterCollector();
+        deviceParam.setSerialNumber(serialNum);
+        deviceParam.setBuildId(buildID);
+        deviceParam.setBuildVersion(buildVersion);
+        deviceParam.setProductName(buildName);
+        tsl.setDeviceInfo(deviceParam);
+        Document doc = tsl.createResultDoc();
+
+        Node buildInfoNode = doc.getElementsByTagName("BuildInfo").item(0);
+        assertEquals(serialNum, buildInfoNode.getAttributes().getNamedItem(
+                ATTRIBUTE_DEVICE_ID).getNodeValue().trim());
+        assertEquals(buildID, buildInfoNode.getAttributes().getNamedItem(
+                ATTRIBUTE_BUILD_ID).getNodeValue().trim());
+        assertEquals(buildVersion, buildInfoNode.getAttributes().getNamedItem(
+                ATTRIBUTE_BUILD_VERSION).getNodeValue().trim());
+        assertEquals(buildName, buildInfoNode.getAttributes().getNamedItem(
+                ATTRIBUTE_BUILD_NAME).getNodeValue().trim());
+
+        deleteTestPackage(mTestPackageBinaryName);
+    }
+
+    /**
+     * Test getting and removing entries from plan file.
+     */
+    public void testGetAndRemoveEntriesFromPlanFile() throws UnknownCommandException,
+                    CommandNotFoundException, Exception {
+
+        final String appPackageName = "com.google.android.cts";
+        final String suiteName = appPackageName;
+        final String caseName = "CtsTestHello";
+        final String runner = "android.test.InstrumentationTestRunner";
+
+        final String testPlanConfigStr = "<TestPlan version=\"1.0\">\n"
+                + "\t<Description>Demo test plan</Description>\n"
+                + "\t\t<PlanSettings>\n"
+                + "\t\t\t<RequiredDevice amount=\"" + 1 + "\"" + "/>\n"
+                + "\t\t</PlanSettings>\n"
+                + "\t<Entry uri=\""
+                + appPackageName
+                + "\"/>\n"
+                + "</TestPlan>";
+
+        final String descriptionConfigStr = "<TestPackage name=\""
+                + mTestPackageBinaryName+ "\" "
+                + "appPackageName=\"" + appPackageName
+                + "\" version=\"1.0\" AndroidFramework=\"Android 1.0\""
+                + " runner=\"" + runner + "\">\n"
+                + " <Description>something extracted from java doc</Description>\n"
+                + " <TestSuite name=\"" + suiteName + "\"" + ">\n"
+                + "     <TestCase name=\"" + caseName + "\"" + " priority=\"mandatory\">\n"
+                + "         <Description>" + "something extracted from java doc"
+                + "         </Description>\n"
+                + "         <!-- Test Methods -->\n"
+                + "         <Test name=\"testHello\"" + " type=\"automatic\"" + "/>\n"
+                + "     </TestCase>\n"
+                + " </TestSuite>\n"
+                + "</TestPackage>\n";
+
+        HostConfig.getInstance().removeTestPacakges();
+        createTestPackage(descriptionConfigStr, mTestPackageBinaryName);
+        HostConfig.getInstance().loadTestPackages();
+
+        String planPath = HostConfig.getInstance().getPlanRepository()
+                .getPlanPath(mTmpPlanFileName);
+        createFile(testPlanConfigStr, planPath);
+
+        ArrayList<String> removedPkgList = new ArrayList<String>();
+        Collection<String> entries = TestPlan.getEntries(planPath, removedPkgList);
+        Iterator<String> it = entries.iterator();
+
+        assertEquals(1, entries.size());
+        assertEquals(appPackageName, it.next());
+        ConsoleUi cui = new ConsoleUi(TestHost.getInstance());
+        String cmdLine = CTSCommand.REMOVE + " " + "-p" + " "
+                + appPackageName;
+        cui.processCommand(CommandParser.parse(cmdLine));
+        entries = TestPlan.getEntries(planPath, removedPkgList);
+        assertEquals(1, removedPkgList.size());
+
+        deleteTestPackage(mTestPackageBinaryName);
+    }
+
+    /**
+     * Test validating package name.
+     */
+    public void testValidatePackageName() throws IOException {
+        final String packageName = "com.google.android.testname";
+        String testPackageXmlFilePath =
+            HostConfig.getInstance().getCaseRepository().getXmlPath(packageName);
+        String testpackageAPKFilePath =
+            HostConfig.getInstance().getCaseRepository().getApkPath(packageName);
+
+        HostConfig.getInstance().removeTestPacakges();
+        createTestPackage("", packageName);
+
+        assertEquals(true, TestPlan.isValidPackageName(packageName));
+
+        deleteFile(testPackageXmlFilePath);
+        assertEquals(false, TestPlan.isValidPackageName(packageName));
+
+        deleteFile(testpackageAPKFilePath);
+        assertEquals(false, TestPlan.isValidPackageName(packageName));
+    }
+
+    /**
+     * Test building test session with dependency.
+     */
+    public void testBuildSessionWithDependency() throws IOException,
+            ParserConfigurationException, SAXException, TestPlanNotFoundException,
+            TestNotFoundException, NoSuchAlgorithmException {
+
+        final String targetNameSpace = "i don't want to be the target!";
+        final String appPackageName = "com.google.android.cts";
+        final String suiteName = appPackageName + ".CtsTest";
+        final String caseName = "CtsTestHello";
+        final String runner = "android.test.InstrumentationTestRunner";
+
+        final String testPlanConfigStr = "<TestPlan version=\"1.0\">\n"
+                + "\t<Description>Demo test plan</Description>\n"
+                + "\t\t<PlanSettings>\n"
+                + "\t\t\t<RequiredDevice amount=\"" + 1 + "\"" + "/>\n"
+                + "\t\t</PlanSettings>\n"
+                + "\t<Entry uri=\""
+                + appPackageName
+                + "\"/>\n"
+                + "</TestPlan>";
+
+        final String descriptionConfigStr = "<TestPackage name=\""
+                + mTestPackageBinaryName + "\" "
+                + "appPackageName=\"" + appPackageName
+                + "\" targetNameSpace=\"" + targetNameSpace
+                + "\" version=\"1.0\" AndroidFramework=\"Android 1.0\""
+                + " runner=\"" +runner + "\">\n"
+                + " <Description>something extracted from java doc</Description>\n"
+                + " <TestSuite name=\"" + suiteName + "\"" + ">\n"
+                + "     <TestCase name=\"" + caseName + "\"" + " priority=\"mandatory\">\n"
+                + "         <Description>" + "something extracted from java doc"
+                + "         </Description>\n"
+                + "         <!-- Test Methods -->\n"
+                + "         <Test name=\"testHello\"" + " type=\"automatic\"" + "/>\n"
+                + "     </TestCase>\n"
+                + " </TestSuite>\n"
+                + "</TestPackage>\n";
+
+        HostConfig.getInstance().removeTestPacakges();
+
+        String planPath =
+            HostConfig.getInstance().getPlanRepository().getPlanPath(mTmpPlanFileName);
+        createFile(testPlanConfigStr, planPath);
+
+        createTestPackage(descriptionConfigStr, mTestPackageBinaryName);
+        HostConfig.getInstance().loadTestPackages();
+
+        TestSession ts = TestSessionBuilder.getInstance().build(planPath, Profile.ALL);
+        assertEquals(1, ts.getNumOfRequiredDevices());
+
+        TestSessionLog tsl = ts.getSessionLog();
+        assertEquals(1, tsl.getTestPackages().size());
+
+        TestPackage testPackage = tsl.getTestPackages().iterator().next();
+        assertEquals(1, testPackage.getTestSuites().size());
+        assertEquals(mTestPackageBinaryName, testPackage.getAppBinaryName());
+        assertEquals(targetNameSpace, testPackage.getTargetNameSpace());
+        assertEquals("1.0", testPackage.getVersion());
+        assertEquals("Android 1.0", testPackage.getAndroidVersion());
+        assertEquals(runner, testPackage.getInstrumentationRunner());
+
+        TestSuite testSuite = testPackage.getTestSuites().iterator().next();
+        assertEquals(1, testSuite.getTestCases().size());
+        assertEquals(suiteName, testSuite.getFullName());
+
+        TestCase testCase = testSuite.getTestCases().iterator().next();
+        assertEquals(caseName, testCase.getName());
+        assertEquals("mandatory", testCase.getPriority());
+
+        Test test = testCase.getTests().iterator().next();
+        assertEquals("automatic", test.getType());
+        assertEquals(CtsTestResult.CODE_NOT_EXECUTED, test.getResult().getResultCode());
+        assertEquals(runner, test.getInstrumentationRunner());
+
+        deleteTestPackage(mTestPackageBinaryName);
+    }
+
+    /**
+     * Test building test session from embedded suites.
+     */
+    public void testBuildSessionFromEmbeddedSuites() throws IOException,
+            ParserConfigurationException, SAXException, TestPlanNotFoundException,
+            TestNotFoundException, NoSuchAlgorithmException {
+
+        final String appPackageName = "com.google.android.cts";
+        final String caseName = "CtsTestHello";
+        final String testName = "testHello";
+
+        final String testPlanConfigStr = "<TestPlan version=\"1.0\">\n"
+                + "<Description>Demo test plan</Description>\n"
+                + "<PlanSettings>\n"
+                + "    <RequiredDevice amount=\"" + 1 + "\"" + "/>\n"
+                + "</PlanSettings>\n"
+                + "<Entry uri=\"" + appPackageName + "\"/>\n"
+                + "</TestPlan>";
+
+        final String descriptionConfigStr = "<TestPackage name=\"" + mTestPackageBinaryName + "\""
+                + " appPackageName=\"" + appPackageName + "\""
+                + " version=\"1.0\" AndroidFramework=\"Android 1.0\""
+                + " runner=\"android.test.InstrumentationTestRunner\" >\n"
+                + "  <Description>something extracted from java doc</Description>\n"
+                + "  <TestSuite name=\"com.google\">\n"
+                + "     <TestCase name=\"CtsTestHello\" priority=\"mandatory\">\n"
+                + "         <Description>" + "something extracted from java doc"
+                + "         </Description>\n"
+                + "         <!-- Test Methods -->\n"
+                + "         <Test name=\"testHello\"" + " type=\"automatic\"" + "/>\n"
+                + "     </TestCase>\n"
+                + "     <TestSuite name=\"TestSuiteName\">\n"
+                + "         <TestCase name=\"TestCaseName\" priority=\"mandatory\">\n"
+                + "             <Description>" + "something extracted from java doc"
+                + "             </Description>\n"
+                + "             <!-- Test Methods -->\n"
+                + "             <Test name=\"testName\"" + " type=\"automatic\"" + "/>\n"
+                + "         </TestCase>\n"
+                + "     </TestSuite>\n"
+                + "  </TestSuite>\n"
+                + "</TestPackage>\n";
+
+        HostConfig.getInstance().removeTestPacakges();
+
+        String planPath =
+            HostConfig.getInstance().getPlanRepository().getPlanPath(mTmpPlanFileName);
+        createFile(testPlanConfigStr, planPath);
+
+        createTestPackage(descriptionConfigStr, mTestPackageBinaryName);
+        HostConfig.getInstance().loadTestPackages();
+
+        TestSession ts = TestSessionBuilder.getInstance().build(planPath, Profile.ALL);
+        assertEquals(1, ts.getNumOfRequiredDevices());
+
+        TestSessionLog tsl = ts.getSessionLog();
+        assertEquals(1, tsl.getTestPackages().size());
+
+        TestPackage testPackage = tsl.getTestPackages().iterator().next();
+        assertEquals(1, testPackage.getTestSuites().size());
+        assertEquals(mTestPackageBinaryName, testPackage.getAppBinaryName());
+        assertEquals("1.0", testPackage.getVersion());
+        assertEquals("Android 1.0", testPackage.getAndroidVersion());
+
+        TestSuite testSuite;
+        testSuite = testPackage.getTestSuites().iterator().next();
+        assertEquals(1, testSuite.getSubSuites().size());
+        assertEquals(1, testSuite.getTestCases().size());
+        assertEquals("com.google", testSuite.getFullName());
+        assertEquals("com.google", testSuite.getName());
+
+        TestCase testCase = testSuite.getTestCases().iterator().next();
+        assertEquals(caseName, testCase.getName());
+        assertEquals("mandatory", testCase.getPriority());
+
+        Test test = testCase.getTests().iterator().next();
+        assertEquals("com.google.CtsTestHello#testHello", test.getFullName());
+        assertEquals("automatic", test.getType());
+        assertEquals(testName, test.getName());
+        assertEquals(CtsTestResult.CODE_NOT_EXECUTED, test.getResult().getResultCode());
+
+        testSuite = testSuite.getSubSuites().iterator().next();
+        assertEquals(0, testSuite.getSubSuites().size());
+        assertEquals(1, testSuite.getTestCases().size());
+        assertEquals("com.google.TestSuiteName", testSuite.getFullName());
+        assertEquals("TestSuiteName", testSuite.getName());
+
+        testCase = testSuite.getTestCases().iterator().next();
+        assertEquals("TestCaseName", testCase.getName());
+        assertEquals("mandatory", testCase.getPriority());
+
+        test = testCase.getTests().iterator().next();
+        assertEquals("com.google.TestSuiteName.TestCaseName#testName", test.getFullName());
+        assertEquals("automatic", test.getType());
+        assertEquals("testName", test.getName());
+        assertEquals(CtsTestResult.CODE_NOT_EXECUTED, test.getResult().getResultCode());
+
+        deleteTestPackage(mTestPackageBinaryName);
+    }
+
+    /**
+     * Test loading plan with excluded list from the xml file.
+     */
+    public void testExcludingFromXmlFile() throws IOException,
+                ParserConfigurationException,
+                SAXException,
+                TestPlanNotFoundException,
+                TestNotFoundException, NoSuchAlgorithmException {
+
+        final String appPackageName = "com.google.android.cts";
+        final String caseName = "CtsTestHello";
+        final String testName = "testHello";
+        final String excludedList = "com.google.TestSuiteName";
+
+        final String testPlanConfigStr = "<TestPlan version=\"1.0\">\n"
+                + "<Description>Demo test plan</Description>\n"
+                + "<PlanSettings>\n"
+                + "    <RequiredDevice amount=\"" + 1 + "\"" + "/>\n"
+                + "</PlanSettings>\n"
+                + "     <Entry uri=\"" + appPackageName
+                + "\" " + "exclude=\"" + excludedList + "\"/>\n"
+                + "</TestPlan>";
+
+        final String descriptionConfigStr = "<TestPackage name=\"" + mTestPackageBinaryName + "\""
+                + " appPackageName=\"" + appPackageName + "\""
+                + " version=\"1.0\" AndroidFramework=\"Android 1.0\""
+                + " runner=\"android.test.InstrumentationTestRunner\" >\n"
+                + "  <Description>something extracted from java doc</Description>\n"
+                + "  <TestSuite name=\"com.google\">\n"
+                + "     <TestCase name=\"CtsTestHello\" priority=\"mandatory\">\n"
+                + "         <Description>" + "something extracted from java doc"
+                + "         </Description>\n"
+                + "         <!-- Test Methods -->\n"
+                + "         <Test name=\"testHello\"" + " type=\"automatic\"" + "/>\n"
+                + "         <Test name=\"testHello2\"" + " type=\"automatic\"" + "/>\n"
+                + "     </TestCase>\n"
+                + "     <TestSuite name=\"TestSuiteName\">\n"
+                + "         <TestCase name=\"TestCaseName\" priority=\"mandatory\">\n"
+                + "             <Description>" + "something extracted from java doc"
+                + "             </Description>\n"
+                + "             <!-- Test Methods -->\n"
+                + "             <Test name=\"testName1\"" + " type=\"automatic\"" + "/>\n"
+                + "             <Test name=\"testName2\"" + " type=\"automatic\"" + "/>\n"
+                + "         </TestCase>\n"
+                + "     </TestSuite>\n"
+                + "  </TestSuite>\n"
+                + "</TestPackage>\n";
+
+        HostConfig.getInstance().removeTestPacakges();
+
+        String planPath =
+            HostConfig.getInstance().getPlanRepository().getPlanPath(mTmpPlanFileName);
+        createFile(testPlanConfigStr, planPath);
+
+        createTestPackage(descriptionConfigStr, mTestPackageBinaryName);
+        HostConfig.getInstance().loadTestPackages();
+
+        TestSession ts = TestSessionBuilder.getInstance().build(planPath, Profile.ALL);
+        assertEquals(1, ts.getNumOfRequiredDevices());
+
+        TestSessionLog tsl = ts.getSessionLog();
+        assertEquals(1, tsl.getTestPackages().size());
+
+        TestPackage testPackage = tsl.getTestPackages().iterator().next();
+        assertEquals(1, testPackage.getTestSuites().size());
+        assertEquals(mTestPackageBinaryName, testPackage.getAppBinaryName());
+        assertEquals("1.0", testPackage.getVersion());
+        assertEquals("Android 1.0", testPackage.getAndroidVersion());
+
+        TestSuite testSuite;
+        testSuite = testPackage.getTestSuites().iterator().next();
+        assertEquals(0, testSuite.getSubSuites().size());
+        assertEquals(1, testSuite.getTestCases().size());
+        assertEquals("com.google", testSuite.getFullName());
+
+        TestCase testCase = testSuite.getTestCases().iterator().next();
+        assertEquals(caseName, testCase.getName());
+        assertEquals("mandatory", testCase.getPriority());
+
+        Test test = testCase.getTests().iterator().next();
+        assertEquals("com.google.CtsTestHello#testHello", test.getFullName());
+        assertEquals("automatic", test.getType());
+        assertEquals(testName, test.getName());
+        assertEquals(CtsTestResult.CODE_NOT_EXECUTED, test.getResult().getResultCode());
+
+        deleteTestPackage(mTestPackageBinaryName);
+    }
+
+    /**
+     * Test building and loading plan with excluding list of embedded suite.
+     */
+    public void testExcludingEmbeddedSuite() throws IOException,
+            ParserConfigurationException, SAXException, TestPlanNotFoundException,
+            TestNotFoundException,
+            TransformerFactoryConfigurationError, TransformerException, NoSuchAlgorithmException {
+
+        final String appPackageName = "com.google.android.cts";
+        final String caseName = "CtsTestHello";
+        final String testName = "testHello";
+        final String excludedList = "com.google.TestSuiteName";
+
+        final String descriptionConfigStr = "<TestPackage name=\"" + mTestPackageBinaryName + "\""
+                + " appPackageName=\"" + appPackageName + "\""
+                + " version=\"1.0\" AndroidFramework=\"Android 1.0\""
+                + " runner=\"android.test.InstrumentationTestRunner\" >\n"
+                + "  <Description>something extracted from java doc</Description>\n"
+                + "  <TestSuite name=\"com.google\">\n"
+                + "     <TestCase name=\"CtsTestHello\" priority=\"mandatory\">\n"
+                + "         <Description>" + "something extracted from java doc"
+                + "         </Description>\n"
+                + "         <!-- Test Methods -->\n"
+                + "         <Test name=\"testHello\"" + " type=\"automatic\"" + "/>\n"
+                + "         <Test name=\"testHello2\"" + " type=\"automatic\"" + "/>\n"
+                + "     </TestCase>\n"
+                + "     <TestSuite name=\"TestSuiteName\">\n"
+                + "         <TestCase name=\"TestCaseName\" priority=\"mandatory\">\n"
+                + "             <Description>" + "something extracted from java doc"
+                + "             </Description>\n"
+                + "             <!-- Test Methods -->\n"
+                + "             <Test name=\"testName1\"" + " type=\"automatic\"" + "/>\n"
+                + "             <Test name=\"testName2\"" + " type=\"automatic\"" + "/>\n"
+                + "         </TestCase>\n"
+                + "     </TestSuite>\n"
+                + "  </TestSuite>\n"
+                + "</TestPackage>\n";
+
+        HostConfig.getInstance().removeTestPacakges();
+        createTestPackage(descriptionConfigStr, mTestPackageBinaryName);
+        HostConfig.getInstance().loadTestPackages();
+
+        ArrayList<String> packageNames = new ArrayList<String>();
+        packageNames.add(appPackageName);
+
+        HashMap<String, ArrayList<String>> results = new HashMap<String, ArrayList<String>>();
+        ArrayList<String> list = new ArrayList<String>();
+        list.add(excludedList);
+        results.put(appPackageName, list);
+        String planName = "plan_test_excluding";
+        String planPath = HostConfig.getInstance().getPlanRepository().getPlanPath(planName);
+        TestSessionBuilder.getInstance().serialize(planName, packageNames, results);
+
+        TestSession ts = TestSessionBuilder.getInstance().build(planPath, Profile.ALL);
+        assertEquals(1, ts.getNumOfRequiredDevices());
+
+        TestSessionLog tsl = ts.getSessionLog();
+        assertEquals(1, tsl.getTestPackages().size());
+
+        TestPackage testPackage = tsl.getTestPackages().iterator().next();
+        assertEquals(1, testPackage.getTestSuites().size());
+        assertEquals(mTestPackageBinaryName, testPackage.getAppBinaryName());
+        assertEquals("1.0", testPackage.getVersion());
+        assertEquals("Android 1.0", testPackage.getAndroidVersion());
+
+        TestSuite testSuite;
+        testSuite = testPackage.getTestSuites().iterator().next();
+        assertEquals(0, testSuite.getSubSuites().size());
+        assertEquals(1, testSuite.getTestCases().size());
+        assertEquals("com.google", testSuite.getFullName());
+
+        TestCase testCase = testSuite.getTestCases().iterator().next();
+        assertEquals(caseName, testCase.getName());
+        assertEquals("mandatory", testCase.getPriority());
+
+        Test test = testCase.getTests().iterator().next();
+        assertEquals("com.google.CtsTestHello#testHello", test.getFullName());
+        assertEquals("automatic", test.getType());
+        assertEquals(testName, test.getName());
+        assertEquals(CtsTestResult.CODE_NOT_EXECUTED, test.getResult().getResultCode());
+
+        deleteTestPackage(mTestPackageBinaryName);
+    }
+
+    /**
+     * Test building and loading plan with excluding list of the top suite.
+     */
+    public void testExcludingTopSuite() throws IOException,
+            ParserConfigurationException, SAXException, TestPlanNotFoundException,
+            TestNotFoundException,
+            TransformerFactoryConfigurationError, TransformerException, NoSuchAlgorithmException {
+
+        final String appPackageName = "com.google.android.cts";
+        final String excludedList = "com.google";
+
+        final String descriptionConfigStr = "<TestPackage name=\"" + mTestPackageBinaryName + "\""
+                + " appPackageName=\"" + appPackageName + "\""
+                + " version=\"1.0\" AndroidFramework=\"Android 1.0\""
+                + " runner=\"android.test.InstrumentationTestRunner\" >\n"
+                + "  <Description>something extracted from java doc</Description>\n"
+                + "  <TestSuite name=\"com.google\">\n"
+                + "     <TestCase name=\"CtsTestHello\" priority=\"mandatory\">\n"
+                + "         <Description>" + "something extracted from java doc"
+                + "         </Description>\n"
+                + "         <!-- Test Methods -->\n"
+                + "         <Test name=\"testHello\"" + " type=\"automatic\"" + "/>\n"
+                + "         <Test name=\"testHello2\"" + " type=\"automatic\"" + "/>\n"
+                + "     </TestCase>\n"
+                + "     <TestSuite name=\"TestSuiteName\">\n"
+                + "         <TestCase name=\"TestCaseName\" priority=\"mandatory\">\n"
+                + "             <Description>" + "something extracted from java doc"
+                + "             </Description>\n"
+                + "             <!-- Test Methods -->\n"
+                + "             <Test name=\"testName1\"" + " type=\"automatic\"" + "/>\n"
+                + "             <Test name=\"testName2\"" + " type=\"automatic\"" + "/>\n"
+                + "         </TestCase>\n"
+                + "     </TestSuite>\n"
+                + "  </TestSuite>\n"
+                + "</TestPackage>\n";
+
+        HostConfig.getInstance().removeTestPacakges();
+        createTestPackage(descriptionConfigStr, mTestPackageBinaryName);
+        HostConfig.getInstance().loadTestPackages();
+
+        ArrayList<String> packageNames = new ArrayList<String>();
+        packageNames.add(appPackageName);
+
+        HashMap<String, ArrayList<String>> results = new HashMap<String, ArrayList<String>>();
+        ArrayList<String> list = new ArrayList<String>();
+        list.add(excludedList);
+        results.put(appPackageName, list);
+        String planName = "plan_test_excluding";
+        String planPath = HostConfig.getInstance().getPlanRepository().getPlanPath(planName);
+        TestSessionBuilder.getInstance().serialize(planName, packageNames, results);
+
+        TestSession ts = TestSessionBuilder.getInstance().build(planPath, Profile.ALL);
+        assertEquals(1, ts.getNumOfRequiredDevices());
+
+        TestSessionLog tsl = ts.getSessionLog();
+        assertEquals(1, tsl.getTestPackages().size());
+
+        TestPackage testPackage = tsl.getTestPackages().iterator().next();
+        assertEquals(0, testPackage.getTestSuites().size());
+        assertEquals(mTestPackageBinaryName, testPackage.getAppBinaryName());
+        assertEquals("1.0", testPackage.getVersion());
+        assertEquals("Android 1.0", testPackage.getAndroidVersion());
+
+        deleteTestPackage(mTestPackageBinaryName);
+    }
+
+    /**
+     * Test building and loading plan with excluded list of test case.
+     */
+    public void testExcludingTestCase() throws IOException,
+            ParserConfigurationException, SAXException, TestPlanNotFoundException,
+            TestNotFoundException,
+            TransformerFactoryConfigurationError, TransformerException, NoSuchAlgorithmException {
+
+        final String appPackageName = "com.google.android.cts";
+        final String caseName = "CtsTestHello";
+        final String testName = "testHello";
+        final String excludedList = "com.google.TestCaseName";
+
+        final String descriptionConfigStr = "<TestPackage name=\"" + mTestPackageBinaryName + "\""
+                + " appPackageName=\"" + appPackageName + "\""
+                + " version=\"1.0\" AndroidFramework=\"Android 1.0\""
+                + " runner=\"android.test.InstrumentationTestRunner\" >\n"
+                + "  <Description>something extracted from java doc</Description>\n"
+                + "  <TestSuite name=\"com.google\">\n"
+                + "     <TestCase name=\"CtsTestHello\" priority=\"mandatory\">\n"
+                + "         <Description>" + "something extracted from java doc"
+                + "         </Description>\n"
+                + "         <!-- Test Methods -->\n"
+                + "         <Test name=\"testHello\"" + " type=\"automatic\"" + "/>\n"
+                + "         <Test name=\"testHello2\"" + " type=\"automatic\"" + "/>\n"
+                + "     </TestCase>\n"
+                + "     <TestCase name=\"TestCaseName\" priority=\"mandatory\">\n"
+                + "         <Description>" + "something extracted from java doc"
+                + "         </Description>\n"
+                + "         <!-- Test Methods -->\n"
+                + "         <Test name=\"testName1\"" + " type=\"automatic\"" + "/>\n"
+                + "         <Test name=\"testName2\"" + " type=\"automatic\"" + "/>\n"
+                + "     </TestCase>\n"
+                + "  </TestSuite>\n"
+                + "</TestPackage>\n";
+
+        HostConfig.getInstance().removeTestPacakges();
+        createTestPackage(descriptionConfigStr, mTestPackageBinaryName);
+        HostConfig.getInstance().loadTestPackages();
+
+        ArrayList<String> packageNames = new ArrayList<String>();
+        packageNames.add(appPackageName);
+
+        HashMap<String, ArrayList<String>> results = new HashMap<String, ArrayList<String>>();
+        ArrayList<String> list = new ArrayList<String>();
+        list.add(excludedList);
+        results.put(appPackageName, list);
+        String planName = "plan_test_excluding";
+        String planPath = HostConfig.getInstance().getPlanRepository().getPlanPath(planName);
+        TestSessionBuilder.getInstance().serialize(planName, packageNames, results);
+
+        TestSession ts = TestSessionBuilder.getInstance().build(planPath, Profile.ALL);
+        assertEquals(1, ts.getNumOfRequiredDevices());
+
+        TestSessionLog tsl = ts.getSessionLog();
+        assertEquals(1, tsl.getTestPackages().size());
+
+        TestPackage testPackage = tsl.getTestPackages().iterator().next();
+        assertEquals(1, testPackage.getTestSuites().size());
+        assertEquals(mTestPackageBinaryName, testPackage.getAppBinaryName());
+        assertEquals("1.0", testPackage.getVersion());
+        assertEquals("Android 1.0", testPackage.getAndroidVersion());
+
+        TestSuite testSuite;
+        testSuite = testPackage.getTestSuites().iterator().next();
+        assertEquals(1, testSuite.getTestCases().size());
+        assertEquals("com.google", testSuite.getFullName());
+
+        assertEquals(1, testSuite.getTestCases().size());
+
+        TestCase testCase = testSuite.getTestCases().iterator().next();
+        assertEquals(caseName, testCase.getName());
+        assertEquals("mandatory", testCase.getPriority());
+
+        Test test = testCase.getTests().iterator().next();
+        assertEquals("com.google.CtsTestHello#testHello", test.getFullName());
+        assertEquals("automatic", test.getType());
+        assertEquals(testName, test.getName());
+        assertEquals(CtsTestResult.CODE_NOT_EXECUTED, test.getResult().getResultCode());
+
+        deleteTestPackage(mTestPackageBinaryName);
+    }
+
+    /**
+     * Test building and loading plan with excluded list of all of the test cases.
+     */
+    public void testExcludingAllTestCases() throws IOException,
+            ParserConfigurationException, SAXException, TestPlanNotFoundException,
+            TestNotFoundException,
+            TransformerFactoryConfigurationError, TransformerException, NoSuchAlgorithmException {
+
+        final String appPackageName = "com.google.android.cts";
+        final String excludedList = "com.google.TestCaseName;com.google.CtsTestHello";
+
+        final String descriptionConfigStr = "<TestPackage name=\"" + mTestPackageBinaryName + "\""
+                + " appPackageName=\"" + appPackageName + "\""
+                + " version=\"1.0\" AndroidFramework=\"Android 1.0\""
+                + " runner=\"android.test.InstrumentationTestRunner\" >\n"
+                + "  <Description>something extracted from java doc</Description>\n"
+                + "  <TestSuite name=\"com.google\">\n"
+                + "     <TestCase name=\"CtsTestHello\" priority=\"mandatory\">\n"
+                + "         <Description>" + "something extracted from java doc"
+                + "         </Description>\n"
+                + "         <!-- Test Methods -->\n"
+                + "         <Test name=\"testHello\"" + " type=\"automatic\"" + "/>\n"
+                + "         <Test name=\"testHello2\"" + " type=\"automatic\"" + "/>\n"
+                + "     </TestCase>\n"
+                + "     <TestCase name=\"TestCaseName\" priority=\"mandatory\">\n"
+                + "         <Description>" + "something extracted from java doc"
+                + "         </Description>\n"
+                + "         <!-- Test Methods -->\n"
+                + "         <Test name=\"testName1\"" + " type=\"automatic\"" + "/>\n"
+                + "         <Test name=\"testName2\"" + " type=\"automatic\"" + "/>\n"
+                + "     </TestCase>\n"
+                + "  </TestSuite>\n"
+                + "</TestPackage>\n";
+
+        HostConfig.getInstance().removeTestPacakges();
+        createTestPackage(descriptionConfigStr, mTestPackageBinaryName);
+        HostConfig.getInstance().loadTestPackages();
+
+        ArrayList<String> packageNames = new ArrayList<String>();
+        packageNames.add(appPackageName);
+
+        HashMap<String, ArrayList<String>> results = new HashMap<String, ArrayList<String>>();
+        ArrayList<String> list = new ArrayList<String>();
+        list.add(excludedList);
+        results.put(appPackageName, list);
+        String planName = "plan_test_excluding";
+        String planPath = HostConfig.getInstance().getPlanRepository().getPlanPath(planName);
+        TestSessionBuilder.getInstance().serialize(planName, packageNames, results);
+
+        TestSession ts = TestSessionBuilder.getInstance().build(planPath, Profile.ALL);
+        assertEquals(1, ts.getNumOfRequiredDevices());
+
+        TestSessionLog tsl = ts.getSessionLog();
+        assertEquals(1, tsl.getTestPackages().size());
+
+        TestPackage testPackage = tsl.getTestPackages().iterator().next();
+        assertEquals(0, testPackage.getTestSuites().size());
+        assertEquals(mTestPackageBinaryName, testPackage.getAppBinaryName());
+        assertEquals("1.0", testPackage.getVersion());
+        assertEquals("Android 1.0", testPackage.getAndroidVersion());
+
+        assertEquals(0, testPackage.getTestSuites().size());
+
+        deleteTestPackage(mTestPackageBinaryName);
+    }
+
+    /**
+     * Test building and loading plan with excluded list of test.
+     */
+    public void testExcludingTest() throws IOException,
+            ParserConfigurationException, SAXException, TestPlanNotFoundException,
+            TestNotFoundException,
+            TransformerFactoryConfigurationError, TransformerException, NoSuchAlgorithmException {
+
+        final String appPackageName = "com.google.android.cts";
+        final String caseName = "CtsTestHello";
+        final String testName = "testHello";
+        final String excludedList = "com.google.CtsTestHello#testHello2";
+
+        final String descriptionConfigStr = "<TestPackage name=\"" + mTestPackageBinaryName + "\""
+                + " appPackageName=\"" + appPackageName + "\""
+                + " version=\"1.0\" AndroidFramework=\"Android 1.0\""
+                + " runner=\"android.test.InstrumentationTestRunner\" >\n"
+                + "  <Description>something extracted from java doc</Description>\n"
+                + "  <TestSuite name=\"com.google\">\n"
+                + "     <TestCase name=\"CtsTestHello\" priority=\"mandatory\">\n"
+                + "         <Description>" + "something extracted from java doc"
+                + "         </Description>\n"
+                + "         <!-- Test Methods -->\n"
+                + "         <Test name=\"testHello\"" + " type=\"automatic\"" + "/>\n"
+                + "         <Test name=\"testHello2\"" + " type=\"automatic\"" + "/>\n"
+                + "     </TestCase>\n"
+                + "  </TestSuite>\n"
+                + "</TestPackage>\n";
+
+        HostConfig.getInstance().removeTestPacakges();
+        createTestPackage(descriptionConfigStr, mTestPackageBinaryName);
+        HostConfig.getInstance().loadTestPackages();
+
+        ArrayList<String> packageNames = new ArrayList<String>();
+        packageNames.add(appPackageName);
+
+        HashMap<String, ArrayList<String>> results = new HashMap<String, ArrayList<String>>();
+        ArrayList<String> list = new ArrayList<String>();
+        list.add(excludedList);
+        results.put(appPackageName, list);
+        String planName = "plan_test_excluding";
+        String planPath = HostConfig.getInstance().getPlanRepository().getPlanPath(planName);
+        TestSessionBuilder.getInstance().serialize(planName, packageNames, results);
+
+        TestSession ts = TestSessionBuilder.getInstance().build(planPath, Profile.ALL);
+        assertEquals(1, ts.getNumOfRequiredDevices());
+
+        TestSessionLog tsl = ts.getSessionLog();
+        assertEquals(1, tsl.getTestPackages().size());
+
+        TestPackage testPackage = tsl.getTestPackages().iterator().next();
+        assertEquals(1, testPackage.getTestSuites().size());
+        assertEquals(mTestPackageBinaryName, testPackage.getAppBinaryName());
+        assertEquals("1.0", testPackage.getVersion());
+        assertEquals("Android 1.0", testPackage.getAndroidVersion());
+
+        TestSuite testSuite;
+        testSuite = testPackage.getTestSuites().iterator().next();
+        assertEquals(1, testSuite.getTestCases().size());
+        assertEquals("com.google", testSuite.getFullName());
+
+        assertEquals(1, testSuite.getTestCases().size());
+
+        TestCase testCase = testSuite.getTestCases().iterator().next();
+        assertEquals(caseName, testCase.getName());
+        assertEquals("mandatory", testCase.getPriority());
+
+        Test test = testCase.getTests().iterator().next();
+        assertEquals("com.google.CtsTestHello#testHello", test.getFullName());
+        assertEquals("automatic", test.getType());
+        assertEquals(testName, test.getName());
+        assertEquals(CtsTestResult.CODE_NOT_EXECUTED, test.getResult().getResultCode());
+
+        deleteTestPackage(mTestPackageBinaryName);
+    }
+
+    /**
+     * Test building and loading plan with excluded list of all of the tests.
+     */
+    public void testExcludingAllTests() throws IOException,
+            ParserConfigurationException, SAXException, TestPlanNotFoundException,
+            TestNotFoundException,
+            TransformerFactoryConfigurationError, TransformerException, NoSuchAlgorithmException {
+
+        final String appPackageName = "com.google.android.cts";
+        final String excludedList =
+            "com.google.CtsTestHello#testHello;com.google.CtsTestHello#testHello2;";
+
+        final String descriptionConfigStr = "<TestPackage name=\"" + mTestPackageBinaryName + "\""
+                + " appPackageName=\"" + appPackageName + "\""
+                + " version=\"1.0\" AndroidFramework=\"Android 1.0\""
+                + " runner=\"android.test.InstrumentationTestRunner\" >\n"
+                + "  <Description>something extracted from java doc</Description>\n"
+                + "  <TestSuite name=\"com.google\">\n"
+                + "     <TestCase name=\"CtsTestHello\" priority=\"mandatory\">\n"
+                + "         <Description>" + "something extracted from java doc"
+                + "         </Description>\n"
+                + "         <!-- Test Methods -->\n"
+                + "         <Test name=\"testHello\"" + " type=\"automatic\"" + "/>\n"
+                + "         <Test name=\"testHello2\"" + " type=\"automatic\"" + "/>\n"
+                + "     </TestCase>\n"
+                + "  </TestSuite>\n"
+                + "</TestPackage>\n";
+
+        HostConfig.getInstance().removeTestPacakges();
+        createTestPackage(descriptionConfigStr, mTestPackageBinaryName);
+        HostConfig.getInstance().loadTestPackages();
+
+        ArrayList<String> packageNames = new ArrayList<String>();
+        packageNames.add(appPackageName);
+
+        HashMap<String, ArrayList<String>> results = new HashMap<String, ArrayList<String>>();
+        ArrayList<String> list = new ArrayList<String>();
+        list.add(excludedList);
+        results.put(appPackageName, list);
+        String planName = "plan_test_excluding";
+        String planPath = HostConfig.getInstance().getPlanRepository().getPlanPath(planName);
+        TestSessionBuilder.getInstance().serialize(planName, packageNames, results);
+
+        TestSession ts = TestSessionBuilder.getInstance().build(planPath, Profile.ALL);
+        assertEquals(1, ts.getNumOfRequiredDevices());
+
+        TestSessionLog tsl = ts.getSessionLog();
+        assertEquals(1, tsl.getTestPackages().size());
+
+        TestPackage testPackage = tsl.getTestPackages().iterator().next();
+        assertEquals(0, testPackage.getTestSuites().size());
+        assertEquals(mTestPackageBinaryName, testPackage.getAppBinaryName());
+        assertEquals("1.0", testPackage.getVersion());
+        assertEquals("Android 1.0", testPackage.getAndroidVersion());
+
+        deleteTestPackage(mTestPackageBinaryName);
+    }
+
+    /**
+     * Test creating plan with excluded list.
+     */
+    public void testCreatePlanWithExcludedList() throws IOException,
+          ParserConfigurationException, SAXException,
+          TestPlanNotFoundException, TestNotFoundException,
+          TransformerFactoryConfigurationError, TransformerException, NoSuchAlgorithmException{
+
+        final String appPackageName = "com.google.android.cts";
+        final String suiteName1 = appPackageName + "." + "SuiteName1";
+        final String caseName1 = "CtsTestHello";
+        final String testName1 = "testHello";
+
+        final String caseName2 = "CtsTestHello2";
+        final String testName2 = "testHello2";
+        final String testName3 = "testHello3";
+        final String suiteName2 = "com.google.android.cts.CtsTest.SuiteName2";
+
+        final String descriptionConfigStr = "<TestPackage name=\""
+              + mTestPackageBinaryName + "\""
+              + " appPackageName=\"" + appPackageName + "\""
+              + " version=\"1.0\" AndroidFramework=\"Android 1.0\""
+              + " runner=\"android.test.InstrumentationTestRunner\" >\n"
+              + " <Description>something extracted from java doc</Description>\n"
+              + " <TestSuite name=\"" + suiteName1 + "\"" + ">\n"
+              + "     <TestCase name=\"" + caseName1 + "\"" + " category=\"mandatory\">\n"
+              + "         <Description>" + "something extracted from java doc"
+              + "         </Description>\n"
+              + "         <!-- Test Methods -->\n"
+              + "         <Test name=\"" + testName1 + "\" type=\"automatic\"" + "/>\n"
+              + "     </TestCase>\n"
+              + " </TestSuite>\n"
+              + " <TestSuite name=\"" + suiteName2 + "\"" + ">\n"
+              + "     <TestCase name=\"" + caseName2 + "\"" + " priority=\"mandatory\">\n"
+              + "         <Test name=\"" + testName2 +"\" type=\"automatic\" />\n"
+              + "         <Test name=\"" + testName3 +"\" type=\"automatic\" />\n"
+              + "     </TestCase>\n"
+              + " </TestSuite>\n"
+              + "</TestPackage>\n";
+
+        HostConfig.getInstance().removeTestPacakges();
+        createTestPackage(descriptionConfigStr, mTestPackageBinaryName);
+        HostConfig.getInstance().loadTestPackages();
+
+        ArrayList<String> packageNames = new ArrayList<String>();
+        packageNames.add(appPackageName);
+
+        HashMap<String, ArrayList<String>> results = new HashMap<String, ArrayList<String>>();
+        ArrayList<String> list = new ArrayList<String>();
+        String excludedList = suiteName1 + "." + caseName1 + TestPlan.EXCLUDE_SEPARATOR;
+        excludedList += suiteName2 + "." + caseName2 + Test.METHOD_SEPARATOR + testName2;
+        list.add(excludedList);
+        results.put(appPackageName, list);
+
+        String planName = "plan_test_excluding";
+        String planPath = HostConfig.getInstance().getPlanRepository().getPlanPath(planName);
+        TestSessionBuilder.getInstance().serialize(planName, packageNames, results);
+
+        TestSession ts = TestSessionBuilder.getInstance().build(planPath, Profile.ALL);
+        assertEquals(1, ts.getNumOfRequiredDevices());
+
+        TestSessionLog tsl = ts.getSessionLog();
+        assertEquals(1, tsl.getTestPackages().size());
+
+        TestPackage testPackage = tsl.getTestPackages().iterator().next();
+        assertEquals(1, testPackage.getTestSuites().size());
+        assertEquals(mTestPackageBinaryName, testPackage.getAppBinaryName());
+        assertEquals("1.0", testPackage.getVersion());
+        assertEquals("Android 1.0", testPackage.getAndroidVersion());
+
+        TestSuite testSuite;
+        testSuite = testPackage.getTestSuites().iterator().next();
+        assertEquals(1, testSuite.getTestCases().size());
+        assertEquals(suiteName2, testSuite.getFullName());
+
+        assertEquals(1, testSuite.getTestCases().size());
+
+        TestCase testCase = testSuite.getTestCases().iterator().next();
+        assertEquals(caseName2, testCase.getName());
+        assertEquals("mandatory", testCase.getPriority());
+        assertEquals(1, testCase.getTests().size());
+
+        Test test = testCase.getTests().iterator().next();
+        String testName = suiteName2 + "." + caseName2 + Test.METHOD_SEPARATOR + testName3;
+        assertEquals(testName, test.getFullName());
+        assertEquals("automatic", test.getType());
+        assertEquals(CtsTestResult.CODE_NOT_EXECUTED, test.getResult().getResultCode());
+
+        deleteTestPackage(mTestPackageBinaryName);
+    }
+
+    /**
+     * Test creating plan with excluded list of nested suites.
+     */
+    public void testCreatePlanWithExcludedListForNestedSuite() throws IOException,
+          ParserConfigurationException, SAXException,
+          TestPlanNotFoundException, TestNotFoundException,
+          TransformerFactoryConfigurationError, TransformerException, NoSuchAlgorithmException{
+
+        final String appPackageName = "com.google.android.cts";
+        final String fullName = mTestPackageBinaryName + ".CtsTest";
+        final String suiteName1 = fullName + "." + "SuiteName1";
+        final String caseName1 = "CtsTestHello";
+        final String testName1 = "testHello";
+
+        final String caseName2 = "CtsTestHello2";
+        final String testName2 = "testHello2";
+        final String testName3 = "testHello3";
+        final String nestedSuiteName1 = "com.google";
+        final String nestedSuiteName2 = "android.cts.CtsTest.SuiteName2";
+
+        final String descriptionConfigStr = "<TestPackage name=\""
+            + mTestPackageBinaryName + "\""
+            + " appPackageName=\"" + appPackageName + "\""
+            + " version=\"1.0\" AndroidFramework=\"Android 1.0\""
+              + " runner=\"android.test.InstrumentationTestRunner\" >\n"
+              + " <Description>something extracted from java doc</Description>\n"
+              + " <TestSuite name=\"" + suiteName1 + "\"" + ">\n"
+              + "     <TestCase name=\"" + caseName1 + "\"" + " category=\"mandatory\">\n"
+              + "         <Description>" + "something extracted from java doc" + "</Description>\n"
+              + "         <!-- Test Methods -->\n"
+              + "         <Test name=\"" + testName1 + "\" type=\"automatic\"" + "/>\n"
+              + "     </TestCase>\n"
+              + " </TestSuite>\n"
+              + " <TestSuite name=\"" + nestedSuiteName1 + "\"" + ">\n"
+              + "     <TestSuite name=\"" + nestedSuiteName2 + "\"" + ">\n"
+              + "         <TestCase name=\"" + caseName2 + "\"" + " priority=\"mandatory\">\n"
+              + "             <Test name=\"" + testName2 +"\" type=\"automatic\" />\n"
+              + "             <Test name=\"" + testName3 +"\" type=\"automatic\" />\n"
+              + "         </TestCase>\n"
+              + "     </TestSuite>\n"
+              + " </TestSuite>\n"
+              + "</TestPackage>\n";
+
+        HostConfig.getInstance().removeTestPacakges();
+        createTestPackage(descriptionConfigStr, mTestPackageBinaryName);
+        HostConfig.getInstance().loadTestPackages();
+
+        ArrayList<String> packageNames = new ArrayList<String>();
+        packageNames.add(appPackageName);
+
+        HashMap<String, ArrayList<String>> results = new HashMap<String, ArrayList<String>>();
+        ArrayList<String> list = new ArrayList<String>();
+        String excludedList = suiteName1 + "." + caseName1 + TestPlan.EXCLUDE_SEPARATOR;
+        excludedList += nestedSuiteName1 + "." + nestedSuiteName2
+                        + "." + caseName2 + Test.METHOD_SEPARATOR + testName2;
+        list.add(excludedList);
+        results.put(appPackageName, list);
+
+        String planName = "plan_test_excluding";
+        String planPath = HostConfig.getInstance().getPlanRepository().getPlanPath(planName);
+        TestSessionBuilder.getInstance().serialize(planName, packageNames, results);
+
+        TestSession ts = TestSessionBuilder.getInstance().build(planPath, Profile.ALL);
+        assertEquals(1, ts.getNumOfRequiredDevices());
+
+        TestSessionLog tsl = ts.getSessionLog();
+        assertEquals(1, tsl.getTestPackages().size());
+
+        TestPackage testPackage = tsl.getTestPackages().iterator().next();
+        assertEquals(1, testPackage.getTestSuites().size());
+        assertEquals(mTestPackageBinaryName, testPackage.getAppBinaryName());
+        assertEquals("1.0", testPackage.getVersion());
+        assertEquals("Android 1.0", testPackage.getAndroidVersion());
+
+        TestSuite testSuite;
+        testSuite = testPackage.getTestSuites().iterator().next();
+        assertEquals(0, testSuite.getTestCases().size());
+        assertEquals(nestedSuiteName1, testSuite.getFullName());
+
+        assertEquals(1, testSuite.getSubSuites().size());
+        TestSuite testSubSuite = testSuite.getSubSuites().iterator().next();
+        assertEquals(1, testSubSuite.getTestCases().size());
+        String suiteName = nestedSuiteName1 + "." + nestedSuiteName2;
+        assertEquals(suiteName, testSubSuite.getFullName());
+
+        assertEquals(1, testSubSuite.getTestCases().size());
+
+        TestCase testCase = testSubSuite.getTestCases().iterator().next();
+        assertEquals(caseName2, testCase.getName());
+        assertEquals("mandatory", testCase.getPriority());
+        assertEquals(1, testCase.getTests().size());
+
+        Test test = testCase.getTests().iterator().next();
+        String testName = nestedSuiteName1 + "." + nestedSuiteName2 + "." +caseName2
+                          + Test.METHOD_SEPARATOR + testName3;
+        assertEquals(testName, test.getFullName());
+        assertEquals("automatic", test.getType());
+        assertEquals(CtsTestResult.CODE_NOT_EXECUTED, test.getResult().getResultCode());
+
+        deleteTestPackage(mTestPackageBinaryName);
+    }
+
+    /**
+     * Test building plan of protocol type.
+     */
+    public void testBuildProtocolPlan() throws IOException,
+            ParserConfigurationException, SAXException, TestPlanNotFoundException,
+            TestNotFoundException, NoSuchAlgorithmException {
+
+        final String appPackageName = "com.google.android.cts";
+
+        final String testPlanConfigStr = "<TestPlan version=\"1.0\">\n"
+                + "\t<Description>Demo test plan</Description>\n"
+                + "\t\t<PlanSettings>\n"
+                + "\t\t\t<RequiredDevice amount=\"" + 2 + "\"" + "/>\n"
+                + "\t\t</PlanSettings>\n"
+                + "\t<Entry uri=\""
+                + appPackageName
+                + "\"/>\n"
+                + "</TestPlan>";
+
+        final String descriptionConfigStr = "<TestPackage name=\"" + mTestPackageBinaryName +"\" "
+                + " appPackageName=\"" + appPackageName + "\""
+                + " version=\"1.0\" AndroidFramework=\"Android 1.0\""
+                + " runner=\"android.test.InstrumentationTestRunner\" >\n"
+                + " <Description>something extracted from java doc</Description>\n"
+                + " <TestSuite name=\"com.google.android.cts\"" + ">\n"
+                + "     <TestCase name=\"CtsTestHello\"" + " priority=\"mandatory\">\n"
+                + "         <Description>" + "something extracted from java doc"
+                + "         </Description>\n"
+                + "         <Test name=\"testHello\"" + " type=\"automatic\"" + "/>\n"
+                + "     </TestCase>\n"
+                + " </TestSuite>\n"
+                + "</TestPackage>\n";
+
+        HostConfig.getInstance().removeTestPacakges();
+        String planPath = HostConfig.getInstance().getPlanRepository()
+                .getPlanPath(mTmpPlanFileName);
+        createFile(testPlanConfigStr, planPath);
+
+        createTestPackage(descriptionConfigStr, mTestPackageBinaryName);
+        HostConfig.getInstance().loadTestPackages();
+
+        TestSession ts = TestSessionBuilder.getInstance().build(planPath, Profile.ALL);
+        assertEquals(2, ts.getNumOfRequiredDevices());
+
+        TestSessionLog tsl = ts.getSessionLog();
+        assertEquals(1, tsl.getTestPackages().size());
+
+        TestPackage testPackage = tsl.getTestPackages().iterator().next();
+        assertEquals(1, testPackage.getTestSuites().size());
+        assertEquals(mTestPackageBinaryName, testPackage.getAppBinaryName());
+        assertEquals("1.0", testPackage.getVersion());
+        assertEquals("Android 1.0", testPackage.getAndroidVersion());
+
+        TestSuite testSuite = testPackage.getTestSuites().iterator().next();
+        assertEquals(1, testSuite.getTestCases().size());
+        assertEquals("com.google.android.cts", testSuite.getFullName());
+
+        TestCase testCase = testSuite.getTestCases().iterator().next();
+        Test test = testCase.getTests().iterator().next();
+        assertEquals("testHello", test.getName());
+        assertEquals("automatic", test.getType());
+        assertEquals(CtsTestResult.CODE_NOT_EXECUTED, test.getResult().getResultCode());
+
+        deleteTestPackage(mTestPackageBinaryName);
+    }
+
+    /**
+     * Test serializing the test plan.
+     */
+    public void testSerialize() throws Exception {
+        final String srcStr = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n"
+            + "<TestPlan version=\"1.0\">\n"
+            + "<PlanSettings/>\n"
+            + "<Entry uri=\"com.google.android.cts.CtsTest\"/>\n"
+            + "</TestPlan>";
+
+        final String package1 = "com.google.android.cts.CtsTest";
+        ArrayList<String> packageNames = new ArrayList<String>();
+        packageNames.add(package1);
+        HashMap<String, ArrayList<String>> selectedResult =
+                      new HashMap<String, ArrayList<String>>();
+        selectedResult.put(package1, null);
+
+        HostConfig.getInstance().removeTestPacakges();
+        String planName = "plan_test";
+        String planPath = HostConfig.getInstance().getPlanRepository().getPlanPath(planName);
+        TestSessionBuilder.getInstance().serialize(planName, packageNames, selectedResult);
+
+        File file = new File(planPath);
+        assertTrue(file.exists());
+        assertTrue(file.isFile());
+
+        FileReader dstInput = new FileReader(file);
+        BufferedReader dstBufReader = new BufferedReader(dstInput);
+
+        char[] resChars = new char[1024];
+        dstBufReader.read(resChars);
+        assertEquals(srcStr, new String(resChars).trim());
+
+        dstBufReader.close();
+        deleteFile(planPath);
+
+    }
+
+    /**
+     * Test loading plan with sub suites.
+     */
+    public void testLoadPlanWithSubSuite() throws IOException,
+            ParserConfigurationException, SAXException, TestPlanNotFoundException,
+            TestNotFoundException,
+            TransformerFactoryConfigurationError, TransformerException, NoSuchAlgorithmException {
+
+        final String appPackageName = "com.google.android.cts";
+        final String fullName = mTestPackageBinaryName + ".CtsTest";
+        final String caseName = "CtsTestHello";
+        final String testName = "testHello";
+
+        final String descriptionConfigStr = "<TestPackage name=\"" + mTestPackageBinaryName + "\""
+                + " appPackageName=\"" + appPackageName + "\""
+                + " version=\"1.0\" AndroidFramework=\"Android 1.0\""
+                + " runner=\"android.test.InstrumentationTestRunner\" >\n"
+                + "  <Description>something extracted from java doc</Description>\n"
+                + "  <TestSuite name=\"com.google\">\n"
+                + "     <TestCase name=\"CtsTestHello\" priority=\"mandatory\">\n"
+                + "         <Description>" + "something extracted from java doc"
+                + "         </Description>\n"
+                + "         <!-- Test Methods -->\n"
+                + "         <Test name=\"testHello\"" + " type=\"automatic\"" + "/>\n"
+                + "     </TestCase>\n"
+                + "     <TestSuite name=\"TestSuiteName\">\n"
+                + "         <TestCase name=\"TestCaseName\" priority=\"mandatory\">\n"
+                + "             <Description>" + "something extracted from java doc"
+                + "             </Description>\n"
+                + "             <!-- Test Methods -->\n"
+                + "             <Test name=\"testName1\"" + " type=\"automatic\"" + "/>\n"
+                + "         </TestCase>\n"
+                + "     </TestSuite>\n"
+                + "  </TestSuite>\n"
+                + "</TestPackage>\n";
+
+        HostConfig.getInstance().removeTestPacakges();
+        createTestPackage(descriptionConfigStr, mTestPackageBinaryName);
+        HostConfig.getInstance().loadTestPackages();
+
+        ArrayList<String> packageNames = new ArrayList<String>();
+        packageNames.add(appPackageName);
+
+        HashMap<String, ArrayList<String>> results = new HashMap<String, ArrayList<String>>();
+        results.put(appPackageName, null);
+        String planName = "plan_test_excluding";
+        String planPath = HostConfig.getInstance().getPlanRepository().getPlanPath(planName);
+        TestSessionBuilder.getInstance().serialize(planName, packageNames, results);
+
+        TestSession ts = TestSessionBuilder.getInstance().build(planPath, Profile.ALL);
+        assertEquals(1, ts.getNumOfRequiredDevices());
+
+        ts.getSessionLog().setStartTime(System.currentTimeMillis());
+        TestSessionLog tsl = ts.getSessionLog();
+        tsl.createResultDoc();
+        assertEquals(1, tsl.getTestPackages().size());
+
+        TestPackage testPackage = tsl.getTestPackages().iterator().next();
+        assertEquals(1, testPackage.getTestSuites().size());
+        assertEquals(mTestPackageBinaryName, testPackage.getAppBinaryName());
+        assertEquals("1.0", testPackage.getVersion());
+        assertEquals("Android 1.0", testPackage.getAndroidVersion());
+
+        TestSuite testSuite;
+        testSuite = testPackage.getTestSuites().iterator().next();
+        assertEquals(1, testSuite.getSubSuites().size());
+        assertEquals(1, testSuite.getTestCases().size());
+        assertEquals("com.google", testSuite.getFullName());
+
+        TestCase testCase = testSuite.getTestCases().iterator().next();
+        assertEquals(caseName, testCase.getName());
+        assertEquals("mandatory", testCase.getPriority());
+
+        Test test = testCase.getTests().iterator().next();
+        assertEquals("com.google.CtsTestHello#testHello", test.getFullName());
+        assertEquals("automatic", test.getType());
+        assertEquals(testName, test.getName());
+        assertEquals(CtsTestResult.CODE_NOT_EXECUTED, test.getResult().getResultCode());
+
+        TestSuite subTestSuite;
+        subTestSuite = testSuite.getSubSuites().iterator().next();
+        assertEquals(1, subTestSuite.getTestCases().size());
+        assertEquals("com.google.TestSuiteName", subTestSuite.getFullName());
+        assertEquals("TestSuiteName", subTestSuite.getName());
+
+        testCase = subTestSuite.getTestCases().iterator().next();
+        assertEquals("TestCaseName", testCase.getName());
+        assertEquals("mandatory", testCase.getPriority());
+
+        test = testCase.getTests().iterator().next();
+        assertEquals("com.google.TestSuiteName.TestCaseName#testName1", test.getFullName());
+        assertEquals("automatic", test.getType());
+        assertEquals("testName1", test.getName());
+        assertEquals(CtsTestResult.CODE_NOT_EXECUTED, test.getResult().getResultCode());
+
+        deleteTestPackage(mTestPackageBinaryName);
+    }
+
+    /**
+     * Test validating test controller.
+     */
+    public void testValidateTestController() {
+        String jarPath = "test.jar";
+        String packageName = "com.android.tests";
+        String className = "ConsoleTests";
+        String methodName = "testMethod";
+
+        TestController controller = new TestController(null, null, null, null);
+        assertFalse(controller.isValid());
+
+        controller = new TestController(jarPath, null, null, null);
+        assertFalse(controller.isValid());
+
+        controller = new TestController(null, packageName, null, null);
+        assertFalse(controller.isValid());
+
+        controller = new TestController(null, null, className, null);
+        assertFalse(controller.isValid());
+
+        controller = new TestController(null, null, null, methodName);
+        assertFalse(controller.isValid());
+
+        controller = new TestController("", "", "", "");
+        assertFalse(controller.isValid());
+
+        controller = new TestController("", packageName, className, methodName);
+        assertFalse(controller.isValid());
+
+        controller = new TestController(jarPath, "", className, methodName);
+        assertFalse(controller.isValid());
+
+        controller = new TestController(jarPath, packageName, "", methodName);
+        assertFalse(controller.isValid());
+
+        controller = new TestController(jarPath, packageName, className, "");
+        assertFalse(controller.isValid());
+
+        controller = new TestController(jarPath, packageName, className, methodName);
+        assertTrue(controller.isValid());
+    }
+
+    /**
+     * Test loading plan with test controller.
+     */
+    public void testLoadPlanWithTestController() throws IOException,
+            ParserConfigurationException, SAXException,
+            TestPlanNotFoundException, TestNotFoundException,
+            TransformerFactoryConfigurationError,
+            TransformerException, NoSuchAlgorithmException {
+
+        final String appPackageName = "com.google.android.cts";
+        final String jarPath = "test.jar";
+        final String controllerPackageName = "com.android.tests";
+        final String className = "ConsoleTests";
+        final String methodName = "testMethod";
+        final String description = controllerPackageName + "." + className
+                + Test.METHOD_SEPARATOR + methodName;
+
+        final String descriptionConfigStr = "<TestPackage name=\""
+                + mTestPackageBinaryName + "\" "
+                + " appPackageName=\"" + appPackageName + "\""
+                + " version=\"1.0\" AndroidFramework=\"Android 1.0\""
+                + " runner=\"android.test.InstrumentationTestRunner\" jarPath=\"" + jarPath
+                + "\">\n"
+                + "  <Description>something extracted from java doc</Description>\n"
+                + "  <TestSuite name=\"com.google\">\n"
+                + "     <TestCase name=\"TestCaseName\" priority=\"mandatory\">\n"
+                + "         <Description>"
+                + "something extracted from java doc" + "</Description>\n"
+                + "         <!-- Test Methods -->\n"
+                + "         <Test name=\"testName1\""
+                + " type=\"automatic\"" + " HostController=\""
+                + description + "\"" + "/>\n" + "     </TestCase>\n"
+                + "  </TestSuite>\n" + "</TestPackage>\n";
+
+        createTestPackage(descriptionConfigStr, mTestPackageBinaryName);
+        HostConfig.getInstance().loadTestPackages();
+
+        ArrayList<String> packageNames = new ArrayList<String>();
+        packageNames.add(appPackageName);
+
+        HashMap<String, ArrayList<String>> results = new HashMap<String, ArrayList<String>>();
+        results.put(appPackageName, null);
+
+        String planName = "plan_test";
+        String planPath = HostConfig.getInstance().getPlanRepository().getPlanPath(planName);
+        TestSessionBuilder.getInstance().serialize(planName, packageNames, results);
+
+        TestSession ts = TestSessionBuilder.getInstance().build(planPath, Profile.ALL);
+        ts.getSessionLog().setStartTime(System.currentTimeMillis());
+        TestSessionLog tsl = ts.getSessionLog();
+        TestPackage testPackage = tsl.getTestPackages().iterator().next();
+
+        assertEquals(jarPath, testPackage.getJarPath());
+
+        TestSuite testSuite;
+        testSuite = testPackage.getTestSuites().iterator().next();
+        TestCase testCase = testSuite.getTestCases().iterator().next();
+        Test test = testCase.getTests().iterator().next();
+        assertEquals(controllerPackageName, test.getTestController().getPackageName());
+        assertEquals(className, test.getTestController().getClassName());
+        assertEquals(methodName, test.getTestController().getMethodName());
+
+        deleteTestPackage(mTestPackageBinaryName);
+    }
+}