Flip testRunEnded default to proto metrics

All reporters have been switched to handle proto metrics
so we can now safely swith the default to testRunEnded
proto version of the interface.

Test: unit tests
Bug: 73163359
Change-Id: I85e10c6e521ba9afc44a4e6fc9c9f0479ccae267
diff --git a/prod-tests/tests/src/com/android/continuous/SmokeTestFailureReporterTest.java b/prod-tests/tests/src/com/android/continuous/SmokeTestFailureReporterTest.java
index 29056ef..c05f938 100644
--- a/prod-tests/tests/src/com/android/continuous/SmokeTestFailureReporterTest.java
+++ b/prod-tests/tests/src/com/android/continuous/SmokeTestFailureReporterTest.java
@@ -31,9 +31,7 @@
 import org.easymock.Capture;
 import org.easymock.EasyMock;
 
-import java.util.Collections;
 import java.util.HashMap;
-import java.util.Map;
 
 /** Unit tests for {@link SmokeTestFailureReporter} */
 public class SmokeTestFailureReporterTest extends TestCase {
@@ -103,7 +101,7 @@
                         + "target=target?, build_flavor=generic-userdebug, branch=git_master}";
         final String expBodyStart = "FooTest#testFail failed\nStack trace:\nthis is a trace\n";
 
-        final Map<String, String> emptyMap = Collections.emptyMap();
+        final HashMap<String, Metric> emptyMap = new HashMap<>();
         final String trace = "this is a trace";
         final TestDescription testFail = new TestDescription("FooTest", "testFail");
         final TestDescription testPass1 = new TestDescription("FooTest", "testPass1");
diff --git a/src/com/android/tradefed/command/remote/ExecCommandTracker.java b/src/com/android/tradefed/command/remote/ExecCommandTracker.java
index 7f406bc..3e79162 100644
--- a/src/com/android/tradefed/command/remote/ExecCommandTracker.java
+++ b/src/com/android/tradefed/command/remote/ExecCommandTracker.java
@@ -58,11 +58,6 @@
     }
 
     @Override
-    public void testRunEnded(long elapsedTime, Map<String, String> runMetrics) {
-        testRunEnded(elapsedTime, TfMetricProtoUtil.upgradeConvert(runMetrics));
-    }
-
-    @Override
     public void testRunEnded(long elapsedTime, HashMap<String, Metric> runMetrics) {
         mRunMetrics.putAll(runMetrics);
     }
diff --git a/src/com/android/tradefed/device/metric/BaseDeviceMetricCollector.java b/src/com/android/tradefed/device/metric/BaseDeviceMetricCollector.java
index d7475c8..233a452 100644
--- a/src/com/android/tradefed/device/metric/BaseDeviceMetricCollector.java
+++ b/src/com/android/tradefed/device/metric/BaseDeviceMetricCollector.java
@@ -165,11 +165,6 @@
     }
 
     @Override
-    public final void testRunEnded(long elapsedTime, Map<String, String> runMetrics) {
-        testRunEnded(elapsedTime, TfMetricProtoUtil.upgradeConvert(runMetrics));
-    }
-
-    @Override
     public final void testRunEnded(long elapsedTime, HashMap<String, Metric> runMetrics) {
         try {
             onTestRunEnd(mRunData, runMetrics);
diff --git a/src/com/android/tradefed/invoker/ShardListener.java b/src/com/android/tradefed/invoker/ShardListener.java
index d41f22e..6ad342d 100644
--- a/src/com/android/tradefed/invoker/ShardListener.java
+++ b/src/com/android/tradefed/invoker/ShardListener.java
@@ -18,6 +18,7 @@
 import com.android.ddmlib.Log.LogLevel;
 import com.android.ddmlib.testrunner.TestResult.TestStatus;
 import com.android.tradefed.log.LogUtil.CLog;
+import com.android.tradefed.metrics.proto.MetricMeasurement.Metric;
 import com.android.tradefed.result.CollectingTestListener;
 import com.android.tradefed.result.ILogSaverListener;
 import com.android.tradefed.result.ITestInvocationListener;
@@ -30,6 +31,7 @@
 import com.android.tradefed.util.TimeUtil;
 
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.Map;
 import java.util.Map.Entry;
 
@@ -110,7 +112,7 @@
 
     /** {@inheritDoc} */
     @Override
-    public void testRunEnded(long elapsedTime, Map<String, String> runMetrics) {
+    public void testRunEnded(long elapsedTime, HashMap<String, Metric> runMetrics) {
         super.testRunEnded(elapsedTime, runMetrics);
         CLog.logAndDisplay(LogLevel.INFO, "Sharded test completed: %s",
                 getCurrentRunResults().getName());
diff --git a/src/com/android/tradefed/result/BugreportCollector.java b/src/com/android/tradefed/result/BugreportCollector.java
index 1293504..3696ca3 100644
--- a/src/com/android/tradefed/result/BugreportCollector.java
+++ b/src/com/android/tradefed/result/BugreportCollector.java
@@ -466,14 +466,6 @@
         reset();
     }
 
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void testRunEnded(long elapsedTime, Map<String, String> runMetrics) {
-        testRunEnded(elapsedTime, TfMetricProtoUtil.upgradeConvert(runMetrics));
-    }
-
     /** {@inheritDoc} */
     @Override
     public void testRunEnded(long elapsedTime, HashMap<String, Metric> runMetrics) {
diff --git a/src/com/android/tradefed/result/CollectingTestListener.java b/src/com/android/tradefed/result/CollectingTestListener.java
index 2e49933..7b6031f 100644
--- a/src/com/android/tradefed/result/CollectingTestListener.java
+++ b/src/com/android/tradefed/result/CollectingTestListener.java
@@ -211,14 +211,6 @@
         mCurrentResults.testIgnored(test);
     }
 
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void testRunEnded(long elapsedTime, Map<String, String> runMetrics) {
-        testRunEnded(elapsedTime, TfMetricProtoUtil.upgradeConvert(runMetrics));
-    }
-
     /** {@inheritDoc} */
     @Override
     public void testRunEnded(long elapsedTime, HashMap<String, Metric> runMetrics) {
diff --git a/src/com/android/tradefed/result/ITestLifeCycleReceiver.java b/src/com/android/tradefed/result/ITestLifeCycleReceiver.java
index 0159a53..21ee86b 100644
--- a/src/com/android/tradefed/result/ITestLifeCycleReceiver.java
+++ b/src/com/android/tradefed/result/ITestLifeCycleReceiver.java
@@ -63,7 +63,9 @@
      * @param elapsedTimeMillis device reported elapsed time, in milliseconds
      * @param runMetrics key-value pairs reported at the end of a test run
      */
-    public default void testRunEnded(long elapsedTimeMillis, Map<String, String> runMetrics) {}
+    public default void testRunEnded(long elapsedTimeMillis, Map<String, String> runMetrics) {
+        testRunEnded(elapsedTimeMillis, TfMetricProtoUtil.upgradeConvert(runMetrics));
+    }
 
     /**
      * Reports end of test run. FIXME: We cannot have two Map<> interfaces with different type, so
@@ -72,9 +74,7 @@
      * @param elapsedTimeMillis device reported elapsed time, in milliseconds
      * @param runMetrics key-value pairs reported at the end of a test run with {@link Metric}.
      */
-    public default void testRunEnded(long elapsedTimeMillis, HashMap<String, Metric> runMetrics) {
-        testRunEnded(elapsedTimeMillis, TfMetricProtoUtil.compatibleConvert(runMetrics));
-    }
+    public default void testRunEnded(long elapsedTimeMillis, HashMap<String, Metric> runMetrics) {}
 
     /**
      * Reports test run stopped before completion due to a user request.
diff --git a/src/com/android/tradefed/result/LogcatCrashResultForwarder.java b/src/com/android/tradefed/result/LogcatCrashResultForwarder.java
index feac2b2..18641e2 100644
--- a/src/com/android/tradefed/result/LogcatCrashResultForwarder.java
+++ b/src/com/android/tradefed/result/LogcatCrashResultForwarder.java
@@ -91,12 +91,6 @@
     }
 
     @Override
-    public void testRunEnded(long elapsedTime, Map<String, String> runMetrics) {
-        super.testRunEnded(elapsedTime, runMetrics);
-        mLastStartTime = null;
-    }
-
-    @Override
     public void testRunEnded(long elapsedTime, HashMap<String, Metric> runMetrics) {
         super.testRunEnded(elapsedTime, runMetrics);
         mLastStartTime = null;
diff --git a/src/com/android/tradefed/result/NameMangleListener.java b/src/com/android/tradefed/result/NameMangleListener.java
index 2dd23a7..9df3173 100644
--- a/src/com/android/tradefed/result/NameMangleListener.java
+++ b/src/com/android/tradefed/result/NameMangleListener.java
@@ -98,14 +98,6 @@
         mListener.testIgnored(mangledTestId);
     }
 
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void testRunEnded(long elapsedTime, Map<String, String> runMetrics) {
-        testRunEnded(elapsedTime, TfMetricProtoUtil.upgradeConvert(runMetrics));
-    }
-
     /** {@inheritDoc} */
     @Override
     public void testRunEnded(long elapsedTime, HashMap<String, Metric> runMetrics) {
diff --git a/src/com/android/tradefed/result/ResultForwarder.java b/src/com/android/tradefed/result/ResultForwarder.java
index 6696cbf..2a1cd00 100644
--- a/src/com/android/tradefed/result/ResultForwarder.java
+++ b/src/com/android/tradefed/result/ResultForwarder.java
@@ -196,21 +196,6 @@
         }
     }
 
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void testRunEnded(long elapsedTime, Map<String, String> runMetrics) {
-        for (ITestInvocationListener listener : mListeners) {
-            try {
-                listener.testRunEnded(elapsedTime, runMetrics);
-            } catch (RuntimeException e) {
-                CLog.e("Exception while invoking %s#testRunEnded", listener.getClass().getName());
-                CLog.e(e);
-            }
-        }
-    }
-
     /** {@inheritDoc} */
     @Override
     public void testRunEnded(long elapsedTime, HashMap<String, Metric> runMetrics) {
diff --git a/src/com/android/tradefed/result/SubprocessResultsReporter.java b/src/com/android/tradefed/result/SubprocessResultsReporter.java
index ab71b48..515fe38 100644
--- a/src/com/android/tradefed/result/SubprocessResultsReporter.java
+++ b/src/com/android/tradefed/result/SubprocessResultsReporter.java
@@ -122,14 +122,6 @@
         printEvent(SubprocessTestResultsParser.StatusKeys.TEST_IGNORED, info);
     }
 
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void testRunEnded(long time, Map<String, String> runMetrics) {
-        testRunEnded(time, TfMetricProtoUtil.upgradeConvert(runMetrics));
-    }
-
     /** {@inheritDoc} */
     @Override
     public void testRunEnded(long time, HashMap<String, Metric> runMetrics) {
diff --git a/src/com/android/tradefed/testtype/CodeCoverageListener.java b/src/com/android/tradefed/testtype/CodeCoverageListener.java
index 05252d3..d5637b7 100644
--- a/src/com/android/tradefed/testtype/CodeCoverageListener.java
+++ b/src/com/android/tradefed/testtype/CodeCoverageListener.java
@@ -20,6 +20,7 @@
 
 import com.android.tradefed.device.DeviceNotAvailableException;
 import com.android.tradefed.device.ITestDevice;
+import com.android.tradefed.metrics.proto.MetricMeasurement.Metric;
 import com.android.tradefed.result.FileInputStreamSource;
 import com.android.tradefed.result.ITestInvocationListener;
 import com.android.tradefed.result.LogDataType;
@@ -27,7 +28,7 @@
 import com.android.tradefed.util.FileUtil;
 
 import java.io.File;
-import java.util.Map;
+import java.util.HashMap;
 
 /**
  * A {@link ResultForwarder} that will pull coverage measurements off of the device and log them as
@@ -53,9 +54,15 @@
     }
 
     @Override
-    public void testRunEnded(long elapsedTime, Map<String, String> runMetrics) {
+    public void testRunEnded(long elapsedTime, HashMap<String, Metric> runMetrics) {
         // Get the path of the coverage measurement on the device.
-        String devicePath = runMetrics.get(COVERAGE_MEASUREMENT_KEY);
+        Metric devicePathMetric = runMetrics.get(COVERAGE_MEASUREMENT_KEY);
+        if (devicePathMetric == null) {
+            super.testRunFailed("No coverage measurement.");
+            super.testRunEnded(elapsedTime, runMetrics);
+            return;
+        }
+        String devicePath = devicePathMetric.getMeasurements().getSingleString();
         if (devicePath == null) {
             super.testRunFailed("No coverage measurement.");
             super.testRunEnded(elapsedTime, runMetrics);
diff --git a/src/com/android/tradefed/testtype/CodeCoverageTestBase.java b/src/com/android/tradefed/testtype/CodeCoverageTestBase.java
index 5011185..2b7ac7f 100644
--- a/src/com/android/tradefed/testtype/CodeCoverageTestBase.java
+++ b/src/com/android/tradefed/testtype/CodeCoverageTestBase.java
@@ -38,7 +38,6 @@
 import com.android.tradefed.util.ICompressionStrategy;
 import com.android.tradefed.util.ListInstrumentationParser;
 import com.android.tradefed.util.ListInstrumentationParser.InstrumentationTarget;
-import com.android.tradefed.util.proto.TfMetricProtoUtil;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Strings;
@@ -531,12 +530,6 @@
 
         /** {@inheritDoc} */
         @Override
-        public void testRunEnded(long elapsedTime, Map<String, String> runMetrics) {
-            testRunEnded(elapsedTime, TfMetricProtoUtil.upgradeConvert(runMetrics));
-        }
-
-        /** {@inheritDoc} */
-        @Override
         public void testRunEnded(long elapsedTime, HashMap<String, Metric> runMetrics) {
             // Look for the coverage file path from the run metrics
             Metric coverageFilePathMetric =
diff --git a/tests/src/com/android/tradefed/device/metric/AtraceRunMetricCollectorTest.java b/tests/src/com/android/tradefed/device/metric/AtraceRunMetricCollectorTest.java
index d58db16..6242789 100644
--- a/tests/src/com/android/tradefed/device/metric/AtraceRunMetricCollectorTest.java
+++ b/tests/src/com/android/tradefed/device/metric/AtraceRunMetricCollectorTest.java
@@ -17,14 +17,14 @@
 package com.android.tradefed.device.metric;
 import com.android.tradefed.config.OptionSetter;
 import com.android.tradefed.device.ITestDevice;
-import com.android.tradefed.device.metric.AtraceRunMetricCollector;
-import com.android.tradefed.device.metric.DeviceMetricData;
 import com.android.tradefed.invoker.IInvocationContext;
 import com.android.tradefed.invoker.InvocationContext;
+import com.android.tradefed.metrics.proto.MetricMeasurement.Metric;
 import com.android.tradefed.result.FileInputStreamSource;
 import com.android.tradefed.result.ITestInvocationListener;
 import com.android.tradefed.result.LogDataType;
 import com.android.tradefed.util.FileUtil;
+import com.android.tradefed.util.proto.TfMetricProtoUtil;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -36,7 +36,6 @@
 
 import java.io.File;
 import java.util.HashMap;
-import java.util.Map;
 
 
 /** Unit tests for {@link AtraceRunMetricCollector}. */
@@ -72,7 +71,7 @@
     @Test
     public void testNoMatchingDirectory() {
         mAtraceRunMetricCollector.testRunStarted("fake", 1);
-        mAtraceRunMetricCollector.testRunEnded(0, new HashMap<String, String>());
+        mAtraceRunMetricCollector.testRunEnded(0, new HashMap<String, Metric>());
     }
 
     /**
@@ -84,14 +83,14 @@
 
         OptionSetter setter = new OptionSetter(mAtraceRunMetricCollector);
         setter.setOptionValue("directory-keys", "sdcard/srcdirectory");
-        Map<String, String> currentMetrics = new HashMap<>();
-        currentMetrics.put("srcdirectory", "sdcard/srcdirectory");
+        HashMap<String, Metric> currentMetrics = new HashMap<>();
+        currentMetrics.put("srcdirectory", TfMetricProtoUtil.stringToMetric("sdcard/srcdirectory"));
 
         Mockito.when(mMockDevice.pullDir(Mockito.eq("sdcard/srcdirectory"),
                 Mockito.any(File.class))).thenReturn(true);
 
         mAtraceRunMetricCollector.testRunStarted("fakeRun", 5);
-        mAtraceRunMetricCollector.testRunEnded(500, new HashMap<String, String>());
+        mAtraceRunMetricCollector.testRunEnded(500, new HashMap<String, Metric>());
 
         Mockito.verify(mMockListener)
                 .testLog(Mockito.eq("sdcard/srcdirectory"), Mockito.eq(LogDataType.ZIP),
diff --git a/tests/src/com/android/tradefed/device/metric/BaseDeviceMetricCollectorTest.java b/tests/src/com/android/tradefed/device/metric/BaseDeviceMetricCollectorTest.java
index 85342fe..dd6bde5 100644
--- a/tests/src/com/android/tradefed/device/metric/BaseDeviceMetricCollectorTest.java
+++ b/tests/src/com/android/tradefed/device/metric/BaseDeviceMetricCollectorTest.java
@@ -41,7 +41,6 @@
 import org.mockito.MockitoAnnotations;
 
 import java.lang.annotation.Annotation;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -74,10 +73,10 @@
         mBase.testFailed(test, "trace");
         mBase.testAssumptionFailure(test, "trace");
         mBase.testIgnored(test);
-        mBase.testEnded(test, Collections.emptyMap());
+        mBase.testEnded(test, new HashMap<String, Metric>());
         mBase.testRunFailed("test run failed");
         mBase.testRunStopped(0L);
-        mBase.testRunEnded(0L, Collections.emptyMap());
+        mBase.testRunEnded(0L, new HashMap<String, Metric>());
         mBase.invocationFailed(new Throwable());
         mBase.invocationEnded(0L);
 
@@ -146,10 +145,10 @@
         mBase.testFailed(test, "trace");
         mBase.testAssumptionFailure(test, "trace");
         mBase.testIgnored(test);
-        mBase.testEnded(test, Collections.emptyMap());
+        mBase.testEnded(test, new HashMap<String, Metric>());
         mBase.testRunFailed("test run failed");
         mBase.testRunStopped(0L);
-        mBase.testRunEnded(0L, Collections.emptyMap());
+        mBase.testRunEnded(0L, new HashMap<String, Metric>());
         mBase.invocationFailed(new Throwable());
         mBase.invocationEnded(0L);
 
diff --git a/tests/src/com/android/tradefed/device/metric/FilePullerDeviceMetricCollectorTest.java b/tests/src/com/android/tradefed/device/metric/FilePullerDeviceMetricCollectorTest.java
index b35ac21..61f963e 100644
--- a/tests/src/com/android/tradefed/device/metric/FilePullerDeviceMetricCollectorTest.java
+++ b/tests/src/com/android/tradefed/device/metric/FilePullerDeviceMetricCollectorTest.java
@@ -17,13 +17,14 @@
 
 import com.android.tradefed.config.OptionSetter;
 import com.android.tradefed.device.ITestDevice;
-import com.android.tradefed.device.metric.DeviceMetricData;
 import com.android.tradefed.invoker.IInvocationContext;
 import com.android.tradefed.invoker.InvocationContext;
+import com.android.tradefed.metrics.proto.MetricMeasurement.Metric;
 import com.android.tradefed.result.FileInputStreamSource;
 import com.android.tradefed.result.ITestInvocationListener;
 import com.android.tradefed.result.LogDataType;
 import com.android.tradefed.util.FileUtil;
+import com.android.tradefed.util.proto.TfMetricProtoUtil;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -35,7 +36,6 @@
 
 import java.io.File;
 import java.util.HashMap;
-import java.util.Map;
 
 /** Unit tests for {@link FilePullerDeviceMetricCollector}. */
 @RunWith(JUnit4.class)
@@ -77,7 +77,7 @@
     @Test
     public void testNoMatchingKey() {
         mFilePuller.testRunStarted("fakeRun", 5);
-        mFilePuller.testRunEnded(500, new HashMap<String, String>());
+        mFilePuller.testRunEnded(500, new HashMap<String, Metric>());
     }
 
     /**
@@ -88,8 +88,8 @@
     public void testPullMatchingKey() throws Exception {
         OptionSetter setter = new OptionSetter(mFilePuller);
         setter.setOptionValue("pull-pattern-keys", "coverageFile");
-        Map<String, String> currentMetrics = new HashMap<>();
-        currentMetrics.put("coverageFile", "/data/coverage");
+        HashMap<String, Metric> currentMetrics = new HashMap<>();
+        currentMetrics.put("coverageFile", TfMetricProtoUtil.stringToMetric("/data/coverage"));
 
         Mockito.when(mMockDevice.pullFile(Mockito.eq("/data/coverage")))
                 .thenReturn(new File("fake"));
@@ -110,8 +110,8 @@
         OptionSetter setter = new OptionSetter(mFilePuller);
         // Using a pattern to find the file
         setter.setOptionValue("pull-pattern-keys", "coverage.*");
-        Map<String, String> currentMetrics = new HashMap<>();
-        currentMetrics.put("coverageFile", "/data/coverage");
+        HashMap<String, Metric> currentMetrics = new HashMap<>();
+        currentMetrics.put("coverageFile", TfMetricProtoUtil.stringToMetric("/data/coverage"));
 
         Mockito.when(mMockDevice.pullFile(Mockito.eq("/data/coverage")))
                 .thenReturn(new File("fake"));
@@ -129,8 +129,8 @@
         OptionSetter setter = new OptionSetter(mFilePuller);
         // Using a pattern to find the file but no file matches
         setter.setOptionValue("pull-pattern-keys", "wrongPattern.*");
-        Map<String, String> currentMetrics = new HashMap<>();
-        currentMetrics.put("coverageFile", "/data/coverage");
+        HashMap<String, Metric> currentMetrics = new HashMap<>();
+        currentMetrics.put("coverageFile", TfMetricProtoUtil.stringToMetric("/data/coverage"));
 
         mFilePuller.testRunStarted("fakeRun", 5);
         mFilePuller.testRunEnded(500, currentMetrics);
@@ -149,8 +149,8 @@
     public void testPullMatchingDirectory() throws Exception {
         OptionSetter setter = new OptionSetter(mFilePuller);
         setter.setOptionValue("directory-keys", "coverageDirectory");
-        Map<String, String> currentMetrics = new HashMap<>();
-        currentMetrics.put("coverageDirectory", "/data/coverage");
+        HashMap<String, Metric> currentMetrics = new HashMap<>();
+        currentMetrics.put("coverageDirectory", TfMetricProtoUtil.stringToMetric("/data/coverage"));
 
         Mockito.when(mMockDevice.pullDir(Mockito.eq("coverageDirectory"),
                 Mockito.any(File.class))).thenReturn(true);
diff --git a/tests/src/com/android/tradefed/result/BugreportCollectorTest.java b/tests/src/com/android/tradefed/result/BugreportCollectorTest.java
index ac7c6bc..94a3e26 100644
--- a/tests/src/com/android/tradefed/result/BugreportCollectorTest.java
+++ b/tests/src/com/android/tradefed/result/BugreportCollectorTest.java
@@ -23,6 +23,7 @@
 import com.android.tradefed.result.BugreportCollector.Predicate;
 import com.android.tradefed.result.BugreportCollector.Relation;
 import com.android.tradefed.result.BugreportCollector.SubPredicate;
+import com.android.tradefed.util.proto.TfMetricProtoUtil;
 
 import junit.framework.TestCase;
 
@@ -330,8 +331,8 @@
         if (shouldFail) {
             mCollector.testFailed(test, STACK_TRACE);
         }
-        mCollector.testEnded(test, testMetrics);
-        mCollector.testRunEnded(0, runMetrics);
+        mCollector.testEnded(test, TfMetricProtoUtil.upgradeConvert(testMetrics));
+        mCollector.testRunEnded(0, TfMetricProtoUtil.upgradeConvert(runMetrics));
         return test;
     }
 
diff --git a/tests/src/com/android/tradefed/result/CollectingTestListenerTest.java b/tests/src/com/android/tradefed/result/CollectingTestListenerTest.java
index b219ff4..0c31280 100644
--- a/tests/src/com/android/tradefed/result/CollectingTestListenerTest.java
+++ b/tests/src/com/android/tradefed/result/CollectingTestListenerTest.java
@@ -19,10 +19,11 @@
 import com.android.tradefed.build.BuildInfo;
 import com.android.tradefed.invoker.IInvocationContext;
 import com.android.tradefed.invoker.InvocationContext;
+import com.android.tradefed.metrics.proto.MetricMeasurement.Metric;
+import com.android.tradefed.util.proto.TfMetricProtoUtil;
 
 import junit.framework.TestCase;
 
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
@@ -74,7 +75,7 @@
     public void testRunFailed() {
         mCollectingTestListener.testRunStarted("foo", 1);
         mCollectingTestListener.testRunFailed("error");
-        mCollectingTestListener.testRunEnded(0, Collections.emptyMap());
+        mCollectingTestListener.testRunEnded(0, new HashMap<String, Metric>());
         TestRunResult runResult = mCollectingTestListener.getCurrentRunResults();
         assertTrue(runResult.isRunComplete());
         assertTrue(runResult.isRunFailure());
@@ -87,12 +88,12 @@
     public void testRunFailed_counting() {
         mCollectingTestListener.testRunStarted("foo1", 1);
         mCollectingTestListener.testRunFailed("error1");
-        mCollectingTestListener.testRunEnded(0, Collections.emptyMap());
+        mCollectingTestListener.testRunEnded(0, new HashMap<String, Metric>());
         mCollectingTestListener.testRunStarted("foo2", 1);
-        mCollectingTestListener.testRunEnded(0, Collections.emptyMap());
+        mCollectingTestListener.testRunEnded(0, new HashMap<String, Metric>());
         mCollectingTestListener.testRunStarted("foo3", 1);
         mCollectingTestListener.testRunFailed("error3");
-        mCollectingTestListener.testRunEnded(0, Collections.emptyMap());
+        mCollectingTestListener.testRunEnded(0, new HashMap<String, Metric>());
         assertEquals(2, mCollectingTestListener.getNumAllFailedTestRuns());
     }
 
@@ -162,7 +163,7 @@
     public void testSingleRun_incomplete() {
         mCollectingTestListener.testRunStarted("run", 1);
         mCollectingTestListener.testStarted(new TestDescription("FooTest", "incomplete"));
-        mCollectingTestListener.testRunEnded(0, Collections.EMPTY_MAP);
+        mCollectingTestListener.testRunEnded(0, new HashMap<String, Metric>());
         assertEquals(1, mCollectingTestListener.getNumTestsInState(TestStatus.INCOMPLETE));
     }
 
@@ -272,8 +273,8 @@
         if (failtest) {
             mCollectingTestListener.testFailed(test, "trace");
         }
-        mCollectingTestListener.testEnded(test, testMetrics);
-        mCollectingTestListener.testRunEnded(0, runMetrics);
+        mCollectingTestListener.testEnded(test, TfMetricProtoUtil.upgradeConvert(testMetrics));
+        mCollectingTestListener.testRunEnded(0, TfMetricProtoUtil.upgradeConvert(runMetrics));
         return test;
     }
 }
diff --git a/tests/src/com/android/tradefed/result/ConsoleResultReporterTest.java b/tests/src/com/android/tradefed/result/ConsoleResultReporterTest.java
index c715706..9f93a73 100644
--- a/tests/src/com/android/tradefed/result/ConsoleResultReporterTest.java
+++ b/tests/src/com/android/tradefed/result/ConsoleResultReporterTest.java
@@ -16,10 +16,11 @@
 package com.android.tradefed.result;
 
 import com.android.tradefed.invoker.IInvocationContext;
+import com.android.tradefed.metrics.proto.MetricMeasurement.Metric;
+import com.android.tradefed.util.proto.TfMetricProtoUtil;
 
 import junit.framework.TestCase;
 
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -27,7 +28,7 @@
  * Unit tests for {@link ConsoleResultReporter}
  */
 public class ConsoleResultReporterTest extends TestCase {
-    private static final Map<String, String> EMPTY_MAP = Collections.emptyMap();
+    private static final HashMap<String, Metric> EMPTY_MAP = new HashMap<>();
     // Regex to match the TestResult run time format, examples: (10ms)  (5ms)
     private static final String RUN_TIME_MS_REGEX = "\\((\\d+)ms\\)";
 
@@ -53,7 +54,7 @@
         Map<String, String> metrics = new HashMap<>();
         metrics.put("key2", "value2");
         metrics.put("key1", "value1");
-        reporter.testRunEnded(0, metrics);
+        reporter.testRunEnded(0, TfMetricProtoUtil.upgradeConvert(metrics));
         reporter.invocationEnded(0);
         assertEquals(
                 "Test results:\n" +
@@ -77,7 +78,7 @@
         metrics.put("key2", "value2");
         metrics.put("key1", "value1");
         reporter.testEnded(testId, metrics);
-        reporter.testRunEnded(0, EMPTY_MAP);
+        reporter.testRunEnded(0, new HashMap<String, Metric>());
         reporter.invocationEnded(0);
 
         StringBuilder expected = new StringBuilder();
@@ -152,7 +153,7 @@
         Map<String, String> run1Metrics = new HashMap<>();
         run1Metrics.put("run1_key1", "run1_value2");
         run1Metrics.put("run1_key2", "run1_value1");
-        reporter.testRunEnded(0, run1Metrics);
+        reporter.testRunEnded(0, TfMetricProtoUtil.upgradeConvert(run1Metrics));
 
         reporter.testRunStarted("Test Run 2", 4);
         TestDescription run2test1Id = new TestDescription("class2", "method1");
@@ -179,7 +180,7 @@
         Map<String, String> run3Metrics = new HashMap<>();
         run3Metrics.put("run3_key1", "run3_value1");
         run3Metrics.put("run3_key2", "run3_value2");
-        reporter.testRunEnded(0, run3Metrics);
+        reporter.testRunEnded(0, TfMetricProtoUtil.upgradeConvert(run3Metrics));
 
         reporter.testRunStarted("Test Run 4", 0);
         reporter.testRunEnded(0, EMPTY_MAP);
diff --git a/tests/src/com/android/tradefed/result/MetricsXMLResultReporterTest.java b/tests/src/com/android/tradefed/result/MetricsXMLResultReporterTest.java
index d61d04c..a6103c5 100644
--- a/tests/src/com/android/tradefed/result/MetricsXMLResultReporterTest.java
+++ b/tests/src/com/android/tradefed/result/MetricsXMLResultReporterTest.java
@@ -23,6 +23,8 @@
 import com.android.tradefed.config.OptionSetter;
 import com.android.tradefed.invoker.IInvocationContext;
 import com.android.tradefed.invoker.InvocationContext;
+import com.android.tradefed.metrics.proto.MetricMeasurement.Metric;
+import com.android.tradefed.util.proto.TfMetricProtoUtil;
 
 import org.junit.Before;
 import org.junit.Test;
@@ -30,7 +32,6 @@
 import org.mockito.Spy;
 
 import java.io.ByteArrayOutputStream;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -80,7 +81,7 @@
         mResultReporter.testRunStarted("run", 1);
         mResultReporter.testStarted(testId);
         mResultReporter.testEnded(testId, map);
-        mResultReporter.testRunEnded(3, map);
+        mResultReporter.testRunEnded(3, TfMetricProtoUtil.upgradeConvert(map));
         mResultReporter.invocationEnded(1);
         String output = getOutput();
         assertTrue(output.contains("<runmetric name=\"metric-1\" value=\"1.0\" />"));
@@ -106,8 +107,8 @@
         mResultReporter.invocationStarted(context);
         mResultReporter.testRunStarted("run", 1);
         mResultReporter.testStarted(testId);
-        mResultReporter.testEnded(testId, map);
-        mResultReporter.testRunEnded(3, Collections.emptyMap());
+        mResultReporter.testEnded(testId, TfMetricProtoUtil.upgradeConvert(map));
+        mResultReporter.testRunEnded(3, new HashMap<String, Metric>());
         mResultReporter.invocationEnded(1);
         String output = getOutput();
         assertTrue(output.contains("<testmetric name=\"metric-1\" value=\"1.0\" />"));
@@ -132,8 +133,8 @@
         mResultReporter.testRunStarted("run", 1);
         mResultReporter.testStarted(testId);
         mResultReporter.testFailed(testId, trace);
-        mResultReporter.testEnded(testId, map);
-        mResultReporter.testRunEnded(3, Collections.emptyMap());
+        mResultReporter.testEnded(testId, TfMetricProtoUtil.upgradeConvert(map));
+        mResultReporter.testRunEnded(3, new HashMap<String, Metric>());
         mResultReporter.invocationEnded(1);
         String output = getOutput();
         assertTrue(output.contains("tests=\"1\" failures=\"1\""));
diff --git a/tests/src/com/android/tradefed/result/SubprocessResultsReporterTest.java b/tests/src/com/android/tradefed/result/SubprocessResultsReporterTest.java
index a16bccf..ac40285 100644
--- a/tests/src/com/android/tradefed/result/SubprocessResultsReporterTest.java
+++ b/tests/src/com/android/tradefed/result/SubprocessResultsReporterTest.java
@@ -20,6 +20,7 @@
 
 import com.android.tradefed.config.OptionSetter;
 import com.android.tradefed.invoker.InvocationContext;
+import com.android.tradefed.metrics.proto.MetricMeasurement.Metric;
 import com.android.tradefed.util.FileUtil;
 import com.android.tradefed.util.SubprocessTestResultsParser;
 
@@ -31,6 +32,7 @@
 
 import java.io.File;
 import java.util.Collections;
+import java.util.HashMap;
 
 /**
  * Unit Tests for {@link SubprocessResultsReporter}
@@ -67,7 +69,7 @@
         try {
             setter.setOptionValue("subprocess-report-file", tmpReportFile.getAbsolutePath());
             mReporter.testRunStarted("TEST", 5);
-            mReporter.testRunEnded(100, Collections.emptyMap());
+            mReporter.testRunEnded(100, new HashMap<String, Metric>());
             String content = FileUtil.readStringFromFile(tmpReportFile);
             assertEquals("TEST_RUN_STARTED {\"testCount\":5,\"runName\":\"TEST\"}\n"
                     + "TEST_RUN_ENDED {\"time\":100}\n", content);
diff --git a/tests/src/com/android/tradefed/result/XmlResultReporterTest.java b/tests/src/com/android/tradefed/result/XmlResultReporterTest.java
index 0e20f82..dd28245 100644
--- a/tests/src/com/android/tradefed/result/XmlResultReporterTest.java
+++ b/tests/src/com/android/tradefed/result/XmlResultReporterTest.java
@@ -18,13 +18,13 @@
 import com.android.tradefed.build.BuildInfo;
 import com.android.tradefed.invoker.IInvocationContext;
 import com.android.tradefed.invoker.InvocationContext;
+import com.android.tradefed.metrics.proto.MetricMeasurement.Metric;
 
 import junit.framework.TestCase;
 
 import java.io.ByteArrayOutputStream;
 import java.io.InputStream;
-import java.util.Collections;
-import java.util.Map;
+import java.util.HashMap;
 
 /**
  * Unit tests for {@link XmlResultReporter}.
@@ -115,7 +115,7 @@
      * A simple test to ensure expected output is generated for test run with a single passed test.
      */
     public void testSinglePass() {
-        Map<String, String> emptyMap = Collections.emptyMap();
+        HashMap<String, Metric> emptyMap = new HashMap<>();
         final TestDescription testId = new TestDescription("FooTest", "testFoo");
         IInvocationContext context = new InvocationContext();
         context.addDeviceBuildInfo("fakeDevice", new BuildInfo());
@@ -138,7 +138,7 @@
      * A simple test to ensure expected output is generated for test run with a single failed test.
      */
     public void testSingleFail() {
-        Map<String, String> emptyMap = Collections.emptyMap();
+        HashMap<String, Metric> emptyMap = new HashMap<>();
         final TestDescription testId = new TestDescription("FooTest", "testFoo");
         final String trace = "this is a trace";
         IInvocationContext context = new InvocationContext();
diff --git a/tests/src/com/android/tradefed/result/suite/FormattedGeneratorReporterTest.java b/tests/src/com/android/tradefed/result/suite/FormattedGeneratorReporterTest.java
index 4dd27e4..db07cf3 100644
--- a/tests/src/com/android/tradefed/result/suite/FormattedGeneratorReporterTest.java
+++ b/tests/src/com/android/tradefed/result/suite/FormattedGeneratorReporterTest.java
@@ -19,6 +19,7 @@
 import com.android.tradefed.build.IBuildInfo;
 import com.android.tradefed.invoker.IInvocationContext;
 import com.android.tradefed.invoker.InvocationContext;
+import com.android.tradefed.metrics.proto.MetricMeasurement.Metric;
 import com.android.tradefed.result.TestDescription;
 import com.android.tradefed.testtype.Abi;
 import com.android.tradefed.testtype.IAbi;
@@ -95,8 +96,8 @@
         mReporter.invocationStarted(mContext);
         mReporter.testRunStarted("run1", 1);
         mReporter.testStarted(new TestDescription("class", "method"));
-        mReporter.testEnded(new TestDescription("class", "method"), new HashMap<String, String>());
-        mReporter.testRunEnded(450L, new HashMap<String, String>());
+        mReporter.testEnded(new TestDescription("class", "method"), new HashMap<String, Metric>());
+        mReporter.testRunEnded(450L, new HashMap<String, Metric>());
         mReporter.invocationEnded(500L);
     }
 
@@ -127,8 +128,8 @@
         mReporter.testModuleStarted(moduleContext);
         mReporter.testRunStarted("run1", 1);
         mReporter.testStarted(new TestDescription("class", "method"));
-        mReporter.testEnded(new TestDescription("class", "method"), new HashMap<String, String>());
-        mReporter.testRunEnded(450L, new HashMap<String, String>());
+        mReporter.testEnded(new TestDescription("class", "method"), new HashMap<String, Metric>());
+        mReporter.testRunEnded(450L, new HashMap<String, Metric>());
         mReporter.testModuleEnded();
         mReporter.invocationEnded(500L);
     }
diff --git a/tests/src/com/android/tradefed/targetprep/SdkAvdPreparerStressTest.java b/tests/src/com/android/tradefed/targetprep/SdkAvdPreparerStressTest.java
index b09f4f6..14613ec 100644
--- a/tests/src/com/android/tradefed/targetprep/SdkAvdPreparerStressTest.java
+++ b/tests/src/com/android/tradefed/targetprep/SdkAvdPreparerStressTest.java
@@ -23,6 +23,7 @@
 import com.android.tradefed.testtype.IBuildReceiver;
 import com.android.tradefed.testtype.IDeviceTest;
 import com.android.tradefed.testtype.IRemoteTest;
+import com.android.tradefed.util.proto.TfMetricProtoUtil;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -63,7 +64,9 @@
          finally {
             Map<String, String> metrics = new HashMap<String, String>(1);
             metrics.put("iterations", Integer.toString(i));
-            listener.testRunEnded(System.currentTimeMillis()-startTime, metrics);
+            listener.testRunEnded(
+                    System.currentTimeMillis() - startTime,
+                    TfMetricProtoUtil.upgradeConvert(metrics));
         }
     }
 
diff --git a/tests/src/com/android/tradefed/testtype/CodeCoverageListenerTest.java b/tests/src/com/android/tradefed/testtype/CodeCoverageListenerTest.java
index 280f678..02e9779 100644
--- a/tests/src/com/android/tradefed/testtype/CodeCoverageListenerTest.java
+++ b/tests/src/com/android/tradefed/testtype/CodeCoverageListenerTest.java
@@ -17,20 +17,22 @@
 package com.android.tradefed.testtype;
 
 import static org.junit.Assert.fail;
-import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.anyString;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.eq;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
 
 import com.android.tradefed.device.DeviceNotAvailableException;
 import com.android.tradefed.device.ITestDevice;
-import com.android.tradefed.result.InputStreamSource;
+import com.android.tradefed.metrics.proto.MetricMeasurement.Metric;
 import com.android.tradefed.result.ITestInvocationListener;
+import com.android.tradefed.result.InputStreamSource;
 import com.android.tradefed.result.LogDataType;
+import com.android.tradefed.util.proto.TfMetricProtoUtil;
+
 import com.google.common.base.VerifyException;
-import com.google.common.collect.ImmutableMap;
 import com.google.protobuf.ByteString;
 
 import org.junit.Before;
@@ -45,9 +47,11 @@
 
 import java.io.File;
 import java.io.FileOutputStream;
-import java.io.InputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.OutputStream;
+import java.util.HashMap;
+import java.util.Map;
 
 /** Unit tests for {@link CodeCoverageListener}. */
 @RunWith(JUnit4.class)
@@ -88,8 +92,9 @@
 
         // Simulate a test run.
         mCodeCoverageListener.testRunStarted(RUN_NAME, TEST_COUNT);
-        mCodeCoverageListener.testRunEnded(
-                ELAPSED_TIME, ImmutableMap.of("coverageFilePath", DEVICE_PATH));
+        Map<String, String> metric = new HashMap<>();
+        metric.put("coverageFilePath", DEVICE_PATH);
+        mCodeCoverageListener.testRunEnded(ELAPSED_TIME, TfMetricProtoUtil.upgradeConvert(metric));
 
         // Verify testLog(..) was called with the coverage file.
         verify(mFakeListener)
@@ -100,7 +105,7 @@
     public void testFailure_noCoverageMetric() {
         // Simulate a test run.
         mCodeCoverageListener.testRunStarted(RUN_NAME, TEST_COUNT);
-        mCodeCoverageListener.testRunEnded(ELAPSED_TIME, ImmutableMap.of());
+        mCodeCoverageListener.testRunEnded(ELAPSED_TIME, new HashMap<String, Metric>());
 
         // Verify that the test run is marked as a failure.
         verify(mFakeListener).testRunFailed(anyString());
@@ -119,8 +124,10 @@
         mCodeCoverageListener.testRunStarted(RUN_NAME, TEST_COUNT);
 
         try {
+            Map<String, String> metric = new HashMap<>();
+            metric.put("coverageFilePath", DEVICE_PATH);
             mCodeCoverageListener.testRunEnded(
-                    ELAPSED_TIME, ImmutableMap.of("coverageFilePath", DEVICE_PATH));
+                    ELAPSED_TIME, TfMetricProtoUtil.upgradeConvert(metric));
             fail("Exception not thrown");
         } catch (VerifyException expected) {
         }
diff --git a/tests/src/com/android/tradefed/testtype/junit4/BaseHostJUnit4TestTest.java b/tests/src/com/android/tradefed/testtype/junit4/BaseHostJUnit4TestTest.java
index cbe3049..c5c2ce6 100644
--- a/tests/src/com/android/tradefed/testtype/junit4/BaseHostJUnit4TestTest.java
+++ b/tests/src/com/android/tradefed/testtype/junit4/BaseHostJUnit4TestTest.java
@@ -50,7 +50,6 @@
 import org.mockito.Mockito;
 
 import java.io.File;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -73,8 +72,8 @@
             listener.testRunStarted("testRun", 1);
             TestDescription tid = new TestDescription("class", "test1");
             listener.testStarted(tid);
-            listener.testEnded(tid, Collections.emptyMap());
-            listener.testRunEnded(500l, Collections.emptyMap());
+            listener.testEnded(tid, new HashMap<String, Metric>());
+            listener.testRunEnded(500l, new HashMap<String, Metric>());
             return listener;
         }
     }
@@ -96,7 +95,7 @@
             CollectingTestListener listener = new CollectingTestListener();
             listener.testRunStarted("testRun", 1);
             listener.testRunFailed("instrumentation crashed");
-            listener.testRunEnded(50L, Collections.emptyMap());
+            listener.testRunEnded(50L, new HashMap<String, Metric>());
             return listener;
         }
     }
diff --git a/tests/src/com/android/tradefed/testtype/suite/ModuleListenerTest.java b/tests/src/com/android/tradefed/testtype/suite/ModuleListenerTest.java
index 47e18ab..b8cc23b 100644
--- a/tests/src/com/android/tradefed/testtype/suite/ModuleListenerTest.java
+++ b/tests/src/com/android/tradefed/testtype/suite/ModuleListenerTest.java
@@ -18,6 +18,7 @@
 import static org.junit.Assert.assertEquals;
 
 import com.android.ddmlib.testrunner.TestResult.TestStatus;
+import com.android.tradefed.metrics.proto.MetricMeasurement.Metric;
 import com.android.tradefed.result.ITestInvocationListener;
 import com.android.tradefed.result.TestDescription;
 
@@ -26,7 +27,7 @@
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
 
-import java.util.Collections;
+import java.util.HashMap;
 
 /** Unit tests for {@link ModuleListener} * */
 @RunWith(JUnit4.class)
@@ -49,9 +50,9 @@
         for (int i = 0; i < numTests; i++) {
             TestDescription tid = new TestDescription("class", "test" + i);
             mListener.testStarted(tid);
-            mListener.testEnded(tid, Collections.emptyMap());
+            mListener.testEnded(tid, new HashMap<String, Metric>());
         }
-        mListener.testRunEnded(0, Collections.emptyMap());
+        mListener.testRunEnded(0, new HashMap<String, Metric>());
         assertEquals(numTests, mListener.getNumTotalTests());
         assertEquals(numTests, mListener.getNumTestsInState(TestStatus.PASSED));
     }
@@ -64,8 +65,8 @@
         TestDescription tid = new TestDescription("class", "test" + numTests);
         // Only one test execute
         mListener.testStarted(tid);
-        mListener.testEnded(tid, Collections.emptyMap());
-        mListener.testRunEnded(0, Collections.emptyMap());
+        mListener.testEnded(tid, new HashMap<String, Metric>());
+        mListener.testRunEnded(0, new HashMap<String, Metric>());
 
         assertEquals(numTests, mListener.getNumTotalTests());
         assertEquals(1, mListener.getNumTestsInState(TestStatus.PASSED));
@@ -82,17 +83,17 @@
         TestDescription tid = new TestDescription("class", "test" + numTests);
         // Only one test execute the first time
         mListener.testStarted(tid);
-        mListener.testEnded(tid, Collections.emptyMap());
-        mListener.testRunEnded(0, Collections.emptyMap());
+        mListener.testEnded(tid, new HashMap<String, Metric>());
+        mListener.testRunEnded(0, new HashMap<String, Metric>());
 
         // Runner restart to execute all the remaining
         mListener.testRunStarted("run1", numTests - 1);
         for (int i = 0; i < numTests - 1; i++) {
             TestDescription tid2 = new TestDescription("class", "test" + i);
             mListener.testStarted(tid2);
-            mListener.testEnded(tid2, Collections.emptyMap());
+            mListener.testEnded(tid2, new HashMap<String, Metric>());
         }
-        mListener.testRunEnded(0, Collections.emptyMap());
+        mListener.testRunEnded(0, new HashMap<String, Metric>());
 
         assertEquals(numTests, mListener.getNumTotalTests());
         assertEquals(numTests, mListener.getNumTestsInState(TestStatus.PASSED));
@@ -106,17 +107,17 @@
         for (int i = 0; i < numTests; i++) {
             TestDescription tid = new TestDescription("class", "test" + i);
             mListener.testStarted(tid);
-            mListener.testEnded(tid, Collections.emptyMap());
+            mListener.testEnded(tid, new HashMap<String, Metric>());
         }
-        mListener.testRunEnded(0, Collections.emptyMap());
+        mListener.testRunEnded(0, new HashMap<String, Metric>());
 
         mListener.testRunStarted("run2", numTests);
         for (int i = 0; i < numTests; i++) {
             TestDescription tid = new TestDescription("class2", "test" + i);
             mListener.testStarted(tid);
-            mListener.testEnded(tid, Collections.emptyMap());
+            mListener.testEnded(tid, new HashMap<String, Metric>());
         }
-        mListener.testRunEnded(0, Collections.emptyMap());
+        mListener.testRunEnded(0, new HashMap<String, Metric>());
         assertEquals(numTests * 2, mListener.getNumTotalTests());
         assertEquals(numTests * 2, mListener.getNumTestsInState(TestStatus.PASSED));
     }
diff --git a/tests/src/com/android/tradefed/testtype/suite/MultiDeviceStubTest.java b/tests/src/com/android/tradefed/testtype/suite/MultiDeviceStubTest.java
index 20aecf7..058191f 100644
--- a/tests/src/com/android/tradefed/testtype/suite/MultiDeviceStubTest.java
+++ b/tests/src/com/android/tradefed/testtype/suite/MultiDeviceStubTest.java
@@ -19,13 +19,14 @@
 import com.android.tradefed.device.DeviceNotAvailableException;
 import com.android.tradefed.device.ITestDevice;
 import com.android.tradefed.invoker.IInvocationContext;
+import com.android.tradefed.metrics.proto.MetricMeasurement.Metric;
 import com.android.tradefed.result.ITestInvocationListener;
 import com.android.tradefed.result.TestDescription;
 import com.android.tradefed.testtype.IInvocationContextReceiver;
 import com.android.tradefed.testtype.IMultiDeviceTest;
 import com.android.tradefed.testtype.IRemoteTest;
 
-import java.util.Collections;
+import java.util.HashMap;
 import java.util.Map;
 
 /** Stub Test class that uses multiple devices. */
@@ -66,9 +67,9 @@
         for (int i = 0; i < 2; i++) {
             TestDescription tid = new TestDescription(getClass().getSimpleName(), "test" + i);
             listener.testStarted(tid, 0);
-            listener.testEnded(tid, 5, Collections.emptyMap());
+            listener.testEnded(tid, 5, new HashMap<String, Metric>());
         }
-        listener.testRunEnded(500, Collections.emptyMap());
+        listener.testRunEnded(500, new HashMap<String, Metric>());
     }
 
     public void setExceptedDevice(int num) {
diff --git a/tests/src/com/android/tradefed/testtype/suite/TestSuiteStub.java b/tests/src/com/android/tradefed/testtype/suite/TestSuiteStub.java
index d6279c5..efb6aba 100644
--- a/tests/src/com/android/tradefed/testtype/suite/TestSuiteStub.java
+++ b/tests/src/com/android/tradefed/testtype/suite/TestSuiteStub.java
@@ -18,6 +18,7 @@
 import com.android.tradefed.config.Option;
 import com.android.tradefed.config.OptionCopier;
 import com.android.tradefed.device.DeviceNotAvailableException;
+import com.android.tradefed.metrics.proto.MetricMeasurement.Metric;
 import com.android.tradefed.result.ByteArrayInputStreamSource;
 import com.android.tradefed.result.ITestInvocationListener;
 import com.android.tradefed.result.LogDataType;
@@ -32,7 +33,7 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Set;
 
@@ -86,7 +87,7 @@
                     LogDataType.LOGCAT,
                     new ByteArrayInputStreamSource("test".getBytes()));
         }
-        listener.testEnded(tid, Collections.emptyMap());
+        listener.testEnded(tid, new HashMap<String, Metric>());
 
         if (mIsComplete) {
             // possibly skip this one to create some not_executed case.
@@ -101,7 +102,7 @@
                         LogDataType.BUGREPORT,
                         new ByteArrayInputStreamSource("test".getBytes()));
             }
-            listener.testEnded(tid2, Collections.emptyMap());
+            listener.testEnded(tid2, new HashMap<String, Metric>());
         }
 
         TestDescription tid3 = new TestDescription("TestStub", "test3");
@@ -115,7 +116,7 @@
                     LogDataType.BUGREPORT,
                     new ByteArrayInputStreamSource("test".getBytes()));
         }
-        listener.testEnded(tid3, Collections.emptyMap());
+        listener.testEnded(tid3, new HashMap<String, Metric>());
 
         if (mLogFiles) {
             // One file logged at run level
@@ -124,7 +125,7 @@
                     LogDataType.EAR,
                     new ByteArrayInputStreamSource("test".getBytes()));
         }
-        listener.testRunEnded(0, Collections.emptyMap());
+        listener.testRunEnded(0, new HashMap<String, Metric>());
     }
 
     /** {@inheritDoc} */
@@ -137,7 +138,7 @@
                 } else {
                     // We fake an internal retry by calling testRunStart/Ended again.
                     listener.testRunStarted(mModule, 3);
-                    listener.testRunEnded(0, Collections.emptyMap());
+                    listener.testRunEnded(0, new HashMap<String, Metric>());
                     testAttempt(listener);
                 }
             } else {
@@ -151,21 +152,21 @@
                 if (mIsComplete) {
                     for (TestDescription tid : mShardedTestToRun) {
                         listener.testStarted(tid);
-                        listener.testEnded(tid, Collections.emptyMap());
+                        listener.testEnded(tid, new HashMap<String, Metric>());
                     }
                 } else {
                     TestDescription tid = mShardedTestToRun.get(0);
                     listener.testStarted(tid);
-                    listener.testEnded(tid, Collections.emptyMap());
+                    listener.testEnded(tid, new HashMap<String, Metric>());
                 }
 
                 if (mDoesOneTestFail) {
                     TestDescription tid = new TestDescription("TestStub", "failed" + mShardIndex);
                     listener.testStarted(tid);
                     listener.testFailed(tid, "shard failed this one.");
-                    listener.testEnded(tid, Collections.emptyMap());
+                    listener.testEnded(tid, new HashMap<String, Metric>());
                 }
-                listener.testRunEnded(0, Collections.emptyMap());
+                listener.testRunEnded(0, new HashMap<String, Metric>());
             }
         }
     }
diff --git a/tests/src/com/android/tradefed/util/MetricsXmlParserTest.java b/tests/src/com/android/tradefed/util/MetricsXmlParserTest.java
index c249a5a..9cb20de 100644
--- a/tests/src/com/android/tradefed/util/MetricsXmlParserTest.java
+++ b/tests/src/com/android/tradefed/util/MetricsXmlParserTest.java
@@ -27,10 +27,12 @@
 import com.android.tradefed.config.OptionSetter;
 import com.android.tradefed.invoker.IInvocationContext;
 import com.android.tradefed.invoker.InvocationContext;
+import com.android.tradefed.metrics.proto.MetricMeasurement.Metric;
 import com.android.tradefed.result.MetricsXMLResultReporter;
 import com.android.tradefed.result.TestDescription;
 import com.android.tradefed.testtype.metricregression.Metrics;
 import com.android.tradefed.util.MetricsXmlParser.ParseException;
+import com.android.tradefed.util.proto.TfMetricProtoUtil;
 
 import com.google.common.collect.ImmutableSet;
 
@@ -91,14 +93,14 @@
         mResultReporter.testRunStarted("run", 3);
         final TestDescription testId0 = new TestDescription("Test", "pass1");
         mResultReporter.testStarted(testId0);
-        mResultReporter.testEnded(testId0, Collections.emptyMap());
+        mResultReporter.testEnded(testId0, new HashMap<String, Metric>());
         final TestDescription testId1 = new TestDescription("Test", "pass2");
         mResultReporter.testStarted(testId1);
-        mResultReporter.testEnded(testId1, Collections.emptyMap());
+        mResultReporter.testEnded(testId1, new HashMap<String, Metric>());
         final TestDescription testId2 = new TestDescription("Test", "pass3");
         mResultReporter.testStarted(testId2);
-        mResultReporter.testEnded(testId2, Collections.emptyMap());
-        mResultReporter.testRunEnded(3, Collections.emptyMap());
+        mResultReporter.testEnded(testId2, new HashMap<String, Metric>());
+        mResultReporter.testRunEnded(3, new HashMap<String, Metric>());
         mResultReporter.invocationEnded(5);
 
         MetricsXmlParser.parse(
@@ -122,17 +124,17 @@
         mResultReporter.testStarted(testId0);
         Map<String, String> testMetrics0 = new HashMap<>();
         testMetrics0.put("metric1", "1.1");
-        mResultReporter.testEnded(testId0, testMetrics0);
+        mResultReporter.testEnded(testId0, TfMetricProtoUtil.upgradeConvert(testMetrics0));
 
         final TestDescription testId1 = new TestDescription("Test", "pass2");
         mResultReporter.testStarted(testId1);
         Map<String, String> testMetrics1 = new HashMap<>();
         testMetrics1.put("metric2", "5.5");
-        mResultReporter.testEnded(testId1, testMetrics1);
+        mResultReporter.testEnded(testId1, TfMetricProtoUtil.upgradeConvert(testMetrics1));
 
         Map<String, String> runMetrics = new HashMap<>();
         runMetrics.put("metric3", "8.8");
-        mResultReporter.testRunEnded(3, runMetrics);
+        mResultReporter.testRunEnded(3, TfMetricProtoUtil.upgradeConvert(runMetrics));
         mResultReporter.invocationEnded(5);
 
         MetricsXmlParser.parse(
@@ -157,17 +159,17 @@
         mResultReporter.testStarted(testId0);
         Map<String, String> testMetrics0 = new HashMap<>();
         testMetrics0.put("metric1", "1.1");
-        mResultReporter.testEnded(testId0, testMetrics0);
+        mResultReporter.testEnded(testId0, TfMetricProtoUtil.upgradeConvert(testMetrics0));
 
         final TestDescription testId1 = new TestDescription("Test", "pass2");
         mResultReporter.testStarted(testId1);
         Map<String, String> testMetrics1 = new HashMap<>();
         testMetrics1.put("metric2", "5.5");
-        mResultReporter.testEnded(testId1, testMetrics1);
+        mResultReporter.testEnded(testId1, TfMetricProtoUtil.upgradeConvert(testMetrics1));
 
         Map<String, String> runMetrics = new HashMap<>();
         runMetrics.put("metric3", "8.8");
-        mResultReporter.testRunEnded(3, runMetrics);
+        mResultReporter.testRunEnded(3, TfMetricProtoUtil.upgradeConvert(runMetrics));
         mResultReporter.invocationEnded(5);
 
         Set<String> blacklist = ImmutableSet.of("metric1", "metric3");