Flatten DeviceFolderBuildInfo structure

Instead of relying on two sub-builds, keep everything in
the current instance. This avoids issue with special casing
properties and cloning. Everything is part of the parent
build directly.

Test: unit tests
run gsi tests
Bug: 112733423
Bug: 77241243

Change-Id: I3e2b162b6e033b36d8f70d8b92dd34448f221f92
diff --git a/src/com/android/tradefed/build/AppDeviceBuildInfo.java b/src/com/android/tradefed/build/AppDeviceBuildInfo.java
index 315dee7..5ccef4e 100644
--- a/src/com/android/tradefed/build/AppDeviceBuildInfo.java
+++ b/src/com/android/tradefed/build/AppDeviceBuildInfo.java
@@ -17,7 +17,6 @@
 package com.android.tradefed.build;
 
 import com.android.tradefed.build.BuildInfoKey.BuildInfoFileKey;
-import com.android.tradefed.util.MultiMap;
 
 import java.io.File;
 import java.util.ArrayList;
@@ -58,23 +57,11 @@
 
     /** Copy all the files from the {@link IAppBuildInfo}. */
     public void setAppBuild(IAppBuildInfo appBuild) {
-        MultiMap<String, VersionedFile> versionedMap =
-                ((BuildInfo) appBuild).getVersionedFileMapFull();
-        for (String versionedFile : versionedMap.keySet()) {
-            for (VersionedFile vFile : versionedMap.get(versionedFile)) {
-                setFile(versionedFile, vFile.getFile(), vFile.getVersion());
-            }
-        }
+        copyAllFileFrom((BuildInfo) appBuild);
     }
 
     /** Copy all the files from the {@link IDeviceBuildInfo}. */
     public void setDeviceBuild(IDeviceBuildInfo deviceBuild) {
-        MultiMap<String, VersionedFile> versionedMap =
-                ((BuildInfo) deviceBuild).getVersionedFileMapFull();
-        for (String versionedFile : versionedMap.keySet()) {
-            for (VersionedFile vFile : versionedMap.get(versionedFile)) {
-                setFile(versionedFile, vFile.getFile(), vFile.getVersion());
-            }
-        }
+        copyAllFileFrom((BuildInfo) deviceBuild);
     }
 }
diff --git a/src/com/android/tradefed/build/BuildInfo.java b/src/com/android/tradefed/build/BuildInfo.java
index 99b8848..4459892 100644
--- a/src/com/android/tradefed/build/BuildInfo.java
+++ b/src/com/android/tradefed/build/BuildInfo.java
@@ -555,6 +555,16 @@
         return protoBuilder.build();
     }
 
+    /** Copy all the {@link VersionedFile} from a given build to this one. */
+    public final void copyAllFileFrom(BuildInfo build) {
+        MultiMap<String, VersionedFile> versionedMap = build.getVersionedFileMapFull();
+        for (String versionedFile : versionedMap.keySet()) {
+            for (VersionedFile vFile : versionedMap.get(versionedFile)) {
+                setFile(versionedFile, vFile.getFile(), vFile.getVersion());
+            }
+        }
+    }
+
     /** Special serialization to handle the new underlying type. */
     private void writeObject(ObjectOutputStream outputStream) throws IOException {
         outputStream.defaultWriteObject();
diff --git a/src/com/android/tradefed/build/DeviceFolderBuildInfo.java b/src/com/android/tradefed/build/DeviceFolderBuildInfo.java
index cc4d78b..33b90ae 100644
--- a/src/com/android/tradefed/build/DeviceFolderBuildInfo.java
+++ b/src/com/android/tradefed/build/DeviceFolderBuildInfo.java
@@ -15,20 +15,18 @@
  */
 package com.android.tradefed.build;
 
+import com.android.tradefed.build.BuildInfoKey.BuildInfoFileKey;
+
 import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
 
 /**
  * A {@link IDeviceBuildInfo} that also contains other build artifacts contained in a directory on
  * the local filesystem.
  */
-public class DeviceFolderBuildInfo extends BuildInfo implements IDeviceBuildInfo, IFolderBuildInfo {
+public class DeviceFolderBuildInfo extends DeviceBuildInfo
+        implements IDeviceBuildInfo, IFolderBuildInfo {
 
     private static final long serialVersionUID = BuildSerializedVersion.VERSION;
-    private IDeviceBuildInfo mDeviceBuild;
-    private IFolderBuildInfo mFolderBuild;
 
     /**
      * @see DeviceBuildInfo#DeviceBuildInfo(String, String)
@@ -41,225 +39,7 @@
      * @see DeviceBuildInfo#DeviceBuildInfo()
      */
     public DeviceFolderBuildInfo() {
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public String getDeviceBuildId() {
-        return mDeviceBuild.getDeviceBuildId();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public String getDeviceBuildFlavor() {
-        return mDeviceBuild.getDeviceBuildFlavor();
-    }
-
-    /**
-     * {@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();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public String getBasebandVersion() {
-        return mDeviceBuild.getBasebandVersion();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setBasebandImage(File basebandFile, String version) {
-        mDeviceBuild.setBasebandImage(basebandFile, version);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public File getBootloaderImageFile() {
-        return mDeviceBuild.getBootloaderImageFile();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public String getBootloaderVersion() {
-        return mDeviceBuild.getBootloaderVersion();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setBootloaderImageFile(File bootloaderImgFile, String version) {
-        mDeviceBuild.setBootloaderImageFile(bootloaderImgFile, version);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public File getOtaPackageFile() {
-        return mDeviceBuild.getOtaPackageFile();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public String getOtaPackageVersion() {
-        return mDeviceBuild.getOtaPackageVersion();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    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);
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public Collection<VersionedFile> getFiles() {
-        Collection<VersionedFile> rootFiles = super.getFiles();
-        Collection<VersionedFile> deviceFiles = mDeviceBuild.getFiles();
-        List<VersionedFile> combinedFiles = new ArrayList<VersionedFile>();
-        combinedFiles.addAll(rootFiles);
-        combinedFiles.addAll(deviceFiles);
-        return combinedFiles;
+        super();
     }
 
     /**
@@ -267,7 +47,7 @@
      */
     @Override
     public File getRootDir() {
-        return mFolderBuild.getRootDir();
+        return getFile(BuildInfoFileKey.ROOT_DIRECTORY);
     }
 
     /**
@@ -275,59 +55,19 @@
      */
     @Override
     public void setRootDir(File rootDir) {
-        mFolderBuild.setRootDir(rootDir);
+        setFile(
+                BuildInfoFileKey.ROOT_DIRECTORY,
+                rootDir,
+                BuildInfoFileKey.ROOT_DIRECTORY.getFileKey());
     }
 
-    /**
-     * @param folderBuild
-     */
+    /** Copy all the files from the {@link IFolderBuildInfo}. */
     public void setFolderBuild(IFolderBuildInfo folderBuild) {
-        mFolderBuild = folderBuild;
+        copyAllFileFrom((BuildInfo) folderBuild);
     }
 
-    /**
-     * @param deviceBuild
-     */
+    /** Copy all the files from the {@link IDeviceBuildInfo}. */
     public void setDeviceBuild(IDeviceBuildInfo deviceBuild) {
-        mDeviceBuild = deviceBuild;
-    }
-
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void cleanUp() {
-        mDeviceBuild.cleanUp();
-        mFolderBuild.cleanUp();
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public void setProperties(BuildInfoProperties... properties) {
-        super.setProperties(properties);
-        if (mDeviceBuild != null) {
-            mDeviceBuild.setProperties(properties);
-        }
-        if (mFolderBuild != null) {
-            mFolderBuild.setProperties(properties);
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public IBuildInfo clone() {
-        DeviceFolderBuildInfo copy = new DeviceFolderBuildInfo(getBuildId(), getBuildTargetName());
-        copy.addAllBuildAttributes(this);
-        copy.setProperties(this.getProperties().toArray(new BuildInfoProperties[0]));
-
-        IDeviceBuildInfo deviceBuildClone = (IDeviceBuildInfo) mDeviceBuild.clone();
-        copy.setDeviceBuild(deviceBuildClone);
-        IFolderBuildInfo folderBuildClone = (IFolderBuildInfo) mFolderBuild.clone();
-        copy.setFolderBuild(folderBuildClone);
-
-        return copy;
+        copyAllFileFrom((BuildInfo) deviceBuild);
     }
 }
diff --git a/tests/src/com/android/tradefed/build/DeviceFolderBuildInfoTest.java b/tests/src/com/android/tradefed/build/DeviceFolderBuildInfoTest.java
index 50b60de..ee36c31 100644
--- a/tests/src/com/android/tradefed/build/DeviceFolderBuildInfoTest.java
+++ b/tests/src/com/android/tradefed/build/DeviceFolderBuildInfoTest.java
@@ -136,4 +136,28 @@
             }
         }
     }
+
+    /**
+     * Test that when setting the device and folger build, the DeviceFolderBuildInfo gets all their
+     * file.
+     */
+    @Test
+    public void testSettingBuilds() {
+        IFolderBuildInfo folderBuilder = new FolderBuildInfo("5555", "build_target2");
+        folderBuilder.setRootDir(new File("package"));
+        assertNotNull(folderBuilder.getRootDir());
+        // Original build doesn't have the root dir yet.
+        assertNull(mDeviceFolderBuildInfo.getRootDir());
+        mDeviceFolderBuildInfo.setFolderBuild(folderBuilder);
+        // folderBuild gave its file to the main build
+        assertNotNull(mDeviceFolderBuildInfo.getRootDir());
+
+        IDeviceBuildInfo deviceBuild = new DeviceBuildInfo("3333", "build_target3");
+        deviceBuild.setBootloaderImageFile(new File("bootloader"), "v2");
+        assertNull(mDeviceFolderBuildInfo.getBootloaderImageFile());
+
+        mDeviceFolderBuildInfo.setDeviceBuild(deviceBuild);
+        // deviceBuild gave its file to the main build
+        assertNotNull(mDeviceFolderBuildInfo.getBootloaderImageFile());
+    }
 }