Home | History | Annotate | Download | only in tests
      1 // Copyright (C) 2017 The Android Open Source Project
      2 //
      3 // Licensed under the Apache License, Version 2.0 (the "License");
      4 // you may not use this file except in compliance with the License.
      5 // You may obtain a copy of the License at
      6 //
      7 //      http://www.apache.org/licenses/LICENSE-2.0
      8 //
      9 // Unless required by applicable law or agreed to in writing, software
     10 // distributed under the License is distributed on an "AS IS" BASIS,
     11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 // See the License for the specific language governing permissions and
     13 // limitations under the License.
     14 
     15 #include "StatsLogProcessor.h"
     16 #include "StatsService.h"
     17 #include "config/ConfigKey.h"
     18 #include "frameworks/base/cmds/statsd/src/stats_log.pb.h"
     19 #include "frameworks/base/cmds/statsd/src/statsd_config.pb.h"
     20 #include "guardrail/StatsdStats.h"
     21 #include "logd/LogEvent.h"
     22 #include "packages/UidMap.h"
     23 #include "storage/StorageManager.h"
     24 #include "statslog.h"
     25 
     26 #include <gmock/gmock.h>
     27 #include <gtest/gtest.h>
     28 
     29 #include "tests/statsd_test_util.h"
     30 
     31 #include <stdio.h>
     32 
     33 using namespace android;
     34 using namespace testing;
     35 
     36 namespace android {
     37 namespace os {
     38 namespace statsd {
     39 
     40 using android::util::ProtoOutputStream;
     41 
     42 #ifdef __ANDROID__
     43 
     44 /**
     45  * Mock MetricsManager (ByteSize() is called).
     46  */
     47 class MockMetricsManager : public MetricsManager {
     48 public:
     49     MockMetricsManager()
     50         : MetricsManager(ConfigKey(1, 12345), StatsdConfig(), 1000, 1000, new UidMap(),
     51                          new StatsPullerManager(),
     52                          new AlarmMonitor(10, [](const sp<IStatsCompanionService>&, int64_t) {},
     53                                           [](const sp<IStatsCompanionService>&) {}),
     54                          new AlarmMonitor(10, [](const sp<IStatsCompanionService>&, int64_t) {},
     55                                           [](const sp<IStatsCompanionService>&) {})) {
     56     }
     57 
     58     MOCK_METHOD0(byteSize, size_t());
     59 
     60     MOCK_METHOD1(dropData, void(const int64_t dropTimeNs));
     61 };
     62 
     63 TEST(StatsLogProcessorTest, TestRateLimitByteSize) {
     64     sp<UidMap> m = new UidMap();
     65     sp<StatsPullerManager> pullerManager = new StatsPullerManager();
     66     sp<AlarmMonitor> anomalyAlarmMonitor;
     67     sp<AlarmMonitor> periodicAlarmMonitor;
     68     // Construct the processor with a dummy sendBroadcast function that does nothing.
     69     StatsLogProcessor p(m, pullerManager, anomalyAlarmMonitor, periodicAlarmMonitor, 0,
     70                         [](const ConfigKey& key) { return true; },
     71                         [](const int&, const vector<int64_t>&) {return true;});
     72 
     73     MockMetricsManager mockMetricsManager;
     74 
     75     ConfigKey key(100, 12345);
     76     // Expect only the first flush to trigger a check for byte size since the last two are
     77     // rate-limited.
     78     EXPECT_CALL(mockMetricsManager, byteSize()).Times(1);
     79     p.flushIfNecessaryLocked(99, key, mockMetricsManager);
     80     p.flushIfNecessaryLocked(100, key, mockMetricsManager);
     81     p.flushIfNecessaryLocked(101, key, mockMetricsManager);
     82 }
     83 
     84 TEST(StatsLogProcessorTest, TestRateLimitBroadcast) {
     85     sp<UidMap> m = new UidMap();
     86     sp<StatsPullerManager> pullerManager = new StatsPullerManager();
     87     sp<AlarmMonitor> anomalyAlarmMonitor;
     88     sp<AlarmMonitor> subscriberAlarmMonitor;
     89     int broadcastCount = 0;
     90     StatsLogProcessor p(m, pullerManager, anomalyAlarmMonitor, subscriberAlarmMonitor, 0,
     91                         [&broadcastCount](const ConfigKey& key) {
     92                             broadcastCount++;
     93                             return true;
     94                         },
     95                         [](const int&, const vector<int64_t>&) {return true;});
     96 
     97     MockMetricsManager mockMetricsManager;
     98 
     99     ConfigKey key(100, 12345);
    100     EXPECT_CALL(mockMetricsManager, byteSize())
    101             .Times(1)
    102             .WillRepeatedly(::testing::Return(int(
    103                     StatsdStats::kMaxMetricsBytesPerConfig * .95)));
    104 
    105     // Expect only one broadcast despite always returning a size that should trigger broadcast.
    106     p.flushIfNecessaryLocked(1, key, mockMetricsManager);
    107     EXPECT_EQ(1, broadcastCount);
    108 
    109     // b/73089712
    110     // This next call to flush should not trigger a broadcast.
    111     // p.mLastByteSizeTimes.clear();  // Force another check for byte size.
    112     // p.flushIfNecessaryLocked(2, key, mockMetricsManager);
    113     // EXPECT_EQ(1, broadcastCount);
    114 }
    115 
    116 TEST(StatsLogProcessorTest, TestDropWhenByteSizeTooLarge) {
    117     sp<UidMap> m = new UidMap();
    118     sp<StatsPullerManager> pullerManager = new StatsPullerManager();
    119     sp<AlarmMonitor> anomalyAlarmMonitor;
    120     sp<AlarmMonitor> subscriberAlarmMonitor;
    121     int broadcastCount = 0;
    122     StatsLogProcessor p(m, pullerManager, anomalyAlarmMonitor, subscriberAlarmMonitor, 0,
    123                         [&broadcastCount](const ConfigKey& key) {
    124                             broadcastCount++;
    125                             return true;
    126                         },
    127                         [](const int&, const vector<int64_t>&) {return true;});
    128 
    129     MockMetricsManager mockMetricsManager;
    130 
    131     ConfigKey key(100, 12345);
    132     EXPECT_CALL(mockMetricsManager, byteSize())
    133             .Times(1)
    134             .WillRepeatedly(::testing::Return(int(StatsdStats::kMaxMetricsBytesPerConfig * 1.2)));
    135 
    136     EXPECT_CALL(mockMetricsManager, dropData(_)).Times(1);
    137 
    138     // Expect to call the onDumpReport and skip the broadcast.
    139     p.flushIfNecessaryLocked(1, key, mockMetricsManager);
    140     EXPECT_EQ(0, broadcastCount);
    141 }
    142 
    143 StatsdConfig MakeConfig(bool includeMetric) {
    144     StatsdConfig config;
    145     config.add_allowed_log_source("AID_ROOT");  // LogEvent defaults to UID of root.
    146 
    147     if (includeMetric) {
    148         auto appCrashMatcher = CreateProcessCrashAtomMatcher();
    149         *config.add_atom_matcher() = appCrashMatcher;
    150         auto countMetric = config.add_count_metric();
    151         countMetric->set_id(StringToId("AppCrashes"));
    152         countMetric->set_what(appCrashMatcher.id());
    153         countMetric->set_bucket(FIVE_MINUTES);
    154     }
    155     return config;
    156 }
    157 
    158 TEST(StatsLogProcessorTest, TestUidMapHasSnapshot) {
    159     // Setup simple config key corresponding to empty config.
    160     sp<UidMap> m = new UidMap();
    161     sp<StatsPullerManager> pullerManager = new StatsPullerManager();
    162     m->updateMap(1, {1, 2}, {1, 2}, {String16("v1"), String16("v2")},
    163                  {String16("p1"), String16("p2")}, {String16(""), String16("")});
    164     sp<AlarmMonitor> anomalyAlarmMonitor;
    165     sp<AlarmMonitor> subscriberAlarmMonitor;
    166     int broadcastCount = 0;
    167     StatsLogProcessor p(m, pullerManager, anomalyAlarmMonitor, subscriberAlarmMonitor, 0,
    168                         [&broadcastCount](const ConfigKey& key) {
    169                             broadcastCount++;
    170                             return true;
    171                         },
    172                         [](const int&, const vector<int64_t>&) {return true;});
    173     ConfigKey key(3, 4);
    174     StatsdConfig config = MakeConfig(true);
    175     p.OnConfigUpdated(0, key, config);
    176 
    177     // Expect to get no metrics, but snapshot specified above in uidmap.
    178     vector<uint8_t> bytes;
    179     p.onDumpReport(key, 1, false, true, ADB_DUMP, FAST, &bytes);
    180 
    181     ConfigMetricsReportList output;
    182     output.ParseFromArray(bytes.data(), bytes.size());
    183     EXPECT_TRUE(output.reports_size() > 0);
    184     auto uidmap = output.reports(0).uid_map();
    185     EXPECT_TRUE(uidmap.snapshots_size() > 0);
    186     EXPECT_EQ(2, uidmap.snapshots(0).package_info_size());
    187 }
    188 
    189 TEST(StatsLogProcessorTest, TestEmptyConfigHasNoUidMap) {
    190     // Setup simple config key corresponding to empty config.
    191     sp<UidMap> m = new UidMap();
    192     sp<StatsPullerManager> pullerManager = new StatsPullerManager();
    193     m->updateMap(1, {1, 2}, {1, 2}, {String16("v1"), String16("v2")},
    194                  {String16("p1"), String16("p2")}, {String16(""), String16("")});
    195     sp<AlarmMonitor> anomalyAlarmMonitor;
    196     sp<AlarmMonitor> subscriberAlarmMonitor;
    197     int broadcastCount = 0;
    198     StatsLogProcessor p(m, pullerManager, anomalyAlarmMonitor, subscriberAlarmMonitor, 0,
    199                         [&broadcastCount](const ConfigKey& key) {
    200                             broadcastCount++;
    201                             return true;
    202                         },
    203                         [](const int&, const vector<int64_t>&) {return true;});
    204     ConfigKey key(3, 4);
    205     StatsdConfig config = MakeConfig(false);
    206     p.OnConfigUpdated(0, key, config);
    207 
    208     // Expect to get no metrics, but snapshot specified above in uidmap.
    209     vector<uint8_t> bytes;
    210     p.onDumpReport(key, 1, false, true, ADB_DUMP, FAST, &bytes);
    211 
    212     ConfigMetricsReportList output;
    213     output.ParseFromArray(bytes.data(), bytes.size());
    214     EXPECT_TRUE(output.reports_size() > 0);
    215     EXPECT_FALSE(output.reports(0).has_uid_map());
    216 }
    217 
    218 TEST(StatsLogProcessorTest, TestReportIncludesSubConfig) {
    219     // Setup simple config key corresponding to empty config.
    220     sp<UidMap> m = new UidMap();
    221     sp<StatsPullerManager> pullerManager = new StatsPullerManager();
    222     sp<AlarmMonitor> anomalyAlarmMonitor;
    223     sp<AlarmMonitor> subscriberAlarmMonitor;
    224     int broadcastCount = 0;
    225     StatsLogProcessor p(m, pullerManager, anomalyAlarmMonitor, subscriberAlarmMonitor, 0,
    226                         [&broadcastCount](const ConfigKey& key) {
    227                             broadcastCount++;
    228                             return true;
    229                         },
    230                         [](const int&, const vector<int64_t>&) {return true;});
    231     ConfigKey key(3, 4);
    232     StatsdConfig config;
    233     auto annotation = config.add_annotation();
    234     annotation->set_field_int64(1);
    235     annotation->set_field_int32(2);
    236     config.add_allowed_log_source("AID_ROOT");
    237     p.OnConfigUpdated(1, key, config);
    238 
    239     // Expect to get no metrics, but snapshot specified above in uidmap.
    240     vector<uint8_t> bytes;
    241     p.onDumpReport(key, 1, false, true, ADB_DUMP, FAST, &bytes);
    242 
    243     ConfigMetricsReportList output;
    244     output.ParseFromArray(bytes.data(), bytes.size());
    245     EXPECT_TRUE(output.reports_size() > 0);
    246     auto report = output.reports(0);
    247     EXPECT_EQ(1, report.annotation_size());
    248     EXPECT_EQ(1, report.annotation(0).field_int64());
    249     EXPECT_EQ(2, report.annotation(0).field_int32());
    250 }
    251 
    252 TEST(StatsLogProcessorTest, TestOnDumpReportEraseData) {
    253     // Setup a simple config.
    254     StatsdConfig config;
    255     config.add_allowed_log_source("AID_ROOT"); // LogEvent defaults to UID of root.
    256     auto wakelockAcquireMatcher = CreateAcquireWakelockAtomMatcher();
    257     *config.add_atom_matcher() = wakelockAcquireMatcher;
    258 
    259     auto countMetric = config.add_count_metric();
    260     countMetric->set_id(123456);
    261     countMetric->set_what(wakelockAcquireMatcher.id());
    262     countMetric->set_bucket(FIVE_MINUTES);
    263 
    264     ConfigKey cfgKey;
    265     sp<StatsLogProcessor> processor = CreateStatsLogProcessor(1, 1, config, cfgKey);
    266 
    267     std::vector<AttributionNodeInternal> attributions1 = {CreateAttribution(111, "App1")};
    268     auto event = CreateAcquireWakelockEvent(attributions1, "wl1", 2);
    269     processor->OnLogEvent(event.get());
    270 
    271     vector<uint8_t> bytes;
    272     ConfigMetricsReportList output;
    273 
    274     // Dump report WITHOUT erasing data.
    275     processor->onDumpReport(cfgKey, 3, true, false /* Do NOT erase data. */, ADB_DUMP, FAST, &bytes);
    276     output.ParseFromArray(bytes.data(), bytes.size());
    277     EXPECT_EQ(output.reports_size(), 1);
    278     EXPECT_EQ(output.reports(0).metrics_size(), 1);
    279     EXPECT_EQ(output.reports(0).metrics(0).count_metrics().data_size(), 1);
    280 
    281     // Dump report WITH erasing data. There should be data since we didn't previously erase it.
    282     processor->onDumpReport(cfgKey, 4, true, true /* DO erase data. */, ADB_DUMP, FAST, &bytes);
    283     output.ParseFromArray(bytes.data(), bytes.size());
    284     EXPECT_EQ(output.reports_size(), 1);
    285     EXPECT_EQ(output.reports(0).metrics_size(), 1);
    286     EXPECT_EQ(output.reports(0).metrics(0).count_metrics().data_size(), 1);
    287 
    288     // Dump report again. There should be no data since we erased it.
    289     processor->onDumpReport(cfgKey, 5, true, true /* DO erase data. */, ADB_DUMP, FAST, &bytes);
    290     output.ParseFromArray(bytes.data(), bytes.size());
    291     // We don't care whether statsd has a report, as long as it has no count metrics in it.
    292     bool noData = output.reports_size() == 0
    293             || output.reports(0).metrics_size() == 0
    294             || output.reports(0).metrics(0).count_metrics().data_size() == 0;
    295     EXPECT_TRUE(noData);
    296 }
    297 
    298 TEST(StatsLogProcessorTest, TestActiveConfigMetricDiskWriteRead) {
    299     int uid = 1111;
    300 
    301     // Setup a simple config, no activation
    302     StatsdConfig config1;
    303     int64_t cfgId1 = 12341;
    304     config1.set_id(cfgId1);
    305     config1.add_allowed_log_source("AID_ROOT");  // LogEvent defaults to UID of root.
    306     auto wakelockAcquireMatcher = CreateAcquireWakelockAtomMatcher();
    307     *config1.add_atom_matcher() = wakelockAcquireMatcher;
    308 
    309     long metricId1 = 1234561;
    310     long metricId2 = 1234562;
    311     auto countMetric1 = config1.add_count_metric();
    312     countMetric1->set_id(metricId1);
    313     countMetric1->set_what(wakelockAcquireMatcher.id());
    314     countMetric1->set_bucket(FIVE_MINUTES);
    315 
    316     auto countMetric2 = config1.add_count_metric();
    317     countMetric2->set_id(metricId2);
    318     countMetric2->set_what(wakelockAcquireMatcher.id());
    319     countMetric2->set_bucket(FIVE_MINUTES);
    320 
    321     ConfigKey cfgKey1(uid, cfgId1);
    322 
    323     // Add another config, with two metrics, one with activation
    324     StatsdConfig config2;
    325     int64_t cfgId2 = 12342;
    326     config2.set_id(cfgId2);
    327     config2.add_allowed_log_source("AID_ROOT");  // LogEvent defaults to UID of root.
    328     *config2.add_atom_matcher() = wakelockAcquireMatcher;
    329 
    330     long metricId3 = 1234561;
    331     long metricId4 = 1234562;
    332 
    333     auto countMetric3 = config2.add_count_metric();
    334     countMetric3->set_id(metricId3);
    335     countMetric3->set_what(wakelockAcquireMatcher.id());
    336     countMetric3->set_bucket(FIVE_MINUTES);
    337 
    338     auto countMetric4 = config2.add_count_metric();
    339     countMetric4->set_id(metricId4);
    340     countMetric4->set_what(wakelockAcquireMatcher.id());
    341     countMetric4->set_bucket(FIVE_MINUTES);
    342 
    343     auto metric3Activation = config2.add_metric_activation();
    344     metric3Activation->set_metric_id(metricId3);
    345     metric3Activation->set_activation_type(ACTIVATE_IMMEDIATELY);
    346     auto metric3ActivationTrigger = metric3Activation->add_event_activation();
    347     metric3ActivationTrigger->set_atom_matcher_id(wakelockAcquireMatcher.id());
    348     metric3ActivationTrigger->set_ttl_seconds(100);
    349 
    350     ConfigKey cfgKey2(uid, cfgId2);
    351 
    352     // Add another config, with two metrics, both with activations
    353     StatsdConfig config3;
    354     int64_t cfgId3 = 12343;
    355     config3.set_id(cfgId3);
    356     config3.add_allowed_log_source("AID_ROOT");  // LogEvent defaults to UID of root.
    357     *config3.add_atom_matcher() = wakelockAcquireMatcher;
    358 
    359     long metricId5 = 1234565;
    360     long metricId6 = 1234566;
    361     auto countMetric5 = config3.add_count_metric();
    362     countMetric5->set_id(metricId5);
    363     countMetric5->set_what(wakelockAcquireMatcher.id());
    364     countMetric5->set_bucket(FIVE_MINUTES);
    365 
    366     auto countMetric6 = config3.add_count_metric();
    367     countMetric6->set_id(metricId6);
    368     countMetric6->set_what(wakelockAcquireMatcher.id());
    369     countMetric6->set_bucket(FIVE_MINUTES);
    370 
    371     auto metric5Activation = config3.add_metric_activation();
    372     metric5Activation->set_metric_id(metricId5);
    373     metric5Activation->set_activation_type(ACTIVATE_IMMEDIATELY);
    374     auto metric5ActivationTrigger = metric5Activation->add_event_activation();
    375     metric5ActivationTrigger->set_atom_matcher_id(wakelockAcquireMatcher.id());
    376     metric5ActivationTrigger->set_ttl_seconds(100);
    377 
    378     auto metric6Activation = config3.add_metric_activation();
    379     metric6Activation->set_metric_id(metricId6);
    380     metric6Activation->set_activation_type(ACTIVATE_IMMEDIATELY);
    381     auto metric6ActivationTrigger = metric6Activation->add_event_activation();
    382     metric6ActivationTrigger->set_atom_matcher_id(wakelockAcquireMatcher.id());
    383     metric6ActivationTrigger->set_ttl_seconds(200);
    384 
    385     ConfigKey cfgKey3(uid, cfgId3);
    386 
    387     sp<UidMap> m = new UidMap();
    388     sp<StatsPullerManager> pullerManager = new StatsPullerManager();
    389     sp<AlarmMonitor> anomalyAlarmMonitor;
    390     sp<AlarmMonitor> subscriberAlarmMonitor;
    391     vector<int64_t> activeConfigsBroadcast;
    392 
    393     long timeBase1 = 1;
    394     int broadcastCount = 0;
    395     StatsLogProcessor processor(m, pullerManager, anomalyAlarmMonitor, subscriberAlarmMonitor,
    396             timeBase1, [](const ConfigKey& key) { return true; },
    397             [&uid, &broadcastCount, &activeConfigsBroadcast](const int& broadcastUid,
    398                     const vector<int64_t>& activeConfigs) {
    399                 broadcastCount++;
    400                 EXPECT_EQ(broadcastUid, uid);
    401                 activeConfigsBroadcast.clear();
    402                 activeConfigsBroadcast.insert(activeConfigsBroadcast.end(),
    403                         activeConfigs.begin(), activeConfigs.end());
    404                 return true;
    405             });
    406 
    407     processor.OnConfigUpdated(1, cfgKey1, config1);
    408     processor.OnConfigUpdated(2, cfgKey2, config2);
    409     processor.OnConfigUpdated(3, cfgKey3, config3);
    410 
    411     EXPECT_EQ(3, processor.mMetricsManagers.size());
    412 
    413     // Expect the first config and both metrics in it to be active.
    414     auto it = processor.mMetricsManagers.find(cfgKey1);
    415     EXPECT_TRUE(it != processor.mMetricsManagers.end());
    416     auto& metricsManager1 = it->second;
    417     EXPECT_TRUE(metricsManager1->isActive());
    418 
    419     auto metricIt = metricsManager1->mAllMetricProducers.begin();
    420     for (; metricIt != metricsManager1->mAllMetricProducers.end(); metricIt++) {
    421         if ((*metricIt)->getMetricId() == metricId1) {
    422             break;
    423         }
    424     }
    425     EXPECT_TRUE(metricIt != metricsManager1->mAllMetricProducers.end());
    426     auto& metricProducer1 = *metricIt;
    427     EXPECT_TRUE(metricProducer1->isActive());
    428 
    429     metricIt = metricsManager1->mAllMetricProducers.begin();
    430     for (; metricIt != metricsManager1->mAllMetricProducers.end(); metricIt++) {
    431         if ((*metricIt)->getMetricId() == metricId2) {
    432             break;
    433         }
    434     }
    435     EXPECT_TRUE(metricIt != metricsManager1->mAllMetricProducers.end());
    436     auto& metricProducer2 = *metricIt;
    437     EXPECT_TRUE(metricProducer2->isActive());
    438 
    439     // Expect config 2 to be active. Metric 3 shouldn't be active, metric 4 should be active.
    440     it = processor.mMetricsManagers.find(cfgKey2);
    441     EXPECT_TRUE(it != processor.mMetricsManagers.end());
    442     auto& metricsManager2 = it->second;
    443     EXPECT_TRUE(metricsManager2->isActive());
    444 
    445     metricIt = metricsManager2->mAllMetricProducers.begin();
    446     for (; metricIt != metricsManager2->mAllMetricProducers.end(); metricIt++) {
    447         if ((*metricIt)->getMetricId() == metricId3) {
    448             break;
    449         }
    450     }
    451     EXPECT_TRUE(metricIt != metricsManager2->mAllMetricProducers.end());
    452     auto& metricProducer3 = *metricIt;
    453     EXPECT_FALSE(metricProducer3->isActive());
    454 
    455     metricIt = metricsManager2->mAllMetricProducers.begin();
    456     for (; metricIt != metricsManager2->mAllMetricProducers.end(); metricIt++) {
    457         if ((*metricIt)->getMetricId() == metricId4) {
    458             break;
    459         }
    460     }
    461     EXPECT_TRUE(metricIt != metricsManager2->mAllMetricProducers.end());
    462     auto& metricProducer4 = *metricIt;
    463     EXPECT_TRUE(metricProducer4->isActive());
    464 
    465     // Expect the third config and both metrics in it to be inactive.
    466     it = processor.mMetricsManagers.find(cfgKey3);
    467     EXPECT_TRUE(it != processor.mMetricsManagers.end());
    468     auto& metricsManager3 = it->second;
    469     EXPECT_FALSE(metricsManager3->isActive());
    470 
    471     metricIt = metricsManager3->mAllMetricProducers.begin();
    472     for (; metricIt != metricsManager2->mAllMetricProducers.end(); metricIt++) {
    473         if ((*metricIt)->getMetricId() == metricId5) {
    474             break;
    475         }
    476     }
    477     EXPECT_TRUE(metricIt != metricsManager3->mAllMetricProducers.end());
    478     auto& metricProducer5 = *metricIt;
    479     EXPECT_FALSE(metricProducer5->isActive());
    480 
    481     metricIt = metricsManager3->mAllMetricProducers.begin();
    482     for (; metricIt != metricsManager3->mAllMetricProducers.end(); metricIt++) {
    483         if ((*metricIt)->getMetricId() == metricId6) {
    484             break;
    485         }
    486     }
    487     EXPECT_TRUE(metricIt != metricsManager3->mAllMetricProducers.end());
    488     auto& metricProducer6 = *metricIt;
    489     EXPECT_FALSE(metricProducer6->isActive());
    490 
    491     // No broadcast for active configs should have happened yet.
    492     EXPECT_EQ(broadcastCount, 0);
    493 
    494     // Activate all 3 metrics that were not active.
    495     std::vector<AttributionNodeInternal> attributions1 = {CreateAttribution(111, "App1")};
    496     auto event = CreateAcquireWakelockEvent(attributions1, "wl1", 100 + timeBase1);
    497     processor.OnLogEvent(event.get());
    498 
    499     // Assert that all 3 configs are active.
    500     EXPECT_TRUE(metricsManager1->isActive());
    501     EXPECT_TRUE(metricsManager2->isActive());
    502     EXPECT_TRUE(metricsManager3->isActive());
    503 
    504     // A broadcast should have happened, and all 3 configs should be active in the broadcast.
    505     EXPECT_EQ(broadcastCount, 1);
    506     EXPECT_EQ(activeConfigsBroadcast.size(), 3);
    507     EXPECT_TRUE(std::find(activeConfigsBroadcast.begin(), activeConfigsBroadcast.end(), cfgId1)
    508             != activeConfigsBroadcast.end());
    509     EXPECT_TRUE(std::find(activeConfigsBroadcast.begin(), activeConfigsBroadcast.end(), cfgId2)
    510             != activeConfigsBroadcast.end());
    511     EXPECT_TRUE(std::find(activeConfigsBroadcast.begin(), activeConfigsBroadcast.end(), cfgId3)
    512             != activeConfigsBroadcast.end());
    513 
    514     // When we shut down, metrics 3 & 5 have 100ns remaining, metric 6 has 100s + 100ns.
    515     int64_t shutDownTime = timeBase1 + 100 * NS_PER_SEC;
    516     processor.SaveActiveConfigsToDisk(shutDownTime);
    517     const int64_t ttl3 = event->GetElapsedTimestampNs() +
    518             metric3ActivationTrigger->ttl_seconds() * NS_PER_SEC - shutDownTime;
    519     const int64_t ttl5 = event->GetElapsedTimestampNs() +
    520             metric5ActivationTrigger->ttl_seconds() * NS_PER_SEC - shutDownTime;
    521     const int64_t ttl6 = event->GetElapsedTimestampNs() +
    522             metric6ActivationTrigger->ttl_seconds() * NS_PER_SEC - shutDownTime;
    523 
    524     // Create a second StatsLogProcessor and push the same 3 configs.
    525     long timeBase2 = 1000;
    526     sp<StatsLogProcessor> processor2 =
    527             CreateStatsLogProcessor(timeBase2, timeBase2, config1, cfgKey1);
    528     processor2->OnConfigUpdated(timeBase2, cfgKey2, config2);
    529     processor2->OnConfigUpdated(timeBase2, cfgKey3, config3);
    530 
    531     EXPECT_EQ(3, processor2->mMetricsManagers.size());
    532 
    533     // First config and both metrics are active.
    534     it = processor2->mMetricsManagers.find(cfgKey1);
    535     EXPECT_TRUE(it != processor2->mMetricsManagers.end());
    536     auto& metricsManager1001 = it->second;
    537     EXPECT_TRUE(metricsManager1001->isActive());
    538 
    539     metricIt = metricsManager1001->mAllMetricProducers.begin();
    540     for (; metricIt != metricsManager1001->mAllMetricProducers.end(); metricIt++) {
    541         if ((*metricIt)->getMetricId() == metricId1) {
    542             break;
    543         }
    544     }
    545     EXPECT_TRUE(metricIt != metricsManager1001->mAllMetricProducers.end());
    546     auto& metricProducer1001 = *metricIt;
    547     EXPECT_TRUE(metricProducer1001->isActive());
    548 
    549     metricIt = metricsManager1001->mAllMetricProducers.begin();
    550     for (; metricIt != metricsManager1001->mAllMetricProducers.end(); metricIt++) {
    551         if ((*metricIt)->getMetricId() == metricId2) {
    552             break;
    553         }
    554     }
    555     EXPECT_TRUE(metricIt != metricsManager1001->mAllMetricProducers.end());
    556     auto& metricProducer1002 = *metricIt;
    557     EXPECT_TRUE(metricProducer1002->isActive());
    558 
    559     // Second config is active. Metric 3 is inactive, metric 4 is active.
    560     it = processor2->mMetricsManagers.find(cfgKey2);
    561     EXPECT_TRUE(it != processor2->mMetricsManagers.end());
    562     auto& metricsManager1002 = it->second;
    563     EXPECT_TRUE(metricsManager1002->isActive());
    564 
    565     metricIt = metricsManager1002->mAllMetricProducers.begin();
    566     for (; metricIt != metricsManager1002->mAllMetricProducers.end(); metricIt++) {
    567         if ((*metricIt)->getMetricId() == metricId3) {
    568             break;
    569         }
    570     }
    571     EXPECT_TRUE(metricIt != metricsManager1002->mAllMetricProducers.end());
    572     auto& metricProducer1003 = *metricIt;
    573     EXPECT_FALSE(metricProducer1003->isActive());
    574 
    575     metricIt = metricsManager1002->mAllMetricProducers.begin();
    576     for (; metricIt != metricsManager1002->mAllMetricProducers.end(); metricIt++) {
    577         if ((*metricIt)->getMetricId() == metricId4) {
    578             break;
    579         }
    580     }
    581     EXPECT_TRUE(metricIt != metricsManager1002->mAllMetricProducers.end());
    582     auto& metricProducer1004 = *metricIt;
    583     EXPECT_TRUE(metricProducer1004->isActive());
    584 
    585     // Config 3 is inactive. both metrics are inactive.
    586     it = processor2->mMetricsManagers.find(cfgKey3);
    587     EXPECT_TRUE(it != processor2->mMetricsManagers.end());
    588     auto& metricsManager1003 = it->second;
    589     EXPECT_FALSE(metricsManager1003->isActive());
    590     EXPECT_EQ(2, metricsManager1003->mAllMetricProducers.size());
    591 
    592     metricIt = metricsManager1003->mAllMetricProducers.begin();
    593     for (; metricIt != metricsManager1002->mAllMetricProducers.end(); metricIt++) {
    594         if ((*metricIt)->getMetricId() == metricId5) {
    595             break;
    596         }
    597     }
    598     EXPECT_TRUE(metricIt != metricsManager1003->mAllMetricProducers.end());
    599     auto& metricProducer1005 = *metricIt;
    600     EXPECT_FALSE(metricProducer1005->isActive());
    601 
    602     metricIt = metricsManager1003->mAllMetricProducers.begin();
    603     for (; metricIt != metricsManager1003->mAllMetricProducers.end(); metricIt++) {
    604         if ((*metricIt)->getMetricId() == metricId6) {
    605             break;
    606         }
    607     }
    608     EXPECT_TRUE(metricIt != metricsManager1003->mAllMetricProducers.end());
    609     auto& metricProducer1006 = *metricIt;
    610     EXPECT_FALSE(metricProducer1006->isActive());
    611 
    612     // Assert that all 3 metrics with activation are inactive and that the ttls were properly set.
    613     EXPECT_FALSE(metricProducer1003->isActive());
    614     const auto& activation1003 = metricProducer1003->mEventActivationMap.begin()->second;
    615     EXPECT_EQ(100 * NS_PER_SEC, activation1003->ttl_ns);
    616     EXPECT_EQ(0, activation1003->start_ns);
    617     EXPECT_FALSE(metricProducer1005->isActive());
    618     const auto& activation1005 = metricProducer1005->mEventActivationMap.begin()->second;
    619     EXPECT_EQ(100 * NS_PER_SEC, activation1005->ttl_ns);
    620     EXPECT_EQ(0, activation1005->start_ns);
    621     EXPECT_FALSE(metricProducer1006->isActive());
    622     const auto& activation1006 = metricProducer1006->mEventActivationMap.begin()->second;
    623     EXPECT_EQ(200 * NS_PER_SEC, activation1006->ttl_ns);
    624     EXPECT_EQ(0, activation1006->start_ns);
    625 
    626     processor2->LoadActiveConfigsFromDisk();
    627 
    628     // After loading activations from disk, assert that all 3 metrics are active.
    629     EXPECT_TRUE(metricProducer1003->isActive());
    630     EXPECT_EQ(timeBase2 + ttl3 - activation1003->ttl_ns, activation1003->start_ns);
    631     EXPECT_TRUE(metricProducer1005->isActive());
    632     EXPECT_EQ(timeBase2 + ttl5 - activation1005->ttl_ns, activation1005->start_ns);
    633     EXPECT_TRUE(metricProducer1006->isActive());
    634     EXPECT_EQ(timeBase2 + ttl6 - activation1006->ttl_ns, activation1003->start_ns);
    635 
    636     // Make sure no more broadcasts have happened.
    637     EXPECT_EQ(broadcastCount, 1);
    638 }
    639 
    640 TEST(StatsLogProcessorTest, TestActivationOnBoot) {
    641     int uid = 1111;
    642 
    643     StatsdConfig config1;
    644     config1.set_id(12341);
    645     config1.add_allowed_log_source("AID_ROOT");  // LogEvent defaults to UID of root.
    646     auto wakelockAcquireMatcher = CreateAcquireWakelockAtomMatcher();
    647     *config1.add_atom_matcher() = wakelockAcquireMatcher;
    648 
    649     long metricId1 = 1234561;
    650     long metricId2 = 1234562;
    651     auto countMetric1 = config1.add_count_metric();
    652     countMetric1->set_id(metricId1);
    653     countMetric1->set_what(wakelockAcquireMatcher.id());
    654     countMetric1->set_bucket(FIVE_MINUTES);
    655 
    656     auto countMetric2 = config1.add_count_metric();
    657     countMetric2->set_id(metricId2);
    658     countMetric2->set_what(wakelockAcquireMatcher.id());
    659     countMetric2->set_bucket(FIVE_MINUTES);
    660 
    661     auto metric1Activation = config1.add_metric_activation();
    662     metric1Activation->set_metric_id(metricId1);
    663     metric1Activation->set_activation_type(ACTIVATE_ON_BOOT);
    664     auto metric1ActivationTrigger = metric1Activation->add_event_activation();
    665     metric1ActivationTrigger->set_atom_matcher_id(wakelockAcquireMatcher.id());
    666     metric1ActivationTrigger->set_ttl_seconds(100);
    667 
    668     ConfigKey cfgKey1(uid, 12341);
    669     long timeBase1 = 1;
    670     sp<StatsLogProcessor> processor =
    671             CreateStatsLogProcessor(timeBase1, timeBase1, config1, cfgKey1);
    672 
    673     EXPECT_EQ(1, processor->mMetricsManagers.size());
    674     auto it = processor->mMetricsManagers.find(cfgKey1);
    675     EXPECT_TRUE(it != processor->mMetricsManagers.end());
    676     auto& metricsManager1 = it->second;
    677     EXPECT_TRUE(metricsManager1->isActive());
    678 
    679     auto metricIt = metricsManager1->mAllMetricProducers.begin();
    680     for (; metricIt != metricsManager1->mAllMetricProducers.end(); metricIt++) {
    681         if ((*metricIt)->getMetricId() == metricId1) {
    682             break;
    683         }
    684     }
    685     EXPECT_TRUE(metricIt != metricsManager1->mAllMetricProducers.end());
    686     auto& metricProducer1 = *metricIt;
    687     EXPECT_FALSE(metricProducer1->isActive());
    688 
    689     metricIt = metricsManager1->mAllMetricProducers.begin();
    690     for (; metricIt != metricsManager1->mAllMetricProducers.end(); metricIt++) {
    691         if ((*metricIt)->getMetricId() == metricId2) {
    692             break;
    693         }
    694     }
    695     EXPECT_TRUE(metricIt != metricsManager1->mAllMetricProducers.end());
    696     auto& metricProducer2 = *metricIt;
    697     EXPECT_TRUE(metricProducer2->isActive());
    698 
    699     const auto& activation1 = metricProducer1->mEventActivationMap.begin()->second;
    700     EXPECT_EQ(100 * NS_PER_SEC, activation1->ttl_ns);
    701     EXPECT_EQ(0, activation1->start_ns);
    702     EXPECT_EQ(kNotActive, activation1->state);
    703 
    704     std::vector<AttributionNodeInternal> attributions1 = {CreateAttribution(111, "App1")};
    705     auto event = CreateAcquireWakelockEvent(attributions1, "wl1", 100 + timeBase1);
    706     processor->OnLogEvent(event.get());
    707 
    708     EXPECT_FALSE(metricProducer1->isActive());
    709     EXPECT_EQ(0, activation1->start_ns);
    710     EXPECT_EQ(kActiveOnBoot, activation1->state);
    711 
    712     int64_t shutDownTime = timeBase1 + 100 * NS_PER_SEC;
    713     processor->SaveActiveConfigsToDisk(shutDownTime);
    714     EXPECT_FALSE(metricProducer1->isActive());
    715     const int64_t ttl1 = metric1ActivationTrigger->ttl_seconds() * NS_PER_SEC;
    716 
    717     long timeBase2 = 1000;
    718     sp<StatsLogProcessor> processor2 =
    719             CreateStatsLogProcessor(timeBase2, timeBase2, config1, cfgKey1);
    720 
    721     EXPECT_EQ(1, processor2->mMetricsManagers.size());
    722     it = processor2->mMetricsManagers.find(cfgKey1);
    723     EXPECT_TRUE(it != processor2->mMetricsManagers.end());
    724     auto& metricsManager1001 = it->second;
    725     EXPECT_TRUE(metricsManager1001->isActive());
    726 
    727     metricIt = metricsManager1001->mAllMetricProducers.begin();
    728     for (; metricIt != metricsManager1001->mAllMetricProducers.end(); metricIt++) {
    729         if ((*metricIt)->getMetricId() == metricId1) {
    730             break;
    731         }
    732     }
    733     EXPECT_TRUE(metricIt != metricsManager1001->mAllMetricProducers.end());
    734     auto& metricProducer1001 = *metricIt;
    735     EXPECT_FALSE(metricProducer1001->isActive());
    736 
    737     metricIt = metricsManager1001->mAllMetricProducers.begin();
    738     for (; metricIt != metricsManager1001->mAllMetricProducers.end(); metricIt++) {
    739         if ((*metricIt)->getMetricId() == metricId2) {
    740             break;
    741         }
    742     }
    743     EXPECT_TRUE(metricIt != metricsManager1001->mAllMetricProducers.end());
    744     auto& metricProducer1002 = *metricIt;
    745     EXPECT_TRUE(metricProducer1002->isActive());
    746 
    747     const auto& activation1001 = metricProducer1001->mEventActivationMap.begin()->second;
    748     EXPECT_EQ(100 * NS_PER_SEC, activation1001->ttl_ns);
    749     EXPECT_EQ(0, activation1001->start_ns);
    750     EXPECT_EQ(kNotActive, activation1001->state);
    751 
    752     processor2->LoadActiveConfigsFromDisk();
    753 
    754     EXPECT_TRUE(metricProducer1001->isActive());
    755     EXPECT_EQ(timeBase2 + ttl1 - activation1001->ttl_ns, activation1001->start_ns);
    756     EXPECT_EQ(kActive, activation1001->state);
    757 }
    758 
    759 TEST(StatsLogProcessorTest, TestActivationOnBootMultipleActivations) {
    760     int uid = 1111;
    761 
    762     // Create config with 2 metrics:
    763     // Metric 1: Activate on boot with 2 activations
    764     // Metric 2: Always active
    765     StatsdConfig config1;
    766     config1.set_id(12341);
    767     config1.add_allowed_log_source("AID_ROOT");  // LogEvent defaults to UID of root.
    768     auto wakelockAcquireMatcher = CreateAcquireWakelockAtomMatcher();
    769     auto screenOnMatcher = CreateScreenTurnedOnAtomMatcher();
    770     *config1.add_atom_matcher() = wakelockAcquireMatcher;
    771     *config1.add_atom_matcher() = screenOnMatcher;
    772 
    773     long metricId1 = 1234561;
    774     long metricId2 = 1234562;
    775 
    776     auto countMetric1 = config1.add_count_metric();
    777     countMetric1->set_id(metricId1);
    778     countMetric1->set_what(wakelockAcquireMatcher.id());
    779     countMetric1->set_bucket(FIVE_MINUTES);
    780 
    781     auto countMetric2 = config1.add_count_metric();
    782     countMetric2->set_id(metricId2);
    783     countMetric2->set_what(wakelockAcquireMatcher.id());
    784     countMetric2->set_bucket(FIVE_MINUTES);
    785 
    786     auto metric1Activation = config1.add_metric_activation();
    787     metric1Activation->set_metric_id(metricId1);
    788     metric1Activation->set_activation_type(ACTIVATE_ON_BOOT);
    789     auto metric1ActivationTrigger1 = metric1Activation->add_event_activation();
    790     metric1ActivationTrigger1->set_atom_matcher_id(wakelockAcquireMatcher.id());
    791     metric1ActivationTrigger1->set_ttl_seconds(100);
    792     auto metric1ActivationTrigger2 = metric1Activation->add_event_activation();
    793     metric1ActivationTrigger2->set_atom_matcher_id(screenOnMatcher.id());
    794     metric1ActivationTrigger2->set_ttl_seconds(200);
    795 
    796     ConfigKey cfgKey1(uid, 12341);
    797     long timeBase1 = 1;
    798     sp<StatsLogProcessor> processor =
    799             CreateStatsLogProcessor(timeBase1, timeBase1, config1, cfgKey1);
    800 
    801     // Metric 1 is not active.
    802     // Metric 2 is active.
    803     // {{{---------------------------------------------------------------------------
    804     EXPECT_EQ(1, processor->mMetricsManagers.size());
    805     auto it = processor->mMetricsManagers.find(cfgKey1);
    806     EXPECT_TRUE(it != processor->mMetricsManagers.end());
    807     auto& metricsManager1 = it->second;
    808     EXPECT_TRUE(metricsManager1->isActive());
    809 
    810     auto metricIt = metricsManager1->mAllMetricProducers.begin();
    811     for (; metricIt != metricsManager1->mAllMetricProducers.end(); metricIt++) {
    812         if ((*metricIt)->getMetricId() == metricId1) {
    813             break;
    814         }
    815     }
    816     EXPECT_TRUE(metricIt != metricsManager1->mAllMetricProducers.end());
    817     auto& metricProducer1 = *metricIt;
    818     EXPECT_FALSE(metricProducer1->isActive());
    819 
    820     metricIt = metricsManager1->mAllMetricProducers.begin();
    821     for (; metricIt != metricsManager1->mAllMetricProducers.end(); metricIt++) {
    822         if ((*metricIt)->getMetricId() == metricId2) {
    823             break;
    824         }
    825     }
    826     EXPECT_TRUE(metricIt != metricsManager1->mAllMetricProducers.end());
    827     auto& metricProducer2 = *metricIt;
    828     EXPECT_TRUE(metricProducer2->isActive());
    829 
    830     int i = 0;
    831     for (; i < metricsManager1->mAllAtomMatchers.size(); i++) {
    832         if (metricsManager1->mAllAtomMatchers[i]->getId() ==
    833                 metric1ActivationTrigger1->atom_matcher_id()) {
    834             break;
    835         }
    836     }
    837     const auto& activation1 = metricProducer1->mEventActivationMap.at(i);
    838     EXPECT_EQ(100 * NS_PER_SEC, activation1->ttl_ns);
    839     EXPECT_EQ(0, activation1->start_ns);
    840     EXPECT_EQ(kNotActive, activation1->state);
    841 
    842     i = 0;
    843     for (; i < metricsManager1->mAllAtomMatchers.size(); i++) {
    844         if (metricsManager1->mAllAtomMatchers[i]->getId() ==
    845                 metric1ActivationTrigger2->atom_matcher_id()) {
    846             break;
    847         }
    848     }
    849     const auto& activation2 = metricProducer1->mEventActivationMap.at(i);
    850     EXPECT_EQ(200 * NS_PER_SEC, activation2->ttl_ns);
    851     EXPECT_EQ(0, activation2->start_ns);
    852     EXPECT_EQ(kNotActive, activation2->state);
    853     // }}}------------------------------------------------------------------------------
    854 
    855     // Trigger Activation 1 for Metric 1
    856     std::vector<AttributionNodeInternal> attributions1 = {CreateAttribution(111, "App1")};
    857     auto event = CreateAcquireWakelockEvent(attributions1, "wl1", 100 + timeBase1);
    858     processor->OnLogEvent(event.get());
    859 
    860     // Metric 1 is not active; Activation 1 set to kActiveOnBoot
    861     // Metric 2 is active.
    862     // {{{---------------------------------------------------------------------------
    863     EXPECT_FALSE(metricProducer1->isActive());
    864     EXPECT_EQ(0, activation1->start_ns);
    865     EXPECT_EQ(kActiveOnBoot, activation1->state);
    866     EXPECT_EQ(0, activation2->start_ns);
    867     EXPECT_EQ(kNotActive, activation2->state);
    868 
    869     EXPECT_TRUE(metricProducer2->isActive());
    870     // }}}-----------------------------------------------------------------------------
    871 
    872     // Simulate shutdown by saving state to disk
    873     int64_t shutDownTime = timeBase1 + 100 * NS_PER_SEC;
    874     processor->SaveActiveConfigsToDisk(shutDownTime);
    875     EXPECT_FALSE(metricProducer1->isActive());
    876     int64_t ttl1 = metric1ActivationTrigger1->ttl_seconds() * NS_PER_SEC;
    877 
    878     // Simulate device restarted state by creating new instance of StatsLogProcessor with the
    879     // same config.
    880     long timeBase2 = 1000;
    881     sp<StatsLogProcessor> processor2 =
    882             CreateStatsLogProcessor(timeBase2, timeBase2, config1, cfgKey1);
    883 
    884     // Metric 1 is not active.
    885     // Metric 2 is active.
    886     // {{{---------------------------------------------------------------------------
    887     EXPECT_EQ(1, processor2->mMetricsManagers.size());
    888     it = processor2->mMetricsManagers.find(cfgKey1);
    889     EXPECT_TRUE(it != processor2->mMetricsManagers.end());
    890     auto& metricsManager1001 = it->second;
    891     EXPECT_TRUE(metricsManager1001->isActive());
    892 
    893     metricIt = metricsManager1001->mAllMetricProducers.begin();
    894     for (; metricIt != metricsManager1001->mAllMetricProducers.end(); metricIt++) {
    895         if ((*metricIt)->getMetricId() == metricId1) {
    896             break;
    897         }
    898     }
    899     EXPECT_TRUE(metricIt != metricsManager1001->mAllMetricProducers.end());
    900     auto& metricProducer1001 = *metricIt;
    901     EXPECT_FALSE(metricProducer1001->isActive());
    902 
    903     metricIt = metricsManager1001->mAllMetricProducers.begin();
    904     for (; metricIt != metricsManager1001->mAllMetricProducers.end(); metricIt++) {
    905         if ((*metricIt)->getMetricId() == metricId2) {
    906             break;
    907         }
    908     }
    909     EXPECT_TRUE(metricIt != metricsManager1001->mAllMetricProducers.end());
    910     auto& metricProducer1002 = *metricIt;
    911     EXPECT_TRUE(metricProducer1002->isActive());
    912 
    913     i = 0;
    914     for (; i < metricsManager1001->mAllAtomMatchers.size(); i++) {
    915         if (metricsManager1001->mAllAtomMatchers[i]->getId() ==
    916                 metric1ActivationTrigger1->atom_matcher_id()) {
    917             break;
    918         }
    919     }
    920     const auto& activation1001_1 = metricProducer1001->mEventActivationMap.at(i);
    921     EXPECT_EQ(100 * NS_PER_SEC, activation1001_1->ttl_ns);
    922     EXPECT_EQ(0, activation1001_1->start_ns);
    923     EXPECT_EQ(kNotActive, activation1001_1->state);
    924 
    925     i = 0;
    926     for (; i < metricsManager1001->mAllAtomMatchers.size(); i++) {
    927         if (metricsManager1001->mAllAtomMatchers[i]->getId() ==
    928                 metric1ActivationTrigger2->atom_matcher_id()) {
    929             break;
    930         }
    931     }
    932 
    933     const auto& activation1001_2 = metricProducer1001->mEventActivationMap.at(i);
    934     EXPECT_EQ(200 * NS_PER_SEC, activation1001_2->ttl_ns);
    935     EXPECT_EQ(0, activation1001_2->start_ns);
    936     EXPECT_EQ(kNotActive, activation1001_2->state);
    937     // }}}-----------------------------------------------------------------------------------
    938 
    939     // Load saved state from disk.
    940     processor2->LoadActiveConfigsFromDisk();
    941 
    942     // Metric 1 active; Activation 1 is active, Activation 2 is not active
    943     // Metric 2 is active.
    944     // {{{---------------------------------------------------------------------------
    945     EXPECT_TRUE(metricProducer1001->isActive());
    946     EXPECT_EQ(timeBase2 + ttl1 - activation1001_1->ttl_ns, activation1001_1->start_ns);
    947     EXPECT_EQ(kActive, activation1001_1->state);
    948     EXPECT_EQ(0, activation1001_2->start_ns);
    949     EXPECT_EQ(kNotActive, activation1001_2->state);
    950 
    951     EXPECT_TRUE(metricProducer1002->isActive());
    952     // }}}--------------------------------------------------------------------------------
    953 
    954     // Trigger Activation 2 for Metric 1.
    955     auto screenOnEvent = CreateScreenStateChangedEvent(
    956             android::view::DISPLAY_STATE_ON,
    957             timeBase2 + 200
    958     );
    959     processor2->OnLogEvent(screenOnEvent.get());
    960 
    961     // Metric 1 active; Activation 1 is active, Activation 2 is set to kActiveOnBoot
    962     // Metric 2 is active.
    963     // {{{---------------------------------------------------------------------------
    964     EXPECT_TRUE(metricProducer1001->isActive());
    965     EXPECT_EQ(timeBase2 + ttl1 - activation1001_1->ttl_ns, activation1001_1->start_ns);
    966     EXPECT_EQ(kActive, activation1001_1->state);
    967     EXPECT_EQ(0, activation1001_2->start_ns);
    968     EXPECT_EQ(kActiveOnBoot, activation1001_2->state);
    969 
    970     EXPECT_TRUE(metricProducer1002->isActive());
    971     // }}}---------------------------------------------------------------------------
    972 
    973     // Simulate shutdown by saving state to disk
    974     shutDownTime = timeBase2 + 50 * NS_PER_SEC;
    975     processor2->SaveActiveConfigsToDisk(shutDownTime);
    976     EXPECT_TRUE(metricProducer1001->isActive());
    977     EXPECT_TRUE(metricProducer1002->isActive());
    978     ttl1 = timeBase2 + metric1ActivationTrigger1->ttl_seconds() * NS_PER_SEC - shutDownTime;
    979     int64_t ttl2 = metric1ActivationTrigger2->ttl_seconds() * NS_PER_SEC;
    980 
    981     // Simulate device restarted state by creating new instance of StatsLogProcessor with the
    982     // same config.
    983     long timeBase3 = timeBase2 + 120 * NS_PER_SEC;
    984     sp<StatsLogProcessor> processor3 =
    985             CreateStatsLogProcessor(timeBase3, timeBase3, config1, cfgKey1);
    986 
    987     // Metric 1 is not active.
    988     // Metric 2 is active.
    989     // {{{---------------------------------------------------------------------------
    990     EXPECT_EQ(1, processor3->mMetricsManagers.size());
    991     it = processor3->mMetricsManagers.find(cfgKey1);
    992     EXPECT_TRUE(it != processor3->mMetricsManagers.end());
    993     auto& metricsManagerTimeBase3 = it->second;
    994     EXPECT_TRUE(metricsManagerTimeBase3->isActive());
    995 
    996     metricIt = metricsManagerTimeBase3->mAllMetricProducers.begin();
    997     for (; metricIt != metricsManagerTimeBase3->mAllMetricProducers.end(); metricIt++) {
    998         if ((*metricIt)->getMetricId() == metricId1) {
    999             break;
   1000         }
   1001     }
   1002     EXPECT_TRUE(metricIt != metricsManagerTimeBase3->mAllMetricProducers.end());
   1003     auto& metricProducerTimeBase3_1 = *metricIt;
   1004     EXPECT_FALSE(metricProducerTimeBase3_1->isActive());
   1005 
   1006     metricIt = metricsManagerTimeBase3->mAllMetricProducers.begin();
   1007     for (; metricIt != metricsManagerTimeBase3->mAllMetricProducers.end(); metricIt++) {
   1008         if ((*metricIt)->getMetricId() == metricId2) {
   1009             break;
   1010         }
   1011     }
   1012     EXPECT_TRUE(metricIt != metricsManagerTimeBase3->mAllMetricProducers.end());
   1013     auto& metricProducerTimeBase3_2 = *metricIt;
   1014     EXPECT_TRUE(metricProducerTimeBase3_2->isActive());
   1015 
   1016     i = 0;
   1017     for (; i < metricsManagerTimeBase3->mAllAtomMatchers.size(); i++) {
   1018         if (metricsManagerTimeBase3->mAllAtomMatchers[i]->getId() ==
   1019                 metric1ActivationTrigger1->atom_matcher_id()) {
   1020             break;
   1021         }
   1022     }
   1023     const auto& activationTimeBase3_1 = metricProducerTimeBase3_1->mEventActivationMap.at(i);
   1024     EXPECT_EQ(100 * NS_PER_SEC, activationTimeBase3_1->ttl_ns);
   1025     EXPECT_EQ(0, activationTimeBase3_1->start_ns);
   1026     EXPECT_EQ(kNotActive, activationTimeBase3_1->state);
   1027 
   1028     i = 0;
   1029     for (; i < metricsManagerTimeBase3->mAllAtomMatchers.size(); i++) {
   1030         if (metricsManagerTimeBase3->mAllAtomMatchers[i]->getId() ==
   1031                 metric1ActivationTrigger2->atom_matcher_id()) {
   1032             break;
   1033         }
   1034     }
   1035 
   1036     const auto& activationTimeBase3_2 = metricProducerTimeBase3_1->mEventActivationMap.at(i);
   1037     EXPECT_EQ(200 * NS_PER_SEC, activationTimeBase3_2->ttl_ns);
   1038     EXPECT_EQ(0, activationTimeBase3_2->start_ns);
   1039     EXPECT_EQ(kNotActive, activationTimeBase3_2->state);
   1040 
   1041     EXPECT_TRUE(metricProducerTimeBase3_2->isActive());
   1042     // }}}----------------------------------------------------------------------------------
   1043 
   1044     // Load saved state from disk.
   1045     processor3->LoadActiveConfigsFromDisk();
   1046 
   1047     // Metric 1 active: Activation 1 is active, Activation 2 is active
   1048     // Metric 2 is active.
   1049     // {{{---------------------------------------------------------------------------
   1050     EXPECT_TRUE(metricProducerTimeBase3_1->isActive());
   1051     EXPECT_EQ(timeBase3 + ttl1 - activationTimeBase3_1->ttl_ns, activationTimeBase3_1->start_ns);
   1052     EXPECT_EQ(kActive, activationTimeBase3_1->state);
   1053     EXPECT_EQ(timeBase3 + ttl2 - activationTimeBase3_2->ttl_ns, activationTimeBase3_2->start_ns);
   1054     EXPECT_EQ(kActive, activationTimeBase3_2->state);
   1055 
   1056     EXPECT_TRUE(metricProducerTimeBase3_2->isActive());
   1057     // }}}-------------------------------------------------------------------------------
   1058 
   1059     // Trigger Activation 2 for Metric 1 again.
   1060     screenOnEvent = CreateScreenStateChangedEvent(
   1061             android::view::DISPLAY_STATE_ON,
   1062             timeBase3 + 100 * NS_PER_SEC
   1063     );
   1064     processor3->OnLogEvent(screenOnEvent.get());
   1065 
   1066     // Metric 1 active; Activation 1 is not active, Activation 2 is set to active
   1067     // Metric 2 is active.
   1068     // {{{---------------------------------------------------------------------------
   1069     EXPECT_TRUE(metricProducerTimeBase3_1->isActive());
   1070     EXPECT_EQ(kNotActive, activationTimeBase3_1->state);
   1071     EXPECT_EQ(timeBase3 + ttl2 - activationTimeBase3_2->ttl_ns, activationTimeBase3_2->start_ns);
   1072     EXPECT_EQ(kActive, activationTimeBase3_2->state);
   1073 
   1074     EXPECT_TRUE(metricProducerTimeBase3_2->isActive());
   1075     // }}}---------------------------------------------------------------------------
   1076 
   1077     // Simulate shutdown by saving state to disk.
   1078     shutDownTime = timeBase3 + 500 * NS_PER_SEC;
   1079     processor3->SaveActiveConfigsToDisk(shutDownTime);
   1080     EXPECT_TRUE(metricProducer1001->isActive());
   1081     EXPECT_TRUE(metricProducer1002->isActive());
   1082     ttl1 = timeBase3 + ttl1 - shutDownTime;
   1083     ttl2 = timeBase3 + metric1ActivationTrigger2->ttl_seconds() * NS_PER_SEC - shutDownTime;
   1084 
   1085     // Simulate device restarted state by creating new instance of StatsLogProcessor with the
   1086     // same config.
   1087     long timeBase4 = timeBase3 + 600 * NS_PER_SEC;
   1088     sp<StatsLogProcessor> processor4 =
   1089             CreateStatsLogProcessor(timeBase4, timeBase4, config1, cfgKey1);
   1090 
   1091     // Metric 1 is not active.
   1092     // Metric 2 is active.
   1093     // {{{---------------------------------------------------------------------------
   1094     EXPECT_EQ(1, processor4->mMetricsManagers.size());
   1095     it = processor4->mMetricsManagers.find(cfgKey1);
   1096     EXPECT_TRUE(it != processor4->mMetricsManagers.end());
   1097     auto& metricsManagerTimeBase4 = it->second;
   1098     EXPECT_TRUE(metricsManagerTimeBase4->isActive());
   1099 
   1100     metricIt = metricsManagerTimeBase4->mAllMetricProducers.begin();
   1101     for (; metricIt != metricsManagerTimeBase4->mAllMetricProducers.end(); metricIt++) {
   1102         if ((*metricIt)->getMetricId() == metricId1) {
   1103             break;
   1104         }
   1105     }
   1106     EXPECT_TRUE(metricIt != metricsManagerTimeBase4->mAllMetricProducers.end());
   1107     auto& metricProducerTimeBase4_1 = *metricIt;
   1108     EXPECT_FALSE(metricProducerTimeBase4_1->isActive());
   1109 
   1110     metricIt = metricsManagerTimeBase4->mAllMetricProducers.begin();
   1111     for (; metricIt != metricsManagerTimeBase4->mAllMetricProducers.end(); metricIt++) {
   1112         if ((*metricIt)->getMetricId() == metricId2) {
   1113             break;
   1114         }
   1115     }
   1116     EXPECT_TRUE(metricIt != metricsManagerTimeBase4->mAllMetricProducers.end());
   1117     auto& metricProducerTimeBase4_2 = *metricIt;
   1118     EXPECT_TRUE(metricProducerTimeBase4_2->isActive());
   1119 
   1120     i = 0;
   1121     for (; i < metricsManagerTimeBase4->mAllAtomMatchers.size(); i++) {
   1122         if (metricsManagerTimeBase4->mAllAtomMatchers[i]->getId() ==
   1123                 metric1ActivationTrigger1->atom_matcher_id()) {
   1124             break;
   1125         }
   1126     }
   1127     const auto& activationTimeBase4_1 = metricProducerTimeBase4_1->mEventActivationMap.at(i);
   1128     EXPECT_EQ(100 * NS_PER_SEC, activationTimeBase4_1->ttl_ns);
   1129     EXPECT_EQ(0, activationTimeBase4_1->start_ns);
   1130     EXPECT_EQ(kNotActive, activationTimeBase4_1->state);
   1131 
   1132     i = 0;
   1133     for (; i < metricsManagerTimeBase4->mAllAtomMatchers.size(); i++) {
   1134         if (metricsManagerTimeBase4->mAllAtomMatchers[i]->getId() ==
   1135                 metric1ActivationTrigger2->atom_matcher_id()) {
   1136             break;
   1137         }
   1138     }
   1139 
   1140     const auto& activationTimeBase4_2 = metricProducerTimeBase4_1->mEventActivationMap.at(i);
   1141     EXPECT_EQ(200 * NS_PER_SEC, activationTimeBase4_2->ttl_ns);
   1142     EXPECT_EQ(0, activationTimeBase4_2->start_ns);
   1143     EXPECT_EQ(kNotActive, activationTimeBase4_2->state);
   1144 
   1145     EXPECT_TRUE(metricProducerTimeBase4_2->isActive());
   1146     // }}}----------------------------------------------------------------------------------
   1147 
   1148     // Load saved state from disk.
   1149     processor4->LoadActiveConfigsFromDisk();
   1150 
   1151     // Metric 1 active: Activation 1 is not active, Activation 2 is not active
   1152     // Metric 2 is active.
   1153     // {{{---------------------------------------------------------------------------
   1154     EXPECT_FALSE(metricProducerTimeBase4_1->isActive());
   1155     EXPECT_EQ(kNotActive, activationTimeBase4_1->state);
   1156     EXPECT_EQ(kNotActive, activationTimeBase4_2->state);
   1157 
   1158     EXPECT_TRUE(metricProducerTimeBase4_2->isActive());
   1159     // }}}-------------------------------------------------------------------------------
   1160 }
   1161 
   1162 TEST(StatsLogProcessorTest, TestActivationOnBootMultipleActivationsDifferentActivationTypes) {
   1163     int uid = 1111;
   1164 
   1165     // Create config with 2 metrics:
   1166     // Metric 1: Activate on boot with 2 activations
   1167     // Metric 2: Always active
   1168     StatsdConfig config1;
   1169     config1.set_id(12341);
   1170     config1.add_allowed_log_source("AID_ROOT");  // LogEvent defaults to UID of root.
   1171     auto wakelockAcquireMatcher = CreateAcquireWakelockAtomMatcher();
   1172     auto screenOnMatcher = CreateScreenTurnedOnAtomMatcher();
   1173     *config1.add_atom_matcher() = wakelockAcquireMatcher;
   1174     *config1.add_atom_matcher() = screenOnMatcher;
   1175 
   1176     long metricId1 = 1234561;
   1177     long metricId2 = 1234562;
   1178 
   1179     auto countMetric1 = config1.add_count_metric();
   1180     countMetric1->set_id(metricId1);
   1181     countMetric1->set_what(wakelockAcquireMatcher.id());
   1182     countMetric1->set_bucket(FIVE_MINUTES);
   1183 
   1184     auto countMetric2 = config1.add_count_metric();
   1185     countMetric2->set_id(metricId2);
   1186     countMetric2->set_what(wakelockAcquireMatcher.id());
   1187     countMetric2->set_bucket(FIVE_MINUTES);
   1188 
   1189     auto metric1Activation = config1.add_metric_activation();
   1190     metric1Activation->set_metric_id(metricId1);
   1191     metric1Activation->set_activation_type(ACTIVATE_ON_BOOT);
   1192     auto metric1ActivationTrigger1 = metric1Activation->add_event_activation();
   1193     metric1ActivationTrigger1->set_atom_matcher_id(wakelockAcquireMatcher.id());
   1194     metric1ActivationTrigger1->set_ttl_seconds(100);
   1195     auto metric1ActivationTrigger2 = metric1Activation->add_event_activation();
   1196     metric1ActivationTrigger2->set_atom_matcher_id(screenOnMatcher.id());
   1197     metric1ActivationTrigger2->set_ttl_seconds(200);
   1198     metric1ActivationTrigger2->set_activation_type(ACTIVATE_IMMEDIATELY);
   1199 
   1200     ConfigKey cfgKey1(uid, 12341);
   1201     long timeBase1 = 1;
   1202     sp<StatsLogProcessor> processor =
   1203             CreateStatsLogProcessor(timeBase1, timeBase1, config1, cfgKey1);
   1204 
   1205     // Metric 1 is not active.
   1206     // Metric 2 is active.
   1207     // {{{---------------------------------------------------------------------------
   1208     EXPECT_EQ(1, processor->mMetricsManagers.size());
   1209     auto it = processor->mMetricsManagers.find(cfgKey1);
   1210     EXPECT_TRUE(it != processor->mMetricsManagers.end());
   1211     auto& metricsManager1 = it->second;
   1212     EXPECT_TRUE(metricsManager1->isActive());
   1213 
   1214     auto metricIt = metricsManager1->mAllMetricProducers.begin();
   1215     for (; metricIt != metricsManager1->mAllMetricProducers.end(); metricIt++) {
   1216         if ((*metricIt)->getMetricId() == metricId1) {
   1217             break;
   1218         }
   1219     }
   1220     EXPECT_TRUE(metricIt != metricsManager1->mAllMetricProducers.end());
   1221     auto& metricProducer1 = *metricIt;
   1222     EXPECT_FALSE(metricProducer1->isActive());
   1223 
   1224     metricIt = metricsManager1->mAllMetricProducers.begin();
   1225     for (; metricIt != metricsManager1->mAllMetricProducers.end(); metricIt++) {
   1226         if ((*metricIt)->getMetricId() == metricId2) {
   1227             break;
   1228         }
   1229     }
   1230     EXPECT_TRUE(metricIt != metricsManager1->mAllMetricProducers.end());
   1231     auto& metricProducer2 = *metricIt;
   1232     EXPECT_TRUE(metricProducer2->isActive());
   1233 
   1234     int i = 0;
   1235     for (; i < metricsManager1->mAllAtomMatchers.size(); i++) {
   1236         if (metricsManager1->mAllAtomMatchers[i]->getId() ==
   1237                 metric1ActivationTrigger1->atom_matcher_id()) {
   1238             break;
   1239         }
   1240     }
   1241     const auto& activation1 = metricProducer1->mEventActivationMap.at(i);
   1242     EXPECT_EQ(100 * NS_PER_SEC, activation1->ttl_ns);
   1243     EXPECT_EQ(0, activation1->start_ns);
   1244     EXPECT_EQ(kNotActive, activation1->state);
   1245     EXPECT_EQ(ACTIVATE_ON_BOOT, activation1->activationType);
   1246 
   1247     i = 0;
   1248     for (; i < metricsManager1->mAllAtomMatchers.size(); i++) {
   1249         if (metricsManager1->mAllAtomMatchers[i]->getId() ==
   1250                 metric1ActivationTrigger2->atom_matcher_id()) {
   1251             break;
   1252         }
   1253     }
   1254     const auto& activation2 = metricProducer1->mEventActivationMap.at(i);
   1255     EXPECT_EQ(200 * NS_PER_SEC, activation2->ttl_ns);
   1256     EXPECT_EQ(0, activation2->start_ns);
   1257     EXPECT_EQ(kNotActive, activation2->state);
   1258     EXPECT_EQ(ACTIVATE_IMMEDIATELY, activation2->activationType);
   1259     // }}}------------------------------------------------------------------------------
   1260 
   1261     // Trigger Activation 1 for Metric 1
   1262     std::vector<AttributionNodeInternal> attributions1 = {CreateAttribution(111, "App1")};
   1263     auto event = CreateAcquireWakelockEvent(attributions1, "wl1", 100 + timeBase1);
   1264     processor->OnLogEvent(event.get());
   1265 
   1266     // Metric 1 is not active; Activation 1 set to kActiveOnBoot
   1267     // Metric 2 is active.
   1268     // {{{---------------------------------------------------------------------------
   1269     EXPECT_FALSE(metricProducer1->isActive());
   1270     EXPECT_EQ(0, activation1->start_ns);
   1271     EXPECT_EQ(kActiveOnBoot, activation1->state);
   1272     EXPECT_EQ(0, activation2->start_ns);
   1273     EXPECT_EQ(kNotActive, activation2->state);
   1274 
   1275     EXPECT_TRUE(metricProducer2->isActive());
   1276     // }}}-----------------------------------------------------------------------------
   1277 
   1278     // Simulate shutdown by saving state to disk
   1279     int64_t shutDownTime = timeBase1 + 100 * NS_PER_SEC;
   1280     processor->SaveActiveConfigsToDisk(shutDownTime);
   1281     EXPECT_FALSE(metricProducer1->isActive());
   1282     int64_t ttl1 = metric1ActivationTrigger1->ttl_seconds() * NS_PER_SEC;
   1283 
   1284     // Simulate device restarted state by creating new instance of StatsLogProcessor with the
   1285     // same config.
   1286     long timeBase2 = 1000;
   1287     sp<StatsLogProcessor> processor2 =
   1288             CreateStatsLogProcessor(timeBase2, timeBase2, config1, cfgKey1);
   1289 
   1290     // Metric 1 is not active.
   1291     // Metric 2 is active.
   1292     // {{{---------------------------------------------------------------------------
   1293     EXPECT_EQ(1, processor2->mMetricsManagers.size());
   1294     it = processor2->mMetricsManagers.find(cfgKey1);
   1295     EXPECT_TRUE(it != processor2->mMetricsManagers.end());
   1296     auto& metricsManager1001 = it->second;
   1297     EXPECT_TRUE(metricsManager1001->isActive());
   1298 
   1299     metricIt = metricsManager1001->mAllMetricProducers.begin();
   1300     for (; metricIt != metricsManager1001->mAllMetricProducers.end(); metricIt++) {
   1301         if ((*metricIt)->getMetricId() == metricId1) {
   1302             break;
   1303         }
   1304     }
   1305     EXPECT_TRUE(metricIt != metricsManager1001->mAllMetricProducers.end());
   1306     auto& metricProducer1001 = *metricIt;
   1307     EXPECT_FALSE(metricProducer1001->isActive());
   1308 
   1309     metricIt = metricsManager1001->mAllMetricProducers.begin();
   1310     for (; metricIt != metricsManager1001->mAllMetricProducers.end(); metricIt++) {
   1311         if ((*metricIt)->getMetricId() == metricId2) {
   1312             break;
   1313         }
   1314     }
   1315     EXPECT_TRUE(metricIt != metricsManager1001->mAllMetricProducers.end());
   1316     auto& metricProducer1002 = *metricIt;
   1317     EXPECT_TRUE(metricProducer1002->isActive());
   1318 
   1319     i = 0;
   1320     for (; i < metricsManager1001->mAllAtomMatchers.size(); i++) {
   1321         if (metricsManager1001->mAllAtomMatchers[i]->getId() ==
   1322                 metric1ActivationTrigger1->atom_matcher_id()) {
   1323             break;
   1324         }
   1325     }
   1326     const auto& activation1001_1 = metricProducer1001->mEventActivationMap.at(i);
   1327     EXPECT_EQ(100 * NS_PER_SEC, activation1001_1->ttl_ns);
   1328     EXPECT_EQ(0, activation1001_1->start_ns);
   1329     EXPECT_EQ(kNotActive, activation1001_1->state);
   1330     EXPECT_EQ(ACTIVATE_ON_BOOT, activation1001_1->activationType);
   1331 
   1332     i = 0;
   1333     for (; i < metricsManager1001->mAllAtomMatchers.size(); i++) {
   1334         if (metricsManager1001->mAllAtomMatchers[i]->getId() ==
   1335                 metric1ActivationTrigger2->atom_matcher_id()) {
   1336             break;
   1337         }
   1338     }
   1339 
   1340     const auto& activation1001_2 = metricProducer1001->mEventActivationMap.at(i);
   1341     EXPECT_EQ(200 * NS_PER_SEC, activation1001_2->ttl_ns);
   1342     EXPECT_EQ(0, activation1001_2->start_ns);
   1343     EXPECT_EQ(kNotActive, activation1001_2->state);
   1344     EXPECT_EQ(ACTIVATE_IMMEDIATELY, activation1001_2->activationType);
   1345     // }}}-----------------------------------------------------------------------------------
   1346 
   1347     // Load saved state from disk.
   1348     processor2->LoadActiveConfigsFromDisk();
   1349 
   1350     // Metric 1 active; Activation 1 is active, Activation 2 is not active
   1351     // Metric 2 is active.
   1352     // {{{---------------------------------------------------------------------------
   1353     EXPECT_TRUE(metricProducer1001->isActive());
   1354     EXPECT_EQ(timeBase2 + ttl1 - activation1001_1->ttl_ns, activation1001_1->start_ns);
   1355     EXPECT_EQ(kActive, activation1001_1->state);
   1356     EXPECT_EQ(0, activation1001_2->start_ns);
   1357     EXPECT_EQ(kNotActive, activation1001_2->state);
   1358 
   1359     EXPECT_TRUE(metricProducer1002->isActive());
   1360     // }}}--------------------------------------------------------------------------------
   1361 
   1362     // Trigger Activation 2 for Metric 1.
   1363     auto screenOnEvent = CreateScreenStateChangedEvent(
   1364             android::view::DISPLAY_STATE_ON,
   1365             timeBase2 + 200
   1366     );
   1367     processor2->OnLogEvent(screenOnEvent.get());
   1368 
   1369     // Metric 1 active; Activation 1 is active, Activation 2 is active
   1370     // Metric 2 is active.
   1371     // {{{---------------------------------------------------------------------------
   1372     EXPECT_TRUE(metricProducer1001->isActive());
   1373     EXPECT_EQ(timeBase2 + ttl1 - activation1001_1->ttl_ns, activation1001_1->start_ns);
   1374     EXPECT_EQ(kActive, activation1001_1->state);
   1375     EXPECT_EQ(screenOnEvent->GetElapsedTimestampNs(), activation1001_2->start_ns);
   1376     EXPECT_EQ(kActive, activation1001_2->state);
   1377 
   1378     EXPECT_TRUE(metricProducer1002->isActive());
   1379     // }}}---------------------------------------------------------------------------
   1380 
   1381     // Simulate shutdown by saving state to disk
   1382     shutDownTime = timeBase2 + 50 * NS_PER_SEC;
   1383     processor2->SaveActiveConfigsToDisk(shutDownTime);
   1384     EXPECT_TRUE(metricProducer1001->isActive());
   1385     EXPECT_TRUE(metricProducer1002->isActive());
   1386     ttl1 = timeBase2 + metric1ActivationTrigger1->ttl_seconds() * NS_PER_SEC - shutDownTime;
   1387     int64_t ttl2 = screenOnEvent->GetElapsedTimestampNs() +
   1388             metric1ActivationTrigger2->ttl_seconds() * NS_PER_SEC - shutDownTime;
   1389 
   1390     // Simulate device restarted state by creating new instance of StatsLogProcessor with the
   1391     // same config.
   1392     long timeBase3 = timeBase2 + 120 * NS_PER_SEC;
   1393     sp<StatsLogProcessor> processor3 =
   1394             CreateStatsLogProcessor(timeBase3, timeBase3, config1, cfgKey1);
   1395 
   1396     // Metric 1 is not active.
   1397     // Metric 2 is active.
   1398     // {{{---------------------------------------------------------------------------
   1399     EXPECT_EQ(1, processor3->mMetricsManagers.size());
   1400     it = processor3->mMetricsManagers.find(cfgKey1);
   1401     EXPECT_TRUE(it != processor3->mMetricsManagers.end());
   1402     auto& metricsManagerTimeBase3 = it->second;
   1403     EXPECT_TRUE(metricsManagerTimeBase3->isActive());
   1404 
   1405     metricIt = metricsManagerTimeBase3->mAllMetricProducers.begin();
   1406     for (; metricIt != metricsManagerTimeBase3->mAllMetricProducers.end(); metricIt++) {
   1407         if ((*metricIt)->getMetricId() == metricId1) {
   1408             break;
   1409         }
   1410     }
   1411     EXPECT_TRUE(metricIt != metricsManagerTimeBase3->mAllMetricProducers.end());
   1412     auto& metricProducerTimeBase3_1 = *metricIt;
   1413     EXPECT_FALSE(metricProducerTimeBase3_1->isActive());
   1414 
   1415     metricIt = metricsManagerTimeBase3->mAllMetricProducers.begin();
   1416     for (; metricIt != metricsManagerTimeBase3->mAllMetricProducers.end(); metricIt++) {
   1417         if ((*metricIt)->getMetricId() == metricId2) {
   1418             break;
   1419         }
   1420     }
   1421     EXPECT_TRUE(metricIt != metricsManagerTimeBase3->mAllMetricProducers.end());
   1422     auto& metricProducerTimeBase3_2 = *metricIt;
   1423     EXPECT_TRUE(metricProducerTimeBase3_2->isActive());
   1424 
   1425     i = 0;
   1426     for (; i < metricsManagerTimeBase3->mAllAtomMatchers.size(); i++) {
   1427         if (metricsManagerTimeBase3->mAllAtomMatchers[i]->getId() ==
   1428                 metric1ActivationTrigger1->atom_matcher_id()) {
   1429             break;
   1430         }
   1431     }
   1432     const auto& activationTimeBase3_1 = metricProducerTimeBase3_1->mEventActivationMap.at(i);
   1433     EXPECT_EQ(100 * NS_PER_SEC, activationTimeBase3_1->ttl_ns);
   1434     EXPECT_EQ(0, activationTimeBase3_1->start_ns);
   1435     EXPECT_EQ(kNotActive, activationTimeBase3_1->state);
   1436     EXPECT_EQ(ACTIVATE_ON_BOOT, activationTimeBase3_1->activationType);
   1437 
   1438     i = 0;
   1439     for (; i < metricsManagerTimeBase3->mAllAtomMatchers.size(); i++) {
   1440         if (metricsManagerTimeBase3->mAllAtomMatchers[i]->getId() ==
   1441                 metric1ActivationTrigger2->atom_matcher_id()) {
   1442             break;
   1443         }
   1444     }
   1445 
   1446     const auto& activationTimeBase3_2 = metricProducerTimeBase3_1->mEventActivationMap.at(i);
   1447     EXPECT_EQ(200 * NS_PER_SEC, activationTimeBase3_2->ttl_ns);
   1448     EXPECT_EQ(0, activationTimeBase3_2->start_ns);
   1449     EXPECT_EQ(kNotActive, activationTimeBase3_2->state);
   1450     EXPECT_EQ(ACTIVATE_IMMEDIATELY, activationTimeBase3_2->activationType);
   1451     // }}}----------------------------------------------------------------------------------
   1452 
   1453     // Load saved state from disk.
   1454     processor3->LoadActiveConfigsFromDisk();
   1455 
   1456     // Metric 1 active: Activation 1 is active, Activation 2 is active
   1457     // Metric 2 is active.
   1458     // {{{---------------------------------------------------------------------------
   1459     EXPECT_TRUE(metricProducerTimeBase3_1->isActive());
   1460     EXPECT_EQ(timeBase3 + ttl1 - activationTimeBase3_1->ttl_ns, activationTimeBase3_1->start_ns);
   1461     EXPECT_EQ(kActive, activationTimeBase3_1->state);
   1462     EXPECT_EQ(timeBase3 + ttl2 - activationTimeBase3_2->ttl_ns, activationTimeBase3_2->start_ns);
   1463     EXPECT_EQ(kActive, activationTimeBase3_2->state);
   1464 
   1465     EXPECT_TRUE(metricProducerTimeBase3_2->isActive());
   1466     // }}}-------------------------------------------------------------------------------
   1467 
   1468 
   1469     // Trigger Activation 2 for Metric 1 again.
   1470     screenOnEvent = CreateScreenStateChangedEvent(
   1471             android::view::DISPLAY_STATE_ON,
   1472             timeBase3 + 100 * NS_PER_SEC
   1473     );
   1474     processor3->OnLogEvent(screenOnEvent.get());
   1475 
   1476     // Metric 1 active; Activation 1 is not active, Activation 2 is set to active
   1477     // Metric 2 is active.
   1478     // {{{---------------------------------------------------------------------------
   1479     EXPECT_TRUE(metricProducerTimeBase3_1->isActive());
   1480     EXPECT_EQ(kNotActive, activationTimeBase3_1->state);
   1481     EXPECT_EQ(screenOnEvent->GetElapsedTimestampNs(), activationTimeBase3_2->start_ns);
   1482     EXPECT_EQ(kActive, activationTimeBase3_2->state);
   1483 
   1484     EXPECT_TRUE(metricProducerTimeBase3_2->isActive());
   1485     // }}}---------------------------------------------------------------------------
   1486 }
   1487 
   1488 TEST(StatsLogProcessorTest, TestActivationsPersistAcrossSystemServerRestart) {
   1489     int uid = 9876;
   1490     long configId = 12341;
   1491 
   1492     // Create config with 3 metrics:
   1493     // Metric 1: Activate on 2 activations, 1 on boot, 1 immediate.
   1494     // Metric 2: Activate on 2 activations, 1 on boot, 1 immediate.
   1495     // Metric 3: Always active
   1496     StatsdConfig config1;
   1497     config1.set_id(configId);
   1498     config1.add_allowed_log_source("AID_ROOT");  // LogEvent defaults to UID of root.
   1499     auto wakelockAcquireMatcher = CreateAcquireWakelockAtomMatcher();
   1500     auto screenOnMatcher = CreateScreenTurnedOnAtomMatcher();
   1501     auto jobStartMatcher = CreateStartScheduledJobAtomMatcher();
   1502     auto jobFinishMatcher = CreateFinishScheduledJobAtomMatcher();
   1503     *config1.add_atom_matcher() = wakelockAcquireMatcher;
   1504     *config1.add_atom_matcher() = screenOnMatcher;
   1505     *config1.add_atom_matcher() = jobStartMatcher;
   1506     *config1.add_atom_matcher() = jobFinishMatcher;
   1507 
   1508     long metricId1 = 1234561;
   1509     long metricId2 = 1234562;
   1510     long metricId3 = 1234563;
   1511 
   1512     auto countMetric1 = config1.add_count_metric();
   1513     countMetric1->set_id(metricId1);
   1514     countMetric1->set_what(wakelockAcquireMatcher.id());
   1515     countMetric1->set_bucket(FIVE_MINUTES);
   1516 
   1517     auto countMetric2 = config1.add_count_metric();
   1518     countMetric2->set_id(metricId2);
   1519     countMetric2->set_what(wakelockAcquireMatcher.id());
   1520     countMetric2->set_bucket(FIVE_MINUTES);
   1521 
   1522     auto countMetric3 = config1.add_count_metric();
   1523     countMetric3->set_id(metricId3);
   1524     countMetric3->set_what(wakelockAcquireMatcher.id());
   1525     countMetric3->set_bucket(FIVE_MINUTES);
   1526 
   1527     // Metric 1 activates on boot for wakelock acquire, immediately for screen on.
   1528     auto metric1Activation = config1.add_metric_activation();
   1529     metric1Activation->set_metric_id(metricId1);
   1530     auto metric1ActivationTrigger1 = metric1Activation->add_event_activation();
   1531     metric1ActivationTrigger1->set_atom_matcher_id(wakelockAcquireMatcher.id());
   1532     metric1ActivationTrigger1->set_ttl_seconds(100);
   1533     metric1ActivationTrigger1->set_activation_type(ACTIVATE_ON_BOOT);
   1534     auto metric1ActivationTrigger2 = metric1Activation->add_event_activation();
   1535     metric1ActivationTrigger2->set_atom_matcher_id(screenOnMatcher.id());
   1536     metric1ActivationTrigger2->set_ttl_seconds(200);
   1537     metric1ActivationTrigger2->set_activation_type(ACTIVATE_IMMEDIATELY);
   1538 
   1539     // Metric 2 activates on boot for scheduled job start, immediately for scheduled job finish.
   1540     auto metric2Activation = config1.add_metric_activation();
   1541     metric2Activation->set_metric_id(metricId2);
   1542     auto metric2ActivationTrigger1 = metric2Activation->add_event_activation();
   1543     metric2ActivationTrigger1->set_atom_matcher_id(jobStartMatcher.id());
   1544     metric2ActivationTrigger1->set_ttl_seconds(100);
   1545     metric2ActivationTrigger1->set_activation_type(ACTIVATE_ON_BOOT);
   1546     auto metric2ActivationTrigger2 = metric2Activation->add_event_activation();
   1547     metric2ActivationTrigger2->set_atom_matcher_id(jobFinishMatcher.id());
   1548     metric2ActivationTrigger2->set_ttl_seconds(200);
   1549     metric2ActivationTrigger2->set_activation_type(ACTIVATE_IMMEDIATELY);
   1550 
   1551     // Send the config.
   1552     StatsService service(nullptr, nullptr);
   1553     string serialized = config1.SerializeAsString();
   1554     service.addConfigurationChecked(uid, configId, {serialized.begin(), serialized.end()});
   1555 
   1556     // Make sure the config is stored on disk. Otherwise, we will not reset on system server death.
   1557     StatsdConfig tmpConfig;
   1558     ConfigKey cfgKey1(uid, configId);
   1559     EXPECT_TRUE(StorageManager::readConfigFromDisk(cfgKey1, &tmpConfig));
   1560 
   1561     // Metric 1 is not active.
   1562     // Metric 2 is not active.
   1563     // Metric 3 is active.
   1564     // {{{---------------------------------------------------------------------------
   1565     sp<StatsLogProcessor> processor = service.mProcessor;
   1566     EXPECT_EQ(1, processor->mMetricsManagers.size());
   1567     auto it = processor->mMetricsManagers.find(cfgKey1);
   1568     EXPECT_TRUE(it != processor->mMetricsManagers.end());
   1569     auto& metricsManager1 = it->second;
   1570     EXPECT_TRUE(metricsManager1->isActive());
   1571     EXPECT_EQ(3, metricsManager1->mAllMetricProducers.size());
   1572 
   1573     auto& metricProducer1 = metricsManager1->mAllMetricProducers[0];
   1574     EXPECT_EQ(metricId1, metricProducer1->getMetricId());
   1575     EXPECT_FALSE(metricProducer1->isActive());
   1576 
   1577     auto& metricProducer2 = metricsManager1->mAllMetricProducers[1];
   1578     EXPECT_EQ(metricId2, metricProducer2->getMetricId());
   1579     EXPECT_FALSE(metricProducer2->isActive());
   1580 
   1581     auto& metricProducer3 = metricsManager1->mAllMetricProducers[2];
   1582     EXPECT_EQ(metricId3, metricProducer3->getMetricId());
   1583     EXPECT_TRUE(metricProducer3->isActive());
   1584 
   1585     // Check event activations.
   1586     EXPECT_EQ(metricsManager1->mAllAtomMatchers.size(), 4);
   1587     EXPECT_EQ(metricsManager1->mAllAtomMatchers[0]->getId(),
   1588               metric1ActivationTrigger1->atom_matcher_id());
   1589     const auto& activation1 = metricProducer1->mEventActivationMap.at(0);
   1590     EXPECT_EQ(100 * NS_PER_SEC, activation1->ttl_ns);
   1591     EXPECT_EQ(0, activation1->start_ns);
   1592     EXPECT_EQ(kNotActive, activation1->state);
   1593     EXPECT_EQ(ACTIVATE_ON_BOOT, activation1->activationType);
   1594 
   1595     EXPECT_EQ(metricsManager1->mAllAtomMatchers[1]->getId(),
   1596               metric1ActivationTrigger2->atom_matcher_id());
   1597     const auto& activation2 = metricProducer1->mEventActivationMap.at(1);
   1598     EXPECT_EQ(200 * NS_PER_SEC, activation2->ttl_ns);
   1599     EXPECT_EQ(0, activation2->start_ns);
   1600     EXPECT_EQ(kNotActive, activation2->state);
   1601     EXPECT_EQ(ACTIVATE_IMMEDIATELY, activation2->activationType);
   1602 
   1603     EXPECT_EQ(metricsManager1->mAllAtomMatchers[2]->getId(),
   1604               metric2ActivationTrigger1->atom_matcher_id());
   1605     const auto& activation3 = metricProducer2->mEventActivationMap.at(2);
   1606     EXPECT_EQ(100 * NS_PER_SEC, activation3->ttl_ns);
   1607     EXPECT_EQ(0, activation3->start_ns);
   1608     EXPECT_EQ(kNotActive, activation3->state);
   1609     EXPECT_EQ(ACTIVATE_ON_BOOT, activation3->activationType);
   1610 
   1611     EXPECT_EQ(metricsManager1->mAllAtomMatchers[3]->getId(),
   1612               metric2ActivationTrigger2->atom_matcher_id());
   1613     const auto& activation4 = metricProducer2->mEventActivationMap.at(3);
   1614     EXPECT_EQ(200 * NS_PER_SEC, activation4->ttl_ns);
   1615     EXPECT_EQ(0, activation4->start_ns);
   1616     EXPECT_EQ(kNotActive, activation4->state);
   1617     EXPECT_EQ(ACTIVATE_IMMEDIATELY, activation4->activationType);
   1618     // }}}------------------------------------------------------------------------------
   1619 
   1620     // Trigger Activation 1 for Metric 1. Should activate on boot.
   1621     // Trigger Activation 4 for Metric 2. Should activate immediately.
   1622     long configAddedTimeNs = metricsManager1->mLastReportTimeNs;
   1623     std::vector<AttributionNodeInternal> attributions1 = {CreateAttribution(111, "App1")};
   1624     auto event = CreateAcquireWakelockEvent(attributions1, "wl1", 1 + configAddedTimeNs);
   1625     processor->OnLogEvent(event.get());
   1626 
   1627     event = CreateFinishScheduledJobEvent(attributions1, "finish1", 2 + configAddedTimeNs);
   1628     processor->OnLogEvent(event.get());
   1629 
   1630     // Metric 1 is not active; Activation 1 set to kActiveOnBoot
   1631     // Metric 2 is active. Activation 4 set to kActive
   1632     // Metric 3 is active.
   1633     // {{{---------------------------------------------------------------------------
   1634     EXPECT_FALSE(metricProducer1->isActive());
   1635     EXPECT_EQ(0, activation1->start_ns);
   1636     EXPECT_EQ(kActiveOnBoot, activation1->state);
   1637     EXPECT_EQ(0, activation2->start_ns);
   1638     EXPECT_EQ(kNotActive, activation2->state);
   1639 
   1640     EXPECT_TRUE(metricProducer2->isActive());
   1641     EXPECT_EQ(0, activation3->start_ns);
   1642     EXPECT_EQ(kNotActive, activation3->state);
   1643     EXPECT_EQ(2 + configAddedTimeNs, activation4->start_ns);
   1644     EXPECT_EQ(kActive, activation4->state);
   1645 
   1646     EXPECT_TRUE(metricProducer3->isActive());
   1647     // }}}-----------------------------------------------------------------------------
   1648 
   1649     // Can't fake time with StatsService.
   1650     // Lets get a time close to the system server death time and make sure it's sane.
   1651     int64_t approximateSystemServerDeath = getElapsedRealtimeNs();
   1652     EXPECT_TRUE(approximateSystemServerDeath > 2 + configAddedTimeNs);
   1653     EXPECT_TRUE(approximateSystemServerDeath < NS_PER_SEC + configAddedTimeNs);
   1654 
   1655     // System server dies.
   1656     service.binderDied(nullptr);
   1657 
   1658     // We should have a new metrics manager. Lets get it and ensure activation status is restored.
   1659     // {{{---------------------------------------------------------------------------
   1660     EXPECT_EQ(1, processor->mMetricsManagers.size());
   1661     it = processor->mMetricsManagers.find(cfgKey1);
   1662     EXPECT_TRUE(it != processor->mMetricsManagers.end());
   1663     auto& metricsManager2 = it->second;
   1664     EXPECT_TRUE(metricsManager2->isActive());
   1665     EXPECT_EQ(3, metricsManager2->mAllMetricProducers.size());
   1666 
   1667     auto& metricProducer1001 = metricsManager2->mAllMetricProducers[0];
   1668     EXPECT_EQ(metricId1, metricProducer1001->getMetricId());
   1669     EXPECT_FALSE(metricProducer1001->isActive());
   1670 
   1671     auto& metricProducer1002 = metricsManager2->mAllMetricProducers[1];
   1672     EXPECT_EQ(metricId2, metricProducer1002->getMetricId());
   1673     EXPECT_TRUE(metricProducer1002->isActive());
   1674 
   1675     auto& metricProducer1003 = metricsManager2->mAllMetricProducers[2];
   1676     EXPECT_EQ(metricId3, metricProducer1003->getMetricId());
   1677     EXPECT_TRUE(metricProducer1003->isActive());
   1678 
   1679     // Check event activations.
   1680     // Activation 1 is kActiveOnBoot.
   1681     // Activation 2 and 3 are not active.
   1682     // Activation 4 is active.
   1683     EXPECT_EQ(metricsManager2->mAllAtomMatchers.size(), 4);
   1684     EXPECT_EQ(metricsManager2->mAllAtomMatchers[0]->getId(),
   1685               metric1ActivationTrigger1->atom_matcher_id());
   1686     const auto& activation1001 = metricProducer1001->mEventActivationMap.at(0);
   1687     EXPECT_EQ(100 * NS_PER_SEC, activation1001->ttl_ns);
   1688     EXPECT_EQ(0, activation1001->start_ns);
   1689     EXPECT_EQ(kActiveOnBoot, activation1001->state);
   1690     EXPECT_EQ(ACTIVATE_ON_BOOT, activation1001->activationType);
   1691 
   1692     EXPECT_EQ(metricsManager2->mAllAtomMatchers[1]->getId(),
   1693               metric1ActivationTrigger2->atom_matcher_id());
   1694     const auto& activation1002 = metricProducer1001->mEventActivationMap.at(1);
   1695     EXPECT_EQ(200 * NS_PER_SEC, activation1002->ttl_ns);
   1696     EXPECT_EQ(0, activation1002->start_ns);
   1697     EXPECT_EQ(kNotActive, activation1002->state);
   1698     EXPECT_EQ(ACTIVATE_IMMEDIATELY, activation1002->activationType);
   1699 
   1700     EXPECT_EQ(metricsManager2->mAllAtomMatchers[2]->getId(),
   1701               metric2ActivationTrigger1->atom_matcher_id());
   1702     const auto& activation1003 = metricProducer1002->mEventActivationMap.at(2);
   1703     EXPECT_EQ(100 * NS_PER_SEC, activation1003->ttl_ns);
   1704     EXPECT_EQ(0, activation1003->start_ns);
   1705     EXPECT_EQ(kNotActive, activation1003->state);
   1706     EXPECT_EQ(ACTIVATE_ON_BOOT, activation1003->activationType);
   1707 
   1708     EXPECT_EQ(metricsManager2->mAllAtomMatchers[3]->getId(),
   1709               metric2ActivationTrigger2->atom_matcher_id());
   1710     const auto& activation1004 = metricProducer1002->mEventActivationMap.at(3);
   1711     EXPECT_EQ(200 * NS_PER_SEC, activation1004->ttl_ns);
   1712     EXPECT_EQ(2 + configAddedTimeNs, activation1004->start_ns);
   1713     EXPECT_EQ(kActive, activation1004->state);
   1714     EXPECT_EQ(ACTIVATE_IMMEDIATELY, activation1004->activationType);
   1715     // }}}------------------------------------------------------------------------------
   1716 }
   1717 
   1718 #else
   1719 GTEST_LOG_(INFO) << "This test does nothing.\n";
   1720 #endif
   1721 
   1722 }  // namespace statsd
   1723 }  // namespace os
   1724 }  // namespace android
   1725