1b356151e63140085cb96fa16804ee18b3862a4fcYao Chen// Copyright (C) 2017 The Android Open Source Project
2b356151e63140085cb96fa16804ee18b3862a4fcYao Chen//
3b356151e63140085cb96fa16804ee18b3862a4fcYao Chen// Licensed under the Apache License, Version 2.0 (the "License");
4b356151e63140085cb96fa16804ee18b3862a4fcYao Chen// you may not use this file except in compliance with the License.
5b356151e63140085cb96fa16804ee18b3862a4fcYao Chen// You may obtain a copy of the License at
6b356151e63140085cb96fa16804ee18b3862a4fcYao Chen//
7b356151e63140085cb96fa16804ee18b3862a4fcYao Chen//      http://www.apache.org/licenses/LICENSE-2.0
8b356151e63140085cb96fa16804ee18b3862a4fcYao Chen//
9b356151e63140085cb96fa16804ee18b3862a4fcYao Chen// Unless required by applicable law or agreed to in writing, software
10b356151e63140085cb96fa16804ee18b3862a4fcYao Chen// distributed under the License is distributed on an "AS IS" BASIS,
11b356151e63140085cb96fa16804ee18b3862a4fcYao Chen// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12b356151e63140085cb96fa16804ee18b3862a4fcYao Chen// See the License for the specific language governing permissions and
13b356151e63140085cb96fa16804ee18b3862a4fcYao Chen// limitations under the License.
14b356151e63140085cb96fa16804ee18b3862a4fcYao Chen
15b356151e63140085cb96fa16804ee18b3862a4fcYao Chen#include "src/guardrail/StatsdStats.h"
1669f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen#include "statslog.h"
1794e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac#include "tests/statsd_test_util.h"
18b356151e63140085cb96fa16804ee18b3862a4fcYao Chen
19b356151e63140085cb96fa16804ee18b3862a4fcYao Chen#include <gtest/gtest.h>
2069f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen#include <vector>
21b356151e63140085cb96fa16804ee18b3862a4fcYao Chen
22b356151e63140085cb96fa16804ee18b3862a4fcYao Chen#ifdef __ANDROID__
23b356151e63140085cb96fa16804ee18b3862a4fcYao Chen
24b356151e63140085cb96fa16804ee18b3862a4fcYao Chennamespace android {
25b356151e63140085cb96fa16804ee18b3862a4fcYao Chennamespace os {
26b356151e63140085cb96fa16804ee18b3862a4fcYao Chennamespace statsd {
27b356151e63140085cb96fa16804ee18b3862a4fcYao Chen
2869f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chenusing std::vector;
2969f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen
3069f1baf7dd3d6e595abdae000adf0f197558d0eaYao ChenTEST(StatsdStatsTest, TestValidConfigAdd) {
3169f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    StatsdStats stats;
3294e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    ConfigKey key(0, 12345);
3369f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    const int metricsCount = 10;
3469f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    const int conditionsCount = 20;
3569f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    const int matchersCount = 30;
3669f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    const int alertsCount = 10;
37faa1af535bf6ede5fcab2e0bad5f6c16908916a9David Chen    stats.noteConfigReceived(key, metricsCount, conditionsCount, matchersCount, alertsCount, {},
3869f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen                             true /*valid config*/);
3969f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    vector<uint8_t> output;
4069f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    stats.dumpStats(&output, false /*reset stats*/);
4169f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen
4269f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    StatsdStatsReport report;
4369f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    bool good = report.ParseFromArray(&output[0], output.size());
4469f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    EXPECT_TRUE(good);
4569f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    EXPECT_EQ(1, report.config_stats_size());
4669f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    const auto& configReport = report.config_stats(0);
4769f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    EXPECT_EQ(0, configReport.uid());
4894e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    EXPECT_EQ(12345, configReport.id());
4969f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    EXPECT_EQ(metricsCount, configReport.metric_count());
5069f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    EXPECT_EQ(conditionsCount, configReport.condition_count());
5169f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    EXPECT_EQ(matchersCount, configReport.matcher_count());
5269f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    EXPECT_EQ(alertsCount, configReport.alert_count());
5369f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    EXPECT_EQ(true, configReport.is_valid());
5469f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    EXPECT_FALSE(configReport.has_deletion_time_sec());
55b356151e63140085cb96fa16804ee18b3862a4fcYao Chen}
56b356151e63140085cb96fa16804ee18b3862a4fcYao Chen
5769f1baf7dd3d6e595abdae000adf0f197558d0eaYao ChenTEST(StatsdStatsTest, TestInvalidConfigAdd) {
5869f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    StatsdStats stats;
5994e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    ConfigKey key(0, 12345);
6069f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    const int metricsCount = 10;
6169f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    const int conditionsCount = 20;
6269f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    const int matchersCount = 30;
6369f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    const int alertsCount = 10;
64faa1af535bf6ede5fcab2e0bad5f6c16908916a9David Chen    stats.noteConfigReceived(key, metricsCount, conditionsCount, matchersCount, alertsCount, {},
6569f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen                             false /*bad config*/);
6669f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    vector<uint8_t> output;
6769f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    stats.dumpStats(&output, false);
6869f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen
6969f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    StatsdStatsReport report;
7069f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    bool good = report.ParseFromArray(&output[0], output.size());
7169f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    EXPECT_TRUE(good);
7269f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    EXPECT_EQ(1, report.config_stats_size());
7369f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    const auto& configReport = report.config_stats(0);
7469f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    // The invalid config should be put into icebox with a deletion time.
7569f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    EXPECT_TRUE(configReport.has_deletion_time_sec());
76b356151e63140085cb96fa16804ee18b3862a4fcYao Chen}
77b356151e63140085cb96fa16804ee18b3862a4fcYao Chen
7869f1baf7dd3d6e595abdae000adf0f197558d0eaYao ChenTEST(StatsdStatsTest, TestConfigRemove) {
7969f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    StatsdStats stats;
8094e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    ConfigKey key(0, 12345);
8169f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    const int metricsCount = 10;
8269f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    const int conditionsCount = 20;
8369f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    const int matchersCount = 30;
8469f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    const int alertsCount = 10;
85faa1af535bf6ede5fcab2e0bad5f6c16908916a9David Chen    stats.noteConfigReceived(key, metricsCount, conditionsCount, matchersCount, alertsCount, {},
86faa1af535bf6ede5fcab2e0bad5f6c16908916a9David Chen                             true);
8769f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    vector<uint8_t> output;
8869f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    stats.dumpStats(&output, false);
8969f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    StatsdStatsReport report;
9069f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    bool good = report.ParseFromArray(&output[0], output.size());
9169f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    EXPECT_TRUE(good);
9269f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    EXPECT_EQ(1, report.config_stats_size());
9369f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    const auto& configReport = report.config_stats(0);
9469f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    EXPECT_FALSE(configReport.has_deletion_time_sec());
9569f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen
9669f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    stats.noteConfigRemoved(key);
9769f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    stats.dumpStats(&output, false);
9869f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    good = report.ParseFromArray(&output[0], output.size());
9969f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    EXPECT_TRUE(good);
10069f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    EXPECT_EQ(1, report.config_stats_size());
10169f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    const auto& configReport2 = report.config_stats(0);
10269f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    EXPECT_TRUE(configReport2.has_deletion_time_sec());
103b356151e63140085cb96fa16804ee18b3862a4fcYao Chen}
104b356151e63140085cb96fa16804ee18b3862a4fcYao Chen
10569f1baf7dd3d6e595abdae000adf0f197558d0eaYao ChenTEST(StatsdStatsTest, TestSubStats) {
10669f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    StatsdStats stats;
10794e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    ConfigKey key(0, 12345);
108faa1af535bf6ede5fcab2e0bad5f6c16908916a9David Chen    stats.noteConfigReceived(key, 2, 3, 4, 5, {std::make_pair(123, 456)}, true);
10969f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen
11094e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    stats.noteMatcherMatched(key, StringToId("matcher1"));
11194e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    stats.noteMatcherMatched(key, StringToId("matcher1"));
11294e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    stats.noteMatcherMatched(key, StringToId("matcher2"));
11369f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen
11494e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    stats.noteConditionDimensionSize(key, StringToId("condition1"), 250);
11594e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    stats.noteConditionDimensionSize(key, StringToId("condition1"), 240);
11669f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen
11794e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    stats.noteMetricDimensionSize(key, StringToId("metric1"), 201);
11894e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    stats.noteMetricDimensionSize(key, StringToId("metric1"), 202);
11969f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen
12094e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    stats.noteAnomalyDeclared(key, StringToId("alert1"));
12194e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    stats.noteAnomalyDeclared(key, StringToId("alert1"));
12294e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    stats.noteAnomalyDeclared(key, StringToId("alert2"));
1238f2f3d82053693b0dac828e848e2bb238e1db2d2Bookatz
12469f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    // broadcast-> 2
12569f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    stats.noteBroadcastSent(key);
12669f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    stats.noteBroadcastSent(key);
12769f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen
12869f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    // data drop -> 1
12969f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    stats.noteDataDropped(key);
13069f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen
13169f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    // dump report -> 3
132e68f3a5811209eeab71976bc583c6075d9a5979aYangster-mac    stats.noteMetricsReportSent(key, 0);
133e68f3a5811209eeab71976bc583c6075d9a5979aYangster-mac    stats.noteMetricsReportSent(key, 0);
134e68f3a5811209eeab71976bc583c6075d9a5979aYangster-mac    stats.noteMetricsReportSent(key, 0);
13569f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen
13669f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    vector<uint8_t> output;
13769f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    stats.dumpStats(&output, true);  // Dump and reset stats
13869f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    StatsdStatsReport report;
13969f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    bool good = report.ParseFromArray(&output[0], output.size());
14069f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    EXPECT_TRUE(good);
14169f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    EXPECT_EQ(1, report.config_stats_size());
14269f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    const auto& configReport = report.config_stats(0);
14369f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    EXPECT_EQ(2, configReport.broadcast_sent_time_sec_size());
14469f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    EXPECT_EQ(1, configReport.data_drop_time_sec_size());
14569f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    EXPECT_EQ(3, configReport.dump_report_time_sec_size());
146e68f3a5811209eeab71976bc583c6075d9a5979aYangster-mac    EXPECT_EQ(3, configReport.dump_report_data_size_size());
147faa1af535bf6ede5fcab2e0bad5f6c16908916a9David Chen    EXPECT_EQ(1, configReport.annotation_size());
148faa1af535bf6ede5fcab2e0bad5f6c16908916a9David Chen    EXPECT_EQ(123, configReport.annotation(0).field_int64());
149faa1af535bf6ede5fcab2e0bad5f6c16908916a9David Chen    EXPECT_EQ(456, configReport.annotation(0).field_int32());
15069f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen
15169f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    EXPECT_EQ(2, configReport.matcher_stats_size());
15269f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    // matcher1 is the first in the list
15394e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    if (configReport.matcher_stats(0).id() == StringToId("matcher1")) {
15469f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen        EXPECT_EQ(2, configReport.matcher_stats(0).matched_times());
15569f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen        EXPECT_EQ(1, configReport.matcher_stats(1).matched_times());
15694e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac        EXPECT_EQ(StringToId("matcher2"), configReport.matcher_stats(1).id());
15769f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    } else {
15869f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen        // matcher1 is the second in the list.
15969f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen        EXPECT_EQ(1, configReport.matcher_stats(0).matched_times());
16094e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac        EXPECT_EQ(StringToId("matcher2"), configReport.matcher_stats(0).id());
16169f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen
16269f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen        EXPECT_EQ(2, configReport.matcher_stats(1).matched_times());
16394e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac        EXPECT_EQ(StringToId("matcher1"), configReport.matcher_stats(1).id());
16469f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    }
16569f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen
1668f2f3d82053693b0dac828e848e2bb238e1db2d2Bookatz    EXPECT_EQ(2, configReport.alert_stats_size());
16794e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    bool alert1first = configReport.alert_stats(0).id() == StringToId("alert1");
16894e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    EXPECT_EQ(StringToId("alert1"), configReport.alert_stats(alert1first ? 0 : 1).id());
169e1d143a0589f22876f17fcb2f892fd9a39a3ebd9Bookatz    EXPECT_EQ(2, configReport.alert_stats(alert1first ? 0 : 1).alerted_times());
17094e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    EXPECT_EQ(StringToId("alert2"), configReport.alert_stats(alert1first ? 1 : 0).id());
171e1d143a0589f22876f17fcb2f892fd9a39a3ebd9Bookatz    EXPECT_EQ(1, configReport.alert_stats(alert1first ? 1 : 0).alerted_times());
1728f2f3d82053693b0dac828e848e2bb238e1db2d2Bookatz
17369f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    EXPECT_EQ(1, configReport.condition_stats_size());
17494e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    EXPECT_EQ(StringToId("condition1"), configReport.condition_stats(0).id());
17569f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    EXPECT_EQ(250, configReport.condition_stats(0).max_tuple_counts());
17669f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen
17769f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    EXPECT_EQ(1, configReport.metric_stats_size());
17894e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    EXPECT_EQ(StringToId("metric1"), configReport.metric_stats(0).id());
17969f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    EXPECT_EQ(202, configReport.metric_stats(0).max_tuple_counts());
18069f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen
18169f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    // after resetting the stats, some new events come
18294e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    stats.noteMatcherMatched(key, StringToId("matcher99"));
18394e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    stats.noteConditionDimensionSize(key, StringToId("condition99"), 300);
18494e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    stats.noteMetricDimensionSize(key, StringToId("metric99tion99"), 270);
18594e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    stats.noteAnomalyDeclared(key, StringToId("alert99"));
18669f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen
18769f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    // now the config stats should only contain the stats about the new event.
18869f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    stats.dumpStats(&output, false);
18969f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    good = report.ParseFromArray(&output[0], output.size());
19069f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    EXPECT_TRUE(good);
19169f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    EXPECT_EQ(1, report.config_stats_size());
19269f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    const auto& configReport2 = report.config_stats(0);
19369f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    EXPECT_EQ(1, configReport2.matcher_stats_size());
19494e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    EXPECT_EQ(StringToId("matcher99"), configReport2.matcher_stats(0).id());
19569f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    EXPECT_EQ(1, configReport2.matcher_stats(0).matched_times());
19669f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen
19769f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    EXPECT_EQ(1, configReport2.condition_stats_size());
19894e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    EXPECT_EQ(StringToId("condition99"), configReport2.condition_stats(0).id());
19969f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    EXPECT_EQ(300, configReport2.condition_stats(0).max_tuple_counts());
20069f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen
20169f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    EXPECT_EQ(1, configReport2.metric_stats_size());
20294e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    EXPECT_EQ(StringToId("metric99tion99"), configReport2.metric_stats(0).id());
20369f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    EXPECT_EQ(270, configReport2.metric_stats(0).max_tuple_counts());
2048f2f3d82053693b0dac828e848e2bb238e1db2d2Bookatz
2058f2f3d82053693b0dac828e848e2bb238e1db2d2Bookatz    EXPECT_EQ(1, configReport2.alert_stats_size());
20694e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    EXPECT_EQ(StringToId("alert99"), configReport2.alert_stats(0).id());
207e1d143a0589f22876f17fcb2f892fd9a39a3ebd9Bookatz    EXPECT_EQ(1, configReport2.alert_stats(0).alerted_times());
208b356151e63140085cb96fa16804ee18b3862a4fcYao Chen}
209b356151e63140085cb96fa16804ee18b3862a4fcYao Chen
210b356151e63140085cb96fa16804ee18b3862a4fcYao ChenTEST(StatsdStatsTest, TestAtomLog) {
21169f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    StatsdStats stats;
21269f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    time_t now = time(nullptr);
21369f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    // old event, we get it from the stats buffer. should be ignored.
21469f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    stats.noteAtomLogged(android::util::SENSOR_STATE_CHANGED, 1000);
21569f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen
21669f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    stats.noteAtomLogged(android::util::SENSOR_STATE_CHANGED, now + 1);
21769f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    stats.noteAtomLogged(android::util::SENSOR_STATE_CHANGED, now + 2);
2185caaa9d8542585e537ac762c35879eb42dd6bbb4Chenjie Yu    stats.noteAtomLogged(android::util::APP_CRASH_OCCURRED, now + 3);
21969f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    // pulled event, should ignore
22031d14d72dc4f66b96fc486fef81b9df3c5ef3194Chenjie Yu    stats.noteAtomLogged(android::util::WIFI_BYTES_TRANSFER, now + 4);
22169f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen
22269f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    vector<uint8_t> output;
22369f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    stats.dumpStats(&output, false);
22469f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    StatsdStatsReport report;
22569f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    bool good = report.ParseFromArray(&output[0], output.size());
22669f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    EXPECT_TRUE(good);
22769f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen
22869f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    EXPECT_EQ(2, report.atom_stats_size());
22969f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    bool sensorAtomGood = false;
23069f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    bool dropboxAtomGood = false;
23169f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen
23269f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    for (const auto& atomStats : report.atom_stats()) {
233330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac        if (atomStats.tag() == android::util::SENSOR_STATE_CHANGED && atomStats.count() == 3) {
23469f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen            sensorAtomGood = true;
23569f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen        }
2365caaa9d8542585e537ac762c35879eb42dd6bbb4Chenjie Yu        if (atomStats.tag() == android::util::APP_CRASH_OCCURRED && atomStats.count() == 1) {
23769f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen            dropboxAtomGood = true;
23869f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen        }
23969f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    }
24069f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen
24169f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    EXPECT_TRUE(dropboxAtomGood);
24269f1baf7dd3d6e595abdae000adf0f197558d0eaYao Chen    EXPECT_TRUE(sensorAtomGood);
243b356151e63140085cb96fa16804ee18b3862a4fcYao Chen}
244b356151e63140085cb96fa16804ee18b3862a4fcYao Chen
2451d0136d322899cd9db4416c22873ee7ed01d843aBookatz
2461d0136d322899cd9db4416c22873ee7ed01d843aBookatzTEST(StatsdStatsTest, TestAnomalyMonitor) {
2471d0136d322899cd9db4416c22873ee7ed01d843aBookatz    StatsdStats stats;
2481d0136d322899cd9db4416c22873ee7ed01d843aBookatz    stats.noteRegisteredAnomalyAlarmChanged();
2491d0136d322899cd9db4416c22873ee7ed01d843aBookatz    stats.noteRegisteredAnomalyAlarmChanged();
2501d0136d322899cd9db4416c22873ee7ed01d843aBookatz
2511d0136d322899cd9db4416c22873ee7ed01d843aBookatz    vector<uint8_t> output;
2521d0136d322899cd9db4416c22873ee7ed01d843aBookatz    stats.dumpStats(&output, false);
2531d0136d322899cd9db4416c22873ee7ed01d843aBookatz    StatsdStatsReport report;
2541d0136d322899cd9db4416c22873ee7ed01d843aBookatz    bool good = report.ParseFromArray(&output[0], output.size());
2551d0136d322899cd9db4416c22873ee7ed01d843aBookatz    EXPECT_TRUE(good);
2561d0136d322899cd9db4416c22873ee7ed01d843aBookatz
2571d0136d322899cd9db4416c22873ee7ed01d843aBookatz    EXPECT_EQ(2, report.anomaly_alarm_stats().alarms_registered());
2581d0136d322899cd9db4416c22873ee7ed01d843aBookatz}
2591d0136d322899cd9db4416c22873ee7ed01d843aBookatz
2600fac5b17e6ec11461a35859740212daa13d2c5cdYao ChenTEST(StatsdStatsTest, TestTimestampThreshold) {
2610fac5b17e6ec11461a35859740212daa13d2c5cdYao Chen    StatsdStats stats;
2620fac5b17e6ec11461a35859740212daa13d2c5cdYao Chen    vector<int32_t> timestamps;
2630fac5b17e6ec11461a35859740212daa13d2c5cdYao Chen    for (int i = 0; i < StatsdStats::kMaxTimestampCount; i++) {
2640fac5b17e6ec11461a35859740212daa13d2c5cdYao Chen        timestamps.push_back(i);
2650fac5b17e6ec11461a35859740212daa13d2c5cdYao Chen    }
26694e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    ConfigKey key(0, 12345);
267faa1af535bf6ede5fcab2e0bad5f6c16908916a9David Chen    stats.noteConfigReceived(key, 2, 3, 4, 5, {}, true);
2680fac5b17e6ec11461a35859740212daa13d2c5cdYao Chen
2690fac5b17e6ec11461a35859740212daa13d2c5cdYao Chen    for (int i = 0; i < StatsdStats::kMaxTimestampCount; i++) {
2700fac5b17e6ec11461a35859740212daa13d2c5cdYao Chen        stats.noteDataDropped(key, timestamps[i]);
2710fac5b17e6ec11461a35859740212daa13d2c5cdYao Chen        stats.noteBroadcastSent(key, timestamps[i]);
272e68f3a5811209eeab71976bc583c6075d9a5979aYangster-mac        stats.noteMetricsReportSent(key, 0, timestamps[i]);
2730fac5b17e6ec11461a35859740212daa13d2c5cdYao Chen    }
2740fac5b17e6ec11461a35859740212daa13d2c5cdYao Chen
2750fac5b17e6ec11461a35859740212daa13d2c5cdYao Chen    int32_t newTimestamp = 10000;
2760fac5b17e6ec11461a35859740212daa13d2c5cdYao Chen
2770fac5b17e6ec11461a35859740212daa13d2c5cdYao Chen    // now it should trigger removing oldest timestamp
2780fac5b17e6ec11461a35859740212daa13d2c5cdYao Chen    stats.noteDataDropped(key, 10000);
2790fac5b17e6ec11461a35859740212daa13d2c5cdYao Chen    stats.noteBroadcastSent(key, 10000);
280e68f3a5811209eeab71976bc583c6075d9a5979aYangster-mac    stats.noteMetricsReportSent(key, 0, 10000);
2810fac5b17e6ec11461a35859740212daa13d2c5cdYao Chen
2820fac5b17e6ec11461a35859740212daa13d2c5cdYao Chen    EXPECT_TRUE(stats.mConfigStats.find(key) != stats.mConfigStats.end());
2830fac5b17e6ec11461a35859740212daa13d2c5cdYao Chen    const auto& configStats = stats.mConfigStats[key];
2840fac5b17e6ec11461a35859740212daa13d2c5cdYao Chen
28520e9e6231a1aba79b4e5ae47f3ccfb066920e60fYao Chen    size_t maxCount = StatsdStats::kMaxTimestampCount;
28620e9e6231a1aba79b4e5ae47f3ccfb066920e60fYao Chen    EXPECT_EQ(maxCount, configStats->broadcast_sent_time_sec.size());
28720e9e6231a1aba79b4e5ae47f3ccfb066920e60fYao Chen    EXPECT_EQ(maxCount, configStats->data_drop_time_sec.size());
288e68f3a5811209eeab71976bc583c6075d9a5979aYangster-mac    EXPECT_EQ(maxCount, configStats->dump_report_stats.size());
2890fac5b17e6ec11461a35859740212daa13d2c5cdYao Chen
2900fac5b17e6ec11461a35859740212daa13d2c5cdYao Chen    // the oldest timestamp is the second timestamp in history
29120e9e6231a1aba79b4e5ae47f3ccfb066920e60fYao Chen    EXPECT_EQ(1, configStats->broadcast_sent_time_sec.front());
29220e9e6231a1aba79b4e5ae47f3ccfb066920e60fYao Chen    EXPECT_EQ(1, configStats->broadcast_sent_time_sec.front());
29320e9e6231a1aba79b4e5ae47f3ccfb066920e60fYao Chen    EXPECT_EQ(1, configStats->broadcast_sent_time_sec.front());
2940fac5b17e6ec11461a35859740212daa13d2c5cdYao Chen
2950fac5b17e6ec11461a35859740212daa13d2c5cdYao Chen    // the last timestamp is the newest timestamp.
29620e9e6231a1aba79b4e5ae47f3ccfb066920e60fYao Chen    EXPECT_EQ(newTimestamp, configStats->broadcast_sent_time_sec.back());
29720e9e6231a1aba79b4e5ae47f3ccfb066920e60fYao Chen    EXPECT_EQ(newTimestamp, configStats->data_drop_time_sec.back());
298e68f3a5811209eeab71976bc583c6075d9a5979aYangster-mac    EXPECT_EQ(newTimestamp, configStats->dump_report_stats.back().first);
2990fac5b17e6ec11461a35859740212daa13d2c5cdYao Chen}
3000fac5b17e6ec11461a35859740212daa13d2c5cdYao Chen
301892f3d32293b8358c72da4a94633827abbda640bYangster-macTEST(StatsdStatsTest, TestSystemServerCrash) {
302892f3d32293b8358c72da4a94633827abbda640bYangster-mac    StatsdStats stats;
303892f3d32293b8358c72da4a94633827abbda640bYangster-mac    vector<int32_t> timestamps;
304892f3d32293b8358c72da4a94633827abbda640bYangster-mac    for (int i = 0; i < StatsdStats::kMaxSystemServerRestarts; i++) {
305892f3d32293b8358c72da4a94633827abbda640bYangster-mac        timestamps.push_back(i);
306892f3d32293b8358c72da4a94633827abbda640bYangster-mac        stats.noteSystemServerRestart(timestamps[i]);
307892f3d32293b8358c72da4a94633827abbda640bYangster-mac    }
308892f3d32293b8358c72da4a94633827abbda640bYangster-mac    vector<uint8_t> output;
309892f3d32293b8358c72da4a94633827abbda640bYangster-mac    stats.dumpStats(&output, false);
310892f3d32293b8358c72da4a94633827abbda640bYangster-mac    StatsdStatsReport report;
311892f3d32293b8358c72da4a94633827abbda640bYangster-mac    EXPECT_TRUE(report.ParseFromArray(&output[0], output.size()));
312892f3d32293b8358c72da4a94633827abbda640bYangster-mac    const int maxCount = StatsdStats::kMaxSystemServerRestarts;
313892f3d32293b8358c72da4a94633827abbda640bYangster-mac    EXPECT_EQ(maxCount, (int)report.system_restart_sec_size());
314892f3d32293b8358c72da4a94633827abbda640bYangster-mac
315892f3d32293b8358c72da4a94633827abbda640bYangster-mac    stats.noteSystemServerRestart(StatsdStats::kMaxSystemServerRestarts + 1);
316892f3d32293b8358c72da4a94633827abbda640bYangster-mac    output.clear();
317892f3d32293b8358c72da4a94633827abbda640bYangster-mac    stats.dumpStats(&output, false);
318892f3d32293b8358c72da4a94633827abbda640bYangster-mac    EXPECT_TRUE(report.ParseFromArray(&output[0], output.size()));
319892f3d32293b8358c72da4a94633827abbda640bYangster-mac    EXPECT_EQ(maxCount, (int)report.system_restart_sec_size());
320892f3d32293b8358c72da4a94633827abbda640bYangster-mac    EXPECT_EQ(StatsdStats::kMaxSystemServerRestarts + 1, report.system_restart_sec(maxCount - 1));
321892f3d32293b8358c72da4a94633827abbda640bYangster-mac}
322892f3d32293b8358c72da4a94633827abbda640bYangster-mac
323b356151e63140085cb96fa16804ee18b3862a4fcYao Chen}  // namespace statsd
324b356151e63140085cb96fa16804ee18b3862a4fcYao Chen}  // namespace os
325b356151e63140085cb96fa16804ee18b3862a4fcYao Chen}  // namespace android
326b356151e63140085cb96fa16804ee18b3862a4fcYao Chen#else
327b356151e63140085cb96fa16804ee18b3862a4fcYao ChenGTEST_LOG_(INFO) << "This test does nothing.\n";
328b356151e63140085cb96fa16804ee18b3862a4fcYao Chen#endif
329