113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster// Copyright (C) 2017 The Android Open Source Project 213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster// 313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster// Licensed under the Apache License, Version 2.0 (the "License"); 413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster// you may not use this file except in compliance with the License. 513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster// You may obtain a copy of the License at 613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster// 713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster// http://www.apache.org/licenses/LICENSE-2.0 813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster// 913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster// Unless required by applicable law or agreed to in writing, software 1013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster// distributed under the License is distributed on an "AS IS" BASIS, 1113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster// See the License for the specific language governing permissions and 1313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster// limitations under the License. 1413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 1513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster#include <gtest/gtest.h> 1613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 1713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster#include "src/StatsLogProcessor.h" 1813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster#include "src/stats_log_util.h" 1913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster#include "tests/statsd_test_util.h" 2013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 2113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster#include <vector> 2213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 2313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangsternamespace android { 2413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangsternamespace os { 2513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangsternamespace statsd { 2613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 2713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster#ifdef __ANDROID__ 2813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 2913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangsternamespace { 3013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 3113fb7e4eeaf7aee408821afe7ee55a5167e49e59YangsterStatsdConfig CreateDurationMetricConfig_NoLink_SimpleCondition( 3213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster DurationMetric::AggregationType aggregationType, bool addExtraDimensionInCondition) { 3313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster StatsdConfig config; 348faaa01489d81b815e62e4416e78e4b5500b487aDavid Chen config.add_allowed_log_source("AID_ROOT"); // LogEvent defaults to UID of root. 3513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster *config.add_atom_matcher() = CreateStartScheduledJobAtomMatcher(); 3613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster *config.add_atom_matcher() = CreateFinishScheduledJobAtomMatcher(); 3713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster *config.add_atom_matcher() = CreateSyncStartAtomMatcher(); 3813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster *config.add_atom_matcher() = CreateSyncEndAtomMatcher(); 3913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 4013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster auto scheduledJobPredicate = CreateScheduledJobPredicate(); 4113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster auto dimensions = scheduledJobPredicate.mutable_simple_predicate()->mutable_dimensions(); 4213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster dimensions->set_field(android::util::SCHEDULED_JOB_STATE_CHANGED); 4313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster dimensions->add_child()->set_field(2); // job name field. 4413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 4513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster auto isSyncingPredicate = CreateIsSyncingPredicate(); 4613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster auto syncDimension = isSyncingPredicate.mutable_simple_predicate()->mutable_dimensions(); 4713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster *syncDimension = CreateAttributionUidAndTagDimensions(android::util::SYNC_STATE_CHANGED, 4813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster {Position::FIRST}); 4913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster if (addExtraDimensionInCondition) { 5013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster syncDimension->add_child()->set_field(2 /* name field*/); 5113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster } 5213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 5313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster *config.add_predicate() = scheduledJobPredicate; 5413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster *config.add_predicate() = isSyncingPredicate; 5513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 5613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster auto metric = config.add_duration_metric(); 5713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster metric->set_bucket(FIVE_MINUTES); 5813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster metric->set_id(StringToId("scheduledJob")); 5913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster metric->set_what(scheduledJobPredicate.id()); 6013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster metric->set_condition(isSyncingPredicate.id()); 6113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster metric->set_aggregation_type(aggregationType); 6213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster auto dimensionWhat = metric->mutable_dimensions_in_what(); 6313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster dimensionWhat->set_field(android::util::SCHEDULED_JOB_STATE_CHANGED); 6413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster dimensionWhat->add_child()->set_field(2); // job name field. 6513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster *metric->mutable_dimensions_in_condition() = CreateAttributionUidAndTagDimensions( 6613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster android::util::SYNC_STATE_CHANGED, {Position::FIRST}); 6713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster return config; 6813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster} 6913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 7013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster} // namespace 7113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 7213fb7e4eeaf7aee408821afe7ee55a5167e49e59YangsterTEST(DimensionInConditionE2eTest, TestDurationMetric_NoLink_SimpleCondition) { 7313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster for (bool isDimensionInConditionSubSetOfConditionTrackerDimension : {true, false}) { 7413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster for (auto aggregationType : {DurationMetric::SUM, DurationMetric::MAX_SPARSE}) { 7513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster ConfigKey cfgKey; 7613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster auto config = CreateDurationMetricConfig_NoLink_SimpleCondition( 7713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster aggregationType, isDimensionInConditionSubSetOfConditionTrackerDimension); 7813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster int64_t bucketStartTimeNs = 10000000000; 7913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster int64_t bucketSizeNs = 8013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster TimeUnitToBucketSizeInMillis(config.duration_metric(0).bucket()) * 1000000LL; 8113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 8213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster auto processor = CreateStatsLogProcessor( 8315f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac bucketStartTimeNs, bucketStartTimeNs, config, cfgKey); 8413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(processor->mMetricsManagers.size(), 1u); 8513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_TRUE(processor->mMetricsManagers.begin()->second->isConfigValid()); 8613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 8713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster std::vector<AttributionNodeInternal> attributions1 = { 8813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster CreateAttribution(111, "App1"), CreateAttribution(222, "GMSCoreModule1"), 8913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster CreateAttribution(222, "GMSCoreModule2")}; 9013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 9113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster std::vector<AttributionNodeInternal> attributions2 = { 9213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster CreateAttribution(333, "App2"), CreateAttribution(222, "GMSCoreModule1"), 9313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster CreateAttribution(555, "GMSCoreModule2")}; 9413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 9513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster std::vector<std::unique_ptr<LogEvent>> events; 9613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 9713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateStartScheduledJobEvent( 9813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster {CreateAttribution(9999, "")}, "job0", bucketStartTimeNs + 1)); 9913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateFinishScheduledJobEvent( 10013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster {CreateAttribution(9999, "")}, "job0",bucketStartTimeNs + 101)); 10113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 10213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateStartScheduledJobEvent( 10313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster {CreateAttribution(9999, "")}, "job2", bucketStartTimeNs + 201)); 10413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateFinishScheduledJobEvent( 10513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster {CreateAttribution(9999, "")}, "job2",bucketStartTimeNs + 500)); 10613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 10713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateStartScheduledJobEvent( 10813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster {CreateAttribution(8888, "")}, "job2", bucketStartTimeNs + 600)); 10913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateFinishScheduledJobEvent( 11013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster {CreateAttribution(8888, "")}, "job2",bucketStartTimeNs + bucketSizeNs + 850)); 11113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 11213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateStartScheduledJobEvent( 11313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster {CreateAttribution(8888, "")}, "job1", bucketStartTimeNs + bucketSizeNs + 600)); 11413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateFinishScheduledJobEvent( 11513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster {CreateAttribution(8888, "")}, "job1", bucketStartTimeNs + bucketSizeNs + 900)); 11613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 11713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateSyncStartEvent(attributions1, "ReadEmail", 11813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + 10)); 11913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateSyncEndEvent(attributions1, "ReadEmail", 12013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + 50)); 12113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 12213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateSyncStartEvent(attributions1, "ReadEmail", 12313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + 200)); 12413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateSyncEndEvent(attributions1, "ReadEmail", 12513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs + 300)); 12613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 12713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateSyncStartEvent(attributions1, "ReadDoc", 12813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + 400)); 12913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateSyncEndEvent(attributions1, "ReadDoc", 13013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs - 1)); 13113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 13213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateSyncStartEvent(attributions2, "ReadEmail", 13313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + 401)); 13413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateSyncEndEvent(attributions2, "ReadEmail", 13513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs + 700)); 13613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 13713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster sortLogEventsByTimestamp(&events); 13813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 13913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster for (const auto& event : events) { 14013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster processor->OnLogEvent(event.get()); 14113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster } 14213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 14313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster ConfigMetricsReportList reports; 14413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster vector<uint8_t> buffer; 14556ae0d9a48212c6e886e5887a6f9191f3020af40David Chen processor->onDumpReport(cfgKey, bucketStartTimeNs + 2 * bucketSizeNs + 1, false, 146e36018b2724b5ae40180f956b16c3e276855b99bChenjie Yu ADB_DUMP, &buffer); 14713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_TRUE(buffer.size() > 0); 14813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size())); 1499def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac backfillDimensionPath(&reports); 1509def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac backfillStringInReport(&reports); 1519def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac backfillStartEndTimestamp(&reports); 15213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 15313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(reports.reports_size(), 1); 15413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(reports.reports(0).metrics_size(), 1); 15513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster StatsLogReport::DurationMetricDataWrapper metrics; 15613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster sortMetricDataByDimensionsValue( 15713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster reports.reports(0).metrics(0).duration_metrics(), &metrics); 15813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster if (aggregationType == DurationMetric::SUM) { 15913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(metrics.data_size(), 4); 16013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster auto data = metrics.data(0); 16113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.dimensions_in_what().field(), 16213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster android::util::SCHEDULED_JOB_STATE_CHANGED); 16313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).field(), 16413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 2); // job name field 16513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).value_str(), 16613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster "job0"); // job name 16713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster ValidateAttributionUidAndTagDimension(data.dimensions_in_condition(), 16813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster android::util::SYNC_STATE_CHANGED, 111, "App1"); 16913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info_size(), 1); 17013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).duration_nanos(), 40); 17113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), 17213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs); 17313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(), 17413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 17513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 17613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data = metrics.data(1); 17713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.dimensions_in_what().field(), 17813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster android::util::SCHEDULED_JOB_STATE_CHANGED); 17913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).field(), 18013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 2); // job name field 18113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).value_str(), 18213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster "job1"); // job name 18313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster ValidateAttributionUidAndTagDimension(data.dimensions_in_condition(), 18413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster android::util::SYNC_STATE_CHANGED, 333, "App2"); 18513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info_size(), 1); 18613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).duration_nanos(), 100); 18713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), 18813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 18913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(), 19013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + 2 * bucketSizeNs); 19113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 19213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data = metrics.data(2); 19313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.dimensions_in_what().field(), 19413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster android::util::SCHEDULED_JOB_STATE_CHANGED); 19513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).field(), 19613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 2); // job name field 19713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).value_str(), 19813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster "job2"); // job name 19913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster ValidateAttributionUidAndTagDimension(data.dimensions_in_condition(), 20013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster android::util::SYNC_STATE_CHANGED, 111, "App1"); 20113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info_size(), 2); 20213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), bucketStartTimeNs); 20313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(), 20413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 20513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).duration_nanos(), 500 - 201 + bucketSizeNs - 600); 20613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).duration_nanos(), 300); 20713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).start_bucket_elapsed_nanos(), 20813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 20913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).end_bucket_elapsed_nanos(), 21013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + 2 * bucketSizeNs); 21113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 21213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data = metrics.data(3); 21313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.dimensions_in_what().field(), 21413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster android::util::SCHEDULED_JOB_STATE_CHANGED); 21513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).field(), 21613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 2); // job name field 21713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).value_str(), 21813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster "job2"); // job name 21913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster ValidateAttributionUidAndTagDimension(data.dimensions_in_condition(), 22013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster android::util::SYNC_STATE_CHANGED, 333, "App2"); 22113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info_size(), 2); 22213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).duration_nanos(), 500 - 401 + bucketSizeNs - 600); 22313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), bucketStartTimeNs); 22413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(), 22513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 22613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).duration_nanos(), 700); 22713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).start_bucket_elapsed_nanos(), 22813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 22913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).end_bucket_elapsed_nanos(), 23013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + 2 * bucketSizeNs); 23113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster } else { 23213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(metrics.data_size(), 4); 23313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster auto data = metrics.data(0); 23413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.dimensions_in_what().field(), 23513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster android::util::SCHEDULED_JOB_STATE_CHANGED); 23613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).field(), 23713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 2); // job name field 23813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).value_str(), 23913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster "job0"); // job name 24013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster ValidateAttributionUidAndTagDimension(data.dimensions_in_condition(), 24113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster android::util::SYNC_STATE_CHANGED, 111, "App1"); 24213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info_size(), 1); 24313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).duration_nanos(), 40); 24413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), 24513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs); 24613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(), 24713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 24813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 24913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data = metrics.data(1); 25013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.dimensions_in_what().field(), 25113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster android::util::SCHEDULED_JOB_STATE_CHANGED); 25213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).field(), 25313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 2); // job name field 25413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).value_str(), 25513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster "job1"); // job name 25613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster ValidateAttributionUidAndTagDimension(data.dimensions_in_condition(), 25713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster android::util::SYNC_STATE_CHANGED, 333, "App2"); 25813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info_size(), 1); 25913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).duration_nanos(), 100); 26013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), 26113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 26213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(), 26313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + 2 * bucketSizeNs); 26413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 26513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data = metrics.data(2); 26613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.dimensions_in_what().field(), 26713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster android::util::SCHEDULED_JOB_STATE_CHANGED); 26813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).field(), 26913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 2); // job name field 27013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).value_str(), 27113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster "job2"); // job name 27213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster ValidateAttributionUidAndTagDimension(data.dimensions_in_condition(), 27313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster android::util::SYNC_STATE_CHANGED, 111, "App1"); 27413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info_size(), 2); 27513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), bucketStartTimeNs); 27613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(), 27713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 27813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).duration_nanos(), 500 - 201); 27913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).duration_nanos(), bucketSizeNs - 600 + 300); 28013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).start_bucket_elapsed_nanos(), 28113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 28213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).end_bucket_elapsed_nanos(), 28313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + 2 * bucketSizeNs); 28413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 28513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data = metrics.data(3); 28613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.dimensions_in_what().field(), 28713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster android::util::SCHEDULED_JOB_STATE_CHANGED); 28813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).field(), 28913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 2); // job name field 29013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).value_str(), 29113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster "job2"); // job name 29213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster ValidateAttributionUidAndTagDimension(data.dimensions_in_condition(), 29313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster android::util::SYNC_STATE_CHANGED, 333, "App2"); 29413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info_size(), 2); 29513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).duration_nanos(), 500 - 401 ); 29613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), bucketStartTimeNs); 29713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(), 29813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 29913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).duration_nanos(), bucketSizeNs - 600 + 700); 30013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).start_bucket_elapsed_nanos(), 30113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 30213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).end_bucket_elapsed_nanos(), 30313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + 2 * bucketSizeNs); 30413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster } 30513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster } 30613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster } 30713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster} 30813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 30913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangsternamespace { 31013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 31113fb7e4eeaf7aee408821afe7ee55a5167e49e59YangsterStatsdConfig createDurationMetric_Link_SimpleConditionConfig( 31213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster DurationMetric::AggregationType aggregationType, bool addExtraDimensionInCondition) { 31313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster StatsdConfig config; 3148faaa01489d81b815e62e4416e78e4b5500b487aDavid Chen config.add_allowed_log_source("AID_ROOT"); // LogEvent defaults to UID of root. 31513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster *config.add_atom_matcher() = CreateStartScheduledJobAtomMatcher(); 31613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster *config.add_atom_matcher() = CreateFinishScheduledJobAtomMatcher(); 31713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster *config.add_atom_matcher() = CreateSyncStartAtomMatcher(); 31813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster *config.add_atom_matcher() = CreateSyncEndAtomMatcher(); 31913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 32013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster auto scheduledJobPredicate = CreateScheduledJobPredicate(); 32113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster auto dimensions = scheduledJobPredicate.mutable_simple_predicate()->mutable_dimensions(); 32213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster *dimensions = CreateAttributionUidDimensions( 32313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster android::util::SCHEDULED_JOB_STATE_CHANGED, {Position::FIRST}); 32413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster dimensions->add_child()->set_field(2); // job name field. 32513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 32613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster auto isSyncingPredicate = CreateIsSyncingPredicate(); 32713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster auto syncDimension = isSyncingPredicate.mutable_simple_predicate()->mutable_dimensions(); 32813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster *syncDimension = CreateAttributionUidDimensions( 32913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster android::util::SYNC_STATE_CHANGED, {Position::FIRST}); 33013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster if (addExtraDimensionInCondition) { 33113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster syncDimension->add_child()->set_field(2 /* name field*/); 33213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster } 33313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 33413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster *config.add_predicate() = scheduledJobPredicate; 33513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster *config.add_predicate() = isSyncingPredicate; 33613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 33713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster auto metric = config.add_duration_metric(); 33813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster metric->set_bucket(FIVE_MINUTES); 33913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster metric->set_id(StringToId("scheduledJob")); 34013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster metric->set_what(scheduledJobPredicate.id()); 34113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster metric->set_condition(isSyncingPredicate.id()); 34213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster metric->set_aggregation_type(aggregationType); 34313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster *metric->mutable_dimensions_in_what() = CreateAttributionUidDimensions( 34413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster android::util::SCHEDULED_JOB_STATE_CHANGED, {Position::FIRST}); 34513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 34613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster auto links = metric->add_links(); 34713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster links->set_condition(isSyncingPredicate.id()); 34813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster *links->mutable_fields_in_what() = 34913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster CreateAttributionUidDimensions( 35013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster android::util::SCHEDULED_JOB_STATE_CHANGED, {Position::FIRST}); 35113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster *links->mutable_fields_in_condition() = 35213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster CreateAttributionUidDimensions(android::util::SYNC_STATE_CHANGED, {Position::FIRST}); 35313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster return config; 35413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster} 35513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 35613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster} // namespace 35713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 35813fb7e4eeaf7aee408821afe7ee55a5167e49e59YangsterTEST(DimensionInConditionE2eTest, TestDurationMetric_Link_SimpleCondition) { 35913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster for (bool isFullLink : {true, false}) { 36013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster for (auto aggregationType : {DurationMetric::SUM, DurationMetric::MAX_SPARSE}) { 36113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster ConfigKey cfgKey; 36213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster auto config = createDurationMetric_Link_SimpleConditionConfig( 36313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster aggregationType, !isFullLink); 36413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster int64_t bucketStartTimeNs = 10000000000; 36513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster int64_t bucketSizeNs = 36613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster TimeUnitToBucketSizeInMillis(config.duration_metric(0).bucket()) * 1000000LL; 36713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 36813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster auto processor = CreateStatsLogProcessor( 36915f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac bucketStartTimeNs, bucketStartTimeNs, config, cfgKey); 37013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(processor->mMetricsManagers.size(), 1u); 37113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_TRUE(processor->mMetricsManagers.begin()->second->isConfigValid()); 37213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 37313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster std::vector<AttributionNodeInternal> attributions1 = { 37413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster CreateAttribution(111, "App1"), CreateAttribution(222, "GMSCoreModule1"), 37513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster CreateAttribution(222, "GMSCoreModule2")}; 37613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 37713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster std::vector<AttributionNodeInternal> attributions2 = { 37813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster CreateAttribution(333, "App2"), CreateAttribution(222, "GMSCoreModule1"), 37913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster CreateAttribution(555, "GMSCoreModule2")}; 38013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 38113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster std::vector<AttributionNodeInternal> attributions3 = { 38213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster CreateAttribution(444, "App3"), CreateAttribution(222, "GMSCoreModule1"), 38313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster CreateAttribution(555, "GMSCoreModule2")}; 38413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 38513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster std::vector<std::unique_ptr<LogEvent>> events; 38613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 38713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateStartScheduledJobEvent( 38813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster {CreateAttribution(111, "App1")}, "job1", bucketStartTimeNs + 1)); 38913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateFinishScheduledJobEvent( 39013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster {CreateAttribution(111, "App1")}, "job1",bucketStartTimeNs + 101)); 39113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 39213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateStartScheduledJobEvent( 39313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster {CreateAttribution(333, "App2")}, "job2", bucketStartTimeNs + 201)); 39413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateFinishScheduledJobEvent( 39513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster {CreateAttribution(333, "App2")}, "job2",bucketStartTimeNs + 500)); 39613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateStartScheduledJobEvent( 39713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster {CreateAttribution(333, "App2")}, "job2", bucketStartTimeNs + 600)); 39813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back( 39913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster CreateFinishScheduledJobEvent({CreateAttribution(333, "App2")}, "job2", 40013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs + 850)); 40113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 40213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back( 40313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster CreateStartScheduledJobEvent({CreateAttribution(444, "App3")}, "job3", 40413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs - 2)); 40513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back( 40613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster CreateFinishScheduledJobEvent({CreateAttribution(444, "App3")}, "job3", 40713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs + 900)); 40813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 40913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateSyncStartEvent(attributions1, "ReadEmail", 41013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + 50)); 41113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateSyncEndEvent(attributions1, "ReadEmail", 41213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + 110)); 41313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 41413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateSyncStartEvent(attributions2, "ReadEmail", 41513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + 300)); 41613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateSyncEndEvent(attributions2, "ReadEmail", 41713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs + 700)); 41813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateSyncStartEvent(attributions2, "ReadDoc", 41913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + 400)); 42013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateSyncEndEvent(attributions2, "ReadDoc", 42113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs - 1)); 42213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 42313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateSyncStartEvent(attributions3, "ReadDoc", 42413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + 550)); 42513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateSyncEndEvent(attributions3, "ReadDoc", 42613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + 800)); 42713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateSyncStartEvent(attributions3, "ReadDoc", 42813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs - 1)); 42913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateSyncEndEvent(attributions3, "ReadDoc", 43013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs + 700)); 43113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 43213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster sortLogEventsByTimestamp(&events); 43313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 43413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster for (const auto& event : events) { 43513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster processor->OnLogEvent(event.get()); 43613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster } 43713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 43813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster ConfigMetricsReportList reports; 43913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster vector<uint8_t> buffer; 44056ae0d9a48212c6e886e5887a6f9191f3020af40David Chen processor->onDumpReport(cfgKey, bucketStartTimeNs + 2 * bucketSizeNs + 1, false, 441e36018b2724b5ae40180f956b16c3e276855b99bChenjie Yu ADB_DUMP, &buffer); 44213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_TRUE(buffer.size() > 0); 44313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size())); 4449def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac backfillDimensionPath(&reports); 4459def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac backfillStringInReport(&reports); 4469def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac backfillStartEndTimestamp(&reports); 44713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 44813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(reports.reports_size(), 1); 44913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(reports.reports(0).metrics_size(), 1); 45013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster StatsLogReport::DurationMetricDataWrapper metrics; 45113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster sortMetricDataByDimensionsValue( 45213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster reports.reports(0).metrics(0).duration_metrics(), &metrics); 45313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 45413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster if (aggregationType == DurationMetric::SUM) { 45513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(metrics.data_size(), 3); 45613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster auto data = metrics.data(0); 45713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster ValidateAttributionUidDimension( 45813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data.dimensions_in_what(), android::util::SCHEDULED_JOB_STATE_CHANGED, 111); 45913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info_size(), 1); 46013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).duration_nanos(), 101 - 50); 46113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), 46213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs); 46313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(), 46413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 46513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 46613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data = metrics.data(1); 46713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster ValidateAttributionUidDimension( 46813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data.dimensions_in_what(), android::util::SCHEDULED_JOB_STATE_CHANGED, 333); 46913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info_size(), 2); 47013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), bucketStartTimeNs); 47113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(), 47213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 47313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).duration_nanos(), 500 - 300 + bucketSizeNs - 600); 47413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).duration_nanos(), 700); 47513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).start_bucket_elapsed_nanos(), 47613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 47713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).end_bucket_elapsed_nanos(), 47813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + 2 * bucketSizeNs); 47913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 48013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data = metrics.data(2); 48113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster ValidateAttributionUidDimension( 48213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data.dimensions_in_what(), android::util::SCHEDULED_JOB_STATE_CHANGED, 444); 48313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info_size(), 2); 48413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).duration_nanos(), 1); 48513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), bucketStartTimeNs); 48613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(), 48713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 48813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).duration_nanos(), 700); 48913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).start_bucket_elapsed_nanos(), 49013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 49113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).end_bucket_elapsed_nanos(), 49213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + 2 * bucketSizeNs); 49313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster } else { 49413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(metrics.data_size(), 3); 49513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster auto data = metrics.data(0); 49613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster ValidateAttributionUidDimension( 49713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data.dimensions_in_what(), android::util::SCHEDULED_JOB_STATE_CHANGED, 111); 49813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info_size(), 1); 49913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).duration_nanos(), 101 - 50); 50013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), 50113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs); 50213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(), 50313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 50413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 50513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data = metrics.data(1); 50613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster ValidateAttributionUidDimension( 50713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data.dimensions_in_what(), android::util::SCHEDULED_JOB_STATE_CHANGED, 333); 50813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info_size(), 2); 50913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), bucketStartTimeNs); 51013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(), 51113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 51213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).duration_nanos(), 500 - 300); 51313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).duration_nanos(), bucketSizeNs - 600 + 700); 51413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).start_bucket_elapsed_nanos(), 51513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 51613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).end_bucket_elapsed_nanos(), 51713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + 2 * bucketSizeNs); 51813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 51913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data = metrics.data(2); 52013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster ValidateAttributionUidDimension( 52113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data.dimensions_in_what(), android::util::SCHEDULED_JOB_STATE_CHANGED, 444); 52213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info_size(), 1); 52313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).duration_nanos(), 701); 52413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), 52513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 52613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(), 52713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + 2 * bucketSizeNs); 52813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster } 52913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster } 53013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster } 53113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster} 53213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 53313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangsternamespace { 53413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 53513fb7e4eeaf7aee408821afe7ee55a5167e49e59YangsterStatsdConfig createDurationMetric_PartialLink_SimpleConditionConfig( 53613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster DurationMetric::AggregationType aggregationType) { 53713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster StatsdConfig config; 5388faaa01489d81b815e62e4416e78e4b5500b487aDavid Chen config.add_allowed_log_source("AID_ROOT"); // LogEvent defaults to UID of root. 53913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster *config.add_atom_matcher() = CreateStartScheduledJobAtomMatcher(); 54013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster *config.add_atom_matcher() = CreateFinishScheduledJobAtomMatcher(); 54113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster *config.add_atom_matcher() = CreateSyncStartAtomMatcher(); 54213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster *config.add_atom_matcher() = CreateSyncEndAtomMatcher(); 54313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 54413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster auto scheduledJobPredicate = CreateScheduledJobPredicate(); 54513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster auto dimensions = scheduledJobPredicate.mutable_simple_predicate()->mutable_dimensions(); 54613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster *dimensions = CreateAttributionUidDimensions( 54713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster android::util::SCHEDULED_JOB_STATE_CHANGED, {Position::FIRST}); 54813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster dimensions->add_child()->set_field(2); // job name field. 54913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 55013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster auto isSyncingPredicate = CreateIsSyncingPredicate(); 55113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster auto syncDimension = isSyncingPredicate.mutable_simple_predicate()->mutable_dimensions(); 55213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster *syncDimension = CreateAttributionUidDimensions( 55313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster android::util::SYNC_STATE_CHANGED, {Position::FIRST}); 55413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster syncDimension->add_child()->set_field(2 /* name field*/); 55513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 55613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster *config.add_predicate() = scheduledJobPredicate; 55713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster *config.add_predicate() = isSyncingPredicate; 55813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 55913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster auto metric = config.add_duration_metric(); 56013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster metric->set_bucket(FIVE_MINUTES); 56113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster metric->set_id(StringToId("scheduledJob")); 56213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster metric->set_what(scheduledJobPredicate.id()); 56313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster metric->set_condition(isSyncingPredicate.id()); 56413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster metric->set_aggregation_type(aggregationType); 56513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster *metric->mutable_dimensions_in_what() = CreateAttributionUidDimensions( 56613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster android::util::SCHEDULED_JOB_STATE_CHANGED, {Position::FIRST}); 56713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster *metric->mutable_dimensions_in_condition() = *syncDimension; 56813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 56913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster auto links = metric->add_links(); 57013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster links->set_condition(isSyncingPredicate.id()); 57113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster *links->mutable_fields_in_what() = 57213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster CreateAttributionUidDimensions( 57313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster android::util::SCHEDULED_JOB_STATE_CHANGED, {Position::FIRST}); 57413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster *links->mutable_fields_in_condition() = 57513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster CreateAttributionUidDimensions(android::util::SYNC_STATE_CHANGED, {Position::FIRST}); 57613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster return config; 57713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster} 57813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 57913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster} // namespace 58013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 58113fb7e4eeaf7aee408821afe7ee55a5167e49e59YangsterTEST(DimensionInConditionE2eTest, TestDurationMetric_PartialLink_SimpleCondition) { 58213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster for (auto aggregationType : {DurationMetric::SUM, DurationMetric::MAX_SPARSE}) { 58313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster ConfigKey cfgKey; 58413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster auto config = createDurationMetric_PartialLink_SimpleConditionConfig( 58513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster aggregationType); 58613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster int64_t bucketStartTimeNs = 10000000000; 58713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster int64_t bucketSizeNs = 58813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster TimeUnitToBucketSizeInMillis(config.duration_metric(0).bucket()) * 1000000LL; 58913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 59013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster auto processor = CreateStatsLogProcessor( 59115f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac bucketStartTimeNs, bucketStartTimeNs, config, cfgKey); 59213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(processor->mMetricsManagers.size(), 1u); 59313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_TRUE(processor->mMetricsManagers.begin()->second->isConfigValid()); 59413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 59513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster std::vector<AttributionNodeInternal> attributions1 = { 59613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster CreateAttribution(111, "App1"), CreateAttribution(222, "GMSCoreModule1"), 59713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster CreateAttribution(222, "GMSCoreModule2")}; 59813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 59913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster std::vector<AttributionNodeInternal> attributions2 = { 60013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster CreateAttribution(333, "App2"), CreateAttribution(222, "GMSCoreModule1"), 60113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster CreateAttribution(555, "GMSCoreModule2")}; 60213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 60313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster std::vector<AttributionNodeInternal> attributions3 = { 60413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster CreateAttribution(444, "App3"), CreateAttribution(222, "GMSCoreModule1"), 60513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster CreateAttribution(555, "GMSCoreModule2")}; 60613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 60713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster std::vector<std::unique_ptr<LogEvent>> events; 60813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 60913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateStartScheduledJobEvent( 61013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster {CreateAttribution(111, "App1")}, "job1", bucketStartTimeNs + 1)); 61113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateFinishScheduledJobEvent( 61213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster {CreateAttribution(111, "App1")}, "job1",bucketStartTimeNs + 101)); 61313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 61413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateStartScheduledJobEvent( 61513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster {CreateAttribution(333, "App2")}, "job2", bucketStartTimeNs + 201)); 61613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateFinishScheduledJobEvent( 61713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster {CreateAttribution(333, "App2")}, "job2",bucketStartTimeNs + 500)); 61813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateStartScheduledJobEvent( 61913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster {CreateAttribution(333, "App2")}, "job2", bucketStartTimeNs + 600)); 62013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateFinishScheduledJobEvent( 62113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster {CreateAttribution(333, "App2")}, "job2", bucketStartTimeNs + bucketSizeNs + 850)); 62213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 62313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back( 62413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster CreateStartScheduledJobEvent({CreateAttribution(444, "App3")}, "job3", 62513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs - 2)); 62613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back( 62713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster CreateFinishScheduledJobEvent({CreateAttribution(444, "App3")}, "job3", 62813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs + 900)); 62913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 63013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateSyncStartEvent(attributions1, "ReadEmail", 63113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + 50)); 63213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateSyncEndEvent(attributions1, "ReadEmail", 63313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + 110)); 63413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 63513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateSyncStartEvent(attributions2, "ReadEmail", 63613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + 300)); 63713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateSyncEndEvent(attributions2, "ReadEmail", 63813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs + 700)); 63913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateSyncStartEvent(attributions2, "ReadDoc", 64013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + 400)); 64113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateSyncEndEvent(attributions2, "ReadDoc", 64213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs - 1)); 64313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 64413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateSyncStartEvent(attributions3, "ReadDoc", 64513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + 550)); 64613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateSyncEndEvent(attributions3, "ReadDoc", 64713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + 800)); 64813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateSyncStartEvent(attributions3, "ReadDoc", 64913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs - 1)); 65013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster events.push_back(CreateSyncEndEvent(attributions3, "ReadDoc", 65113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs + 700)); 65213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 65313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster sortLogEventsByTimestamp(&events); 65413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 65513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster for (const auto& event : events) { 65613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster processor->OnLogEvent(event.get()); 65713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster } 65813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 65913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster ConfigMetricsReportList reports; 66013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster vector<uint8_t> buffer; 66156ae0d9a48212c6e886e5887a6f9191f3020af40David Chen processor->onDumpReport(cfgKey, bucketStartTimeNs + 2 * bucketSizeNs + 1, false, ADB_DUMP, 66256ae0d9a48212c6e886e5887a6f9191f3020af40David Chen &buffer); 66313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_TRUE(buffer.size() > 0); 66413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size())); 6659def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac backfillDimensionPath(&reports); 6669def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac backfillStringInReport(&reports); 6679def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac backfillStartEndTimestamp(&reports); 66813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 66913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(reports.reports_size(), 1); 67013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(reports.reports(0).metrics_size(), 1); 67113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster StatsLogReport::DurationMetricDataWrapper metrics; 67213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster sortMetricDataByDimensionsValue( 67313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster reports.reports(0).metrics(0).duration_metrics(), &metrics); 67413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 67513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster if (aggregationType == DurationMetric::SUM) { 67613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(4, metrics.data_size()); 67713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster auto data = metrics.data(0); 67813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster ValidateAttributionUidDimension( 67913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data.dimensions_in_what(), android::util::SCHEDULED_JOB_STATE_CHANGED, 111); 68013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster ValidateAttributionUidDimension( 68113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data.dimensions_in_condition(), android::util::SYNC_STATE_CHANGED, 111); 68213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ("ReadEmail", 68313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data.dimensions_in_condition().value_tuple().dimensions_value(1).value_str()); 68413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info_size(), 1); 68513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).duration_nanos(), 101 - 50); 68613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), 68713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs); 68813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(), 68913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 69013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 69113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data = metrics.data(1); 69213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster ValidateAttributionUidDimension( 69313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data.dimensions_in_what(), android::util::SCHEDULED_JOB_STATE_CHANGED, 333); 69413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster ValidateAttributionUidDimension( 69513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data.dimensions_in_condition(), android::util::SYNC_STATE_CHANGED, 333); 69613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ("ReadDoc", 69713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data.dimensions_in_condition().value_tuple().dimensions_value(1).value_str()); 69813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info_size(), 1); 69913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), bucketStartTimeNs); 70013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(), 70113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 70213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).duration_nanos(), bucketSizeNs - 1 - 400 - 100); 70313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 70413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data = metrics.data(2); 70513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster ValidateAttributionUidDimension( 70613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data.dimensions_in_what(), android::util::SCHEDULED_JOB_STATE_CHANGED, 333); 70713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster ValidateAttributionUidDimension( 70813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data.dimensions_in_condition(), android::util::SYNC_STATE_CHANGED, 333); 70913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ("ReadEmail", 71013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data.dimensions_in_condition().value_tuple().dimensions_value(1).value_str()); 71113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info_size(), 2); 71213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), bucketStartTimeNs); 71313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(), 71413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 71513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).duration_nanos(), 500 - 300 + bucketSizeNs - 600); 71613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).duration_nanos(), 700); 71713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).start_bucket_elapsed_nanos(), 71813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 71913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).end_bucket_elapsed_nanos(), 72013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + 2 * bucketSizeNs); 72113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 72213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data = metrics.data(3); 72313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster ValidateAttributionUidDimension( 72413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data.dimensions_in_what(), android::util::SCHEDULED_JOB_STATE_CHANGED, 444); 72513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster ValidateAttributionUidDimension( 72613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data.dimensions_in_condition(), android::util::SYNC_STATE_CHANGED, 444); 72713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ("ReadDoc", 72813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data.dimensions_in_condition().value_tuple().dimensions_value(1).value_str()); 72913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info_size(), 2); 73013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).duration_nanos(), 1); 73113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), bucketStartTimeNs); 73213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(), 73313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 73413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).duration_nanos(), 700); 73513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).start_bucket_elapsed_nanos(), 73613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 73713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).end_bucket_elapsed_nanos(), 73813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + 2 * bucketSizeNs); 73913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster } else { 74013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(metrics.data_size(), 4); 74113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster auto data = metrics.data(0); 74213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster ValidateAttributionUidDimension( 74313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data.dimensions_in_what(), android::util::SCHEDULED_JOB_STATE_CHANGED, 111); 74413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster ValidateAttributionUidDimension( 74513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data.dimensions_in_condition(), android::util::SYNC_STATE_CHANGED, 111); 74613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ("ReadEmail", 74713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data.dimensions_in_condition().value_tuple().dimensions_value(1).value_str()); 74813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info_size(), 1); 74913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).duration_nanos(), 101 - 50); 75013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), 75113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs); 75213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(), 75313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 75413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 75513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data = metrics.data(1); 75613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster ValidateAttributionUidDimension( 75713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data.dimensions_in_what(), android::util::SCHEDULED_JOB_STATE_CHANGED, 333); 75813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster ValidateAttributionUidDimension( 75913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data.dimensions_in_condition(), android::util::SYNC_STATE_CHANGED, 333); 76013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ("ReadDoc", 76113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data.dimensions_in_condition().value_tuple().dimensions_value(1).value_str()); 76213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info_size(), 2); 76313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), bucketStartTimeNs); 76413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(), 76513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 76613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).duration_nanos(), 100); 76713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).start_bucket_elapsed_nanos(), 76813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 76913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).end_bucket_elapsed_nanos(), 77013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + 2 * bucketSizeNs); 77113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).duration_nanos(), bucketSizeNs - 1 - 600); 77213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 77313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data = metrics.data(2); 77413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster ValidateAttributionUidDimension( 77513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data.dimensions_in_what(), android::util::SCHEDULED_JOB_STATE_CHANGED, 333); 77613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster ValidateAttributionUidDimension( 77713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data.dimensions_in_condition(), android::util::SYNC_STATE_CHANGED, 333); 77813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ("ReadEmail", 77913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data.dimensions_in_condition().value_tuple().dimensions_value(1).value_str()); 78013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info_size(), 2); 78113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), bucketStartTimeNs); 78213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(), 78313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 78413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).duration_nanos(), 500 - 300); 78513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).duration_nanos(), bucketSizeNs - 600 + 700); 78613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).start_bucket_elapsed_nanos(), 78713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 78813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).end_bucket_elapsed_nanos(), 78913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + 2 * bucketSizeNs); 79013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 79113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data = metrics.data(3); 79213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster ValidateAttributionUidDimension( 79313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data.dimensions_in_what(), android::util::SCHEDULED_JOB_STATE_CHANGED, 444); 79413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster ValidateAttributionUidDimension( 79513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data.dimensions_in_condition(), android::util::SYNC_STATE_CHANGED, 444); 79613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ("ReadDoc", 79713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster data.dimensions_in_condition().value_tuple().dimensions_value(1).value_str()); 79813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info_size(), 1); 79913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).duration_nanos(), 701); 80013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), 80113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 80213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(), 80313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + 2 * bucketSizeNs); 80413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster } 80513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster } 80613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster} 80713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 80813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster#else 80913fb7e4eeaf7aee408821afe7ee55a5167e49e59YangsterGTEST_LOG_(INFO) << "This test does nothing.\n"; 81013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster#endif 81113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 81213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster} // namespace statsd 81313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster} // namespace os 81413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster} // namespace android 815