Bug 8077888 - handle multiple coverage files being generated.

Change-Id: Ifd35d3fc2e15c5151142d854bb205a0538a2571b
diff --git a/src/com/android/tradefed/result/CodeCoverageReporter.java b/src/com/android/tradefed/result/CodeCoverageReporter.java
index d42c296..63e5523 100644
--- a/src/com/android/tradefed/result/CodeCoverageReporter.java
+++ b/src/com/android/tradefed/result/CodeCoverageReporter.java
@@ -32,6 +32,9 @@
 
 import java.io.File;
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 import java.util.zip.ZipFile;
 
 /**
@@ -67,7 +70,7 @@
     private ILogFileSaver mLogFileSaver;
 
     private File mLocalTmpDir = null;
-    private File mCoverageFile = null;
+    private List<File> mCoverageFilesList = new ArrayList<File>();
     private File mCoverageMetaFile = null;
     private File mXMLReportFile = null;
     private File mReportOutputPath = null;
@@ -93,8 +96,10 @@
      */
     @Override
     public void testLog(String dataName, LogDataType dataType, InputStreamSource dataStream) {
-        if (dataType.equals(LogDataType.COVERAGE)) {
-            mCoverageFile = saveLogAsFile(dataName, dataType, dataStream);
+        if (LogDataType.COVERAGE.equals(dataType)) {
+            File coverageFile = saveLogAsFile(dataName, dataType, dataStream);
+            mCoverageFilesList.add(coverageFile);
+            CLog.d("Saved a new device coverage file saved at %s", coverageFile.getAbsolutePath());
         }
     }
 
@@ -157,16 +162,18 @@
         try {
             fetchAppropriateMetaDataFile();
 
-            if (mCoverageFile != null) {
-                generateCoverageReport(mCoverageFile, mCoverageMetaFile);
+            if (!mCoverageFilesList.isEmpty()) {
+                generateCoverageReport(mCoverageFilesList, mCoverageMetaFile);
             } else {
-                CLog.w("Coverage file was not generated by the test. " +
+                CLog.w("No coverage files were generated by the test. " +
                         "Perhaps test failed to run successfully.");
             }
         } finally {
             // Cleanup residual files.
-            if (mCoverageFile != null) {
-                FileUtil.recursiveDelete(mCoverageFile);
+            if (!mCoverageFilesList.isEmpty()) {
+                for (File coverageFile : mCoverageFilesList) {
+                    FileUtil.recursiveDelete(coverageFile);
+                }
             }
             if (mLocalTmpDir != null) {
                 FileUtil.recursiveDelete(mLocalTmpDir);
@@ -213,22 +220,26 @@
         return buildIdPath;
     }
 
-    private void generateCoverageReport(File coverageFile, File metaFile) {
-        Assert.assertNotNull("Could not find a valid coverage file.", coverageFile);
+    private void generateCoverageReport(List<File> coverageFileList, File metaFile) {
+        Assert.assertFalse("Could not find a valid coverage file.", coverageFileList.isEmpty());
         Assert.assertNotNull("Could not find a valid meta data coverage file.", metaFile);
         String emmaPath = findEmmaJarPath();
-        String cmd[] = {
-                "java", "-cp", emmaPath, "emma", "report", "-r", "html", "-r", "xml",
-                "-in", coverageFile.getAbsolutePath(), "-in", metaFile.getAbsolutePath(),
-                "-Dreport.html.out.encoding=UTF-8",
+        List<String> cmdList = new ArrayList<String>();
+        cmdList.addAll(Arrays.asList("java", "-cp", emmaPath, "emma", "report", "-r", "html",
+                "-r", "xml", "-in", metaFile.getAbsolutePath(), "-Dreport.html.out.encoding=UTF-8",
                 "-Dreport.html.out.file=" + mReportOutputPath.getAbsolutePath() + "/index.html",
-                "-Dreport.xml.out.file=" + mReportOutputPath.getAbsolutePath() + "/report.xml"
-        };
+                "-Dreport.xml.out.file=" + mReportOutputPath.getAbsolutePath() + "/report.xml"));
+        // Now append all the coverage files collected.
+        for (File coverageFile : coverageFileList) {
+            cmdList.add("-in");
+            cmdList.add(coverageFile.getAbsolutePath());
+        }
+        String[] cmd = cmdList.toArray(new String[cmdList.size()]);
         IRunUtil runUtil = RunUtil.getDefault();
         CommandResult result = runUtil.runTimedCmd(REPORT_GENERATION_TIMEOUT_MS, cmd);
         if (!result.getStatus().equals(CommandStatus.SUCCESS)) {
-            CLog.e("Failed to generate coverage report for %s. stderr: %s",
-                    coverageFile.getAbsolutePath(), result.getStderr());
+            CLog.e("Failed to generate coverage report. stderr: %s",
+                    result.getStderr());
         } else {
             // Make the report world readable.
             boolean setPerms = FileUtil.chmodRWXRecursively(mReportOutputPath);