Report a base for device lost
More improvements could be done to get more confidence on
the signal.
Test: unit tests
Bug: 153879391
Change-Id: I1c6804fb889c730085a1f056614b872a2dc30755
diff --git a/invocation_interfaces/com/android/tradefed/invoker/logger/InvocationMetricLogger.java b/invocation_interfaces/com/android/tradefed/invoker/logger/InvocationMetricLogger.java
index a23b5c1..19666d8 100644
--- a/invocation_interfaces/com/android/tradefed/invoker/logger/InvocationMetricLogger.java
+++ b/invocation_interfaces/com/android/tradefed/invoker/logger/InvocationMetricLogger.java
@@ -38,6 +38,7 @@
SHUTDOWN_HARD_LATENCY("shutdown_hard_latency_ms", false),
DEVICE_DONE_TIMESTAMP("device_done_timestamp", false),
DEVICE_RELEASE_STATE("device_release_state", false),
+ DEVICE_LOST_DETECTED("device_lost_detected", false),
SANDBOX_EXIT_CODE("sandbox_exit_code", false),
CF_FETCH_ARTIFACT_TIME("cf_fetch_artifact_time_ms", false),
CF_GCE_CREATE_TIME("cf_gce_create_time_ms", false),
diff --git a/src/com/android/tradefed/invoker/TestInvocation.java b/src/com/android/tradefed/invoker/TestInvocation.java
index 46edad7..2bf69ee 100644
--- a/src/com/android/tradefed/invoker/TestInvocation.java
+++ b/src/com/android/tradefed/invoker/TestInvocation.java
@@ -341,17 +341,26 @@
}
mStatus = "done running tests";
// Track the timestamp when we are done with devices
- InvocationMetricLogger.addInvocationMetrics(
+ addInvocationMetric(
InvocationMetricKey.DEVICE_DONE_TIMESTAMP, System.currentTimeMillis());
- if (config.getCommandOptions().earlyDeviceRelease()) {
- // Capture the FreeDeviceState of the primary device
- Map<ITestDevice, FreeDeviceState> devicesStates =
- CommandScheduler.createReleaseMap(context, exception);
- if (devicesStates.size() >= 1) {
- InvocationMetricLogger.addInvocationMetrics(
- InvocationMetricKey.DEVICE_RELEASE_STATE,
- devicesStates.values().iterator().next().toString());
+ // Capture the FreeDeviceState of the primary device
+ Map<ITestDevice, FreeDeviceState> devicesStates =
+ CommandScheduler.createReleaseMap(context, exception);
+ if (devicesStates.size() >= 1) {
+ addInvocationMetric(
+ InvocationMetricKey.DEVICE_RELEASE_STATE,
+ devicesStates.values().iterator().next().toString());
+ }
+ int countLost = 0;
+ for (FreeDeviceState fds : devicesStates.values()) {
+ if (FreeDeviceState.UNAVAILABLE.equals(fds)) {
+ countLost++;
}
+ }
+ if (countLost > 0) {
+ addInvocationMetric(InvocationMetricKey.DEVICE_LOST_DETECTED, countLost);
+ }
+ if (config.getCommandOptions().earlyDeviceRelease()) {
for (IScheduledInvocationListener scheduleListener : mSchedulerListeners) {
scheduleListener.releaseDevices(context, devicesStates);
}
@@ -921,6 +930,14 @@
.setLastInvocationExitCode(code, stack);
}
+ protected void addInvocationMetric(InvocationMetricKey key, long value) {
+ InvocationMetricLogger.addInvocationMetrics(key, value);
+ }
+
+ protected void addInvocationMetric(InvocationMetricKey key, String value) {
+ InvocationMetricLogger.addInvocationMetrics(key, value);
+ }
+
public static String getDeviceLogName(Stage stage) {
return DEVICE_LOG_NAME_PREFIX + stage.getName();
}
diff --git a/tests/src/com/android/tradefed/invoker/TestInvocationTest.java b/tests/src/com/android/tradefed/invoker/TestInvocationTest.java
index 6b01fc4..48a2590 100644
--- a/tests/src/com/android/tradefed/invoker/TestInvocationTest.java
+++ b/tests/src/com/android/tradefed/invoker/TestInvocationTest.java
@@ -51,6 +51,7 @@
import com.android.tradefed.device.StubDevice;
import com.android.tradefed.device.TcpDevice;
import com.android.tradefed.device.TestDeviceOptions;
+import com.android.tradefed.device.TestDeviceState;
import com.android.tradefed.device.metric.BaseDeviceMetricCollector;
import com.android.tradefed.device.metric.DeviceMetricData;
import com.android.tradefed.device.metric.IMetricCollector;
@@ -217,6 +218,8 @@
EasyMock.expect(mMockDevice.getSerialNumber()).andStubReturn(SERIAL);
EasyMock.expect(mMockDevice.getIDevice()).andStubReturn(null);
EasyMock.expect(mMockDevice.getBattery()).andStubReturn(null);
+ EasyMock.expect(mMockDevice.getDeviceState()).andStubReturn(TestDeviceState.NOT_AVAILABLE);
+ mMockDevice.setRecoveryMode(RecoveryMode.AVAILABLE);
mMockDevice.setRecovery(mMockRecovery);
mMockDevice.preInvocationSetup(
(IBuildInfo) EasyMock.anyObject(), EasyMock.<List<IBuildInfo>>anyObject());
@@ -307,6 +310,12 @@
public void registerExecutionFiles(ExecutionFiles executionFiles) {
// Empty of purpose
}
+
+ @Override
+ protected void addInvocationMetric(InvocationMetricKey key, long value) {}
+
+ @Override
+ protected void addInvocationMetric(InvocationMetricKey key, String value) {}
};
}
@@ -1565,6 +1574,12 @@
// Avoid re-entry in the current TF invocation scope for unit tests.
return new InvocationScope();
}
+
+ @Override
+ protected void addInvocationMetric(InvocationMetricKey key, long value) {}
+
+ @Override
+ protected void addInvocationMetric(InvocationMetricKey key, String value) {}
};
mMockBuildInfo = EasyMock.createMock(IDeviceBuildInfo.class);
EasyMock.expect(mMockBuildInfo.getProperties()).andStubReturn(new HashSet<>());
@@ -1645,6 +1660,12 @@
// Avoid re-entry in the current TF invocation scope for unit tests.
return new InvocationScope();
}
+
+ @Override
+ protected void addInvocationMetric(InvocationMetricKey key, long value) {}
+
+ @Override
+ protected void addInvocationMetric(InvocationMetricKey key, String value) {}
};
mMockBuildInfo = EasyMock.createMock(IDeviceBuildInfo.class);
IRemoteTest test = EasyMock.createNiceMock(IRemoteTest.class);
@@ -1743,6 +1764,12 @@
// Avoid re-entry in the current TF invocation scope for unit tests.
return new InvocationScope();
}
+
+ @Override
+ protected void addInvocationMetric(InvocationMetricKey key, long value) {}
+
+ @Override
+ protected void addInvocationMetric(InvocationMetricKey key, String value) {}
};
mMockBuildInfo = EasyMock.createMock(IDeviceBuildInfo.class);
IRemoteTest test = EasyMock.createNiceMock(IRemoteTest.class);