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 =