Home | History | Annotate | Download | only in junit4
      1 /*
      2  * Copyright (C) 2018 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.junit4;
     17 
     18 import com.android.tradefed.build.IBuildInfo;
     19 import com.android.tradefed.config.Option;
     20 import com.android.tradefed.device.ITestDevice;
     21 import com.android.tradefed.invoker.IInvocationContext;
     22 import com.android.tradefed.testtype.HostTest;
     23 import com.android.tradefed.testtype.IAbi;
     24 import com.android.tradefed.testtype.IAbiReceiver;
     25 import com.android.tradefed.testtype.IBuildReceiver;
     26 import com.android.tradefed.testtype.IDeviceTest;
     27 import com.android.tradefed.testtype.IInvocationContextReceiver;
     28 import com.android.tradefed.testtype.IMultiDeviceTest;
     29 import com.android.tradefed.testtype.ISetOptionReceiver;
     30 
     31 import org.junit.runners.Parameterized;
     32 import org.junit.runners.model.FrameworkMethod;
     33 import org.junit.runners.model.InitializationError;
     34 import org.junit.runners.model.Statement;
     35 
     36 import java.util.ArrayList;
     37 import java.util.List;
     38 import java.util.Map;
     39 
     40 import junitparams.JUnitParamsRunner;
     41 
     42 /**
     43  * JUnit4 style parameterized runner for host-side driven parameterized tests.
     44  *
     45  * <p>This runner is based on {@link JUnitParamsRunner} and not JUnit4 native {@link Parameterized}
     46  * but the native parameterized runner is not really good and doesn't allow to run a single method.
     47  *
     48  * @see JUnitParamsRunner
     49  */
     50 public class DeviceParameterizedRunner extends JUnitParamsRunner
     51         implements IDeviceTest,
     52                 IBuildReceiver,
     53                 IAbiReceiver,
     54                 ISetOptionReceiver,
     55                 IMultiDeviceTest,
     56                 IInvocationContextReceiver {
     57 
     58     @Option(name = HostTest.SET_OPTION_NAME, description = HostTest.SET_OPTION_DESC)
     59     private List<String> mKeyValueOptions = new ArrayList<>();
     60 
     61     private ITestDevice mDevice;
     62     private IBuildInfo mBuildInfo;
     63     private IAbi mAbi;
     64     private IInvocationContext mContext;
     65     private Map<ITestDevice, IBuildInfo> mDeviceInfos;
     66 
     67     /**
     68      * @param klass
     69      * @throws InitializationError
     70      */
     71     public DeviceParameterizedRunner(Class<?> klass) throws InitializationError {
     72         super(klass);
     73     }
     74 
     75     @Override
     76     protected Statement methodInvoker(FrameworkMethod method, Object testObj) {
     77         if (testObj instanceof IDeviceTest) {
     78             if (mDevice == null) {
     79                 throw new IllegalArgumentException("Missing device");
     80             }
     81             ((IDeviceTest) testObj).setDevice(mDevice);
     82         }
     83         if (testObj instanceof IBuildReceiver) {
     84             if (mBuildInfo == null) {
     85                 throw new IllegalArgumentException("Missing build information");
     86             }
     87             ((IBuildReceiver) testObj).setBuild(mBuildInfo);
     88         }
     89         // We are more flexible about abi information since not always available.
     90         if (testObj instanceof IAbiReceiver) {
     91             ((IAbiReceiver) testObj).setAbi(mAbi);
     92         }
     93         if (testObj instanceof IMultiDeviceTest) {
     94             ((IMultiDeviceTest) testObj).setDeviceInfos(mDeviceInfos);
     95         }
     96         if (testObj instanceof IInvocationContextReceiver) {
     97             ((IInvocationContextReceiver) testObj).setInvocationContext(mContext);
     98         }
     99         // Set options of test object
    100         HostTest.setOptionToLoadedObject(testObj, mKeyValueOptions);
    101         return super.methodInvoker(method, testObj);
    102     }
    103 
    104     @Override
    105     public void setDevice(ITestDevice device) {
    106         mDevice = device;
    107     }
    108 
    109     @Override
    110     public ITestDevice getDevice() {
    111         return mDevice;
    112     }
    113 
    114     @Override
    115     public void setAbi(IAbi abi) {
    116         mAbi = abi;
    117     }
    118 
    119     @Override
    120     public IAbi getAbi() {
    121         return mAbi;
    122     }
    123 
    124     @Override
    125     public void setBuild(IBuildInfo buildInfo) {
    126         mBuildInfo = buildInfo;
    127     }
    128 
    129     @Override
    130     public void setInvocationContext(IInvocationContext invocationContext) {
    131         mContext = invocationContext;
    132     }
    133 
    134     @Override
    135     public void setDeviceInfos(Map<ITestDevice, IBuildInfo> deviceInfos) {
    136         mDeviceInfos = deviceInfos;
    137     }
    138 }
    139