Home | History | Annotate | Download | only in testtype
      1 /*
      2  * Copyright (C) 2010 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 package com.android.cts.tradefed.testtype;
     17 
     18 import com.android.cts.tradefed.build.StubCtsBuildHelper;
     19 import com.android.cts.tradefed.result.PlanCreator;
     20 import com.android.ddmlib.testrunner.TestIdentifier;
     21 import com.android.tradefed.device.DeviceNotAvailableException;
     22 import com.android.tradefed.device.ITestDevice;
     23 import com.android.tradefed.result.ITestInvocationListener;
     24 import com.android.tradefed.testtype.IRemoteTest;
     25 import com.android.tradefed.util.xml.AbstractXmlParser.ParseException;
     26 
     27 import junit.framework.TestCase;
     28 
     29 import org.easymock.EasyMock;
     30 
     31 import java.io.ByteArrayInputStream;
     32 import java.io.File;
     33 import java.io.FileNotFoundException;
     34 import java.io.InputStream;
     35 import java.util.ArrayList;
     36 import java.util.Collection;
     37 
     38 /**
     39  * Unit tests for {@link CtsTest}.
     40  */
     41 public class CtsTestTest extends TestCase {
     42 
     43     private static final String PACKAGE_NAME = "test-uri";
     44     /** the test fixture under test, with all external dependencies mocked out */
     45     private CtsTest mCtsTest;
     46     private ITestPackageRepo mMockRepo;
     47     private ITestPlan mMockPlan;
     48     private ITestDevice mMockDevice;
     49     private ITestInvocationListener mMockListener;
     50     private StubCtsBuildHelper mStubBuildHelper;
     51     private ITestPackageDef mMockPackageDef;
     52     private IRemoteTest mMockTest;
     53 
     54     private static final String PLAN_NAME = "CTS";
     55 
     56     /**
     57      * {@inheritDoc}
     58      */
     59     @Override
     60     protected void setUp() throws Exception {
     61         super.setUp();
     62         mMockRepo = EasyMock.createMock(ITestPackageRepo.class);
     63         mMockPlan = EasyMock.createMock(ITestPlan.class);
     64         mMockDevice = EasyMock.createMock(ITestDevice.class);
     65         mMockListener = EasyMock.createNiceMock(ITestInvocationListener.class);
     66         mStubBuildHelper = new StubCtsBuildHelper();
     67         mMockPackageDef = EasyMock.createMock(ITestPackageDef.class);
     68         mMockTest = EasyMock.createMock(IRemoteTest.class);
     69 
     70         mCtsTest = new CtsTest() {
     71             @Override
     72             ITestPackageRepo createTestCaseRepo() {
     73                 return mMockRepo;
     74             }
     75 
     76             @Override
     77             ITestPlan createPlan(String planName) {
     78                 return mMockPlan;
     79             }
     80 
     81             @Override
     82             ITestPlan createPlan(PlanCreator planCreator) {
     83                 return mMockPlan;
     84             }
     85 
     86             @Override
     87             InputStream createXmlStream(File xmlFile) throws FileNotFoundException {
     88                 // return empty stream, not used
     89                 return new ByteArrayInputStream(new byte[0]);
     90             }
     91         };
     92         mCtsTest.setDevice(mMockDevice);
     93         mCtsTest.setBuildHelper(mStubBuildHelper);
     94         // turn off device collection for simplicity
     95         mCtsTest.setSkipDeviceInfo(true);
     96         EasyMock.expect(mMockPackageDef.getTargetApkName()).andStubReturn(null);
     97         EasyMock.expect(mMockPackageDef.getTargetPackageName()).andStubReturn(null);
     98     }
     99 
    100     /**
    101      * Test normal case {@link CtsTest#run(java.util.List)} when running a plan.
    102      */
    103     @SuppressWarnings("unchecked")
    104     public void testRun_plan() throws DeviceNotAvailableException, ParseException {
    105         setParsePlanExceptations();
    106 
    107         setCreateAndRunTestExpectations();
    108 
    109         replayMocks();
    110         mCtsTest.run(mMockListener);
    111         verifyMocks();
    112     }
    113 
    114     /**
    115      * Test normal case {@link CtsTest#run(java.util.List)} when running a package.
    116      */
    117     @SuppressWarnings("unchecked")
    118     public void testRun_package() throws DeviceNotAvailableException {
    119         mCtsTest.addPackageName(PACKAGE_NAME);
    120 
    121         setCreateAndRunTestExpectations();
    122 
    123         replayMocks();
    124         mCtsTest.run(mMockListener);
    125         verifyMocks();
    126     }
    127 
    128     /**
    129      * Test a resumed run
    130      */
    131     @SuppressWarnings("unchecked")
    132     public void testRun_resume() throws DeviceNotAvailableException {
    133         mCtsTest.addPackageName(PACKAGE_NAME);
    134 
    135         setCreateAndRunTestExpectations();
    136         // abort the first run
    137         EasyMock.expectLastCall().andThrow(new DeviceNotAvailableException());
    138 
    139         // now expect test to be resumed
    140         mMockTest.run((ITestInvocationListener)EasyMock.anyObject());
    141         EasyMock.expect(mMockPackageDef.getName()).andReturn(PACKAGE_NAME);
    142         EasyMock.expect(mMockPackageDef.getDigest()).andReturn("digest");
    143 
    144         replayMocks();
    145         try {
    146             mCtsTest.run(mMockListener);
    147             fail("Did not throw DeviceNotAvailableException");
    148         } catch (DeviceNotAvailableException e) {
    149             // expected
    150         }
    151         // now resume, and expect same test's run method to be called again
    152         mCtsTest.run(mMockListener);
    153         verifyMocks();
    154     }
    155 
    156     /**
    157      * Test normal case {@link CtsTest#run(java.util.List)} when running a class.
    158      */
    159     @SuppressWarnings("unchecked")
    160     public void testRun_class() throws DeviceNotAvailableException {
    161         final String className = "className";
    162         final String methodName = "methodName";
    163         mCtsTest.setClassName(className);
    164         mCtsTest.setMethodName(methodName);
    165 
    166         EasyMock.expect(mMockRepo.findPackageForTest(className)).andReturn(PACKAGE_NAME);
    167         mMockPackageDef.setClassName(className, methodName);
    168 
    169         setCreateAndRunTestExpectations();
    170 
    171         replayMocks();
    172         mCtsTest.run(mMockListener);
    173         verifyMocks();
    174     }
    175 
    176     /**
    177      * Test {@link CtsTest#run(java.util.List)} when --excluded-package is specified
    178      */
    179     public void testRun_excludedPackage() throws DeviceNotAvailableException, ParseException {
    180         mCtsTest.setPlanName(PLAN_NAME);
    181         mMockPlan.parse((InputStream)EasyMock.anyObject());
    182         Collection<String> uris = new ArrayList<String>(1);
    183         uris.add(PACKAGE_NAME);
    184         EasyMock.expect(mMockPlan.getTestUris()).andReturn(uris);
    185 
    186         mCtsTest.addExcludedPackageName(PACKAGE_NAME);
    187 
    188         // PACKAGE_NAME would normally be run, but it has been excluded. Expect nothing to happen
    189         replayMocks();
    190         mCtsTest.run(mMockListener);
    191         verifyMocks();
    192     }
    193 
    194     /**
    195      * Test {@link CtsTest#run(ITestInvocationListener))} when --continue-session is specified
    196      */
    197     public void testRun_continueSession() throws DeviceNotAvailableException, ParseException {
    198         mCtsTest.setContinueSessionId(1);
    199         Collection<String> uris = new ArrayList<String>(1);
    200         uris.add(PACKAGE_NAME);
    201         EasyMock.expect(mMockPlan.getTestUris()).andReturn(uris);
    202         TestFilter filter = new TestFilter();
    203         EasyMock.expect(mMockPlan.getExcludedTestFilter(PACKAGE_NAME)).andReturn(
    204                 filter);
    205         mMockPackageDef.setExcludedTestFilter(filter);
    206 
    207         setCreateAndRunTestExpectations();
    208 
    209         replayMocks();
    210         mCtsTest.run(mMockListener);
    211         verifyMocks();
    212     }
    213 
    214     /**
    215      * Set EasyMock expectations for parsing {@link #PLAN_NAME}
    216      */
    217     private void setParsePlanExceptations() throws ParseException {
    218         mCtsTest.setPlanName(PLAN_NAME);
    219         mMockPlan.parse((InputStream)EasyMock.anyObject());
    220         Collection<String> uris = new ArrayList<String>(1);
    221         uris.add(PACKAGE_NAME);
    222         EasyMock.expect(mMockPlan.getTestUris()).andReturn(uris);
    223         TestFilter filter = new TestFilter();
    224         EasyMock.expect(mMockPlan.getExcludedTestFilter(PACKAGE_NAME)).andReturn(
    225                 filter);
    226         mMockPackageDef.setExcludedTestFilter(filter);
    227     }
    228 
    229     /**
    230      * Set EasyMock expectations for creating and running a package with PACKAGE_NAME
    231      */
    232     private void setCreateAndRunTestExpectations() throws DeviceNotAvailableException {
    233         EasyMock.expect(mMockRepo.getTestPackage(PACKAGE_NAME)).andReturn(mMockPackageDef);
    234         EasyMock.expect(mMockPackageDef.createTest((File)EasyMock.anyObject())).andReturn(
    235                 mMockTest);
    236         EasyMock.expect(mMockPackageDef.getTests()).andReturn(new ArrayList<TestIdentifier>());
    237         EasyMock.expect(mMockPackageDef.getUri()).andStubReturn(PACKAGE_NAME);
    238         EasyMock.expect(mMockPackageDef.getName()).andReturn(PACKAGE_NAME);
    239         EasyMock.expect(mMockPackageDef.getDigest()).andReturn("digest");
    240 
    241         mMockTest.run((ITestInvocationListener)EasyMock.anyObject());
    242     }
    243 
    244     /**
    245      * Test {@link CtsTest#run(java.util.List)} when --plan and --package options have not been
    246      * specified
    247      */
    248     public void testRun_nothingToRun() throws DeviceNotAvailableException {
    249         try {
    250             mCtsTest.run(mMockListener);
    251             fail("IllegalArgumentException not thrown");
    252         } catch (IllegalArgumentException e) {
    253             // expected
    254         }
    255     }
    256 
    257     /**
    258      * Test {@link CtsTest#run(ITestInvocationListener))} when --plan and --package options have
    259      * been specified.
    260      */
    261     public void testRun_packagePlan() throws DeviceNotAvailableException {
    262         mCtsTest.setPlanName(PLAN_NAME);
    263         mCtsTest.addPackageName(PACKAGE_NAME);
    264         try {
    265             mCtsTest.run(mMockListener);
    266             fail("IllegalArgumentException not thrown");
    267         } catch (IllegalArgumentException e) {
    268             // expected
    269         }
    270     }
    271 
    272     /**
    273      * Test {@link CtsTest#run(java.util.List)} when --plan and --class options have been
    274      * specified
    275      */
    276     public void testRun_planClass() throws DeviceNotAvailableException {
    277         mCtsTest.setPlanName(PLAN_NAME);
    278         mCtsTest.setClassName("class");
    279         try {
    280             mCtsTest.run(mMockListener);
    281             fail("IllegalArgumentException not thrown");
    282         } catch (IllegalArgumentException e) {
    283             // expected
    284         }
    285     }
    286 
    287     /**
    288      * Test {@link CtsTest#run(java.util.List)} when --package and --class options have been
    289      * specified
    290      */
    291     public void testRun_packageClass() throws DeviceNotAvailableException {
    292         mCtsTest.addPackageName(PACKAGE_NAME);
    293         mCtsTest.setClassName("class");
    294         try {
    295             mCtsTest.run(mMockListener);
    296             fail("IllegalArgumentException not thrown");
    297         } catch (IllegalArgumentException e) {
    298             // expected
    299         }
    300     }
    301 
    302     /**
    303      * Test {@link CtsTest#run(java.util.List)} when --plan, --package and --class options have been
    304      * specified
    305      */
    306     public void testRun_planPackageClass() throws DeviceNotAvailableException {
    307         mCtsTest.setPlanName(PLAN_NAME);
    308         mCtsTest.addPackageName(PACKAGE_NAME);
    309         mCtsTest.setClassName("class");
    310         try {
    311             mCtsTest.run(mMockListener);
    312             fail("IllegalArgumentException not thrown");
    313         } catch (IllegalArgumentException e) {
    314             // expected
    315         }
    316     }
    317 
    318     /**
    319      * Test {@link CtsTest#run(java.util.List)} when --plan, --continue-option options have been
    320      * specified
    321      */
    322     public void testRun_planContinue() throws DeviceNotAvailableException {
    323         mCtsTest.setPlanName(PLAN_NAME);
    324         mCtsTest.setContinueSessionId(1);
    325         try {
    326             mCtsTest.run(mMockListener);
    327             fail("IllegalArgumentException not thrown");
    328         } catch (IllegalArgumentException e) {
    329             // expected
    330         }
    331     }
    332 
    333     private void replayMocks(Object... mocks) {
    334         EasyMock.replay(mMockRepo, mMockPlan, mMockDevice, mMockListener, mMockPackageDef,
    335                 mMockTest);
    336         EasyMock.replay(mocks);
    337     }
    338 
    339     private void verifyMocks(Object... mocks) {
    340         EasyMock.verify(mMockRepo, mMockPlan, mMockDevice, mMockListener, mMockPackageDef,
    341                 mMockTest);
    342         EasyMock.verify(mocks);
    343     }
    344 }
    345