115f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac// Copyright (C) 2017 The Android Open Source Project 215f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac// 315f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac// Licensed under the Apache License, Version 2.0 (the "License"); 415f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac// you may not use this file except in compliance with the License. 515f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac// You may obtain a copy of the License at 615f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac// 715f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac// http://www.apache.org/licenses/LICENSE-2.0 815f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac// 915f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac// Unless required by applicable law or agreed to in writing, software 1015f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac// distributed under the License is distributed on an "AS IS" BASIS, 1115f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1215f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac// See the License for the specific language governing permissions and 1315f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac// limitations under the License. 1415f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 1515f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac#include <gtest/gtest.h> 1615f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 1715f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac#include "src/StatsLogProcessor.h" 1815f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac#include "src/stats_log_util.h" 1915f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac#include "tests/statsd_test_util.h" 2015f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 2115f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac#include <vector> 2215f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 2315f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-macnamespace android { 2415f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-macnamespace os { 2515f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-macnamespace statsd { 2615f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 2715f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac#ifdef __ANDROID__ 2815f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 2915f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-macnamespace { 3015f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 3115f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-macStatsdConfig CreateStatsdConfig() { 3215f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac StatsdConfig config; 3315f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac config.add_allowed_log_source("AID_ROOT"); // LogEvent defaults to UID of root. 3415f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac auto temperatureAtomMatcher = CreateTemperatureAtomMatcher(); 3515f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac *config.add_atom_matcher() = temperatureAtomMatcher; 3615f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac *config.add_atom_matcher() = CreateScreenTurnedOnAtomMatcher(); 3715f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac *config.add_atom_matcher() = CreateScreenTurnedOffAtomMatcher(); 3815f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 3915f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac auto screenIsOffPredicate = CreateScreenIsOffPredicate(); 4015f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac *config.add_predicate() = screenIsOffPredicate; 4115f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 4215f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac auto valueMetric = config.add_value_metric(); 4315f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac valueMetric->set_id(123456); 4415f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac valueMetric->set_what(temperatureAtomMatcher.id()); 4515f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac valueMetric->set_condition(screenIsOffPredicate.id()); 4615f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac *valueMetric->mutable_value_field() = 4715f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac CreateDimensions(android::util::TEMPERATURE, {3/* temperature degree field */ }); 4815f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac *valueMetric->mutable_dimensions_in_what() = 4915f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac CreateDimensions(android::util::TEMPERATURE, {2/* sensor name field */ }); 5015f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac valueMetric->set_bucket(FIVE_MINUTES); 51021e25307d815452ceee7e189b36c7072b53c1dfChenjie Yu valueMetric->set_use_absolute_value_on_reset(true); 5215f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac return config; 5315f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac} 5415f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 5515f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac} // namespace 5615f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 5715f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-macTEST(ValueMetricE2eTest, TestPulledEvents) { 5815f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac auto config = CreateStatsdConfig(); 5915f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac int64_t baseTimeNs = 10 * NS_PER_SEC; 6015f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac int64_t configAddedTimeNs = 10 * 60 * NS_PER_SEC + baseTimeNs; 6115f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac int64_t bucketSizeNs = 6215f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac TimeUnitToBucketSizeInMillis(config.value_metric(0).bucket()) * 1000000; 6315f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 6415f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac ConfigKey cfgKey; 6515f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac auto processor = CreateStatsLogProcessor( 6615f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac baseTimeNs, configAddedTimeNs, config, cfgKey); 6715f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_EQ(processor->mMetricsManagers.size(), 1u); 6815f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_TRUE(processor->mMetricsManagers.begin()->second->isConfigValid()); 6958e609e33947fa912b50fc4fc0daed21facd28a0Yangster-mac processor->mStatsPullerManager.ForceClearPullerCache(); 7015f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 7115f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac int startBucketNum = processor->mMetricsManagers.begin()->second-> 7215f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac mAllMetricProducers[0]->getCurrentBucketNum(); 7315f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_GT(startBucketNum, (int64_t)0); 7415f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 7515f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac // When creating the config, the gauge metric producer should register the alarm at the 7615f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac // end of the current bucket. 7715f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_EQ((size_t)1, StatsPullerManagerImpl::GetInstance().mReceivers.size()); 7815f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_EQ(bucketSizeNs, 7915f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac StatsPullerManagerImpl::GetInstance().mReceivers.begin()-> 8015f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac second.front().intervalNs); 8115f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac int64_t& expectedPullTimeNs = StatsPullerManagerImpl::GetInstance().mReceivers.begin()-> 8215f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac second.front().nextPullTimeNs; 8315f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_EQ(baseTimeNs + startBucketNum * bucketSizeNs + bucketSizeNs, expectedPullTimeNs); 8415f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 8515f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac auto screenOffEvent = CreateScreenStateChangedEvent(android::view::DISPLAY_STATE_OFF, 8615f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac configAddedTimeNs + 55); 8715f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac processor->OnLogEvent(screenOffEvent.get()); 8815f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 8915f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac auto screenOnEvent = CreateScreenStateChangedEvent(android::view::DISPLAY_STATE_ON, 9015f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac configAddedTimeNs + 65); 9115f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac processor->OnLogEvent(screenOnEvent.get()); 9215f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 9315f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac screenOffEvent = CreateScreenStateChangedEvent(android::view::DISPLAY_STATE_OFF, 9415f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac configAddedTimeNs + 75); 9515f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac processor->OnLogEvent(screenOffEvent.get()); 9615f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 9715f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac // Pulling alarm arrives on time and reset the sequential pulling alarm. 9815f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac processor->informPullAlarmFired(expectedPullTimeNs + 1); 9915f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_EQ(baseTimeNs + startBucketNum * bucketSizeNs + 2 * bucketSizeNs, expectedPullTimeNs); 10015f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 10115f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac processor->informPullAlarmFired(expectedPullTimeNs + 1); 10215f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 10315f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac screenOnEvent = CreateScreenStateChangedEvent(android::view::DISPLAY_STATE_ON, 10415f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac configAddedTimeNs + 2 * bucketSizeNs + 15); 10515f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac processor->OnLogEvent(screenOnEvent.get()); 10615f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 10715f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac processor->informPullAlarmFired(expectedPullTimeNs + 1); 10815f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 10915f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac processor->informPullAlarmFired(expectedPullTimeNs + 1); 11015f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 11115f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac screenOffEvent = CreateScreenStateChangedEvent(android::view::DISPLAY_STATE_OFF, 11215f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac configAddedTimeNs + 4 * bucketSizeNs + 11); 11315f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac processor->OnLogEvent(screenOffEvent.get()); 11415f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 11515f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac processor->informPullAlarmFired(expectedPullTimeNs + 1); 11615f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 11715f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac processor->informPullAlarmFired(expectedPullTimeNs + 1); 11815f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 11915f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac ConfigMetricsReportList reports; 12015f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac vector<uint8_t> buffer; 12156ae0d9a48212c6e886e5887a6f9191f3020af40David Chen processor->onDumpReport(cfgKey, configAddedTimeNs + 7 * bucketSizeNs + 10, false, ADB_DUMP, 12256ae0d9a48212c6e886e5887a6f9191f3020af40David Chen &buffer); 12315f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_TRUE(buffer.size() > 0); 12415f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size())); 1259def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac backfillDimensionPath(&reports); 1269def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac backfillStringInReport(&reports); 1279def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac backfillStartEndTimestamp(&reports); 12815f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_EQ(1, reports.reports_size()); 12915f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_EQ(1, reports.reports(0).metrics_size()); 13015f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac StatsLogReport::ValueMetricDataWrapper valueMetrics; 13115f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac sortMetricDataByDimensionsValue( 13215f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac reports.reports(0).metrics(0).value_metrics(), &valueMetrics); 13315f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_GT((int)valueMetrics.data_size(), 1); 13415f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 13515f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac auto data = valueMetrics.data(0); 13615f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_EQ(android::util::TEMPERATURE, data.dimensions_in_what().field()); 13715f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_EQ(1, data.dimensions_in_what().value_tuple().dimensions_value_size()); 13815f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_EQ(2 /* sensor name field */, 13915f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac data.dimensions_in_what().value_tuple().dimensions_value(0).field()); 14015f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_FALSE(data.dimensions_in_what().value_tuple().dimensions_value(0).value_str().empty()); 14115f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_EQ(5, data.bucket_info_size()); 14215f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 14315f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_EQ(baseTimeNs + 2 * bucketSizeNs, data.bucket_info(0).start_bucket_elapsed_nanos()); 14415f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_EQ(baseTimeNs + 3 * bucketSizeNs, data.bucket_info(0).end_bucket_elapsed_nanos()); 14515f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_TRUE(data.bucket_info(0).has_value()); 14615f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 14715f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_EQ(baseTimeNs + 3 * bucketSizeNs, data.bucket_info(1).start_bucket_elapsed_nanos()); 14815f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_EQ(baseTimeNs + 4 * bucketSizeNs, data.bucket_info(1).end_bucket_elapsed_nanos()); 14915f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_TRUE(data.bucket_info(1).has_value()); 15015f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 15115f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_EQ(baseTimeNs + 4 * bucketSizeNs, data.bucket_info(2).start_bucket_elapsed_nanos()); 15215f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_EQ(baseTimeNs + 5 * bucketSizeNs, data.bucket_info(2).end_bucket_elapsed_nanos()); 15315f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_TRUE(data.bucket_info(2).has_value()); 15415f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 15515f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_EQ(baseTimeNs + 6 * bucketSizeNs, data.bucket_info(3).start_bucket_elapsed_nanos()); 15615f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_EQ(baseTimeNs + 7 * bucketSizeNs, data.bucket_info(3).end_bucket_elapsed_nanos()); 15715f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_TRUE(data.bucket_info(3).has_value()); 15815f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 15915f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_EQ(baseTimeNs + 7 * bucketSizeNs, data.bucket_info(4).start_bucket_elapsed_nanos()); 16015f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_EQ(baseTimeNs + 8 * bucketSizeNs, data.bucket_info(4).end_bucket_elapsed_nanos()); 16115f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_TRUE(data.bucket_info(4).has_value()); 16215f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac} 16315f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 16415f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-macTEST(ValueMetricE2eTest, TestPulledEvents_LateAlarm) { 16515f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac auto config = CreateStatsdConfig(); 16615f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac int64_t baseTimeNs = 10 * NS_PER_SEC; 16715f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac int64_t configAddedTimeNs = 10 * 60 * NS_PER_SEC + baseTimeNs; 16815f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac int64_t bucketSizeNs = 16915f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac TimeUnitToBucketSizeInMillis(config.value_metric(0).bucket()) * 1000000; 17015f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 17115f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac ConfigKey cfgKey; 17215f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac auto processor = CreateStatsLogProcessor( 17315f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac baseTimeNs, configAddedTimeNs, config, cfgKey); 17415f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_EQ(processor->mMetricsManagers.size(), 1u); 17515f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_TRUE(processor->mMetricsManagers.begin()->second->isConfigValid()); 17658e609e33947fa912b50fc4fc0daed21facd28a0Yangster-mac processor->mStatsPullerManager.ForceClearPullerCache(); 17715f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 17815f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac int startBucketNum = processor->mMetricsManagers.begin()->second-> 17915f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac mAllMetricProducers[0]->getCurrentBucketNum(); 18015f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_GT(startBucketNum, (int64_t)0); 18115f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 18215f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac // When creating the config, the gauge metric producer should register the alarm at the 18315f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac // end of the current bucket. 18415f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_EQ((size_t)1, StatsPullerManagerImpl::GetInstance().mReceivers.size()); 18515f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_EQ(bucketSizeNs, 18615f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac StatsPullerManagerImpl::GetInstance().mReceivers.begin()-> 18715f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac second.front().intervalNs); 18815f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac int64_t& expectedPullTimeNs = StatsPullerManagerImpl::GetInstance().mReceivers.begin()-> 18915f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac second.front().nextPullTimeNs; 19015f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_EQ(baseTimeNs + startBucketNum * bucketSizeNs + bucketSizeNs, expectedPullTimeNs); 19115f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 19215f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac // Screen off/on/off events. 19315f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac auto screenOffEvent = CreateScreenStateChangedEvent(android::view::DISPLAY_STATE_OFF, 19415f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac configAddedTimeNs + 55); 19515f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac processor->OnLogEvent(screenOffEvent.get()); 19615f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 19715f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac auto screenOnEvent = CreateScreenStateChangedEvent(android::view::DISPLAY_STATE_ON, 19815f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac configAddedTimeNs + 65); 19915f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac processor->OnLogEvent(screenOnEvent.get()); 20015f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 20115f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac screenOffEvent = CreateScreenStateChangedEvent(android::view::DISPLAY_STATE_OFF, 20215f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac configAddedTimeNs + 75); 20315f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac processor->OnLogEvent(screenOffEvent.get()); 20415f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 20515f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac // Pulling alarm arrives late by 2 buckets and 1 ns. 20615f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac processor->informPullAlarmFired(expectedPullTimeNs + 2 * bucketSizeNs + 1); 20715f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_EQ(baseTimeNs + startBucketNum * bucketSizeNs + 4 * bucketSizeNs, expectedPullTimeNs); 20815f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 20915f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac screenOnEvent = CreateScreenStateChangedEvent(android::view::DISPLAY_STATE_ON, 21015f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac configAddedTimeNs + 4 * bucketSizeNs + 65); 21115f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac processor->OnLogEvent(screenOnEvent.get()); 21215f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 21315f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac // Pulling alarm arrives late by one bucket size + 21ns. 21415f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac processor->informPullAlarmFired(expectedPullTimeNs + bucketSizeNs + 21); 21515f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_EQ(baseTimeNs + startBucketNum * bucketSizeNs + 6 * bucketSizeNs, expectedPullTimeNs); 21615f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 21715f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac screenOffEvent = CreateScreenStateChangedEvent(android::view::DISPLAY_STATE_OFF, 21815f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac configAddedTimeNs + 6 * bucketSizeNs + 31); 21915f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac processor->OnLogEvent(screenOffEvent.get()); 22015f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 22115f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac processor->informPullAlarmFired(expectedPullTimeNs + bucketSizeNs + 21); 22215f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_EQ(baseTimeNs + startBucketNum * bucketSizeNs + 8 * bucketSizeNs, expectedPullTimeNs); 22315f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 22415f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac processor->informPullAlarmFired(expectedPullTimeNs + 1); 22515f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_EQ(baseTimeNs + startBucketNum * bucketSizeNs + 9 * bucketSizeNs, expectedPullTimeNs); 22615f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 22715f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac ConfigMetricsReportList reports; 22815f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac vector<uint8_t> buffer; 22956ae0d9a48212c6e886e5887a6f9191f3020af40David Chen processor->onDumpReport(cfgKey, configAddedTimeNs + 9 * bucketSizeNs + 10, false, ADB_DUMP, 23056ae0d9a48212c6e886e5887a6f9191f3020af40David Chen &buffer); 23115f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_TRUE(buffer.size() > 0); 23215f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_TRUE(reports.ParseFromArray(&buffer[0], buffer.size())); 2339def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac backfillDimensionPath(&reports); 2349def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac backfillStringInReport(&reports); 2359def8e3995b1034d943a0fd22b6e512bfacdab77Yangster-mac backfillStartEndTimestamp(&reports); 23615f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_EQ(1, reports.reports_size()); 23715f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_EQ(1, reports.reports(0).metrics_size()); 23815f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac StatsLogReport::ValueMetricDataWrapper valueMetrics; 23915f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac sortMetricDataByDimensionsValue( 24015f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac reports.reports(0).metrics(0).value_metrics(), &valueMetrics); 24115f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_GT((int)valueMetrics.data_size(), 1); 24215f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 24315f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac auto data = valueMetrics.data(0); 24415f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_EQ(android::util::TEMPERATURE, data.dimensions_in_what().field()); 24515f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_EQ(1, data.dimensions_in_what().value_tuple().dimensions_value_size()); 24615f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_EQ(2 /* sensor name field */, 24715f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac data.dimensions_in_what().value_tuple().dimensions_value(0).field()); 24815f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_FALSE(data.dimensions_in_what().value_tuple().dimensions_value(0).value_str().empty()); 24915f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_EQ(3, data.bucket_info_size()); 25015f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 25115f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_EQ(baseTimeNs + 2 * bucketSizeNs, data.bucket_info(0).start_bucket_elapsed_nanos()); 25215f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_EQ(baseTimeNs + 3 * bucketSizeNs, data.bucket_info(0).end_bucket_elapsed_nanos()); 25315f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_TRUE(data.bucket_info(0).has_value()); 25415f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 25515f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_EQ(baseTimeNs + 8 * bucketSizeNs, data.bucket_info(1).start_bucket_elapsed_nanos()); 25615f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_EQ(baseTimeNs + 9 * bucketSizeNs, data.bucket_info(1).end_bucket_elapsed_nanos()); 25715f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_TRUE(data.bucket_info(1).has_value()); 25815f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 25915f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_EQ(baseTimeNs + 9 * bucketSizeNs, data.bucket_info(2).start_bucket_elapsed_nanos()); 26015f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_EQ(baseTimeNs + 10 * bucketSizeNs, data.bucket_info(2).end_bucket_elapsed_nanos()); 26115f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac EXPECT_TRUE(data.bucket_info(2).has_value()); 26215f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac} 26315f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 26415f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac#else 26515f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-macGTEST_LOG_(INFO) << "This test does nothing.\n"; 26615f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac#endif 26715f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac 26815f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac} // namespace statsd 26915f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac} // namespace os 27015f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac} // namespace android 271