summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeffrey Huang <jeffreyhuang@google.com>2024-03-21 17:35:30 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2024-03-21 17:35:30 +0000
commit77b1a1d738840ff9e4ad36ef25de5ab4481fa5a7 (patch)
tree59f73a8492c858a4aded5ef59a6a33a8f28bc9bb
parentcc0b11e460eb4735308aa547005cb50ed873cb26 (diff)
parent031cd9ab1a430ed294047b2ec6ea686b0bf1150f (diff)
downloadStatsD-77b1a1d738840ff9e4ad36ef25de5ab4481fa5a7.tar.gz
Merge changes from topic "statsd_cts" into main
* changes: Update ValidationTests to use statsd cts lib Update StatsFrameworkinitializerTest Update ProcStatsValidationTests Update DirectoryValidationTest to use new cts lib Update UidMapTests to use statsd cts lib Update ShellSubscriberTest to use statsd cts lib Update ReadRestrictedStatsPermissionTest Update ValueMetricsTests to use statsd cts lib Update GaugeMetricsTests to use statsd cts lib Update DurationMetricsTests to use statsd cts lib Migrate MetricActivationTests to use test lib Update CountMetricTests to use new cts lib Update BootstrapApexTests and MetadataTests Update anomaly tests to use statsd cts test lib Refactor AlarmTests to use statsd test lib
-rw-r--r--tests/Android.bp1
-rw-r--r--tests/src/android/cts/statsd/alarm/AlarmTests.java67
-rw-r--r--tests/src/android/cts/statsd/alert/AnomalyDetectionTests.java528
-rw-r--r--tests/src/android/cts/statsd/apex/BootstrapApexTests.java6
-rw-r--r--tests/src/android/cts/statsd/atom/ProcStateTestCase.java122
-rw-r--r--tests/src/android/cts/statsd/metadata/MetadataTestCase.java54
-rw-r--r--tests/src/android/cts/statsd/metadata/MetadataTests.java72
-rw-r--r--tests/src/android/cts/statsd/metric/CountMetricsTests.java395
-rw-r--r--tests/src/android/cts/statsd/metric/DurationMetricsTests.java414
-rw-r--r--tests/src/android/cts/statsd/metric/GaugeMetricsTests.java477
-rw-r--r--tests/src/android/cts/statsd/metric/MetricActivationTests.java358
-rw-r--r--tests/src/android/cts/statsd/metric/MetricsUtils.java73
-rw-r--r--tests/src/android/cts/statsd/metric/ValueMetricsTests.java672
-rw-r--r--tests/src/android/cts/statsd/restricted/ReadRestrictedStatsPermissionTest.java36
-rw-r--r--tests/src/android/cts/statsd/subscriber/ShellSubscriberTest.java47
-rw-r--r--tests/src/android/cts/statsd/uidmap/UidMapTests.java100
-rw-r--r--tests/src/android/cts/statsd/validation/DirectoryValidationTest.java44
-rw-r--r--tests/src/android/cts/statsd/validation/ProcStatsValidationTests.java307
-rw-r--r--tests/src/android/cts/statsd/validation/StatsFrameworkInitializerTest.java36
-rw-r--r--tests/src/android/cts/statsd/validation/ValidationTests.java138
20 files changed, 2467 insertions, 1480 deletions
diff --git a/tests/Android.bp b/tests/Android.bp
index e67a76c2..71784a93 100644
--- a/tests/Android.bp
+++ b/tests/Android.bp
@@ -42,6 +42,7 @@ java_test_host {
static_libs: [
"core_cts_test_resources",
"perfetto_config-full",
+ "cts-statsd-atom-host-test-utils",
],
data: [
"**/*.pbtxt",
diff --git a/tests/src/android/cts/statsd/alarm/AlarmTests.java b/tests/src/android/cts/statsd/alarm/AlarmTests.java
index 032297eb..1ac5ec2e 100644
--- a/tests/src/android/cts/statsd/alarm/AlarmTests.java
+++ b/tests/src/android/cts/statsd/alarm/AlarmTests.java
@@ -17,21 +17,29 @@ package android.cts.statsd.alarm;
import static com.google.common.truth.Truth.assertThat;
-import android.cts.statsd.atom.AtomTestCase;
+import android.cts.statsd.metric.MetricsUtils;
+import android.cts.statsdatom.lib.AtomTestUtils;
+import android.cts.statsdatom.lib.ConfigUtils;
+import android.cts.statsdatom.lib.DeviceUtils;
+import android.cts.statsdatom.lib.ReportUtils;
-import com.android.internal.os.StatsdConfigProto;
import com.android.internal.os.StatsdConfigProto.Alarm;
import com.android.internal.os.StatsdConfigProto.IncidentdDetails;
import com.android.internal.os.StatsdConfigProto.StatsdConfig;
import com.android.internal.os.StatsdConfigProto.Subscription;
+import com.android.tradefed.build.IBuildInfo;
import com.android.tradefed.log.LogUtil.CLog;
+import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IBuildReceiver;
+import com.android.tradefed.util.RunUtil;
-import java.util.List;
+import java.text.SimpleDateFormat;
+import java.util.Date;
/**
* Statsd Anomaly Detection tests.
*/
-public class AlarmTests extends AtomTestCase {
+public class AlarmTests extends DeviceTestCase implements IBuildReceiver {
private static final String TAG = "Statsd.AnomalyDetectionTests";
@@ -42,36 +50,57 @@ public class AlarmTests extends AtomTestCase {
private static final int SUBSCRIPTION_ID_INCIDENTD = 41;
private static final int INCIDENTD_SECTION = -1;
+ private IBuildInfo mCtsBuild;
+
@Override
protected void setUp() throws Exception {
super.setUp();
+ assertThat(mCtsBuild).isNotNull();
+ ConfigUtils.removeConfig(getDevice());
+ ReportUtils.clearReports(getDevice());
+ DeviceUtils.installTestApp(getDevice(), MetricsUtils.DEVICE_SIDE_TEST_APK,
+ MetricsUtils.DEVICE_SIDE_TEST_PACKAGE, mCtsBuild);
if (!INCIDENTD_TESTS_ENABLED) {
CLog.w(TAG, TAG + " alarm tests are disabled by a flag. Change flag to true to run");
}
+ RunUtil.getDefault().sleep(AtomTestUtils.WAIT_TIME_LONG);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ ConfigUtils.removeConfig(getDevice());
+ ReportUtils.clearReports(getDevice());
+ DeviceUtils.uninstallTestApp(getDevice(), MetricsUtils.DEVICE_SIDE_TEST_PACKAGE);
+ }
+
+ @Override
+ public void setBuild(IBuildInfo buildInfo) {
+ mCtsBuild = buildInfo;
}
public void testAlarm() throws Exception {
StatsdConfig.Builder config = getBaseConfig();
- turnScreenOn();
- uploadConfig(config);
+ DeviceUtils.turnScreenOn(getDevice());
+ ConfigUtils.uploadConfig(getDevice(), config);
- String markTime = getCurrentLogcatDate();
- Thread.sleep(9_000);
+ String markTime = MetricsUtils.getCurrentLogcatDate(getDevice());
+ RunUtil.getDefault().sleep(9_000);
- if (INCIDENTD_TESTS_ENABLED) assertThat(didIncidentdFireSince(markTime)).isTrue();
+ if (INCIDENTD_TESTS_ENABLED) assertThat(MetricsUtils.didIncidentdFireSince(getDevice(), markTime)).isTrue();
}
private final StatsdConfig.Builder getBaseConfig() throws Exception {
- return createConfigBuilder()
- .addAlarm(Alarm.newBuilder().setId(ALARM_ID).setOffsetMillis(2).setPeriodMillis(
- 5_000) // every 5 seconds.
- )
- .addSubscription(Subscription.newBuilder()
- .setId(SUBSCRIPTION_ID_INCIDENTD)
- .setRuleType(Subscription.RuleType.ALARM)
- .setRuleId(ALARM_ID)
- .setIncidentdDetails(
- IncidentdDetails.newBuilder().addSection(INCIDENTD_SECTION)));
+ return ConfigUtils.createConfigBuilder(MetricsUtils.DEVICE_SIDE_TEST_PACKAGE)
+ .addAlarm(Alarm.newBuilder().setId(ALARM_ID).setOffsetMillis(2).setPeriodMillis(
+ 5_000) // every 5 seconds.
+ )
+ .addSubscription(Subscription.newBuilder()
+ .setId(SUBSCRIPTION_ID_INCIDENTD)
+ .setRuleType(Subscription.RuleType.ALARM)
+ .setRuleId(ALARM_ID)
+ .setIncidentdDetails(
+ IncidentdDetails.newBuilder().addSection(INCIDENTD_SECTION)));
}
}
diff --git a/tests/src/android/cts/statsd/alert/AnomalyDetectionTests.java b/tests/src/android/cts/statsd/alert/AnomalyDetectionTests.java
index ea47cc31..ac3c4676 100644
--- a/tests/src/android/cts/statsd/alert/AnomalyDetectionTests.java
+++ b/tests/src/android/cts/statsd/alert/AnomalyDetectionTests.java
@@ -18,7 +18,11 @@ package android.cts.statsd.alert;
import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertWithMessage;
-import android.cts.statsd.atom.AtomTestCase;
+import android.cts.statsd.metric.MetricsUtils;
+import android.cts.statsdatom.lib.AtomTestUtils;
+import android.cts.statsdatom.lib.ConfigUtils;
+import android.cts.statsdatom.lib.DeviceUtils;
+import android.cts.statsdatom.lib.ReportUtils;
import com.android.internal.os.StatsdConfigProto;
import com.android.internal.os.StatsdConfigProto.Alert;
@@ -38,13 +42,30 @@ import com.android.os.AtomsProto.AppBreadcrumbReported;
import com.android.os.AtomsProto.Atom;
import com.android.os.AtomsProto.DebugElapsedClock;
import com.android.os.StatsLog.EventMetricData;
+import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.log.LogUtil;
import com.android.tradefed.log.LogUtil.CLog;
+import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IBuildReceiver;
+import com.android.tradefed.util.CommandResult;
+import com.android.tradefed.util.CommandStatus;
+import com.android.tradefed.util.RunUtil;
+
+import com.google.protobuf.ByteString;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
import java.util.List;
+import java.util.Random;
+
+import perfetto.protos.PerfettoConfig.DataSourceConfig;
+import perfetto.protos.PerfettoConfig.FtraceConfig;
+import perfetto.protos.PerfettoConfig.TraceConfig;
/**
* Statsd Anomaly Detection tests.
*/
-public class AnomalyDetectionTests extends AtomTestCase {
+public class AnomalyDetectionTests extends DeviceTestCase implements IBuildReceiver {
private static final String TAG = "Statsd.AnomalyDetectionTests";
@@ -53,6 +74,8 @@ public class AnomalyDetectionTests extends AtomTestCase {
private static final int WAIT_AFTER_BREADCRUMB_MS = 2000;
+ private static final int SHELL_UID = 2000;
+
// Config constants
private static final int APP_BREADCRUMB_REPORTED_MATCH_START_ID = 1;
private static final int APP_BREADCRUMB_REPORTED_MATCH_STOP_ID = 2;
@@ -66,14 +89,22 @@ public class AnomalyDetectionTests extends AtomTestCase {
private boolean defaultSystemTracingConfigurationHasChanged = false;
+ private IBuildInfo mCtsBuild;
+
@Override
protected void setUp() throws Exception {
super.setUp();
+ assertThat(mCtsBuild).isNotNull();
+ ConfigUtils.removeConfig(getDevice());
+ ReportUtils.clearReports(getDevice());
+ DeviceUtils.installTestApp(getDevice(), MetricsUtils.DEVICE_SIDE_TEST_APK,
+ MetricsUtils.DEVICE_SIDE_TEST_PACKAGE, mCtsBuild);
if (!INCIDENTD_TESTS_ENABLED) {
CLog.w(TAG, TAG + " anomaly tests are disabled by a flag. Change flag to true to run");
}
if (PERFETTO_TESTS_ENABLED) {
- // Default Android configuration can only change for device type that doesn't require SystemTracingEnabled
+ // Default Android configuration can only change for device type that doesn't require
+ // SystemTracingEnabled
// by default in CDD.
String chars = getDevice().getProperty("ro.build.characteristics");
if (!isSystemTracingEnabled() && chars.contains("automotive")) {
@@ -81,11 +112,20 @@ public class AnomalyDetectionTests extends AtomTestCase {
defaultSystemTracingConfigurationHasChanged = true;
}
}
+ RunUtil.getDefault().sleep(AtomTestUtils.WAIT_TIME_LONG);
+ }
+
+ @Override
+ public void setBuild(IBuildInfo buildInfo) {
+ mCtsBuild = buildInfo;
}
@Override
protected void tearDown() throws Exception {
super.tearDown();
+ ConfigUtils.removeConfig(getDevice());
+ ReportUtils.clearReports(getDevice());
+ DeviceUtils.uninstallTestApp(getDevice(), MetricsUtils.DEVICE_SIDE_TEST_PACKAGE);
if (PERFETTO_TESTS_ENABLED) {
// Disable SystemTracing if previously enabled at test setUp()
if (defaultSystemTracingConfigurationHasChanged) {
@@ -95,11 +135,12 @@ public class AnomalyDetectionTests extends AtomTestCase {
final long deadLine = System.currentTimeMillis() + 10000;
while (isSystemTracingEnabled()) {
if (System.currentTimeMillis() > deadLine) {
- CLog.w("/sys/kernel/debug/tracing/tracing_on is still 1 after 10 secs : " + isSystemTracingEnabled());
+ CLog.w("/sys/kernel/debug/tracing/tracing_on is still 1 after 10 secs : "
+ + isSystemTracingEnabled());
break;
}
CLog.d("Waiting to finish collecting traces. ");
- Thread.sleep(WAIT_TIME_SHORT);
+ RunUtil.getDefault().sleep(AtomTestUtils.WAIT_TIME_SHORT);
}
}
}
@@ -120,34 +161,54 @@ public class AnomalyDetectionTests extends AtomTestCase {
)
)
);
- uploadConfig(config);
+ ConfigUtils.uploadConfig(getDevice(), config);
- String markTime = getCurrentLogcatDate();
+ String markTime = MetricsUtils.getCurrentLogcatDate(getDevice());
// count(label=6) -> 1 (not an anomaly, since not "greater than 2")
- doAppBreadcrumbReportedStart(6);
- Thread.sleep(500);
- assertWithMessage("Premature anomaly").that(getEventMetricDataList()).isEmpty();
- if (INCIDENTD_TESTS_ENABLED) assertThat(didIncidentdFireSince(markTime)).isFalse();
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), 6);
+ RunUtil.getDefault().sleep(AtomTestUtils.WAIT_TIME_SHORT);
+ assertWithMessage("Premature anomaly").that(
+ ReportUtils.getEventMetricDataList(getDevice())).isEmpty();
+ if (INCIDENTD_TESTS_ENABLED) {
+ assertThat(
+ MetricsUtils.didIncidentdFireSince(getDevice(), markTime)).isFalse();
+ }
// count(label=6) -> 2 (not an anomaly, since not "greater than 2")
- doAppBreadcrumbReportedStart(6);
- Thread.sleep(500);
- assertWithMessage("Premature anomaly").that(getEventMetricDataList()).isEmpty();
- if (INCIDENTD_TESTS_ENABLED) assertThat(didIncidentdFireSince(markTime)).isFalse();
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), 6);
+ RunUtil.getDefault().sleep(AtomTestUtils.WAIT_TIME_SHORT);
+ assertWithMessage("Premature anomaly").that(
+ ReportUtils.getEventMetricDataList(getDevice())).isEmpty();
+ if (INCIDENTD_TESTS_ENABLED) {
+ assertThat(
+ MetricsUtils.didIncidentdFireSince(getDevice(), markTime)).isFalse();
+ }
// count(label=12) -> 1 (not an anomaly, since not "greater than 2")
- doAppBreadcrumbReportedStart(12);
- Thread.sleep(1000);
- assertWithMessage("Premature anomaly").that(getEventMetricDataList()).isEmpty();
- if (INCIDENTD_TESTS_ENABLED) assertThat(didIncidentdFireSince(markTime)).isFalse();
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), 12);
+ RunUtil.getDefault().sleep(AtomTestUtils.WAIT_TIME_LONG);
+ assertWithMessage("Premature anomaly").that(
+ ReportUtils.getEventMetricDataList(getDevice())).isEmpty();
+ if (INCIDENTD_TESTS_ENABLED) {
+ assertThat(
+ MetricsUtils.didIncidentdFireSince(getDevice(), markTime)).isFalse();
+ }
- doAppBreadcrumbReportedStart(6); // count(label=6) -> 3 (anomaly, since "greater than 2"!)
- Thread.sleep(WAIT_AFTER_BREADCRUMB_MS);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(),
+ 6); // count(label=6) -> 3 (anomaly, since "greater than 2"!)
+ RunUtil.getDefault().sleep(WAIT_AFTER_BREADCRUMB_MS);
- List<EventMetricData> data = getEventMetricDataList();
+ List<EventMetricData> data = ReportUtils.getEventMetricDataList(getDevice());
assertWithMessage("Expected anomaly").that(data).hasSize(1);
assertThat(data.get(0).getAtom().getAnomalyDetected().getAlertId()).isEqualTo(ALERT_ID);
- if (INCIDENTD_TESTS_ENABLED) assertThat(didIncidentdFireSince(markTime)).isTrue();
+ if (INCIDENTD_TESTS_ENABLED) {
+ assertThat(
+ MetricsUtils.didIncidentdFireSince(getDevice(), markTime)).isTrue();
+ }
}
// Tests that anomaly detection for duration works.
@@ -169,49 +230,65 @@ public class AnomalyDetectionTests extends AtomTestCase {
.setStop(APP_BREADCRUMB_REPORTED_MATCH_STOP_ID)
)
);
- uploadConfig(config);
+ ConfigUtils.uploadConfig(getDevice(), config);
// Since timing is crucial and checking logcat for incidentd is slow, we don't test for it.
// Test that alarm doesn't fire early.
- String markTime = getCurrentLogcatDate();
- doAppBreadcrumbReportedStart(1);
- Thread.sleep(6_000); // Recorded duration at end: 6s
- assertWithMessage("Premature anomaly").that(getEventMetricDataList()).isEmpty();
-
- doAppBreadcrumbReportedStop(1);
- Thread.sleep(4_000); // Recorded duration at end: 6s
- assertWithMessage("Premature anomaly").that(getEventMetricDataList()).isEmpty();
+ String markTime = MetricsUtils.getCurrentLogcatDate(getDevice());
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), 1);
+ RunUtil.getDefault().sleep(6_000); // Recorded duration at end: 6s
+ assertWithMessage("Premature anomaly").that(
+ ReportUtils.getEventMetricDataList(getDevice())).isEmpty();
+
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.STOP.ordinal(), 1);
+ RunUtil.getDefault().sleep(4_000); // Recorded duration at end: 6s
+ assertWithMessage("Premature anomaly").that(
+ ReportUtils.getEventMetricDataList(getDevice())).isEmpty();
// Test that alarm does fire when it is supposed to (after 4s, plus up to 5s alarm delay).
- doAppBreadcrumbReportedStart(1);
- Thread.sleep(9_000); // Recorded duration at end: 13s
- doAppBreadcrumbReported(2);
- List<EventMetricData> data = getEventMetricDataList();
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), 1);
+ RunUtil.getDefault().sleep(9_000); // Recorded duration at end: 13s
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), 2);
+ List<EventMetricData> data = ReportUtils.getEventMetricDataList(getDevice());
assertWithMessage("Expected anomaly").that(data).hasSize(1);
assertThat(data.get(0).getAtom().getAnomalyDetected().getAlertId()).isEqualTo(ALERT_ID);
// Now test that the refractory period is obeyed.
- markTime = getCurrentLogcatDate();
- doAppBreadcrumbReportedStop(1);
- doAppBreadcrumbReportedStart(1);
- Thread.sleep(3_000); // Recorded duration at end: 13s
+ markTime = MetricsUtils.getCurrentLogcatDate(getDevice());
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.STOP.ordinal(), 1);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), 1);
+ RunUtil.getDefault().sleep(3_000); // Recorded duration at end: 13s
// NB: the previous getEventMetricDataList also removes the report, so size is back to 0.
- assertWithMessage("Premature anomaly").that(getEventMetricDataList()).isEmpty();
+ assertWithMessage("Premature anomaly").that(
+ ReportUtils.getEventMetricDataList(getDevice())).isEmpty();
// Test that detection works again after refractory period finishes.
- doAppBreadcrumbReportedStop(1);
- Thread.sleep(8_000); // Recorded duration at end: 9s
- doAppBreadcrumbReportedStart(1);
- Thread.sleep(15_000); // Recorded duration at end: 15s
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.STOP.ordinal(), 1);
+ RunUtil.getDefault().sleep(8_000); // Recorded duration at end: 9s
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), 1);
+ RunUtil.getDefault().sleep(15_000); // Recorded duration at end: 15s
// We can do an incidentd test now that all the timing issues are done.
- doAppBreadcrumbReported(2);
- data = getEventMetricDataList();
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), 2);
+ data = ReportUtils.getEventMetricDataList(getDevice());
assertWithMessage("Expected anomaly").that(data).hasSize(1);
assertThat(data.get(0).getAtom().getAnomalyDetected().getAlertId()).isEqualTo(ALERT_ID);
- if (INCIDENTD_TESTS_ENABLED) assertThat(didIncidentdFireSince(markTime)).isTrue();
+ if (INCIDENTD_TESTS_ENABLED) {
+ assertThat(
+ MetricsUtils.didIncidentdFireSince(getDevice(), markTime)).isTrue();
+ }
- doAppBreadcrumbReportedStop(1);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.STOP.ordinal(), 1);
}
// Tests that anomaly detection for duration works even when the alarm fires too late.
@@ -233,24 +310,29 @@ public class AnomalyDetectionTests extends AtomTestCase {
.setStop(APP_BREADCRUMB_REPORTED_MATCH_STOP_ID)
)
);
- uploadConfig(config);
+ ConfigUtils.uploadConfig(getDevice(), config);
- doAppBreadcrumbReportedStart(1);
- Thread.sleep(5_000);
- doAppBreadcrumbReportedStop(1);
- Thread.sleep(2_000);
- assertWithMessage("Premature anomaly").that(getEventMetricDataList()).isEmpty();
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), 1);
+ RunUtil.getDefault().sleep(5_000);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.STOP.ordinal(), 1);
+ RunUtil.getDefault().sleep(2_000);
+ assertWithMessage("Premature anomaly").that(
+ ReportUtils.getEventMetricDataList(getDevice())).isEmpty();
// Test that alarm does fire when it is supposed to.
// The anomaly occurs in 1s, but alarms won't fire that quickly.
// It is likely that the alarm will only fire after this period is already over, but the
// anomaly should nonetheless be detected when the event stops.
- doAppBreadcrumbReportedStart(1);
- Thread.sleep(1_200);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), 1);
+ RunUtil.getDefault().sleep(1_200);
// Anomaly should be detected here if the alarm didn't fire yet.
- doAppBreadcrumbReportedStop(1);
- Thread.sleep(200);
- List<EventMetricData> data = getEventMetricDataList();
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.STOP.ordinal(), 1);
+ RunUtil.getDefault().sleep(200);
+ List<EventMetricData> data = ReportUtils.getEventMetricDataList(getDevice());
if (data.size() == 2) {
// Although we expect that the alarm won't fire, we certainly cannot demand that.
CLog.w(TAG, "The anomaly was detected twice. Presumably the alarm did manage to fire.");
@@ -274,28 +356,39 @@ public class AnomalyDetectionTests extends AtomTestCase {
)
);
- uploadConfig(config);
-
- String markTime = getCurrentLogcatDate();
- doAppBreadcrumbReportedStart(6); // value = 6, which is NOT > trigger
- Thread.sleep(WAIT_AFTER_BREADCRUMB_MS);
- assertWithMessage("Premature anomaly").that(getEventMetricDataList()).isEmpty();
- if (INCIDENTD_TESTS_ENABLED) assertThat(didIncidentdFireSince(markTime)).isFalse();
+ ConfigUtils.uploadConfig(getDevice(), config);
+
+ String markTime = MetricsUtils.getCurrentLogcatDate(getDevice());
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(),
+ 6); // value = 6, which is NOT > trigger
+ RunUtil.getDefault().sleep(WAIT_AFTER_BREADCRUMB_MS);
+ assertWithMessage("Premature anomaly").that(
+ ReportUtils.getEventMetricDataList(getDevice())).isEmpty();
+ if (INCIDENTD_TESTS_ENABLED) {
+ assertThat(
+ MetricsUtils.didIncidentdFireSince(getDevice(), markTime)).isFalse();
+ }
- doAppBreadcrumbReportedStart(14); // value = 14 > trigger
- Thread.sleep(WAIT_AFTER_BREADCRUMB_MS);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(),
+ 14); // value = 14 > trigger
+ RunUtil.getDefault().sleep(WAIT_AFTER_BREADCRUMB_MS);
- List<EventMetricData> data = getEventMetricDataList();
+ List<EventMetricData> data = ReportUtils.getEventMetricDataList(getDevice());
assertWithMessage("Expected anomaly").that(data).hasSize(1);
assertThat(data.get(0).getAtom().getAnomalyDetected().getAlertId()).isEqualTo(ALERT_ID);
- if (INCIDENTD_TESTS_ENABLED) assertThat(didIncidentdFireSince(markTime)).isTrue();
+ if (INCIDENTD_TESTS_ENABLED) {
+ assertThat(
+ MetricsUtils.didIncidentdFireSince(getDevice(), markTime)).isTrue();
+ }
}
// Test that anomaly detection integrates with perfetto properly.
public void testPerfetto() throws Exception {
String chars = getDevice().getProperty("ro.build.characteristics");
if (chars.contains("watch")) {
- return;
+ return;
}
if (PERFETTO_TESTS_ENABLED) resetPerfettoGuardrails();
@@ -320,32 +413,38 @@ public class AnomalyDetectionTests extends AtomTestCase {
)
);
- uploadConfig(config);
-
- String markTime = getCurrentLogcatDate();
- doAppBreadcrumbReportedStart(6); // value = 6, which is NOT > trigger
- Thread.sleep(WAIT_AFTER_BREADCRUMB_MS);
- assertWithMessage("Premature anomaly").that(getEventMetricDataList()).isEmpty();
+ ConfigUtils.uploadConfig(getDevice(), config);
+
+ String markTime = MetricsUtils.getCurrentLogcatDate(getDevice());
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(),
+ 6); // value = 6, which is NOT > trigger
+ RunUtil.getDefault().sleep(WAIT_AFTER_BREADCRUMB_MS);
+ assertWithMessage("Premature anomaly").that(
+ ReportUtils.getEventMetricDataList(getDevice())).isEmpty();
if (PERFETTO_TESTS_ENABLED) assertThat(isSystemTracingEnabled()).isFalse();
- doAppBreadcrumbReportedStart(14); // value = 14 > trigger
- Thread.sleep(WAIT_AFTER_BREADCRUMB_MS);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(),
+ 14); // value = 14 > trigger
+ RunUtil.getDefault().sleep(WAIT_AFTER_BREADCRUMB_MS);
- List<EventMetricData> data = getEventMetricDataList();
+ List<EventMetricData> data = ReportUtils.getEventMetricDataList(getDevice());
assertWithMessage("Expected anomaly").that(data).hasSize(1);
assertThat(data.get(0).getAtom().getAnomalyDetected().getAlertId()).isEqualTo(ALERT_ID);
- // Pool a few times to allow for statsd <-> traced <-> traced_probes communication to happen.
+ // Pool a few times to allow for statsd <-> traced <-> traced_probes communication to
+ // happen.
if (PERFETTO_TESTS_ENABLED) {
- boolean tracingEnabled = false;
- for (int i = 0; i < 5; i++) {
- if (isSystemTracingEnabled()) {
- tracingEnabled = true;
- break;
- }
- Thread.sleep(1000);
+ boolean tracingEnabled = false;
+ for (int i = 0; i < 5; i++) {
+ if (isSystemTracingEnabled()) {
+ tracingEnabled = true;
+ break;
}
- assertThat(tracingEnabled).isTrue();
+ RunUtil.getDefault().sleep(1000);
+ }
+ assertThat(tracingEnabled).isTrue();
}
}
@@ -365,22 +464,34 @@ public class AnomalyDetectionTests extends AtomTestCase {
)
)
);
- uploadConfig(config);
-
- String markTime = getCurrentLogcatDate();
- doAppBreadcrumbReportedStart(6); // gauge = 6, which is NOT > trigger
- Thread.sleep(Math.max(WAIT_AFTER_BREADCRUMB_MS, 1_100)); // Must be >1s to push next bucket.
- assertWithMessage("Premature anomaly").that(getEventMetricDataList()).isEmpty();
- if (INCIDENTD_TESTS_ENABLED) assertThat(didIncidentdFireSince(markTime)).isFalse();
+ ConfigUtils.uploadConfig(getDevice(), config);
+
+ String markTime = MetricsUtils.getCurrentLogcatDate(getDevice());
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(),
+ 6); // gauge = 6, which is NOT > trigger
+ RunUtil.getDefault().sleep(
+ Math.max(WAIT_AFTER_BREADCRUMB_MS, 1_100)); // Must be >1s to push next bucket.
+ assertWithMessage("Premature anomaly").that(
+ ReportUtils.getEventMetricDataList(getDevice())).isEmpty();
+ if (INCIDENTD_TESTS_ENABLED) {
+ assertThat(
+ MetricsUtils.didIncidentdFireSince(getDevice(), markTime)).isFalse();
+ }
// We waited for >1s above, so we are now in the next bucket (which is essential).
- doAppBreadcrumbReportedStart(14); // gauge = 14 > trigger
- Thread.sleep(WAIT_AFTER_BREADCRUMB_MS);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(),
+ 14); // gauge = 14 > trigger
+ RunUtil.getDefault().sleep(WAIT_AFTER_BREADCRUMB_MS);
- List<EventMetricData> data = getEventMetricDataList();
+ List<EventMetricData> data = ReportUtils.getEventMetricDataList(getDevice());
assertWithMessage("Expected anomaly").that(data).hasSize(1);
assertThat(data.get(0).getAtom().getAnomalyDetected().getAlertId()).isEqualTo(ALERT_ID);
- if (INCIDENTD_TESTS_ENABLED) assertThat(didIncidentdFireSince(markTime)).isTrue();
+ if (INCIDENTD_TESTS_ENABLED) {
+ assertThat(
+ MetricsUtils.didIncidentdFireSince(getDevice(), markTime)).isTrue();
+ }
}
// Test that anomaly detection for pulled metrics work.
@@ -410,73 +521,178 @@ public class AnomalyDetectionTests extends AtomTestCase {
)
)
);
- uploadConfig(config);
+ ConfigUtils.uploadConfig(getDevice(), config);
- Thread.sleep(6_000); // Wait long enough to ensure AlarmManager signals >= 1 pull
+ RunUtil.getDefault().sleep(
+ 6_000); // Wait long enough to ensure AlarmManager signals >= 1 pull
- List<EventMetricData> data = getEventMetricDataList();
+ List<EventMetricData> data = ReportUtils.getEventMetricDataList(getDevice());
assertThat(data.size()).isEqualTo(1);
assertThat(data.get(0).getAtom().getAnomalyDetected().getAlertId()).isEqualTo(ALERT_ID);
}
private final StatsdConfig.Builder getBaseConfig(int numBuckets,
- int refractorySecs,
- long triggerIfSumGt) throws Exception {
- return createConfigBuilder()
- // Items of relevance for detecting the anomaly:
- .addAtomMatcher(
- StatsdConfigProto.AtomMatcher.newBuilder()
- .setId(APP_BREADCRUMB_REPORTED_MATCH_START_ID)
- .setSimpleAtomMatcher(
- StatsdConfigProto.SimpleAtomMatcher.newBuilder()
- .setAtomId(Atom.APP_BREADCRUMB_REPORTED_FIELD_NUMBER)
- // Event only when the uid is this app's uid.
- .addFieldValueMatcher(createFvm(AppBreadcrumbReported.UID_FIELD_NUMBER)
- .setEqInt(getHostUid()))
- .addFieldValueMatcher(
- createFvm(AppBreadcrumbReported.STATE_FIELD_NUMBER)
- .setEqInt(AppBreadcrumbReported.State.START.ordinal()))))
- .addAtomMatcher(
- StatsdConfigProto.AtomMatcher.newBuilder()
- .setId(APP_BREADCRUMB_REPORTED_MATCH_STOP_ID)
- .setSimpleAtomMatcher(
- StatsdConfigProto.SimpleAtomMatcher.newBuilder()
- .setAtomId(Atom.APP_BREADCRUMB_REPORTED_FIELD_NUMBER)
- // Event only when the uid is this app's uid.
- .addFieldValueMatcher(createFvm(AppBreadcrumbReported.UID_FIELD_NUMBER)
- .setEqInt(getHostUid()))
- .addFieldValueMatcher(
- createFvm(AppBreadcrumbReported.STATE_FIELD_NUMBER)
- .setEqInt(AppBreadcrumbReported.State.STOP.ordinal()))))
- .addAlert(Alert.newBuilder()
+ int refractorySecs,
+ long triggerIfSumGt) throws Exception {
+ return ConfigUtils.createConfigBuilder(MetricsUtils.DEVICE_SIDE_TEST_PACKAGE)
+ // Items of relevance for detecting the anomaly:
+ .addAtomMatcher(
+ StatsdConfigProto.AtomMatcher.newBuilder()
+ .setId(APP_BREADCRUMB_REPORTED_MATCH_START_ID)
+ .setSimpleAtomMatcher(
+ StatsdConfigProto.SimpleAtomMatcher.newBuilder()
+ .setAtomId(
+ Atom.APP_BREADCRUMB_REPORTED_FIELD_NUMBER)
+ // Event only when the uid is this app's uid.
+ .addFieldValueMatcher(ConfigUtils.createFvm(
+ AppBreadcrumbReported.UID_FIELD_NUMBER)
+ .setEqInt(SHELL_UID))
+ .addFieldValueMatcher(
+ ConfigUtils.createFvm(
+ AppBreadcrumbReported.STATE_FIELD_NUMBER)
+ .setEqInt(
+ AppBreadcrumbReported.State.START.ordinal()))))
+ .addAtomMatcher(
+ StatsdConfigProto.AtomMatcher.newBuilder()
+ .setId(APP_BREADCRUMB_REPORTED_MATCH_STOP_ID)
+ .setSimpleAtomMatcher(
+ StatsdConfigProto.SimpleAtomMatcher.newBuilder()
+ .setAtomId(
+ Atom.APP_BREADCRUMB_REPORTED_FIELD_NUMBER)
+ // Event only when the uid is this app's uid.
+ .addFieldValueMatcher(ConfigUtils.createFvm(
+ AppBreadcrumbReported.UID_FIELD_NUMBER)
+ .setEqInt(SHELL_UID))
+ .addFieldValueMatcher(
+ ConfigUtils.createFvm(
+ AppBreadcrumbReported.STATE_FIELD_NUMBER)
+ .setEqInt(
+ AppBreadcrumbReported.State.STOP.ordinal()))))
+ .addAlert(Alert.newBuilder()
.setId(ALERT_ID)
.setMetricId(METRIC_ID) // The metric itself must yet be added by the test.
.setNumBuckets(numBuckets)
.setRefractoryPeriodSecs(refractorySecs)
.setTriggerIfSumGt(triggerIfSumGt))
- .addSubscription(
- Subscription.newBuilder()
- .setId(SUBSCRIPTION_ID_INCIDENTD)
- .setRuleType(Subscription.RuleType.ALERT)
- .setRuleId(ALERT_ID)
- .setIncidentdDetails(IncidentdDetails.newBuilder().addSection(INCIDENTD_SECTION)))
- // We want to trigger anomalies on METRIC_ID, but don't want the actual data.
- .addNoReportMetric(METRIC_ID)
-
- // Items of relevance to reporting the anomaly (we do want this data):
- .addAtomMatcher(
- StatsdConfigProto.AtomMatcher.newBuilder()
- .setId(ANOMALY_DETECT_MATCH_ID)
- .setSimpleAtomMatcher(
- StatsdConfigProto.SimpleAtomMatcher.newBuilder()
- .setAtomId(Atom.ANOMALY_DETECTED_FIELD_NUMBER)
- .addFieldValueMatcher(createFvm(AnomalyDetected.CONFIG_UID_FIELD_NUMBER)
- .setEqInt(getHostUid()))
- .addFieldValueMatcher(createFvm(AnomalyDetected.CONFIG_ID_FIELD_NUMBER)
- .setEqInt(CONFIG_ID))))
- .addEventMetric(StatsdConfigProto.EventMetric.newBuilder()
- .setId(ANOMALY_EVENT_ID)
- .setWhat(ANOMALY_DETECT_MATCH_ID));
+ .addSubscription(
+ Subscription.newBuilder()
+ .setId(SUBSCRIPTION_ID_INCIDENTD)
+ .setRuleType(Subscription.RuleType.ALERT)
+ .setRuleId(ALERT_ID)
+ .setIncidentdDetails(IncidentdDetails.newBuilder().addSection(
+ INCIDENTD_SECTION)))
+ // We want to trigger anomalies on METRIC_ID, but don't want the actual data.
+ .addNoReportMetric(METRIC_ID)
+
+ // Items of relevance to reporting the anomaly (we do want this data):
+ .addAtomMatcher(
+ StatsdConfigProto.AtomMatcher.newBuilder()
+ .setId(ANOMALY_DETECT_MATCH_ID)
+ .setSimpleAtomMatcher(
+ StatsdConfigProto.SimpleAtomMatcher.newBuilder()
+ .setAtomId(Atom.ANOMALY_DETECTED_FIELD_NUMBER)
+ .addFieldValueMatcher(ConfigUtils.createFvm(
+ AnomalyDetected.CONFIG_UID_FIELD_NUMBER)
+ .setEqInt(SHELL_UID))
+ .addFieldValueMatcher(ConfigUtils.createFvm(
+ AnomalyDetected.CONFIG_ID_FIELD_NUMBER)
+ .setEqInt(ConfigUtils.CONFIG_ID))))
+ .addEventMetric(StatsdConfigProto.EventMetric.newBuilder()
+ .setId(ANOMALY_EVENT_ID)
+ .setWhat(ANOMALY_DETECT_MATCH_ID));
+ }
+
+ /**
+ * Determines whether perfetto enabled the kernel ftrace tracer.
+ */
+ protected boolean isSystemTracingEnabled() throws Exception {
+ final String traceFsPath = "/sys/kernel/tracing/tracing_on";
+ String tracing_on = probe(traceFsPath);
+ if (tracing_on.startsWith("0")) return false;
+ if (tracing_on.startsWith("1")) return true;
+
+ // fallback to debugfs
+ LogUtil.CLog.d("Unexpected state for %s = %s. Falling back to debugfs", traceFsPath,
+ tracing_on);
+
+ final String debugFsPath = "/sys/kernel/debug/tracing/tracing_on";
+ tracing_on = probe(debugFsPath);
+ if (tracing_on.startsWith("0")) return false;
+ if (tracing_on.startsWith("1")) return true;
+ throw new Exception(String.format("Unexpected state for %s = %s", traceFsPath, tracing_on));
+ }
+
+ private String probe(String path) throws Exception {
+ return getDevice().executeShellCommand("if [ -e " + path + " ] ; then"
+ + " cat " + path + " ; else echo -1 ; fi");
+ }
+
+ protected void enableSystemTracing() throws Exception {
+ getDevice().executeShellCommand("setprop persist.traced.enable 1");
+ }
+
+ protected void disableSystemTracing() throws Exception {
+ getDevice().executeShellCommand("setprop persist.traced.enable 0");
+ }
+
+ /**
+ * Resets the state of the Perfetto guardrails. This avoids that the test fails if it's
+ * run too close of for too many times and hits the upload limit.
+ */
+ private void resetPerfettoGuardrails() throws Exception {
+ final String cmd = "perfetto --reset-guardrails";
+ CommandResult cr = getDevice().executeShellV2Command(cmd);
+ if (cr.getStatus() != CommandStatus.SUCCESS) {
+ throw new Exception(
+ String.format("Error while executing %s: %s %s", cmd, cr.getStdout(),
+ cr.getStderr()));
+ }
+ }
+
+ /**
+ * Returns a protobuf-encoded perfetto config that enables the kernel
+ * ftrace tracer with sched_switch for 10 seconds.
+ */
+ private ByteString getPerfettoConfig() {
+ TraceConfig.Builder builder = TraceConfig.newBuilder();
+
+ TraceConfig.BufferConfig buffer = TraceConfig.BufferConfig
+ .newBuilder()
+ .setSizeKb(128)
+ .build();
+ builder.addBuffers(buffer);
+
+ FtraceConfig ftraceConfig = FtraceConfig.newBuilder()
+ .addFtraceEvents("sched/sched_switch")
+ .build();
+ DataSourceConfig dataSourceConfig = DataSourceConfig.newBuilder()
+ .setName("linux.ftrace")
+ .setTargetBuffer(0)
+ .setFtraceConfig(ftraceConfig)
+ .build();
+ TraceConfig.DataSource dataSource = TraceConfig.DataSource
+ .newBuilder()
+ .setConfig(dataSourceConfig)
+ .build();
+ builder.addDataSources(dataSource);
+
+ builder.setDurationMs(10000);
+ builder.setAllowUserBuildTracing(true);
+
+ TraceConfig.IncidentReportConfig incident = TraceConfig.IncidentReportConfig
+ .newBuilder()
+ .setSkipIncidentd(true)
+ .build();
+ builder.setIncidentReportConfig(incident);
+
+ // To avoid being hit with guardrails firing in multiple test runs back
+ // to back, we set a unique session key for each config.
+ Random random = new Random();
+ StringBuilder sessionNameBuilder = new StringBuilder("statsd-cts-");
+ sessionNameBuilder.append(random.nextInt() & Integer.MAX_VALUE);
+ builder.setUniqueSessionName(sessionNameBuilder.toString());
+
+ return builder.build().toByteString();
}
}
diff --git a/tests/src/android/cts/statsd/apex/BootstrapApexTests.java b/tests/src/android/cts/statsd/apex/BootstrapApexTests.java
index ab6093fe..2db635a5 100644
--- a/tests/src/android/cts/statsd/apex/BootstrapApexTests.java
+++ b/tests/src/android/cts/statsd/apex/BootstrapApexTests.java
@@ -18,11 +18,12 @@ package android.cts.statsd.apex;
import static com.google.common.truth.Truth.assertThat;
-import android.cts.statsd.atom.BaseTestCase;
import com.android.apex.ApexInfo;
import com.android.apex.XmlParser;
import com.android.compatibility.common.util.ApiLevelUtil;
import com.android.tradefed.log.LogUtil;
+import com.android.tradefed.testtype.DeviceTestCase;
+
import java.io.File;
import java.io.FileInputStream;
import java.util.List;
@@ -30,7 +31,7 @@ import java.util.List;
/**
* Verify statsd is not in the bootstrap apexes
*/
-public class BootstrapApexTests extends BaseTestCase {
+public class BootstrapApexTests extends DeviceTestCase {
private static final String TAG = "Statsd.BootstrapApexTests";
// Constants for the paths to apex-info-list.xml
@@ -39,6 +40,7 @@ public class BootstrapApexTests extends BaseTestCase {
// - legacy location
private static final String BOOTSTRAP_APEX_FILE2 = "/apex/.bootstrap-apex-info-list.xml";
+
private boolean sdkLevelAtLeast(int sdkLevel, String codename) throws Exception {
return ApiLevelUtil.isAtLeast(getDevice(), sdkLevel)
|| ApiLevelUtil.codenameEquals(getDevice(), codename);
diff --git a/tests/src/android/cts/statsd/atom/ProcStateTestCase.java b/tests/src/android/cts/statsd/atom/ProcStateTestCase.java
index 2fa42332..d5038f97 100644
--- a/tests/src/android/cts/statsd/atom/ProcStateTestCase.java
+++ b/tests/src/android/cts/statsd/atom/ProcStateTestCase.java
@@ -15,10 +15,20 @@
*/
package android.cts.statsd.atom;
+import static com.google.common.truth.Truth.assertThat;
+
import android.app.ProcessStateEnum; // From enums.proto for atoms.proto's UidProcessStateChanged.
+import android.cts.statsd.metric.MetricsUtils;
+import android.cts.statsdatom.lib.ConfigUtils;
+import android.cts.statsdatom.lib.DeviceUtils;
+import android.cts.statsdatom.lib.ReportUtils;
import com.android.os.AtomsProto.Atom;
import com.android.os.StatsLog.EventMetricData;
+import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IBuildReceiver;
+import com.android.tradefed.util.RunUtil;
import java.util.Arrays;
import java.util.HashSet;
@@ -31,46 +41,74 @@ import java.util.stream.Stream;
/**
* Base class for manipulating process states
*/
-public class ProcStateTestCase extends DeviceAtomTestCase {
-
- private static final String TAG = "Statsd.ProcStateTestCase";
-
- private static final String DEVICE_SIDE_FG_ACTIVITY_COMPONENT
- = "com.android.server.cts.device.statsd/.StatsdCtsForegroundActivity";
- private static final String DEVICE_SIDE_FG_SERVICE_COMPONENT
- = "com.android.server.cts.device.statsd/.StatsdCtsForegroundService";
-
- // Constants from the device-side tests (not directly accessible here).
- public static final String ACTION_END_IMMEDIATELY = "action.end_immediately";
- public static final String ACTION_BACKGROUND_SLEEP = "action.background_sleep";
- public static final String ACTION_SLEEP_WHILE_TOP = "action.sleep_top";
- public static final String ACTION_LONG_SLEEP_WHILE_TOP = "action.long_sleep_top";
- public static final String ACTION_SHOW_APPLICATION_OVERLAY = "action.show_application_overlay";
-
- // Sleep times (ms) that actions invoke device-side.
- public static final int SLEEP_OF_ACTION_SLEEP_WHILE_TOP = 2_000;
- public static final int SLEEP_OF_ACTION_LONG_SLEEP_WHILE_TOP = 60_000;
- public static final int SLEEP_OF_ACTION_BACKGROUND_SLEEP = 2_000;
- public static final int SLEEP_OF_FOREGROUND_SERVICE = 2_000;
-
-
- /**
- * Runs an activity (in the foreground) to perform the given action.
- * @param actionValue the action code constants indicating the desired action to perform.
- */
- protected void executeForegroundActivity(String actionValue) throws Exception {
- getDevice().executeShellCommand(String.format(
- "am start -n '%s' -e %s %s",
- DEVICE_SIDE_FG_ACTIVITY_COMPONENT,
- KEY_ACTION, actionValue));
- }
-
- /**
- * Runs a simple foreground service.
- */
- protected void executeForegroundService() throws Exception {
- executeForegroundActivity(ACTION_END_IMMEDIATELY);
- getDevice().executeShellCommand(String.format(
- "am startservice -n '%s'", DEVICE_SIDE_FG_SERVICE_COMPONENT));
- }
+public class ProcStateTestCase extends DeviceTestCase implements IBuildReceiver {
+
+ private static final String TAG = "Statsd.ProcStateTestCase";
+
+ private static final String DEVICE_SIDE_FG_ACTIVITY_COMPONENT
+ = "com.android.server.cts.device.statsd/.StatsdCtsForegroundActivity";
+ private static final String DEVICE_SIDE_FG_SERVICE_COMPONENT
+ = "com.android.server.cts.device.statsd/.StatsdCtsForegroundService";
+
+ private static final String KEY_ACTION = "action";
+
+ // Constants from the device-side tests (not directly accessible here).
+ public static final String ACTION_END_IMMEDIATELY = "action.end_immediately";
+ public static final String ACTION_BACKGROUND_SLEEP = "action.background_sleep";
+ public static final String ACTION_SLEEP_WHILE_TOP = "action.sleep_top";
+ public static final String ACTION_LONG_SLEEP_WHILE_TOP = "action.long_sleep_top";
+ public static final String ACTION_SHOW_APPLICATION_OVERLAY = "action.show_application_overlay";
+
+ // Sleep times (ms) that actions invoke device-side.
+ public static final int SLEEP_OF_ACTION_SLEEP_WHILE_TOP = 2_000;
+ public static final int SLEEP_OF_ACTION_LONG_SLEEP_WHILE_TOP = 60_000;
+ public static final int SLEEP_OF_ACTION_BACKGROUND_SLEEP = 2_000;
+ public static final int SLEEP_OF_FOREGROUND_SERVICE = 2_000;
+
+ protected IBuildInfo mCtsBuild;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ assertThat(mCtsBuild).isNotNull();
+ ConfigUtils.removeConfig(getDevice());
+ ReportUtils.clearReports(getDevice());
+ DeviceUtils.installTestApp(getDevice(), MetricsUtils.DEVICE_SIDE_TEST_APK,
+ MetricsUtils.DEVICE_SIDE_TEST_PACKAGE, mCtsBuild);
+ RunUtil.getDefault().sleep(1000);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.setUp();
+ ConfigUtils.removeConfig(getDevice());
+ ReportUtils.clearReports(getDevice());
+ DeviceUtils.uninstallTestApp(getDevice(), MetricsUtils.DEVICE_SIDE_TEST_PACKAGE);
+ }
+
+ @Override
+ public void setBuild(IBuildInfo buildInfo) {
+ mCtsBuild = buildInfo;
+ }
+
+ /**
+ * Runs an activity (in the foreground) to perform the given action.
+ *
+ * @param actionValue the action code constants indicating the desired action to perform.
+ */
+ protected void executeForegroundActivity(String actionValue) throws Exception {
+ getDevice().executeShellCommand(String.format(
+ "am start -n '%s' -e %s %s",
+ DEVICE_SIDE_FG_ACTIVITY_COMPONENT,
+ KEY_ACTION, actionValue));
+ }
+
+ /**
+ * Runs a simple foreground service.
+ */
+ protected void executeForegroundService() throws Exception {
+ executeForegroundActivity(ACTION_END_IMMEDIATELY);
+ getDevice().executeShellCommand(String.format(
+ "am startservice -n '%s'", DEVICE_SIDE_FG_SERVICE_COMPONENT));
+ }
}
diff --git a/tests/src/android/cts/statsd/metadata/MetadataTestCase.java b/tests/src/android/cts/statsd/metadata/MetadataTestCase.java
index ca502708..0e957b53 100644
--- a/tests/src/android/cts/statsd/metadata/MetadataTestCase.java
+++ b/tests/src/android/cts/statsd/metadata/MetadataTestCase.java
@@ -16,22 +16,37 @@
package android.cts.statsd.metadata;
-import android.cts.statsd.atom.AtomTestCase;
+import static com.google.common.truth.Truth.assertThat;
+
+import android.cts.statsd.atom.BufferDebug;
+import android.cts.statsd.metric.MetricsUtils;
+import android.cts.statsdatom.lib.ConfigUtils;
+import android.cts.statsdatom.lib.DeviceUtils;
+import android.cts.statsdatom.lib.ReportUtils;
import com.android.internal.os.StatsdConfigProto.StatsdConfig;
import com.android.os.AtomsProto.Atom;
import com.android.os.StatsLog.StatsdStatsReport;
+import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.device.CollectingByteOutputReceiver;
+import com.android.tradefed.device.DeviceNotAvailableException;
import com.android.tradefed.log.LogUtil;
+import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IBuildReceiver;
+import com.android.tradefed.util.RunUtil;
+
+import com.google.protobuf.InvalidProtocolBufferException;
+import com.google.protobuf.MessageLite;
+import com.google.protobuf.Parser;
-public class MetadataTestCase extends AtomTestCase {
+public class MetadataTestCase extends DeviceTestCase implements IBuildReceiver {
public static final String DUMP_METADATA_CMD = "cmd stats print-stats";
- public static final String DEVICE_SIDE_TEST_APK = "CtsStatsdApp.apk";
- public static final String DEVICE_SIDE_TEST_PACKAGE = "com.android.server.cts.device.statsd";
+ protected IBuildInfo mCtsBuild;
protected StatsdStatsReport getStatsdStatsReport() throws Exception {
try {
- StatsdStatsReport report = getDump(StatsdStatsReport.parser(),
+ StatsdStatsReport report = MetricsUtils.getDump(getDevice(), StatsdStatsReport.parser(),
String.join(" ", DUMP_METADATA_CMD, "--proto"));
return report;
} catch (com.google.protobuf.InvalidProtocolBufferException e) {
@@ -41,16 +56,33 @@ public class MetadataTestCase extends AtomTestCase {
}
protected final StatsdConfig.Builder getBaseConfig() throws Exception {
- StatsdConfig.Builder builder = createConfigBuilder();
- addAtomEvent(builder, Atom.APP_BREADCRUMB_REPORTED_FIELD_NUMBER);
- return builder;
+ StatsdConfig.Builder builder = ConfigUtils.createConfigBuilder(
+ MetricsUtils.DEVICE_SIDE_TEST_PACKAGE);
+ ConfigUtils.addEventMetric(builder, Atom.APP_BREADCRUMB_REPORTED_FIELD_NUMBER);
+ return builder;
}
@Override
protected void setUp() throws Exception {
super.setUp();
- getDevice().uninstallPackage(DEVICE_SIDE_TEST_PACKAGE);
- installPackage(DEVICE_SIDE_TEST_APK, true);
- Thread.sleep(1000);
+ assertThat(mCtsBuild).isNotNull();
+ ConfigUtils.removeConfig(getDevice());
+ ReportUtils.clearReports(getDevice());
+ DeviceUtils.installTestApp(getDevice(), MetricsUtils.DEVICE_SIDE_TEST_APK,
+ MetricsUtils.DEVICE_SIDE_TEST_PACKAGE, mCtsBuild);
+ RunUtil.getDefault().sleep(1000);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.setUp();
+ ConfigUtils.removeConfig(getDevice());
+ ReportUtils.clearReports(getDevice());
+ DeviceUtils.uninstallTestApp(getDevice(), MetricsUtils.DEVICE_SIDE_TEST_PACKAGE);
+ }
+
+ @Override
+ public void setBuild(IBuildInfo buildInfo) {
+ mCtsBuild = buildInfo;
}
}
diff --git a/tests/src/android/cts/statsd/metadata/MetadataTests.java b/tests/src/android/cts/statsd/metadata/MetadataTests.java
index 4b6433e7..d3764d3c 100644
--- a/tests/src/android/cts/statsd/metadata/MetadataTests.java
+++ b/tests/src/android/cts/statsd/metadata/MetadataTests.java
@@ -18,16 +18,23 @@ package android.cts.statsd.metadata;
import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertWithMessage;
+import android.cts.statsd.metric.MetricsUtils;
+import android.cts.statsdatom.lib.AtomTestUtils;
+import android.cts.statsdatom.lib.ConfigUtils;
+import android.cts.statsdatom.lib.DeviceUtils;
+
import com.android.compatibility.common.util.ApiLevelUtil;
import com.android.internal.os.StatsdConfigProto.StatsdConfig;
+import com.android.os.AtomsProto;
import com.android.os.AtomsProto.Atom;
import com.android.os.StatsLog.StatsdStatsReport;
import com.android.os.StatsLog.StatsdStatsReport.ConfigStats;
import com.android.os.StatsLog.StatsdStatsReport.LogLossStats;
-import com.android.os.StatsLog.StatsdStatsReport.SocketLossStats;
import com.android.os.StatsLog.StatsdStatsReport.SocketLossStats.LossStatsPerUid;
import com.android.os.StatsLog.StatsdStatsReport.SocketLossStats.LossStatsPerUid.AtomIdLossStats;
import com.android.tradefed.log.LogUtil;
+import com.android.tradefed.util.RunUtil;
+
import java.util.HashSet;
/**
@@ -37,24 +44,28 @@ public class MetadataTests extends MetadataTestCase {
private static final String TAG = "Statsd.MetadataTests";
+ private static final int SHELL_UID = 2000;
+
// Tests that the statsd config is reset after the specified ttl.
public void testConfigTtl() throws Exception {
final int TTL_TIME_SEC = 8;
StatsdConfig.Builder config = getBaseConfig();
config.setTtlInSeconds(TTL_TIME_SEC); // should reset in this many seconds.
- uploadConfig(config);
+ ConfigUtils.uploadConfig(getDevice(), config);
long startTime = System.currentTimeMillis();
- Thread.sleep(WAIT_TIME_SHORT);
- doAppBreadcrumbReportedStart(/* irrelevant val */ 6); // Event, within < TTL_TIME_SEC secs.
- Thread.sleep(WAIT_TIME_SHORT);
+ RunUtil.getDefault().sleep(AtomTestUtils.WAIT_TIME_SHORT);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AtomsProto.AppBreadcrumbReported.State.START.ordinal(), /* irrelevant val */
+ 6); // Event, within < TTL_TIME_SEC secs.
+ RunUtil.getDefault().sleep(AtomTestUtils.WAIT_TIME_SHORT);
StatsdStatsReport report = getStatsdStatsReport(); // Has only been 1 second
LogUtil.CLog.d("got following statsdstats report: " + report.toString());
boolean foundActiveConfig = false;
int creationTime = 0;
- for (ConfigStats stats: report.getConfigStatsList()) {
- if (stats.getId() == CONFIG_ID && stats.getUid() == getHostUid()) {
- if(!stats.hasDeletionTimeSec()) {
+ for (ConfigStats stats : report.getConfigStatsList()) {
+ if (stats.getId() == ConfigUtils.CONFIG_ID && stats.getUid() == SHELL_UID) {
+ if (!stats.hasDeletionTimeSec()) {
assertWithMessage("Found multiple active CTS configs!")
.that(foundActiveConfig).isFalse();
foundActiveConfig = true;
@@ -64,17 +75,19 @@ public class MetadataTests extends MetadataTestCase {
}
assertWithMessage("Did not find an active CTS config").that(foundActiveConfig).isTrue();
- while(System.currentTimeMillis() - startTime < 8_000) {
- Thread.sleep(10);
+ while (System.currentTimeMillis() - startTime < 8_000) {
+ RunUtil.getDefault().sleep(10);
}
- doAppBreadcrumbReportedStart(/* irrelevant val */ 6); // Event, after TTL_TIME_SEC secs.
- Thread.sleep(WAIT_TIME_LONG);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AtomsProto.AppBreadcrumbReported.State.START.ordinal(), /* irrelevant val */
+ 6); // Event, after TTL_TIME_SEC secs.
+ RunUtil.getDefault().sleep(AtomTestUtils.WAIT_TIME_SHORT);
report = getStatsdStatsReport();
LogUtil.CLog.d("got following statsdstats report: " + report.toString());
foundActiveConfig = false;
int expectedTime = creationTime + TTL_TIME_SEC;
- for (ConfigStats stats: report.getConfigStatsList()) {
- if (stats.getId() == CONFIG_ID && stats.getUid() == getHostUid()) {
+ for (ConfigStats stats : report.getConfigStatsList()) {
+ if (stats.getId() == ConfigUtils.CONFIG_ID && stats.getUid() == SHELL_UID) {
// Original config should be TTL'd
if (stats.getCreationTimeSec() == creationTime) {
assertWithMessage("Config should have TTL'd but is still active")
@@ -84,7 +97,7 @@ public class MetadataTests extends MetadataTestCase {
).that(Math.abs(stats.getDeletionTimeSec() - expectedTime)).isAtMost(2);
}
// There should still be one active config, that is marked as reset.
- if(!stats.hasDeletionTimeSec()) {
+ if (!stats.hasDeletionTimeSec()) {
assertWithMessage("Found multiple active CTS configs!")
.that(foundActiveConfig).isFalse();
foundActiveConfig = true;
@@ -108,7 +121,8 @@ public class MetadataTests extends MetadataTestCase {
/** Tests that logging many atoms back to back leads to socket overflow and data loss. */
public void testAtomLossInfoCollection() throws Exception {
- runDeviceTests(DEVICE_SIDE_TEST_PACKAGE, ".StatsdStressLogging", "testLogAtomsBackToBack");
+ DeviceUtils.runDeviceTests(getDevice(), MetricsUtils.DEVICE_SIDE_TEST_PACKAGE,
+ ".StatsdStressLogging", "testLogAtomsBackToBack");
StatsdStatsReport report = getStatsdStatsReport();
assertThat(report).isNotNull();
@@ -134,11 +148,12 @@ public class MetadataTests extends MetadataTestCase {
for (int i = 0; i < EVENT_STORM_ITERATIONS_COUNT; i++) {
LogUtil.CLog.d("testSystemServerLossErrorCode iteration #" + i);
// logging back to back many atoms to force socket overflow
- runDeviceTests(
- DEVICE_SIDE_TEST_PACKAGE, ".StatsdStressLogging", "testLogAtomsBackToBack");
+ DeviceUtils.runDeviceTests(
+ getDevice(), MetricsUtils.DEVICE_SIDE_TEST_PACKAGE, ".StatsdStressLogging",
+ "testLogAtomsBackToBack");
// Delay to allow statsd socket recover after overflow
- Thread.sleep(500);
+ RunUtil.getDefault().sleep(AtomTestUtils.WAIT_TIME_SHORT);
// There is some un-deterministic component in AtomLossStats propagation:
// - the dumpAtomsLossStats() from the libstatssocket happens ONLY after the
@@ -146,10 +161,12 @@ public class MetadataTests extends MetadataTestCase {
// - to avoid socket flood there is also cooldown timer incorporated. If no new atoms -
// loss info will not be propagated, which is intention by design.
// Log atoms into socket successfully to trigger libstatsocket dumpAtomsLossStats()
- doAppBreadcrumbReportedStart(6);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AtomsProto.AppBreadcrumbReported.State.START.ordinal(), /* irrelevant val */
+ 6); // Event, after TTL_TIME_SEC secs.
// Delay to allow libstatssocket loss info to be propagated to statsdstats
- Thread.sleep(1000);
+ RunUtil.getDefault().sleep(AtomTestUtils.WAIT_TIME_LONG);
StatsdStatsReport report = getStatsdStatsReport();
assertThat(report).isNotNull();
@@ -198,15 +215,16 @@ public class MetadataTests extends MetadataTestCase {
final String appTestPkg = "com.android.statsd.app.atomstorm";
final String app2TestPkg = "com.android.statsd.app.atomstorm.copy";
- getDevice().uninstallPackage(appTestPkg);
- getDevice().uninstallPackage(app2TestPkg);
- installPackage(appTestApk, true);
- installPackage(app2TestApk, true);
+ DeviceUtils.uninstallTestApp(getDevice(), appTestPkg);
+ DeviceUtils.uninstallTestApp(getDevice(), app2TestPkg);
+
+ DeviceUtils.installTestApp(getDevice(), appTestApk, appTestPkg, mCtsBuild);
+ DeviceUtils.installTestApp(getDevice(), app2TestApk, app2TestPkg, mCtsBuild);
// run reference test app with UID 1
- runDeviceTests(appTestPkg, null, null);
+ DeviceUtils.runDeviceTests(getDevice(), appTestPkg, null, null);
// run reference test app with UID 2
- runDeviceTests(app2TestPkg, null, null);
+ DeviceUtils.runDeviceTests(getDevice(), app2TestPkg, null, null);
StatsdStatsReport report = getStatsdStatsReport();
assertThat(report).isNotNull();
diff --git a/tests/src/android/cts/statsd/metric/CountMetricsTests.java b/tests/src/android/cts/statsd/metric/CountMetricsTests.java
index a5a51b34..d4cfb98d 100644
--- a/tests/src/android/cts/statsd/metric/CountMetricsTests.java
+++ b/tests/src/android/cts/statsd/metric/CountMetricsTests.java
@@ -18,48 +18,83 @@ package android.cts.statsd.metric;
import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertWithMessage;
-import android.cts.statsd.atom.DeviceAtomTestCase;
+import android.cts.statsdatom.lib.AtomTestUtils;
+import android.cts.statsdatom.lib.ConfigUtils;
+import android.cts.statsdatom.lib.DeviceUtils;
+import android.cts.statsdatom.lib.ReportUtils;
import com.android.internal.os.StatsdConfigProto;
import com.android.internal.os.StatsdConfigProto.FieldMatcher;
import com.android.internal.os.StatsdConfigProto.Position;
import com.android.os.AtomsProto.Atom;
import com.android.os.AtomsProto.AppBreadcrumbReported;
-import com.android.os.AtomsProto.BleScanStateChanged;
import com.android.os.AtomsProto.WakelockStateChanged;
import com.android.os.AttributionNode;
-import com.android.os.StatsLog;
import com.android.os.StatsLog.ConfigMetricsReport;
import com.android.os.StatsLog.ConfigMetricsReportList;
import com.android.os.StatsLog.CountBucketInfo;
import com.android.os.StatsLog.CountMetricData;
import com.android.os.StatsLog.StatsLogReport;
-import com.android.tradefed.device.DeviceNotAvailableException;
+import com.android.tradefed.build.IBuildInfo;
import com.android.tradefed.log.LogUtil;
+import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IBuildReceiver;
+import com.android.tradefed.util.RunUtil;
+
+import com.google.protobuf.ExtensionRegistry;
-import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
-public class CountMetricsTests extends DeviceAtomTestCase {
+public class CountMetricsTests extends DeviceTestCase implements IBuildReceiver {
+
+ private IBuildInfo mCtsBuild;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ assertThat(mCtsBuild).isNotNull();
+ ConfigUtils.removeConfig(getDevice());
+ ReportUtils.clearReports(getDevice());
+ DeviceUtils.installTestApp(getDevice(), MetricsUtils.DEVICE_SIDE_TEST_APK,
+ MetricsUtils.DEVICE_SIDE_TEST_PACKAGE, mCtsBuild);
+ RunUtil.getDefault().sleep(1000);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.setUp();
+ ConfigUtils.removeConfig(getDevice());
+ ReportUtils.clearReports(getDevice());
+ DeviceUtils.uninstallTestApp(getDevice(), MetricsUtils.DEVICE_SIDE_TEST_PACKAGE);
+ }
+
+ @Override
+ public void setBuild(IBuildInfo buildInfo) {
+ mCtsBuild = buildInfo;
+ }
public void testSimpleEventCountMetric() throws Exception {
int matcherId = 1;
- StatsdConfigProto.StatsdConfig.Builder builder = createConfigBuilder();
+ StatsdConfigProto.StatsdConfig.Builder builder = ConfigUtils.createConfigBuilder(
+ MetricsUtils.DEVICE_SIDE_TEST_PACKAGE);
builder.addCountMetric(StatsdConfigProto.CountMetric.newBuilder()
- .setId(MetricsUtils.COUNT_METRIC_ID)
- .setBucket(StatsdConfigProto.TimeUnit.ONE_MINUTE)
- .setWhat(matcherId))
- .addAtomMatcher(MetricsUtils.simpleAtomMatcher(matcherId));
- uploadConfig(builder);
-
- doAppBreadcrumbReportedStart(0);
- Thread.sleep(100);
- doAppBreadcrumbReportedStop(0);
- Thread.sleep(2000); // Wait for the metrics to propagate to statsd.
-
- StatsLogReport metricReport = getStatsLogReport();
+ .setId(MetricsUtils.COUNT_METRIC_ID)
+ .setBucket(StatsdConfigProto.TimeUnit.ONE_MINUTE)
+ .setWhat(matcherId))
+ .addAtomMatcher(MetricsUtils.simpleAtomMatcher(matcherId));
+ ConfigUtils.uploadConfig(getDevice(), builder);
+
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), 0);
+ RunUtil.getDefault().sleep(100);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.STOP.ordinal(), 0);
+ RunUtil.getDefault().sleep(2000); // Wait for the metrics to propagate to statsd.
+
+ StatsLogReport metricReport = ReportUtils.getStatsLogReport(getDevice(),
+ ExtensionRegistry.getEmptyRegistry());
LogUtil.CLog.d("Got the following stats log report: \n" + metricReport.toString());
assertThat(metricReport.getMetricId()).isEqualTo(MetricsUtils.COUNT_METRIC_ID);
assertThat(metricReport.hasCountMetrics()).isTrue();
@@ -69,6 +104,7 @@ public class CountMetricsTests extends DeviceAtomTestCase {
assertThat(countData.getDataCount()).isGreaterThan(0);
assertThat(countData.getData(0).getBucketInfo(0).getCount()).isEqualTo(2);
}
+
public void testEventCountWithCondition() throws Exception {
int startMatcherId = 1;
int endMatcherId = 2;
@@ -76,7 +112,7 @@ public class CountMetricsTests extends DeviceAtomTestCase {
int conditionId = 4;
StatsdConfigProto.AtomMatcher whatMatcher =
- MetricsUtils.unspecifiedAtomMatcher(whatMatcherId);
+ MetricsUtils.unspecifiedAtomMatcher(whatMatcherId);
StatsdConfigProto.AtomMatcher predicateStartMatcher =
MetricsUtils.startAtomMatcher(startMatcherId);
@@ -92,7 +128,8 @@ public class CountMetricsTests extends DeviceAtomTestCase {
.setId(conditionId)
.build();
- StatsdConfigProto.StatsdConfig.Builder builder = createConfigBuilder()
+ StatsdConfigProto.StatsdConfig.Builder builder = ConfigUtils.createConfigBuilder(
+ MetricsUtils.DEVICE_SIDE_TEST_PACKAGE)
.addCountMetric(StatsdConfigProto.CountMetric.newBuilder()
.setId(MetricsUtils.COUNT_METRIC_ID)
.setBucket(StatsdConfigProto.TimeUnit.CTS)
@@ -103,20 +140,26 @@ public class CountMetricsTests extends DeviceAtomTestCase {
.addAtomMatcher(predicateEndMatcher)
.addPredicate(p);
- uploadConfig(builder);
-
- doAppBreadcrumbReported(0, AppBreadcrumbReported.State.UNSPECIFIED.ordinal());
- Thread.sleep(10);
- doAppBreadcrumbReportedStart(0);
- Thread.sleep(10);
- doAppBreadcrumbReported(0, AppBreadcrumbReported.State.UNSPECIFIED.ordinal());
- Thread.sleep(10);
- doAppBreadcrumbReportedStop(0);
- Thread.sleep(10);
- doAppBreadcrumbReported(0, AppBreadcrumbReported.State.UNSPECIFIED.ordinal());
- Thread.sleep(2000); // Wait for the metrics to propagate to statsd.
-
- StatsLogReport metricReport = getStatsLogReport();
+ ConfigUtils.uploadConfig(getDevice(), builder);
+
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), 0);
+ RunUtil.getDefault().sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), 0);
+ RunUtil.getDefault().sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), 0);
+ RunUtil.getDefault().sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.STOP.ordinal(), 0);
+ RunUtil.getDefault().sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), 0);
+ RunUtil.getDefault().sleep(2000); // Wait for the metrics to propagate to statsd.
+
+ StatsLogReport metricReport = ReportUtils.getStatsLogReport(getDevice(),
+ ExtensionRegistry.getEmptyRegistry());
assertThat(metricReport.getMetricId()).isEqualTo(MetricsUtils.COUNT_METRIC_ID);
assertThat(metricReport.hasCountMetrics()).isTrue();
@@ -149,7 +192,7 @@ public class CountMetricsTests extends DeviceAtomTestCase {
StatsdConfigProto.AtomMatcher activationMatcher =
MetricsUtils.appBreadcrumbMatcherWithLabel(activationMatcherId,
- activationMatcherLabel);
+ activationMatcherLabel);
StatsdConfigProto.Predicate p = StatsdConfigProto.Predicate.newBuilder()
.setSimplePredicate(StatsdConfigProto.SimplePredicate.newBuilder()
@@ -159,7 +202,8 @@ public class CountMetricsTests extends DeviceAtomTestCase {
.setId(conditionId)
.build();
- StatsdConfigProto.StatsdConfig.Builder builder = createConfigBuilder()
+ StatsdConfigProto.StatsdConfig.Builder builder = ConfigUtils.createConfigBuilder(
+ MetricsUtils.DEVICE_SIDE_TEST_PACKAGE)
.addCountMetric(StatsdConfigProto.CountMetric.newBuilder()
.setId(MetricsUtils.COUNT_METRIC_ID)
.setBucket(StatsdConfigProto.TimeUnit.ONE_MINUTE)
@@ -178,66 +222,79 @@ public class CountMetricsTests extends DeviceAtomTestCase {
.setAtomMatcherId(activationMatcherId)
.setTtlSeconds(ttlSec)));
- uploadConfig(builder);
+ ConfigUtils.uploadConfig(getDevice(), builder);
// Activate the metric.
- doAppBreadcrumbReported(activationMatcherLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), activationMatcherLabel);
+ RunUtil.getDefault().sleep(10);
// Set the condition to true.
- doAppBreadcrumbReportedStart(startMatcherLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), startMatcherLabel);
+ RunUtil.getDefault().sleep(10);
// Log an event that should be counted. Bucket 1 Count 1.
- doAppBreadcrumbReported(whatMatcherLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), whatMatcherLabel);
+ RunUtil.getDefault().sleep(10);
// Log an event that should be counted. Bucket 1 Count 2.
- doAppBreadcrumbReported(whatMatcherLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), whatMatcherLabel);
+ RunUtil.getDefault().sleep(10);
// Set the condition to false.
- doAppBreadcrumbReportedStop(endMatcherLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.STOP.ordinal(), endMatcherLabel);
+ RunUtil.getDefault().sleep(10);
// Log an event that should not be counted because condition is false.
- doAppBreadcrumbReported(whatMatcherLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), whatMatcherLabel);
+ RunUtil.getDefault().sleep(10);
// Let the metric deactivate.
- Thread.sleep(ttlSec * 1000);
+ RunUtil.getDefault().sleep(ttlSec * 1000);
// Log an event that should not be counted.
- doAppBreadcrumbReported(whatMatcherLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), whatMatcherLabel);
+ RunUtil.getDefault().sleep(10);
// Condition to true again.
- doAppBreadcrumbReportedStart(startMatcherLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), startMatcherLabel);
+ RunUtil.getDefault().sleep(10);
// Event should not be counted, metric is still not active.
- doAppBreadcrumbReported(whatMatcherLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), whatMatcherLabel);
+ RunUtil.getDefault().sleep(10);
// Activate the metric.
- doAppBreadcrumbReported(activationMatcherLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), activationMatcherLabel);
+ RunUtil.getDefault().sleep(10);
// Log an event that should be counted.
- doAppBreadcrumbReported(whatMatcherLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), whatMatcherLabel);
+ RunUtil.getDefault().sleep(10);
// Let the metric deactivate.
- Thread.sleep(ttlSec * 1000);
+ RunUtil.getDefault().sleep(ttlSec * 1000);
// Log an event that should not be counted.
- doAppBreadcrumbReported(whatMatcherLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), whatMatcherLabel);
+ RunUtil.getDefault().sleep(10);
// Wait for the metrics to propagate to statsd.
- Thread.sleep(2000);
+ RunUtil.getDefault().sleep(2000);
- StatsLogReport metricReport = getStatsLogReport();
+ StatsLogReport metricReport = ReportUtils.getStatsLogReport(getDevice(),
+ ExtensionRegistry.getEmptyRegistry());
assertThat(metricReport.getMetricId()).isEqualTo(MetricsUtils.COUNT_METRIC_ID);
LogUtil.CLog.d("Received the following data: " + metricReport.toString());
assertThat(metricReport.hasCountMetrics()).isTrue();
@@ -252,27 +309,34 @@ public class CountMetricsTests extends DeviceAtomTestCase {
public void testPartialBucketCountMetric() throws Exception {
int matcherId = 1;
- StatsdConfigProto.StatsdConfig.Builder builder = createConfigBuilder();
+ StatsdConfigProto.StatsdConfig.Builder builder = ConfigUtils.createConfigBuilder(
+ MetricsUtils.DEVICE_SIDE_TEST_PACKAGE);
builder
- .addCountMetric(
- StatsdConfigProto.CountMetric.newBuilder()
- .setId(MetricsUtils.COUNT_METRIC_ID)
- .setBucket(StatsdConfigProto.TimeUnit.ONE_DAY) // Ensures partial bucket.
- .setWhat(matcherId)
- .setSplitBucketForAppUpgrade(true))
- .addAtomMatcher(MetricsUtils.simpleAtomMatcher(matcherId));
- uploadConfig(builder);
+ .addCountMetric(
+ StatsdConfigProto.CountMetric.newBuilder()
+ .setId(MetricsUtils.COUNT_METRIC_ID)
+ .setBucket(
+ StatsdConfigProto.TimeUnit.ONE_DAY) // Ensures partial
+ // bucket.
+ .setWhat(matcherId)
+ .setSplitBucketForAppUpgrade(true))
+ .addAtomMatcher(MetricsUtils.simpleAtomMatcher(matcherId));
+ ConfigUtils.uploadConfig(getDevice(), builder);
- doAppBreadcrumbReportedStart(0);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), 0);
builder.getCountMetricBuilder(0).setBucket(StatsdConfigProto.TimeUnit.CTS);
- uploadConfig(builder); // The count metric had a partial bucket.
- doAppBreadcrumbReportedStart(0);
- Thread.sleep(10);
- doAppBreadcrumbReportedStart(0);
- Thread.sleep(WAIT_TIME_LONG); // Finish the current bucket.
-
- ConfigMetricsReportList reports = getReportList();
+ ConfigUtils.uploadConfig(getDevice(), builder); // The count metric had a partial bucket.
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), 0);
+ RunUtil.getDefault().sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), 0);
+ RunUtil.getDefault().sleep(AtomTestUtils.WAIT_TIME_LONG); // Finish the current bucket.
+
+ ConfigMetricsReportList reports = ReportUtils.getReportList(getDevice(),
+ ExtensionRegistry.getEmptyRegistry());
LogUtil.CLog.d("Got following report list: " + reports.toString());
assertThat(reports.getReportsCount()).isEqualTo(2);
@@ -285,9 +349,9 @@ public class CountMetricsTests extends DeviceAtomTestCase {
assertThat(report.getMetrics(0).getCountMetrics().getDataCount()).isEqualTo(1);
}
CountMetricData data1 =
- reports.getReports(inOrder? 0 : 1).getMetrics(0).getCountMetrics().getData(0);
+ reports.getReports(inOrder ? 0 : 1).getMetrics(0).getCountMetrics().getData(0);
CountMetricData data2 =
- reports.getReports(inOrder? 1 : 0).getMetrics(0).getCountMetrics().getData(0);
+ reports.getReports(inOrder ? 1 : 0).getMetrics(0).getCountMetrics().getData(0);
// Data1 should have only 1 bucket, and it should be a partial bucket.
// The count should be 1.
assertThat(data1.getBucketInfoCount()).isEqualTo(1);
@@ -326,90 +390,93 @@ public class CountMetricsTests extends DeviceAtomTestCase {
.build();
StatsdConfigProto.State state = StatsdConfigProto.State.newBuilder()
- .setId(stateId)
- .setAtomId(Atom.WAKELOCK_STATE_CHANGED_FIELD_NUMBER)
- .setMap(StatsdConfigProto.StateMap.newBuilder()
- .addGroup(StatsdConfigProto.StateMap.StateGroup.newBuilder()
- .setGroupId(onStateGroupId)
- .addValue(WakelockStateChanged.State.ACQUIRE_VALUE)
- .addValue(WakelockStateChanged.State.CHANGE_ACQUIRE_VALUE)
- )
- .addGroup(StatsdConfigProto.StateMap.StateGroup.newBuilder()
- .setGroupId(offStateGroupId)
- .addValue(WakelockStateChanged.State.RELEASE_VALUE)
- .addValue(WakelockStateChanged.State.CHANGE_RELEASE_VALUE)
- )
- )
- .build();
+ .setId(stateId)
+ .setAtomId(Atom.WAKELOCK_STATE_CHANGED_FIELD_NUMBER)
+ .setMap(StatsdConfigProto.StateMap.newBuilder()
+ .addGroup(StatsdConfigProto.StateMap.StateGroup.newBuilder()
+ .setGroupId(onStateGroupId)
+ .addValue(WakelockStateChanged.State.ACQUIRE_VALUE)
+ .addValue(WakelockStateChanged.State.CHANGE_ACQUIRE_VALUE)
+ )
+ .addGroup(StatsdConfigProto.StateMap.StateGroup.newBuilder()
+ .setGroupId(offStateGroupId)
+ .addValue(WakelockStateChanged.State.RELEASE_VALUE)
+ .addValue(WakelockStateChanged.State.CHANGE_RELEASE_VALUE)
+ )
+ )
+ .build();
StatsdConfigProto.MetricStateLink stateLink = StatsdConfigProto.MetricStateLink.newBuilder()
- .setStateAtomId(Atom.WAKELOCK_STATE_CHANGED_FIELD_NUMBER)
- .setFieldsInWhat(FieldMatcher.newBuilder()
- .setField(whatAtomId)
- .addChild(FieldMatcher.newBuilder()
- .setField(1)
- .setPosition(Position.FIRST)
- .addChild(FieldMatcher.newBuilder()
- .setField(AttributionNode.UID_FIELD_NUMBER)
- )
- )
- .addChild(FieldMatcher.newBuilder()
- .setField(2)
- )
- .addChild(FieldMatcher.newBuilder()
- .setField(3)
- )
- )
- .setFieldsInState(FieldMatcher.newBuilder()
- .setField(Atom.WAKELOCK_STATE_CHANGED_FIELD_NUMBER)
- .addChild(FieldMatcher.newBuilder()
- .setField(WakelockStateChanged.ATTRIBUTION_NODE_FIELD_NUMBER)
- .setPosition(Position.FIRST)
- .addChild(FieldMatcher.newBuilder()
- .setField(AttributionNode.UID_FIELD_NUMBER)
- )
- )
- .addChild(FieldMatcher.newBuilder()
- .setField(WakelockStateChanged.TYPE_FIELD_NUMBER)
- )
- .addChild(FieldMatcher.newBuilder()
- .setField(WakelockStateChanged.TAG_FIELD_NUMBER)
- )
- )
- .build();
-
- StatsdConfigProto.StatsdConfig.Builder builder = createConfigBuilder()
+ .setStateAtomId(Atom.WAKELOCK_STATE_CHANGED_FIELD_NUMBER)
+ .setFieldsInWhat(FieldMatcher.newBuilder()
+ .setField(whatAtomId)
+ .addChild(FieldMatcher.newBuilder()
+ .setField(1)
+ .setPosition(Position.FIRST)
+ .addChild(FieldMatcher.newBuilder()
+ .setField(AttributionNode.UID_FIELD_NUMBER)
+ )
+ )
+ .addChild(FieldMatcher.newBuilder()
+ .setField(2)
+ )
+ .addChild(FieldMatcher.newBuilder()
+ .setField(3)
+ )
+ )
+ .setFieldsInState(FieldMatcher.newBuilder()
+ .setField(Atom.WAKELOCK_STATE_CHANGED_FIELD_NUMBER)
+ .addChild(FieldMatcher.newBuilder()
+ .setField(WakelockStateChanged.ATTRIBUTION_NODE_FIELD_NUMBER)
+ .setPosition(Position.FIRST)
+ .addChild(FieldMatcher.newBuilder()
+ .setField(AttributionNode.UID_FIELD_NUMBER)
+ )
+ )
+ .addChild(FieldMatcher.newBuilder()
+ .setField(WakelockStateChanged.TYPE_FIELD_NUMBER)
+ )
+ .addChild(FieldMatcher.newBuilder()
+ .setField(WakelockStateChanged.TAG_FIELD_NUMBER)
+ )
+ )
+ .build();
+
+ StatsdConfigProto.StatsdConfig.Builder builder = ConfigUtils.createConfigBuilder(
+ MetricsUtils.DEVICE_SIDE_TEST_PACKAGE)
.addCountMetric(StatsdConfigProto.CountMetric.newBuilder()
- .setId(MetricsUtils.COUNT_METRIC_ID)
- .setBucket(StatsdConfigProto.TimeUnit.CTS)
- .setWhat(whatMatcherId)
- .addSliceByState(stateId)
- .addStateLink(stateLink)
- .setDimensionsInWhat(
- FieldMatcher.newBuilder()
- .setField(whatAtomId)
- .addChild(FieldMatcher.newBuilder()
- .setField(1)
- .setPosition(Position.FIRST)
- .addChild(FieldMatcher.newBuilder()
- .setField(AttributionNode.UID_FIELD_NUMBER)
- )
- )
- .addChild(FieldMatcher.newBuilder()
- .setField(2)
- )
- .addChild(FieldMatcher.newBuilder()
- .setField(3)
+ .setId(MetricsUtils.COUNT_METRIC_ID)
+ .setBucket(StatsdConfigProto.TimeUnit.CTS)
+ .setWhat(whatMatcherId)
+ .addSliceByState(stateId)
+ .addStateLink(stateLink)
+ .setDimensionsInWhat(
+ FieldMatcher.newBuilder()
+ .setField(whatAtomId)
+ .addChild(FieldMatcher.newBuilder()
+ .setField(1)
+ .setPosition(Position.FIRST)
+ .addChild(FieldMatcher.newBuilder()
+ .setField(AttributionNode.UID_FIELD_NUMBER)
+ )
+ )
+ .addChild(FieldMatcher.newBuilder()
+ .setField(2)
+ )
+ .addChild(FieldMatcher.newBuilder()
+ .setField(3)
+ )
)
- )
)
.addAtomMatcher(whatMatcher)
.addState(state);
- uploadConfig(builder);
+ ConfigUtils.uploadConfig(getDevice(), builder);
- runDeviceTests(DEVICE_SIDE_TEST_PACKAGE, ".AtomTests", "testSliceByWakelockState");
+ DeviceUtils.runDeviceTests(getDevice(), MetricsUtils.DEVICE_SIDE_TEST_PACKAGE, ".AtomTests",
+ "testSliceByWakelockState");
- StatsLogReport metricReport = getStatsLogReport();
+ StatsLogReport metricReport = ReportUtils.getStatsLogReport(getDevice(),
+ ExtensionRegistry.getEmptyRegistry());
LogUtil.CLog.d("Got the following stats log report: \n" + metricReport.toString());
assertThat(metricReport.getMetricId()).isEqualTo(MetricsUtils.COUNT_METRIC_ID);
assertThat(metricReport.hasCountMetrics()).isTrue();
@@ -420,10 +487,10 @@ public class CountMetricsTests extends DeviceAtomTestCase {
List<CountMetricData> sortedDataList = IntStream.range(0, dataWrapper.getDataCount())
.mapToObj(i -> {
- CountMetricData data = dataWrapper.getData(i);
- assertWithMessage("Unexpected SliceByState count for data[%s]", "" + i)
- .that(data.getSliceByStateCount()).isEqualTo(1);
- return data;
+ CountMetricData data = dataWrapper.getData(i);
+ assertWithMessage("Unexpected SliceByState count for data[%s]", "" + i)
+ .that(data.getSliceByStateCount()).isEqualTo(1);
+ return data;
})
.sorted((data1, data2) ->
Long.compare(data1.getSliceByState(0).getGroupId(),
diff --git a/tests/src/android/cts/statsd/metric/DurationMetricsTests.java b/tests/src/android/cts/statsd/metric/DurationMetricsTests.java
index 65cef954..00ff927c 100644
--- a/tests/src/android/cts/statsd/metric/DurationMetricsTests.java
+++ b/tests/src/android/cts/statsd/metric/DurationMetricsTests.java
@@ -17,45 +17,62 @@ package android.cts.statsd.metric;
import static com.google.common.truth.Truth.assertThat;
-import android.cts.statsd.atom.DeviceAtomTestCase;
+import android.cts.statsdatom.lib.AtomTestUtils;
+import android.cts.statsdatom.lib.ConfigUtils;
+import android.cts.statsdatom.lib.DeviceUtils;
+import android.cts.statsdatom.lib.ReportUtils;
import com.android.internal.os.StatsdConfigProto;
import com.android.internal.os.StatsdConfigProto.AtomMatcher;
import com.android.internal.os.StatsdConfigProto.FieldMatcher;
-import com.android.internal.os.StatsdConfigProto.FieldValueMatcher;
-import com.android.internal.os.StatsdConfigProto.Position;
import com.android.internal.os.StatsdConfigProto.Predicate;
-import com.android.internal.os.StatsdConfigProto.SimpleAtomMatcher;
import com.android.internal.os.StatsdConfigProto.SimplePredicate;
import com.android.os.AtomsProto.AppBreadcrumbReported;
import com.android.os.AtomsProto.Atom;
-import com.android.os.StatsLog.ConfigMetricsReport;
-import com.android.os.StatsLog.ConfigMetricsReportList;
import com.android.os.StatsLog.DurationBucketInfo;
import com.android.os.StatsLog.StatsLogReport;
-import com.android.tradefed.device.DeviceNotAvailableException;
import com.android.tradefed.log.LogUtil;
+import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.util.RunUtil;
import com.google.common.collect.Range;
+import com.google.protobuf.ExtensionRegistry;
-import java.util.List;
-public class DurationMetricsTests extends DeviceAtomTestCase {
+public class DurationMetricsTests extends DeviceTestCase {
private static final int APP_BREADCRUMB_REPORTED_A_MATCH_START_ID = 0;
private static final int APP_BREADCRUMB_REPORTED_A_MATCH_STOP_ID = 1;
private static final int APP_BREADCRUMB_REPORTED_B_MATCH_START_ID = 2;
private static final int APP_BREADCRUMB_REPORTED_B_MATCH_STOP_ID = 3;
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ ConfigUtils.removeConfig(getDevice());
+ ReportUtils.clearReports(getDevice());
+ RunUtil.getDefault().sleep(1000);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.setUp();
+ ConfigUtils.removeConfig(getDevice());
+ ReportUtils.clearReports(getDevice());
+ }
+
public void testDurationMetric() throws Exception {
final int label = 1;
// Add AtomMatchers.
AtomMatcher startAtomMatcher =
- MetricsUtils.startAtomMatcherWithLabel(APP_BREADCRUMB_REPORTED_A_MATCH_START_ID, label);
+ MetricsUtils.startAtomMatcherWithLabel(APP_BREADCRUMB_REPORTED_A_MATCH_START_ID,
+ label);
AtomMatcher stopAtomMatcher =
- MetricsUtils.stopAtomMatcherWithLabel(APP_BREADCRUMB_REPORTED_A_MATCH_STOP_ID, label);
+ MetricsUtils.stopAtomMatcherWithLabel(APP_BREADCRUMB_REPORTED_A_MATCH_STOP_ID,
+ label);
- StatsdConfigProto.StatsdConfig.Builder builder = createConfigBuilder();
+ StatsdConfigProto.StatsdConfig.Builder builder = ConfigUtils.createConfigBuilder(
+ MetricsUtils.DEVICE_SIDE_TEST_PACKAGE);
builder.addAtomMatcher(startAtomMatcher);
builder.addAtomMatcher(stopAtomMatcher);
@@ -65,31 +82,34 @@ public class DurationMetricsTests extends DeviceAtomTestCase {
.setStop(APP_BREADCRUMB_REPORTED_A_MATCH_STOP_ID)
.build();
Predicate predicate = Predicate.newBuilder()
- .setId(MetricsUtils.StringToId("Predicate"))
- .setSimplePredicate(simplePredicate)
- .build();
+ .setId(MetricsUtils.StringToId("Predicate"))
+ .setSimplePredicate(simplePredicate)
+ .build();
builder.addPredicate(predicate);
// Add DurationMetric.
builder.addDurationMetric(
- StatsdConfigProto.DurationMetric.newBuilder()
- .setId(MetricsUtils.DURATION_METRIC_ID)
- .setWhat(predicate.getId())
- .setAggregationType(StatsdConfigProto.DurationMetric.AggregationType.SUM)
- .setBucket(StatsdConfigProto.TimeUnit.CTS));
+ StatsdConfigProto.DurationMetric.newBuilder()
+ .setId(MetricsUtils.DURATION_METRIC_ID)
+ .setWhat(predicate.getId())
+ .setAggregationType(StatsdConfigProto.DurationMetric.AggregationType.SUM)
+ .setBucket(StatsdConfigProto.TimeUnit.CTS));
// Upload config.
- uploadConfig(builder);
+ ConfigUtils.uploadConfig(getDevice(), builder);
// Create AppBreadcrumbReported Start/Stop events.
- doAppBreadcrumbReportedStart(label);
- Thread.sleep(2000);
- doAppBreadcrumbReportedStop(label);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), label);
+ RunUtil.getDefault().sleep(2000);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.STOP.ordinal(), label);
// Wait for the metrics to propagate to statsd.
- Thread.sleep(2000);
+ RunUtil.getDefault().sleep(2000);
- StatsLogReport metricReport = getStatsLogReport();
+ StatsLogReport metricReport = ReportUtils.getStatsLogReport(getDevice(),
+ ExtensionRegistry.getEmptyRegistry());
assertThat(metricReport.getMetricId()).isEqualTo(MetricsUtils.DURATION_METRIC_ID);
LogUtil.CLog.d("Received the following data: " + metricReport.toString());
assertThat(metricReport.hasDurationMetrics()).isTrue();
@@ -97,7 +117,7 @@ public class DurationMetricsTests extends DeviceAtomTestCase {
= metricReport.getDurationMetrics();
assertThat(durationData.getDataCount()).isEqualTo(1);
assertThat(durationData.getData(0).getBucketInfo(0).getDurationNanos())
- .isIn(Range.open(0L, (long)1e9));
+ .isIn(Range.open(0L, (long) 1e9));
}
public void testDurationMetricWithCondition() throws Exception {
@@ -114,7 +134,8 @@ public class DurationMetricsTests extends DeviceAtomTestCase {
AtomMatcher conditionStopAtomMatcher = MetricsUtils.stopAtomMatcherWithLabel(
APP_BREADCRUMB_REPORTED_B_MATCH_STOP_ID, conditionLabel);
- StatsdConfigProto.StatsdConfig.Builder builder = createConfigBuilder()
+ StatsdConfigProto.StatsdConfig.Builder builder = ConfigUtils.createConfigBuilder(
+ DeviceUtils.STATSD_ATOM_TEST_PKG)
.addAtomMatcher(startAtomMatcher)
.addAtomMatcher(stopAtomMatcher)
.addAtomMatcher(conditionStartAtomMatcher)
@@ -126,22 +147,22 @@ public class DurationMetricsTests extends DeviceAtomTestCase {
.setStop(APP_BREADCRUMB_REPORTED_A_MATCH_STOP_ID)
.build();
Predicate predicate = Predicate.newBuilder()
- .setId(MetricsUtils.StringToId("Predicate"))
- .setSimplePredicate(simplePredicate)
- .build();
+ .setId(MetricsUtils.StringToId("Predicate"))
+ .setSimplePredicate(simplePredicate)
+ .build();
SimplePredicate conditionSimplePredicate = SimplePredicate.newBuilder()
.setStart(APP_BREADCRUMB_REPORTED_B_MATCH_START_ID)
.setStop(APP_BREADCRUMB_REPORTED_B_MATCH_STOP_ID)
.build();
Predicate conditionPredicate = Predicate.newBuilder()
- .setId(MetricsUtils.StringToId("ConditionPredicate"))
- .setSimplePredicate(conditionSimplePredicate)
- .build();
+ .setId(MetricsUtils.StringToId("ConditionPredicate"))
+ .setSimplePredicate(conditionSimplePredicate)
+ .build();
builder
- .addPredicate(predicate)
- .addPredicate(conditionPredicate);
+ .addPredicate(predicate)
+ .addPredicate(conditionPredicate);
// Add DurationMetric.
builder
@@ -154,48 +175,57 @@ public class DurationMetricsTests extends DeviceAtomTestCase {
);
// Upload config.
- uploadConfig(builder);
+ ConfigUtils.uploadConfig(getDevice(), builder);
// Start uncounted duration.
- doAppBreadcrumbReportedStart(durationLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), durationLabel);
+ RunUtil.getDefault().sleep(10);
- Thread.sleep(2_000);
+ RunUtil.getDefault().sleep(2_000);
// Stop uncounted duration.
- doAppBreadcrumbReportedStop(durationLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.STOP.ordinal(), durationLabel);
+ RunUtil.getDefault().sleep(10);
// Set the condition to true.
- doAppBreadcrumbReportedStart(conditionLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), conditionLabel);
+ RunUtil.getDefault().sleep(10);
// Start counted duration.
- doAppBreadcrumbReportedStart(durationLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), durationLabel);
+ RunUtil.getDefault().sleep(10);
- Thread.sleep(2_000);
+ RunUtil.getDefault().sleep(2_000);
// Stop counted duration.
- doAppBreadcrumbReportedStop(durationLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.STOP.ordinal(), durationLabel);
+ RunUtil.getDefault().sleep(10);
// Set the condition to false.
- doAppBreadcrumbReportedStop(conditionLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.STOP.ordinal(), conditionLabel);
+ RunUtil.getDefault().sleep(10);
// Start uncounted duration.
- doAppBreadcrumbReportedStart(durationLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), durationLabel);
+ RunUtil.getDefault().sleep(10);
- Thread.sleep(2_000);
+ RunUtil.getDefault().sleep(2_000);
// Stop uncounted duration.
- doAppBreadcrumbReportedStop(durationLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.STOP.ordinal(), durationLabel);
+ RunUtil.getDefault().sleep(10);
- Thread.sleep(2_000);
- StatsLogReport metricReport = getStatsLogReport();
+ RunUtil.getDefault().sleep(2_000);
+ StatsLogReport metricReport = ReportUtils.getStatsLogReport(getDevice(),
+ ExtensionRegistry.getEmptyRegistry());
assertThat(metricReport.getMetricId()).isEqualTo(MetricsUtils.DURATION_METRIC_ID);
LogUtil.CLog.d("Received the following data: " + metricReport.toString());
assertThat(metricReport.hasDurationMetrics()).isTrue();
@@ -204,9 +234,9 @@ public class DurationMetricsTests extends DeviceAtomTestCase {
assertThat(durationData.getDataCount()).isEqualTo(1);
long totalDuration = durationData.getData(0).getBucketInfoList().stream()
.mapToLong(bucketInfo -> bucketInfo.getDurationNanos())
- .peek(durationNs -> assertThat(durationNs).isIn(Range.openClosed(0L, (long)1e9)))
+ .peek(durationNs -> assertThat(durationNs).isIn(Range.openClosed(0L, (long) 1e9)))
.sum();
- assertThat(totalDuration).isIn(Range.open((long)2e9, (long)3e9));
+ assertThat(totalDuration).isIn(Range.open((long) 2e9, (long) 3e9));
}
public void testDurationMetricWithActivation() throws Exception {
@@ -222,9 +252,10 @@ public class DurationMetricsTests extends DeviceAtomTestCase {
APP_BREADCRUMB_REPORTED_A_MATCH_STOP_ID, durationLabel);
StatsdConfigProto.AtomMatcher activationMatcher =
MetricsUtils.appBreadcrumbMatcherWithLabel(activationMatcherId,
- activationMatcherLabel);
+ activationMatcherLabel);
- StatsdConfigProto.StatsdConfig.Builder builder = createConfigBuilder()
+ StatsdConfigProto.StatsdConfig.Builder builder = ConfigUtils.createConfigBuilder(
+ MetricsUtils.DEVICE_SIDE_TEST_PACKAGE)
.addAtomMatcher(startAtomMatcher)
.addAtomMatcher(stopAtomMatcher)
.addAtomMatcher(activationMatcher);
@@ -235,9 +266,9 @@ public class DurationMetricsTests extends DeviceAtomTestCase {
.setStop(APP_BREADCRUMB_REPORTED_A_MATCH_STOP_ID)
.build();
Predicate predicate = Predicate.newBuilder()
- .setId(MetricsUtils.StringToId("Predicate"))
- .setSimplePredicate(simplePredicate)
- .build();
+ .setId(MetricsUtils.StringToId("Predicate"))
+ .setSimplePredicate(simplePredicate)
+ .build();
builder.addPredicate(predicate);
// Add DurationMetric.
@@ -257,34 +288,40 @@ public class DurationMetricsTests extends DeviceAtomTestCase {
.setTtlSeconds(ttlSec)));
// Upload config.
- uploadConfig(builder);
+ ConfigUtils.uploadConfig(getDevice(), builder);
// Start uncounted duration.
- doAppBreadcrumbReportedStart(durationLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), durationLabel);
+ RunUtil.getDefault().sleep(10);
- Thread.sleep(2_000);
+ RunUtil.getDefault().sleep(2_000);
// Stop uncounted duration.
- doAppBreadcrumbReportedStop(durationLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.STOP.ordinal(), durationLabel);
+ RunUtil.getDefault().sleep(10);
// Activate the metric.
- doAppBreadcrumbReported(activationMatcherLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), activationMatcherLabel);
+ RunUtil.getDefault().sleep(10);
// Start counted duration.
- doAppBreadcrumbReportedStart(durationLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), durationLabel);
+ RunUtil.getDefault().sleep(10);
- Thread.sleep(2_000);
+ RunUtil.getDefault().sleep(2_000);
// Stop counted duration.
- doAppBreadcrumbReportedStop(durationLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.STOP.ordinal(), durationLabel);
+ RunUtil.getDefault().sleep(10);
- Thread.sleep(2_000);
- StatsLogReport metricReport = getStatsLogReport();
+ RunUtil.getDefault().sleep(2_000);
+ StatsLogReport metricReport = ReportUtils.getStatsLogReport(getDevice(),
+ ExtensionRegistry.getEmptyRegistry());
assertThat(metricReport.getMetricId()).isEqualTo(MetricsUtils.DURATION_METRIC_ID);
LogUtil.CLog.d("Received the following data: " + metricReport.toString());
assertThat(metricReport.hasDurationMetrics()).isTrue();
@@ -293,9 +330,9 @@ public class DurationMetricsTests extends DeviceAtomTestCase {
assertThat(durationData.getDataCount()).isEqualTo(1);
long totalDuration = durationData.getData(0).getBucketInfoList().stream()
.mapToLong(bucketInfo -> bucketInfo.getDurationNanos())
- .peek(durationNs -> assertThat(durationNs).isIn(Range.openClosed(0L, (long)1e9)))
+ .peek(durationNs -> assertThat(durationNs).isIn(Range.openClosed(0L, (long) 1e9)))
.sum();
- assertThat(totalDuration).isIn(Range.open((long)2e9, (long)3e9));
+ assertThat(totalDuration).isIn(Range.open((long) 2e9, (long) 3e9));
}
public void testDurationMetricWithConditionAndActivation() throws Exception {
@@ -316,9 +353,10 @@ public class DurationMetricsTests extends DeviceAtomTestCase {
APP_BREADCRUMB_REPORTED_B_MATCH_STOP_ID, conditionLabel);
StatsdConfigProto.AtomMatcher activationMatcher =
MetricsUtils.appBreadcrumbMatcherWithLabel(activationMatcherId,
- activationMatcherLabel);
+ activationMatcherLabel);
- StatsdConfigProto.StatsdConfig.Builder builder = createConfigBuilder()
+ StatsdConfigProto.StatsdConfig.Builder builder = ConfigUtils.createConfigBuilder(
+ MetricsUtils.DEVICE_SIDE_TEST_PACKAGE)
.addAtomMatcher(startAtomMatcher)
.addAtomMatcher(stopAtomMatcher)
.addAtomMatcher(conditionStartAtomMatcher)
@@ -331,9 +369,9 @@ public class DurationMetricsTests extends DeviceAtomTestCase {
.setStop(APP_BREADCRUMB_REPORTED_A_MATCH_STOP_ID)
.build();
Predicate predicate = Predicate.newBuilder()
- .setId(MetricsUtils.StringToId("Predicate"))
- .setSimplePredicate(simplePredicate)
- .build();
+ .setId(MetricsUtils.StringToId("Predicate"))
+ .setSimplePredicate(simplePredicate)
+ .build();
builder.addPredicate(predicate);
SimplePredicate conditionSimplePredicate = SimplePredicate.newBuilder()
@@ -341,9 +379,9 @@ public class DurationMetricsTests extends DeviceAtomTestCase {
.setStop(APP_BREADCRUMB_REPORTED_B_MATCH_STOP_ID)
.build();
Predicate conditionPredicate = Predicate.newBuilder()
- .setId(MetricsUtils.StringToId("ConditionPredicate"))
- .setSimplePredicate(conditionSimplePredicate)
- .build();
+ .setId(MetricsUtils.StringToId("ConditionPredicate"))
+ .setSimplePredicate(conditionSimplePredicate)
+ .build();
builder.addPredicate(conditionPredicate);
// Add DurationMetric.
@@ -364,100 +402,118 @@ public class DurationMetricsTests extends DeviceAtomTestCase {
.setTtlSeconds(ttlSec)));
// Upload config.
- uploadConfig(builder);
+ ConfigUtils.uploadConfig(getDevice(), builder);
// Activate the metric.
- doAppBreadcrumbReported(activationMatcherLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), activationMatcherLabel);
+ RunUtil.getDefault().sleep(10);
// Set the condition to true.
- doAppBreadcrumbReportedStart(conditionLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), conditionLabel);
+ RunUtil.getDefault().sleep(10);
// Start counted duration.
- doAppBreadcrumbReportedStart(durationLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), durationLabel);
+ RunUtil.getDefault().sleep(10);
- Thread.sleep(2_000);
+ RunUtil.getDefault().sleep(2_000);
// Stop counted duration.
- doAppBreadcrumbReportedStop(durationLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.STOP.ordinal(), durationLabel);
+ RunUtil.getDefault().sleep(10);
// Set the condition to false.
- doAppBreadcrumbReportedStop(conditionLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.STOP.ordinal(), conditionLabel);
+ RunUtil.getDefault().sleep(10);
// Start uncounted duration.
- doAppBreadcrumbReportedStart(durationLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), durationLabel);
+ RunUtil.getDefault().sleep(10);
- Thread.sleep(2_000);
+ RunUtil.getDefault().sleep(2_000);
// Stop uncounted duration.
- doAppBreadcrumbReportedStop(durationLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.STOP.ordinal(), durationLabel);
+ RunUtil.getDefault().sleep(10);
// Let the metric deactivate.
- Thread.sleep(ttlSec * 1000);
+ RunUtil.getDefault().sleep(ttlSec * 1000);
//doAppBreadcrumbReported(99); // TODO: maybe remove?
- //Thread.sleep(10);
+ //RunUtil.getDefault().sleep(10);
// Start uncounted duration.
- doAppBreadcrumbReportedStart(durationLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), durationLabel);
+ RunUtil.getDefault().sleep(10);
- Thread.sleep(2_000);
+ RunUtil.getDefault().sleep(2_000);
// Stop uncounted duration.
- doAppBreadcrumbReportedStop(durationLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.STOP.ordinal(), durationLabel);
+ RunUtil.getDefault().sleep(10);
// Set condition to true again.
- doAppBreadcrumbReportedStart(conditionLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), conditionLabel);
+ RunUtil.getDefault().sleep(10);
- // Start uncounted duration.
- doAppBreadcrumbReportedStart(durationLabel);
- Thread.sleep(10);
+ // Start uncounted duration
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), durationLabel);
+ RunUtil.getDefault().sleep(10);
- Thread.sleep(2_000);
+ RunUtil.getDefault().sleep(2_000);
// Stop uncounted duration.
- doAppBreadcrumbReportedStop(durationLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.STOP.ordinal(), durationLabel);
+ RunUtil.getDefault().sleep(10);
// Activate the metric.
- doAppBreadcrumbReported(activationMatcherLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), activationMatcherLabel);
+ RunUtil.getDefault().sleep(10);
// Start counted duration.
- doAppBreadcrumbReportedStart(durationLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), durationLabel);
+ RunUtil.getDefault().sleep(10);
- Thread.sleep(2_000);
+ RunUtil.getDefault().sleep(2_000);
// Stop counted duration.
- doAppBreadcrumbReportedStop(durationLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.STOP.ordinal(), durationLabel);
+ RunUtil.getDefault().sleep(10);
// Let the metric deactivate.
- Thread.sleep(ttlSec * 1000);
+ RunUtil.getDefault().sleep(ttlSec * 1000);
// Start uncounted duration.
- doAppBreadcrumbReportedStart(durationLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), durationLabel);
+ RunUtil.getDefault().sleep(10);
- Thread.sleep(2_000);
+ RunUtil.getDefault().sleep(2_000);
// Stop uncounted duration.
- doAppBreadcrumbReportedStop(durationLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.STOP.ordinal(), durationLabel);
+ RunUtil.getDefault().sleep(10);
// Wait for the metrics to propagate to statsd.
- Thread.sleep(2000);
+ RunUtil.getDefault().sleep(2000);
- StatsLogReport metricReport = getStatsLogReport();
+ StatsLogReport metricReport = ReportUtils.getStatsLogReport(getDevice(),
+ ExtensionRegistry.getEmptyRegistry());
LogUtil.CLog.d("Received the following data: " + metricReport.toString());
assertThat(metricReport.getMetricId()).isEqualTo(MetricsUtils.DURATION_METRIC_ID);
assertThat(metricReport.hasDurationMetrics()).isTrue();
@@ -466,23 +522,24 @@ public class DurationMetricsTests extends DeviceAtomTestCase {
assertThat(durationData.getDataCount()).isEqualTo(1);
long totalDuration = durationData.getData(0).getBucketInfoList().stream()
.mapToLong(bucketInfo -> bucketInfo.getDurationNanos())
- .peek(durationNs -> assertThat(durationNs).isIn(Range.openClosed(0L, (long)1e9)))
+ .peek(durationNs -> assertThat(durationNs).isIn(Range.openClosed(0L, (long) 1e9)))
.sum();
- assertThat(totalDuration).isIn(Range.open((long)4e9, (long)5e9));
+ assertThat(totalDuration).isIn(Range.open((long) 4e9, (long) 5e9));
}
public void testDurationMetricWithDimension() throws Exception {
// Add AtomMatchers.
AtomMatcher startAtomMatcherA =
- MetricsUtils.startAtomMatcher(APP_BREADCRUMB_REPORTED_A_MATCH_START_ID);
+ MetricsUtils.startAtomMatcher(APP_BREADCRUMB_REPORTED_A_MATCH_START_ID);
AtomMatcher stopAtomMatcherA =
- MetricsUtils.stopAtomMatcher(APP_BREADCRUMB_REPORTED_A_MATCH_STOP_ID);
+ MetricsUtils.stopAtomMatcher(APP_BREADCRUMB_REPORTED_A_MATCH_STOP_ID);
AtomMatcher startAtomMatcherB =
- MetricsUtils.startAtomMatcher(APP_BREADCRUMB_REPORTED_B_MATCH_START_ID);
+ MetricsUtils.startAtomMatcher(APP_BREADCRUMB_REPORTED_B_MATCH_START_ID);
AtomMatcher stopAtomMatcherB =
- MetricsUtils.stopAtomMatcher(APP_BREADCRUMB_REPORTED_B_MATCH_STOP_ID);
+ MetricsUtils.stopAtomMatcher(APP_BREADCRUMB_REPORTED_B_MATCH_STOP_ID);
- StatsdConfigProto.StatsdConfig.Builder builder = createConfigBuilder();
+ StatsdConfigProto.StatsdConfig.Builder builder = ConfigUtils.createConfigBuilder(
+ MetricsUtils.DEVICE_SIDE_TEST_PACKAGE);
builder.addAtomMatcher(startAtomMatcherA);
builder.addAtomMatcher(stopAtomMatcherA);
builder.addAtomMatcher(startAtomMatcherB);
@@ -494,9 +551,9 @@ public class DurationMetricsTests extends DeviceAtomTestCase {
.setStop(APP_BREADCRUMB_REPORTED_A_MATCH_STOP_ID)
.build();
Predicate predicateA = Predicate.newBuilder()
- .setId(MetricsUtils.StringToId("Predicate_A"))
- .setSimplePredicate(simplePredicateA)
- .build();
+ .setId(MetricsUtils.StringToId("Predicate_A"))
+ .setSimplePredicate(simplePredicateA)
+ .build();
builder.addPredicate(predicateA);
FieldMatcher.Builder dimensionsBuilder = FieldMatcher.newBuilder()
@@ -505,46 +562,51 @@ public class DurationMetricsTests extends DeviceAtomTestCase {
.addChild(FieldMatcher.newBuilder().setField(
AppBreadcrumbReported.LABEL_FIELD_NUMBER));
Predicate predicateB =
- Predicate.newBuilder()
- .setId(MetricsUtils.StringToId("Predicate_B"))
- .setSimplePredicate(SimplePredicate.newBuilder()
- .setStart(APP_BREADCRUMB_REPORTED_B_MATCH_START_ID)
- .setStop(APP_BREADCRUMB_REPORTED_B_MATCH_STOP_ID)
- .setDimensions(dimensionsBuilder.build())
- .build())
- .build();
+ Predicate.newBuilder()
+ .setId(MetricsUtils.StringToId("Predicate_B"))
+ .setSimplePredicate(SimplePredicate.newBuilder()
+ .setStart(APP_BREADCRUMB_REPORTED_B_MATCH_START_ID)
+ .setStop(APP_BREADCRUMB_REPORTED_B_MATCH_STOP_ID)
+ .setDimensions(dimensionsBuilder.build())
+ .build())
+ .build();
builder.addPredicate(predicateB);
// Add DurationMetric.
builder.addDurationMetric(
- StatsdConfigProto.DurationMetric.newBuilder()
- .setId(MetricsUtils.DURATION_METRIC_ID)
- .setWhat(predicateB.getId())
- .setCondition(predicateA.getId())
- .setAggregationType(StatsdConfigProto.DurationMetric.AggregationType.SUM)
- .setBucket(StatsdConfigProto.TimeUnit.CTS)
- .setDimensionsInWhat(
- FieldMatcher.newBuilder()
- .setField(Atom.APP_BREADCRUMB_REPORTED_FIELD_NUMBER)
- .addChild(FieldMatcher.newBuilder().setField(
- AppBreadcrumbReported.LABEL_FIELD_NUMBER))));
+ StatsdConfigProto.DurationMetric.newBuilder()
+ .setId(MetricsUtils.DURATION_METRIC_ID)
+ .setWhat(predicateB.getId())
+ .setCondition(predicateA.getId())
+ .setAggregationType(StatsdConfigProto.DurationMetric.AggregationType.SUM)
+ .setBucket(StatsdConfigProto.TimeUnit.CTS)
+ .setDimensionsInWhat(
+ FieldMatcher.newBuilder()
+ .setField(Atom.APP_BREADCRUMB_REPORTED_FIELD_NUMBER)
+ .addChild(FieldMatcher.newBuilder().setField(
+ AppBreadcrumbReported.LABEL_FIELD_NUMBER))));
// Upload config.
- uploadConfig(builder);
+ ConfigUtils.uploadConfig(getDevice(), builder);
// Trigger events.
- doAppBreadcrumbReportedStart(1);
- Thread.sleep(2000);
- doAppBreadcrumbReportedStart(2);
- Thread.sleep(2000);
- doAppBreadcrumbReportedStop(1);
- Thread.sleep(2000);
- doAppBreadcrumbReportedStop(2);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), 1);
+ RunUtil.getDefault().sleep(2000);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), 2);
+ RunUtil.getDefault().sleep(2000);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.STOP.ordinal(), 1);
+ RunUtil.getDefault().sleep(2000);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.STOP.ordinal(), 2);
// Wait for the metrics to propagate to statsd.
- Thread.sleep(2000);
+ RunUtil.getDefault().sleep(2000);
- StatsLogReport metricReport = getStatsLogReport();
+ StatsLogReport metricReport = ReportUtils.getStatsLogReport(getDevice(),
+ ExtensionRegistry.getEmptyRegistry());
assertThat(metricReport.getMetricId()).isEqualTo(MetricsUtils.DURATION_METRIC_ID);
assertThat(metricReport.hasDurationMetrics()).isTrue();
StatsLogReport.DurationMetricDataWrapper durationData
diff --git a/tests/src/android/cts/statsd/metric/GaugeMetricsTests.java b/tests/src/android/cts/statsd/metric/GaugeMetricsTests.java
index db6a818d..ed27a5ca 100644
--- a/tests/src/android/cts/statsd/metric/GaugeMetricsTests.java
+++ b/tests/src/android/cts/statsd/metric/GaugeMetricsTests.java
@@ -17,7 +17,9 @@ package android.cts.statsd.metric;
import static com.google.common.truth.Truth.assertThat;
-import android.cts.statsd.atom.DeviceAtomTestCase;
+import android.cts.statsdatom.lib.AtomTestUtils;
+import android.cts.statsdatom.lib.ConfigUtils;
+import android.cts.statsdatom.lib.ReportUtils;
import com.android.internal.os.StatsdConfigProto;
import com.android.internal.os.StatsdConfigProto.ActivationType;
@@ -25,7 +27,6 @@ import com.android.internal.os.StatsdConfigProto.AtomMatcher;
import com.android.internal.os.StatsdConfigProto.EventActivation;
import com.android.internal.os.StatsdConfigProto.FieldFilter;
import com.android.internal.os.StatsdConfigProto.FieldMatcher;
-import com.android.internal.os.StatsdConfigProto.FieldValueMatcher;
import com.android.internal.os.StatsdConfigProto.GaugeMetric;
import com.android.internal.os.StatsdConfigProto.MetricActivation;
import com.android.internal.os.StatsdConfigProto.Predicate;
@@ -35,166 +36,210 @@ import com.android.internal.os.StatsdConfigProto.StatsdConfig;
import com.android.internal.os.StatsdConfigProto.TimeUnit;
import com.android.os.AtomsProto.AppBreadcrumbReported;
import com.android.os.AtomsProto.Atom;
+import com.android.os.StatsLog;
import com.android.os.StatsLog.GaugeBucketInfo;
import com.android.os.StatsLog.GaugeMetricData;
import com.android.os.StatsLog.StatsLogReport;
import com.android.tradefed.log.LogUtil;
+import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.util.Pair;
+import com.android.tradefed.util.RunUtil;
-public class GaugeMetricsTests extends DeviceAtomTestCase {
-
- private static final int APP_BREADCRUMB_REPORTED_A_MATCH_START_ID = 0;
- private static final int APP_BREADCRUMB_REPORTED_A_MATCH_STOP_ID = 1;
- private static final int APP_BREADCRUMB_REPORTED_B_MATCH_START_ID = 2;
-
- public void testGaugeMetric() throws Exception {
- // Add AtomMatcher's.
- AtomMatcher startAtomMatcher =
- MetricsUtils.startAtomMatcher(APP_BREADCRUMB_REPORTED_A_MATCH_START_ID);
- AtomMatcher stopAtomMatcher =
- MetricsUtils.stopAtomMatcher(APP_BREADCRUMB_REPORTED_A_MATCH_STOP_ID);
- AtomMatcher atomMatcher =
- MetricsUtils.simpleAtomMatcher(APP_BREADCRUMB_REPORTED_B_MATCH_START_ID);
-
- StatsdConfigProto.StatsdConfig.Builder builder = createConfigBuilder();
- builder.addAtomMatcher(startAtomMatcher);
- builder.addAtomMatcher(stopAtomMatcher);
- builder.addAtomMatcher(atomMatcher);
-
- // Add Predicate's.
- SimplePredicate simplePredicate = SimplePredicate.newBuilder()
- .setStart(APP_BREADCRUMB_REPORTED_A_MATCH_START_ID)
- .setStop(APP_BREADCRUMB_REPORTED_A_MATCH_STOP_ID)
- .build();
- Predicate predicate = Predicate.newBuilder()
- .setId(MetricsUtils.StringToId("Predicate"))
- .setSimplePredicate(simplePredicate)
- .build();
- builder.addPredicate(predicate);
-
- // Add GaugeMetric.
- FieldMatcher fieldMatcher =
- FieldMatcher.newBuilder().setField(APP_BREADCRUMB_REPORTED_B_MATCH_START_ID).build();
- builder.addGaugeMetric(
- StatsdConfigProto.GaugeMetric.newBuilder()
- .setId(MetricsUtils.GAUGE_METRIC_ID)
- .setWhat(APP_BREADCRUMB_REPORTED_B_MATCH_START_ID)
- .setCondition(predicate.getId())
- .setGaugeFieldsFilter(
- FieldFilter.newBuilder().setIncludeAll(false).setFields(fieldMatcher).build())
- .setDimensionsInWhat(
- FieldMatcher.newBuilder()
- .setField(APP_BREADCRUMB_REPORTED_B_MATCH_START_ID)
- .addChild(FieldMatcher.newBuilder()
- .setField(AppBreadcrumbReported.STATE_FIELD_NUMBER)
- .build())
- .build())
- .setBucket(StatsdConfigProto.TimeUnit.CTS)
- .build());
-
- // Upload config.
- uploadConfig(builder);
-
- // Create AppBreadcrumbReported Start/Stop events.
- doAppBreadcrumbReportedStart(0);
- Thread.sleep(10);
- doAppBreadcrumbReportedStart(1);
- Thread.sleep(10);
- doAppBreadcrumbReportedStart(2);
- Thread.sleep(2000);
- doAppBreadcrumbReportedStop(2);
- Thread.sleep(10);
- doAppBreadcrumbReportedStop(0);
- Thread.sleep(10);
- doAppBreadcrumbReportedStop(1);
- doAppBreadcrumbReportedStart(2);
- Thread.sleep(10);
- doAppBreadcrumbReportedStart(1);
- Thread.sleep(2000);
- doAppBreadcrumbReportedStop(2);
- Thread.sleep(10);
- doAppBreadcrumbReportedStop(1);
-
- // Wait for the metrics to propagate to statsd.
- Thread.sleep(2000);
-
- StatsLogReport metricReport = getStatsLogReport();
- LogUtil.CLog.d("Got the following gauge metric data: " + metricReport.toString());
- assertThat(metricReport.getMetricId()).isEqualTo(MetricsUtils.GAUGE_METRIC_ID);
- assertThat(metricReport.hasGaugeMetrics()).isTrue();
- StatsLogReport.GaugeMetricDataWrapper gaugeData = metricReport.getGaugeMetrics();
- gaugeData = backfillGaugeMetricData(gaugeData);
- assertThat(gaugeData.getDataCount()).isEqualTo(1);
-
- int bucketCount = gaugeData.getData(0).getBucketInfoCount();
- GaugeMetricData data = gaugeData.getData(0);
- assertThat(bucketCount).isGreaterThan(2);
- MetricsUtils.assertBucketTimePresent(data.getBucketInfo(0));
- assertThat(data.getBucketInfo(0).getAtomCount()).isEqualTo(1);
- assertThat(data.getBucketInfo(0).getAtom(0).getAppBreadcrumbReported().getLabel())
- .isEqualTo(0);
- assertThat(data.getBucketInfo(0).getAtom(0).getAppBreadcrumbReported().getState())
- .isEqualTo(AppBreadcrumbReported.State.START);
-
- MetricsUtils.assertBucketTimePresent(data.getBucketInfo(1));
- assertThat(data.getBucketInfo(1).getAtomCount()).isEqualTo(1);
-
- MetricsUtils.assertBucketTimePresent(data.getBucketInfo(bucketCount-1));
- assertThat(data.getBucketInfo(bucketCount-1).getAtomCount()).isEqualTo(1);
- assertThat(data.getBucketInfo(bucketCount-1).getAtom(0).getAppBreadcrumbReported().getLabel())
- .isEqualTo(2);
- assertThat(data.getBucketInfo(bucketCount-1).getAtom(0).getAppBreadcrumbReported().getState())
- .isEqualTo(AppBreadcrumbReported.State.STOP);
- }
-
- public void testPulledGaugeMetricWithActivation() throws Exception {
- // Add AtomMatcher's.
- int activationAtomMatcherId = 1;
- int activationAtomMatcherLabel = 1;
-
- int systemUptimeMatcherId = 2;
- AtomMatcher activationAtomMatcher =
- MetricsUtils.appBreadcrumbMatcherWithLabel(
- activationAtomMatcherId, activationAtomMatcherLabel);
- AtomMatcher systemUptimeMatcher =
- AtomMatcher.newBuilder()
- .setId(systemUptimeMatcherId)
- .setSimpleAtomMatcher(
- SimpleAtomMatcher.newBuilder().setAtomId(Atom.SYSTEM_UPTIME_FIELD_NUMBER))
- .build();
-
- StatsdConfigProto.StatsdConfig.Builder builder = createConfigBuilder();
- builder.addAtomMatcher(activationAtomMatcher);
- builder.addAtomMatcher(systemUptimeMatcher);
-
- // Add GaugeMetric.
- builder.addGaugeMetric(
- StatsdConfigProto.GaugeMetric.newBuilder()
- .setId(MetricsUtils.GAUGE_METRIC_ID)
- .setWhat(systemUptimeMatcherId)
- .setGaugeFieldsFilter(
- FieldFilter.newBuilder().setIncludeAll(true).build())
- .setBucket(StatsdConfigProto.TimeUnit.CTS)
- .build());
-
- // Add activation.
- builder.addMetricActivation(MetricActivation.newBuilder()
- .setMetricId(MetricsUtils.GAUGE_METRIC_ID)
- .setActivationType(ActivationType.ACTIVATE_IMMEDIATELY)
- .addEventActivation(EventActivation.newBuilder()
- .setAtomMatcherId(activationAtomMatcherId)
- .setTtlSeconds(5)));
-
- // Upload config.
- uploadConfig(builder);
-
- // Plenty of time to pull, but we should not keep the data since we are not active.
- Thread.sleep(20_000);
-
- StatsLogReport metricReport = getStatsLogReport();
- LogUtil.CLog.d("Got the following gauge metric data: " + metricReport.toString());
- assertThat(metricReport.getMetricId()).isEqualTo(MetricsUtils.GAUGE_METRIC_ID);
- assertThat(metricReport.hasGaugeMetrics()).isFalse();
- }
+import com.google.protobuf.ExtensionRegistry;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+
+public class GaugeMetricsTests extends DeviceTestCase {
+
+ private static final int APP_BREADCRUMB_REPORTED_A_MATCH_START_ID = 0;
+ private static final int APP_BREADCRUMB_REPORTED_A_MATCH_STOP_ID = 1;
+ private static final int APP_BREADCRUMB_REPORTED_B_MATCH_START_ID = 2;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ ConfigUtils.removeConfig(getDevice());
+ ReportUtils.clearReports(getDevice());
+ RunUtil.getDefault().sleep(1000);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.setUp();
+ ConfigUtils.removeConfig(getDevice());
+ ReportUtils.clearReports(getDevice());
+ }
+
+ public void testGaugeMetric() throws Exception {
+ // Add AtomMatcher's.
+ AtomMatcher startAtomMatcher =
+ MetricsUtils.startAtomMatcher(APP_BREADCRUMB_REPORTED_A_MATCH_START_ID);
+ AtomMatcher stopAtomMatcher =
+ MetricsUtils.stopAtomMatcher(APP_BREADCRUMB_REPORTED_A_MATCH_STOP_ID);
+ AtomMatcher atomMatcher =
+ MetricsUtils.simpleAtomMatcher(APP_BREADCRUMB_REPORTED_B_MATCH_START_ID);
+
+ StatsdConfigProto.StatsdConfig.Builder builder = ConfigUtils.createConfigBuilder(
+ MetricsUtils.DEVICE_SIDE_TEST_PACKAGE);
+ builder.addAtomMatcher(startAtomMatcher);
+ builder.addAtomMatcher(stopAtomMatcher);
+ builder.addAtomMatcher(atomMatcher);
+
+ // Add Predicate's.
+ SimplePredicate simplePredicate = SimplePredicate.newBuilder()
+ .setStart(APP_BREADCRUMB_REPORTED_A_MATCH_START_ID)
+ .setStop(APP_BREADCRUMB_REPORTED_A_MATCH_STOP_ID)
+ .build();
+ Predicate predicate = Predicate.newBuilder()
+ .setId(MetricsUtils.StringToId("Predicate"))
+ .setSimplePredicate(simplePredicate)
+ .build();
+ builder.addPredicate(predicate);
+
+ // Add GaugeMetric.
+ FieldMatcher fieldMatcher =
+ FieldMatcher.newBuilder().setField(
+ APP_BREADCRUMB_REPORTED_B_MATCH_START_ID).build();
+ builder.addGaugeMetric(
+ StatsdConfigProto.GaugeMetric.newBuilder()
+ .setId(MetricsUtils.GAUGE_METRIC_ID)
+ .setWhat(APP_BREADCRUMB_REPORTED_B_MATCH_START_ID)
+ .setCondition(predicate.getId())
+ .setGaugeFieldsFilter(
+ FieldFilter.newBuilder().setIncludeAll(false).setFields(
+ fieldMatcher).build())
+ .setDimensionsInWhat(
+ FieldMatcher.newBuilder()
+ .setField(APP_BREADCRUMB_REPORTED_B_MATCH_START_ID)
+ .addChild(FieldMatcher.newBuilder()
+ .setField(AppBreadcrumbReported.STATE_FIELD_NUMBER)
+ .build())
+ .build())
+ .setBucket(StatsdConfigProto.TimeUnit.CTS)
+ .build());
+
+ // Upload config.
+ ConfigUtils.uploadConfig(getDevice(), builder);
+
+ // Create AppBreadcrumbReported Start/Stop events.
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), 0);
+ RunUtil.getDefault().sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), 1);
+ RunUtil.getDefault().sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), 2);
+ RunUtil.getDefault().sleep(2000);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.STOP.ordinal(), 2);
+ RunUtil.getDefault().sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.STOP.ordinal(), 0);
+ RunUtil.getDefault().sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.STOP.ordinal(), 1);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), 2);
+ RunUtil.getDefault().sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), 1);
+ RunUtil.getDefault().sleep(2000);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.STOP.ordinal(), 2);
+ RunUtil.getDefault().sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.STOP.ordinal(), 1);
+
+ // Wait for the metrics to propagate to statsd.
+ RunUtil.getDefault().sleep(2000);
+
+ StatsLogReport metricReport = ReportUtils.getStatsLogReport(getDevice(),
+ ExtensionRegistry.getEmptyRegistry());
+ LogUtil.CLog.d("Got the following gauge metric data: " + metricReport.toString());
+ assertThat(metricReport.getMetricId()).isEqualTo(MetricsUtils.GAUGE_METRIC_ID);
+ assertThat(metricReport.hasGaugeMetrics()).isTrue();
+ StatsLogReport.GaugeMetricDataWrapper gaugeData = metricReport.getGaugeMetrics();
+ gaugeData = backfillGaugeMetricData(gaugeData);
+ assertThat(gaugeData.getDataCount()).isEqualTo(1);
+
+ int bucketCount = gaugeData.getData(0).getBucketInfoCount();
+ GaugeMetricData data = gaugeData.getData(0);
+ assertThat(bucketCount).isGreaterThan(2);
+ MetricsUtils.assertBucketTimePresent(data.getBucketInfo(0));
+ assertThat(data.getBucketInfo(0).getAtomCount()).isEqualTo(1);
+ assertThat(data.getBucketInfo(0).getAtom(0).getAppBreadcrumbReported().getLabel())
+ .isEqualTo(0);
+ assertThat(data.getBucketInfo(0).getAtom(0).getAppBreadcrumbReported().getState())
+ .isEqualTo(AppBreadcrumbReported.State.START);
+
+ MetricsUtils.assertBucketTimePresent(data.getBucketInfo(1));
+ assertThat(data.getBucketInfo(1).getAtomCount()).isEqualTo(1);
+
+ MetricsUtils.assertBucketTimePresent(data.getBucketInfo(bucketCount - 1));
+ assertThat(data.getBucketInfo(bucketCount - 1).getAtomCount()).isEqualTo(1);
+ assertThat(data.getBucketInfo(bucketCount - 1).getAtom(
+ 0).getAppBreadcrumbReported().getLabel())
+ .isEqualTo(2);
+ assertThat(data.getBucketInfo(bucketCount - 1).getAtom(
+ 0).getAppBreadcrumbReported().getState())
+ .isEqualTo(AppBreadcrumbReported.State.STOP);
+ }
+
+ public void testPulledGaugeMetricWithActivation() throws Exception {
+ // Add AtomMatcher's.
+ int activationAtomMatcherId = 1;
+ int activationAtomMatcherLabel = 1;
+
+ int systemUptimeMatcherId = 2;
+ AtomMatcher activationAtomMatcher =
+ MetricsUtils.appBreadcrumbMatcherWithLabel(
+ activationAtomMatcherId, activationAtomMatcherLabel);
+ AtomMatcher systemUptimeMatcher =
+ AtomMatcher.newBuilder()
+ .setId(systemUptimeMatcherId)
+ .setSimpleAtomMatcher(
+ SimpleAtomMatcher.newBuilder().setAtomId(
+ Atom.SYSTEM_UPTIME_FIELD_NUMBER))
+ .build();
+
+ StatsdConfigProto.StatsdConfig.Builder builder = ConfigUtils.createConfigBuilder(
+ MetricsUtils.DEVICE_SIDE_TEST_PACKAGE);
+ builder.addAtomMatcher(activationAtomMatcher);
+ builder.addAtomMatcher(systemUptimeMatcher);
+
+ // Add GaugeMetric.
+ builder.addGaugeMetric(
+ StatsdConfigProto.GaugeMetric.newBuilder()
+ .setId(MetricsUtils.GAUGE_METRIC_ID)
+ .setWhat(systemUptimeMatcherId)
+ .setGaugeFieldsFilter(
+ FieldFilter.newBuilder().setIncludeAll(true).build())
+ .setBucket(StatsdConfigProto.TimeUnit.CTS)
+ .build());
+
+ // Add activation.
+ builder.addMetricActivation(MetricActivation.newBuilder()
+ .setMetricId(MetricsUtils.GAUGE_METRIC_ID)
+ .setActivationType(ActivationType.ACTIVATE_IMMEDIATELY)
+ .addEventActivation(EventActivation.newBuilder()
+ .setAtomMatcherId(activationAtomMatcherId)
+ .setTtlSeconds(5)));
+
+ // Upload config.
+ ConfigUtils.uploadConfig(getDevice(), builder);
+
+ // Plenty of time to pull, but we should not keep the data since we are not active.
+ RunUtil.getDefault().sleep(20_000);
+
+ StatsLogReport metricReport = ReportUtils.getStatsLogReport(getDevice(),
+ ExtensionRegistry.getEmptyRegistry());
+ LogUtil.CLog.d("Got the following gauge metric data: " + metricReport.toString());
+ assertThat(metricReport.getMetricId()).isEqualTo(MetricsUtils.GAUGE_METRIC_ID);
+ assertThat(metricReport.hasGaugeMetrics()).isFalse();
+ }
public void testPulledGaugeMetricWithConditionAndActivation() throws Exception {
final int conditionLabel = 2;
@@ -214,7 +259,8 @@ public class GaugeMetricsTests extends DeviceAtomTestCase {
AtomMatcher whatMatcher =
MetricsUtils.unspecifiedAtomMatcher(whatMatcherId);
- StatsdConfig.Builder builder = createConfigBuilder()
+ StatsdConfig.Builder builder = ConfigUtils.createConfigBuilder(
+ MetricsUtils.DEVICE_SIDE_TEST_PACKAGE)
.addAtomMatcher(conditionStartAtomMatcher)
.addAtomMatcher(conditionStopAtomMatcher)
.addAtomMatcher(whatMatcher)
@@ -226,9 +272,9 @@ public class GaugeMetricsTests extends DeviceAtomTestCase {
.setStop(APP_BREADCRUMB_REPORTED_A_MATCH_STOP_ID)
.build();
Predicate predicate = Predicate.newBuilder()
- .setId(MetricsUtils.StringToId("Predicate"))
- .setSimplePredicate(simplePredicate)
- .build();
+ .setId(MetricsUtils.StringToId("Predicate"))
+ .setSimplePredicate(simplePredicate)
+ .build();
builder.addPredicate(predicate);
// Add GaugeMetric.
@@ -255,66 +301,79 @@ public class GaugeMetricsTests extends DeviceAtomTestCase {
)
);
- uploadConfig(builder);
+ ConfigUtils.uploadConfig(getDevice(), builder);
// Activate the metric.
- doAppBreadcrumbReportedStart(activationMatcherLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), activationMatcherLabel);
+ RunUtil.getDefault().sleep(10);
// Set the condition to true.
- doAppBreadcrumbReportedStart(conditionLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), conditionLabel);
+ RunUtil.getDefault().sleep(10);
// This value is collected.
- doAppBreadcrumbReported(10);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), 10);
+ RunUtil.getDefault().sleep(10);
// Ignored; value already collected.
- doAppBreadcrumbReported(20);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), 20);
+ RunUtil.getDefault().sleep(10);
// Set the condition to false.
- doAppBreadcrumbReportedStop(conditionLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.STOP.ordinal(), conditionLabel);
+ RunUtil.getDefault().sleep(10);
// Value not updated because condition is false.
- doAppBreadcrumbReported(30);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), 30);
+ RunUtil.getDefault().sleep(10);
// Let the metric deactivate.
- Thread.sleep(ttlSec * 1000);
+ RunUtil.getDefault().sleep(ttlSec * 1000);
// Value not collected.
- doAppBreadcrumbReported(40);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), 40);
+ RunUtil.getDefault().sleep(10);
// Condition to true again.
- doAppBreadcrumbReportedStart(conditionLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), conditionLabel);
+ RunUtil.getDefault().sleep(10);
// Value not collected.
- doAppBreadcrumbReported(50);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), 50);
+ RunUtil.getDefault().sleep(10);
// Activate the metric.
- doAppBreadcrumbReportedStart(activationMatcherLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), activationMatcherLabel);
+ RunUtil.getDefault().sleep(10);
// Value collected.
- doAppBreadcrumbReported(60);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), 60);
+ RunUtil.getDefault().sleep(10);
// Let the metric deactivate.
- Thread.sleep(ttlSec * 1000);
+ RunUtil.getDefault().sleep(ttlSec * 1000);
// Value not collected.
- doAppBreadcrumbReported(70);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), 70);
+ RunUtil.getDefault().sleep(10);
// Wait for the metrics to propagate to statsd.
- Thread.sleep(2000);
+ RunUtil.getDefault().sleep(2000);
- StatsLogReport metricReport = getStatsLogReport();
+ StatsLogReport metricReport = ReportUtils.getStatsLogReport(getDevice(),
+ ExtensionRegistry.getEmptyRegistry());
LogUtil.CLog.d("Received the following data: " + metricReport.toString());
assertThat(metricReport.getMetricId()).isEqualTo(MetricsUtils.GAUGE_METRIC_ID);
assertThat(metricReport.hasGaugeMetrics()).isTrue();
@@ -335,4 +394,42 @@ public class GaugeMetricsTests extends DeviceAtomTestCase {
assertThat(bucketInfo.getAtomCount()).isEqualTo(1);
assertThat(bucketInfo.getAtom(0).getAppBreadcrumbReported().getLabel()).isEqualTo(60);
}
+
+ private StatsLogReport.GaugeMetricDataWrapper backfillGaugeMetricData(
+ StatsLogReport.GaugeMetricDataWrapper dataWrapper) {
+ StatsLogReport.GaugeMetricDataWrapper.Builder dataWrapperBuilder = dataWrapper.toBuilder();
+ List<GaugeMetricData> backfilledMetricData = new ArrayList<>();
+ for (GaugeMetricData gaugeMetricData : dataWrapperBuilder.getDataList()) {
+ GaugeMetricData.Builder gaugeMetricDataBuilder = gaugeMetricData.toBuilder();
+ List<GaugeBucketInfo> backfilledBuckets = new ArrayList<>();
+ for (GaugeBucketInfo bucketInfo : gaugeMetricData.getBucketInfoList()) {
+ backfilledBuckets.add(backfillGaugeBucket(bucketInfo.toBuilder()));
+ }
+ gaugeMetricDataBuilder.clearBucketInfo();
+ gaugeMetricDataBuilder.addAllBucketInfo(backfilledBuckets);
+ backfilledMetricData.add(gaugeMetricDataBuilder.build());
+ }
+ dataWrapperBuilder.clearData();
+ dataWrapperBuilder.addAllData(backfilledMetricData);
+ return dataWrapperBuilder.build();
+ }
+
+ private GaugeBucketInfo backfillGaugeBucket(GaugeBucketInfo.Builder bucketInfoBuilder) {
+ if (bucketInfoBuilder.getAtomCount() != 0) {
+ return bucketInfoBuilder.build();
+ }
+ List<Pair<Atom, Long>> atomTimestampData = new ArrayList<>();
+ for (StatsLog.AggregatedAtomInfo atomInfo : bucketInfoBuilder.getAggregatedAtomInfoList()) {
+ for (long timestampNs : atomInfo.getElapsedTimestampNanosList()) {
+ atomTimestampData.add(Pair.create(atomInfo.getAtom(), timestampNs));
+ }
+ }
+ atomTimestampData.sort(Comparator.comparing(o -> o.second));
+ bucketInfoBuilder.clearAggregatedAtomInfo();
+ for (Pair<Atom, Long> atomTimestamp : atomTimestampData) {
+ bucketInfoBuilder.addAtom(atomTimestamp.first);
+ bucketInfoBuilder.addElapsedTimestampNanos(atomTimestamp.second);
+ }
+ return bucketInfoBuilder.build();
+ }
}
diff --git a/tests/src/android/cts/statsd/metric/MetricActivationTests.java b/tests/src/android/cts/statsd/metric/MetricActivationTests.java
index a95cb1bc..58276c4e 100644
--- a/tests/src/android/cts/statsd/metric/MetricActivationTests.java
+++ b/tests/src/android/cts/statsd/metric/MetricActivationTests.java
@@ -16,32 +16,39 @@
package android.cts.statsd.metric;
import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
-import android.cts.statsd.atom.DeviceAtomTestCase;
+import android.cts.statsdatom.lib.AtomTestUtils;
+import android.cts.statsdatom.lib.ConfigUtils;
+import android.cts.statsdatom.lib.DeviceUtils;
+import android.cts.statsdatom.lib.ReportUtils;
-import com.android.internal.os.StatsdConfigProto;
import com.android.internal.os.StatsdConfigProto.ActivationType;
import com.android.internal.os.StatsdConfigProto.AtomMatcher;
import com.android.internal.os.StatsdConfigProto.EventActivation;
import com.android.internal.os.StatsdConfigProto.EventMetric;
-import com.android.internal.os.StatsdConfigProto.GaugeMetric;
import com.android.internal.os.StatsdConfigProto.MetricActivation;
import com.android.internal.os.StatsdConfigProto.StatsdConfig;
import com.android.os.AtomsProto.AppBreadcrumbReported;
-import com.android.os.AtomsProto.Atom;
import com.android.os.StatsLog.ConfigMetricsReport;
import com.android.os.StatsLog.ConfigMetricsReportList;
import com.android.os.StatsLog.EventMetricData;
import com.android.os.StatsLog.StatsLogReport;
import com.android.tradefed.log.LogUtil;
+import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.util.RunUtil;
+
+import com.google.protobuf.ExtensionRegistry;
import java.util.ArrayList;
+import java.util.Comparator;
import java.util.List;
+import java.util.stream.Collectors;
/**
* Test Statsd Metric activations and deactivations
*/
-public class MetricActivationTests extends DeviceAtomTestCase {
+public class MetricActivationTests extends DeviceTestCase {
private final long metric1Id = 1L;
private final int metric1MatcherId = 1;
@@ -57,57 +64,63 @@ public class MetricActivationTests extends DeviceAtomTestCase {
private final int act2MatcherId = 20;
private final int act2CancelMatcherId = -20;
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ ConfigUtils.removeConfig(getDevice());
+ ReportUtils.clearReports(getDevice());
+ RunUtil.getDefault().sleep(1000);
+ }
- private StatsdConfig.Builder createConfig(final int act1TtlSecs, final int act2TtlSecs) {
- AtomMatcher metric1Matcher =
- MetricsUtils.simpleAtomMatcher(metric1MatcherId, metric1MatcherId);
- AtomMatcher metric2Matcher =
- MetricsUtils.simpleAtomMatcher(metric2MatcherId, metric2MatcherId);
- AtomMatcher metric3Matcher =
- MetricsUtils.simpleAtomMatcher(metric3MatcherId, metric3MatcherId);
- AtomMatcher act1Matcher =
- MetricsUtils.simpleAtomMatcher(act1MatcherId, act1MatcherId);
- AtomMatcher act1CancelMatcher =
- MetricsUtils.simpleAtomMatcher(act1CancelMatcherId, act1CancelMatcherId);
- AtomMatcher act2Matcher =
- MetricsUtils.simpleAtomMatcher(act2MatcherId, act2MatcherId);
- AtomMatcher act2CancelMatcher =
- MetricsUtils.simpleAtomMatcher(act2CancelMatcherId, act2CancelMatcherId);
-
- EventMetric metric1 = EventMetric.newBuilder()
- .setId(metric1Id)
- .setWhat(metric1MatcherId)
- .build();
-
- EventMetric metric2 = EventMetric.newBuilder()
- .setId(metric2Id)
- .setWhat(metric2MatcherId)
- .build();
+ @Override
+ protected void tearDown() throws Exception {
+ super.setUp();
+ ConfigUtils.removeConfig(getDevice());
+ ReportUtils.clearReports(getDevice());
+ }
- EventMetric metric3 = EventMetric.newBuilder()
- .setId(metric3Id)
- .setWhat(metric3MatcherId)
- .build();
+ private StatsdConfig.Builder createConfig(final int act1TtlSecs, final int act2TtlSecs) {
+ AtomMatcher metric1Matcher = MetricsUtils.simpleAtomMatcher(metric1MatcherId,
+ metric1MatcherId);
+ AtomMatcher metric2Matcher = MetricsUtils.simpleAtomMatcher(metric2MatcherId,
+ metric2MatcherId);
+ AtomMatcher metric3Matcher = MetricsUtils.simpleAtomMatcher(metric3MatcherId,
+ metric3MatcherId);
+ AtomMatcher act1Matcher = MetricsUtils.simpleAtomMatcher(act1MatcherId, act1MatcherId);
+ AtomMatcher act1CancelMatcher = MetricsUtils.simpleAtomMatcher(act1CancelMatcherId,
+ act1CancelMatcherId);
+ AtomMatcher act2Matcher = MetricsUtils.simpleAtomMatcher(act2MatcherId, act2MatcherId);
+ AtomMatcher act2CancelMatcher = MetricsUtils.simpleAtomMatcher(act2CancelMatcherId,
+ act2CancelMatcherId);
+
+ EventMetric metric1 =
+ EventMetric.newBuilder().setId(metric1Id).setWhat(metric1MatcherId).build();
+
+ EventMetric metric2 =
+ EventMetric.newBuilder().setId(metric2Id).setWhat(metric2MatcherId).build();
+
+ EventMetric metric3 =
+ EventMetric.newBuilder().setId(metric3Id).setWhat(metric3MatcherId).build();
EventActivation metric1Act1 =
MetricsUtils.createEventActivation(act1TtlSecs, act1MatcherId, act1CancelMatcherId)
- .setActivationType(ActivationType.ACTIVATE_IMMEDIATELY)
- .build();
+ .setActivationType(ActivationType.ACTIVATE_IMMEDIATELY)
+ .build();
EventActivation metric1Act2 =
MetricsUtils.createEventActivation(act2TtlSecs, act2MatcherId, act2CancelMatcherId)
- .setActivationType(ActivationType.ACTIVATE_ON_BOOT)
- .build();
+ .setActivationType(ActivationType.ACTIVATE_ON_BOOT)
+ .build();
EventActivation metric2Act1 =
MetricsUtils.createEventActivation(act1TtlSecs, act1MatcherId, act1CancelMatcherId)
- .setActivationType(ActivationType.ACTIVATE_ON_BOOT)
- .build();
+ .setActivationType(ActivationType.ACTIVATE_ON_BOOT)
+ .build();
EventActivation metric2Act2 =
MetricsUtils.createEventActivation(act2TtlSecs, act2MatcherId, act2CancelMatcherId)
- .setActivationType(ActivationType.ACTIVATE_IMMEDIATELY)
- .build();
+ .setActivationType(ActivationType.ACTIVATE_IMMEDIATELY)
+ .build();
MetricActivation metric1Activation = MetricActivation.newBuilder()
.setMetricId(metric1Id)
@@ -121,7 +134,8 @@ public class MetricActivationTests extends DeviceAtomTestCase {
.addEventActivation(metric2Act2)
.build();
- return createConfigBuilder()
+
+ return ConfigUtils.createConfigBuilder(MetricsUtils.DEVICE_SIDE_TEST_PACKAGE)
.addAtomMatcher(metric1Matcher)
.addAtomMatcher(metric2Matcher)
.addAtomMatcher(metric3Matcher)
@@ -138,96 +152,113 @@ public class MetricActivationTests extends DeviceAtomTestCase {
/**
* Metric 1:
- * Activation 1:
- * - Ttl: 5 seconds
- * - Type: IMMEDIATE
- * Activation 2:
- * - Ttl: 8 seconds
- * - Type: ON_BOOT
+ * Activation 1:
+ * - Ttl: 5 seconds
+ * - Type: IMMEDIATE
+ * Activation 2:
+ * - Ttl: 8 seconds
+ * - Type: ON_BOOT
*
* Metric 2:
- * Activation 1:
- * - Ttl: 5 seconds
- * - Type: ON_BOOT
- * Activation 2:
- * - Ttl: 8 seconds
- * - Type: IMMEDIATE
+ * Activation 1:
+ * - Ttl: 5 seconds
+ * - Type: ON_BOOT
+ * Activation 2:
+ * - Ttl: 8 seconds
+ * - Type: IMMEDIATE
*
* Metric 3: No activations; always active
**/
public void testCancellation() throws Exception {
final int act1TtlSecs = 5;
final int act2TtlSecs = 8;
- uploadConfig(createConfig(act1TtlSecs, act2TtlSecs));
+ ConfigUtils.uploadConfig(getDevice(), createConfig(act1TtlSecs, act2TtlSecs));
// Ignored, metric not active.
- doAppBreadcrumbReported(metric1MatcherId);
- Thread.sleep(10L);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), metric1MatcherId);
+ RunUtil.getDefault().sleep(10L);
// Trigger cancel for already inactive event activation 1.
- doAppBreadcrumbReported(act1CancelMatcherId);
- Thread.sleep(10L);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), act1CancelMatcherId);
+ RunUtil.getDefault().sleep(10L);
// Trigger event activation 1.
- doAppBreadcrumbReported(act1MatcherId);
- Thread.sleep(10L);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), act1MatcherId);
+ RunUtil.getDefault().sleep(10L);
// First logged event.
- doAppBreadcrumbReported(metric1MatcherId);
- Thread.sleep(10L);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), metric1MatcherId);
+ RunUtil.getDefault().sleep(10L);
// Second logged event.
- doAppBreadcrumbReported(metric1MatcherId);
- Thread.sleep(10L);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), metric1MatcherId);
+ RunUtil.getDefault().sleep(10L);
// Cancel event activation 1.
- doAppBreadcrumbReported(act1CancelMatcherId);
- Thread.sleep(10L);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), act1CancelMatcherId);
+ RunUtil.getDefault().sleep(10L);
// Ignored, metric not active.
- doAppBreadcrumbReported(metric1MatcherId);
- Thread.sleep(10L);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), metric1MatcherId);
+ RunUtil.getDefault().sleep(10L);
// Trigger event activation 1.
- doAppBreadcrumbReported(act1MatcherId);
- Thread.sleep(10L);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), act1MatcherId);
+ RunUtil.getDefault().sleep(10L);
// Trigger event activation 2.
- doAppBreadcrumbReported(act2MatcherId);
- Thread.sleep(10L);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), act2MatcherId);
+ RunUtil.getDefault().sleep(10L);
// Third logged event.
- doAppBreadcrumbReported(metric1MatcherId);
- Thread.sleep(10L);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), metric1MatcherId);
+ RunUtil.getDefault().sleep(10L);
// Cancel event activation 2.
- doAppBreadcrumbReported(act2CancelMatcherId);
- Thread.sleep(10L);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), act2CancelMatcherId);
+ RunUtil.getDefault().sleep(10L);
// Fourth logged event.
- doAppBreadcrumbReported(metric1MatcherId);
- Thread.sleep(10L);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), metric1MatcherId);
+ RunUtil.getDefault().sleep(10L);
// Expire event activation 1
- Thread.sleep(act1TtlSecs * 1000);
+ RunUtil.getDefault().sleep(act1TtlSecs * 1000);
// Ignored, metric 1 not active. Activation 1 expired and Activation 2 was cancelled.
- doAppBreadcrumbReported(metric1MatcherId);
- Thread.sleep(10L);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), metric1MatcherId);
+ RunUtil.getDefault().sleep(10L);
// Trigger event activation 2.
- doAppBreadcrumbReported(act2MatcherId);
- Thread.sleep(10L);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), act2MatcherId);
+ RunUtil.getDefault().sleep(10L);
// Metric 1 log ignored, Activation 1 expired and Activation 2 needs reboot to activate.
- doAppBreadcrumbReported(metric1MatcherId);
- Thread.sleep(10L);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), metric1MatcherId);
+ RunUtil.getDefault().sleep(10L);
// First logged event for Metric 3.
- doAppBreadcrumbReported(metric3MatcherId);
- Thread.sleep(10L);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), metric3MatcherId);
+ RunUtil.getDefault().sleep(10L);
- ConfigMetricsReportList reportList = getReportList();
+ ConfigMetricsReportList reportList = ReportUtils.getReportList(getDevice(),
+ ExtensionRegistry.getEmptyRegistry());
List<ConfigMetricsReport> reports = getSortedConfigMetricsReports(reportList);
ConfigMetricsReport report = reports.get(0);
verifyMetrics(report, 4, 0, 1);
@@ -235,27 +266,27 @@ public class MetricActivationTests extends DeviceAtomTestCase {
/**
* Metric 1:
- * Activation 1:
- * - Ttl: 100 seconds
- * - Type: IMMEDIATE
- * Activation 2:
- * - Ttl: 200 seconds
- * - Type: ON_BOOT
+ * Activation 1:
+ * - Ttl: 100 seconds
+ * - Type: IMMEDIATE
+ * Activation 2:
+ * - Ttl: 200 seconds
+ * - Type: ON_BOOT
*
* Metric 2:
- * Activation 1:
- * - Ttl: 100 seconds
- * - Type: ON_BOOT
- * Activation 2:
- * - Ttl: 200 seconds
- * - Type: IMMEDIATE
+ * Activation 1:
+ * - Ttl: 100 seconds
+ * - Type: ON_BOOT
+ * Activation 2:
+ * - Ttl: 200 seconds
+ * - Type: IMMEDIATE
*
* Metric 3: No activations; always active
**/
public void testRestart() throws Exception {
final int act1TtlSecs = 200;
final int act2TtlSecs = 400;
- uploadConfig(createConfig(act1TtlSecs, act2TtlSecs));
+ ConfigUtils.uploadConfig(getDevice(), createConfig(act1TtlSecs, act2TtlSecs));
// Trigger Metric 1 Activation 1 and Metric 2 Activation 1.
// Time remaining:
@@ -263,8 +294,9 @@ public class MetricActivationTests extends DeviceAtomTestCase {
// Metric 1 Activation 2: 0 seconds
// Metric 2 Activation 1: 0 seconds (will activate after boot)
// Metric 2 Activation 2: 0 seconds
- doAppBreadcrumbReported(act1MatcherId);
- Thread.sleep(10L);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), act1MatcherId);
+ RunUtil.getDefault().sleep(10L);
// First logged event for Metric 1.
// Metric 2 event ignored, will activate after boot.
@@ -276,7 +308,7 @@ public class MetricActivationTests extends DeviceAtomTestCase {
// Metric 1 Activation 2: 0 seconds
// Metric 2 Activation 1: 200 seconds
// Metric 2 Activation 2: 0 seconds
- rebootDeviceAndWaitUntilReady();
+ DeviceUtils.rebootDeviceAndWaitUntilReady(getDevice());
// Second logged event for Metric 1.
// First logged event for Metric 2.
@@ -288,7 +320,7 @@ public class MetricActivationTests extends DeviceAtomTestCase {
// Metric 1 Activation 2: 0 seconds
// Metric 2 Activation 1: 0 seconds
// Metric 2 Activation 2: 0 seconds
- Thread.sleep(act1TtlSecs * 1000L);
+ RunUtil.getDefault().sleep(act1TtlSecs * 1000L);
// Metric 1 event ignored, Activation 1 expired.
// Metric 2 event ignored, Activation 1 expired.
@@ -301,8 +333,9 @@ public class MetricActivationTests extends DeviceAtomTestCase {
// Metric 1 Activation 2: 0 seconds (will activate after boot)
// Metric 2 Activation 1: 0 seconds
// Metric 2 Activation 2: 400 seconds
- doAppBreadcrumbReported(act2MatcherId);
- Thread.sleep(10L);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), act2MatcherId);
+ RunUtil.getDefault().sleep(10L);
// Metric 1 event ignored, will activate after boot.
// Second logged event for Metric 2.
@@ -315,8 +348,9 @@ public class MetricActivationTests extends DeviceAtomTestCase {
// Metric 1 Activation 2: 0 seconds (will activate after boot)
// Metric 2 Activation 1: 0 seconds (will activate after boot)
// Metric 2 Activation 2: 400 seconds
- doAppBreadcrumbReported(act1MatcherId);
- Thread.sleep(10L);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), act1MatcherId);
+ RunUtil.getDefault().sleep(10L);
// Third logged event for Metric 1.
// Third logged event for Metric 2.
@@ -328,14 +362,14 @@ public class MetricActivationTests extends DeviceAtomTestCase {
// Metric 1 Activation 2: 0 seconds (will activate after boot)
// Metric 2 Activation 1: 0 seconds (will activate after boot)
// Metric 2 Activation 2: 300 seconds
- Thread.sleep(act1TtlSecs * 1000L / 2);
+ RunUtil.getDefault().sleep(act1TtlSecs * 1000L / 2);
// Time remaining:
// Metric 1 Activation 1: 100 seconds
// Metric 1 Activation 2: 400 seconds
// Metric 2 Activation 1: 200 seconds
// Metric 2 Activation 2: 300 seconds
- rebootDeviceAndWaitUntilReady();
+ DeviceUtils.rebootDeviceAndWaitUntilReady(getDevice());
// Fourth logged event for Metric 1.
// Fourth logged event for Metric 2.
@@ -348,7 +382,7 @@ public class MetricActivationTests extends DeviceAtomTestCase {
// Metric 1 Activation 2: 300 seconds
// Metric 2 Activation 1: 100 seconds
// Metric 2 Activation 2: 200 seconds
- Thread.sleep(act1TtlSecs * 1000L / 2);
+ RunUtil.getDefault().sleep(act1TtlSecs * 1000L / 2);
// Fifth logged event for Metric 1.
// Fifth logged event for Metric 2.
@@ -361,14 +395,15 @@ public class MetricActivationTests extends DeviceAtomTestCase {
// Metric 1 Activation 2: 0 seconds
// Metric 2 Activation 1: 0 seconds
// Metric 2 Activation 2: 0 seconds
- Thread.sleep(act2TtlSecs * 1000L);
+ RunUtil.getDefault().sleep(act2TtlSecs * 1000L);
// Metric 1 event ignored.
// Metric 2 event ignored.
// Eighth logged event for Metric 3.
logAllMetrics();
- ConfigMetricsReportList reportList = getReportList();
+ ConfigMetricsReportList reportList = ReportUtils.getReportList(getDevice(),
+ ExtensionRegistry.getEmptyRegistry());
List<ConfigMetricsReport> reports = getSortedConfigMetricsReports(reportList);
assertThat(reports).hasSize(3);
@@ -387,27 +422,27 @@ public class MetricActivationTests extends DeviceAtomTestCase {
/**
* Metric 1:
- * Activation 1:
- * - Ttl: 100 seconds
- * - Type: IMMEDIATE
- * Activation 2:
- * - Ttl: 200 seconds
- * - Type: ON_BOOT
+ * Activation 1:
+ * - Ttl: 100 seconds
+ * - Type: IMMEDIATE
+ * Activation 2:
+ * - Ttl: 200 seconds
+ * - Type: ON_BOOT
*
* Metric 2:
- * Activation 1:
- * - Ttl: 100 seconds
- * - Type: ON_BOOT
- * Activation 2:
- * - Ttl: 200 seconds
- * - Type: IMMEDIATE
+ * Activation 1:
+ * - Ttl: 100 seconds
+ * - Type: ON_BOOT
+ * Activation 2:
+ * - Ttl: 200 seconds
+ * - Type: IMMEDIATE
*
* Metric 3: No activations; always active
**/
public void testMultipleActivations() throws Exception {
final int act1TtlSecs = 200;
final int act2TtlSecs = 400;
- uploadConfig(createConfig(act1TtlSecs, act2TtlSecs));
+ ConfigUtils.uploadConfig(getDevice(), createConfig(act1TtlSecs, act2TtlSecs));
// Trigger Metric 1 Activation 1 and Metric 2 Activation 1.
// Time remaining:
@@ -415,8 +450,9 @@ public class MetricActivationTests extends DeviceAtomTestCase {
// Metric 1 Activation 2: 0 seconds
// Metric 2 Activation 1: 0 seconds (will activate after boot)
// Metric 2 Activation 2: 0 seconds
- doAppBreadcrumbReported(act1MatcherId);
- Thread.sleep(10L);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), act1MatcherId);
+ RunUtil.getDefault().sleep(10L);
// First logged event for Metric 1.
// Metric 2 event ignored, will activate after boot.
@@ -428,7 +464,7 @@ public class MetricActivationTests extends DeviceAtomTestCase {
// Metric 1 Activation 2: 0 seconds
// Metric 2 Activation 1: 0 seconds (will activate after boot)
// Metric 2 Activation 2: 0 seconds
- Thread.sleep(act1TtlSecs * 1000L / 2);
+ RunUtil.getDefault().sleep(act1TtlSecs * 1000L / 2);
// Second logged event for Metric 1.
// Metric 2 event ignored, will activate after boot.
@@ -441,8 +477,9 @@ public class MetricActivationTests extends DeviceAtomTestCase {
// Metric 1 Activation 2: 0 seconds
// Metric 2 Activation 1: 0 seconds (will activate after boot)
// Metric 2 Activation 2: 0 seconds
- doAppBreadcrumbReported(act1MatcherId);
- Thread.sleep(10L);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), act1MatcherId);
+ RunUtil.getDefault().sleep(10L);
// Third logged event for Metric 1.
// Metric 2 event ignored, will activate after boot.
@@ -454,7 +491,7 @@ public class MetricActivationTests extends DeviceAtomTestCase {
// Metric 1 Activation 2: 0 seconds
// Metric 2 Activation 1: 200 seconds
// Metric 2 Activation 2: 0 seconds
- rebootDeviceAndWaitUntilReady();
+ DeviceUtils.rebootDeviceAndWaitUntilReady(getDevice());
// Fourth logged event for Metric 1.
// First logged event for Metric 2.
@@ -467,8 +504,9 @@ public class MetricActivationTests extends DeviceAtomTestCase {
// Metric 1 Activation 2: 0 seconds
// Metric 2 Activation 1: 200 seconds
// Metric 2 Activation 2: 0 seconds
- doAppBreadcrumbReported(act1MatcherId);
- Thread.sleep(10L);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), act1MatcherId);
+ RunUtil.getDefault().sleep(10L);
// Fifth logged event for Metric 1.
// Second logged event for Metric 2.
@@ -481,7 +519,7 @@ public class MetricActivationTests extends DeviceAtomTestCase {
// Metric 1 Activation 2: 0 seconds
// Metric 2 Activation 1: 0 seconds
// Metric 2 Activation 2: 0 seconds
- Thread.sleep(act1TtlSecs * 1000L);
+ RunUtil.getDefault().sleep(act1TtlSecs * 1000L);
// Metric 1 event ignored.
// Metric 2 event ignored.
@@ -493,15 +531,16 @@ public class MetricActivationTests extends DeviceAtomTestCase {
// Metric 1 Activation 2: 0 seconds
// Metric 2 Activation 1: 0 seconds
// Metric 2 Activation 2: 0 seconds
- rebootDeviceAndWaitUntilReady();
- Thread.sleep(10_000L);
+ DeviceUtils.rebootDeviceAndWaitUntilReady(getDevice());
+ RunUtil.getDefault().sleep(10_000L);
// Metric 1 event ignored.
// Metric 2 event ignored.
// Seventh logged event for Metric 3.
logAllMetrics();
- ConfigMetricsReportList reportList = getReportList();
+ ConfigMetricsReportList reportList = ReportUtils.getReportList(getDevice(),
+ ExtensionRegistry.getEmptyRegistry());
List<ConfigMetricsReport> reports = getSortedConfigMetricsReports(reportList);
assertThat(reports).hasSize(3);
@@ -518,35 +557,45 @@ public class MetricActivationTests extends DeviceAtomTestCase {
verifyMetrics(report, 0, 0, 1);
}
+ /**
+ * Gets a List of sorted ConfigMetricsReports from ConfigMetricsReportList.
+ */
+ private List<ConfigMetricsReport> getSortedConfigMetricsReports(
+ ConfigMetricsReportList configMetricsReportList) {
+ return configMetricsReportList.getReportsList().stream().sorted(
+ Comparator.comparing(ConfigMetricsReport::getCurrentReportWallClockNanos)).collect(
+ Collectors.toList());
+ }
+
private void logAllMetrics() throws Exception {
- doAppBreadcrumbReported(metric1MatcherId);
- Thread.sleep(10L);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), metric1MatcherId);
+ RunUtil.getDefault().sleep(10L);
- doAppBreadcrumbReported(metric2MatcherId);
- Thread.sleep(10L);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), metric2MatcherId);
+ RunUtil.getDefault().sleep(10L);
- doAppBreadcrumbReported(metric3MatcherId);
- Thread.sleep(10L);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), metric3MatcherId);
+ RunUtil.getDefault().sleep(10L);
}
private void verifyMetrics(ConfigMetricsReport report, int metric1Count, int metric2Count,
int metric3Count) throws Exception {
assertThat(report.getMetricsCount()).isEqualTo(3);
- verifyMetric(
- report.getMetrics(0), // StatsLogReport
+ verifyMetric(report.getMetrics(0), // StatsLogReport
1, // Metric Id
1, // Metric what atom matcher label
metric1Count // Data count
);
- verifyMetric(
- report.getMetrics(1), // StatsLogReport
+ verifyMetric(report.getMetrics(1), // StatsLogReport
2, // Metric Id
2, // Metric what atom matcher label
metric2Count // Data count
);
- verifyMetric(
- report.getMetrics(2), // StatsLogReport
+ verifyMetric(report.getMetrics(2), // StatsLogReport
3, // Metric Id
3, // Metric what atom matcher label
metric3Count // Data count
@@ -562,7 +611,8 @@ public class MetricActivationTests extends DeviceAtomTestCase {
StatsLogReport.EventMetricDataWrapper eventData = metricReport.getEventMetrics();
List<EventMetricData> eventMetricDataList = new ArrayList<>();
for (EventMetricData eventMetricData : eventData.getDataList()) {
- eventMetricDataList.addAll(backfillAggregatedAtomsInEventMetric(eventMetricData));
+ eventMetricDataList.addAll(
+ ReportUtils.backfillAggregatedAtomsInEventMetric(eventMetricData));
}
assertThat(eventMetricDataList).hasSize(dataCount);
for (EventMetricData eventMetricData : eventMetricDataList) {
diff --git a/tests/src/android/cts/statsd/metric/MetricsUtils.java b/tests/src/android/cts/statsd/metric/MetricsUtils.java
index 8f559d26..3fdd6850 100644
--- a/tests/src/android/cts/statsd/metric/MetricsUtils.java
+++ b/tests/src/android/cts/statsd/metric/MetricsUtils.java
@@ -17,6 +17,8 @@ package android.cts.statsd.metric;
import static com.google.common.truth.Truth.assertWithMessage;
+import android.cts.statsd.atom.BufferDebug;
+
import com.android.internal.os.StatsdConfigProto;
import com.android.internal.os.StatsdConfigProto.AtomMatcher;
import com.android.internal.os.StatsdConfigProto.EventActivation;
@@ -24,11 +26,26 @@ import com.android.internal.os.StatsdConfigProto.FieldValueMatcher;
import com.android.internal.os.StatsdConfigProto.SimpleAtomMatcher;
import com.android.os.AtomsProto.Atom;
import com.android.os.AtomsProto.AppBreadcrumbReported;
+import com.android.tradefed.device.CollectingByteOutputReceiver;
+import com.android.tradefed.device.DeviceNotAvailableException;
+import com.android.tradefed.device.ITestDevice;
+import com.android.tradefed.log.LogUtil;
+import com.android.tradefed.util.RunUtil;
+
+import com.google.protobuf.InvalidProtocolBufferException;
import com.google.protobuf.Message;
import com.google.protobuf.Descriptors.Descriptor;
import com.google.protobuf.Descriptors.FieldDescriptor;
+import com.google.protobuf.MessageLite;
+import com.google.protobuf.Parser;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
public class MetricsUtils {
+ public static final String DEVICE_SIDE_TEST_PACKAGE =
+ "com.android.server.cts.device.statsd";
+ public static final String DEVICE_SIDE_TEST_APK = "CtsStatsdApp.apk";
public static final long COUNT_METRIC_ID = 3333;
public static final long DURATION_METRIC_ID = 4444;
public static final long GAUGE_METRIC_ID = 5555;
@@ -145,6 +162,13 @@ public class MetricsUtils {
return str.hashCode();
}
+ public static String getCurrentLogcatDate(ITestDevice device) throws Exception {
+ // TODO: Do something more robust than this for getting logcat markers.
+ long timestampMs = device.getDeviceDate();
+ return new SimpleDateFormat("MM-dd HH:mm:ss.SSS")
+ .format(new Date(timestampMs));
+ }
+
public static void assertBucketTimePresent(Message bucketInfo) {
Descriptor descriptor = bucketInfo.getDescriptorForType();
boolean found = false;
@@ -161,4 +185,53 @@ public class MetricsUtils {
"Bucket info did not have either bucket num or start and end elapsed millis"
).that(found).isTrue();
}
+
+ public static boolean didIncidentdFireSince(ITestDevice device, String date) throws Exception {
+ final String INCIDENTD_TAG = "incidentd";
+ final String INCIDENTD_STARTED_STRING = "reportIncident";
+ // TODO: Do something more robust than this in case of delayed logging.
+ RunUtil.getDefault().sleep(1000);
+ String log = getLogcatSince(device, date, String.format(
+ "-s %s -e %s", INCIDENTD_TAG, INCIDENTD_STARTED_STRING));
+ return log.contains(INCIDENTD_STARTED_STRING);
+ }
+
+ public static String getLogcatSince(ITestDevice device, String date, String logcatParams)
+ throws Exception {
+ return device.executeShellCommand(String.format(
+ "logcat -v threadtime -t '%s' -d %s", date, logcatParams));
+ }
+
+ /**
+ * Call onto the device with an adb shell command and get the results of
+ * that as a proto of the given type.
+ *
+ * @param parser A protobuf parser object. e.g. MyProto.parser()
+ * @param command The adb shell command to run. e.g. "dumpsys fingerprint --proto"
+ * @throws DeviceNotAvailableException If there was a problem communicating with
+ * the test device.
+ * @throws InvalidProtocolBufferException If there was an error parsing
+ * the proto. Note that a 0 length buffer is not
+ * necessarily an error.
+ */
+ public static <T extends MessageLite> T getDump(ITestDevice device, Parser<T> parser,
+ String command)
+ throws DeviceNotAvailableException, InvalidProtocolBufferException {
+ final CollectingByteOutputReceiver receiver = new CollectingByteOutputReceiver();
+ device.executeShellCommand(command, receiver);
+ if (false) {
+ LogUtil.CLog.d("Command output while parsing " + parser.getClass().getCanonicalName()
+ + " for command: " + command + "\n"
+ + BufferDebug.debugString(receiver.getOutput(), -1));
+ }
+ try {
+ return parser.parseFrom(receiver.getOutput());
+ } catch (Exception ex) {
+ LogUtil.CLog.d(
+ "Error parsing " + parser.getClass().getCanonicalName() + " for command: "
+ + command
+ + BufferDebug.debugString(receiver.getOutput(), 16384));
+ throw ex;
+ }
+ }
}
diff --git a/tests/src/android/cts/statsd/metric/ValueMetricsTests.java b/tests/src/android/cts/statsd/metric/ValueMetricsTests.java
index 3b4ef56f..db1a99e5 100644
--- a/tests/src/android/cts/statsd/metric/ValueMetricsTests.java
+++ b/tests/src/android/cts/statsd/metric/ValueMetricsTests.java
@@ -17,14 +17,14 @@ package android.cts.statsd.metric;
import static com.google.common.truth.Truth.assertThat;
-import android.cts.statsd.atom.DeviceAtomTestCase;
+import android.cts.statsdatom.lib.AtomTestUtils;
+import android.cts.statsdatom.lib.ConfigUtils;
+import android.cts.statsdatom.lib.ReportUtils;
import com.android.internal.os.StatsdConfigProto.ActivationType;
import com.android.internal.os.StatsdConfigProto.AtomMatcher;
import com.android.internal.os.StatsdConfigProto.EventActivation;
-import com.android.internal.os.StatsdConfigProto.FieldFilter;
import com.android.internal.os.StatsdConfigProto.FieldMatcher;
-import com.android.internal.os.StatsdConfigProto.FieldValueMatcher;
import com.android.internal.os.StatsdConfigProto.MetricActivation;
import com.android.internal.os.StatsdConfigProto.Predicate;
import com.android.internal.os.StatsdConfigProto.SimpleAtomMatcher;
@@ -41,286 +41,324 @@ import com.android.os.StatsLog.ValueBucketInfo;
import com.android.os.StatsLog.ValueMetricData;
import com.android.tradefed.log.LogUtil;
+import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.util.RunUtil;
+
+import com.google.protobuf.ExtensionRegistry;
+
+public class ValueMetricsTests extends DeviceTestCase {
+ private static final int APP_BREADCRUMB_REPORTED_A_MATCH_START_ID = 0;
+ private static final int APP_BREADCRUMB_REPORTED_A_MATCH_STOP_ID = 1;
+ private static final int APP_BREADCRUMB_REPORTED_B_MATCH_START_ID = 2;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ ConfigUtils.removeConfig(getDevice());
+ ReportUtils.clearReports(getDevice());
+ RunUtil.getDefault().sleep(1000);
+ }
-public class ValueMetricsTests extends DeviceAtomTestCase {
- private static final int APP_BREADCRUMB_REPORTED_A_MATCH_START_ID = 0;
- private static final int APP_BREADCRUMB_REPORTED_A_MATCH_STOP_ID = 1;
- private static final int APP_BREADCRUMB_REPORTED_B_MATCH_START_ID = 2;
-
- public void testValueMetric() throws Exception {
- // Add AtomMatcher's.
- AtomMatcher startAtomMatcher =
- MetricsUtils.startAtomMatcher(APP_BREADCRUMB_REPORTED_A_MATCH_START_ID);
- AtomMatcher stopAtomMatcher =
- MetricsUtils.stopAtomMatcher(APP_BREADCRUMB_REPORTED_A_MATCH_STOP_ID);
- AtomMatcher atomMatcher =
- MetricsUtils.simpleAtomMatcher(APP_BREADCRUMB_REPORTED_B_MATCH_START_ID);
-
- StatsdConfig.Builder builder = createConfigBuilder();
- builder.addAtomMatcher(startAtomMatcher);
- builder.addAtomMatcher(stopAtomMatcher);
- builder.addAtomMatcher(atomMatcher);
-
- // Add ValueMetric.
- builder.addValueMetric(
- ValueMetric.newBuilder()
- .setId(MetricsUtils.VALUE_METRIC_ID)
- .setWhat(APP_BREADCRUMB_REPORTED_B_MATCH_START_ID)
- .setBucket(TimeUnit.CTS)
- .setValueField(FieldMatcher.newBuilder()
- .setField(Atom.APP_BREADCRUMB_REPORTED_FIELD_NUMBER)
- .addChild(FieldMatcher.newBuilder().setField(
- AppBreadcrumbReported.LABEL_FIELD_NUMBER)))
- .setDimensionsInWhat(FieldMatcher.newBuilder()
- .setField(APP_BREADCRUMB_REPORTED_B_MATCH_START_ID)
- .build())
- .build());
-
- // Upload config.
- uploadConfig(builder);
-
- // Create AppBreadcrumbReported Start/Stop events.
- doAppBreadcrumbReportedStart(1);
- Thread.sleep(1000);
- doAppBreadcrumbReportedStop(1);
- doAppBreadcrumbReportedStart(3);
- doAppBreadcrumbReportedStop(3);
-
- // Wait for the metrics to propagate to statsd.
- Thread.sleep(1000);
-
- StatsLogReport metricReport = getStatsLogReport();
- LogUtil.CLog.d("Got the following value metric data: " + metricReport.toString());
- assertThat(metricReport.getMetricId()).isEqualTo(MetricsUtils.VALUE_METRIC_ID);
- assertThat(metricReport.hasValueMetrics()).isTrue();
- StatsLogReport.ValueMetricDataWrapper valueData = metricReport.getValueMetrics();
- assertThat(valueData.getDataCount()).isEqualTo(1);
-
- int bucketCount = valueData.getData(0).getBucketInfoCount();
- assertThat(bucketCount).isGreaterThan(1);
- ValueMetricData data = valueData.getData(0);
- int totalValue = 0;
- for (ValueBucketInfo bucketInfo : data.getBucketInfoList()) {
- MetricsUtils.assertBucketTimePresent(bucketInfo);
- assertThat(bucketInfo.getValuesCount()).isEqualTo(1);
- assertThat(bucketInfo.getValues(0).getIndex()).isEqualTo(0);
- totalValue += (int) bucketInfo.getValues(0).getValueLong();
+ @Override
+ protected void tearDown() throws Exception {
+ super.setUp();
+ ConfigUtils.removeConfig(getDevice());
+ ReportUtils.clearReports(getDevice());
}
- assertThat(totalValue).isEqualTo(8);
- }
-
- // Test value metric with pulled atoms and across multiple buckets
- public void testPullerAcrossBuckets() throws Exception {
- // Add AtomMatcher's.
- final String predicateTrueName = "APP_BREADCRUMB_REPORTED_START";
- final String predicateFalseName = "APP_BREADCRUMB_REPORTED_STOP";
- final String predicateName = "APP_BREADCRUMB_REPORTED_IS_STOP";
-
- AtomMatcher startAtomMatcher =
- MetricsUtils.startAtomMatcher(predicateTrueName.hashCode());
- AtomMatcher stopAtomMatcher =
- MetricsUtils.stopAtomMatcher(predicateFalseName.hashCode());
-
- StatsdConfig.Builder builder = createConfigBuilder();
- builder.addAtomMatcher(startAtomMatcher);
- builder.addAtomMatcher(stopAtomMatcher);
- builder.addPredicate(Predicate.newBuilder()
- .setId(predicateName.hashCode())
- .setSimplePredicate(SimplePredicate.newBuilder()
- .setStart(predicateTrueName.hashCode())
- .setStop(predicateFalseName.hashCode())
- .setCountNesting(false)
- )
- );
-
- final String atomName = "SYSTEM_ELAPSED_REALTIME";
- SimpleAtomMatcher.Builder sam = SimpleAtomMatcher.newBuilder().setAtomId(Atom.SYSTEM_ELAPSED_REALTIME_FIELD_NUMBER);
- builder.addAtomMatcher(AtomMatcher.newBuilder()
- .setId(atomName.hashCode())
- .setSimpleAtomMatcher(sam));
-
- // Add ValueMetric.
- builder.addValueMetric(
- ValueMetric.newBuilder()
- .setId(MetricsUtils.VALUE_METRIC_ID)
- .setWhat(atomName.hashCode())
- .setBucket(TimeUnit.ONE_MINUTE)
- .setValueField(FieldMatcher.newBuilder()
- .setField(Atom.SYSTEM_ELAPSED_REALTIME_FIELD_NUMBER)
- .addChild(FieldMatcher.newBuilder().setField(
- SystemElapsedRealtime.TIME_MILLIS_FIELD_NUMBER)))
- .setCondition(predicateName.hashCode())
- .build());
-
- // Upload config.
- uploadConfig(builder);
-
- // Create AppBreadcrumbReported Start/Stop events.
- doAppBreadcrumbReportedStart(1);
- // Wait for 2 min and 1 sec to capture at least 2 buckets
- Thread.sleep(2*60_000 + 10_000);
- doAppBreadcrumbReportedStop(1);
-
- // Wait for the metrics to propagate to statsd.
- Thread.sleep(1_000);
-
- StatsLogReport metricReport = getStatsLogReport();
- LogUtil.CLog.d("Got the following value metric data: " + metricReport.toString());
- assertThat(metricReport.getMetricId()).isEqualTo(MetricsUtils.VALUE_METRIC_ID);
- assertThat(metricReport.hasValueMetrics()).isTrue();
- StatsLogReport.ValueMetricDataWrapper valueData = metricReport.getValueMetrics();
- assertThat(valueData.getDataCount()).isEqualTo(1);
-
- int bucketCount = valueData.getData(0).getBucketInfoCount();
- // should have at least 2 buckets
- assertThat(bucketCount).isAtLeast(2);
- ValueMetricData data = valueData.getData(0);
- int totalValue = 0;
- for (ValueBucketInfo bucketInfo : data.getBucketInfoList()) {
- MetricsUtils.assertBucketTimePresent(bucketInfo);
- assertThat(bucketInfo.getValuesCount()).isEqualTo(1);
- assertThat(bucketInfo.getValues(0).getIndex()).isEqualTo(0);
- totalValue += (int) bucketInfo.getValues(0).getValueLong();
+
+
+ public void testValueMetric() throws Exception {
+ // Add AtomMatcher's.
+ AtomMatcher startAtomMatcher =
+ MetricsUtils.startAtomMatcher(APP_BREADCRUMB_REPORTED_A_MATCH_START_ID);
+ AtomMatcher stopAtomMatcher =
+ MetricsUtils.stopAtomMatcher(APP_BREADCRUMB_REPORTED_A_MATCH_STOP_ID);
+ AtomMatcher atomMatcher =
+ MetricsUtils.simpleAtomMatcher(APP_BREADCRUMB_REPORTED_B_MATCH_START_ID);
+
+ StatsdConfig.Builder builder = ConfigUtils.createConfigBuilder(
+ MetricsUtils.DEVICE_SIDE_TEST_PACKAGE);
+ builder.addAtomMatcher(startAtomMatcher);
+ builder.addAtomMatcher(stopAtomMatcher);
+ builder.addAtomMatcher(atomMatcher);
+
+ // Add ValueMetric.
+ builder.addValueMetric(
+ ValueMetric.newBuilder()
+ .setId(MetricsUtils.VALUE_METRIC_ID)
+ .setWhat(APP_BREADCRUMB_REPORTED_B_MATCH_START_ID)
+ .setBucket(TimeUnit.CTS)
+ .setValueField(FieldMatcher.newBuilder()
+ .setField(Atom.APP_BREADCRUMB_REPORTED_FIELD_NUMBER)
+ .addChild(FieldMatcher.newBuilder().setField(
+ AppBreadcrumbReported.LABEL_FIELD_NUMBER)))
+ .setDimensionsInWhat(FieldMatcher.newBuilder()
+ .setField(APP_BREADCRUMB_REPORTED_B_MATCH_START_ID)
+ .build())
+ .build());
+
+ // Upload config.
+ ConfigUtils.uploadConfig(getDevice(), builder);
+
+ // Create AppBreadcrumbReported Start/Stop events.
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), 1);
+ RunUtil.getDefault().sleep(1000);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.STOP.ordinal(), 1);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), 3);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.STOP.ordinal(), 3);
+
+ // Wait for the metrics to propagate to statsd.
+ RunUtil.getDefault().sleep(1000);
+
+ StatsLogReport metricReport = ReportUtils.getStatsLogReport(getDevice(),
+ ExtensionRegistry.getEmptyRegistry());
+ LogUtil.CLog.d("Got the following value metric data: " + metricReport.toString());
+ assertThat(metricReport.getMetricId()).isEqualTo(MetricsUtils.VALUE_METRIC_ID);
+ assertThat(metricReport.hasValueMetrics()).isTrue();
+ StatsLogReport.ValueMetricDataWrapper valueData = metricReport.getValueMetrics();
+ assertThat(valueData.getDataCount()).isEqualTo(1);
+
+ int bucketCount = valueData.getData(0).getBucketInfoCount();
+ assertThat(bucketCount).isGreaterThan(1);
+ ValueMetricData data = valueData.getData(0);
+ int totalValue = 0;
+ for (ValueBucketInfo bucketInfo : data.getBucketInfoList()) {
+ MetricsUtils.assertBucketTimePresent(bucketInfo);
+ assertThat(bucketInfo.getValuesCount()).isEqualTo(1);
+ assertThat(bucketInfo.getValues(0).getIndex()).isEqualTo(0);
+ totalValue += (int) bucketInfo.getValues(0).getValueLong();
+ }
+ assertThat(totalValue).isEqualTo(8);
}
- // At most we lose one full min bucket
- assertThat(totalValue).isGreaterThan(130_000 - 60_000);
- }
-
- // Test value metric with pulled atoms and across multiple buckets
- public void testMultipleEventsPerBucket() throws Exception {
- // Add AtomMatcher's.
- final String predicateTrueName = "APP_BREADCRUMB_REPORTED_START";
- final String predicateFalseName = "APP_BREADCRUMB_REPORTED_STOP";
- final String predicateName = "APP_BREADCRUMB_REPORTED_IS_STOP";
-
- AtomMatcher startAtomMatcher =
- MetricsUtils.startAtomMatcher(predicateTrueName.hashCode());
- AtomMatcher stopAtomMatcher =
- MetricsUtils.stopAtomMatcher(predicateFalseName.hashCode());
-
- StatsdConfig.Builder builder = createConfigBuilder();
- builder.addAtomMatcher(startAtomMatcher);
- builder.addAtomMatcher(stopAtomMatcher);
- builder.addPredicate(Predicate.newBuilder()
- .setId(predicateName.hashCode())
- .setSimplePredicate(SimplePredicate.newBuilder()
- .setStart(predicateTrueName.hashCode())
- .setStop(predicateFalseName.hashCode())
- .setCountNesting(false)
- )
- );
-
- final String atomName = "SYSTEM_ELAPSED_REALTIME";
- SimpleAtomMatcher.Builder sam = SimpleAtomMatcher.newBuilder().setAtomId(Atom.SYSTEM_ELAPSED_REALTIME_FIELD_NUMBER);
- builder.addAtomMatcher(AtomMatcher.newBuilder()
- .setId(atomName.hashCode())
- .setSimpleAtomMatcher(sam));
-
- // Add ValueMetric.
- builder.addValueMetric(
- ValueMetric.newBuilder()
- .setId(MetricsUtils.VALUE_METRIC_ID)
- .setWhat(atomName.hashCode())
- .setBucket(TimeUnit.ONE_MINUTE)
- .setValueField(FieldMatcher.newBuilder()
- .setField(Atom.SYSTEM_ELAPSED_REALTIME_FIELD_NUMBER)
- .addChild(FieldMatcher.newBuilder().setField(
- SystemElapsedRealtime.TIME_MILLIS_FIELD_NUMBER)))
- .setCondition(predicateName.hashCode())
- .build());
-
- // Upload config.
- uploadConfig(builder);
-
- final int NUM_EVENTS = 10;
- final long GAP_INTERVAL = 10_000;
- // Create AppBreadcrumbReported Start/Stop events.
- for (int i = 0; i < NUM_EVENTS; i ++) {
- doAppBreadcrumbReportedStart(1);
- Thread.sleep(GAP_INTERVAL);
- doAppBreadcrumbReportedStop(1);
- Thread.sleep(GAP_INTERVAL);
+
+ // Test value metric with pulled atoms and across multiple buckets
+ public void testPullerAcrossBuckets() throws Exception {
+ // Add AtomMatcher's.
+ final String predicateTrueName = "APP_BREADCRUMB_REPORTED_START";
+ final String predicateFalseName = "APP_BREADCRUMB_REPORTED_STOP";
+ final String predicateName = "APP_BREADCRUMB_REPORTED_IS_STOP";
+
+ AtomMatcher startAtomMatcher =
+ MetricsUtils.startAtomMatcher(predicateTrueName.hashCode());
+ AtomMatcher stopAtomMatcher =
+ MetricsUtils.stopAtomMatcher(predicateFalseName.hashCode());
+
+ StatsdConfig.Builder builder = ConfigUtils.createConfigBuilder(
+ MetricsUtils.DEVICE_SIDE_TEST_PACKAGE);
+ builder.addAtomMatcher(startAtomMatcher);
+ builder.addAtomMatcher(stopAtomMatcher);
+ builder.addPredicate(Predicate.newBuilder()
+ .setId(predicateName.hashCode())
+ .setSimplePredicate(SimplePredicate.newBuilder()
+ .setStart(predicateTrueName.hashCode())
+ .setStop(predicateFalseName.hashCode())
+ .setCountNesting(false)
+ )
+ );
+
+ final String atomName = "SYSTEM_ELAPSED_REALTIME";
+ SimpleAtomMatcher.Builder sam = SimpleAtomMatcher.newBuilder().setAtomId(
+ Atom.SYSTEM_ELAPSED_REALTIME_FIELD_NUMBER);
+ builder.addAtomMatcher(AtomMatcher.newBuilder()
+ .setId(atomName.hashCode())
+ .setSimpleAtomMatcher(sam));
+
+ // Add ValueMetric.
+ builder.addValueMetric(
+ ValueMetric.newBuilder()
+ .setId(MetricsUtils.VALUE_METRIC_ID)
+ .setWhat(atomName.hashCode())
+ .setBucket(TimeUnit.ONE_MINUTE)
+ .setValueField(FieldMatcher.newBuilder()
+ .setField(Atom.SYSTEM_ELAPSED_REALTIME_FIELD_NUMBER)
+ .addChild(FieldMatcher.newBuilder().setField(
+ SystemElapsedRealtime.TIME_MILLIS_FIELD_NUMBER)))
+ .setCondition(predicateName.hashCode())
+ .build());
+
+ // Upload config.
+ ConfigUtils.uploadConfig(getDevice(), builder);
+
+ // Create AppBreadcrumbReported Start/Stop events.
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), 1);
+ // Wait for 2 min and 1 sec to capture at least 2 buckets
+ RunUtil.getDefault().sleep(2 * 60_000 + 10_000);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.STOP.ordinal(), 1);
+
+ // Wait for the metrics to propagate to statsd.
+ RunUtil.getDefault().sleep(1_000);
+
+ StatsLogReport metricReport = ReportUtils.getStatsLogReport(getDevice(),
+ ExtensionRegistry.getEmptyRegistry());
+ LogUtil.CLog.d("Got the following value metric data: " + metricReport.toString());
+ assertThat(metricReport.getMetricId()).isEqualTo(MetricsUtils.VALUE_METRIC_ID);
+ assertThat(metricReport.hasValueMetrics()).isTrue();
+ StatsLogReport.ValueMetricDataWrapper valueData = metricReport.getValueMetrics();
+ assertThat(valueData.getDataCount()).isEqualTo(1);
+
+ int bucketCount = valueData.getData(0).getBucketInfoCount();
+ // should have at least 2 buckets
+ assertThat(bucketCount).isAtLeast(2);
+ ValueMetricData data = valueData.getData(0);
+ int totalValue = 0;
+ for (ValueBucketInfo bucketInfo : data.getBucketInfoList()) {
+ MetricsUtils.assertBucketTimePresent(bucketInfo);
+ assertThat(bucketInfo.getValuesCount()).isEqualTo(1);
+ assertThat(bucketInfo.getValues(0).getIndex()).isEqualTo(0);
+ totalValue += (int) bucketInfo.getValues(0).getValueLong();
+ }
+ // At most we lose one full min bucket
+ assertThat(totalValue).isGreaterThan(130_000 - 60_000);
}
- // Wait for the metrics to propagate to statsd.
- Thread.sleep(1_000);
-
- StatsLogReport metricReport = getStatsLogReport();
- LogUtil.CLog.d("Got the following value metric data: " + metricReport.toString());
- assertThat(metricReport.getMetricId()).isEqualTo(MetricsUtils.VALUE_METRIC_ID);
- assertThat(metricReport.hasValueMetrics()).isTrue();
- StatsLogReport.ValueMetricDataWrapper valueData = metricReport.getValueMetrics();
- assertThat(valueData.getDataCount()).isEqualTo(1);
-
- int bucketCount = valueData.getData(0).getBucketInfoCount();
- // should have at least 2 buckets
- assertThat(bucketCount).isAtLeast(2);
- ValueMetricData data = valueData.getData(0);
- int totalValue = 0;
- for (ValueBucketInfo bucketInfo : data.getBucketInfoList()) {
- MetricsUtils.assertBucketTimePresent(bucketInfo);
- assertThat(bucketInfo.getValuesCount()).isEqualTo(1);
- assertThat(bucketInfo.getValues(0).getIndex()).isEqualTo(0);
- totalValue += (int) bucketInfo.getValues(0).getValueLong();
+ // Test value metric with pulled atoms and across multiple buckets
+ public void testMultipleEventsPerBucket() throws Exception {
+ // Add AtomMatcher's.
+ final String predicateTrueName = "APP_BREADCRUMB_REPORTED_START";
+ final String predicateFalseName = "APP_BREADCRUMB_REPORTED_STOP";
+ final String predicateName = "APP_BREADCRUMB_REPORTED_IS_STOP";
+
+ AtomMatcher startAtomMatcher =
+ MetricsUtils.startAtomMatcher(predicateTrueName.hashCode());
+ AtomMatcher stopAtomMatcher =
+ MetricsUtils.stopAtomMatcher(predicateFalseName.hashCode());
+
+ StatsdConfig.Builder builder = ConfigUtils.createConfigBuilder(
+ MetricsUtils.DEVICE_SIDE_TEST_PACKAGE);
+ builder.addAtomMatcher(startAtomMatcher);
+ builder.addAtomMatcher(stopAtomMatcher);
+ builder.addPredicate(Predicate.newBuilder()
+ .setId(predicateName.hashCode())
+ .setSimplePredicate(SimplePredicate.newBuilder()
+ .setStart(predicateTrueName.hashCode())
+ .setStop(predicateFalseName.hashCode())
+ .setCountNesting(false)
+ )
+ );
+
+ final String atomName = "SYSTEM_ELAPSED_REALTIME";
+ SimpleAtomMatcher.Builder sam = SimpleAtomMatcher.newBuilder().setAtomId(
+ Atom.SYSTEM_ELAPSED_REALTIME_FIELD_NUMBER);
+ builder.addAtomMatcher(AtomMatcher.newBuilder()
+ .setId(atomName.hashCode())
+ .setSimpleAtomMatcher(sam));
+
+ // Add ValueMetric.
+ builder.addValueMetric(
+ ValueMetric.newBuilder()
+ .setId(MetricsUtils.VALUE_METRIC_ID)
+ .setWhat(atomName.hashCode())
+ .setBucket(TimeUnit.ONE_MINUTE)
+ .setValueField(FieldMatcher.newBuilder()
+ .setField(Atom.SYSTEM_ELAPSED_REALTIME_FIELD_NUMBER)
+ .addChild(FieldMatcher.newBuilder().setField(
+ SystemElapsedRealtime.TIME_MILLIS_FIELD_NUMBER)))
+ .setCondition(predicateName.hashCode())
+ .build());
+
+ // Upload config.
+ ConfigUtils.uploadConfig(getDevice(), builder);
+
+ final int NUM_EVENTS = 10;
+ final long GAP_INTERVAL = 10_000;
+ // Create AppBreadcrumbReported Start/Stop events.
+ for (int i = 0; i < NUM_EVENTS; i++) {
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), 1);
+ RunUtil.getDefault().sleep(GAP_INTERVAL);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.STOP.ordinal(), 1);
+ RunUtil.getDefault().sleep(GAP_INTERVAL);
+ }
+
+ // Wait for the metrics to propagate to statsd.
+ RunUtil.getDefault().sleep(1_000);
+
+ StatsLogReport metricReport = ReportUtils.getStatsLogReport(getDevice(),
+ ExtensionRegistry.getEmptyRegistry());
+ LogUtil.CLog.d("Got the following value metric data: " + metricReport.toString());
+ assertThat(metricReport.getMetricId()).isEqualTo(MetricsUtils.VALUE_METRIC_ID);
+ assertThat(metricReport.hasValueMetrics()).isTrue();
+ StatsLogReport.ValueMetricDataWrapper valueData = metricReport.getValueMetrics();
+ assertThat(valueData.getDataCount()).isEqualTo(1);
+
+ int bucketCount = valueData.getData(0).getBucketInfoCount();
+ // should have at least 2 buckets
+ assertThat(bucketCount).isAtLeast(2);
+ ValueMetricData data = valueData.getData(0);
+ int totalValue = 0;
+ for (ValueBucketInfo bucketInfo : data.getBucketInfoList()) {
+ MetricsUtils.assertBucketTimePresent(bucketInfo);
+ assertThat(bucketInfo.getValuesCount()).isEqualTo(1);
+ assertThat(bucketInfo.getValues(0).getIndex()).isEqualTo(0);
+ totalValue += (int) bucketInfo.getValues(0).getValueLong();
+ }
+ // At most we lose one full min bucket
+ assertThat((long) totalValue).isGreaterThan(GAP_INTERVAL * NUM_EVENTS - 60_000);
+ }
+
+ // Test value metric with pulled atoms and across multiple buckets
+ public void testPullerAcrossBucketsWithActivation() throws Exception {
+ StatsdConfig.Builder builder = ConfigUtils.createConfigBuilder(
+ MetricsUtils.DEVICE_SIDE_TEST_PACKAGE);
+
+ // Add AtomMatcher's.
+ int activationAtomMatcherId = 1;
+ int activationAtomMatcherLabel = 1;
+ AtomMatcher activationAtomMatcher =
+ MetricsUtils.appBreadcrumbMatcherWithLabel(
+ activationAtomMatcherId, activationAtomMatcherLabel);
+ final String atomName = "SYSTEM_ELAPSED_REALTIME";
+ SimpleAtomMatcher.Builder sam = SimpleAtomMatcher.newBuilder()
+ .setAtomId(Atom.SYSTEM_ELAPSED_REALTIME_FIELD_NUMBER);
+ builder.addAtomMatcher(activationAtomMatcher)
+ .addAtomMatcher(AtomMatcher.newBuilder()
+ .setId(atomName.hashCode())
+ .setSimpleAtomMatcher(sam));
+
+ // Add ValueMetric.
+ builder.addValueMetric(
+ ValueMetric.newBuilder()
+ .setId(MetricsUtils.VALUE_METRIC_ID)
+ .setWhat(atomName.hashCode())
+ .setBucket(TimeUnit.ONE_MINUTE)
+ .setValueField(FieldMatcher.newBuilder()
+ .setField(Atom.SYSTEM_ELAPSED_REALTIME_FIELD_NUMBER)
+ .addChild(FieldMatcher.newBuilder().setField(
+ SystemElapsedRealtime.TIME_MILLIS_FIELD_NUMBER)))
+ .build());
+ // Add activation.
+ builder.addMetricActivation(MetricActivation.newBuilder()
+ .setMetricId(MetricsUtils.VALUE_METRIC_ID)
+ .setActivationType(ActivationType.ACTIVATE_IMMEDIATELY)
+ .addEventActivation(EventActivation.newBuilder()
+ .setAtomMatcherId(activationAtomMatcherId)
+ .setTtlSeconds(5)));
+
+
+ // Upload config.
+ ConfigUtils.uploadConfig(getDevice(), builder);
+
+ // Wait for 1 min and 10 sec to capture at least 1 bucket
+ RunUtil.getDefault().sleep(60_000 + 10_000);
+
+ // Wait for the metrics to propagate to statsd.
+ RunUtil.getDefault().sleep(1_000);
+
+ StatsLogReport metricReport = ReportUtils.getStatsLogReport(getDevice(),
+ ExtensionRegistry.getEmptyRegistry());
+ LogUtil.CLog.d("Got the following value metric data: " + metricReport.toString());
+ assertThat(metricReport.getMetricId()).isEqualTo(MetricsUtils.VALUE_METRIC_ID);
+ assertThat(metricReport.getValueMetrics().getDataList()).isEmpty();
+ // Skipped buckets are not added when metric is empty.
+ assertThat(metricReport.getValueMetrics().getSkippedList()).isEmpty();
}
- // At most we lose one full min bucket
- assertThat((long) totalValue).isGreaterThan(GAP_INTERVAL * NUM_EVENTS - 60_000);
- }
-
- // Test value metric with pulled atoms and across multiple buckets
- public void testPullerAcrossBucketsWithActivation() throws Exception {
- StatsdConfig.Builder builder = createConfigBuilder();
-
- // Add AtomMatcher's.
- int activationAtomMatcherId = 1;
- int activationAtomMatcherLabel = 1;
- AtomMatcher activationAtomMatcher =
- MetricsUtils.appBreadcrumbMatcherWithLabel(
- activationAtomMatcherId, activationAtomMatcherLabel);
- final String atomName = "SYSTEM_ELAPSED_REALTIME";
- SimpleAtomMatcher.Builder sam = SimpleAtomMatcher.newBuilder()
- .setAtomId(Atom.SYSTEM_ELAPSED_REALTIME_FIELD_NUMBER);
- builder.addAtomMatcher(activationAtomMatcher)
- .addAtomMatcher(AtomMatcher.newBuilder()
- .setId(atomName.hashCode())
- .setSimpleAtomMatcher(sam));
-
- // Add ValueMetric.
- builder.addValueMetric(
- ValueMetric.newBuilder()
- .setId(MetricsUtils.VALUE_METRIC_ID)
- .setWhat(atomName.hashCode())
- .setBucket(TimeUnit.ONE_MINUTE)
- .setValueField(FieldMatcher.newBuilder()
- .setField(Atom.SYSTEM_ELAPSED_REALTIME_FIELD_NUMBER)
- .addChild(FieldMatcher.newBuilder().setField(
- SystemElapsedRealtime.TIME_MILLIS_FIELD_NUMBER)))
- .build());
- // Add activation.
- builder.addMetricActivation(MetricActivation.newBuilder()
- .setMetricId(MetricsUtils.VALUE_METRIC_ID)
- .setActivationType(ActivationType.ACTIVATE_IMMEDIATELY)
- .addEventActivation(EventActivation.newBuilder()
- .setAtomMatcherId(activationAtomMatcherId)
- .setTtlSeconds(5)));
-
-
- // Upload config.
- uploadConfig(builder);
-
- // Wait for 1 min and 10 sec to capture at least 1 bucket
- Thread.sleep(60_000 + 10_000);
-
- // Wait for the metrics to propagate to statsd.
- Thread.sleep(1_000);
-
- StatsLogReport metricReport = getStatsLogReport();
- LogUtil.CLog.d("Got the following value metric data: " + metricReport.toString());
- assertThat(metricReport.getMetricId()).isEqualTo(MetricsUtils.VALUE_METRIC_ID);
- assertThat(metricReport.getValueMetrics().getDataList()).isEmpty();
- // Skipped buckets are not added when metric is empty.
- assertThat(metricReport.getValueMetrics().getSkippedList()).isEmpty();
- }
public void testValueMetricWithConditionAndActivation() throws Exception {
final int conditionLabel = 2;
@@ -340,7 +378,8 @@ public class ValueMetricsTests extends DeviceAtomTestCase {
AtomMatcher whatMatcher =
MetricsUtils.unspecifiedAtomMatcher(whatMatcherId);
- StatsdConfig.Builder builder = createConfigBuilder()
+ StatsdConfig.Builder builder = ConfigUtils.createConfigBuilder(
+ MetricsUtils.DEVICE_SIDE_TEST_PACKAGE)
.addAtomMatcher(conditionStartAtomMatcher)
.addAtomMatcher(conditionStopAtomMatcher)
.addAtomMatcher(whatMatcher)
@@ -352,9 +391,9 @@ public class ValueMetricsTests extends DeviceAtomTestCase {
.setStop(APP_BREADCRUMB_REPORTED_A_MATCH_STOP_ID)
.build();
Predicate predicate = Predicate.newBuilder()
- .setId(MetricsUtils.StringToId("Predicate"))
- .setSimplePredicate(simplePredicate)
- .build();
+ .setId(MetricsUtils.StringToId("Predicate"))
+ .setSimplePredicate(simplePredicate)
+ .build();
builder.addPredicate(predicate);
// Add ValueMetric.
@@ -380,66 +419,79 @@ public class ValueMetricsTests extends DeviceAtomTestCase {
)
);
- uploadConfig(builder);
+ ConfigUtils.uploadConfig(getDevice(), builder);
// Activate the metric.
- doAppBreadcrumbReportedStart(activationMatcherLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), activationMatcherLabel);
+ RunUtil.getDefault().sleep(10);
// Set the condition to true.
- doAppBreadcrumbReportedStart(conditionLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), conditionLabel);
+ RunUtil.getDefault().sleep(10);
// Skipped due to unknown condition at start of bucket.
- doAppBreadcrumbReported(10);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), 10);
+ RunUtil.getDefault().sleep(10);
// Skipped due to unknown condition at start of bucket.
- doAppBreadcrumbReported(200);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), 200);
+ RunUtil.getDefault().sleep(10);
// Set the condition to false.
- doAppBreadcrumbReportedStop(conditionLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.STOP.ordinal(), conditionLabel);
+ RunUtil.getDefault().sleep(10);
// Log an event that should not be counted because condition is false.
- doAppBreadcrumbReported(3_000);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), 3_000);
+ RunUtil.getDefault().sleep(10);
// Let the metric deactivate.
- Thread.sleep(ttlSec * 1000);
+ RunUtil.getDefault().sleep(ttlSec * 1000);
// Log an event that should not be counted.
- doAppBreadcrumbReported(40_000);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), 40_000);
+ RunUtil.getDefault().sleep(10);
// Condition to true again.
- doAppBreadcrumbReportedStart(conditionLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), conditionLabel);
+ RunUtil.getDefault().sleep(10);
// Event should not be counted, metric is still not active.
- doAppBreadcrumbReported(500_000);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), 500_000);
+ RunUtil.getDefault().sleep(10);
// Activate the metric.
- doAppBreadcrumbReportedStart(activationMatcherLabel);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.START.ordinal(), activationMatcherLabel);
+ RunUtil.getDefault().sleep(10);
// Log an event that should be counted.
- doAppBreadcrumbReported(6_000_000);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), 6_000_000);
+ RunUtil.getDefault().sleep(10);
// Let the metric deactivate.
- Thread.sleep(ttlSec * 1000);
+ RunUtil.getDefault().sleep(ttlSec * 1000);
// Log an event that should not be counted.
- doAppBreadcrumbReported(70_000_000);
- Thread.sleep(10);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), 70_000_000);
+ RunUtil.getDefault().sleep(10);
// Wait for the metrics to propagate to statsd.
- Thread.sleep(2000);
+ RunUtil.getDefault().sleep(2000);
- StatsLogReport metricReport = getStatsLogReport();
+ StatsLogReport metricReport = ReportUtils.getStatsLogReport(getDevice(),
+ ExtensionRegistry.getEmptyRegistry());
LogUtil.CLog.d("Received the following data: " + metricReport.toString());
assertThat(metricReport.getMetricId()).isEqualTo(MetricsUtils.VALUE_METRIC_ID);
assertThat(metricReport.hasValueMetrics()).isTrue();
diff --git a/tests/src/android/cts/statsd/restricted/ReadRestrictedStatsPermissionTest.java b/tests/src/android/cts/statsd/restricted/ReadRestrictedStatsPermissionTest.java
index 5191f390..1b646f51 100644
--- a/tests/src/android/cts/statsd/restricted/ReadRestrictedStatsPermissionTest.java
+++ b/tests/src/android/cts/statsd/restricted/ReadRestrictedStatsPermissionTest.java
@@ -1,14 +1,44 @@
package android.cts.statsd.restricted;
-import android.cts.statsd.atom.DeviceAtomTestCase;
+import static com.google.common.truth.Truth.assertThat;
+
+import android.cts.statsd.metric.MetricsUtils;
+import android.cts.statsdatom.lib.DeviceUtils;
+
+import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IBuildReceiver;
+import com.android.tradefed.util.RunUtil;
/**
* Tests Suite for restricted stats permissions.
*/
-public class ReadRestrictedStatsPermissionTest extends DeviceAtomTestCase {
+public class ReadRestrictedStatsPermissionTest extends DeviceTestCase implements IBuildReceiver {
+
+ private IBuildInfo mCtsBuild;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ assertThat(mCtsBuild).isNotNull();
+ DeviceUtils.installTestApp(getDevice(), MetricsUtils.DEVICE_SIDE_TEST_APK,
+ MetricsUtils.DEVICE_SIDE_TEST_PACKAGE, mCtsBuild);
+ RunUtil.getDefault().sleep(1000);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.setUp();
+ DeviceUtils.uninstallTestApp(getDevice(), MetricsUtils.DEVICE_SIDE_TEST_PACKAGE);
+ }
+
+ @Override
+ public void setBuild(IBuildInfo buildInfo) {
+ mCtsBuild = buildInfo;
+ }
public void testReadRestrictedStatsPermission() throws Exception {
- runDeviceTests(DEVICE_SIDE_TEST_PACKAGE,
+ DeviceUtils.runDeviceTests(getDevice(), MetricsUtils.DEVICE_SIDE_TEST_PACKAGE,
".RestrictedPermissionTests", "testReadRestrictedStatsPermission");
}
}
diff --git a/tests/src/android/cts/statsd/subscriber/ShellSubscriberTest.java b/tests/src/android/cts/statsd/subscriber/ShellSubscriberTest.java
index d3c142ba..7f622120 100644
--- a/tests/src/android/cts/statsd/subscriber/ShellSubscriberTest.java
+++ b/tests/src/android/cts/statsd/subscriber/ShellSubscriberTest.java
@@ -16,12 +16,11 @@
package android.cts.statsd.subscriber;
import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.Truth.assertWithMessage;
import com.android.compatibility.common.util.CpuFeatures;
import com.android.internal.os.StatsdConfigProto;
+import com.android.os.AtomsProto;
import com.android.os.AtomsProto.Atom;
-import com.android.os.AtomsProto.SystemUptime;
import com.android.os.ShellConfig;
import com.android.os.statsd.ShellDataProto;
import com.android.tradefed.device.CollectingByteOutputReceiver;
@@ -29,6 +28,8 @@ import com.android.tradefed.device.DeviceNotAvailableException;
import com.android.tradefed.device.ITestDevice;
import com.android.tradefed.log.LogUtil;
import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.util.RunUtil;
+
import com.google.common.io.Files;
import com.google.protobuf.InvalidProtocolBufferException;
@@ -37,18 +38,20 @@ import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;
-import android.cts.statsd.atom.AtomTestCase;
+
+import android.cts.statsdatom.lib.AtomTestUtils;
/**
* Statsd shell data subscription test.
*/
-public class ShellSubscriberTest extends AtomTestCase {
+public class ShellSubscriberTest extends DeviceTestCase {
private int sizetBytes;
public class ShellSubscriptionThread extends Thread {
String cmd;
CollectingByteOutputReceiver receiver;
int maxTimeoutForCommandSec;
+
public ShellSubscriptionThread(
String cmd,
CollectingByteOutputReceiver receiver,
@@ -57,7 +60,8 @@ public class ShellSubscriberTest extends AtomTestCase {
this.receiver = receiver;
this.maxTimeoutForCommandSec = maxTimeoutForCommandSec;
}
- public void run () {
+
+ public void run() {
try {
getDevice().executeShellCommand(cmd, receiver, maxTimeoutForCommandSec,
/*maxTimeToOutputShellResponse=*/maxTimeoutForCommandSec, TimeUnit.SECONDS,
@@ -124,27 +128,28 @@ public class ShellSubscriberTest extends AtomTestCase {
String cmd = "cat " + remotePath + " | cmd stats data-subscribe " + timeout;
String firstSubCmd =
- "cat " + remotePath + " | cmd stats data-subscribe " + firstSubTimeout;
+ "cat " + remotePath + " | cmd stats data-subscribe " + firstSubTimeout;
for (int i = 0; i < maxSubs; i++) {
// Run data-subscribe on a thread
receivers[i] = new CollectingByteOutputReceiver();
if (i == 0) {
shellThreads[i] =
- new ShellSubscriptionThread(firstSubCmd, receivers[i], firstSubTimeout);
+ new ShellSubscriptionThread(firstSubCmd, receivers[i], firstSubTimeout);
} else {
shellThreads[i] =
- new ShellSubscriptionThread(cmd, receivers[i], timeout);
+ new ShellSubscriptionThread(cmd, receivers[i], timeout);
}
shellThreads[i].start();
LogUtil.CLog.d("Starting new shell subscription.");
}
// Sleep 2 seconds to make sure all subscription clients are initialized before
// first pushed event
- Thread.sleep(2000);
+ RunUtil.getDefault().sleep(2000);
// Pushed event. arbitrary label = 1
- doAppBreadcrumbReported(1);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AtomsProto.AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), 1);
// Make sure the last 19 threads die before moving to the next step.
// First subscription is still active due to its longer timeout that is used keep
@@ -163,26 +168,27 @@ public class ShellSubscriberTest extends AtomTestCase {
// Run data-subscribe on a thread
receivers[i] = new CollectingByteOutputReceiver();
shellThreads[i] =
- new ShellSubscriptionThread(cmd, receivers[i], timeout);
+ new ShellSubscriptionThread(cmd, receivers[i], timeout);
shellThreads[i].start();
LogUtil.CLog.d("Starting new shell subscription.");
}
// Sleep 2 seconds to make sure all subscription clients are initialized before
// pushed event
- Thread.sleep(2000);
+ RunUtil.getDefault().sleep(2000);
// ShellSubscriber only allows 20 subscriptions at a time. This is the 21st which will
// be ignored
receivers[maxSubs] = new CollectingByteOutputReceiver();
shellThreads[maxSubs] =
- new ShellSubscriptionThread(cmd, receivers[maxSubs], timeout);
+ new ShellSubscriptionThread(cmd, receivers[maxSubs], timeout);
shellThreads[maxSubs].start();
// Sleep 1 seconds to ensure that the 21st subscription is rejected
- Thread.sleep(1000);
+ RunUtil.getDefault().sleep(1000);
// Pushed event. arbitrary label = 1
- doAppBreadcrumbReported(1);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AtomsProto.AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), 1);
// Make sure all the threads die before moving to the next step
for (int i = 0; i <= maxSubs; i++) {
@@ -219,7 +225,7 @@ public class ShellSubscriberTest extends AtomTestCase {
private ShellConfig.ShellSubscription createConfig() {
return ShellConfig.ShellSubscription.newBuilder()
.addPushed((StatsdConfigProto.SimpleAtomMatcher.newBuilder()
- .setAtomId(Atom.APP_BREADCRUMB_REPORTED_FIELD_NUMBER))
+ .setAtomId(Atom.APP_BREADCRUMB_REPORTED_FIELD_NUMBER))
.build()).build();
}
@@ -260,15 +266,16 @@ public class ShellSubscriberTest extends AtomTestCase {
String cmd = "cat " + remotePath + " | cmd stats data-subscribe " + timeout;
// Run data-subscribe on a thread
ShellSubscriptionThread shellThread =
- new ShellSubscriptionThread(cmd, receiver, timeout);
+ new ShellSubscriptionThread(cmd, receiver, timeout);
shellThread.start();
LogUtil.CLog.d("Starting new shell subscription.");
// Sleep a second to make sure subscription is initiated
- Thread.sleep(1000);
+ RunUtil.getDefault().sleep(1000);
// Pushed event. arbitrary label = 1
- doAppBreadcrumbReported(1);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AtomsProto.AppBreadcrumbReported.State.UNSPECIFIED.ordinal(), 1);
// Wait for thread to die before returning
shellThread.join();
// Remove config from device if not already deleted
@@ -319,7 +326,7 @@ public class ShellSubscriberTest extends AtomTestCase {
assertThat(data.getAtom(0).hasAppBreadcrumbReported()).isTrue();
assertThat(data.getAtom(0).getAppBreadcrumbReported().getLabel()).isEqualTo(1);
assertThat(data.getAtom(0).getAppBreadcrumbReported().getState().getNumber())
- .isEqualTo(1);
+ .isEqualTo(1);
atomCount++;
startIndex += sizetBytes + dataLength;
}
diff --git a/tests/src/android/cts/statsd/uidmap/UidMapTests.java b/tests/src/android/cts/statsd/uidmap/UidMapTests.java
index 4ceefa75..57745f90 100644
--- a/tests/src/android/cts/statsd/uidmap/UidMapTests.java
+++ b/tests/src/android/cts/statsd/uidmap/UidMapTests.java
@@ -17,7 +17,12 @@ package android.cts.statsd.uidmap;
import static com.google.common.truth.Truth.assertThat;
-import android.cts.statsd.atom.DeviceAtomTestCase;
+import android.cts.statsd.metric.MetricsUtils;
+import android.cts.statsdatom.lib.AtomTestUtils;
+import android.cts.statsdatom.lib.ConfigUtils;
+import android.cts.statsdatom.lib.DeviceUtils;
+import android.cts.statsdatom.lib.ReportUtils;
+
import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelper;
import com.android.internal.os.StatsdConfigProto;
import com.android.os.AtomsProto;
@@ -25,18 +30,54 @@ import com.android.os.StatsLog.ConfigMetricsReportList;
import com.android.os.StatsLog.ConfigMetricsReport;
import com.android.os.StatsLog.UidMapping;
import com.android.os.StatsLog.UidMapping.PackageInfoSnapshot;
+import com.android.tradefed.build.IBuildInfo;
import com.android.tradefed.log.LogUtil;
+import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IBuildReceiver;
+import com.android.tradefed.util.RunUtil;
+
+import com.google.protobuf.ExtensionRegistry;
+
+public class UidMapTests extends DeviceTestCase implements IBuildReceiver {
+
+ private static final long DEVICE_SIDE_TEST_PKG_HASH =
+ Long.parseUnsignedLong("15694052924544098582");
+
+ private IBuildInfo mCtsBuild;
-import java.util.List;
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ assertThat(mCtsBuild).isNotNull();
+ ConfigUtils.removeConfig(getDevice());
+ ReportUtils.clearReports(getDevice());
+ DeviceUtils.installTestApp(getDevice(), MetricsUtils.DEVICE_SIDE_TEST_APK,
+ MetricsUtils.DEVICE_SIDE_TEST_PACKAGE, mCtsBuild);
+ RunUtil.getDefault().sleep(1000);
+ }
-public class UidMapTests extends DeviceAtomTestCase {
+ @Override
+ protected void tearDown() throws Exception {
+ super.setUp();
+ ConfigUtils.removeConfig(getDevice());
+ ReportUtils.clearReports(getDevice());
+ DeviceUtils.uninstallTestApp(getDevice(), MetricsUtils.DEVICE_SIDE_TEST_PACKAGE);
+ }
+
+ @Override
+ public void setBuild(IBuildInfo buildInfo) {
+ mCtsBuild = buildInfo;
+ }
// Tests that every report has at least one snapshot.
public void testUidSnapshotIncluded() throws Exception {
// There should be at least the test app installed during the test setup.
- createAndUploadConfig(AtomsProto.Atom.UID_PROCESS_STATE_CHANGED_FIELD_NUMBER);
+ ConfigUtils.uploadConfigForPushedAtom(getDevice(),
+ MetricsUtils.DEVICE_SIDE_TEST_PACKAGE,
+ AtomsProto.Atom.UID_PROCESS_STATE_CHANGED_FIELD_NUMBER);
- ConfigMetricsReportList reports = getReportList();
+ ConfigMetricsReportList reports = ReportUtils.getReportList(getDevice(),
+ ExtensionRegistry.getEmptyRegistry());
assertThat(reports.getReportsCount()).isGreaterThan(0);
for (ConfigMetricsReport report : reports.getReportsList()) {
@@ -64,21 +105,24 @@ public class UidMapTests extends DeviceAtomTestCase {
// Tests that delta event included during app installation.
public void testChangeFromInstallation() throws Exception {
- getDevice().uninstallPackage(DEVICE_SIDE_TEST_PACKAGE);
- createAndUploadConfig(AtomsProto.Atom.UID_PROCESS_STATE_CHANGED_FIELD_NUMBER);
+ getDevice().uninstallPackage(MetricsUtils.DEVICE_SIDE_TEST_PACKAGE);
+ ConfigUtils.uploadConfigForPushedAtom(getDevice(),
+ MetricsUtils.DEVICE_SIDE_TEST_PACKAGE,
+ AtomsProto.Atom.UID_PROCESS_STATE_CHANGED_FIELD_NUMBER);
// Install the package after the config is sent to statsd. The uid map is not guaranteed to
// be updated if there's no config in statsd.
CompatibilityBuildHelper buildHelper = new CompatibilityBuildHelper(mCtsBuild);
final String result = getDevice().installPackage(
- buildHelper.getTestFile(DEVICE_SIDE_TEST_APK), false, true);
+ buildHelper.getTestFile(MetricsUtils.DEVICE_SIDE_TEST_APK), false, true);
- Thread.sleep(WAIT_TIME_LONG);
+ RunUtil.getDefault().sleep(AtomTestUtils.WAIT_TIME_LONG);
- ConfigMetricsReportList reports = getReportList();
+ ConfigMetricsReportList reports = ReportUtils.getReportList(getDevice(),
+ ExtensionRegistry.getEmptyRegistry());
assertThat(reports.getReportsCount()).isGreaterThan(0);
boolean found = false;
- int uid = getUid();
+ int uid = DeviceUtils.getAppUid(getDevice(), MetricsUtils.DEVICE_SIDE_TEST_PACKAGE);
for (ConfigMetricsReport report : reports.getReportsList()) {
LogUtil.CLog.d("Got the following report: \n" + report.toString());
if (hasMatchingChange(report.getUidMap(), uid, false)) {
@@ -91,18 +135,23 @@ public class UidMapTests extends DeviceAtomTestCase {
// We check that a re-installation gives a change event (similar to an app upgrade).
public void testChangeFromReinstall() throws Exception {
CompatibilityBuildHelper buildHelper = new CompatibilityBuildHelper(mCtsBuild);
- getDevice().installPackage(buildHelper.getTestFile(DEVICE_SIDE_TEST_APK), false, true);
- createAndUploadConfig(AtomsProto.Atom.UID_PROCESS_STATE_CHANGED_FIELD_NUMBER);
+ getDevice().installPackage(buildHelper.getTestFile(MetricsUtils.DEVICE_SIDE_TEST_APK),
+ false, true);
+ ConfigUtils.uploadConfigForPushedAtom(getDevice(),
+ MetricsUtils.DEVICE_SIDE_TEST_PACKAGE,
+ AtomsProto.Atom.UID_PROCESS_STATE_CHANGED_FIELD_NUMBER);
// Now enable re-installation.
- getDevice().installPackage(buildHelper.getTestFile(DEVICE_SIDE_TEST_APK), true, true);
+ getDevice().installPackage(buildHelper.getTestFile(MetricsUtils.DEVICE_SIDE_TEST_APK), true,
+ true);
- Thread.sleep(WAIT_TIME_LONG);
+ RunUtil.getDefault().sleep(AtomTestUtils.WAIT_TIME_LONG);
- ConfigMetricsReportList reports = getReportList();
+ ConfigMetricsReportList reports = ReportUtils.getReportList(getDevice(),
+ ExtensionRegistry.getEmptyRegistry());
assertThat(reports.getReportsCount()).isGreaterThan(0);
boolean found = false;
- int uid = getUid();
+ int uid = DeviceUtils.getAppUid(getDevice(), MetricsUtils.DEVICE_SIDE_TEST_PACKAGE);
for (ConfigMetricsReport report : reports.getReportsList()) {
LogUtil.CLog.d("Got the following report: \n" + report.toString());
if (hasMatchingChange(report.getUidMap(), uid, false)) {
@@ -114,14 +163,19 @@ public class UidMapTests extends DeviceAtomTestCase {
public void testChangeFromUninstall() throws Exception {
CompatibilityBuildHelper buildHelper = new CompatibilityBuildHelper(mCtsBuild);
- getDevice().installPackage(buildHelper.getTestFile(DEVICE_SIDE_TEST_APK), true, true);
- createAndUploadConfig(AtomsProto.Atom.UID_PROCESS_STATE_CHANGED_FIELD_NUMBER);
- int uid = getUid();
- getDevice().uninstallPackage(DEVICE_SIDE_TEST_PACKAGE);
+ getDevice().installPackage(buildHelper.getTestFile(MetricsUtils.DEVICE_SIDE_TEST_APK), true,
+ true);
+
+ ConfigUtils.uploadConfigForPushedAtom(getDevice(),
+ MetricsUtils.DEVICE_SIDE_TEST_PACKAGE,
+ AtomsProto.Atom.UID_PROCESS_STATE_CHANGED_FIELD_NUMBER);
+ int uid = DeviceUtils.getAppUid(getDevice(), MetricsUtils.DEVICE_SIDE_TEST_PACKAGE);
+ getDevice().uninstallPackage(MetricsUtils.DEVICE_SIDE_TEST_PACKAGE);
- Thread.sleep(WAIT_TIME_LONG);
+ RunUtil.getDefault().sleep(AtomTestUtils.WAIT_TIME_LONG);
- ConfigMetricsReportList reports = getReportList();
+ ConfigMetricsReportList reports = ReportUtils.getReportList(getDevice(),
+ ExtensionRegistry.getEmptyRegistry());
assertThat(reports.getReportsCount()).isGreaterThan(0);
boolean found = false;
diff --git a/tests/src/android/cts/statsd/validation/DirectoryValidationTest.java b/tests/src/android/cts/statsd/validation/DirectoryValidationTest.java
index 37ded0bb..4a41e6e4 100644
--- a/tests/src/android/cts/statsd/validation/DirectoryValidationTest.java
+++ b/tests/src/android/cts/statsd/validation/DirectoryValidationTest.java
@@ -1,34 +1,64 @@
package android.cts.statsd.validation;
-import android.cts.statsd.atom.DeviceAtomTestCase;
+import static com.google.common.truth.Truth.assertThat;
+
+import android.cts.statsd.metric.MetricsUtils;
+import android.cts.statsdatom.lib.DeviceUtils;
+
+import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IBuildReceiver;
+import com.android.tradefed.util.RunUtil;
/**
* Tests Suite for directories used by Statsd.
*/
-public class DirectoryValidationTest extends DeviceAtomTestCase {
+public class DirectoryValidationTest extends DeviceTestCase implements IBuildReceiver {
+
+ private IBuildInfo mCtsBuild;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ assertThat(mCtsBuild).isNotNull();
+ DeviceUtils.installTestApp(getDevice(), MetricsUtils.DEVICE_SIDE_TEST_APK,
+ MetricsUtils.DEVICE_SIDE_TEST_PACKAGE, mCtsBuild);
+ RunUtil.getDefault().sleep(1000);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.setUp();
+ DeviceUtils.uninstallTestApp(getDevice(), MetricsUtils.DEVICE_SIDE_TEST_PACKAGE);
+ }
+
+ @Override
+ public void setBuild(IBuildInfo buildInfo) {
+ mCtsBuild = buildInfo;
+ }
public void testStatsActiveMetricDirectoryExists() throws Exception {
- runDeviceTests(DEVICE_SIDE_TEST_PACKAGE,
+ DeviceUtils.runDeviceTests(getDevice(), MetricsUtils.DEVICE_SIDE_TEST_PACKAGE,
".DirectoryTests", "testStatsActiveMetricDirectoryExists");
}
public void testStatsDataDirectoryExists() throws Exception {
- runDeviceTests(DEVICE_SIDE_TEST_PACKAGE,
+ DeviceUtils.runDeviceTests(getDevice(), MetricsUtils.DEVICE_SIDE_TEST_PACKAGE,
".DirectoryTests", "testStatsDataDirectoryExists");
}
public void testStatsMetadataDirectoryExists() throws Exception {
- runDeviceTests(DEVICE_SIDE_TEST_PACKAGE,
+ DeviceUtils.runDeviceTests(getDevice(), MetricsUtils.DEVICE_SIDE_TEST_PACKAGE,
".DirectoryTests", "testStatsMetadataDirectoryExists");
}
public void testStatsServiceDirectoryExists() throws Exception {
- runDeviceTests(DEVICE_SIDE_TEST_PACKAGE,
+ DeviceUtils.runDeviceTests(getDevice(), MetricsUtils.DEVICE_SIDE_TEST_PACKAGE,
".DirectoryTests", "testStatsServiceDirectoryExists");
}
public void testTrainInfoDirectoryExists() throws Exception {
- runDeviceTests(DEVICE_SIDE_TEST_PACKAGE,
+ DeviceUtils.runDeviceTests(getDevice(), MetricsUtils.DEVICE_SIDE_TEST_PACKAGE,
".DirectoryTests", "testTrainInfoDirectoryExists");
}
}
diff --git a/tests/src/android/cts/statsd/validation/ProcStatsValidationTests.java b/tests/src/android/cts/statsd/validation/ProcStatsValidationTests.java
index 1ca4c5cb..9d6f1ada 100644
--- a/tests/src/android/cts/statsd/validation/ProcStatsValidationTests.java
+++ b/tests/src/android/cts/statsd/validation/ProcStatsValidationTests.java
@@ -18,20 +18,22 @@ package android.cts.statsd.validation;
import static com.google.common.truth.Truth.assertThat;
import android.cts.statsd.atom.ProcStateTestCase;
-import android.service.procstats.ProcessState;
+import android.cts.statsd.metric.MetricsUtils;
+import android.cts.statsdatom.lib.AtomTestUtils;
+import android.cts.statsdatom.lib.ConfigUtils;
+import android.cts.statsdatom.lib.DeviceUtils;
+import android.cts.statsdatom.lib.ReportUtils;
import android.service.procstats.AggregatedProcessState;
import com.android.internal.os.StatsdConfigProto.StatsdConfig;
+import com.android.os.AtomsProto;
import com.android.os.AtomsProto.Atom;
import com.android.os.AtomsProto.ProcessStateAggregated;
-import com.android.os.AtomsProto.ProcessStatsPackageProto;
import com.android.os.AtomsProto.ProcessStatsProto;
import com.android.os.AtomsProto.ProcessStatsStateProto;
-import com.android.os.StatsLog.DimensionsValue;
-import com.android.os.StatsLog.ValueBucketInfo;
-import com.android.os.StatsLog.ValueMetricData;
import com.android.tradefed.device.ITestDevice;
import com.android.tradefed.log.LogUtil;
+import com.android.tradefed.util.RunUtil;
import java.util.List;
@@ -42,54 +44,61 @@ public class ProcStatsValidationTests extends ProcStateTestCase {
private static final String TAG = "Statsd.ProcStatsValidationTests";
+ private static final String sBackgroundServiceName = "StatsdCtsBackgroundService";
+
private static final int EXTRA_WAIT_TIME_MS = 1_000; // as buffer when proc state changing.
+ private static final String DUMP_PROCSTATS_CMD = "dumpsys procstats";
+
private void toggleScreenAndSleep(final long duration) throws Exception {
final long half = duration >> 1;
- Thread.sleep(half);
- turnScreenOff();
- Thread.sleep(half);
- turnScreenOn();
+ RunUtil.getDefault().sleep(half);
+ DeviceUtils.turnScreenOff(getDevice());
+ RunUtil.getDefault().sleep(half);
+ DeviceUtils.turnScreenOn(getDevice());
}
public void testProcessStateByPulling() throws Exception {
startProcStatsTesting();
clearProcStats();
- Thread.sleep(WAIT_TIME_SHORT);
+ RunUtil.getDefault().sleep(AtomTestUtils.WAIT_TIME_SHORT);
// foreground service
executeForegroundService();
- Thread.sleep(SLEEP_OF_FOREGROUND_SERVICE + EXTRA_WAIT_TIME_MS);
+ RunUtil.getDefault().sleep(SLEEP_OF_FOREGROUND_SERVICE + EXTRA_WAIT_TIME_MS);
// background
- executeBackgroundService(ACTION_BACKGROUND_SLEEP);
- Thread.sleep(SLEEP_OF_ACTION_BACKGROUND_SLEEP + EXTRA_WAIT_TIME_MS);
+ DeviceUtils.executeBackgroundService(getDevice(), MetricsUtils.DEVICE_SIDE_TEST_PACKAGE,
+ sBackgroundServiceName, ACTION_BACKGROUND_SLEEP);
+ RunUtil.getDefault().sleep(SLEEP_OF_ACTION_BACKGROUND_SLEEP + EXTRA_WAIT_TIME_MS);
// top
executeForegroundActivity(ACTION_SLEEP_WHILE_TOP);
- Thread.sleep(SLEEP_OF_ACTION_SLEEP_WHILE_TOP + EXTRA_WAIT_TIME_MS);
+ RunUtil.getDefault().sleep(SLEEP_OF_ACTION_SLEEP_WHILE_TOP + EXTRA_WAIT_TIME_MS);
// Start extremely short-lived activity, so app goes into cache state (#1 - #3 above).
- executeBackgroundService(ACTION_END_IMMEDIATELY);
+ DeviceUtils.executeBackgroundService(getDevice(), MetricsUtils.DEVICE_SIDE_TEST_PACKAGE,
+ sBackgroundServiceName, ACTION_END_IMMEDIATELY);
final int cacheTime = 2_000; // process should be in cached state for up to this long
- Thread.sleep(cacheTime);
+ RunUtil.getDefault().sleep(cacheTime);
// foreground
// overlay should take 2 sec to appear. So this makes it 4 sec in TOP
executeForegroundActivity(ACTION_SHOW_APPLICATION_OVERLAY);
- Thread.sleep(EXTRA_WAIT_TIME_MS + 5_000);
+ RunUtil.getDefault().sleep(EXTRA_WAIT_TIME_MS + 5_000);
- Thread.sleep(60_000);
- uninstallPackage();
+ RunUtil.getDefault().sleep(60_000);
+ DeviceUtils.uninstallTestApp(getDevice(), MetricsUtils.DEVICE_SIDE_TEST_PACKAGE);
stopProcStatsTesting();
commitProcStatsToDisk();
- Thread.sleep(WAIT_TIME_SHORT);
+ RunUtil.getDefault().sleep(AtomTestUtils.WAIT_TIME_SHORT);
final String fileName = "PROCSTATSQ_PULL.pbtxt";
StatsdConfig config = createValidationUtil().getConfig(fileName);
LogUtil.CLog.d("Updating the following config:\n" + config.toString());
- uploadConfig(config);
- Thread.sleep(WAIT_TIME_SHORT);
- setAppBreadcrumbPredicate();
- Thread.sleep(WAIT_TIME_SHORT + 5_000);
+ ConfigUtils.uploadConfig(getDevice(), config.toBuilder());
+ RunUtil.getDefault().sleep(AtomTestUtils.WAIT_TIME_SHORT);
+ AtomTestUtils.sendAppBreadcrumbReportedAtom(getDevice(),
+ AtomsProto.AppBreadcrumbReported.State.START.ordinal(), 1);
+ RunUtil.getDefault().sleep(AtomTestUtils.WAIT_TIME_SHORT + 5_000);
- List<Atom> statsdData = getGaugeMetricDataList();
+ List<Atom> statsdData = ReportUtils.getGaugeMetricAtoms(getDevice());
List<android.service.procstats.ProcessStatsProto> processStatsProtoList
= getAllProcStatsProtoForStatsd();
@@ -101,7 +110,8 @@ public class ProcStatsValidationTests extends ProcStateTestCase {
String statsdPkgName = "com.android.server.cts.device.statsd";
long rssAvgStatsd = 0;
for (Atom d : statsdData) {
- for (ProcessStatsProto proc : d.getProcStats().getProcStatsSection().getProcessStatsList()) {
+ for (ProcessStatsProto proc :
+ d.getProcStats().getProcStatsSection().getProcessStatsList()) {
if (proc.getProcess().equals(statsdPkgName)) {
LogUtil.CLog.d("Got proto from statsd:");
LogUtil.CLog.d(proc.toString());
@@ -116,7 +126,7 @@ public class ProcStatsValidationTests extends ProcStateTestCase {
}
long rssAvgProcstats = 0;
- for (android.service.procstats.ProcessStatsProto process: processStatsProtoList) {
+ for (android.service.procstats.ProcessStatsProto process : processStatsProtoList) {
if (process.getProcess().equals(statsdPkgName)) {
LogUtil.CLog.d("Got proto from procstats dumpsys:");
LogUtil.CLog.d(process.toString());
@@ -139,111 +149,112 @@ public class ProcStatsValidationTests extends ProcStateTestCase {
* Temporarily disable this test as the proc stats data being pulled into the statsd
* doesn't include the pkg part now.
*
- startProcStatsTesting();
- clearProcStats();
- Thread.sleep(WAIT_TIME_SHORT);
+ startProcStatsTesting();
+ clearProcStats();
+ RunUtil.getDefault().sleep(WAIT_TIME_SHORT);
- // foreground service
- executeForegroundService();
- Thread.sleep(SLEEP_OF_FOREGROUND_SERVICE + EXTRA_WAIT_TIME_MS);
- // background
- executeBackgroundService(ACTION_BACKGROUND_SLEEP);
- Thread.sleep(SLEEP_OF_ACTION_BACKGROUND_SLEEP + EXTRA_WAIT_TIME_MS);
- // top
- executeForegroundActivity(ACTION_SLEEP_WHILE_TOP);
- Thread.sleep(SLEEP_OF_ACTION_SLEEP_WHILE_TOP + EXTRA_WAIT_TIME_MS);
- // Start extremely short-lived activity, so app goes into cache state (#1 - #3 above).
- executeBackgroundService(ACTION_END_IMMEDIATELY);
- final int cacheTime = 2_000; // process should be in cached state for up to this long
- Thread.sleep(cacheTime);
- // foreground
- // overlay should take 2 sec to appear. So this makes it 4 sec in TOP
- executeForegroundActivity(ACTION_SHOW_APPLICATION_OVERLAY);
- Thread.sleep(EXTRA_WAIT_TIME_MS + 5_000);
+ // foreground service
+ executeForegroundService();
+ RunUtil.getDefault().sleep(SLEEP_OF_FOREGROUND_SERVICE + EXTRA_WAIT_TIME_MS);
+ // background
+ executeBackgroundService(ACTION_BACKGROUND_SLEEP);
+ RunUtil.getDefault().sleep(SLEEP_OF_ACTION_BACKGROUND_SLEEP + EXTRA_WAIT_TIME_MS);
+ // top
+ executeForegroundActivity(ACTION_SLEEP_WHILE_TOP);
+ RunUtil.getDefault().sleep(SLEEP_OF_ACTION_SLEEP_WHILE_TOP + EXTRA_WAIT_TIME_MS);
+ // Start extremely short-lived activity, so app goes into cache state (#1 - #3 above).
+ executeBackgroundService(ACTION_END_IMMEDIATELY);
+ final int cacheTime = 2_000; // process should be in cached state for up to this long
+ RunUtil.getDefault().sleep(cacheTime);
+ // foreground
+ // overlay should take 2 sec to appear. So this makes it 4 sec in TOP
+ executeForegroundActivity(ACTION_SHOW_APPLICATION_OVERLAY);
+ RunUtil.getDefault().sleep(EXTRA_WAIT_TIME_MS + 5_000);
- Thread.sleep(60_000);
- uninstallPackage();
- stopProcStatsTesting();
- commitProcStatsToDisk();
- Thread.sleep(WAIT_TIME_SHORT);
+ RunUtil.getDefault().sleep(60_000);
+ uninstallPackage();
+ stopProcStatsTesting();
+ commitProcStatsToDisk();
+ RunUtil.getDefault().sleep(WAIT_TIME_SHORT);
- final String fileName = "PROCSTATSQ_PULL_PKG_PROC.pbtxt";
- StatsdConfig config = createValidationUtil().getConfig(fileName);
- LogUtil.CLog.d("Updating the following config:\n" + config.toString());
- uploadConfig(config);
- Thread.sleep(WAIT_TIME_SHORT);
- setAppBreadcrumbPredicate();
- Thread.sleep(WAIT_TIME_SHORT);
-
- List<Atom> statsdData = getGaugeMetricDataList();
- assertThat(statsdData).isNotEmpty();
- assertThat(
- statsdData.get(0).getProcStatsPkgProc().getProcStatsSection()
- .getProcessStatsList()
- ).isNotEmpty();
+ final String fileName = "PROCSTATSQ_PULL_PKG_PROC.pbtxt";
+ StatsdConfig config = createValidationUtil().getConfig(fileName);
+ LogUtil.CLog.d("Updating the following config:\n" + config.toString());
+ uploadConfig(config);
+ RunUtil.getDefault().sleep(WAIT_TIME_SHORT);
+ setAppBreadcrumbPredicate();
+ RunUtil.getDefault().sleep(WAIT_TIME_SHORT);
- // We pull directly from ProcessStatsService, so not necessary to compare every field.
- // Make sure that 1. both capture statsd package 2. spot check some values are reasonable
- LogUtil.CLog.d("======================");
+ List<Atom> statsdData = getGaugeMetricDataList();
+ assertThat(statsdData).isNotEmpty();
+ assertThat(
+ statsdData.get(0).getProcStatsPkgProc().getProcStatsSection()
+ .getProcessStatsList()
+ ).isNotEmpty();
- String statsdPkgName = "com.android.server.cts.device.statsd";
- long rssAvgStatsd = 0;
- long durationStatsd = 0;
- for (Atom d : statsdData) {
- for (ProcessStatsPackageProto pkg : d.getProcStatsPkgProc().getProcStatsSection().getPackageStatsList()) {
- if (pkg.getPackage().equals(statsdPkgName)) {
- LogUtil.CLog.d("Got proto from statsd:");
- LogUtil.CLog.d(pkg.toString());
- for (ProcessStatsProto process : pkg.getProcessStatsList()) {
- for (ProcessStatsStateProto state : process.getStatesList()) {
- if (state.getProcessState()
- == ProcessState.PROCESS_STATE_IMPORTANT_FOREGROUND) {
- durationStatsd = state.getDurationMillis();
- rssAvgStatsd = state.getRss().getAverage();
- }
- }
- }
- }
- assertThat(pkg.getServiceStatsCount()).isEqualTo(0L);
- assertThat(pkg.getAssociationStatsCount()).isEqualTo(0L);
- }
- }
+ // We pull directly from ProcessStatsService, so not necessary to compare every field.
+ // Make sure that 1. both capture statsd package 2. spot check some values are reasonable
+ LogUtil.CLog.d("======================");
- LogUtil.CLog.d("avg rss from statsd is " + rssAvgStatsd);
+ String statsdPkgName = "com.android.server.cts.device.statsd";
+ long rssAvgStatsd = 0;
+ long durationStatsd = 0;
+ for (Atom d : statsdData) {
+ for (ProcessStatsPackageProto pkg : d.getProcStatsPkgProc().getProcStatsSection()
+ .getPackageStatsList()) {
+ if (pkg.getPackage().equals(statsdPkgName)) {
+ LogUtil.CLog.d("Got proto from statsd:");
+ LogUtil.CLog.d(pkg.toString());
+ for (ProcessStatsProto process : pkg.getProcessStatsList()) {
+ for (ProcessStatsStateProto state : process.getStatesList()) {
+ if (state.getProcessState()
+ == ProcessState.PROCESS_STATE_IMPORTANT_FOREGROUND) {
+ durationStatsd = state.getDurationMillis();
+ rssAvgStatsd = state.getRss().getAverage();
+ }
+ }
+ }
+ }
+ assertThat(pkg.getServiceStatsCount()).isEqualTo(0L);
+ assertThat(pkg.getAssociationStatsCount()).isEqualTo(0L);
+ }
+ }
- List<ProcessStatsPackageProto> processStatsPackageProtoList = getAllProcStatsProto();
+ LogUtil.CLog.d("avg rss from statsd is " + rssAvgStatsd);
- long pssAvgProcstats = 0;
- long ussAvgProcstats = 0;
- long rssAvgProcstats = 0;
- long durationProcstats = 0;
- int serviceStatsCount = 0;
- int associationStatsCount = 0;
- for (ProcessStatsPackageProto pkg : processStatsPackageProtoList) {
- if (pkg.getPackage().equals(statsdPkgName)) {
- LogUtil.CLog.d("Got proto from procstats dumpsys:");
- LogUtil.CLog.d(pkg.toString());
- for (ProcessStatsProto process : pkg.getProcessStatsList()) {
- for (ProcessStatsStateProto state : process.getStatesList()) {
- if (state.getProcessState()
- == ProcessState.PROCESS_STATE_IMPORTANT_FOREGROUND) {
- durationProcstats = state.getDurationMillis();
- pssAvgProcstats = state.getPss().getAverage();
- ussAvgProcstats = state.getUss().getAverage();
- rssAvgProcstats = state.getRss().getAverage();
- }
- }
- }
- }
- serviceStatsCount += pkg.getServiceStatsCount();
- associationStatsCount += pkg.getAssociationStatsCount();
- }
- assertThat(serviceStatsCount).isGreaterThan(0);
- assertThat(associationStatsCount).isGreaterThan(0);
+ List<ProcessStatsPackageProto> processStatsPackageProtoList = getAllProcStatsProto();
- LogUtil.CLog.d("avg pss from procstats is " + pssAvgProcstats);
- assertThat(rssAvgStatsd).isEqualTo(rssAvgProcstats);
- */
+ long pssAvgProcstats = 0;
+ long ussAvgProcstats = 0;
+ long rssAvgProcstats = 0;
+ long durationProcstats = 0;
+ int serviceStatsCount = 0;
+ int associationStatsCount = 0;
+ for (ProcessStatsPackageProto pkg : processStatsPackageProtoList) {
+ if (pkg.getPackage().equals(statsdPkgName)) {
+ LogUtil.CLog.d("Got proto from procstats dumpsys:");
+ LogUtil.CLog.d(pkg.toString());
+ for (ProcessStatsProto process : pkg.getProcessStatsList()) {
+ for (ProcessStatsStateProto state : process.getStatesList()) {
+ if (state.getProcessState()
+ == ProcessState.PROCESS_STATE_IMPORTANT_FOREGROUND) {
+ durationProcstats = state.getDurationMillis();
+ pssAvgProcstats = state.getPss().getAverage();
+ ussAvgProcstats = state.getUss().getAverage();
+ rssAvgProcstats = state.getRss().getAverage();
+ }
+ }
+ }
+ }
+ serviceStatsCount += pkg.getServiceStatsCount();
+ associationStatsCount += pkg.getAssociationStatsCount();
+ }
+ assertThat(serviceStatsCount).isGreaterThan(0);
+ assertThat(associationStatsCount).isGreaterThan(0);
+
+ LogUtil.CLog.d("avg pss from procstats is " + pssAvgProcstats);
+ assertThat(rssAvgStatsd).isEqualTo(rssAvgProcstats);
+ */
}
private boolean isPssProfilingDisabled() throws Exception {
@@ -254,4 +265,54 @@ public class ProcStatsValidationTests extends ProcStateTestCase {
final String dumpsys = device.executeShellCommand("dumpsys activity settings");
return (dumpsys.contains(stringToCompare));
}
+
+ protected void clearProcStats() throws Exception {
+ getDevice().executeShellCommand("dumpsys procstats --clear");
+ }
+
+ private void startProcStatsTesting() throws Exception {
+ getDevice().executeShellCommand("dumpsys procstats --start-testing");
+ }
+
+ private void stopProcStatsTesting() throws Exception {
+ getDevice().executeShellCommand("dumpsys procstats --stop-testing");
+ }
+
+ private void commitProcStatsToDisk() throws Exception {
+ getDevice().executeShellCommand("dumpsys procstats --commit");
+ }
+
+ /**
+ * Create and return {@link ValidationTestUtil} and give it the current build.
+ */
+ public ValidationTestUtil createValidationUtil() {
+ ValidationTestUtil util = new ValidationTestUtil();
+ util.setBuild(mCtsBuild);
+ return util;
+ }
+
+ /*
+ * Get all processes' procstats statsd data in proto
+ */
+ protected List<android.service.procstats.ProcessStatsProto> getAllProcStatsProtoForStatsd()
+ throws Exception {
+ try {
+ android.service.procstats.ProcessStatsSectionProto sectionProto = MetricsUtils.getDump(
+ getDevice(),
+ android.service.procstats.ProcessStatsSectionProto.parser(),
+ String.join(" ", DUMP_PROCSTATS_CMD,
+ "--statsd"));
+ List<android.service.procstats.ProcessStatsProto> processStatsProtoList
+ = sectionProto.getProcessStatsList();
+ LogUtil.CLog.d("Got procstats:\n ");
+ for (android.service.procstats.ProcessStatsProto processStatsProto
+ : processStatsProtoList) {
+ LogUtil.CLog.d(processStatsProto.toString());
+ }
+ return processStatsProtoList;
+ } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+ LogUtil.CLog.e("Failed to dump procstats proto");
+ throw (e);
+ }
+ }
}
diff --git a/tests/src/android/cts/statsd/validation/StatsFrameworkInitializerTest.java b/tests/src/android/cts/statsd/validation/StatsFrameworkInitializerTest.java
index 0ea332e2..10dcaab0 100644
--- a/tests/src/android/cts/statsd/validation/StatsFrameworkInitializerTest.java
+++ b/tests/src/android/cts/statsd/validation/StatsFrameworkInitializerTest.java
@@ -16,13 +16,43 @@
package android.cts.statsd.validation;
-import android.cts.statsd.atom.DeviceAtomTestCase;
+import static com.google.common.truth.Truth.assertThat;
-public class StatsFrameworkInitializerTest extends DeviceAtomTestCase {
+import android.cts.statsd.metric.MetricsUtils;
+import android.cts.statsdatom.lib.DeviceUtils;
+
+import com.android.tradefed.build.IBuildInfo;
+import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IBuildReceiver;
+import com.android.tradefed.util.RunUtil;
+
+public class StatsFrameworkInitializerTest extends DeviceTestCase implements IBuildReceiver {
+
+ private IBuildInfo mCtsBuild;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ assertThat(mCtsBuild).isNotNull();
+ DeviceUtils.installTestApp(getDevice(), MetricsUtils.DEVICE_SIDE_TEST_APK,
+ MetricsUtils.DEVICE_SIDE_TEST_PACKAGE, mCtsBuild);
+ RunUtil.getDefault().sleep(1000);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.setUp();
+ DeviceUtils.uninstallTestApp(getDevice(), MetricsUtils.DEVICE_SIDE_TEST_PACKAGE);
+ }
+
+ @Override
+ public void setBuild(IBuildInfo buildInfo) {
+ mCtsBuild = buildInfo;
+ }
public void testStatsFrameworkInitializer_failsWhenCalledOutsideOfSystemServiceRegistry()
throws Exception {
- runDeviceTests(DEVICE_SIDE_TEST_PACKAGE,
+ DeviceUtils.runDeviceTests(getDevice(), MetricsUtils.DEVICE_SIDE_TEST_PACKAGE,
".StatsFrameworkInitializerTests", "testRegisterServiceWrappers_expectFail");
}
diff --git a/tests/src/android/cts/statsd/validation/ValidationTests.java b/tests/src/android/cts/statsd/validation/ValidationTests.java
index 3add66d9..dacb008b 100644
--- a/tests/src/android/cts/statsd/validation/ValidationTests.java
+++ b/tests/src/android/cts/statsd/validation/ValidationTests.java
@@ -18,7 +18,11 @@ package android.cts.statsd.validation;
import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth.assertWithMessage;
-import android.cts.statsd.atom.DeviceAtomTestCase;
+import android.cts.statsd.metric.MetricsUtils;
+import android.cts.statsdatom.lib.AtomTestUtils;
+import android.cts.statsdatom.lib.ConfigUtils;
+import android.cts.statsdatom.lib.DeviceUtils;
+import android.cts.statsdatom.lib.ReportUtils;
import android.os.BatteryPluggedStateEnum;
import android.os.BatteryStatsProto;
import android.os.UidProto;
@@ -47,9 +51,14 @@ import com.android.os.StatsLog.DurationBucketInfo;
import com.android.os.StatsLog.DurationMetricData;
import com.android.os.StatsLog.EventMetricData;
import com.android.os.StatsLog.StatsLogReport;
+import com.android.tradefed.build.IBuildInfo;
import com.android.tradefed.log.LogUtil.CLog;
+import com.android.tradefed.testtype.DeviceTestCase;
+import com.android.tradefed.testtype.IBuildReceiver;
+import com.android.tradefed.util.RunUtil;
import com.google.common.collect.Range;
+import com.google.protobuf.ExtensionRegistry;
import java.util.Arrays;
import java.util.HashMap;
@@ -60,36 +69,53 @@ import java.util.Set;
/**
* Side-by-side comparison between statsd and batterystats.
*/
-public class ValidationTests extends DeviceAtomTestCase {
+public class ValidationTests extends DeviceTestCase implements IBuildReceiver {
- private static final String TAG = "Statsd.ValidationTests";
- private static final String FEATURE_AUTOMOTIVE = "android.hardware.type.automotive";
- private static final boolean ENABLE_LOAD_TEST = false;
+ private IBuildInfo mCtsBuild;
@Override
protected void setUp() throws Exception {
super.setUp();
- turnBatteryStatsAutoResetOff(); // Turn off Battery Stats auto resetting
+ assertThat(mCtsBuild).isNotNull();
+ ConfigUtils.removeConfig(getDevice());
+ ReportUtils.clearReports(getDevice());
+ DeviceUtils.installTestApp(getDevice(), MetricsUtils.DEVICE_SIDE_TEST_APK,
+ MetricsUtils.DEVICE_SIDE_TEST_PACKAGE, mCtsBuild);
+ RunUtil.getDefault().sleep(1000);
+ DeviceUtils.turnBatteryStatsAutoResetOff(
+ getDevice()); // Turn off Battery Stats auto resetting
}
@Override
protected void tearDown() throws Exception {
- resetBatteryStatus(); // Undo any unplugDevice().
- turnScreenOn(); // Reset screen to on state
- turnBatteryStatsAutoResetOn(); // Turn Battery Stats auto resetting back on
- super.tearDown();
+ super.setUp();
+ ConfigUtils.removeConfig(getDevice());
+ ReportUtils.clearReports(getDevice());
+ DeviceUtils.uninstallTestApp(getDevice(), MetricsUtils.DEVICE_SIDE_TEST_PACKAGE);
+ DeviceUtils.resetBatteryStatus(getDevice());
+ DeviceUtils.turnScreenOn(getDevice());
+ DeviceUtils.turnBatteryStatsAutoResetOn(getDevice());
+ }
+
+ @Override
+ public void setBuild(IBuildInfo buildInfo) {
+ mCtsBuild = buildInfo;
}
+ private static final String TAG = "Statsd.ValidationTests";
+ private static final String FEATURE_AUTOMOTIVE = "android.hardware.type.automotive";
+ private static final boolean ENABLE_LOAD_TEST = false;
+
public void testPartialWakelock() throws Exception {
- if (!hasFeature(FEATURE_AUTOMOTIVE, false)) return;
+ if (!DeviceUtils.hasFeature(getDevice(), FEATURE_AUTOMOTIVE)) return;
resetBatteryStats();
- unplugDevice();
- flushBatteryStatsHandlers();
+ DeviceUtils.unplugDevice(getDevice());
+ DeviceUtils.flushBatteryStatsHandlers(getDevice());
// AoD needs to be turned off because the screen should go into an off state. But, if AoD is
// on and the device doesn't support STATE_DOZE, the screen sadly goes back to STATE_ON.
- String aodState = getAodState();
- setAodState("0");
- turnScreenOff();
+ String aodState = DeviceUtils.getAodState(getDevice());
+ DeviceUtils.setAodState(getDevice(), "0");
+ DeviceUtils.turnScreenOff(getDevice());
final int atomTag = Atom.WAKELOCK_STATE_CHANGED_FIELD_NUMBER;
Set<Integer> wakelockOn = new HashSet<>(Arrays.asList(
@@ -105,15 +131,17 @@ public class ValidationTests extends DeviceAtomTestCase {
// Add state sets to the list in order.
List<Set<Integer>> stateSet = Arrays.asList(wakelockOn, wakelockOff);
- createAndUploadConfig(atomTag, true); // True: uses attribution.
- runDeviceTests(DEVICE_SIDE_TEST_PACKAGE, ".AtomTests", "testWakelockState");
+ ConfigUtils.uploadConfigForPushedAtomWithUid(getDevice(),
+ MetricsUtils.DEVICE_SIDE_TEST_PACKAGE, atomTag, true); // True: uses attribution.
+ DeviceUtils.runDeviceTests(getDevice(), MetricsUtils.DEVICE_SIDE_TEST_PACKAGE, ".AtomTests",
+ "testWakelockState");
// Sorted list of events in order in which they occurred.
- List<EventMetricData> data = getEventMetricDataList();
+ List<EventMetricData> data = ReportUtils.getEventMetricDataList(getDevice());
//=================== verify that statsd is correct ===============//
// Assert that the events happened in the expected order.
- assertStatesOccurred(stateSet, data, WAIT_TIME_SHORT,
+ AtomTestUtils.assertStatesOccurred(stateSet, data,
atom -> atom.getWakelockStateChanged().getState().getNumber());
for (EventMetricData event : data) {
@@ -126,28 +154,30 @@ public class ValidationTests extends DeviceAtomTestCase {
@RestrictedBuildTest
public void testPartialWakelockDuration() throws Exception {
- if (!hasFeature(FEATURE_AUTOMOTIVE, false)) return;
+ if (!DeviceUtils.hasFeature(getDevice(), FEATURE_AUTOMOTIVE)) return;
// getUid() needs shell command via ADB. turnScreenOff() sometimes let system go to suspend.
// ADB disconnection causes failure of getUid(). Move up here before turnScreenOff().
- final int EXPECTED_UID = getUid();
+ final int EXPECTED_UID = DeviceUtils.getAppUid(getDevice(),
+ MetricsUtils.DEVICE_SIDE_TEST_PACKAGE);
- turnScreenOn(); // To ensure that the ScreenOff later gets logged.
+ DeviceUtils.turnScreenOn(getDevice()); // To ensure that the ScreenOff later gets logged.
// AoD needs to be turned off because the screen should go into an off state. But, if AoD is
// on and the device doesn't support STATE_DOZE, the screen sadly goes back to STATE_ON.
- String aodState = getAodState();
- setAodState("0");
+ String aodState = DeviceUtils.getAodState(getDevice());
+ DeviceUtils.setAodState(getDevice(), "0");
uploadWakelockDurationBatteryStatsConfig(TimeUnit.CTS);
- Thread.sleep(WAIT_TIME_SHORT);
+ RunUtil.getDefault().sleep(AtomTestUtils.WAIT_TIME_SHORT);
resetBatteryStats();
- unplugDevice();
- turnScreenOff();
- flushBatteryStatsHandlers();
+ DeviceUtils.unplugDevice(getDevice());
+ DeviceUtils.turnScreenOff(getDevice());
+ DeviceUtils.flushBatteryStatsHandlers(getDevice());
- Thread.sleep(WAIT_TIME_SHORT);
+ RunUtil.getDefault().sleep(AtomTestUtils.WAIT_TIME_SHORT);
- runDeviceTests(DEVICE_SIDE_TEST_PACKAGE, ".AtomTests", "testWakelockState");
- Thread.sleep(WAIT_TIME_LONG); // Make sure the one second bucket has ended.
+ DeviceUtils.runDeviceTests(getDevice(), MetricsUtils.DEVICE_SIDE_TEST_PACKAGE, ".AtomTests",
+ "testWakelockState");
+ RunUtil.getDefault().sleep(AtomTestUtils.WAIT_TIME_LONG); // Make sure the one second bucket has ended.
final String EXPECTED_TAG = "StatsdPartialWakelock";
@@ -169,33 +199,35 @@ public class ValidationTests extends DeviceAtomTestCase {
EXPECTED_UID, EXPECTED_TAG
).that(statsdDurationMs).isIn(Range.closed((long) MIN_DURATION, (long) MAX_DURATION));
- setAodState(aodState); // restores AOD to initial state.
+ DeviceUtils.setAodState(getDevice(), aodState); // restores AOD to initial state.
}
public void testPartialWakelockLoad() throws Exception {
if (!ENABLE_LOAD_TEST) return;
- turnScreenOn(); // To ensure that the ScreenOff later gets logged.
+ DeviceUtils.turnScreenOn(getDevice()); // To ensure that the ScreenOff later gets logged.
uploadWakelockDurationBatteryStatsConfig(TimeUnit.CTS);
- Thread.sleep(WAIT_TIME_SHORT);
+ RunUtil.getDefault().sleep(AtomTestUtils.WAIT_TIME_SHORT);
resetBatteryStats();
- unplugDevice();
- turnScreenOff();
+ DeviceUtils.unplugDevice(getDevice());
+ DeviceUtils.turnScreenOff(getDevice());
- runDeviceTests(DEVICE_SIDE_TEST_PACKAGE, ".AtomTests", "testWakelockLoad");
+ DeviceUtils.runDeviceTests(getDevice(), MetricsUtils.DEVICE_SIDE_TEST_PACKAGE, ".AtomTests",
+ "testWakelockLoad");
// Give time for stuck wakelocks to increase duration.
- Thread.sleep(10_000);
+ RunUtil.getDefault().sleep(10_000);
final String EXPECTED_TAG = "StatsdPartialWakelock";
- final int EXPECTED_UID = getUid();
+ final int EXPECTED_UID = DeviceUtils.getAppUid(getDevice(),
+ MetricsUtils.DEVICE_SIDE_TEST_PACKAGE);
final int NUM_THREADS = 16;
final int NUM_COUNT_PER_THREAD = 1000;
final int MAX_DURATION_MS = 15_000;
final int MIN_DURATION_MS = 1_000;
- BatteryStatsProto batterystatsProto = getBatteryStatsProto();
- HashMap<Integer, HashMap<Long, Long>> statsdWakelockData = getStatsdWakelockData();
+// BatteryStatsProto batterystatsProto = getBatteryStatsProto();
+// HashMap<Integer, HashMap<Long, Long>> statsdWakelockData = getStatsdWakelockData();
// TODO: this fails because we only have the hashes of the wakelock tags in statsd.
// If we want to run this test, we need to fix this.
@@ -256,7 +288,8 @@ public class ValidationTests extends DeviceAtomTestCase {
// TODO: Refactor these into some utils class.
public HashMap<Integer, HashMap<Long, Long>> getStatsdWakelockData() throws Exception {
- StatsLogReport report = getStatsLogReport();
+ StatsLogReport report = ReportUtils.getStatsLogReport(getDevice(),
+ ExtensionRegistry.getEmptyRegistry());
CLog.d("Received the following stats log report: \n" + report.toString());
// Stores total duration of each wakelock across buckets.
@@ -607,13 +640,14 @@ public class ValidationTests extends DeviceAtomTestCase {
.addPredicate(screenIsOffId)
.addPredicate(deviceIsUnpluggedId));
- StatsdConfig.Builder builder = createConfigBuilder();
+ StatsdConfig.Builder builder = ConfigUtils.createConfigBuilder(
+ MetricsUtils.DEVICE_SIDE_TEST_PACKAGE);
builder.addDurationMetric(DurationMetric.newBuilder()
- .setId(metricId)
- .setWhat(partialWakelockIsOnId)
- .setCondition(screenOffBatteryOnId)
- .setDimensionsInWhat(dimensions)
- .setBucket(bucketsize))
+ .setId(metricId)
+ .setWhat(partialWakelockIsOnId)
+ .setCondition(screenOffBatteryOnId)
+ .setDimensionsInWhat(dimensions)
+ .setBucket(bucketsize))
.addAtomMatcher(wakelockAcquire)
.addAtomMatcher(wakelockChangeAcquire)
.addAtomMatcher(wakelockRelease)
@@ -639,6 +673,10 @@ public class ValidationTests extends DeviceAtomTestCase {
.addPredicate(screenIsOff)
.addPredicate(screenOffBatteryOn);
- uploadConfig(builder);
+ ConfigUtils.uploadConfig(getDevice(), builder);
+ }
+
+ private void resetBatteryStats() throws Exception {
+ getDevice().executeShellCommand("dumpsys batterystats --reset");
}
}