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