12087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac// Copyright (C) 2017 The Android Open Source Project
22087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac//
32087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac// Licensed under the Apache License, Version 2.0 (the "License");
42087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac// you may not use this file except in compliance with the License.
52087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac// You may obtain a copy of the License at
62087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac//
72087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac//      http://www.apache.org/licenses/LICENSE-2.0
82087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac//
92087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac// Unless required by applicable law or agreed to in writing, software
102087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac// distributed under the License is distributed on an "AS IS" BASIS,
112087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
122087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac// See the License for the specific language governing permissions and
132087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac// limitations under the License.
142087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
152087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac#include "statsd_test_util.h"
162087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
172087716f2bdca90c7c3034d556ac12911bd8018eYangster-macnamespace android {
182087716f2bdca90c7c3034d556ac12911bd8018eYangster-macnamespace os {
192087716f2bdca90c7c3034d556ac12911bd8018eYangster-macnamespace statsd {
202087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
2115f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac
2287718e283a62660eaa0e39fd780c97a290da988fYangster-macAtomMatcher CreateSimpleAtomMatcher(const string& name, int atomId) {
2387718e283a62660eaa0e39fd780c97a290da988fYangster-mac    AtomMatcher atom_matcher;
2487718e283a62660eaa0e39fd780c97a290da988fYangster-mac    atom_matcher.set_id(StringToId(name));
2587718e283a62660eaa0e39fd780c97a290da988fYangster-mac    auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
2687718e283a62660eaa0e39fd780c97a290da988fYangster-mac    simple_atom_matcher->set_atom_id(atomId);
2787718e283a62660eaa0e39fd780c97a290da988fYangster-mac    return atom_matcher;
2887718e283a62660eaa0e39fd780c97a290da988fYangster-mac}
2987718e283a62660eaa0e39fd780c97a290da988fYangster-mac
3015f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-macAtomMatcher CreateTemperatureAtomMatcher() {
3115f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac    return CreateSimpleAtomMatcher("TemperatureMatcher", android::util::TEMPERATURE);
3215f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac}
3315f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac
3413fb7e4eeaf7aee408821afe7ee55a5167e49e59YangsterAtomMatcher CreateScheduledJobStateChangedAtomMatcher(const string& name,
3513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster                                                      ScheduledJobStateChanged::State state) {
3613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    AtomMatcher atom_matcher;
3713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    atom_matcher.set_id(StringToId(name));
3813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
3913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    simple_atom_matcher->set_atom_id(android::util::SCHEDULED_JOB_STATE_CHANGED);
4013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
4113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    field_value_matcher->set_field(3);  // State field.
4213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    field_value_matcher->set_eq_int(state);
4313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    return atom_matcher;
4413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster}
4513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster
4613fb7e4eeaf7aee408821afe7ee55a5167e49e59YangsterAtomMatcher CreateStartScheduledJobAtomMatcher() {
4713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    return CreateScheduledJobStateChangedAtomMatcher("ScheduledJobStart",
4813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster                                                     ScheduledJobStateChanged::STARTED);
4913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster}
5013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster
5113fb7e4eeaf7aee408821afe7ee55a5167e49e59YangsterAtomMatcher CreateFinishScheduledJobAtomMatcher() {
5213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    return CreateScheduledJobStateChangedAtomMatcher("ScheduledJobFinish",
5313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster                                                     ScheduledJobStateChanged::FINISHED);
5413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster}
5513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster
569369446f0b04945d6674550728ae81196d6fb5c2Yangster-macAtomMatcher CreateScreenBrightnessChangedAtomMatcher() {
579369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    AtomMatcher atom_matcher;
589369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    atom_matcher.set_id(StringToId("ScreenBrightnessChanged"));
599369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
609369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    simple_atom_matcher->set_atom_id(android::util::SCREEN_BRIGHTNESS_CHANGED);
619369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    return atom_matcher;
629369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac}
639369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac
649369446f0b04945d6674550728ae81196d6fb5c2Yangster-macAtomMatcher CreateUidProcessStateChangedAtomMatcher() {
659369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    AtomMatcher atom_matcher;
669369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    atom_matcher.set_id(StringToId("UidProcessStateChanged"));
679369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
689369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    simple_atom_matcher->set_atom_id(android::util::UID_PROCESS_STATE_CHANGED);
699369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    return atom_matcher;
709369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac}
719369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac
722087716f2bdca90c7c3034d556ac12911bd8018eYangster-macAtomMatcher CreateWakelockStateChangedAtomMatcher(const string& name,
732087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac                                                  WakelockStateChanged::State state) {
742087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    AtomMatcher atom_matcher;
7594e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    atom_matcher.set_id(StringToId(name));
762087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
772087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    simple_atom_matcher->set_atom_id(android::util::WAKELOCK_STATE_CHANGED);
782087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
792087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    field_value_matcher->set_field(4);  // State field.
802087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    field_value_matcher->set_eq_int(state);
812087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    return atom_matcher;
822087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}
832087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
842087716f2bdca90c7c3034d556ac12911bd8018eYangster-macAtomMatcher CreateAcquireWakelockAtomMatcher() {
852087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    return CreateWakelockStateChangedAtomMatcher("AcquireWakelock", WakelockStateChanged::ACQUIRE);
862087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}
872087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
882087716f2bdca90c7c3034d556ac12911bd8018eYangster-macAtomMatcher CreateReleaseWakelockAtomMatcher() {
892087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    return CreateWakelockStateChangedAtomMatcher("ReleaseWakelock", WakelockStateChanged::RELEASE);
902087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}
912087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
929369446f0b04945d6674550728ae81196d6fb5c2Yangster-macAtomMatcher CreateBatterySaverModeStateChangedAtomMatcher(
939369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    const string& name, BatterySaverModeStateChanged::State state) {
949369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    AtomMatcher atom_matcher;
959369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    atom_matcher.set_id(StringToId(name));
969369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
979369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    simple_atom_matcher->set_atom_id(android::util::BATTERY_SAVER_MODE_STATE_CHANGED);
989369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
999369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    field_value_matcher->set_field(1);  // State field.
1009369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    field_value_matcher->set_eq_int(state);
1019369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    return atom_matcher;
1029369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac}
1039369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac
1049369446f0b04945d6674550728ae81196d6fb5c2Yangster-macAtomMatcher CreateBatterySaverModeStartAtomMatcher() {
1059369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    return CreateBatterySaverModeStateChangedAtomMatcher(
1069369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac        "BatterySaverModeStart", BatterySaverModeStateChanged::ON);
1079369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac}
1089369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac
1099369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac
1109369446f0b04945d6674550728ae81196d6fb5c2Yangster-macAtomMatcher CreateBatterySaverModeStopAtomMatcher() {
1119369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    return CreateBatterySaverModeStateChangedAtomMatcher(
1129369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac        "BatterySaverModeStop", BatterySaverModeStateChanged::OFF);
1139369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac}
1149369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac
1159369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac
1162087716f2bdca90c7c3034d556ac12911bd8018eYangster-macAtomMatcher CreateScreenStateChangedAtomMatcher(
1171a1b0464cb43903ed540f4c43fd423b16e398c04Bookatz    const string& name, android::view::DisplayStateEnum state) {
1182087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    AtomMatcher atom_matcher;
11994e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    atom_matcher.set_id(StringToId(name));
1202087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
1212087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    simple_atom_matcher->set_atom_id(android::util::SCREEN_STATE_CHANGED);
1222087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
1232087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    field_value_matcher->set_field(1);  // State field.
1242087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    field_value_matcher->set_eq_int(state);
1252087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    return atom_matcher;
1262087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}
1272087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
1289369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac
1292087716f2bdca90c7c3034d556ac12911bd8018eYangster-macAtomMatcher CreateScreenTurnedOnAtomMatcher() {
1301a1b0464cb43903ed540f4c43fd423b16e398c04Bookatz    return CreateScreenStateChangedAtomMatcher("ScreenTurnedOn",
1311a1b0464cb43903ed540f4c43fd423b16e398c04Bookatz            android::view::DisplayStateEnum::DISPLAY_STATE_ON);
1322087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}
1332087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
1342087716f2bdca90c7c3034d556ac12911bd8018eYangster-macAtomMatcher CreateScreenTurnedOffAtomMatcher() {
1351a1b0464cb43903ed540f4c43fd423b16e398c04Bookatz    return CreateScreenStateChangedAtomMatcher("ScreenTurnedOff",
1361a1b0464cb43903ed540f4c43fd423b16e398c04Bookatz            ::android::view::DisplayStateEnum::DISPLAY_STATE_OFF);
1372087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}
1382087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
1392087716f2bdca90c7c3034d556ac12911bd8018eYangster-macAtomMatcher CreateSyncStateChangedAtomMatcher(
1402087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    const string& name, SyncStateChanged::State state) {
1412087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    AtomMatcher atom_matcher;
14294e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    atom_matcher.set_id(StringToId(name));
1432087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
1442087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    simple_atom_matcher->set_atom_id(android::util::SYNC_STATE_CHANGED);
1452087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
1462087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    field_value_matcher->set_field(3);  // State field.
1472087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    field_value_matcher->set_eq_int(state);
1482087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    return atom_matcher;
1492087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}
1502087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
1512087716f2bdca90c7c3034d556ac12911bd8018eYangster-macAtomMatcher CreateSyncStartAtomMatcher() {
1522087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    return CreateSyncStateChangedAtomMatcher("SyncStart", SyncStateChanged::ON);
1532087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}
1542087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
1552087716f2bdca90c7c3034d556ac12911bd8018eYangster-macAtomMatcher CreateSyncEndAtomMatcher() {
1562087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    return CreateSyncStateChangedAtomMatcher("SyncEnd", SyncStateChanged::OFF);
1572087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}
1582087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
1592087716f2bdca90c7c3034d556ac12911bd8018eYangster-macAtomMatcher CreateActivityForegroundStateChangedAtomMatcher(
1605caaa9d8542585e537ac762c35879eb42dd6bbb4Chenjie Yu    const string& name, ActivityForegroundStateChanged::State state) {
1612087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    AtomMatcher atom_matcher;
16294e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    atom_matcher.set_id(StringToId(name));
1632087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
1642087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    simple_atom_matcher->set_atom_id(android::util::ACTIVITY_FOREGROUND_STATE_CHANGED);
1652087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
1662087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    field_value_matcher->set_field(4);  // Activity field.
1675caaa9d8542585e537ac762c35879eb42dd6bbb4Chenjie Yu    field_value_matcher->set_eq_int(state);
1682087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    return atom_matcher;
1692087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}
1702087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
1712087716f2bdca90c7c3034d556ac12911bd8018eYangster-macAtomMatcher CreateMoveToBackgroundAtomMatcher() {
1722087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    return CreateActivityForegroundStateChangedAtomMatcher(
1735caaa9d8542585e537ac762c35879eb42dd6bbb4Chenjie Yu        "Background", ActivityForegroundStateChanged::BACKGROUND);
1742087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}
1752087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
1762087716f2bdca90c7c3034d556ac12911bd8018eYangster-macAtomMatcher CreateMoveToForegroundAtomMatcher() {
1772087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    return CreateActivityForegroundStateChangedAtomMatcher(
1785caaa9d8542585e537ac762c35879eb42dd6bbb4Chenjie Yu        "Foreground", ActivityForegroundStateChanged::FOREGROUND);
1792087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}
1802087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
1812087716f2bdca90c7c3034d556ac12911bd8018eYangster-macAtomMatcher CreateProcessLifeCycleStateChangedAtomMatcher(
1825caaa9d8542585e537ac762c35879eb42dd6bbb4Chenjie Yu    const string& name, ProcessLifeCycleStateChanged::State state) {
1832087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    AtomMatcher atom_matcher;
18494e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    atom_matcher.set_id(StringToId(name));
1852087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
1862087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    simple_atom_matcher->set_atom_id(android::util::PROCESS_LIFE_CYCLE_STATE_CHANGED);
1872087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
1882087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    field_value_matcher->set_field(3);  // Process state field.
1895caaa9d8542585e537ac762c35879eb42dd6bbb4Chenjie Yu    field_value_matcher->set_eq_int(state);
1902087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    return atom_matcher;
1912087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}
1922087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
1932087716f2bdca90c7c3034d556ac12911bd8018eYangster-macAtomMatcher CreateProcessCrashAtomMatcher() {
1942087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    return CreateProcessLifeCycleStateChangedAtomMatcher(
1955caaa9d8542585e537ac762c35879eb42dd6bbb4Chenjie Yu        "Crashed", ProcessLifeCycleStateChanged::CRASHED);
1962087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}
1972087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
19813fb7e4eeaf7aee408821afe7ee55a5167e49e59YangsterPredicate CreateScheduledJobPredicate() {
19913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    Predicate predicate;
20013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    predicate.set_id(StringToId("ScheduledJobRunningPredicate"));
20113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    predicate.mutable_simple_predicate()->set_start(StringToId("ScheduledJobStart"));
20213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    predicate.mutable_simple_predicate()->set_stop(StringToId("ScheduledJobFinish"));
20313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    return predicate;
20413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster}
20513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster
2069369446f0b04945d6674550728ae81196d6fb5c2Yangster-macPredicate CreateBatterySaverModePredicate() {
2079369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    Predicate predicate;
2089369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    predicate.set_id(StringToId("BatterySaverIsOn"));
2099369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    predicate.mutable_simple_predicate()->set_start(StringToId("BatterySaverModeStart"));
2109369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    predicate.mutable_simple_predicate()->set_stop(StringToId("BatterySaverModeStop"));
2119369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    return predicate;
2129369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac}
2132087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
2142087716f2bdca90c7c3034d556ac12911bd8018eYangster-macPredicate CreateScreenIsOnPredicate() {
2152087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    Predicate predicate;
21694e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    predicate.set_id(StringToId("ScreenIsOn"));
21794e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    predicate.mutable_simple_predicate()->set_start(StringToId("ScreenTurnedOn"));
21894e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    predicate.mutable_simple_predicate()->set_stop(StringToId("ScreenTurnedOff"));
2192087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    return predicate;
2202087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}
2212087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
2222087716f2bdca90c7c3034d556ac12911bd8018eYangster-macPredicate CreateScreenIsOffPredicate() {
2232087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    Predicate predicate;
2248a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    predicate.set_id(1111123);
22594e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    predicate.mutable_simple_predicate()->set_start(StringToId("ScreenTurnedOff"));
22694e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    predicate.mutable_simple_predicate()->set_stop(StringToId("ScreenTurnedOn"));
2272087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    return predicate;
2282087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}
2292087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
2302087716f2bdca90c7c3034d556ac12911bd8018eYangster-macPredicate CreateHoldingWakelockPredicate() {
2312087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    Predicate predicate;
23294e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    predicate.set_id(StringToId("HoldingWakelock"));
23394e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    predicate.mutable_simple_predicate()->set_start(StringToId("AcquireWakelock"));
23494e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    predicate.mutable_simple_predicate()->set_stop(StringToId("ReleaseWakelock"));
2352087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    return predicate;
2362087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}
2372087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
2382087716f2bdca90c7c3034d556ac12911bd8018eYangster-macPredicate CreateIsSyncingPredicate() {
2392087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    Predicate predicate;
2408a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    predicate.set_id(33333333333333);
24194e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    predicate.mutable_simple_predicate()->set_start(StringToId("SyncStart"));
24294e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    predicate.mutable_simple_predicate()->set_stop(StringToId("SyncEnd"));
2432087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    return predicate;
2442087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}
2452087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
2462087716f2bdca90c7c3034d556ac12911bd8018eYangster-macPredicate CreateIsInBackgroundPredicate() {
2472087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    Predicate predicate;
24894e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    predicate.set_id(StringToId("IsInBackground"));
2495caaa9d8542585e537ac762c35879eb42dd6bbb4Chenjie Yu    predicate.mutable_simple_predicate()->set_start(StringToId("Background"));
2505caaa9d8542585e537ac762c35879eb42dd6bbb4Chenjie Yu    predicate.mutable_simple_predicate()->set_stop(StringToId("Foreground"));
2512087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    return predicate;
2522087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}
2532087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
2542087716f2bdca90c7c3034d556ac12911bd8018eYangster-macvoid addPredicateToPredicateCombination(const Predicate& predicate,
2552087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac                                        Predicate* combinationPredicate) {
25694e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    combinationPredicate->mutable_combination()->add_predicate(predicate.id());
2572087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}
2582087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
2592087716f2bdca90c7c3034d556ac12911bd8018eYangster-macFieldMatcher CreateAttributionUidDimensions(const int atomId,
2602087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac                                            const std::vector<Position>& positions) {
2612087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    FieldMatcher dimensions;
2622087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    dimensions.set_field(atomId);
2632087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    for (const auto position : positions) {
2642087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac        auto child = dimensions.add_child();
2652087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac        child->set_field(1);
2662087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac        child->set_position(position);
2672087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac        child->add_child()->set_field(1);
2682087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    }
2692087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    return dimensions;
2702087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}
2712087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
2722087716f2bdca90c7c3034d556ac12911bd8018eYangster-macFieldMatcher CreateAttributionUidAndTagDimensions(const int atomId,
2732087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac                                                 const std::vector<Position>& positions) {
2742087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    FieldMatcher dimensions;
2752087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    dimensions.set_field(atomId);
2762087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    for (const auto position : positions) {
2772087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac        auto child = dimensions.add_child();
2782087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac        child->set_field(1);
2792087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac        child->set_position(position);
2802087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac        child->add_child()->set_field(1);
2812087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac        child->add_child()->set_field(2);
2822087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    }
2832087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    return dimensions;
2842087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}
2852087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
2862087716f2bdca90c7c3034d556ac12911bd8018eYangster-macFieldMatcher CreateDimensions(const int atomId, const std::vector<int>& fields) {
2872087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    FieldMatcher dimensions;
2882087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    dimensions.set_field(atomId);
2892087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    for (const int field : fields) {
2902087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac        dimensions.add_child()->set_field(field);
2912087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    }
2922087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    return dimensions;
2932087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}
2942087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
2952087716f2bdca90c7c3034d556ac12911bd8018eYangster-macstd::unique_ptr<LogEvent> CreateScreenStateChangedEvent(
2961a1b0464cb43903ed540f4c43fd423b16e398c04Bookatz    const android::view::DisplayStateEnum state, uint64_t timestampNs) {
2972087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    auto event = std::make_unique<LogEvent>(android::util::SCREEN_STATE_CHANGED, timestampNs);
2982087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    EXPECT_TRUE(event->write(state));
2992087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    event->init();
3002087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    return event;
3012087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}
3022087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
3039369446f0b04945d6674550728ae81196d6fb5c2Yangster-macstd::unique_ptr<LogEvent> CreateBatterySaverOnEvent(uint64_t timestampNs) {
3049369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    auto event = std::make_unique<LogEvent>(
3059369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac        android::util::BATTERY_SAVER_MODE_STATE_CHANGED, timestampNs);
3069369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    EXPECT_TRUE(event->write(BatterySaverModeStateChanged::ON));
3079369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    event->init();
3089369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    return event;
3099369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac}
3109369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac
3119369446f0b04945d6674550728ae81196d6fb5c2Yangster-macstd::unique_ptr<LogEvent> CreateBatterySaverOffEvent(uint64_t timestampNs) {
3129369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    auto event = std::make_unique<LogEvent>(
3139369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac        android::util::BATTERY_SAVER_MODE_STATE_CHANGED, timestampNs);
3149369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    EXPECT_TRUE(event->write(BatterySaverModeStateChanged::OFF));
3159369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    event->init();
3169369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    return event;
3179369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac}
3189369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac
3199369446f0b04945d6674550728ae81196d6fb5c2Yangster-macstd::unique_ptr<LogEvent> CreateScreenBrightnessChangedEvent(
3209369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    int level, uint64_t timestampNs) {
3219369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    auto event = std::make_unique<LogEvent>(android::util::SCREEN_BRIGHTNESS_CHANGED, timestampNs);
3229369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    EXPECT_TRUE(event->write(level));
3239369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    event->init();
3249369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    return event;
3259369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac
3269369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac}
3279369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac
32813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangsterstd::unique_ptr<LogEvent> CreateScheduledJobStateChangedEvent(
32913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster        const std::vector<AttributionNodeInternal>& attributions, const string& jobName,
33013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster        const ScheduledJobStateChanged::State state, uint64_t timestampNs) {
33113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    auto event = std::make_unique<LogEvent>(android::util::SCHEDULED_JOB_STATE_CHANGED, timestampNs);
33213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    event->write(attributions);
33313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    event->write(jobName);
33413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    event->write(state);
33513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    event->init();
33613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    return event;
33713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster}
33813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster
33913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangsterstd::unique_ptr<LogEvent> CreateStartScheduledJobEvent(
34013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    const std::vector<AttributionNodeInternal>& attributions,
34113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    const string& name, uint64_t timestampNs) {
34213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    return CreateScheduledJobStateChangedEvent(
34313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster            attributions, name, ScheduledJobStateChanged::STARTED, timestampNs);
34413fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster}
34513fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster
34613fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster// Create log event when scheduled job finishes.
34713fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangsterstd::unique_ptr<LogEvent> CreateFinishScheduledJobEvent(
34813fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    const std::vector<AttributionNodeInternal>& attributions,
34913fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    const string& name, uint64_t timestampNs) {
35013fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster    return CreateScheduledJobStateChangedEvent(
35113fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster            attributions, name, ScheduledJobStateChanged::FINISHED, timestampNs);
35213fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster}
35313fb7e4eeaf7aee408821afe7ee55a5167e49e59Yangster
3542087716f2bdca90c7c3034d556ac12911bd8018eYangster-macstd::unique_ptr<LogEvent> CreateWakelockStateChangedEvent(
3559c1debe330006b2b4d5c08a55905789c57369609Yao Chen        const std::vector<AttributionNodeInternal>& attributions, const string& wakelockName,
3569c1debe330006b2b4d5c08a55905789c57369609Yao Chen        const WakelockStateChanged::State state, uint64_t timestampNs) {
3572087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    auto event = std::make_unique<LogEvent>(android::util::WAKELOCK_STATE_CHANGED, timestampNs);
3582087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    event->write(attributions);
3591a1b0464cb43903ed540f4c43fd423b16e398c04Bookatz    event->write(android::os::WakeLockLevelEnum::PARTIAL_WAKE_LOCK);
3602087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    event->write(wakelockName);
3612087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    event->write(state);
3622087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    event->init();
3632087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    return event;
3642087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}
3652087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
3662087716f2bdca90c7c3034d556ac12911bd8018eYangster-macstd::unique_ptr<LogEvent> CreateAcquireWakelockEvent(
3679c1debe330006b2b4d5c08a55905789c57369609Yao Chen        const std::vector<AttributionNodeInternal>& attributions, const string& wakelockName,
3689c1debe330006b2b4d5c08a55905789c57369609Yao Chen        uint64_t timestampNs) {
3692087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    return CreateWakelockStateChangedEvent(
3702087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac        attributions, wakelockName, WakelockStateChanged::ACQUIRE, timestampNs);
3712087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}
3722087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
3732087716f2bdca90c7c3034d556ac12911bd8018eYangster-macstd::unique_ptr<LogEvent> CreateReleaseWakelockEvent(
3749c1debe330006b2b4d5c08a55905789c57369609Yao Chen        const std::vector<AttributionNodeInternal>& attributions, const string& wakelockName,
3759c1debe330006b2b4d5c08a55905789c57369609Yao Chen        uint64_t timestampNs) {
3762087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    return CreateWakelockStateChangedEvent(
3772087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac        attributions, wakelockName, WakelockStateChanged::RELEASE, timestampNs);
3782087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}
3792087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
3802087716f2bdca90c7c3034d556ac12911bd8018eYangster-macstd::unique_ptr<LogEvent> CreateActivityForegroundStateChangedEvent(
3815caaa9d8542585e537ac762c35879eb42dd6bbb4Chenjie Yu    const int uid, const ActivityForegroundStateChanged::State state, uint64_t timestampNs) {
3822087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    auto event = std::make_unique<LogEvent>(
3832087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac        android::util::ACTIVITY_FOREGROUND_STATE_CHANGED, timestampNs);
3842087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    event->write(uid);
3852087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    event->write("pkg_name");
3862087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    event->write("class_name");
3875caaa9d8542585e537ac762c35879eb42dd6bbb4Chenjie Yu    event->write(state);
3882087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    event->init();
3892087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    return event;
3902087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}
3912087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
3922087716f2bdca90c7c3034d556ac12911bd8018eYangster-macstd::unique_ptr<LogEvent> CreateMoveToBackgroundEvent(const int uid, uint64_t timestampNs) {
3932087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    return CreateActivityForegroundStateChangedEvent(
3945caaa9d8542585e537ac762c35879eb42dd6bbb4Chenjie Yu        uid, ActivityForegroundStateChanged::BACKGROUND, timestampNs);
3952087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}
3962087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
3972087716f2bdca90c7c3034d556ac12911bd8018eYangster-macstd::unique_ptr<LogEvent> CreateMoveToForegroundEvent(const int uid, uint64_t timestampNs) {
3982087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    return CreateActivityForegroundStateChangedEvent(
3995caaa9d8542585e537ac762c35879eb42dd6bbb4Chenjie Yu        uid, ActivityForegroundStateChanged::FOREGROUND, timestampNs);
4002087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}
4012087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
4022087716f2bdca90c7c3034d556ac12911bd8018eYangster-macstd::unique_ptr<LogEvent> CreateSyncStateChangedEvent(
4039c1debe330006b2b4d5c08a55905789c57369609Yao Chen        const std::vector<AttributionNodeInternal>& attributions, const string& name,
4049c1debe330006b2b4d5c08a55905789c57369609Yao Chen        const SyncStateChanged::State state, uint64_t timestampNs) {
4052087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    auto event = std::make_unique<LogEvent>(android::util::SYNC_STATE_CHANGED, timestampNs);
4069369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    event->write(attributions);
4072087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    event->write(name);
4082087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    event->write(state);
4092087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    event->init();
4102087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    return event;
4112087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}
4122087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
4132087716f2bdca90c7c3034d556ac12911bd8018eYangster-macstd::unique_ptr<LogEvent> CreateSyncStartEvent(
4149c1debe330006b2b4d5c08a55905789c57369609Yao Chen        const std::vector<AttributionNodeInternal>& attributions, const string& name,
4159c1debe330006b2b4d5c08a55905789c57369609Yao Chen        uint64_t timestampNs) {
4169369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    return CreateSyncStateChangedEvent(attributions, name, SyncStateChanged::ON, timestampNs);
4172087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}
4182087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
4192087716f2bdca90c7c3034d556ac12911bd8018eYangster-macstd::unique_ptr<LogEvent> CreateSyncEndEvent(
4209c1debe330006b2b4d5c08a55905789c57369609Yao Chen        const std::vector<AttributionNodeInternal>& attributions, const string& name,
4219c1debe330006b2b4d5c08a55905789c57369609Yao Chen        uint64_t timestampNs) {
4229369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac    return CreateSyncStateChangedEvent(attributions, name, SyncStateChanged::OFF, timestampNs);
4232087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}
4242087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
4252087716f2bdca90c7c3034d556ac12911bd8018eYangster-macstd::unique_ptr<LogEvent> CreateProcessLifeCycleStateChangedEvent(
4265caaa9d8542585e537ac762c35879eb42dd6bbb4Chenjie Yu    const int uid, const ProcessLifeCycleStateChanged::State state, uint64_t timestampNs) {
4272087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    auto logEvent = std::make_unique<LogEvent>(
4282087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac        android::util::PROCESS_LIFE_CYCLE_STATE_CHANGED, timestampNs);
4292087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    logEvent->write(uid);
4302087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    logEvent->write("");
4315caaa9d8542585e537ac762c35879eb42dd6bbb4Chenjie Yu    logEvent->write(state);
4322087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    logEvent->init();
4332087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    return logEvent;
4342087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}
4352087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
4362087716f2bdca90c7c3034d556ac12911bd8018eYangster-macstd::unique_ptr<LogEvent> CreateAppCrashEvent(const int uid, uint64_t timestampNs) {
4372087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    return CreateProcessLifeCycleStateChangedEvent(
4385caaa9d8542585e537ac762c35879eb42dd6bbb4Chenjie Yu        uid, ProcessLifeCycleStateChanged::CRASHED, timestampNs);
4392087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}
4402087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
441d40053eb8bcb19c7c3b080a36714566bb4e4a748Yangster-macstd::unique_ptr<LogEvent> CreateIsolatedUidChangedEvent(
442d40053eb8bcb19c7c3b080a36714566bb4e4a748Yangster-mac    int isolatedUid, int hostUid, bool is_create, uint64_t timestampNs) {
443d40053eb8bcb19c7c3b080a36714566bb4e4a748Yangster-mac    auto logEvent = std::make_unique<LogEvent>(
444d40053eb8bcb19c7c3b080a36714566bb4e4a748Yangster-mac        android::util::ISOLATED_UID_CHANGED, timestampNs);
445d40053eb8bcb19c7c3b080a36714566bb4e4a748Yangster-mac    logEvent->write(hostUid);
446d40053eb8bcb19c7c3b080a36714566bb4e4a748Yangster-mac    logEvent->write(isolatedUid);
447d40053eb8bcb19c7c3b080a36714566bb4e4a748Yangster-mac    logEvent->write(is_create);
448d40053eb8bcb19c7c3b080a36714566bb4e4a748Yangster-mac    logEvent->init();
449d40053eb8bcb19c7c3b080a36714566bb4e4a748Yangster-mac    return logEvent;
450d40053eb8bcb19c7c3b080a36714566bb4e4a748Yangster-mac}
451d40053eb8bcb19c7c3b080a36714566bb4e4a748Yangster-mac
45215f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-macsp<StatsLogProcessor> CreateStatsLogProcessor(const int64_t timeBaseNs, const int64_t currentTimeNs,
45315f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac                                              const StatsdConfig& config, const ConfigKey& key) {
4542087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    sp<UidMap> uidMap = new UidMap();
455be10ddfe46ba6371bcd02cb57a06782e6b18d371Yangster-mac    sp<AlarmMonitor> anomalyAlarmMonitor =
456be10ddfe46ba6371bcd02cb57a06782e6b18d371Yangster-mac        new AlarmMonitor(1,  [](const sp<IStatsCompanionService>&, int64_t){},
457be10ddfe46ba6371bcd02cb57a06782e6b18d371Yangster-mac                [](const sp<IStatsCompanionService>&){});
458684d195227bf9eaeb21698cbdcf865afb570c454Yangster-mac    sp<AlarmMonitor> periodicAlarmMonitor =
459684d195227bf9eaeb21698cbdcf865afb570c454Yangster-mac        new AlarmMonitor(1,  [](const sp<IStatsCompanionService>&, int64_t){},
460684d195227bf9eaeb21698cbdcf865afb570c454Yangster-mac                [](const sp<IStatsCompanionService>&){});
4612087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    sp<StatsLogProcessor> processor = new StatsLogProcessor(
46248944901f7e6334724efadda6c6b27d9e88fc9e2David Chen        uidMap, anomalyAlarmMonitor, periodicAlarmMonitor, timeBaseNs, [](const ConfigKey&){return true;});
46315f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac    processor->OnConfigUpdated(currentTimeNs, key, config);
4642087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    return processor;
4652087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}
4662087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
4679c1debe330006b2b4d5c08a55905789c57369609Yao ChenAttributionNodeInternal CreateAttribution(const int& uid, const string& tag) {
4689c1debe330006b2b4d5c08a55905789c57369609Yao Chen    AttributionNodeInternal attribution;
4692087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    attribution.set_uid(uid);
4702087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    attribution.set_tag(tag);
4712087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    return attribution;
4722087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}
4732087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
4742087716f2bdca90c7c3034d556ac12911bd8018eYangster-macvoid sortLogEventsByTimestamp(std::vector<std::unique_ptr<LogEvent>> *events) {
4752087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac  std::sort(events->begin(), events->end(),
4762087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac            [](const std::unique_ptr<LogEvent>& a, const std::unique_ptr<LogEvent>& b) {
477330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac              return a->GetElapsedTimestampNs() < b->GetElapsedTimestampNs();
4782087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac            });
4792087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}
4802087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
48194e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-macint64_t StringToId(const string& str) {
48294e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    return static_cast<int64_t>(std::hash<std::string>()(str));
48394e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac}
484b5bc74122fb95c81bedad625160fb8d144a863cdYangster-mac
485b5bc74122fb95c81bedad625160fb8d144a863cdYangster-macvoid ValidateAttributionUidDimension(const DimensionsValue& value, int atomId, int uid) {
486b5bc74122fb95c81bedad625160fb8d144a863cdYangster-mac    EXPECT_EQ(value.field(), atomId);
487b5bc74122fb95c81bedad625160fb8d144a863cdYangster-mac    // Attribution field.
488b5bc74122fb95c81bedad625160fb8d144a863cdYangster-mac    EXPECT_EQ(value.value_tuple().dimensions_value(0).field(), 1);
489b5bc74122fb95c81bedad625160fb8d144a863cdYangster-mac    // Uid only.
490b5bc74122fb95c81bedad625160fb8d144a863cdYangster-mac    EXPECT_EQ(value.value_tuple().dimensions_value(0)
491b5bc74122fb95c81bedad625160fb8d144a863cdYangster-mac        .value_tuple().dimensions_value_size(), 1);
492b5bc74122fb95c81bedad625160fb8d144a863cdYangster-mac    EXPECT_EQ(value.value_tuple().dimensions_value(0)
493b5bc74122fb95c81bedad625160fb8d144a863cdYangster-mac        .value_tuple().dimensions_value(0).field(), 1);
494b5bc74122fb95c81bedad625160fb8d144a863cdYangster-mac    EXPECT_EQ(value.value_tuple().dimensions_value(0)
495b5bc74122fb95c81bedad625160fb8d144a863cdYangster-mac        .value_tuple().dimensions_value(0).value_int(), uid);
496b5bc74122fb95c81bedad625160fb8d144a863cdYangster-mac}
497b5bc74122fb95c81bedad625160fb8d144a863cdYangster-mac
498b5bc74122fb95c81bedad625160fb8d144a863cdYangster-macvoid ValidateUidDimension(const DimensionsValue& value, int atomId, int uid) {
499b5bc74122fb95c81bedad625160fb8d144a863cdYangster-mac    EXPECT_EQ(value.field(), atomId);
500b5bc74122fb95c81bedad625160fb8d144a863cdYangster-mac    EXPECT_EQ(value.value_tuple().dimensions_value_size(), 1);
501b5bc74122fb95c81bedad625160fb8d144a863cdYangster-mac    // Attribution field.
502b5bc74122fb95c81bedad625160fb8d144a863cdYangster-mac    EXPECT_EQ(value.value_tuple().dimensions_value(0).field(), 1);
503b5bc74122fb95c81bedad625160fb8d144a863cdYangster-mac    // Uid only.
504b5bc74122fb95c81bedad625160fb8d144a863cdYangster-mac    EXPECT_EQ(value.value_tuple().dimensions_value(0)
505b5bc74122fb95c81bedad625160fb8d144a863cdYangster-mac        .value_tuple().dimensions_value_size(), 1);
506b5bc74122fb95c81bedad625160fb8d144a863cdYangster-mac    EXPECT_EQ(value.value_tuple().dimensions_value(0)
507b5bc74122fb95c81bedad625160fb8d144a863cdYangster-mac        .value_tuple().dimensions_value(0).field(), 1);
508b5bc74122fb95c81bedad625160fb8d144a863cdYangster-mac    EXPECT_EQ(value.value_tuple().dimensions_value(0)
509b5bc74122fb95c81bedad625160fb8d144a863cdYangster-mac        .value_tuple().dimensions_value(0).value_int(), uid);
510b5bc74122fb95c81bedad625160fb8d144a863cdYangster-mac}
511b5bc74122fb95c81bedad625160fb8d144a863cdYangster-mac
512e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-macvoid ValidateUidDimension(const DimensionsValue& value, int node_idx, int atomId, int uid) {
513e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac    EXPECT_EQ(value.field(), atomId);
514e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac    EXPECT_GT(value.value_tuple().dimensions_value_size(), node_idx);
515e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac    // Attribution field.
516e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac    EXPECT_EQ(value.value_tuple().dimensions_value(node_idx).field(), 1);
517e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac    EXPECT_EQ(value.value_tuple().dimensions_value(node_idx)
518e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac        .value_tuple().dimensions_value(0).field(), 1);
519e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac    EXPECT_EQ(value.value_tuple().dimensions_value(node_idx)
520e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac        .value_tuple().dimensions_value(0).value_int(), uid);
521e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac}
522e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac
523e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-macvoid ValidateAttributionUidAndTagDimension(
524e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac    const DimensionsValue& value, int node_idx, int atomId, int uid, const std::string& tag) {
525e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac    EXPECT_EQ(value.field(), atomId);
526e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac    EXPECT_GT(value.value_tuple().dimensions_value_size(), node_idx);
527e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac    // Attribution field.
528e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac    EXPECT_EQ(1, value.value_tuple().dimensions_value(node_idx).field());
529e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac    // Uid only.
530e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac    EXPECT_EQ(2, value.value_tuple().dimensions_value(node_idx)
531e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac        .value_tuple().dimensions_value_size());
532e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac    EXPECT_EQ(1, value.value_tuple().dimensions_value(node_idx)
533e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac        .value_tuple().dimensions_value(0).field());
534e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac    EXPECT_EQ(uid, value.value_tuple().dimensions_value(node_idx)
535e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac        .value_tuple().dimensions_value(0).value_int());
536e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac    EXPECT_EQ(2, value.value_tuple().dimensions_value(node_idx)
537e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac        .value_tuple().dimensions_value(1).field());
538e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac    EXPECT_EQ(tag, value.value_tuple().dimensions_value(node_idx)
539e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac        .value_tuple().dimensions_value(1).value_str());
540e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac}
541e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac
542b5bc74122fb95c81bedad625160fb8d144a863cdYangster-macvoid ValidateAttributionUidAndTagDimension(
543b5bc74122fb95c81bedad625160fb8d144a863cdYangster-mac    const DimensionsValue& value, int atomId, int uid, const std::string& tag) {
544b5bc74122fb95c81bedad625160fb8d144a863cdYangster-mac    EXPECT_EQ(value.field(), atomId);
545e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac    EXPECT_EQ(1, value.value_tuple().dimensions_value_size());
546b5bc74122fb95c81bedad625160fb8d144a863cdYangster-mac    // Attribution field.
547e06cfd777a501eca17f8dd796b32ad61002c5875Yangster-mac    EXPECT_EQ(1, value.value_tuple().dimensions_value(0).field());
548b5bc74122fb95c81bedad625160fb8d144a863cdYangster-mac    // Uid only.
549b5bc74122fb95c81bedad625160fb8d144a863cdYangster-mac    EXPECT_EQ(value.value_tuple().dimensions_value(0)
550b5bc74122fb95c81bedad625160fb8d144a863cdYangster-mac        .value_tuple().dimensions_value_size(), 2);
551b5bc74122fb95c81bedad625160fb8d144a863cdYangster-mac    EXPECT_EQ(value.value_tuple().dimensions_value(0)
552b5bc74122fb95c81bedad625160fb8d144a863cdYangster-mac        .value_tuple().dimensions_value(0).field(), 1);
553b5bc74122fb95c81bedad625160fb8d144a863cdYangster-mac    EXPECT_EQ(value.value_tuple().dimensions_value(0)
554b5bc74122fb95c81bedad625160fb8d144a863cdYangster-mac        .value_tuple().dimensions_value(0).value_int(), uid);
555b5bc74122fb95c81bedad625160fb8d144a863cdYangster-mac    EXPECT_EQ(value.value_tuple().dimensions_value(0)
556b5bc74122fb95c81bedad625160fb8d144a863cdYangster-mac        .value_tuple().dimensions_value(1).field(), 2);
557b5bc74122fb95c81bedad625160fb8d144a863cdYangster-mac    EXPECT_EQ(value.value_tuple().dimensions_value(0)
558b5bc74122fb95c81bedad625160fb8d144a863cdYangster-mac        .value_tuple().dimensions_value(1).value_str(), tag);
559b5bc74122fb95c81bedad625160fb8d144a863cdYangster-mac}
560b5bc74122fb95c81bedad625160fb8d144a863cdYangster-mac
5618a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chenbool EqualsTo(const DimensionsValue& s1, const DimensionsValue& s2) {
5628a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    if (s1.field() != s2.field()) {
5638a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        return false;
5648a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    }
5658a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    if (s1.value_case() != s2.value_case()) {
5668a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        return false;
5678a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    }
5688a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    switch (s1.value_case()) {
5698a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        case DimensionsValue::ValueCase::kValueStr:
5708a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            return (s1.value_str() == s2.value_str());
5718a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        case DimensionsValue::ValueCase::kValueInt:
5728a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            return s1.value_int() == s2.value_int();
5738a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        case DimensionsValue::ValueCase::kValueLong:
5748a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            return s1.value_long() == s2.value_long();
5758a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        case DimensionsValue::ValueCase::kValueBool:
5768a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            return s1.value_bool() == s2.value_bool();
5778a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        case DimensionsValue::ValueCase::kValueFloat:
5788a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            return s1.value_float() == s2.value_float();
5798a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        case DimensionsValue::ValueCase::kValueTuple: {
5808a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            if (s1.value_tuple().dimensions_value_size() !=
5818a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                s2.value_tuple().dimensions_value_size()) {
5828a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                return false;
5838a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            }
5848a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            bool allMatched = true;
5858a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            for (int i = 0; allMatched && i < s1.value_tuple().dimensions_value_size(); ++i) {
5868a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                allMatched &= EqualsTo(s1.value_tuple().dimensions_value(i),
5878a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                                       s2.value_tuple().dimensions_value(i));
5888a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            }
5898a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            return allMatched;
5908a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        }
5918a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        case DimensionsValue::ValueCase::VALUE_NOT_SET:
5928a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        default:
5938a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            return true;
5948a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    }
5958a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen}
5968a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
5978a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chenbool LessThan(const DimensionsValue& s1, const DimensionsValue& s2) {
5988a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    if (s1.field() != s2.field()) {
5998a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        return s1.field() < s2.field();
6008a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    }
6018a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    if (s1.value_case() != s2.value_case()) {
6028a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        return s1.value_case() < s2.value_case();
6038a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    }
6048a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    switch (s1.value_case()) {
6058a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        case DimensionsValue::ValueCase::kValueStr:
6068a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            return s1.value_str() < s2.value_str();
6078a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        case DimensionsValue::ValueCase::kValueInt:
6088a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            return s1.value_int() < s2.value_int();
6098a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        case DimensionsValue::ValueCase::kValueLong:
6108a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            return s1.value_long() < s2.value_long();
6118a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        case DimensionsValue::ValueCase::kValueBool:
6128a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            return (int)s1.value_bool() < (int)s2.value_bool();
6138a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        case DimensionsValue::ValueCase::kValueFloat:
6148a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            return s1.value_float() < s2.value_float();
6158a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        case DimensionsValue::ValueCase::kValueTuple: {
6168a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            if (s1.value_tuple().dimensions_value_size() !=
6178a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                s2.value_tuple().dimensions_value_size()) {
6188a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                return s1.value_tuple().dimensions_value_size() <
6198a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                       s2.value_tuple().dimensions_value_size();
6208a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            }
6218a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            for (int i = 0; i < s1.value_tuple().dimensions_value_size(); ++i) {
6228a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                if (EqualsTo(s1.value_tuple().dimensions_value(i),
6238a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                             s2.value_tuple().dimensions_value(i))) {
6248a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                    continue;
6258a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                } else {
6268a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                    return LessThan(s1.value_tuple().dimensions_value(i),
6278a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                                    s2.value_tuple().dimensions_value(i));
6288a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen                }
6298a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            }
6308a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            return false;
6318a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        }
6328a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        case DimensionsValue::ValueCase::VALUE_NOT_SET:
6338a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        default:
6348a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            return false;
6358a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    }
6368a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen}
6378a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
6388a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chenbool LessThan(const DimensionsPair& s1, const DimensionsPair& s2) {
6398a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    if (LessThan(s1.dimInWhat, s2.dimInWhat)) {
6408a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        return true;
6418a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    } else if (LessThan(s2.dimInWhat, s1.dimInWhat)) {
6428a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        return false;
6438a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    }
6448a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
6458a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    return LessThan(s1.dimInCondition, s2.dimInCondition);
6468a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen}
6478a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
6489def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-macvoid backfillStringInDimension(const std::map<uint64_t, string>& str_map,
6499def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac                               DimensionsValue* dimension) {
6509def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac    if (dimension->has_value_str_hash()) {
6519def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        auto it = str_map.find((uint64_t)(dimension->value_str_hash()));
6529def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        if (it != str_map.end()) {
6539def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac            dimension->clear_value_str_hash();
6549def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac            dimension->set_value_str(it->second);
6559def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        } else {
6569def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac            ALOGE("Can not find the string hash: %llu",
6579def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac                (unsigned long long)dimension->value_str_hash());
6589def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        }
6599def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac    } else if (dimension->has_value_tuple()) {
6609def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        auto value_tuple = dimension->mutable_value_tuple();
6619def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        for (int i = 0; i < value_tuple->dimensions_value_size(); ++i) {
6629def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac            backfillStringInDimension(str_map, value_tuple->mutable_dimensions_value(i));
6639def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        }
6649def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac    }
6659def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac}
6669def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac
6679def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-macvoid backfillStringInReport(ConfigMetricsReport *config_report) {
6689def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac    std::map<uint64_t, string> str_map;
6699def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac    for (const auto& str : config_report->strings()) {
6709def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        uint64_t hash = Hash64(str);
6719def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        if (str_map.find(hash) != str_map.end()) {
6729def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac            ALOGE("String hash conflicts: %s %s", str.c_str(), str_map[hash].c_str());
6739def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        }
6749def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        str_map[hash] = str;
6759def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac    }
6769def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac    for (int i = 0; i < config_report->metrics_size(); ++i) {
6779def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        auto metric_report = config_report->mutable_metrics(i);
6789def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        if (metric_report->has_count_metrics()) {
6799def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac            backfillStringInDimension(str_map, metric_report->mutable_count_metrics());
6809def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        } else if (metric_report->has_duration_metrics()) {
6819def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac            backfillStringInDimension(str_map, metric_report->mutable_duration_metrics());
6829def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        } else if (metric_report->has_gauge_metrics()) {
6839def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac            backfillStringInDimension(str_map, metric_report->mutable_gauge_metrics());
6849def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        } else if (metric_report->has_value_metrics()) {
6859def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac            backfillStringInDimension(str_map, metric_report->mutable_value_metrics());
6869def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        }
6879def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac    }
6889def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac    // Backfill the package names.
6899def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac    for (int i = 0 ; i < config_report->uid_map().snapshots_size(); ++i) {
6909def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        auto snapshot = config_report->mutable_uid_map()->mutable_snapshots(i);
6919def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        for (int j = 0 ; j < snapshot->package_info_size(); ++j) {
6929def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac            auto package_info = snapshot->mutable_package_info(j);
6939def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac            if (package_info->has_name_hash()) {
6949def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac                auto it = str_map.find((uint64_t)(package_info->name_hash()));
6959def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac                if (it != str_map.end()) {
6969def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac                    package_info->clear_name_hash();
6979def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac                    package_info->set_name(it->second);
6989def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac                } else {
6999def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac                    ALOGE("Can not find the string package name hash: %llu",
7009def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac                        (unsigned long long)package_info->name_hash());
7019def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac                }
7029def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac
7039def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac            }
7049def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        }
7059def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac    }
7069def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac    // Backfill the app name in app changes.
7079def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac    for (int i = 0 ; i < config_report->uid_map().changes_size(); ++i) {
7089def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        auto change = config_report->mutable_uid_map()->mutable_changes(i);
7099def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        if (change->has_app_hash()) {
7109def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac            auto it = str_map.find((uint64_t)(change->app_hash()));
7119def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac            if (it != str_map.end()) {
7129def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac                change->clear_app_hash();
7139def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac                change->set_app(it->second);
7149def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac            } else {
7159def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac                ALOGE("Can not find the string change app name hash: %llu",
7169def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac                    (unsigned long long)change->app_hash());
7179def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac            }
7189def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        }
7199def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac    }
7209def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac}
7219def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac
7229def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-macvoid backfillStringInReport(ConfigMetricsReportList *config_report_list) {
7239def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac    for (int i = 0; i < config_report_list->reports_size(); ++i) {
7249def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        backfillStringInReport(config_report_list->mutable_reports(i));
7259def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac    }
7269def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac}
7279def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac
7289def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-macbool backfillDimensionPath(const DimensionsValue& path,
7299def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac                           const google::protobuf::RepeatedPtrField<DimensionsValue>& leafValues,
7309def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac                           int* leafIndex,
7319def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac                           DimensionsValue* dimension) {
7329def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac    dimension->set_field(path.field());
7339def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac    if (path.has_value_tuple()) {
7349def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        for (int i = 0; i < path.value_tuple().dimensions_value_size(); ++i) {
7359def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac            if (!backfillDimensionPath(
7369def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac                path.value_tuple().dimensions_value(i), leafValues, leafIndex,
7379def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac                dimension->mutable_value_tuple()->add_dimensions_value())) {
7389def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac                return false;
7399def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac            }
7409def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        }
7419def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac    } else {
7429def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        if (*leafIndex < 0 || *leafIndex >= leafValues.size()) {
7439def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac            return false;
7449def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        }
7459def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        dimension->MergeFrom(leafValues.Get(*leafIndex));
7469def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        (*leafIndex)++;
7479def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac    }
7489def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac    return true;
7499def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac}
7509def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac
7519def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-macbool backfillDimensionPath(const DimensionsValue& path,
7529def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac                           const google::protobuf::RepeatedPtrField<DimensionsValue>& leafValues,
7539def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac                           DimensionsValue* dimension) {
7549def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac    int leafIndex = 0;
7559def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac    return backfillDimensionPath(path, leafValues, &leafIndex, dimension);
7569def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac}
7579def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac
7589def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-macvoid backfillDimensionPath(ConfigMetricsReportList *config_report_list) {
7599def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac    for (int i = 0; i < config_report_list->reports_size(); ++i) {
7609def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        auto report = config_report_list->mutable_reports(i);
7619def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        for (int j = 0; j < report->metrics_size(); ++j) {
7629def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac            auto metric_report = report->mutable_metrics(j);
7639def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac            if (metric_report->has_dimensions_path_in_what() ||
7649def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac                metric_report->has_dimensions_path_in_condition()) {
7659def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac                auto whatPath = metric_report->dimensions_path_in_what();
7669def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac                auto conditionPath = metric_report->dimensions_path_in_condition();
7679def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac                if (metric_report->has_count_metrics()) {
7689def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac                    backfillDimensionPath(whatPath, conditionPath,
7699def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac                                          metric_report->mutable_count_metrics());
7709def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac                } else if (metric_report->has_duration_metrics()) {
7719def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac                    backfillDimensionPath(whatPath, conditionPath,
7729def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac                                          metric_report->mutable_duration_metrics());
7739def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac                } else if (metric_report->has_gauge_metrics()) {
7749def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac                    backfillDimensionPath(whatPath, conditionPath,
7759def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac                                          metric_report->mutable_gauge_metrics());
7769def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac                } else if (metric_report->has_value_metrics()) {
7779def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac                    backfillDimensionPath(whatPath, conditionPath,
7789def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac                                          metric_report->mutable_value_metrics());
7799def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac                }
7809def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac                metric_report->clear_dimensions_path_in_what();
7819def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac                metric_report->clear_dimensions_path_in_condition();
7829def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac            }
7839def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        }
7849def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac    }
7859def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac}
7869def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac
7879def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-macvoid backfillStartEndTimestamp(StatsLogReport *report) {
7889def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac    const int64_t timeBaseNs = report->time_base_elapsed_nano_seconds();
7899def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac    const int64_t bucketSizeNs = report->bucket_size_nano_seconds();
7909def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac    if (report->has_count_metrics()) {
7919def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        backfillStartEndTimestampForMetrics(
7929def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac            timeBaseNs, bucketSizeNs, report->mutable_count_metrics());
7939def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac    } else if (report->has_duration_metrics()) {
7949def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        backfillStartEndTimestampForMetrics(
7959def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac            timeBaseNs, bucketSizeNs, report->mutable_duration_metrics());
7969def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac    } else if (report->has_gauge_metrics()) {
7979def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        backfillStartEndTimestampForMetrics(
7989def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac            timeBaseNs, bucketSizeNs, report->mutable_gauge_metrics());
7999def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        if (report->gauge_metrics().skipped_size() > 0) {
8009def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac            backfillStartEndTimestampForSkippedBuckets(
8019def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac                timeBaseNs, report->mutable_gauge_metrics());
8029def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        }
8039def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac    } else if (report->has_value_metrics()) {
8049def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        backfillStartEndTimestampForMetrics(
8059def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac            timeBaseNs, bucketSizeNs, report->mutable_value_metrics());
8069def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        if (report->value_metrics().skipped_size() > 0) {
8079def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac            backfillStartEndTimestampForSkippedBuckets(
8089def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac                timeBaseNs, report->mutable_value_metrics());
8099def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        }
8109def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac    }
8119def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac}
8129def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac
8139def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-macvoid backfillStartEndTimestamp(ConfigMetricsReport *config_report) {
8149def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac    for (int j = 0; j < config_report->metrics_size(); ++j) {
8159def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        backfillStartEndTimestamp(config_report->mutable_metrics(j));
8169def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac    }
8179def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac}
8189def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac
8199def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-macvoid backfillStartEndTimestamp(ConfigMetricsReportList *config_report_list) {
8209def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac    for (int i = 0; i < config_report_list->reports_size(); ++i) {
8219def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac        backfillStartEndTimestamp(config_report_list->mutable_reports(i));
8229def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac    }
8239def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac}
8249def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac
8252087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}  // namespace statsd
8262087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}  // namespace os
8272087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac}  // namespace android