Change other CTS sub-tests to not use fixed build location.
Change-Id: I1733e31e3eb1b03cdcd1f0c8e567517c6fb5661c
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/build/CtsBuildHelper.java b/tools/tradefed-host/src/com/android/cts/tradefed/build/CtsBuildHelper.java
index 4a2d56c..9bc0945 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/build/CtsBuildHelper.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/build/CtsBuildHelper.java
@@ -16,6 +16,7 @@
package com.android.cts.tradefed.build;
+import com.android.tradefed.build.IBuildInfo;
import com.android.tradefed.build.IFolderBuildInfo;
import java.io.File;
@@ -57,6 +58,29 @@
}
/**
+ * A helper factory method that creates and validates a {@link CtsBuildHelper} given an
+ * {@link IBuildInfo}.
+ *
+ * @param build the {@link IBuildInfo}
+ * @return the {@link CtsBuildHelper}
+ * @throws IllegalArgumentException if provided <var>build</var> is not a valid CTS build
+ */
+ public static CtsBuildHelper createBuildHelper(IBuildInfo build) {
+ if (!(build instanceof IFolderBuildInfo)) {
+ throw new IllegalArgumentException(String.format(
+ "Wrong build type. Expected %s, received %s", IFolderBuildInfo.class.getName(),
+ build.getClass().getName()));
+ }
+ try {
+ CtsBuildHelper ctsBuild = new CtsBuildHelper((IFolderBuildInfo)build);
+ ctsBuild.validateStructure();
+ return ctsBuild;
+ } catch (FileNotFoundException e) {
+ throw new IllegalArgumentException("Invalid CTS build provided.", e);
+ }
+ }
+
+ /**
* @return a {@link File} representing the parent folder of the CTS installation
*/
public File getRootDir() {
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/CtsTest.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/CtsTest.java
index f49c4a0..f6d8142 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/CtsTest.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/CtsTest.java
@@ -22,7 +22,6 @@
import com.android.ddmlib.Log.LogLevel;
import com.android.ddmlib.testrunner.TestIdentifier;
import com.android.tradefed.build.IBuildInfo;
-import com.android.tradefed.build.IFolderBuildInfo;
import com.android.tradefed.config.Option;
import com.android.tradefed.device.DeviceNotAvailableException;
import com.android.tradefed.device.ITestDevice;
@@ -201,18 +200,8 @@
*/
@Override
public void setBuild(IBuildInfo build) {
- if (!(build instanceof IFolderBuildInfo)) {
- throw new IllegalArgumentException(String.format(
- "Wrong build type. Expected %s, received %s", IFolderBuildInfo.class.getName(),
- build.getClass().getName()));
- }
- try {
- mBuildInfo = build;
- mCtsBuild = new CtsBuildHelper((IFolderBuildInfo)build);
- mCtsBuild.validateStructure();
- } catch (FileNotFoundException e) {
- throw new IllegalArgumentException("Invalid CTS build provided.", e);
- }
+ mCtsBuild = CtsBuildHelper.createBuildHelper(build);
+ mBuildInfo = build;
}
/**
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/InstrumentationApkTest.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/InstrumentationApkTest.java
index b3d2eec..e1bb91e 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/InstrumentationApkTest.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/InstrumentationApkTest.java
@@ -18,7 +18,6 @@
import com.android.cts.tradefed.build.CtsBuildHelper;
import com.android.ddmlib.Log;
import com.android.tradefed.build.IBuildInfo;
-import com.android.tradefed.build.IFolderBuildInfo;
import com.android.tradefed.device.DeviceNotAvailableException;
import com.android.tradefed.result.ITestInvocationListener;
import com.android.tradefed.testtype.IBuildReceiver;
@@ -49,17 +48,7 @@
*/
@Override
public void setBuild(IBuildInfo build) {
- if (!(build instanceof IFolderBuildInfo)) {
- throw new IllegalArgumentException(String.format(
- "Wrong build type. Expected %s, received %s", IFolderBuildInfo.class.getName(),
- build.getClass().getName()));
- }
- try {
- mCtsBuild = new CtsBuildHelper((IFolderBuildInfo)build);
- mCtsBuild.validateStructure();
- } catch (FileNotFoundException e) {
- throw new IllegalArgumentException("Invalid CTS build provided.", e);
- }
+ mCtsBuild = CtsBuildHelper.createBuildHelper(build);
}
/**
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/JarHostTest.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/JarHostTest.java
index 041079d..2fe6802 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/JarHostTest.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/JarHostTest.java
@@ -15,12 +15,15 @@
*/
package com.android.cts.tradefed.testtype;
+import com.android.cts.tradefed.build.CtsBuildHelper;
import com.android.ddmlib.Log;
import com.android.ddmlib.testrunner.TestIdentifier;
+import com.android.tradefed.build.IBuildInfo;
import com.android.tradefed.device.DeviceNotAvailableException;
import com.android.tradefed.device.ITestDevice;
import com.android.tradefed.result.ITestInvocationListener;
import com.android.tradefed.result.JUnitToInvocationResultForwarder;
+import com.android.tradefed.testtype.IBuildReceiver;
import com.android.tradefed.testtype.IDeviceTest;
import com.android.tradefed.testtype.IRemoteTest;
import com.android.tradefed.util.CommandStatus;
@@ -28,6 +31,7 @@
import com.android.tradefed.util.RunUtil;
import java.io.File;
+import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
@@ -39,29 +43,50 @@
import junit.framework.TestResult;
/**
- * A {@link IRemoteTest} that can run a set of JUnit tests from a jar.
+ * A {@link IRemoteTest} that can run a set of JUnit tests from a CTS jar.
*/
-public class JarHostTest implements IDeviceTest, IRemoteTest {
+public class JarHostTest implements IDeviceTest, IRemoteTest, IBuildReceiver {
private static final String LOG_TAG = "JarHostTest";
private ITestDevice mDevice;
- private File mJarFile;
+ private String mJarFileName;
private Collection<TestIdentifier> mTests;
private long mTimeoutMs = 10 * 60 * 1000;
private String mRunName;
- private String mTestAppPath;
+ private CtsBuildHelper mCtsBuild = null;
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void setBuild(IBuildInfo buildInfo) {
+ mCtsBuild = CtsBuildHelper.createBuildHelper(buildInfo);
+ }
+
+ /**
+ * Set the CTS build container.
+ * <p/>
+ * Exposed so unit tests can mock the provided build.
+ *
+ * @param buildHelper
+ */
+ void setBuildHelper(CtsBuildHelper buildHelper) {
+ mCtsBuild = buildHelper;
+ }
/**
* Set the jar file to load tests from.
- * @param jarFile
+ *
+ * @param jarFileName the file name of the CTS host test jar to use
*/
- void setJarFile(File jarFile) {
- mJarFile = jarFile;
+ void setJarFileName(String jarFileName) {
+ mJarFileName = jarFileName;
}
/**
* Sets the collection of tests to run
+ *
* @param tests
*/
void setTests(Collection<TestIdentifier> tests) {
@@ -90,17 +115,6 @@
}
/**
- * Set the filesystem path to test app artifacts needed to run tests.
- *
- * @see {@link com.android.hosttest.DeviceTest#setTestAppPath(String)}
- *
- * @param testAppPath
- */
- void setTestAppPath(String testAppPath) {
- mTestAppPath = testAppPath;
- }
-
- /**
* {@inheritDoc}
*/
@Override
@@ -153,7 +167,7 @@
// all host tests are converted to use tradefed
com.android.hosttest.DeviceTest deviceTest = (com.android.hosttest.DeviceTest)junitTest;
deviceTest.setDevice(getDevice().getIDevice());
- deviceTest.setTestAppPath(mTestAppPath);
+ deviceTest.setTestAppPath(mCtsBuild.getTestCasesDir().getAbsolutePath());
}
CommandStatus status = RunUtil.getInstance().runTimed(mTimeoutMs, new IRunnableResult() {
@@ -183,7 +197,8 @@
*/
private Test loadTest(String className, String testName) {
try {
- URL urls[] = {mJarFile.getCanonicalFile().toURI().toURL()};
+ File jarFile = mCtsBuild.getTestApp(mJarFileName);
+ URL urls[] = {jarFile.getCanonicalFile().toURI().toURL()};
Class<?> testClass = loadClass(className, urls);
if (TestCase.class.isAssignableFrom(testClass)) {
@@ -195,16 +210,16 @@
return test;
} else {
Log.e(LOG_TAG, String.format("Class '%s' from jar '%s' is not a Test",
- className, mJarFile.getAbsolutePath()));
+ className, mJarFileName));
}
} catch (ClassNotFoundException e) {
- reportLoadError(mJarFile, className, e);
+ reportLoadError(mJarFileName, className, e);
} catch (IllegalAccessException e) {
- reportLoadError(mJarFile, className, e);
+ reportLoadError(mJarFileName, className, e);
} catch (IOException e) {
- reportLoadError(mJarFile, className, e);
+ reportLoadError(mJarFileName, className, e);
} catch (InstantiationException e) {
- reportLoadError(mJarFile, className, e);
+ reportLoadError(mJarFileName, className, e);
}
return null;
}
@@ -225,9 +240,9 @@
return testClass;
}
- private void reportLoadError(File jarFile, String className, Exception e) {
+ private void reportLoadError(String jarFileName, String className, Exception e) {
Log.e(LOG_TAG, String.format("Failed to load test class '%s' from jar '%s'",
- className, jarFile.getAbsolutePath()));
+ className, jarFileName));
Log.e(LOG_TAG, e);
}
@@ -241,11 +256,21 @@
if (mDevice == null) {
throw new IllegalArgumentException("Device has not been set");
}
- if (mJarFile == null) {
- throw new IllegalArgumentException("jar file has not been set");
+ if (mJarFileName == null) {
+ throw new IllegalArgumentException("jar file name has not been set");
}
if (mTests == null) {
throw new IllegalArgumentException("tests has not been set");
}
+ if (mCtsBuild == null) {
+ throw new IllegalArgumentException("build has not been set");
+ }
+ try {
+ mCtsBuild.getTestApp(mJarFileName);
+ } catch (FileNotFoundException e) {
+ throw new IllegalArgumentException(String.format(
+ "Could not find jar %s in CTS build %s", mJarFileName,
+ mCtsBuild.getRootDir().getAbsolutePath()));
+ }
}
}
diff --git a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageDef.java b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageDef.java
index 6b165be..04da318 100644
--- a/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageDef.java
+++ b/tools/tradefed-host/src/com/android/cts/tradefed/testtype/TestPackageDef.java
@@ -136,8 +136,7 @@
Log.d(LOG_TAG, String.format("Creating host test for %s", mName));
JarHostTest hostTest = new JarHostTest();
hostTest.setRunName(mName);
- hostTest.setJarFile(new File(testCaseDir, mJarPath));
- hostTest.setTestAppPath(testCaseDir.getAbsolutePath());
+ hostTest.setJarFileName(mJarPath);
hostTest.setTests(filterTests(mTests, className, methodName));
return hostTest;
} else if (mIsSignatureTest) {
@@ -145,7 +144,7 @@
// points to specialized instrumentation. Eventually this special case for signatureTest
// can be removed, and it can be treated just like a normal InstrumentationTest
Log.d(LOG_TAG, String.format("Creating signature test %s", mName));
- InstrumentationTest instrTest = new InstrumentationTest();
+ InstrumentationApkTest instrTest = new InstrumentationApkTest();
instrTest.setPackageName(mAppNameSpace);
instrTest.setRunnerName("android.test.InstrumentationTestRunner");
instrTest.setClassName(SIGNATURE_TEST_CLASS);
@@ -153,13 +152,7 @@
// add signature test to list of known tests
addTest(new TestIdentifier(SIGNATURE_TEST_CLASS, SIGNATURE_TEST_METHOD));
// mName means 'apk file name' for instrumentation tests
- File apkFile = new File(testCaseDir, String.format("%s.apk", mName));
- if (!apkFile.exists()) {
- Log.w(LOG_TAG, String.format("Could not find apk file %s",
- apkFile.getAbsolutePath()));
- return null;
- }
- instrTest.setInstallFile(apkFile);
+ instrTest.addInstallApk(String.format("%s.apk", mName), mAppNameSpace);
return instrTest;
} else if (mIsReferenceAppTest) {
// a reference app test is just a InstrumentationTest with one extra apk to install
diff --git a/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/JarHostTestTest.java b/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/JarHostTestTest.java
index 9a49b77..dfe4413 100644
--- a/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/JarHostTestTest.java
+++ b/tools/tradefed-host/tests/src/com/android/cts/tradefed/testtype/JarHostTestTest.java
@@ -15,6 +15,7 @@
*/
package com.android.cts.tradefed.testtype;
+import com.android.cts.tradefed.build.StubCtsBuildHelper;
import com.android.ddmlib.testrunner.TestIdentifier;
import com.android.tradefed.device.DeviceNotAvailableException;
import com.android.tradefed.device.ITestDevice;
@@ -22,7 +23,6 @@
import org.easymock.EasyMock;
-import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
@@ -37,6 +37,8 @@
private static final String RUN_NAME = "run";
private JarHostTest mJarTest;
+ private StubCtsBuildHelper mStubBuildHelper;
+
@Override
protected void setUp() throws Exception {
@@ -48,6 +50,8 @@
return MockTest.class;
}
};
+ mStubBuildHelper = new StubCtsBuildHelper();
+ mJarTest.setBuildHelper(mStubBuildHelper);
}
public static class MockTest extends TestCase {
@@ -80,7 +84,7 @@
listener.testRunEnded(EasyMock.anyLong(), EasyMock.eq(Collections.EMPTY_MAP));
mJarTest.setTests(tests);
mJarTest.setDevice(EasyMock.createMock(ITestDevice.class));
- mJarTest.setJarFile(new File("fakefile"));
+ mJarTest.setJarFileName("fakefile");
mJarTest.setRunName(RUN_NAME);
EasyMock.replay(listener);