Merge "Change IBuildInfo API."
diff --git a/src/com/android/tradefed/build/AppDeviceBuildInfo.java b/src/com/android/tradefed/build/AppDeviceBuildInfo.java
index 247961b..cbe5330 100644
--- a/src/com/android/tradefed/build/AppDeviceBuildInfo.java
+++ b/src/com/android/tradefed/build/AppDeviceBuildInfo.java
@@ -37,6 +37,86 @@
      * {@inheritDoc}
      */
     @Override
+    public String getDeviceBuildId() {
+        return mDeviceBuild.getDeviceBuildId();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public File getDeviceImageFile() {
+        return mDeviceBuild.getDeviceImageFile();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String getDeviceImageVersion() {
+        return mDeviceBuild.getDeviceImageVersion();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setDeviceImageFile(File deviceImageFile, String version) {
+        mDeviceBuild.setDeviceImageFile(deviceImageFile, version);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public File getUserDataImageFile() {
+        return mDeviceBuild.getUserDataImageFile();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String getUserDataImageVersion() {
+        return mDeviceBuild.getUserDataImageVersion();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setUserDataImageFile(File userDataFile, String version) {
+        mDeviceBuild.setUserDataImageFile(userDataFile, version);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public File getTestsDir() {
+        return mDeviceBuild.getTestsDir();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String getTestsDirVersion() {
+        return mDeviceBuild.getTestsDirVersion();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setTestsDir(File testsDir, String version) {
+        mDeviceBuild.setTestsDir(testsDir, version);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
     public File getBasebandImageFile() {
         return mDeviceBuild.getBasebandImageFile();
     }
@@ -53,6 +133,14 @@
      * {@inheritDoc}
      */
     @Override
+    public void setBasebandImage(File basebandFile, String version) {
+        mDeviceBuild.setBasebandImage(basebandFile, version);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
     public File getBootloaderImageFile() {
         return mDeviceBuild.getBootloaderImageFile();
     }
@@ -69,54 +157,6 @@
      * {@inheritDoc}
      */
     @Override
-    public File getDeviceImageFile() {
-        return mDeviceBuild.getDeviceImageFile();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public File getFile(String name) {
-        return mDeviceBuild.getFile(name);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public String getVersion(String name) {
-        return mDeviceBuild.getVersion(name);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public File getTestsDir() {
-        return mDeviceBuild.getTestsDir();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public File getUserDataImageFile() {
-        return mDeviceBuild.getUserDataImageFile();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setBasebandImage(File basebandFile, String version) {
-        mDeviceBuild.setBasebandImage(basebandFile, version);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
     public void setBootloaderImageFile(File bootloaderImgFile, String version) {
         mDeviceBuild.setBootloaderImageFile(bootloaderImgFile, version);
     }
@@ -125,45 +165,6 @@
      * {@inheritDoc}
      */
     @Override
-    public void setDeviceImageFile(File deviceImageFile) {
-        mDeviceBuild.setDeviceImageFile(deviceImageFile);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setFile(String name, File file, String version) {
-        mDeviceBuild.setFile(name, file, version);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setTestsDir(File testsDir) {
-        mDeviceBuild.setTestsDir(testsDir);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setUserDataImageFile(File userDataFile) {
-        mDeviceBuild.setUserDataImageFile(userDataFile);
-    }
-
-    /**
-     * @param deviceBuild
-     */
-    public void setDeviceBuild(IDeviceBuildInfo deviceBuild) {
-        mDeviceBuild = deviceBuild;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
     public File getOtaPackageFile() {
         return mDeviceBuild.getOtaPackageFile();
     }
@@ -172,17 +173,71 @@
      * {@inheritDoc}
      */
     @Override
-    public void setOtaPackageFile(File otaFile) {
-        mDeviceBuild.setOtaPackageFile(otaFile);
+    public String getOtaPackageVersion() {
+        return mDeviceBuild.getOtaPackageVersion();
     }
 
     /**
      * {@inheritDoc}
      */
     @Override
-    public void cleanUp() {
-        mDeviceBuild.cleanUp();
-        mAppBuildInfo.cleanUp();
+    public void setOtaPackageFile(File otaFile, String version) {
+        mDeviceBuild.setOtaPackageFile(otaFile, version);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public File getMkbootimgFile() {
+        return mDeviceBuild.getMkbootimgFile();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String getMkbootimgVersion() {
+        return mDeviceBuild.getMkbootimgVersion();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setMkbootimgFile(File mkbootimg, String version) {
+        mDeviceBuild.setMkbootimgFile(mkbootimg, version);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public File getRamdiskFile() {
+        return mDeviceBuild.getRamdiskFile();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String getRamdiskVersion() {
+        return mDeviceBuild.getRamdiskVersion();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setRamdiskFile(File ramdisk, String version) {
+        mDeviceBuild.setRamdiskFile(ramdisk, version);
+    }
+
+    /**
+     * @param deviceBuild
+     */
+    public void setDeviceBuild(IDeviceBuildInfo deviceBuild) {
+        mDeviceBuild = deviceBuild;
     }
 
     /**
@@ -212,6 +267,15 @@
      * {@inheritDoc}
      */
     @Override
+    public void cleanUp() {
+        mDeviceBuild.cleanUp();
+        mAppBuildInfo.cleanUp();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
     public IBuildInfo clone() {
         AppDeviceBuildInfo copy = new AppDeviceBuildInfo(getBuildId(), getTestTag(),
                 getBuildTargetName());
diff --git a/src/com/android/tradefed/build/BuildInfo.java b/src/com/android/tradefed/build/BuildInfo.java
index f2ce892..49c65d0 100644
--- a/src/com/android/tradefed/build/BuildInfo.java
+++ b/src/com/android/tradefed/build/BuildInfo.java
@@ -15,30 +15,57 @@
  */
 package com.android.tradefed.build;
 
+import com.android.tradefed.log.LogUtil.CLog;
+import com.android.tradefed.util.FileUtil;
 import com.android.tradefed.util.MultiMap;
 import com.android.tradefed.util.UniqueMultiMap;
 import com.google.common.base.Objects;
 
+import java.io.File;
+import java.io.IOException;
+import java.util.Hashtable;
 import java.util.Map;
 
 /**
  * Generic implementation of a {@link IBuildInfo}.
  */
 public class BuildInfo implements IBuildInfo {
-
-    private String mBuildInfo = "0";
+    private String mBuildId = "0";
     private String mTestTag = "stub";
     private String mBuildTargetName = "stub";
     private final UniqueMultiMap<String, String> mBuildAttributes =
             new UniqueMultiMap<String, String>();
+    private Map<String, VersionedFile> mVersionedFileMap;
     private String mBuildFlavor = null;
     private String mBuildBranch = null;
     private String mDeviceSerial = null;
 
     /**
+     * Data structure containing the image file and related metadata
+     */
+    private static class VersionedFile {
+        private final File mFile;
+        private final String mVersion;
+
+        VersionedFile(File file, String version) {
+            mFile = file;
+            mVersion = version;
+        }
+
+        File getFile() {
+            return mFile;
+        }
+
+        String getVersion() {
+            return mVersion;
+        }
+    }
+
+    /**
      * Creates a {@link BuildInfo} using default attribute values.
      */
     public BuildInfo() {
+        mVersionedFileMap = new Hashtable<String, VersionedFile>();
     }
 
     /**
@@ -49,9 +76,10 @@
      * @param buildTargetName the build target name
      */
     public BuildInfo(String buildId, String testTag, String buildTargetName) {
-        mBuildInfo = buildId;
+        mBuildId = buildId;
         mTestTag = testTag;
         mBuildTargetName = buildTargetName;
+        mVersionedFileMap = new Hashtable<String, VersionedFile>();
     }
 
     /**
@@ -62,6 +90,11 @@
     BuildInfo(BuildInfo buildToCopy) {
         this(buildToCopy.getBuildId(), buildToCopy.getTestTag(), buildToCopy.getBuildTargetName());
         addAllBuildAttributes(buildToCopy);
+        try {
+            addAllFiles(buildToCopy);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
     }
 
     /**
@@ -69,7 +102,7 @@
      */
     @Override
     public String getBuildId() {
-        return mBuildInfo;
+        return mBuildId;
     }
 
     /**
@@ -115,7 +148,7 @@
     /**
      * Helper method to copy build attributes, branch, and flavor from other build.
      */
-    public void addAllBuildAttributes(BuildInfo build) {
+    protected void addAllBuildAttributes(BuildInfo build) {
         mBuildAttributes.putAll(build.getAttributesMultiMap());
         setBuildFlavor(build.getBuildFlavor());
         setBuildBranch(build.getBuildBranch());
@@ -126,11 +159,82 @@
     }
 
     /**
+     * Helper method to copy all files from the other build.
+     * <p>
+     * Creates new hardlinks to the files so that each build will have a unique file path to the
+     * file.
+     * </p>
+     *
+     * @throws IOException if an exception is thrown when creating the hardlinks.
+     */
+    protected void addAllFiles(BuildInfo build) throws IOException {
+        for (Map.Entry<String, VersionedFile> fileEntry : build.getVersionedFileMap().entrySet()) {
+            File origFile = fileEntry.getValue().getFile();
+            File copyFile;
+            if (origFile.isDirectory()) {
+                copyFile = FileUtil.createTempDir(fileEntry.getKey());
+                FileUtil.recursiveHardlink(origFile, copyFile);
+            } else {
+                // Only using createTempFile to create a unique dest filename
+                copyFile = FileUtil.createTempFile(fileEntry.getKey(),
+                        FileUtil.getExtension(origFile.getName()));
+                copyFile.delete();
+                FileUtil.hardlinkFile(origFile, copyFile);
+            }
+            setFile(fileEntry.getKey(), copyFile, fileEntry.getValue().getVersion());
+        }
+    }
+
+    protected Map<String, VersionedFile> getVersionedFileMap() {
+        return mVersionedFileMap;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public File getFile(String name) {
+        VersionedFile fileRecord = mVersionedFileMap.get(name);
+        if (fileRecord != null) {
+            return fileRecord.getFile();
+        }
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String getVersion(String name) {
+        VersionedFile fileRecord = mVersionedFileMap.get(name);
+        if (fileRecord != null) {
+            return fileRecord.getVersion();
+        }
+        return null;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setFile(String name, File file, String version) {
+        if (mVersionedFileMap.containsKey(name)) {
+            CLog.e("Device build already contains a file for %s in thread %s", name,
+                    Thread.currentThread().getName());
+            return;
+        }
+        mVersionedFileMap.put(name, new VersionedFile(file, version));
+    }
+
+    /**
      * {@inheritDoc}
      */
     @Override
     public void cleanUp() {
-        // ignore
+        for (VersionedFile fileRecord : mVersionedFileMap.values()) {
+            FileUtil.recursiveDelete(fileRecord.getFile());
+        }
+        mVersionedFileMap.clear();
     }
 
     /**
@@ -138,11 +242,16 @@
      */
     @Override
     public IBuildInfo clone() {
-        BuildInfo copy = new BuildInfo(mBuildInfo, mTestTag, mBuildTargetName);
+        BuildInfo copy = new BuildInfo(mBuildId, mTestTag, mBuildTargetName);
         copy.addAllBuildAttributes(this);
+        try {
+            copy.addAllFiles(this);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
         copy.setBuildBranch(mBuildBranch);
         copy.setBuildFlavor(mBuildFlavor);
-        // don't copy device serial
+
         return copy;
     }
 
@@ -191,7 +300,7 @@
      */
     @Override
     public int hashCode() {
-        return Objects.hashCode(mBuildAttributes, mBuildBranch, mBuildFlavor, mBuildInfo,
+        return Objects.hashCode(mBuildAttributes, mBuildBranch, mBuildFlavor, mBuildId,
                 mBuildTargetName, mTestTag, mDeviceSerial);
     }
 
@@ -213,7 +322,7 @@
         return Objects.equal(mBuildAttributes, other.mBuildAttributes) &&
                 Objects.equal(mBuildBranch, other.mBuildBranch) &&
                 Objects.equal(mBuildFlavor, other.mBuildFlavor) &&
-                Objects.equal(mBuildInfo, other.mBuildInfo) &&
+                Objects.equal(mBuildId, other.mBuildId) &&
                 Objects.equal(mBuildTargetName, other.mBuildTargetName) &&
                 Objects.equal(mTestTag, other.mTestTag) &&
                 Objects.equal(mDeviceSerial, other.mDeviceSerial);
diff --git a/src/com/android/tradefed/build/DeviceBuildInfo.java b/src/com/android/tradefed/build/DeviceBuildInfo.java
index ac97850..e1f9e9e 100644
--- a/src/com/android/tradefed/build/DeviceBuildInfo.java
+++ b/src/com/android/tradefed/build/DeviceBuildInfo.java
@@ -16,103 +16,47 @@
 
 package com.android.tradefed.build;
 
-import com.android.ddmlib.Log;
-import com.android.tradefed.util.FileUtil;
-
 import java.io.File;
 import java.io.IOException;
-import java.util.Hashtable;
-import java.util.Map;
 
 /**
  * A {@link IBuildInfo} that represents a complete Android device build and (optionally) its tests.
  */
 public class DeviceBuildInfo extends BuildInfo implements IDeviceBuildInfo {
 
-    private static final String LOG_TAG = "DeviceBuildInfo";
-
-    private Map<String, VersionedFile> mVersionedFileMap;
-
     private static final String DEVICE_IMAGE_NAME = "device";
     private static final String USERDATA_IMAGE_NAME = "userdata";
     private static final String TESTDIR_IMAGE_NAME = "testsdir";
     private static final String BASEBAND_IMAGE_NAME = "baseband";
     private static final String BOOTLOADER_IMAGE_NAME = "bootloader";
     private static final String OTA_IMAGE_NAME = "ota";
-
-    /**
-     * Data structure containing the image file and related metadata
-     */
-    private static class VersionedFile {
-        private final File mFile;
-        private final String mVersion;
-
-        VersionedFile(File file, String version) {
-            mFile = file;
-            mVersion = version;
-        }
-
-        File getFile() {
-            return mFile;
-        }
-
-        String getVersion() {
-            return mVersion;
-        }
-    }
+    private static final String MKBOOTIMG_IMAGE_NAME = "mkbootimg";
+    private static final String RAMDISK_IMAGE_NAME = "ramdisk";
 
     public DeviceBuildInfo() {
-        mVersionedFileMap = new Hashtable<String, VersionedFile>();
+        super();
+    }
+
+    public DeviceBuildInfo(String buildId, String testTag, String buildTargetName) {
+        super(buildId, testTag, buildTargetName);
+    }
+
+    public DeviceBuildInfo(BuildInfo buildInfo) {
+        super(buildInfo);
     }
 
     /**
-     * Creates a {@link DeviceBuildInfo}.
+     * {@inheritDoc}
      *
-     * @param buildId the unique build id
-     * @param testTarget the test target name
-     * @param buildName the build name
-     */
-    public DeviceBuildInfo(String buildId, String testTarget, String buildName) {
-        super(buildId, testTarget, buildName);
-        mVersionedFileMap = new Hashtable<String, VersionedFile>();
-    }
-
-    /**
-     * {@inheritDoc}
+     * @return {@link #getDeviceImageVersion()} if not {@code null}, else
+     * {@link IBuildInfo#UNKNOWN_BUILD_ID}
+     *
+     * @see #getDeviceImageVersion()
      */
     @Override
-    public File getFile(String name) {
-        VersionedFile fileRecord = mVersionedFileMap.get(name);
-        if (fileRecord != null) {
-            return fileRecord.getFile();
-        }
-        return null;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public String getVersion(String name) {
-        VersionedFile fileRecord = mVersionedFileMap.get(name);
-        if (fileRecord != null) {
-            return fileRecord.getVersion();
-        }
-        return null;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setFile(String name, File file, String version) {
-        if (mVersionedFileMap.containsKey(name)) {
-            Log.e(LOG_TAG, String.format(
-                    "Device build already contains a file for %s in thread %s", name,
-                    Thread.currentThread().getName()));
-            return;
-        }
-        mVersionedFileMap.put(name, new VersionedFile(file, version));
+    public String getDeviceBuildId() {
+        String buildId = getDeviceImageVersion();
+        return buildId == null ? UNKNOWN_BUILD_ID : buildId;
     }
 
     /**
@@ -127,8 +71,16 @@
      * {@inheritDoc}
      */
     @Override
-    public void setDeviceImageFile(File deviceImageFile) {
-        setFile(DEVICE_IMAGE_NAME, deviceImageFile, getBuildId());
+    public String getDeviceImageVersion() {
+        return getVersion(DEVICE_IMAGE_NAME);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setDeviceImageFile(File deviceImageFile, String version) {
+        setFile(DEVICE_IMAGE_NAME, deviceImageFile, version);
     }
 
     /**
@@ -143,8 +95,16 @@
      * {@inheritDoc}
      */
     @Override
-    public void setUserDataImageFile(File userDataFile) {
-        setFile(USERDATA_IMAGE_NAME, userDataFile, getBuildId());
+    public String getUserDataImageVersion() {
+        return getVersion(USERDATA_IMAGE_NAME);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setUserDataImageFile(File userDataFile, String version) {
+        setFile(USERDATA_IMAGE_NAME, userDataFile, version);
     }
 
     /**
@@ -159,8 +119,16 @@
      * {@inheritDoc}
      */
     @Override
-    public void setTestsDir(File testsDir) {
-        setFile(TESTDIR_IMAGE_NAME, testsDir, getBuildId());
+    public String getTestsDirVersion() {
+        return getVersion(TESTDIR_IMAGE_NAME);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setTestsDir(File testsDir, String version) {
+        setFile(TESTDIR_IMAGE_NAME, testsDir, version);
     }
 
     /**
@@ -223,49 +191,82 @@
      * {@inheritDoc}
      */
     @Override
-    public void setOtaPackageFile(File otaFile) {
-        setFile(OTA_IMAGE_NAME, otaFile, getBuildId());
+    public String getOtaPackageVersion() {
+        return getVersion(OTA_IMAGE_NAME);
     }
 
     /**
      * {@inheritDoc}
      */
     @Override
-    public void cleanUp() {
-        for (VersionedFile fileRecord : mVersionedFileMap.values()) {
-            FileUtil.recursiveDelete(fileRecord.getFile());
-        }
-        mVersionedFileMap.clear();
+    public void setOtaPackageFile(File otaFile, String version) {
+        setFile(OTA_IMAGE_NAME, otaFile, version);
     }
 
     /**
      * {@inheritDoc}
      */
     @Override
-    public IBuildInfo clone()  {
+    public File getMkbootimgFile() {
+        return getFile(MKBOOTIMG_IMAGE_NAME);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String getMkbootimgVersion() {
+        return getVersion(MKBOOTIMG_IMAGE_NAME);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setMkbootimgFile(File mkbootimg, String version) {
+        setFile(MKBOOTIMG_IMAGE_NAME, mkbootimg, version);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public File getRamdiskFile() {
+        return getFile(RAMDISK_IMAGE_NAME);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String getRamdiskVersion() {
+        return getVersion(RAMDISK_IMAGE_NAME);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setRamdiskFile(File ramdisk, String version) {
+        setFile(RAMDISK_IMAGE_NAME, ramdisk, version);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public IBuildInfo clone() {
+        DeviceBuildInfo copy = new DeviceBuildInfo(getBuildId(), getTestTag(),
+                getBuildTargetName());
+        copy.addAllBuildAttributes(this);
         try {
-            DeviceBuildInfo copy = new DeviceBuildInfo(getBuildId(), getTestTag(),
-                    getBuildTargetName());
-            copy.addAllBuildAttributes(this);
-            for (Map.Entry<String, VersionedFile> fileEntry : mVersionedFileMap.entrySet()) {
-                File origFile = fileEntry.getValue().getFile();
-                File hardlinkFile;
-                if (origFile.isDirectory()) {
-                    hardlinkFile = FileUtil.createTempDir(fileEntry.getKey());
-                    FileUtil.recursiveHardlink(origFile, hardlinkFile);
-                } else {
-                    // Only using createTempFile to create a unique dest filename
-                    hardlinkFile = FileUtil.createTempFile(fileEntry.getKey(),
-                            FileUtil.getExtension(origFile.getName()));
-                    hardlinkFile.delete();
-                    FileUtil.hardlinkFile(origFile, hardlinkFile);
-                }
-                copy.mVersionedFileMap.put(fileEntry.getKey(), new VersionedFile(hardlinkFile,
-                             fileEntry.getValue().getVersion()));
-            }
-            return copy;
+            copy.addAllFiles(this);
         } catch (IOException e) {
             throw new RuntimeException(e);
         }
+        copy.setBuildBranch(getBuildBranch());
+        copy.setBuildFlavor(getBuildFlavor());
+
+        return copy;
     }
 }
diff --git a/src/com/android/tradefed/build/DeviceFolderBuildInfo.java b/src/com/android/tradefed/build/DeviceFolderBuildInfo.java
index 941308e..f21e454 100644
--- a/src/com/android/tradefed/build/DeviceFolderBuildInfo.java
+++ b/src/com/android/tradefed/build/DeviceFolderBuildInfo.java
@@ -43,6 +43,86 @@
      * {@inheritDoc}
      */
     @Override
+    public String getDeviceBuildId() {
+        return mDeviceBuild.getDeviceBuildId();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public File getDeviceImageFile() {
+        return mDeviceBuild.getDeviceImageFile();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String getDeviceImageVersion() {
+        return mDeviceBuild.getDeviceImageVersion();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setDeviceImageFile(File deviceImageFile, String version) {
+        mDeviceBuild.setDeviceImageFile(deviceImageFile, version);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public File getUserDataImageFile() {
+        return mDeviceBuild.getUserDataImageFile();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String getUserDataImageVersion() {
+        return mDeviceBuild.getUserDataImageVersion();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setUserDataImageFile(File userDataFile, String version) {
+        mDeviceBuild.setUserDataImageFile(userDataFile, version);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public File getTestsDir() {
+        return mDeviceBuild.getTestsDir();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String getTestsDirVersion() {
+        return mDeviceBuild.getTestsDirVersion();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setTestsDir(File testsDir, String version) {
+        mDeviceBuild.setTestsDir(testsDir, version);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
     public File getBasebandImageFile() {
         return mDeviceBuild.getBasebandImageFile();
     }
@@ -59,6 +139,14 @@
      * {@inheritDoc}
      */
     @Override
+    public void setBasebandImage(File basebandFile, String version) {
+        mDeviceBuild.setBasebandImage(basebandFile, version);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
     public File getBootloaderImageFile() {
         return mDeviceBuild.getBootloaderImageFile();
     }
@@ -75,54 +163,6 @@
      * {@inheritDoc}
      */
     @Override
-    public File getDeviceImageFile() {
-        return mDeviceBuild.getDeviceImageFile();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public File getFile(String name) {
-        return mDeviceBuild.getFile(name);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public String getVersion(String name) {
-        return mDeviceBuild.getVersion(name);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public File getTestsDir() {
-        return mDeviceBuild.getTestsDir();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public File getUserDataImageFile() {
-        return mDeviceBuild.getUserDataImageFile();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setBasebandImage(File basebandFile, String version) {
-        mDeviceBuild.setBasebandImage(basebandFile, version);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
     public void setBootloaderImageFile(File bootloaderImgFile, String version) {
         mDeviceBuild.setBootloaderImageFile(bootloaderImgFile, version);
     }
@@ -131,38 +171,80 @@
      * {@inheritDoc}
      */
     @Override
-    public void setDeviceImageFile(File deviceImageFile) {
-        mDeviceBuild.setDeviceImageFile(deviceImageFile);
+    public File getOtaPackageFile() {
+        return mDeviceBuild.getOtaPackageFile();
     }
 
     /**
      * {@inheritDoc}
      */
     @Override
-    public void setFile(String imageName, File file, String version) {
-        mDeviceBuild.setFile(imageName, file, version);
+    public String getOtaPackageVersion() {
+        return mDeviceBuild.getOtaPackageVersion();
     }
 
     /**
      * {@inheritDoc}
      */
     @Override
-    public void setTestsDir(File testsDir) {
-        mDeviceBuild.setTestsDir(testsDir);
+    public void setOtaPackageFile(File otaFile, String version) {
+        mDeviceBuild.setOtaPackageFile(otaFile, version);
     }
 
     /**
      * {@inheritDoc}
      */
     @Override
-    public void setUserDataImageFile(File userDataFile) {
-        mDeviceBuild.setUserDataImageFile(userDataFile);
+    public File getMkbootimgFile() {
+        return mDeviceBuild.getMkbootimgFile();
     }
 
     /**
      * {@inheritDoc}
      */
     @Override
+    public String getMkbootimgVersion() {
+        return mDeviceBuild.getMkbootimgVersion();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setMkbootimgFile(File mkbootimg, String version) {
+        mDeviceBuild.setMkbootimgFile(mkbootimg, version);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public File getRamdiskFile() {
+        return mDeviceBuild.getRamdiskFile();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String getRamdiskVersion() {
+        return mDeviceBuild.getRamdiskVersion();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setRamdiskFile(File ramdisk, String version) {
+        mDeviceBuild.setRamdiskFile(ramdisk, version);
+    }
+
+
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
     public File getRootDir() {
         return mFolderBuild.getRootDir();
     }
@@ -189,21 +271,6 @@
         mDeviceBuild = deviceBuild;
     }
 
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public File getOtaPackageFile() {
-        return mDeviceBuild.getOtaPackageFile();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setOtaPackageFile(File otaFile) {
-        mDeviceBuild.setOtaPackageFile(otaFile);
-    }
 
     /**
      * {@inheritDoc}
diff --git a/src/com/android/tradefed/build/IBuildInfo.java b/src/com/android/tradefed/build/IBuildInfo.java
index 7331040..cd71c8c 100644
--- a/src/com/android/tradefed/build/IBuildInfo.java
+++ b/src/com/android/tradefed/build/IBuildInfo.java
@@ -17,6 +17,7 @@
 
 import com.android.tradefed.device.ITestDevice;
 
+import java.io.File;
 import java.util.Map;
 
 /**
@@ -109,13 +110,37 @@
      */
     public void addBuildAttribute(String attributeName, String attributeValue);
 
+
+    /**
+     * Helper method to retrieve a file with given name.
+     * @param name
+     * @return the image file or <code>null</code> if not found
+     */
+    public File getFile(String name);
+
+    /**
+     * Helper method to retrieve a file version with given name.
+     * @param name
+     * @return the image version or <code>null</code> if not found
+     */
+    public String getVersion(String name);
+
+    /**
+     * Stores an file with given name in this build info.
+     *
+     * @param name the unique name of the file
+     * @param file the local {@link File}
+     * @param version the file version
+     */
+    public void setFile(String name, File file, String version);
+
     /**
      * Clean up any temporary build files
      */
     public void cleanUp();
 
     /**
-     * @return
+     * Clones the {@link IBuildInfo} object.
      */
     public IBuildInfo clone();
 
diff --git a/src/com/android/tradefed/build/IDeviceBuildInfo.java b/src/com/android/tradefed/build/IDeviceBuildInfo.java
index afcf2ff..3333409 100644
--- a/src/com/android/tradefed/build/IDeviceBuildInfo.java
+++ b/src/com/android/tradefed/build/IDeviceBuildInfo.java
@@ -24,27 +24,10 @@
 public interface IDeviceBuildInfo extends IBuildInfo {
 
     /**
-     * Helper method to retrieve a file with given name.
-     * @param name
-     * @return the image file or <code>null</code> if not found
+     * Returns the unique identifier of platform build under test. Should never be null. Defaults to
+     * {@link #UNKNOWN_BUILD_ID}.
      */
-    public File getFile(String name);
-
-    /**
-     * Helper method to retrieve a file version with given name.
-     * @param name
-     * @return the image version or <code>null</code> if not found
-     */
-    public String getVersion(String name);
-
-    /**
-     * Stores an file with given name in this build info
-     *
-     * @param name the unique name of the file
-     * @param file the local {@link File}
-     * @param version the file version
-     */
-    public void setFile(String name, File file, String version);
+    public String getDeviceBuildId();
 
     /**
      * Get the local device image zip file.
@@ -52,11 +35,16 @@
     public File getDeviceImageFile();
 
     /**
+     * Get the local device image zip version.
+     */
+    public String getDeviceImageVersion();
+
+    /**
      * Set the device system image file to use.
      *
      * @param deviceImageFile
      */
-    public void setDeviceImageFile(File deviceImageFile);
+    public void setDeviceImageFile(File deviceImageFile, String version);
 
     /**
      * Get the local test userdata image file.
@@ -64,11 +52,16 @@
     public File getUserDataImageFile();
 
     /**
+     * Get the local test userdata image version.
+     */
+    public String getUserDataImageVersion();
+
+    /**
      * Set the user data image file to use.
      *
      * @param userDataFile
      */
-    public void setUserDataImageFile(File userDataFile);
+    public void setUserDataImageFile(File userDataFile, String version);
 
     /**
      * Get the local path to the extracted tests.zip file contents.
@@ -76,11 +69,16 @@
     public File getTestsDir();
 
     /**
+     * Get the extracted tests.zip version.
+     */
+    public String getTestsDirVersion();
+
+    /**
      * Set local path to the extracted tests.zip file contents.
      *
      * @param testsZipFile
      */
-    public void setTestsDir(File testsZipFile);
+    public void setTestsDir(File testsZipFile, String version);
 
     /**
      * Get the local baseband image file.
@@ -119,17 +117,52 @@
     public void setBootloaderImageFile(File bootloaderImgFile, String version);
 
     /**
-     * Get the device OTA package zip file
+     * Get the device OTA package zip file.
      */
     public File getOtaPackageFile();
 
     /**
-     * Set the device OTA package zip file
+     * Get the device OTA package zip version.
      */
-    public void setOtaPackageFile(File otaFile);
+    public String getOtaPackageVersion();
 
     /**
-     * Removes all temporary files
+     * Set the device OTA package zip file.
+     */
+    public void setOtaPackageFile(File otaFile, String version);
+
+    /**
+     * Gets the mkbootimg file used to create the kernel image.
+     */
+    public File getMkbootimgFile();
+
+    /**
+     * Gets the mkbootimg version.
+     */
+    public String getMkbootimgVersion();
+
+    /**
+     * Sets the mkbootimg file used to create the kernel image.
+     */
+    public void setMkbootimgFile(File mkbootimg, String version);
+
+    /**
+     * Gets the ramdisk file used to create the kernel image.
+     */
+    public File getRamdiskFile();
+
+    /**
+     * Gets the ramdisk version.
+     */
+    public String getRamdiskVersion();
+
+    /**
+     * Gets the ramdisk file used to create the kernel image.
+     */
+    public void setRamdiskFile(File ramdisk, String version);
+
+    /**
+     * Removes all temporary files.
      */
     @Override
     public void cleanUp();
diff --git a/src/com/android/tradefed/build/LocalBuildProvider.java b/src/com/android/tradefed/build/LocalBuildProvider.java
index 4a69bd0..658dc05 100644
--- a/src/com/android/tradefed/build/LocalBuildProvider.java
+++ b/src/com/android/tradefed/build/LocalBuildProvider.java
@@ -63,15 +63,15 @@
         buildInfo.addAllBuildAttributes(stubBuild);
 
         try {
-            buildInfo.setDeviceImageFile(mDeviceImageFile);
+            buildInfo.setDeviceImageFile(mDeviceImageFile, stubBuild.getBuildId());
             if (mTestsDir != null) {
-                buildInfo.setTestsDir(mTestsDir);
+                buildInfo.setTestsDir(mTestsDir, stubBuild.getBuildId());
             } else {
                 CLog.d("Null Test Dir, if you want to pass a test dir, use --%s",
                         TEST_DIR_OPTION_NAME);
             }
             if (mUserDataFile != null) {
-                buildInfo.setUserDataImageFile(mUserDataFile);
+                buildInfo.setUserDataImageFile(mUserDataFile, stubBuild.getBuildId());
             } else {
                 CLog.d("Null User Data File, if you want to pass a user data file, use --%s",
                         DATA_FILE_OPTION_NAME);
diff --git a/src/com/android/tradefed/build/OtaZipfileBuildProvider.java b/src/com/android/tradefed/build/OtaZipfileBuildProvider.java
index 050f160..74c5353 100644
--- a/src/com/android/tradefed/build/OtaZipfileBuildProvider.java
+++ b/src/com/android/tradefed/build/OtaZipfileBuildProvider.java
@@ -51,7 +51,7 @@
         }
         String bid = buildProp.getProperty("ro.build.version.incremental");
         IDeviceBuildInfo buildInfo = new DeviceBuildInfo(bid, "flasher", bid);
-        buildInfo.setOtaPackageFile(new File(getOtaPath()));
+        buildInfo.setOtaPackageFile(new File(getOtaPath()), bid);
         return buildInfo;
 
     }
diff --git a/src/com/android/tradefed/targetprep/DeviceFlashPreparer.java b/src/com/android/tradefed/targetprep/DeviceFlashPreparer.java
index 9436611..3710e1b 100644
--- a/src/com/android/tradefed/targetprep/DeviceFlashPreparer.java
+++ b/src/com/android/tradefed/targetprep/DeviceFlashPreparer.java
@@ -117,7 +117,7 @@
             // assume this is a build problem
             throw new BuildError(String.format(
                     "Device %s did not become available after flashing %s",
-                    device.getSerialNumber(), buildInfo.getBuildId()));
+                    device.getSerialNumber(), deviceBuild.getDeviceBuildId()));
         }
         device.postBootSetup();
     }
diff --git a/src/com/android/tradefed/targetprep/FastbootDeviceFlasher.java b/src/com/android/tradefed/targetprep/FastbootDeviceFlasher.java
index 188156a..32db264 100644
--- a/src/com/android/tradefed/targetprep/FastbootDeviceFlasher.java
+++ b/src/com/android/tradefed/targetprep/FastbootDeviceFlasher.java
@@ -85,7 +85,7 @@
             DeviceNotAvailableException {
 
         CLog.i("Flashing device %s with build %s", device.getSerialNumber(),
-                deviceBuild.getBuildId());
+                deviceBuild.getDeviceBuildId());
 
         // get system build id before booting into fastboot
         String systemBuildId = device.getBuildId();
@@ -142,7 +142,7 @@
 
         if (resourceParser.getRequiredBoards() == null) {
             throw new TargetSetupError(String.format("Build %s is missing required board info.",
-                    localBuild.getBuildId()));
+                    localBuild.getDeviceBuildId()));
         }
         String deviceProductType = device.getProductType();
         if (deviceProductType == null) {
@@ -413,8 +413,8 @@
     protected boolean checkAndFlashSystem(ITestDevice device, String systemBuildId,
             IDeviceBuildInfo deviceBuild) throws DeviceNotAvailableException, TargetSetupError {
         if (mForceSystemFlash ||
-                (systemBuildId != null && ! systemBuildId.equals(deviceBuild.getBuildId()))) {
-            CLog.i("Flashing system %s", deviceBuild.getBuildId());
+                (systemBuildId != null && !systemBuildId.equals(deviceBuild.getDeviceBuildId()))) {
+            CLog.i("Flashing system %s", deviceBuild.getDeviceBuildId());
             flashSystem(device, deviceBuild);
             return true;
         } else {
diff --git a/src/com/android/tradefed/targetprep/SystemUpdaterDeviceFlasher.java b/src/com/android/tradefed/targetprep/SystemUpdaterDeviceFlasher.java
index 3c63a8a..f799915 100644
--- a/src/com/android/tradefed/targetprep/SystemUpdaterDeviceFlasher.java
+++ b/src/com/android/tradefed/targetprep/SystemUpdaterDeviceFlasher.java
@@ -21,6 +21,7 @@
 import com.android.tradefed.device.DeviceNotAvailableException;
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.log.LogUtil.CLog;
+import com.android.tradefed.targetprep.IDeviceFlasher.UserDataFlashOption;
 
 import java.io.File;
 import java.util.Arrays;
@@ -61,8 +62,8 @@
     @Override
     public void flash(ITestDevice device, IDeviceBuildInfo deviceBuild)
             throws DeviceNotAvailableException, TargetSetupError {
-        CLog.i("Flashing device " + device.getSerialNumber() + " with build "
-            + deviceBuild.getBuildId());
+        CLog.i("Flashing device %s  with build %s", device.getSerialNumber(),
+            deviceBuild.getDeviceBuildId());
 
         // TODO could add a check for bootloader versions and install
         // the one produced by the build server @ the current build if the one
@@ -81,17 +82,17 @@
             throws DeviceNotAvailableException, TargetSetupError {
         // FIXME same high level logic as in
         // FastbootDeviceFlasher#checkAndFlashSystem, could be de-duped
-        if (!mForceSystemFlash && deviceBuild.getBuildId().equals(device.getBuildId())) {
-            CLog.i("System is already version " + device.getBuildId() + ", skipping install");
+        if (!mForceSystemFlash && deviceBuild.getDeviceBuildId().equals(device.getBuildId())) {
+            CLog.i("System is already version %s, skipping install" , device.getBuildId());
             // reboot
             return false;
         }
-        CLog.i("Flashing system " + deviceBuild.getBuildId() + " on device "
-            + device.getSerialNumber());
+        CLog.i("Flashing system %s on device %s", deviceBuild.getDeviceBuildId(),
+            device.getSerialNumber());
         File otaPackageFile = deviceBuild.getOtaPackageFile();
         if (otaPackageFile == null) {
             throw new TargetSetupError("No OTA package file present for build "
-                    + deviceBuild.getBuildId());
+                    + deviceBuild.getDeviceBuildId());
         }
         if (!device.pushFile(otaPackageFile, "/cache/update.zip")) {
             throw new TargetSetupError("Could not push OTA file to the target.");
diff --git a/tests/src/com/android/tradefed/build/BuildInfoTest.java b/tests/src/com/android/tradefed/build/BuildInfoTest.java
new file mode 100644
index 0000000..98ea4cd
--- /dev/null
+++ b/tests/src/com/android/tradefed/build/BuildInfoTest.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2011 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 junit.framework.TestCase;
+
+import java.io.File;
+
+/**
+ * Unit tests for {@link BuildInfo}.
+ */
+public class BuildInfoTest extends TestCase {
+    private static final String VERSION = "2";
+    private static final String ATTRIBUTE_KEY = "attribute";
+    private static final String FILE_KEY = "file";
+
+    private BuildInfo mBuildInfo;
+    private File mFile;
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        mBuildInfo = new BuildInfo("1", "build", "target");
+        mBuildInfo.addBuildAttribute(ATTRIBUTE_KEY, "value");
+        mFile = FileUtil.createTempFile("image", "tmp");
+        FileUtil.writeToFile("filedata", mFile);
+        mBuildInfo.setFile(FILE_KEY, mFile, VERSION);
+    }
+
+    @Override
+    protected void tearDown() throws Exception {
+        super.tearDown();
+        if (mFile != null && mFile.exists()) {
+            mFile.delete();
+        }
+    }
+
+    /**
+     * Test method for {@link BuildInfo#clone()}.
+     */
+    public void testClone() throws Exception {
+        BuildInfo copy = (BuildInfo) mBuildInfo.clone();
+        assertEquals(mBuildInfo.getBuildAttributes().get(ATTRIBUTE_KEY),
+                copy.getBuildAttributes().get(ATTRIBUTE_KEY));
+        try {
+            // ensure a copy of mImageFile was created
+            assertEquals(VERSION, copy.getVersion(FILE_KEY));
+            assertTrue(!mFile.getAbsolutePath().equals(copy.getFile(FILE_KEY)));
+            assertTrue(FileUtil.compareFileContents(mFile, copy.getFile(FILE_KEY)));
+        } finally {
+            FileUtil.deleteFile(copy.getFile(FILE_KEY));
+        }
+    }
+
+    /**
+     * Test method for {@link BuildInfo#cleanUp()}.
+     */
+    public void testCleanUp() {
+        assertTrue(mBuildInfo.getFile(FILE_KEY).exists());
+        mBuildInfo.cleanUp();
+        assertNull(mBuildInfo.getFile(FILE_KEY));
+        assertFalse(mFile.exists());
+    }
+}
diff --git a/tests/src/com/android/tradefed/build/DeviceBuildInfoTest.java b/tests/src/com/android/tradefed/build/DeviceBuildInfoTest.java
index d81407a..4e10d3a 100644
--- a/tests/src/com/android/tradefed/build/DeviceBuildInfoTest.java
+++ b/tests/src/com/android/tradefed/build/DeviceBuildInfoTest.java
@@ -64,6 +64,9 @@
         }
     }
 
+    /**
+     * Test method for {@link DeviceBuildInfo#cleanUp()}.
+     */
     public void testCleanUp() {
         assertTrue(mBuildInfo.getBasebandImageFile().exists());
         mBuildInfo.cleanUp();
diff --git a/tests/src/com/android/tradefed/device/TestDeviceTest.java b/tests/src/com/android/tradefed/device/TestDeviceTest.java
index 6bbff9e..aa3cf8e 100644
--- a/tests/src/com/android/tradefed/device/TestDeviceTest.java
+++ b/tests/src/com/android/tradefed/device/TestDeviceTest.java
@@ -891,7 +891,6 @@
                 mMockIDevice);
         setEnableAdbRootExpectations();
         setEncryptedUnsupportedExpectations();
-        setEncryptedUnsupportedExpectations();
         EasyMock.expect(mMockMonitor.waitForDeviceAvailable(EasyMock.anyLong())).andReturn(null);
         mMockRecovery.recoverDevice(mMockMonitor, false);
         replayMocks();
diff --git a/tests/src/com/android/tradefed/targetprep/FastbootDeviceFlasherTest.java b/tests/src/com/android/tradefed/targetprep/FastbootDeviceFlasherTest.java
index 7350a02..0bae3be 100644
--- a/tests/src/com/android/tradefed/targetprep/FastbootDeviceFlasherTest.java
+++ b/tests/src/com/android/tradefed/targetprep/FastbootDeviceFlasherTest.java
@@ -57,8 +57,8 @@
         EasyMock.expect(mMockDevice.getProductType()).andStubReturn(TEST_STRING);
         EasyMock.expect(mMockDevice.getBuildId()).andStubReturn("1");
         mMockBuildInfo = new DeviceBuildInfo("0", TEST_STRING, TEST_STRING);
-        mMockBuildInfo.setDeviceImageFile(new File(TEST_STRING));
-        mMockBuildInfo.setUserDataImageFile(new File(TEST_STRING));
+        mMockBuildInfo.setDeviceImageFile(new File(TEST_STRING), "0");
+        mMockBuildInfo.setUserDataImageFile(new File(TEST_STRING), "0");
         mMockRetriever = EasyMock.createNiceMock(IFlashingResourcesRetriever.class);
         mMockParser = EasyMock.createNiceMock(IFlashingResourcesParser.class);
 
diff --git a/tests/src/com/android/tradefed/targetprep/SystemUpdaterDeviceFlasherTest.java b/tests/src/com/android/tradefed/targetprep/SystemUpdaterDeviceFlasherTest.java
index 445f67e..3883058 100644
--- a/tests/src/com/android/tradefed/targetprep/SystemUpdaterDeviceFlasherTest.java
+++ b/tests/src/com/android/tradefed/targetprep/SystemUpdaterDeviceFlasherTest.java
@@ -99,7 +99,7 @@
 
     private void yieldDifferentBuilds(boolean different) {
         EasyMock.expect(mMockDevice.getBuildId()).andReturn(A_BUILD_ID).anyTimes();
-        EasyMock.expect(mMockDeviceBuild.getBuildId()).andReturn(
+        EasyMock.expect(mMockDeviceBuild.getDeviceBuildId()).andReturn(
                 (different ? A_BUILD_ID + 1 : A_BUILD_ID)).anyTimes();
     }
 }