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