diff options
author | Jed Estep <jestep@google.com> | 2016-04-12 22:19:29 -0700 |
---|---|---|
committer | Jed Estep <jestep@google.com> | 2016-04-20 12:14:16 -0700 |
commit | 71832c71d1fe049a1f898c231f9b0405028fe12d (patch) | |
tree | 6e53f4c967ed45b35db05781233d721f2cd2f6dc /src/com | |
parent | 7e7837877bc1a57a8228bfc7bcd93c1229707947 (diff) | |
download | tradefederation-71832c71d1fe049a1f898c231f9b0405028fe12d.tar.gz |
Enable OtaFaultInjectionPreparer to sign packages
OTA packages need to be re-signed after any modification This requires
the following changes to tradefed:
* OtaDeviceBuildInfo must be accessible to google_tradefed
* A BuildInfo must exist that contains otatools.zip files (signapk.jar)
Bug: 28193112
Change-Id: I9ed42ea34634fc20768fbe0d99ebcbf8c07b94d8
Diffstat (limited to 'src/com')
3 files changed, 481 insertions, 105 deletions
diff --git a/src/com/android/tradefed/build/OtaDeviceBuildInfo.java b/src/com/android/tradefed/build/OtaDeviceBuildInfo.java new file mode 100644 index 000000000..437e84cbc --- /dev/null +++ b/src/com/android/tradefed/build/OtaDeviceBuildInfo.java @@ -0,0 +1,406 @@ +/* + * Copyright (C) 2012 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.tradefed.build; + +import java.io.File; +import java.util.Collection; +import java.util.LinkedList; +import java.util.Map; + +/** + * A {@link IDeviceBuildInfo} used for over-the-air update testing. It is composed of two device + * builds: + * <ul> + * <li>a baseline build image (the build to OTA from).</li> + * <li>a OTA build (a build to OTA to). Should contain necessary build attributes and associated + * OTA package.</li> + * </ul> + * <var>this</var> contains the baseline build, and {@link #getOtaBuild()} returns the OTA + * build. + */ +public class OtaDeviceBuildInfo implements IDeviceBuildInfo { + + protected IDeviceBuildInfo mOtaBuild; + protected IDeviceBuildInfo mBaselineBuild; + + public void setOtaBuild(IDeviceBuildInfo otaBuild) { + mOtaBuild = otaBuild; + } + + public void setBaselineBuild(IDeviceBuildInfo baselineBuild) { + mBaselineBuild = baselineBuild; + } + + public IDeviceBuildInfo getOtaBuild() { + return mOtaBuild; + } + + /** + * {@inheritDoc} + */ + @Override + public String getBuildId() { + return mBaselineBuild.getBuildId(); + } + + /** + * {@inheritDoc} + */ + @Override + public void setBuildId(String buildId) { + mBaselineBuild.setBuildId(buildId); + } + + /** + * {@inheritDoc} + */ + @Override + public String getTestTag() { + return mBaselineBuild.getTestTag(); + } + + /** + * {@inheritDoc} + */ + @Override + public String getBuildTargetName() { + return mBaselineBuild.getBuildTargetName(); + } + + /** + * {@inheritDoc} + */ + @Override + public String getBuildFlavor() { + return mBaselineBuild.getBuildFlavor(); + } + + /** + * {@inheritDoc} + */ + @Override + public String getDeviceSerial() { + return mBaselineBuild.getDeviceSerial(); + } + + /** + * {@inheritDoc} + */ + @Override + public void setBuildFlavor(String buildFlavor) { + mBaselineBuild.setBuildFlavor(buildFlavor); + } + + /** + * {@inheritDoc} + */ + @Override + public String getBuildBranch() { + return mBaselineBuild.getBuildBranch(); + } + + /** + * {@inheritDoc} + */ + @Override + public void setBuildBranch(String branch) { + mBaselineBuild.setBuildBranch(branch); + } + + /** + * {@inheritDoc} + */ + @Override + public void setDeviceSerial(String serial) { + mBaselineBuild.setDeviceSerial(serial); + } + + /** + * {@inheritDoc} + */ + @Override + public Map<String, String> getBuildAttributes() { + return mBaselineBuild.getBuildAttributes(); + } + + /** + * {@inheritDoc} + */ + @Override + public void addBuildAttribute(String attributeName, String attributeValue) { + mBaselineBuild.addBuildAttribute(attributeName, attributeValue); + } + + /** + * {@inheritDoc} + */ + @Override + public File getFile(String name) { + return mBaselineBuild.getFile(name); + } + + /** + * {@inheritDoc} + */ + @Override + public String getVersion(String name) { + return mBaselineBuild.getVersion(name); + } + + /** + * {@inheritDoc} + */ + @Override + public void setFile(String name, File file, String version) { + mBaselineBuild.setFile(name, file, version); + } + + /** + * {@inheritDoc} + */ + @Override + public String getDeviceBuildId() { + return mBaselineBuild.getDeviceBuildId(); + } + + /** + * {@inheritDoc} + */ + @Override + public File getDeviceImageFile() { + return mBaselineBuild.getDeviceImageFile(); + } + + /** + * {@inheritDoc} + */ + @Override + public String getDeviceImageVersion() { + return mBaselineBuild.getDeviceImageVersion(); + } + + /** + * {@inheritDoc} + */ + @Override + public void setDeviceImageFile(File deviceImageFile, String version) { + mBaselineBuild.setDeviceImageFile(deviceImageFile, version); + } + + /** + * {@inheritDoc} + */ + @Override + public File getUserDataImageFile() { + return mBaselineBuild.getUserDataImageFile(); + } + + /** + * {@inheritDoc} + */ + @Override + public String getUserDataImageVersion() { + return mBaselineBuild.getUserDataImageVersion(); + } + + /** + * {@inheritDoc} + */ + @Override + public void setUserDataImageFile(File userDataFile, String version) { + mBaselineBuild.setUserDataImageFile(userDataFile, version); + } + + /** + * {@inheritDoc} + */ + @Override + public File getTestsDir() { + return mBaselineBuild.getTestsDir(); + } + + /** + * {@inheritDoc} + */ + @Override + public String getTestsDirVersion() { + return mBaselineBuild.getTestsDirVersion(); + } + + /** + * {@inheritDoc} + */ + @Override + public void setTestsDir(File testsZipFile, String version) { + mBaselineBuild.setTestsDir(testsZipFile, version); + } + + /** + * {@inheritDoc} + */ + @Override + public File getBasebandImageFile() { + return mBaselineBuild.getBasebandImageFile(); + } + + /** + * {@inheritDoc} + */ + @Override + public String getBasebandVersion() { + return mBaselineBuild.getBasebandVersion(); + } + + /** + * {@inheritDoc} + */ + @Override + public void setBasebandImage(File basebandFile, String version) { + mBaselineBuild.setBasebandImage(basebandFile, version); + } + + /** + * {@inheritDoc} + */ + @Override + public File getBootloaderImageFile() { + return mBaselineBuild.getBootloaderImageFile(); + } + + /** + * {@inheritDoc} + */ + @Override + public String getBootloaderVersion() { + return mBaselineBuild.getBootloaderVersion(); + } + + /** + * {@inheritDoc} + */ + @Override + public void setBootloaderImageFile(File bootloaderImgFile, String version) { + mBaselineBuild.setBootloaderImageFile(bootloaderImgFile, version); + } + + /** + * {@inheritDoc} + */ + @Override + public File getOtaPackageFile() { + return mBaselineBuild.getOtaPackageFile(); + } + + /** + * {@inheritDoc} + */ + @Override + public String getOtaPackageVersion() { + return mBaselineBuild.getOtaPackageVersion(); + } + + /** + * {@inheritDoc} + */ + @Override + public void setOtaPackageFile(File otaFile, String version) { + mBaselineBuild.setOtaPackageFile(otaFile, version); + } + + /** + * {@inheritDoc} + */ + @Override + public File getMkbootimgFile() { + return mBaselineBuild.getMkbootimgFile(); + } + + /** + * {@inheritDoc} + */ + @Override + public String getMkbootimgVersion() { + return mBaselineBuild.getMkbootimgVersion(); + } + + /** + * {@inheritDoc} + */ + @Override + public void setMkbootimgFile(File mkbootimg, String version) { + mBaselineBuild.setMkbootimgFile(mkbootimg, version); + } + + /** + * {@inheritDoc} + */ + @Override + public File getRamdiskFile() { + return mBaselineBuild.getRamdiskFile(); + } + + /** + * {@inheritDoc} + */ + @Override + public String getRamdiskVersion() { + return mBaselineBuild.getRamdiskVersion(); + } + + /** + * {@inheritDoc} + */ + @Override + public void setRamdiskFile(File ramdisk, String version) { + mBaselineBuild.setRamdiskFile(ramdisk, version); + } + + /** + * {@inheritDoc} + */ + @Override + public void cleanUp() { + mBaselineBuild.cleanUp(); + mOtaBuild.cleanUp(); + } + + /** + * {@inheritDoc} + */ + @Override + public IBuildInfo clone() { + OtaDeviceBuildInfo clone = new OtaDeviceBuildInfo(); + if (mBaselineBuild != null) { + clone.setBaselineBuild((IDeviceBuildInfo)mBaselineBuild.clone()); + } + if (mOtaBuild != null) { + clone.setOtaBuild((IDeviceBuildInfo)mOtaBuild.clone()); + } + return clone; + } + + /** + * {@inheritDoc} + */ + @Override + public Collection<VersionedFile> getFiles() { + Collection<VersionedFile> combinedFiles = new LinkedList<VersionedFile>(); + combinedFiles.addAll(mBaselineBuild.getFiles()); + combinedFiles.addAll(mOtaBuild.getFiles()); + return combinedFiles; + } +} diff --git a/src/com/android/tradefed/build/OtaToolsDeviceBuildInfo.java b/src/com/android/tradefed/build/OtaToolsDeviceBuildInfo.java new file mode 100644 index 000000000..905621076 --- /dev/null +++ b/src/com/android/tradefed/build/OtaToolsDeviceBuildInfo.java @@ -0,0 +1,75 @@ +/* + * Copyright (C) 2016 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.tradefed.build; + +import com.android.tradefed.util.FileUtil; + +import java.io.File; +import java.io.IOException; + +/** + * An {@link OtaDeviceBuildInfo} that also contains an otatools directory. + */ +public class OtaToolsDeviceBuildInfo extends OtaDeviceBuildInfo { + private File mOtaToolsDir; + + /** + * Construct based on an {@link OtaDeviceBuildInfo}. + * @param parent + */ + public OtaToolsDeviceBuildInfo(OtaDeviceBuildInfo parent) { + setBaselineBuild(parent.mBaselineBuild); + setOtaBuild(parent.mOtaBuild); + } + + public void setOtaTools(File otaTools) { + mOtaToolsDir = otaTools; + } + + public File getOtaTools() { + return mOtaToolsDir; + } + + // Allow the OTA package to be overwritten + @Override + public void setOtaPackageFile(File file, String version) { + ((DeviceBuildInfo)mBaselineBuild) + .getVersionedFileMap().put("ota", new VersionedFile(file, version)); + ((DeviceBuildInfo)mOtaBuild) + .getVersionedFileMap().put("ota", new VersionedFile(file, version)); + } + + @Override + public void cleanUp() { + if (mOtaToolsDir != null) mOtaToolsDir.delete(); + super.cleanUp(); + } + + @Override + public IBuildInfo clone() { + try { + OtaToolsDeviceBuildInfo clone = new OtaToolsDeviceBuildInfo( + (OtaDeviceBuildInfo)super.clone()); + File toolsCopy = FileUtil.createTempDir("otatools"); + FileUtil.recursiveHardlink(mOtaToolsDir, toolsCopy); + clone.setOtaTools(toolsCopy); + return clone; + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} + diff --git a/src/com/android/tradefed/targetprep/OtaFaultInjectionPreparer.java b/src/com/android/tradefed/targetprep/OtaFaultInjectionPreparer.java deleted file mode 100644 index 3a6f6fa7a..000000000 --- a/src/com/android/tradefed/targetprep/OtaFaultInjectionPreparer.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (C) 2016 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.tradefed.targetprep; - -import com.android.tradefed.build.IBuildInfo; -import com.android.tradefed.build.IDeviceBuildInfo; -import com.android.tradefed.config.Option; -import com.android.tradefed.device.DeviceNotAvailableException; -import com.android.tradefed.device.ITestDevice; -import com.android.tradefed.util.ArrayUtil; -import com.android.tradefed.util.ZipUtil; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.FileWriter; -import java.io.IOException; -import java.util.zip.ZipOutputStream; - -/** - * An {@link ITargetPreparer} that adds fault injection configuration to an OTA package ZIP. - */ -public class OtaFaultInjectionPreparer implements ITargetPreparer { - - protected static final String CFG_BASE = ".libotafault"; - - @Option(name = "read-fault-file", description = "the filename to trigger a read fault") - protected String mReadFaultFile = null; - - @Option(name = "write-fault-file", description = "the filename to trigger a write fault") - protected String mWriteFaultFile = null; - - @Option(name = "fsync-fault-file", description = "the filename to trigger a fsync fault") - protected String mFsyncFaultFile = null; - - @Option(name = "hit-cache", description = "whether or not to hit /cache/saved.file instead of " - + "the targeted file") - protected boolean mShouldHitCache = false; - - /** - * {@inheritDoc} - */ - @Override - public void setUp(ITestDevice device, IBuildInfo buildInfo) - throws TargetSetupError, BuildError, DeviceNotAvailableException { - if (!(buildInfo instanceof IDeviceBuildInfo)) { - throw new TargetSetupError( - "OtaFaultInjectionPreparer must receive an IDeviceBuildInfo"); - } - IDeviceBuildInfo deviceBuild = (IDeviceBuildInfo) buildInfo; - ZipOutputStream otaPackageStream = null; - try { - otaPackageStream = new ZipOutputStream( - new FileOutputStream(deviceBuild.getOtaPackageFile())); - if (mReadFaultFile != null) { - addToConfig(otaPackageStream, "READ", mReadFaultFile); - } - if (mWriteFaultFile != null) { - addToConfig(otaPackageStream, "WRITE", mWriteFaultFile); - } - if (mFsyncFaultFile != null) { - addToConfig(otaPackageStream, "FSYNC", mFsyncFaultFile); - } - if (mShouldHitCache) { - addToConfig(otaPackageStream, "CACHE", ""); - } - } catch (IOException e) { - throw new TargetSetupError("Could not add config files to OTA zip", e); - } finally { - try { - if (otaPackageStream != null) { - otaPackageStream.close(); - } - } catch (IOException e) { - throw new TargetSetupError("Could not close OTA zip file", e); - } - } - } - - private void addToConfig(ZipOutputStream packageStream, String ioType, String targetFile) - throws IOException { - File cfgFile = new File(ioType); - try { - FileWriter cfgWriter = new FileWriter(cfgFile); - cfgWriter.write(targetFile, 0, targetFile.length()); - cfgWriter.close(); - ZipUtil.addToZip(packageStream, cfgFile, - ArrayUtil.list(CFG_BASE, File.separator)); - } finally { - cfgFile.delete(); - } - } -}
\ No newline at end of file |