19369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac// Copyright (C) 2017 The Android Open Source Project 29369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac// 39369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac// Licensed under the Apache License, Version 2.0 (the "License"); 49369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac// you may not use this file except in compliance with the License. 59369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac// You may obtain a copy of the License at 69369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac// 79369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac// http://www.apache.org/licenses/LICENSE-2.0 89369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac// 99369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac// Unless required by applicable law or agreed to in writing, software 109369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac// distributed under the License is distributed on an "AS IS" BASIS, 119369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 129369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac// See the License for the specific language governing permissions and 139369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac// limitations under the License. 149369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 159369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac#include <gtest/gtest.h> 169369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 179369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac#include "src/StatsLogProcessor.h" 189369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac#include "src/stats_log_util.h" 199369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac#include "tests/statsd_test_util.h" 209369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 219369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac#include <vector> 229369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 239369446f0b04945d6674550728ae81196d6fb5c2Yangster-macnamespace android { 249369446f0b04945d6674550728ae81196d6fb5c2Yangster-macnamespace os { 259369446f0b04945d6674550728ae81196d6fb5c2Yangster-macnamespace statsd { 269369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 279369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac#ifdef __ANDROID__ 289369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 299369446f0b04945d6674550728ae81196d6fb5c2Yangster-macnamespace { 309369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 3113fb7e4eeaf7aee408821afe7ee55a5167e49e59YangsterStatsdConfig CreateCountMetric_NoLink_CombinationCondition_Config() { 329369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac StatsdConfig config; 338faaa01489d81b815e62e4416e78e4b5500b487aDavid Chen config.add_allowed_log_source("AID_ROOT"); // LogEvent defaults to UID of root. 349369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac auto screenBrightnessChangeAtomMatcher = CreateScreenBrightnessChangedAtomMatcher(); 359369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac *config.add_atom_matcher() = screenBrightnessChangeAtomMatcher; 369369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac *config.add_atom_matcher() = CreateScreenTurnedOnAtomMatcher(); 379369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac *config.add_atom_matcher() = CreateScreenTurnedOffAtomMatcher(); 389369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac *config.add_atom_matcher() = CreateAcquireWakelockAtomMatcher(); 399369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac *config.add_atom_matcher() = CreateReleaseWakelockAtomMatcher(); 409369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 419369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac auto screenIsOffPredicate = CreateScreenIsOffPredicate(); 429369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac *config.add_predicate() = screenIsOffPredicate; 439369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 449369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac auto holdingWakelockPredicate = CreateHoldingWakelockPredicate(); 459369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac // The predicate is dimensioning by any attribution node and both by uid and tag. 469369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac *holdingWakelockPredicate.mutable_simple_predicate()->mutable_dimensions() = 478a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen CreateAttributionUidAndTagDimensions(android::util::WAKELOCK_STATE_CHANGED, 488a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen {Position::FIRST}); 499369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac *config.add_predicate() = holdingWakelockPredicate; 509369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 519369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac auto combinationPredicate = config.add_predicate(); 529369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac combinationPredicate->set_id(987654); 539369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac combinationPredicate->mutable_combination()->set_operation(LogicalOperation::OR); 549369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac addPredicateToPredicateCombination(screenIsOffPredicate, combinationPredicate); 559369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac addPredicateToPredicateCombination(holdingWakelockPredicate, combinationPredicate); 569369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 579369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac auto metric = config.add_count_metric(); 589369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac metric->set_id(StringToId("ScreenBrightnessChangeMetric")); 599369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac metric->set_what(screenBrightnessChangeAtomMatcher.id()); 609369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac metric->set_condition(combinationPredicate->id()); 618a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen *metric->mutable_dimensions_in_what() = 628a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen CreateDimensions(android::util::SCREEN_BRIGHTNESS_CHANGED, {1 /* level */}); 639369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac *metric->mutable_dimensions_in_condition() = CreateAttributionUidDimensions( 649369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac android::util::WAKELOCK_STATE_CHANGED, {Position::FIRST}); 6559cc24dbfda4148c1f5ef4de9c8763caa8672443yro metric->set_bucket(FIVE_MINUTES); 669369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac return config; 679369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac} 689369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 699369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac} // namespace 709369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 7113fb7e4eeaf7aee408821afe7ee55a5167e49e59YangsterTEST(DimensionInConditionE2eTest, TestCreateCountMetric_NoLink_OR_CombinationCondition) { 729369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac ConfigKey cfgKey; 7313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster auto config = CreateCountMetric_NoLink_CombinationCondition_Config(); 749369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac int64_t bucketStartTimeNs = 10000000000; 759369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac int64_t bucketSizeNs = 768a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen TimeUnitToBucketSizeInMillis(config.count_metric(0).bucket()) * 1000000LL; 779369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 7815f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac auto processor = CreateStatsLogProcessor(bucketStartTimeNs, bucketStartTimeNs, config, cfgKey); 799369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(processor->mMetricsManagers.size(), 1u); 809369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_TRUE(processor->mMetricsManagers.begin()->second->isConfigValid()); 819369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 829c1debe330006b2b4d5c08a55905789c57369609Yao Chen std::vector<AttributionNodeInternal> attributions1 = {CreateAttribution(111, "App1"), 839c1debe330006b2b4d5c08a55905789c57369609Yao Chen CreateAttribution(222, "GMSCoreModule1"), 849c1debe330006b2b4d5c08a55905789c57369609Yao Chen CreateAttribution(222, "GMSCoreModule2")}; 859369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 869c1debe330006b2b4d5c08a55905789c57369609Yao Chen std::vector<AttributionNodeInternal> attributions2 = {CreateAttribution(333, "App2"), 879c1debe330006b2b4d5c08a55905789c57369609Yao Chen CreateAttribution(222, "GMSCoreModule1"), 889c1debe330006b2b4d5c08a55905789c57369609Yao Chen CreateAttribution(555, "GMSCoreModule2")}; 899369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 909369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac std::vector<std::unique_ptr<LogEvent>> events; 918a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen events.push_back( 928a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen CreateScreenStateChangedEvent(android::view::DISPLAY_STATE_ON, bucketStartTimeNs + 10)); 938a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen events.push_back(CreateScreenStateChangedEvent(android::view::DISPLAY_STATE_OFF, 948a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen bucketStartTimeNs + 100)); 958a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen events.push_back(CreateScreenStateChangedEvent(android::view::DISPLAY_STATE_ON, 968a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen bucketStartTimeNs + bucketSizeNs + 1)); 978a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen events.push_back(CreateScreenStateChangedEvent(android::view::DISPLAY_STATE_OFF, 988a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen bucketStartTimeNs + 2 * bucketSizeNs - 10)); 998a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 1008a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen events.push_back(CreateAcquireWakelockEvent(attributions1, "wl1", bucketStartTimeNs + 200)); 1018a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen events.push_back( 1028a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen CreateReleaseWakelockEvent(attributions1, "wl1", bucketStartTimeNs + bucketSizeNs + 1)); 1038a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 1048a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen events.push_back(CreateAcquireWakelockEvent(attributions2, "wl2", 1058a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen bucketStartTimeNs + bucketSizeNs - 100)); 1068a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen events.push_back(CreateReleaseWakelockEvent(attributions2, "wl2", 1078a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen bucketStartTimeNs + 2 * bucketSizeNs - 50)); 1088a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 1098a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen events.push_back(CreateScreenBrightnessChangedEvent(123, bucketStartTimeNs + 11)); 1108a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen events.push_back(CreateScreenBrightnessChangedEvent(123, bucketStartTimeNs + 101)); 1118a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen events.push_back(CreateScreenBrightnessChangedEvent(123, bucketStartTimeNs + 201)); 1128a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen events.push_back(CreateScreenBrightnessChangedEvent(456, bucketStartTimeNs + 203)); 1138a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen events.push_back( 1148a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen CreateScreenBrightnessChangedEvent(456, bucketStartTimeNs + bucketSizeNs - 99)); 1158a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen events.push_back(CreateScreenBrightnessChangedEvent(456, bucketStartTimeNs + bucketSizeNs - 2)); 1168a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen events.push_back(CreateScreenBrightnessChangedEvent(789, bucketStartTimeNs + bucketSizeNs - 1)); 1178a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen events.push_back(CreateScreenBrightnessChangedEvent(456, bucketStartTimeNs + bucketSizeNs + 2)); 1188a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen events.push_back( 1198a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen CreateScreenBrightnessChangedEvent(789, bucketStartTimeNs + 2 * bucketSizeNs - 11)); 1208a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen events.push_back( 1218a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen CreateScreenBrightnessChangedEvent(789, bucketStartTimeNs + 2 * bucketSizeNs - 9)); 1228a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen events.push_back( 1238a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen CreateScreenBrightnessChangedEvent(789, bucketStartTimeNs + 2 * bucketSizeNs - 1)); 1249369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 1259369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac sortLogEventsByTimestamp(&events); 1269369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 1279369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac for (const auto& event : events) { 1289369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac processor->OnLogEvent(event.get()); 1299369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac } 1309369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 1319369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac ConfigMetricsReportList reports; 1328a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen vector<uint8_t> buffer; 13356ae0d9a48212c6e886e5887a6f9191f3020af40David Chen processor->onDumpReport(cfgKey, bucketStartTimeNs + 2 * bucketSizeNs + 1, false, ADB_DUMP, 13456ae0d9a48212c6e886e5887a6f9191f3020af40David Chen &buffer); 1358a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_TRUE(buffer.size() > 0); 1368a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size())); 1379def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac backfillDimensionPath(&reports); 1389def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac backfillStringInReport(&reports); 1399def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac backfillStartEndTimestamp(&reports); 1409369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 1419369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(reports.reports_size(), 1); 1429369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(reports.reports(0).metrics_size(), 1); 1439369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac StatsLogReport::CountMetricDataWrapper countMetrics; 1449369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac sortMetricDataByDimensionsValue(reports.reports(0).metrics(0).count_metrics(), &countMetrics); 1459369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 1469369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(countMetrics.data_size(), 7); 1479369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac auto data = countMetrics.data(0); 1489369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.bucket_info_size(), 1); 1499369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.bucket_info(0).count(), 1); 150330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), bucketStartTimeNs); 151330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(), bucketStartTimeNs + bucketSizeNs); 1529369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().field(), android::util::SCREEN_BRIGHTNESS_CHANGED); 1539369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value_size(), 1); 1549369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).field(), 1); 1559369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).value_int(), 123); 1569369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_FALSE(data.dimensions_in_condition().has_field()); 1579369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 1589369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac data = countMetrics.data(1); 1599369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.bucket_info_size(), 1); 1609369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.bucket_info(0).count(), 1); 161330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), bucketStartTimeNs); 162330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(), bucketStartTimeNs + bucketSizeNs); 1639369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().field(), android::util::SCREEN_BRIGHTNESS_CHANGED); 1649369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value_size(), 1); 1659369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).field(), 1); 1669369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).value_int(), 123); 1678a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen ValidateAttributionUidDimension(data.dimensions_in_condition(), 1688a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen android::util::WAKELOCK_STATE_CHANGED, 111); 1699369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 1709369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac data = countMetrics.data(2); 1719369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.bucket_info_size(), 1); 1729369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.bucket_info(0).count(), 3); 173330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), bucketStartTimeNs); 174330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(), bucketStartTimeNs + bucketSizeNs); 1759369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().field(), android::util::SCREEN_BRIGHTNESS_CHANGED); 1769369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value_size(), 1); 1779369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).field(), 1); 1789369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).value_int(), 456); 1798a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen ValidateAttributionUidDimension(data.dimensions_in_condition(), 1808a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen android::util::WAKELOCK_STATE_CHANGED, 111); 1819369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 1829369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac data = countMetrics.data(3); 1839369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.bucket_info_size(), 2); 1849369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.bucket_info(0).count(), 2); 185330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), bucketStartTimeNs); 186330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(), bucketStartTimeNs + bucketSizeNs); 1879369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.bucket_info(1).count(), 1); 188330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac EXPECT_EQ(data.bucket_info(1).start_bucket_elapsed_nanos(), bucketStartTimeNs + bucketSizeNs); 189330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac EXPECT_EQ(data.bucket_info(1).end_bucket_elapsed_nanos(), bucketStartTimeNs + 2 * bucketSizeNs); 1909369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().field(), android::util::SCREEN_BRIGHTNESS_CHANGED); 1919369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value_size(), 1); 1929369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).field(), 1); 1939369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).value_int(), 456); 1948a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen ValidateAttributionUidDimension(data.dimensions_in_condition(), 1958a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen android::util::WAKELOCK_STATE_CHANGED, 333); 1969369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 1979369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac data = countMetrics.data(4); 1989369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.bucket_info_size(), 1); 1999369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.bucket_info(0).count(), 2); 200330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), bucketStartTimeNs + bucketSizeNs); 201330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(), bucketStartTimeNs + 2 * bucketSizeNs); 2029369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().field(), android::util::SCREEN_BRIGHTNESS_CHANGED); 2039369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value_size(), 1); 2049369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).field(), 1); 2059369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).value_int(), 789); 2069369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_FALSE(data.dimensions_in_condition().has_field()); 2079369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 2089369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac data = countMetrics.data(5); 2099369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.bucket_info_size(), 1); 2109369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.bucket_info(0).count(), 1); 211330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), bucketStartTimeNs); 212330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(), bucketStartTimeNs + bucketSizeNs); 2139369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().field(), android::util::SCREEN_BRIGHTNESS_CHANGED); 2149369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value_size(), 1); 2159369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).field(), 1); 2169369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).value_int(), 789); 2178a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen ValidateAttributionUidDimension(data.dimensions_in_condition(), 2188a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen android::util::WAKELOCK_STATE_CHANGED, 111); 2199369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 2209369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac data = countMetrics.data(6); 2219369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.bucket_info_size(), 1); 2229369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.bucket_info(0).count(), 1); 223330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), bucketStartTimeNs); 224330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(), bucketStartTimeNs + bucketSizeNs); 2259369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().field(), android::util::SCREEN_BRIGHTNESS_CHANGED); 2269369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value_size(), 1); 2279369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).field(), 1); 2289369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).value_int(), 789); 2298a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen ValidateAttributionUidDimension(data.dimensions_in_condition(), 2308a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen android::util::WAKELOCK_STATE_CHANGED, 333); 2319369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac} 2329369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 2339369446f0b04945d6674550728ae81196d6fb5c2Yangster-macnamespace { 2349369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 23513fb7e4eeaf7aee408821afe7ee55a5167e49e59YangsterStatsdConfig CreateCountMetric_Link_CombinationCondition() { 2369369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac StatsdConfig config; 2378faaa01489d81b815e62e4416e78e4b5500b487aDavid Chen config.add_allowed_log_source("AID_ROOT"); // LogEvent defaults to UID of root. 2389369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac auto appCrashMatcher = CreateProcessCrashAtomMatcher(); 2399369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac *config.add_atom_matcher() = appCrashMatcher; 2409369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac *config.add_atom_matcher() = CreateScreenTurnedOnAtomMatcher(); 2419369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac *config.add_atom_matcher() = CreateScreenTurnedOffAtomMatcher(); 2429369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac *config.add_atom_matcher() = CreateSyncStartAtomMatcher(); 2439369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac *config.add_atom_matcher() = CreateSyncEndAtomMatcher(); 2449369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 2459369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac auto screenIsOffPredicate = CreateScreenIsOffPredicate(); 2469369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac auto isSyncingPredicate = CreateIsSyncingPredicate(); 2479369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac auto syncDimension = isSyncingPredicate.mutable_simple_predicate()->mutable_dimensions(); 2488a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen *syncDimension = CreateAttributionUidAndTagDimensions(android::util::SYNC_STATE_CHANGED, 2498a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen {Position::FIRST}); 2509369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac syncDimension->add_child()->set_field(2 /* name field*/); 2519369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 2529369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac *config.add_predicate() = screenIsOffPredicate; 2539369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac *config.add_predicate() = isSyncingPredicate; 2549369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac auto combinationPredicate = config.add_predicate(); 2559369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac combinationPredicate->set_id(987654); 2569369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac combinationPredicate->mutable_combination()->set_operation(LogicalOperation::OR); 2579369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac addPredicateToPredicateCombination(screenIsOffPredicate, combinationPredicate); 2589369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac addPredicateToPredicateCombination(isSyncingPredicate, combinationPredicate); 2599369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 2609369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac auto metric = config.add_count_metric(); 26159cc24dbfda4148c1f5ef4de9c8763caa8672443yro metric->set_bucket(FIVE_MINUTES); 2629369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac metric->set_id(StringToId("AppCrashMetric")); 2639369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac metric->set_what(appCrashMatcher.id()); 2649369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac metric->set_condition(combinationPredicate->id()); 2658a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen *metric->mutable_dimensions_in_what() = 2668a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen CreateDimensions(android::util::PROCESS_LIFE_CYCLE_STATE_CHANGED, {1 /* uid */}); 2679369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac *metric->mutable_dimensions_in_condition() = CreateAttributionUidAndTagDimensions( 2689369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac android::util::SYNC_STATE_CHANGED, {Position::FIRST}); 2699369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 2709369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac // Links between crash atom and condition of app is in syncing. 2719369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac auto links = metric->add_links(); 2729369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac links->set_condition(isSyncingPredicate.id()); 2739369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac auto dimensionWhat = links->mutable_fields_in_what(); 2749369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac dimensionWhat->set_field(android::util::PROCESS_LIFE_CYCLE_STATE_CHANGED); 2759369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac dimensionWhat->add_child()->set_field(1); // uid field. 2768a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen *links->mutable_fields_in_condition() = 2778a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen CreateAttributionUidDimensions(android::util::SYNC_STATE_CHANGED, {Position::FIRST}); 2789369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac return config; 2799369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac} 2809369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 2819369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac} // namespace 2829369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 28313fb7e4eeaf7aee408821afe7ee55a5167e49e59YangsterTEST(DimensionInConditionE2eTest, TestCreateCountMetric_Link_OR_CombinationCondition) { 2849369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac ConfigKey cfgKey; 28513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster auto config = CreateCountMetric_Link_CombinationCondition(); 2869369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac int64_t bucketStartTimeNs = 10000000000; 2879369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac int64_t bucketSizeNs = 2888a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen TimeUnitToBucketSizeInMillis(config.count_metric(0).bucket()) * 1000000LL; 2899369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 29015f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac auto processor = CreateStatsLogProcessor(bucketStartTimeNs, bucketStartTimeNs, config, cfgKey); 2919369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(processor->mMetricsManagers.size(), 1u); 2929369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_TRUE(processor->mMetricsManagers.begin()->second->isConfigValid()); 2939c1debe330006b2b4d5c08a55905789c57369609Yao Chen std::vector<AttributionNodeInternal> attributions1 = {CreateAttribution(111, "App1"), 2949c1debe330006b2b4d5c08a55905789c57369609Yao Chen CreateAttribution(222, "GMSCoreModule1"), 2959c1debe330006b2b4d5c08a55905789c57369609Yao Chen CreateAttribution(222, "GMSCoreModule2")}; 2969369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 2979c1debe330006b2b4d5c08a55905789c57369609Yao Chen std::vector<AttributionNodeInternal> attributions2 = {CreateAttribution(333, "App2"), 2989c1debe330006b2b4d5c08a55905789c57369609Yao Chen CreateAttribution(222, "GMSCoreModule1"), 2999c1debe330006b2b4d5c08a55905789c57369609Yao Chen CreateAttribution(555, "GMSCoreModule2")}; 3009369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 3019369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac std::vector<std::unique_ptr<LogEvent>> events; 3029369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 3039369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac events.push_back(CreateAppCrashEvent(111, bucketStartTimeNs + 11)); 3049369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac events.push_back(CreateAppCrashEvent(111, bucketStartTimeNs + 101)); 3059369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac events.push_back(CreateAppCrashEvent(222, bucketStartTimeNs + 101)); 3069369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 3079369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac events.push_back(CreateAppCrashEvent(222, bucketStartTimeNs + 201)); 3089369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac events.push_back(CreateAppCrashEvent(111, bucketStartTimeNs + 211)); 3099369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac events.push_back(CreateAppCrashEvent(333, bucketStartTimeNs + 211)); 3109369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 3119369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac events.push_back(CreateAppCrashEvent(111, bucketStartTimeNs + 401)); 3129369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac events.push_back(CreateAppCrashEvent(333, bucketStartTimeNs + 401)); 3139369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac events.push_back(CreateAppCrashEvent(555, bucketStartTimeNs + 401)); 3149369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 3159369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac events.push_back(CreateAppCrashEvent(111, bucketStartTimeNs + bucketSizeNs + 301)); 3169369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac events.push_back(CreateAppCrashEvent(333, bucketStartTimeNs + bucketSizeNs + 301)); 3179369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 3189369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac events.push_back(CreateAppCrashEvent(777, bucketStartTimeNs + bucketSizeNs + 701)); 3199369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 3208a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen events.push_back( 3218a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen CreateScreenStateChangedEvent(android::view::DISPLAY_STATE_ON, bucketStartTimeNs + 10)); 3228a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen events.push_back(CreateScreenStateChangedEvent(android::view::DISPLAY_STATE_OFF, 3238a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen bucketStartTimeNs + 100)); 3248a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen events.push_back(CreateScreenStateChangedEvent(android::view::DISPLAY_STATE_ON, 3258a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen bucketStartTimeNs + 202)); 3268a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen events.push_back(CreateScreenStateChangedEvent(android::view::DISPLAY_STATE_OFF, 3278a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen bucketStartTimeNs + bucketSizeNs + 700)); 3289369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 3299369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac events.push_back(CreateSyncStartEvent(attributions1, "ReadEmail", bucketStartTimeNs + 200)); 3308a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen events.push_back( 3318a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen CreateSyncEndEvent(attributions1, "ReadEmail", bucketStartTimeNs + bucketSizeNs + 300)); 3329369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 3339369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac events.push_back(CreateSyncStartEvent(attributions1, "ReadDoc", bucketStartTimeNs + 400)); 3348a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen events.push_back( 3358a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen CreateSyncEndEvent(attributions1, "ReadDoc", bucketStartTimeNs + bucketSizeNs - 1)); 3369369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 3379369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac events.push_back(CreateSyncStartEvent(attributions2, "ReadEmail", bucketStartTimeNs + 400)); 3388a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen events.push_back( 3398a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen CreateSyncEndEvent(attributions2, "ReadEmail", bucketStartTimeNs + bucketSizeNs + 600)); 3409369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 3419369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac sortLogEventsByTimestamp(&events); 3429369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 3439369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac for (const auto& event : events) { 3449369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac processor->OnLogEvent(event.get()); 3459369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac } 3469369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 3479369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac ConfigMetricsReportList reports; 3488a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen vector<uint8_t> buffer; 34956ae0d9a48212c6e886e5887a6f9191f3020af40David Chen processor->onDumpReport(cfgKey, bucketStartTimeNs + 2 * bucketSizeNs + 1, false, ADB_DUMP, 35056ae0d9a48212c6e886e5887a6f9191f3020af40David Chen &buffer); 3518a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_TRUE(buffer.size() > 0); 3528a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size())); 3539def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac backfillDimensionPath(&reports); 3549def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac backfillStringInReport(&reports); 3559def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac backfillStartEndTimestamp(&reports); 3569369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 3579369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(reports.reports_size(), 1); 3589369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(reports.reports(0).metrics_size(), 1); 3599369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac StatsLogReport::CountMetricDataWrapper countMetrics; 3609369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac sortMetricDataByDimensionsValue(reports.reports(0).metrics(0).count_metrics(), &countMetrics); 3619369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 3629369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(countMetrics.data_size(), 5); 3639369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac auto data = countMetrics.data(0); 3649369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().field(), android::util::PROCESS_LIFE_CYCLE_STATE_CHANGED); 3659369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value_size(), 1); 3669369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).field(), 1); 3679369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).value_int(), 111); 3689369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_FALSE(data.dimensions_in_condition().has_field()); 3699369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.bucket_info_size(), 1); 3709369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.bucket_info(0).count(), 1); 371330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), bucketStartTimeNs); 372330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(), bucketStartTimeNs + bucketSizeNs); 3739369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 3749369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac data = countMetrics.data(1); 3759369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().field(), android::util::PROCESS_LIFE_CYCLE_STATE_CHANGED); 3769369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value_size(), 1); 3779369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).field(), 1); 3789369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).value_int(), 111); 3798a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen ValidateAttributionUidAndTagDimension(data.dimensions_in_condition(), 3808a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen android::util::SYNC_STATE_CHANGED, 111, "App1"); 3819369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.bucket_info_size(), 1); 3829369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.bucket_info(0).count(), 2); 383330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), bucketStartTimeNs); 384330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(), bucketStartTimeNs + bucketSizeNs); 3859369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 3869369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac data = countMetrics.data(2); 3879369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().field(), android::util::PROCESS_LIFE_CYCLE_STATE_CHANGED); 3889369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value_size(), 1); 3899369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).field(), 1); 3909369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).value_int(), 222); 3919369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_FALSE(data.dimensions_in_condition().has_field()); 3929369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.bucket_info_size(), 1); 3939369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.bucket_info(0).count(), 2); 394330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), bucketStartTimeNs); 395330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(), bucketStartTimeNs + bucketSizeNs); 3969369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 3979369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac data = countMetrics.data(3); 3989369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().field(), android::util::PROCESS_LIFE_CYCLE_STATE_CHANGED); 3999369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value_size(), 1); 4009369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).field(), 1); 4019369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).value_int(), 333); 4028a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen ValidateAttributionUidAndTagDimension(data.dimensions_in_condition(), 4038a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen android::util::SYNC_STATE_CHANGED, 333, "App2"); 4049369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.bucket_info_size(), 2); 4059369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.bucket_info(0).count(), 1); 406330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), bucketStartTimeNs); 407330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(), bucketStartTimeNs + bucketSizeNs); 4089369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.bucket_info(1).count(), 1); 409330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac EXPECT_EQ(data.bucket_info(1).start_bucket_elapsed_nanos(), bucketStartTimeNs + bucketSizeNs); 410330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac EXPECT_EQ(data.bucket_info(1).end_bucket_elapsed_nanos(), bucketStartTimeNs + 2 * bucketSizeNs); 4119369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 4129369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac data = countMetrics.data(4); 4139369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().field(), android::util::PROCESS_LIFE_CYCLE_STATE_CHANGED); 4149369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value_size(), 1); 4159369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).field(), 1); 4169369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).value_int(), 777); 4179369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_FALSE(data.dimensions_in_condition().has_field()); 4189369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.bucket_info_size(), 1); 4199369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.bucket_info(0).count(), 1); 420330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), bucketStartTimeNs + bucketSizeNs); 421330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(), bucketStartTimeNs + 2 * bucketSizeNs); 4229369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac} 4239369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 4249369446f0b04945d6674550728ae81196d6fb5c2Yangster-macnamespace { 4259369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 42613fb7e4eeaf7aee408821afe7ee55a5167e49e59YangsterStatsdConfig CreateDurationMetricConfig_NoLink_CombinationCondition( 42713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster DurationMetric::AggregationType aggregationType) { 4289369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac StatsdConfig config; 4298faaa01489d81b815e62e4416e78e4b5500b487aDavid Chen config.add_allowed_log_source("AID_ROOT"); // LogEvent defaults to UID of root. 4309369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac *config.add_atom_matcher() = CreateBatterySaverModeStartAtomMatcher(); 4319369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac *config.add_atom_matcher() = CreateBatterySaverModeStopAtomMatcher(); 4329369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac *config.add_atom_matcher() = CreateScreenTurnedOnAtomMatcher(); 4339369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac *config.add_atom_matcher() = CreateScreenTurnedOffAtomMatcher(); 4349369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac *config.add_atom_matcher() = CreateSyncStartAtomMatcher(); 4359369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac *config.add_atom_matcher() = CreateSyncEndAtomMatcher(); 4369369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 4379369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac auto inBatterySaverModePredicate = CreateBatterySaverModePredicate(); 4389369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 4399369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac auto screenIsOffPredicate = CreateScreenIsOffPredicate(); 4409369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac auto isSyncingPredicate = CreateIsSyncingPredicate(); 4419369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac auto syncDimension = isSyncingPredicate.mutable_simple_predicate()->mutable_dimensions(); 4428a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen *syncDimension = CreateAttributionUidAndTagDimensions(android::util::SYNC_STATE_CHANGED, 4438a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen {Position::FIRST}); 4449369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac syncDimension->add_child()->set_field(2 /* name field */); 4459369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 4469369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac *config.add_predicate() = inBatterySaverModePredicate; 4479369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac *config.add_predicate() = screenIsOffPredicate; 4489369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac *config.add_predicate() = isSyncingPredicate; 4499369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac auto combinationPredicate = config.add_predicate(); 4509369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac combinationPredicate->set_id(987654); 4519369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac combinationPredicate->mutable_combination()->set_operation(LogicalOperation::OR); 4529369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac addPredicateToPredicateCombination(screenIsOffPredicate, combinationPredicate); 4539369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac addPredicateToPredicateCombination(isSyncingPredicate, combinationPredicate); 4549369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 4559369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac auto metric = config.add_duration_metric(); 45659cc24dbfda4148c1f5ef4de9c8763caa8672443yro metric->set_bucket(FIVE_MINUTES); 4579369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac metric->set_id(StringToId("BatterySaverModeDurationMetric")); 4589369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac metric->set_what(inBatterySaverModePredicate.id()); 4599369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac metric->set_condition(combinationPredicate->id()); 46013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster metric->set_aggregation_type(aggregationType); 4619369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac *metric->mutable_dimensions_in_condition() = CreateAttributionUidAndTagDimensions( 4629369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac android::util::SYNC_STATE_CHANGED, {Position::FIRST}); 4639369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac return config; 4649369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac} 4659369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 4669369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac} // namespace 4679369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 46813fb7e4eeaf7aee408821afe7ee55a5167e49e59YangsterTEST(DimensionInConditionE2eTest, TestDurationMetric_NoLink_OR_CombinationCondition) { 469be10ddfe46ba6371bcd02cb57a06782e6b18d371Yangster-mac for (auto aggregationType : { DurationMetric::MAX_SPARSE, DurationMetric::SUM}) { 4709369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac ConfigKey cfgKey; 47113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster auto config = CreateDurationMetricConfig_NoLink_CombinationCondition(aggregationType); 4729369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac int64_t bucketStartTimeNs = 10000000000; 4739369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac int64_t bucketSizeNs = 4748a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen TimeUnitToBucketSizeInMillis(config.duration_metric(0).bucket()) * 1000000LL; 4759369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 47615f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac auto processor = CreateStatsLogProcessor( 47715f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac bucketStartTimeNs, bucketStartTimeNs, config, cfgKey); 4789369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(processor->mMetricsManagers.size(), 1u); 4799369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_TRUE(processor->mMetricsManagers.begin()->second->isConfigValid()); 4809369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 4819c1debe330006b2b4d5c08a55905789c57369609Yao Chen std::vector<AttributionNodeInternal> attributions1 = { 4829c1debe330006b2b4d5c08a55905789c57369609Yao Chen CreateAttribution(111, "App1"), CreateAttribution(222, "GMSCoreModule1"), 4839c1debe330006b2b4d5c08a55905789c57369609Yao Chen CreateAttribution(222, "GMSCoreModule2")}; 4849369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 4859c1debe330006b2b4d5c08a55905789c57369609Yao Chen std::vector<AttributionNodeInternal> attributions2 = { 4869c1debe330006b2b4d5c08a55905789c57369609Yao Chen CreateAttribution(333, "App2"), CreateAttribution(222, "GMSCoreModule1"), 4879c1debe330006b2b4d5c08a55905789c57369609Yao Chen CreateAttribution(555, "GMSCoreModule2")}; 4889369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 4899369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac std::vector<std::unique_ptr<LogEvent>> events; 4909369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 4919369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac events.push_back(CreateBatterySaverOffEvent(bucketStartTimeNs + 1)); 4929369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac events.push_back(CreateBatterySaverOnEvent(bucketStartTimeNs + 101)); 4939369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac events.push_back(CreateBatterySaverOffEvent(bucketStartTimeNs + 110)); 4949369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 4959369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac events.push_back(CreateBatterySaverOnEvent(bucketStartTimeNs + 201)); 4969369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac events.push_back(CreateBatterySaverOffEvent(bucketStartTimeNs + 500)); 4979369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 4989369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac events.push_back(CreateBatterySaverOnEvent(bucketStartTimeNs + 600)); 4999369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac events.push_back(CreateBatterySaverOffEvent(bucketStartTimeNs + bucketSizeNs + 850)); 5009369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 5019369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac events.push_back(CreateBatterySaverOnEvent(bucketStartTimeNs + bucketSizeNs + 870)); 5029369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac events.push_back(CreateBatterySaverOffEvent(bucketStartTimeNs + bucketSizeNs + 900)); 5039369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 5048a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen events.push_back(CreateScreenStateChangedEvent(android::view::DISPLAY_STATE_ON, 5058a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen bucketStartTimeNs + 10)); 5068a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen events.push_back(CreateScreenStateChangedEvent(android::view::DISPLAY_STATE_OFF, 5078a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen bucketStartTimeNs + 100)); 5088a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen events.push_back(CreateScreenStateChangedEvent(android::view::DISPLAY_STATE_ON, 5098a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen bucketStartTimeNs + 202)); 5108a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen events.push_back(CreateScreenStateChangedEvent(android::view::DISPLAY_STATE_OFF, 5118a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen bucketStartTimeNs + bucketSizeNs + 800)); 5129369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 5139369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac events.push_back(CreateSyncStartEvent(attributions1, "ReadEmail", bucketStartTimeNs + 200)); 5149369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac events.push_back(CreateSyncEndEvent(attributions1, "ReadEmail", 5158a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen bucketStartTimeNs + bucketSizeNs + 300)); 5169369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 5179369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac events.push_back(CreateSyncStartEvent(attributions1, "ReadDoc", bucketStartTimeNs + 400)); 5188a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen events.push_back( 5198a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen CreateSyncEndEvent(attributions1, "ReadDoc", bucketStartTimeNs + bucketSizeNs - 1)); 5209369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 5219369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac events.push_back(CreateSyncStartEvent(attributions2, "ReadEmail", bucketStartTimeNs + 401)); 5229369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac events.push_back(CreateSyncEndEvent(attributions2, "ReadEmail", 5238a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen bucketStartTimeNs + bucketSizeNs + 700)); 5249369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 5259369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac sortLogEventsByTimestamp(&events); 5269369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 5279369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac for (const auto& event : events) { 5289369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac processor->OnLogEvent(event.get()); 5299369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac } 5309369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 5319369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac ConfigMetricsReportList reports; 5328a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen vector<uint8_t> buffer; 53356ae0d9a48212c6e886e5887a6f9191f3020af40David Chen processor->onDumpReport(cfgKey, bucketStartTimeNs + 2 * bucketSizeNs + 1, false, ADB_DUMP, 53456ae0d9a48212c6e886e5887a6f9191f3020af40David Chen &buffer); 5358a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_TRUE(buffer.size() > 0); 5368a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size())); 5379def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac backfillDimensionPath(&reports); 5389def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac backfillStringInReport(&reports); 5399def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac backfillStartEndTimestamp(&reports); 5409369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 5419369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(reports.reports_size(), 1); 5429369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(reports.reports(0).metrics_size(), 1); 5439369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac StatsLogReport::DurationMetricDataWrapper metrics; 5449369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac sortMetricDataByDimensionsValue(reports.reports(0).metrics(0).duration_metrics(), &metrics); 5459369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 5469369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(metrics.data_size(), 3); 5479369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac auto data = metrics.data(0); 5489369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_FALSE(data.dimensions_in_what().has_field()); 5499369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_FALSE(data.dimensions_in_condition().has_field()); 55013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster if (aggregationType == DurationMetric::SUM) { 55113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info_size(), 2); 55213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).duration_nanos(), 9); 55313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), bucketStartTimeNs); 55413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(), 55513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 55613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).duration_nanos(), 30); 55713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).start_bucket_elapsed_nanos(), 55813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 55913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).end_bucket_elapsed_nanos(), 56013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + 2 * bucketSizeNs); 56113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster } else { 56213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info_size(), 2); 56313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).duration_nanos(), 9); 56413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), bucketStartTimeNs); 56513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(), 56613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 56713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).duration_nanos(), 30); 56813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).start_bucket_elapsed_nanos(), 56913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 57013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).end_bucket_elapsed_nanos(), 57113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + 2 * bucketSizeNs); 57213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster } 5739369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 5749369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac data = metrics.data(1); 5759369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_FALSE(data.dimensions_in_what().has_field()); 5768a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen ValidateAttributionUidAndTagDimension(data.dimensions_in_condition(), 5778a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen android::util::SYNC_STATE_CHANGED, 111, "App1"); 5789369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.bucket_info_size(), 2); 57913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster 58013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster if (aggregationType == DurationMetric::SUM) { 58113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).duration_nanos(), 500 - 201 + bucketSizeNs - 600); 58213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).duration_nanos(), 300); 58313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster } else { 58413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).duration_nanos(), 500 - 201); 58513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).duration_nanos(), bucketSizeNs - 300); 58613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster } 587330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), bucketStartTimeNs); 58813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(), 58913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 59013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).start_bucket_elapsed_nanos(), 59113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 59213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).end_bucket_elapsed_nanos(), 59313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + 2 * bucketSizeNs); 5949369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 5959369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac data = metrics.data(2); 5969369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_FALSE(data.dimensions_in_what().has_field()); 5978a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen ValidateAttributionUidAndTagDimension(data.dimensions_in_condition(), 5988a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen android::util::SYNC_STATE_CHANGED, 333, "App2"); 5999369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.bucket_info_size(), 2); 60013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster if (aggregationType == DurationMetric::SUM) { 60113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).duration_nanos(), 500 - 401 + bucketSizeNs - 600); 60213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).duration_nanos(), 700); 60313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster } else { 60413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).duration_nanos(), 500 - 401); 60513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).duration_nanos(), bucketSizeNs + 700 - 600); 60613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster } 607330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), bucketStartTimeNs); 60813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(), 60913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 61013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).start_bucket_elapsed_nanos(), 61113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 61213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).end_bucket_elapsed_nanos(), 61313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + 2 * bucketSizeNs); 6149369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac } 6159369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac} 6169369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 6179369446f0b04945d6674550728ae81196d6fb5c2Yangster-macnamespace { 6189369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 61913fb7e4eeaf7aee408821afe7ee55a5167e49e59YangsterStatsdConfig CreateDurationMetricConfig_Link_CombinationCondition( 62013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster DurationMetric::AggregationType aggregationType) { 6219369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac StatsdConfig config; 6228faaa01489d81b815e62e4416e78e4b5500b487aDavid Chen config.add_allowed_log_source("AID_ROOT"); // LogEvent defaults to UID of root. 6239369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac *config.add_atom_matcher() = CreateMoveToBackgroundAtomMatcher(); 6249369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac *config.add_atom_matcher() = CreateMoveToForegroundAtomMatcher(); 6259369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac *config.add_atom_matcher() = CreateScreenTurnedOnAtomMatcher(); 6269369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac *config.add_atom_matcher() = CreateScreenTurnedOffAtomMatcher(); 6279369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac *config.add_atom_matcher() = CreateSyncStartAtomMatcher(); 6289369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac *config.add_atom_matcher() = CreateSyncEndAtomMatcher(); 6299369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 6309369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac auto screenIsOffPredicate = CreateScreenIsOffPredicate(); 6319369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac auto isSyncingPredicate = CreateIsSyncingPredicate(); 6329369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac auto syncDimension = isSyncingPredicate.mutable_simple_predicate()->mutable_dimensions(); 6338a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen *syncDimension = CreateAttributionUidAndTagDimensions(android::util::SYNC_STATE_CHANGED, 6348a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen {Position::FIRST}); 6359369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac syncDimension->add_child()->set_field(2 /* name field */); 6369369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 6379369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac auto isInBackgroundPredicate = CreateIsInBackgroundPredicate(); 6389369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac *isInBackgroundPredicate.mutable_simple_predicate()->mutable_dimensions() = 6398a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen CreateDimensions(android::util::ACTIVITY_FOREGROUND_STATE_CHANGED, {1 /* uid field */}); 6409369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 6419369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac *config.add_predicate() = screenIsOffPredicate; 6429369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac *config.add_predicate() = isSyncingPredicate; 6439369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac *config.add_predicate() = isInBackgroundPredicate; 6449369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac auto combinationPredicate = config.add_predicate(); 6459369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac combinationPredicate->set_id(987654); 6469369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac combinationPredicate->mutable_combination()->set_operation(LogicalOperation::OR); 6479369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac addPredicateToPredicateCombination(screenIsOffPredicate, combinationPredicate); 6489369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac addPredicateToPredicateCombination(isSyncingPredicate, combinationPredicate); 6499369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 6509369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac auto metric = config.add_duration_metric(); 65159cc24dbfda4148c1f5ef4de9c8763caa8672443yro metric->set_bucket(FIVE_MINUTES); 6529369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac metric->set_id(StringToId("AppInBackgroundMetric")); 6539369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac metric->set_what(isInBackgroundPredicate.id()); 6549369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac metric->set_condition(combinationPredicate->id()); 65513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster metric->set_aggregation_type(aggregationType); 6568a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen *metric->mutable_dimensions_in_what() = 6578a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen CreateDimensions(android::util::ACTIVITY_FOREGROUND_STATE_CHANGED, {1 /* uid field */}); 6589369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac *metric->mutable_dimensions_in_condition() = CreateAttributionUidAndTagDimensions( 6599369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac android::util::SYNC_STATE_CHANGED, {Position::FIRST}); 6609369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 6619369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac // Links between crash atom and condition of app is in syncing. 6629369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac auto links = metric->add_links(); 6639369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac links->set_condition(isSyncingPredicate.id()); 6649369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac auto dimensionWhat = links->mutable_fields_in_what(); 6659369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac dimensionWhat->set_field(android::util::ACTIVITY_FOREGROUND_STATE_CHANGED); 6669369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac dimensionWhat->add_child()->set_field(1); // uid field. 6678a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen *links->mutable_fields_in_condition() = 6688a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen CreateAttributionUidDimensions(android::util::SYNC_STATE_CHANGED, {Position::FIRST}); 6699369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac return config; 6709369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac} 6719369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 6729369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac} // namespace 6739369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 67413fb7e4eeaf7aee408821afe7ee55a5167e49e59YangsterTEST(DimensionInConditionE2eTest, TestDurationMetric_Link_OR_CombinationCondition) { 6758a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen for (auto aggregationType : {DurationMetric::SUM, DurationMetric::MAX_SPARSE}) { 6769369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac ConfigKey cfgKey; 67713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster auto config = CreateDurationMetricConfig_Link_CombinationCondition(aggregationType); 6789369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac int64_t bucketStartTimeNs = 10000000000; 6799369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac int64_t bucketSizeNs = 6808a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen TimeUnitToBucketSizeInMillis(config.duration_metric(0).bucket()) * 1000000LL; 6819369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 68215f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac auto processor = CreateStatsLogProcessor( 68315f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac bucketStartTimeNs, bucketStartTimeNs, config, cfgKey); 6849369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(processor->mMetricsManagers.size(), 1u); 6859369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_TRUE(processor->mMetricsManagers.begin()->second->isConfigValid()); 6869369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 6879c1debe330006b2b4d5c08a55905789c57369609Yao Chen std::vector<AttributionNodeInternal> attributions1 = { 6889c1debe330006b2b4d5c08a55905789c57369609Yao Chen CreateAttribution(111, "App1"), CreateAttribution(222, "GMSCoreModule1"), 6899c1debe330006b2b4d5c08a55905789c57369609Yao Chen CreateAttribution(222, "GMSCoreModule2")}; 6909369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 6919c1debe330006b2b4d5c08a55905789c57369609Yao Chen std::vector<AttributionNodeInternal> attributions2 = { 6929c1debe330006b2b4d5c08a55905789c57369609Yao Chen CreateAttribution(333, "App2"), CreateAttribution(222, "GMSCoreModule1"), 6939c1debe330006b2b4d5c08a55905789c57369609Yao Chen CreateAttribution(555, "GMSCoreModule2")}; 6949369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 6959369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac std::vector<std::unique_ptr<LogEvent>> events; 6969369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 6979369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac events.push_back(CreateMoveToBackgroundEvent(111, bucketStartTimeNs + 101)); 6989369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac events.push_back(CreateMoveToForegroundEvent(111, bucketStartTimeNs + 110)); 6999369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 7009369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac events.push_back(CreateMoveToBackgroundEvent(111, bucketStartTimeNs + 201)); 7019369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac events.push_back(CreateMoveToForegroundEvent(111, bucketStartTimeNs + bucketSizeNs + 100)); 7029369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 7039369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac events.push_back(CreateMoveToBackgroundEvent(333, bucketStartTimeNs + 399)); 7049369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac events.push_back(CreateMoveToForegroundEvent(333, bucketStartTimeNs + bucketSizeNs + 800)); 7059369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 7068a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen events.push_back(CreateScreenStateChangedEvent(android::view::DISPLAY_STATE_ON, 7078a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen bucketStartTimeNs + 10)); 7088a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen events.push_back(CreateScreenStateChangedEvent(android::view::DISPLAY_STATE_OFF, 7098a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen bucketStartTimeNs + 100)); 7108a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen events.push_back(CreateScreenStateChangedEvent(android::view::DISPLAY_STATE_ON, 7118a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen bucketStartTimeNs + 202)); 7128a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen events.push_back(CreateScreenStateChangedEvent(android::view::DISPLAY_STATE_OFF, 7138a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen bucketStartTimeNs + bucketSizeNs + 801)); 7149369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 7159369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac events.push_back(CreateSyncStartEvent(attributions1, "ReadEmail", bucketStartTimeNs + 200)); 7169369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac events.push_back(CreateSyncEndEvent(attributions1, "ReadEmail", 7178a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen bucketStartTimeNs + bucketSizeNs + 300)); 7189369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 7199369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac events.push_back(CreateSyncStartEvent(attributions1, "ReadDoc", bucketStartTimeNs + 400)); 7208a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen events.push_back( 7218a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen CreateSyncEndEvent(attributions1, "ReadDoc", bucketStartTimeNs + bucketSizeNs - 1)); 7229369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 7239369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac events.push_back(CreateSyncStartEvent(attributions2, "ReadEmail", bucketStartTimeNs + 401)); 7249369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac events.push_back(CreateSyncEndEvent(attributions2, "ReadEmail", 7258a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen bucketStartTimeNs + bucketSizeNs + 700)); 7269369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 7279369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac sortLogEventsByTimestamp(&events); 7289369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 7299369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac for (const auto& event : events) { 7309369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac processor->OnLogEvent(event.get()); 7319369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac } 7329369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 7339369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac ConfigMetricsReportList reports; 7348a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen vector<uint8_t> buffer; 73556ae0d9a48212c6e886e5887a6f9191f3020af40David Chen processor->onDumpReport(cfgKey, bucketStartTimeNs + 2 * bucketSizeNs + 1, false, ADB_DUMP, 73656ae0d9a48212c6e886e5887a6f9191f3020af40David Chen &buffer); 7378a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_TRUE(buffer.size() > 0); 7388a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size())); 7399def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac backfillDimensionPath(&reports); 7409def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac backfillStringInReport(&reports); 7419def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac backfillStartEndTimestamp(&reports); 7429369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 7439369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(reports.reports_size(), 1); 7449369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(reports.reports(0).metrics_size(), 1); 7459369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac StatsLogReport::DurationMetricDataWrapper metrics; 7469369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac sortMetricDataByDimensionsValue(reports.reports(0).metrics(0).duration_metrics(), &metrics); 7479369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 7489369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(metrics.data_size(), 3); 7499369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac auto data = metrics.data(0); 7509369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).field(), 1); 7519369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).value_int(), 111); 7529369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_FALSE(data.dimensions_in_condition().has_field()); 7539369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.bucket_info_size(), 1); 7549369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.bucket_info(0).duration_nanos(), 9); 755330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), bucketStartTimeNs); 756330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(), bucketStartTimeNs + bucketSizeNs); 7579369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 7589369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac data = metrics.data(1); 7599369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).field(), 1); 7609369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).value_int(), 111); 7618a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen ValidateAttributionUidAndTagDimension(data.dimensions_in_condition(), 7628a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen android::util::SYNC_STATE_CHANGED, 111, "App1"); 76313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster if (aggregationType == DurationMetric::SUM) { 76413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info_size(), 2); 76513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).duration_nanos(), bucketSizeNs - 201); 76613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).duration_nanos(), 100); 76713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), bucketStartTimeNs); 76813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(), 76913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 77013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).start_bucket_elapsed_nanos(), 77113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 77213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).end_bucket_elapsed_nanos(), 77313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + 2 * bucketSizeNs); 77413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster } else { 77513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info_size(), 1); 77613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).duration_nanos(), bucketSizeNs + 100 - 201); 77713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), 77813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 77913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(), 78013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + 2 * bucketSizeNs); 78113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster } 7829369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 7839369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac data = metrics.data(2); 7849369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).field(), 1); 7859369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac EXPECT_EQ(data.dimensions_in_what().value_tuple().dimensions_value(0).value_int(), 333); 7868a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen ValidateAttributionUidAndTagDimension(data.dimensions_in_condition(), 7878a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen android::util::SYNC_STATE_CHANGED, 333, "App2"); 78813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster if (aggregationType == DurationMetric::SUM) { 78913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info_size(), 2); 79013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).duration_nanos(), bucketSizeNs - 401); 79113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).duration_nanos(), 700); 79213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), bucketStartTimeNs); 79313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(), 79413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 79513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).start_bucket_elapsed_nanos(), 79613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 79713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(1).end_bucket_elapsed_nanos(), 79813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + 2 * bucketSizeNs); 79913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster } else { 80013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info_size(), 1); 80113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).duration_nanos(), bucketSizeNs + 299); 80213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).start_bucket_elapsed_nanos(), 80313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + bucketSizeNs); 80413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster EXPECT_EQ(data.bucket_info(0).end_bucket_elapsed_nanos(), 80513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster bucketStartTimeNs + 2 * bucketSizeNs); 80613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster } 8079369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac } 8089369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac} 8099369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 8109369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac#else 8119369446f0b04945d6674550728ae81196d6fb5c2Yangster-macGTEST_LOG_(INFO) << "This test does nothing.\n"; 8129369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac#endif 8139369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 8149369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac} // namespace statsd 8159369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac} // namespace os 81659cc24dbfda4148c1f5ef4de9c8763caa8672443yro} // namespace android 817