Merge "Add e2e testing for GaugeMetrics to cts test"
diff --git a/hostsidetests/statsd/src/android/cts/statsd/metric/GaugeMetricsTests.java b/hostsidetests/statsd/src/android/cts/statsd/metric/GaugeMetricsTests.java
new file mode 100644
index 0000000..c963d40
--- /dev/null
+++ b/hostsidetests/statsd/src/android/cts/statsd/metric/GaugeMetricsTests.java
@@ -0,0 +1,172 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.cts.statsd.metric;
+
+import android.cts.statsd.atom.DeviceAtomTestCase;
+
+import com.android.internal.os.StatsdConfigProto;
+import com.android.internal.os.StatsdConfigProto.AtomMatcher;
+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.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.GaugeMetricData;
+import com.android.os.StatsLog.StatsLogReport;
+
+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 = startAtomMatcher(APP_BREADCRUMB_REPORTED_A_MATCH_START_ID);
+ AtomMatcher stopAtomMatcher = stopAtomMatcher(APP_BREADCRUMB_REPORTED_A_MATCH_STOP_ID);
+ AtomMatcher atomMatcher = simpleAtomMatcher(APP_BREADCRUMB_REPORTED_B_MATCH_START_ID);
+
+ StatsdConfigProto.StatsdConfig.Builder builder = MetricsUtils.getEmptyConfig();
+ 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(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();
+ assertEquals(MetricsUtils.GAUGE_METRIC_ID, metricReport.getMetricId());
+ assertTrue(metricReport.hasGaugeMetrics());
+ StatsLogReport.GaugeMetricDataWrapper gaugeData = metricReport.getGaugeMetrics();
+ assertEquals(gaugeData.getDataCount(), 1);
+
+ int bucketCount = gaugeData.getData(0).getBucketInfoCount();
+ GaugeMetricData data = gaugeData.getData(0);
+ assertTrue(bucketCount > 2);
+ assertTrue(data.getBucketInfo(0).hasStartBucketNanos());
+ assertTrue(data.getBucketInfo(0).hasEndBucketNanos());
+ assertEquals(data.getBucketInfo(0).getAtomCount(), 1);
+ assertEquals(data.getBucketInfo(0).getAtom(0).getAppBreadcrumbReported().getLabel(), 0);
+ assertEquals(data.getBucketInfo(0).getAtom(0).getAppBreadcrumbReported().getState(),
+ AppBreadcrumbReported.State.START);
+
+ assertTrue(data.getBucketInfo(1).hasStartBucketNanos());
+ assertTrue(data.getBucketInfo(1).hasEndBucketNanos());
+ assertEquals(data.getBucketInfo(1).getAtomCount(), 1);
+
+ assertTrue(data.getBucketInfo(bucketCount - 1).hasStartBucketNanos());
+ assertTrue(data.getBucketInfo(bucketCount - 1).hasEndBucketNanos());
+ assertEquals(data.getBucketInfo(bucketCount - 1).getAtomCount(), 1);
+ assertEquals(
+ data.getBucketInfo(bucketCount - 1).getAtom(0).getAppBreadcrumbReported().getLabel(), 2);
+ assertEquals(
+ data.getBucketInfo(bucketCount - 1).getAtom(0).getAppBreadcrumbReported().getState(),
+ AppBreadcrumbReported.State.STOP);
+ }
+
+ private AtomMatcher startAtomMatcher(int id) {
+ return AtomMatcher.newBuilder()
+ .setId(id)
+ .setSimpleAtomMatcher(
+ SimpleAtomMatcher.newBuilder()
+ .setAtomId(Atom.APP_BREADCRUMB_REPORTED_FIELD_NUMBER)
+ .addFieldValueMatcher(FieldValueMatcher.newBuilder()
+ .setField(AppBreadcrumbReported.STATE_FIELD_NUMBER)
+ .setEqInt(AppBreadcrumbReported.State.START.ordinal())))
+ .build();
+ }
+
+ private AtomMatcher stopAtomMatcher(int id) {
+ return AtomMatcher.newBuilder()
+ .setId(id)
+ .setSimpleAtomMatcher(
+ SimpleAtomMatcher.newBuilder()
+ .setAtomId(Atom.APP_BREADCRUMB_REPORTED_FIELD_NUMBER)
+ .addFieldValueMatcher(FieldValueMatcher.newBuilder()
+ .setField(AppBreadcrumbReported.STATE_FIELD_NUMBER)
+ .setEqInt(AppBreadcrumbReported.State.STOP.ordinal())))
+ .build();
+ }
+
+ private AtomMatcher simpleAtomMatcher(int id) {
+ return AtomMatcher.newBuilder()
+ .setId(id)
+ .setSimpleAtomMatcher(
+ SimpleAtomMatcher.newBuilder().setAtomId(Atom.APP_BREADCRUMB_REPORTED_FIELD_NUMBER))
+ .build();
+ }
+
+ private long StringToId(String str) {
+ return str.hashCode();
+ }
+}
diff --git a/hostsidetests/statsd/src/android/cts/statsd/metric/MetricsUtils.java b/hostsidetests/statsd/src/android/cts/statsd/metric/MetricsUtils.java
index e7b21a6..9c68b9c 100644
--- a/hostsidetests/statsd/src/android/cts/statsd/metric/MetricsUtils.java
+++ b/hostsidetests/statsd/src/android/cts/statsd/metric/MetricsUtils.java
@@ -22,6 +22,7 @@
public class MetricsUtils {
public static final long COUNT_METRIC_ID = 3333;
public static final long DURATION_METRIC_ID = 4444;
+ public static final long GAUGE_METRIC_ID = 5555;
public static StatsdConfigProto.StatsdConfig.Builder getEmptyConfig() {
StatsdConfigProto.StatsdConfig.Builder builder =