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