Home | History | Annotate | Download | only in testtype
      1 /*
      2  * Copyright (C) 2016 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.tradefed.testtype;
     17 
     18 import static org.junit.Assert.assertEquals;
     19 
     20 import com.android.ddmlib.testrunner.TestIdentifier;
     21 import com.android.tradefed.build.IBuildInfo;
     22 import com.android.tradefed.config.Option;
     23 import com.android.tradefed.config.OptionSetter;
     24 import com.android.tradefed.device.ITestDevice;
     25 import com.android.tradefed.result.ITestInvocationListener;
     26 import com.android.tradefed.testtype.DeviceJUnit4ClassRunner.TestMetrics;
     27 
     28 import org.easymock.EasyMock;
     29 import org.junit.Before;
     30 import org.junit.Rule;
     31 import org.junit.Test;
     32 import org.junit.runner.RunWith;
     33 import org.junit.runners.Suite.SuiteClasses;
     34 
     35 import java.lang.annotation.Retention;
     36 import java.lang.annotation.RetentionPolicy;
     37 import java.util.Collections;
     38 import java.util.HashMap;
     39 import java.util.Map;
     40 
     41 /**
     42  * Unit Tests for {@link DeviceSuite}
     43  */
     44 public class DeviceSuiteTest {
     45 
     46     // We use HostTest as a runner for JUnit4 Suite
     47     private HostTest mHostTest;
     48     private ITestDevice mMockDevice;
     49     private ITestInvocationListener mListener;
     50     private IBuildInfo mMockBuildInfo;
     51     private IAbi mMockAbi;
     52 
     53     @Before
     54     public void setUp() {
     55         mHostTest = new HostTest();
     56         mMockDevice = EasyMock.createMock(ITestDevice.class);
     57         mListener = EasyMock.createMock(ITestInvocationListener.class);
     58         mMockBuildInfo = EasyMock.createMock(IBuildInfo.class);
     59         mMockAbi = EasyMock.createMock(IAbi.class);
     60         mHostTest.setDevice(mMockDevice);
     61         mHostTest.setBuild(mMockBuildInfo);
     62         mHostTest.setAbi(mMockAbi);
     63     }
     64 
     65     @RunWith(DeviceJUnit4ClassRunner.class)
     66     public static class Junit4DeviceTestclass implements IDeviceTest, IAbiReceiver,
     67             IBuildReceiver {
     68         public static ITestDevice sDevice;
     69         public static IBuildInfo sBuildInfo;
     70         public static IAbi sAbi;
     71 
     72         @Rule public TestMetrics metrics = new TestMetrics();
     73 
     74         @Option(name = "option")
     75         private String mOption = null;
     76 
     77         public Junit4DeviceTestclass() {
     78             sDevice = null;
     79             sBuildInfo = null;
     80             sAbi = null;
     81         }
     82 
     83         @Test
     84         @MyAnnotation1
     85         public void testPass1() {
     86             if (mOption != null) {
     87                 metrics.addTestMetric("option", mOption);
     88             }
     89         }
     90 
     91         @Test
     92         public void testPass2() {}
     93 
     94         @Override
     95         public void setDevice(ITestDevice device) {
     96             sDevice = device;
     97         }
     98 
     99         @Override
    100         public ITestDevice getDevice() {
    101             return sDevice;
    102         }
    103 
    104         @Override
    105         public void setBuild(IBuildInfo buildInfo) {
    106             sBuildInfo = buildInfo;
    107         }
    108 
    109         @Override
    110         public void setAbi(IAbi abi) {
    111             sAbi = abi;
    112         }
    113     }
    114 
    115     @RunWith(DeviceSuite.class)
    116     @SuiteClasses({
    117         Junit4DeviceTestclass.class,
    118     })
    119     public class Junit4DeviceSuite {
    120     }
    121 
    122     /** Simple Annotation class for testing */
    123     @Retention(RetentionPolicy.RUNTIME)
    124     public @interface MyAnnotation1 {}
    125 
    126     @Test
    127     public void testRunDeviceSuite() throws Exception {
    128         OptionSetter setter = new OptionSetter(mHostTest);
    129         setter.setOptionValue("class", Junit4DeviceSuite.class.getName());
    130         mListener.testRunStarted(
    131                 EasyMock.eq("com.android.tradefed.testtype.DeviceSuiteTest$Junit4DeviceSuite"),
    132                 EasyMock.eq(2));
    133         TestIdentifier test1 = new TestIdentifier(Junit4DeviceTestclass.class.getName(),
    134                 "testPass1");
    135         TestIdentifier test2 = new TestIdentifier(Junit4DeviceTestclass.class.getName(),
    136                 "testPass2");
    137         mListener.testStarted(EasyMock.eq(test1));
    138         mListener.testEnded(EasyMock.eq(test1), EasyMock.eq(Collections.emptyMap()));
    139         mListener.testStarted(EasyMock.eq(test2));
    140         mListener.testEnded(EasyMock.eq(test2), EasyMock.eq(Collections.emptyMap()));
    141         mListener.testRunEnded(EasyMock.anyLong(), EasyMock.eq(Collections.emptyMap()));
    142         EasyMock.replay(mListener, mMockDevice);
    143         mHostTest.run(mListener);
    144         EasyMock.verify(mListener, mMockDevice);
    145         // Verify that all setters were called on Test class inside suite
    146         assertEquals(mMockDevice, Junit4DeviceTestclass.sDevice);
    147         assertEquals(mMockBuildInfo, Junit4DeviceTestclass.sBuildInfo);
    148         assertEquals(mMockAbi, Junit4DeviceTestclass.sAbi);
    149     }
    150 
    151     /** Test the run with filtering to include only one annotation. */
    152     @Test
    153     public void testRun_withFiltering() throws Exception {
    154         OptionSetter setter = new OptionSetter(mHostTest);
    155         setter.setOptionValue("class", Junit4DeviceSuite.class.getName());
    156         mHostTest.addIncludeAnnotation(
    157                 "com.android.tradefed.testtype.DeviceSuiteTest$MyAnnotation1");
    158         assertEquals(1, mHostTest.countTestCases());
    159         mListener.testRunStarted(
    160                 EasyMock.eq("com.android.tradefed.testtype.DeviceSuiteTest$Junit4DeviceSuite"),
    161                 EasyMock.eq(1));
    162         TestIdentifier test1 =
    163                 new TestIdentifier(Junit4DeviceTestclass.class.getName(), "testPass1");
    164         mListener.testStarted(EasyMock.eq(test1));
    165         mListener.testEnded(EasyMock.eq(test1), EasyMock.eq(Collections.emptyMap()));
    166         mListener.testRunEnded(EasyMock.anyLong(), EasyMock.eq(Collections.emptyMap()));
    167         EasyMock.replay(mListener, mMockDevice);
    168         mHostTest.run(mListener);
    169         EasyMock.verify(mListener, mMockDevice);
    170     }
    171 
    172     /** Tests that options are piped from Suite to the sub-runners. */
    173     @Test
    174     public void testRun_withOption() throws Exception {
    175         OptionSetter setter = new OptionSetter(mHostTest);
    176         setter.setOptionValue("class", Junit4DeviceSuite.class.getName());
    177         setter.setOptionValue("set-option", "option:value_test");
    178         mListener.testRunStarted(
    179                 EasyMock.eq("com.android.tradefed.testtype.DeviceSuiteTest$Junit4DeviceSuite"),
    180                 EasyMock.eq(2));
    181         TestIdentifier test1 =
    182                 new TestIdentifier(Junit4DeviceTestclass.class.getName(), "testPass1");
    183         TestIdentifier test2 =
    184                 new TestIdentifier(Junit4DeviceTestclass.class.getName(), "testPass2");
    185         mListener.testStarted(EasyMock.eq(test1));
    186         Map<String, String> expected = new HashMap<>();
    187         expected.put("option", "value_test");
    188         mListener.testEnded(EasyMock.eq(test1), EasyMock.eq(expected));
    189         mListener.testStarted(EasyMock.eq(test2));
    190         mListener.testEnded(EasyMock.eq(test2), EasyMock.eq(Collections.emptyMap()));
    191         mListener.testRunEnded(EasyMock.anyLong(), EasyMock.eq(Collections.emptyMap()));
    192         EasyMock.replay(mListener, mMockDevice);
    193         mHostTest.run(mListener);
    194         EasyMock.verify(mListener, mMockDevice);
    195     }
    196 }
    197