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