blob: e24828d6bbf5ea33d496d5d7386b86321ad83b8d [file] [log] [blame]
/*
* Copyright (C) 2015 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.compatibility.common.tradefed.testtype;
import com.android.compatibility.common.tradefed.result.IModuleListener;
import com.android.compatibility.common.tradefed.result.ModuleListener;
import com.android.compatibility.common.tradefed.targetprep.PreconditionPreparer;
import com.android.compatibility.common.tradefed.targetprep.TokenRequirement;
import com.android.compatibility.common.util.AbiUtils;
import com.android.tradefed.build.IBuildInfo;
import com.android.tradefed.config.ConfigurationException;
import com.android.tradefed.config.OptionSetter;
import com.android.tradefed.device.DeviceNotAvailableException;
import com.android.tradefed.device.ITestDevice;
import com.android.tradefed.log.LogUtil.CLog;
import com.android.tradefed.result.ITestInvocationListener;
import com.android.tradefed.targetprep.BuildError;
import com.android.tradefed.targetprep.ITargetCleaner;
import com.android.tradefed.targetprep.ITargetPreparer;
import com.android.tradefed.targetprep.TargetSetupError;
import com.android.tradefed.testtype.IAbi;
import com.android.tradefed.testtype.IAbiReceiver;
import com.android.tradefed.testtype.IBuildReceiver;
import com.android.tradefed.testtype.IDeviceTest;
import com.android.tradefed.testtype.IRemoteTest;
import com.android.tradefed.testtype.IRuntimeHintProvider;
import com.android.tradefed.testtype.ITestFilterReceiver;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
/**
* Container for Compatibility test module info.
*/
public class ModuleDef implements IModuleDef {
private final String mId;
private final String mName;
private final IAbi mAbi;
private final Set<String> mTokens = new HashSet<>();
private IRemoteTest mTest = null;
private List<ITargetPreparer> mPreconditions = new ArrayList<>();
private List<ITargetPreparer> mPreparers = new ArrayList<>();
private List<ITargetCleaner> mCleaners = new ArrayList<>();
private IBuildInfo mBuild;
private ITestDevice mDevice;
private List<String> mIncludeFilters = new ArrayList<>();
private List<String> mExcludeFilters = new ArrayList<>();
public ModuleDef(String name, IAbi abi, IRemoteTest test,
List<ITargetPreparer> preparers) {
mId = AbiUtils.createId(abi.getName(), name);
mName = name;
mAbi = abi;
mTest = test;
for (ITargetPreparer preparer : preparers) {
// Separate preconditions from target preparers.
if (preparer instanceof PreconditionPreparer) {
mPreconditions.add(preparer);
} else if (preparer instanceof TokenRequirement) {
mTokens.addAll(((TokenRequirement) preparer).getTokens());
} else {
mPreparers.add(preparer);
}
if (preparer instanceof ITargetCleaner) {
mCleaners.add((ITargetCleaner) preparer);
}
}
// Reverse cleaner order
Collections.reverse(mCleaners);
}
/**
* {@inheritDoc}
*/
@Override
public String toString() {
return mId;
}
/**
* {@inheritDoc}
*/
@Override
public String getId() {
return mId;
}
/**
* {@inheritDoc}
*/
@Override
public String getName() {
return mName;
}
/**
* {@inheritDoc}
*/
@Override
public IAbi getAbi() {
return mAbi;
}
/**
* {@inheritDoc}
*/
@Override
public Set<String> getTokens() {
return mTokens;
}
/**
* {@inheritDoc}
*/
@Override
public long getRuntimeHint() {
if (mTest instanceof IRuntimeHintProvider) {
return ((IRuntimeHintProvider) mTest).getRuntimeHint();
}
return TimeUnit.MINUTES.toMillis(1); // Default 1 minute.
}
/**
* {@inheritDoc}
*/
@Override
public IRemoteTest getTest() {
return mTest;
}
/**
* {@inheritDoc}
*/
@Override
public void addIncludeFilter(String filter) {
mIncludeFilters.add(filter);
}
/**
* {@inheritDoc}
*/
@Override
public void addExcludeFilter(String filter) {
mExcludeFilters.add(filter);
}
/**
* {@inheritDoc}
*/
@Override
public int compareTo(IModuleDef moduleDef) {
return getName().compareTo(moduleDef.getName());
}
/**
* {@inheritDoc}
*/
@Override
public void setBuild(IBuildInfo build) {
mBuild = build;
}
/**
* {@inheritDoc}
*/
@Override
public ITestDevice getDevice() {
return mDevice;
}
/**
* {@inheritDoc}
*/
@Override
public void setDevice(ITestDevice device) {
mDevice = device;
}
/**
* {@inheritDoc}
*/
@Override
public void run(ITestInvocationListener listener) throws DeviceNotAvailableException {
IModuleListener moduleListener = new ModuleListener(this, listener);
// Setup
for (ITargetPreparer preparer : mPreparers) {
CLog.d("Preparer: %s", preparer.getClass().getSimpleName());
if (preparer instanceof IAbiReceiver) {
((IAbiReceiver) preparer).setAbi(mAbi);
}
try {
preparer.setUp(mDevice, mBuild);
} catch (BuildError e) {
// This should only happen for flashing new build
CLog.e("Unexpected BuildError from precondition: %s",
preparer.getClass().getCanonicalName());
} catch (TargetSetupError e) {
// log precondition class then rethrow & let caller handle
CLog.e("TargetSetupError in precondition: %s",
preparer.getClass().getCanonicalName());
throw new RuntimeException(e);
}
}
CLog.d("Test: %s", mTest.getClass().getSimpleName());
if (mTest instanceof IAbiReceiver) {
((IAbiReceiver) mTest).setAbi(mAbi);
}
if (mTest instanceof IBuildReceiver) {
((IBuildReceiver) mTest).setBuild(mBuild);
}
if (mTest instanceof IDeviceTest) {
((IDeviceTest) mTest).setDevice(mDevice);
}
if (mTest instanceof ITestFilterReceiver) {
((ITestFilterReceiver) mTest).addAllIncludeFilters(mIncludeFilters);
((ITestFilterReceiver) mTest).addAllExcludeFilters(mExcludeFilters);
}
mTest.run(moduleListener);
// Tear down
for (ITargetCleaner cleaner : mCleaners) {
CLog.d("Cleaner: %s", cleaner.getClass().getSimpleName());
cleaner.tearDown(mDevice, mBuild, null);
}
}
/**
* {@inheritDoc}
*/
@Override
public void prepare(boolean skipPrep) throws DeviceNotAvailableException {
for (ITargetPreparer preparer : mPreconditions) {
CLog.d("Preparer: %s", preparer.getClass().getSimpleName());
if (preparer instanceof IAbiReceiver) {
((IAbiReceiver) preparer).setAbi(mAbi);
}
setOption(preparer, CompatibilityTest.SKIP_PRECONDITIONS_OPTION,
Boolean.toString(skipPrep));
try {
preparer.setUp(mDevice, mBuild);
} catch (BuildError e) {
// This should only happen for flashing new build
CLog.e("Unexpected BuildError from precondition: %s",
preparer.getClass().getCanonicalName());
} catch (TargetSetupError e) {
// log precondition class then rethrow & let caller handle
CLog.e("TargetSetupError in precondition: %s",
preparer.getClass().getCanonicalName());
throw new RuntimeException(e);
}
}
}
private void setOption(Object target, String option, String value) {
try {
OptionSetter setter = new OptionSetter(target);
setter.setOptionValue(option, value);
} catch (ConfigurationException e) {
e.printStackTrace();
}
}
}