1 /* 2 * Copyright (C) 2018 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package android.cts.statsd.metric; 17 18 import android.cts.statsd.atom.DeviceAtomTestCase; 19 20 import com.android.internal.os.StatsdConfigProto; 21 import com.android.internal.os.StatsdConfigProto.AtomMatcher; 22 import com.android.internal.os.StatsdConfigProto.FieldFilter; 23 import com.android.internal.os.StatsdConfigProto.FieldMatcher; 24 import com.android.internal.os.StatsdConfigProto.FieldValueMatcher; 25 import com.android.internal.os.StatsdConfigProto.Predicate; 26 import com.android.internal.os.StatsdConfigProto.SimpleAtomMatcher; 27 import com.android.internal.os.StatsdConfigProto.SimplePredicate; 28 import com.android.os.AtomsProto.AppBreadcrumbReported; 29 import com.android.os.AtomsProto.Atom; 30 import com.android.os.StatsLog.GaugeMetricData; 31 import com.android.os.StatsLog.StatsLogReport; 32 import com.android.tradefed.log.LogUtil; 33 34 public class GaugeMetricsTests extends DeviceAtomTestCase { 35 36 private static final int APP_BREADCRUMB_REPORTED_A_MATCH_START_ID = 0; 37 private static final int APP_BREADCRUMB_REPORTED_A_MATCH_STOP_ID = 1; 38 private static final int APP_BREADCRUMB_REPORTED_B_MATCH_START_ID = 2; 39 40 public void testGaugeMetric() throws Exception { 41 if (statsdDisabled()) { 42 return; 43 } 44 // Add AtomMatcher's. 45 AtomMatcher startAtomMatcher = 46 MetricsUtils.startAtomMatcher(APP_BREADCRUMB_REPORTED_A_MATCH_START_ID); 47 AtomMatcher stopAtomMatcher = 48 MetricsUtils.stopAtomMatcher(APP_BREADCRUMB_REPORTED_A_MATCH_STOP_ID); 49 AtomMatcher atomMatcher = 50 MetricsUtils.simpleAtomMatcher(APP_BREADCRUMB_REPORTED_B_MATCH_START_ID); 51 52 StatsdConfigProto.StatsdConfig.Builder builder = createConfigBuilder(); 53 builder.addAtomMatcher(startAtomMatcher); 54 builder.addAtomMatcher(stopAtomMatcher); 55 builder.addAtomMatcher(atomMatcher); 56 57 // Add Predicate's. 58 SimplePredicate simplePredicate = SimplePredicate.newBuilder() 59 .setStart(APP_BREADCRUMB_REPORTED_A_MATCH_START_ID) 60 .setStop(APP_BREADCRUMB_REPORTED_A_MATCH_STOP_ID) 61 .build(); 62 Predicate predicate = Predicate.newBuilder() 63 .setId(MetricsUtils.StringToId("Predicate")) 64 .setSimplePredicate(simplePredicate) 65 .build(); 66 builder.addPredicate(predicate); 67 68 // Add GaugeMetric. 69 FieldMatcher fieldMatcher = 70 FieldMatcher.newBuilder().setField(APP_BREADCRUMB_REPORTED_B_MATCH_START_ID).build(); 71 builder.addGaugeMetric( 72 StatsdConfigProto.GaugeMetric.newBuilder() 73 .setId(MetricsUtils.GAUGE_METRIC_ID) 74 .setWhat(APP_BREADCRUMB_REPORTED_B_MATCH_START_ID) 75 .setCondition(predicate.getId()) 76 .setGaugeFieldsFilter( 77 FieldFilter.newBuilder().setIncludeAll(false).setFields(fieldMatcher).build()) 78 .setDimensionsInWhat( 79 FieldMatcher.newBuilder() 80 .setField(APP_BREADCRUMB_REPORTED_B_MATCH_START_ID) 81 .addChild(FieldMatcher.newBuilder() 82 .setField(AppBreadcrumbReported.STATE_FIELD_NUMBER) 83 .build()) 84 .build()) 85 .setBucket(StatsdConfigProto.TimeUnit.CTS) 86 .build()); 87 88 // Upload config. 89 uploadConfig(builder); 90 91 // Create AppBreadcrumbReported Start/Stop events. 92 doAppBreadcrumbReportedStart(0); 93 Thread.sleep(10); 94 doAppBreadcrumbReportedStart(1); 95 Thread.sleep(10); 96 doAppBreadcrumbReportedStart(2); 97 Thread.sleep(2000); 98 doAppBreadcrumbReportedStop(2); 99 Thread.sleep(10); 100 doAppBreadcrumbReportedStop(0); 101 Thread.sleep(10); 102 doAppBreadcrumbReportedStop(1); 103 doAppBreadcrumbReportedStart(2); 104 Thread.sleep(10); 105 doAppBreadcrumbReportedStart(1); 106 Thread.sleep(2000); 107 doAppBreadcrumbReportedStop(2); 108 Thread.sleep(10); 109 doAppBreadcrumbReportedStop(1); 110 111 // Wait for the metrics to propagate to statsd. 112 Thread.sleep(2000); 113 114 StatsLogReport metricReport = getStatsLogReport(); 115 LogUtil.CLog.d("Got the following gauge metric data: " + metricReport.toString()); 116 assertEquals(MetricsUtils.GAUGE_METRIC_ID, metricReport.getMetricId()); 117 assertTrue(metricReport.hasGaugeMetrics()); 118 StatsLogReport.GaugeMetricDataWrapper gaugeData = metricReport.getGaugeMetrics(); 119 assertEquals(gaugeData.getDataCount(), 1); 120 121 int bucketCount = gaugeData.getData(0).getBucketInfoCount(); 122 GaugeMetricData data = gaugeData.getData(0); 123 assertTrue(bucketCount > 2); 124 MetricsUtils.assertBucketTimePresent(data.getBucketInfo(0)); 125 assertEquals(data.getBucketInfo(0).getAtomCount(), 1); 126 assertEquals(data.getBucketInfo(0).getAtom(0).getAppBreadcrumbReported().getLabel(), 0); 127 assertEquals(data.getBucketInfo(0).getAtom(0).getAppBreadcrumbReported().getState(), 128 AppBreadcrumbReported.State.START); 129 130 MetricsUtils.assertBucketTimePresent(data.getBucketInfo(1)); 131 assertEquals(data.getBucketInfo(1).getAtomCount(), 1); 132 133 MetricsUtils.assertBucketTimePresent(data.getBucketInfo(bucketCount-1)); 134 assertEquals(data.getBucketInfo(bucketCount - 1).getAtomCount(), 1); 135 assertEquals( 136 data.getBucketInfo(bucketCount - 1).getAtom(0).getAppBreadcrumbReported().getLabel(), 2); 137 assertEquals( 138 data.getBucketInfo(bucketCount - 1).getAtom(0).getAppBreadcrumbReported().getState(), 139 AppBreadcrumbReported.State.STOP); 140 } 141 } 142