Modify IBuildInfo API to more correctly describe its usage.

Add explict methods for branch and build-flavor, and rename
existing methods for clarity.

Bug 5097202

Change-Id: I8c751becdcbab6efbae2ac54ca9f353df0f891f7
diff --git a/src/com/android/tradefed/build/AppDeviceBuildInfo.java b/src/com/android/tradefed/build/AppDeviceBuildInfo.java
index 625022e..c4ee0b6 100644
--- a/src/com/android/tradefed/build/AppDeviceBuildInfo.java
+++ b/src/com/android/tradefed/build/AppDeviceBuildInfo.java
@@ -197,9 +197,9 @@
      */
     @Override
     public IBuildInfo clone() {
-        AppDeviceBuildInfo copy = new AppDeviceBuildInfo(getBuildId(), getTestTarget(),
-                getBuildName());
-        copy.addAllBuildAttributes(getAttributesMultiMap());
+        AppDeviceBuildInfo copy = new AppDeviceBuildInfo(getBuildId(), getTestTag(),
+                getBuildTargetName());
+        copy.addAllBuildAttributes(this);
         IDeviceBuildInfo deviceBuildClone = (IDeviceBuildInfo)mDeviceBuild.clone();
         copy.setDeviceBuild(deviceBuildClone);
         IAppBuildInfo appBuildClone = (IAppBuildInfo)mAppBuildInfo.clone();
diff --git a/src/com/android/tradefed/build/BuildInfo.java b/src/com/android/tradefed/build/BuildInfo.java
index 4385a18..a2dd189 100644
--- a/src/com/android/tradefed/build/BuildInfo.java
+++ b/src/com/android/tradefed/build/BuildInfo.java
@@ -26,9 +26,11 @@
 public class BuildInfo implements IBuildInfo {
 
     private int mBuildInfo = 0;
-    private String mTestTarget = "stub";
-    private String mBuildName = "stub";
+    private String mTestTag = "stub";
+    private String mBuildTargetName = "stub";
     private UniqueMultiMap<String, String> mBuildAttributes = new UniqueMultiMap<String, String>();
+    private String mBuildFlavor = null;
+    private String mBuildBranch = null;
 
     /**
      * Creates a {@link BuildInfo} using default attribute values.
@@ -40,29 +42,35 @@
      * Creates a {@link BuildInfo}
      *
      * @param buildId the build id
-     * @param testTarget the test target name
-     * @param buildName the build name
+     * @param testTag the test tag name
+     * @param buildTargetName the build target name
      */
-    public BuildInfo(int buildId, String testTarget, String buildName) {
+    public BuildInfo(int buildId, String testTag, String buildTargetName) {
         mBuildInfo = buildId;
-        mTestTarget = testTarget;
-        mBuildName = buildName;
+        mTestTag = testTag;
+        mBuildTargetName = buildTargetName;
     }
 
     /**
      * {@inheritDoc}
      */
+    @Override
     public int getBuildId() {
         return mBuildInfo;
     }
 
-    public String getTestTarget() {
-        return mTestTarget;
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String getTestTag() {
+        return mTestTag;
     }
 
     /**
      * {@inheritDoc}
      */
+    @Override
     public Map<String, String> getBuildAttributes() {
         return mBuildAttributes.getUniqueMap();
     }
@@ -70,8 +78,9 @@
     /**
      * {@inheritDoc}
      */
-    public String getBuildName() {
-        return mBuildName;
+    @Override
+    public String getBuildTargetName() {
+        return mBuildTargetName;
     }
 
     /**
@@ -81,8 +90,13 @@
         mBuildAttributes.put(attributeName, attributeValue);
     }
 
-    protected void addAllBuildAttributes(MultiMap<String, String> attributes) {
-        mBuildAttributes.putAll(attributes);
+    /**
+     * Helper method to copy build attributes, branch, and flavor from other build.
+     */
+    protected void addAllBuildAttributes(BuildInfo build) {
+        mBuildAttributes.putAll(build.getAttributesMultiMap());
+        setBuildFlavor(build.getBuildFlavor());
+        setBuildBranch(build.getBuildBranch());
     }
 
     protected MultiMap<String, String> getAttributesMultiMap() {
@@ -97,10 +111,45 @@
         // ignore
     }
 
+    /**
+     * {@inheritDoc}
+     */
     @Override
     public IBuildInfo clone() {
-        BuildInfo copy = new BuildInfo(mBuildInfo, mTestTarget, mBuildName);
-        copy.addAllBuildAttributes(mBuildAttributes);
+        BuildInfo copy = new BuildInfo(mBuildInfo, mTestTag, mBuildTargetName);
+        copy.addAllBuildAttributes(this);
         return copy;
     }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String getBuildFlavor() {
+        return mBuildFlavor ;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setBuildFlavor(String buildFlavor) {
+        mBuildFlavor = buildFlavor;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public String getBuildBranch() {
+        return mBuildBranch;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setBuildBranch(String branch) {
+        mBuildBranch = branch;
+    }
 }
diff --git a/src/com/android/tradefed/build/DeviceBuildInfo.java b/src/com/android/tradefed/build/DeviceBuildInfo.java
index cfaa555..33c6ea7 100644
--- a/src/com/android/tradefed/build/DeviceBuildInfo.java
+++ b/src/com/android/tradefed/build/DeviceBuildInfo.java
@@ -227,9 +227,9 @@
     @Override
     public IBuildInfo clone()  {
         try {
-            DeviceBuildInfo copy = new DeviceBuildInfo(getBuildId(), getTestTarget(),
-                    getBuildName());
-            copy.addAllBuildAttributes(getAttributesMultiMap());
+            DeviceBuildInfo copy = new DeviceBuildInfo(getBuildId(), getTestTag(),
+                    getBuildTargetName());
+            copy.addAllBuildAttributes(this);
             for (Map.Entry<String, ImageFile> fileEntry : mImageFileMap.entrySet()) {
                 File origImageFile = fileEntry.getValue().getImageFile();
                 File hardlinkFile;
diff --git a/src/com/android/tradefed/build/DeviceFolderBuildInfo.java b/src/com/android/tradefed/build/DeviceFolderBuildInfo.java
index c8409c8..c45131d 100644
--- a/src/com/android/tradefed/build/DeviceFolderBuildInfo.java
+++ b/src/com/android/tradefed/build/DeviceFolderBuildInfo.java
@@ -203,9 +203,9 @@
      */
     @Override
     public IBuildInfo clone() {
-        DeviceFolderBuildInfo copy = new DeviceFolderBuildInfo(getBuildId(), getTestTarget(),
-                getBuildName());
-        copy.addAllBuildAttributes(getAttributesMultiMap());
+        DeviceFolderBuildInfo copy = new DeviceFolderBuildInfo(getBuildId(), getTestTag(),
+                getBuildTargetName());
+        copy.addAllBuildAttributes(this);
         IDeviceBuildInfo deviceBuildClone = (IDeviceBuildInfo)mDeviceBuild.clone();
         copy.setDeviceBuild(deviceBuildClone);
         IFolderBuildInfo folderBuildClone = (IFolderBuildInfo)mFolderBuild.clone();
diff --git a/src/com/android/tradefed/build/FolderBuildInfo.java b/src/com/android/tradefed/build/FolderBuildInfo.java
index 8d69904..0477f08 100644
--- a/src/com/android/tradefed/build/FolderBuildInfo.java
+++ b/src/com/android/tradefed/build/FolderBuildInfo.java
@@ -61,8 +61,8 @@
 
     @Override
     public IBuildInfo clone() {
-        FolderBuildInfo copy = new FolderBuildInfo(getBuildId(), getTestTarget(), getBuildName());
-        copy.addAllBuildAttributes(getAttributesMultiMap());
+        FolderBuildInfo copy = new FolderBuildInfo(getBuildId(), getTestTag(), getBuildTargetName());
+        copy.addAllBuildAttributes(this);
         try {
             File copyDir = FileUtil.createTempDir("foldercopy");
             FileUtil.recursiveCopy(mRootDir, copyDir);
diff --git a/src/com/android/tradefed/build/IBuildInfo.java b/src/com/android/tradefed/build/IBuildInfo.java
index da0378b..498db89 100644
--- a/src/com/android/tradefed/build/IBuildInfo.java
+++ b/src/com/android/tradefed/build/IBuildInfo.java
@@ -28,17 +28,53 @@
     public int getBuildId();
 
     /**
-     * Return a unique description of the tests being run.
+     * Return a unique name for the tests being run.
      */
-    public String getTestTarget();
+    public String getTestTag();
 
     /**
-     * Return a unique description of the type of build.
+     * Return complete name for the build being tested.
+     * <p/>
+     * A common implementation is to construct the build target name from a combination of
+     * the build flavor and branch name. (ie <branch name>-<build flavor>)
      */
-    public String getBuildName();
+    public String getBuildTargetName();
 
     /**
-     * Get a set of name-value pairs of attributes describing the build.
+     * Optional method to return the type of build being tested.
+     * <p/>
+     * A common implementation for Android platform builds is to return
+     * <build product>-<build os>-<build variant>.
+     * ie generic-linux-userdebug
+     *
+     * @return the build flavor or <code>null</code> if unset/not applicable
+     */
+    public String getBuildFlavor();
+
+    /**
+     * Set the build flavor.
+     *
+     * @param buildFlavor
+     */
+    public void setBuildFlavor(String buildFlavor);
+
+    /**
+     * Optional method to return the source control branch that the build being tested was
+     * produced from.
+     *
+     * @return the build branch or <code>null</code> if unset/not applicable
+     */
+    public String getBuildBranch();
+
+    /**
+     * Set the build branch
+     *
+     * @param branch
+     */
+    public void setBuildBranch(String branch);
+
+    /**
+     * Get a set of name-value pairs of additional attributes describing the build.
      *
      * @return a {@link Map} of build attributes. Will not be <code>null</code>, but may be empty.
      */
diff --git a/src/com/android/tradefed/build/SdkBuildInfo.java b/src/com/android/tradefed/build/SdkBuildInfo.java
index c469d47..f1ab38a 100644
--- a/src/com/android/tradefed/build/SdkBuildInfo.java
+++ b/src/com/android/tradefed/build/SdkBuildInfo.java
@@ -112,8 +112,8 @@
 
     @Override
     public IBuildInfo clone() {
-        SdkBuildInfo cloneBuild = new SdkBuildInfo(getBuildId(), getTestTarget(), getBuildName());
-        cloneBuild.addAllBuildAttributes(getAttributesMultiMap());
+        SdkBuildInfo cloneBuild = new SdkBuildInfo(getBuildId(), getTestTag(), getBuildTargetName());
+        cloneBuild.addAllBuildAttributes(this);
         try {
             File cloneAdtDir = null;
             if (getAdtDir() != null) {
diff --git a/src/com/android/tradefed/invoker/TestInvocation.java b/src/com/android/tradefed/invoker/TestInvocation.java
index 3576f53..b56a88b 100644
--- a/src/com/android/tradefed/invoker/TestInvocation.java
+++ b/src/com/android/tradefed/invoker/TestInvocation.java
@@ -245,7 +245,7 @@
      */
     private void logStartInvocation(IBuildInfo info, ITestDevice device) {
         StringBuilder msg = new StringBuilder("Starting invocation for target ");
-        msg.append(info.getTestTarget());
+        msg.append(info.getTestTag());
         msg.append(" on build ");
         msg.append(info.getBuildId());
         for (String buildAttr : info.getBuildAttributes().values()) {
@@ -255,7 +255,7 @@
         msg.append(" on device ");
         msg.append(device.getSerialNumber());
         Log.logAndDisplay(LogLevel.INFO, LOG_TAG, msg.toString());
-        mStatus = String.format("running %s on build %d", info.getTestTarget(), info.getBuildId());
+        mStatus = String.format("running %s on build %d", info.getTestTag(), info.getBuildId());
     }
 
     /**
diff --git a/src/com/android/tradefed/result/EmailResultReporter.java b/src/com/android/tradefed/result/EmailResultReporter.java
index 1a9f0fb..36be3a4 100644
--- a/src/com/android/tradefed/result/EmailResultReporter.java
+++ b/src/com/android/tradefed/result/EmailResultReporter.java
@@ -138,7 +138,7 @@
      */
     protected String generateEmailSubject() {
         return String.format("%s result for %s on build %d: %s", mSubjectTag,
-                getBuildInfo().getTestTarget(), getBuildInfo().getBuildId(), getInvocationStatus());
+                getBuildInfo().getTestTag(), getBuildInfo().getBuildId(), getInvocationStatus());
     }
 
     /**
diff --git a/src/com/android/tradefed/result/XmlResultReporter.java b/src/com/android/tradefed/result/XmlResultReporter.java
index 4d1a721..a5923fe 100644
--- a/src/com/android/tradefed/result/XmlResultReporter.java
+++ b/src/com/android/tradefed/result/XmlResultReporter.java
@@ -175,7 +175,7 @@
     void printTestResults(KXmlSerializer serializer, String timestamp, long elapsedTime)
             throws IOException {
         serializer.startTag(ns, TESTSUITE);
-        serializer.attribute(ns, ATTR_NAME, mBuildInfo.getTestTarget());
+        serializer.attribute(ns, ATTR_NAME, mBuildInfo.getTestTag());
         serializer.attribute(ns, ATTR_TESTS, Integer.toString(getNumTotalTests()));
         serializer.attribute(ns, ATTR_FAILURES, Integer.toString(getNumFailedTests()));
         serializer.attribute(ns, ATTR_ERRORS, Integer.toString(getNumErrorTests()));
diff --git a/tests/src/com/android/tradefed/invoker/TestInvocationTest.java b/tests/src/com/android/tradefed/invoker/TestInvocationTest.java
index 1362f4c..87dad4a 100644
--- a/tests/src/com/android/tradefed/invoker/TestInvocationTest.java
+++ b/tests/src/com/android/tradefed/invoker/TestInvocationTest.java
@@ -111,7 +111,7 @@
 
         EasyMock.expect(mMockBuildInfo.getBuildId()).andStubReturn(1);
         EasyMock.expect(mMockBuildInfo.getBuildAttributes()).andStubReturn(EMPTY_MAP);
-        EasyMock.expect(mMockBuildInfo.getTestTarget()).andStubReturn("");
+        EasyMock.expect(mMockBuildInfo.getTestTag()).andStubReturn("");
         // always expect logger initialization and cleanup calls
         mMockLogRegistry.registerLogger(mMockLogger);
         mMockLogger.init();