/* * Copyright (C) 2024 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include "MmMetricsGoldenAtomFieldTypes.h" #include "MmMetricsGoldenResults.h" #include "MockMmMetricsReporter.h" #include "VendorAtomIntValueUtil.h" #ifndef ARRAY_SIZE #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) #endif namespace android { namespace hardware { namespace google { namespace pixel { using mm_metrics_atom_field_test_golden_results::PixelMmMetricsPerDay_field_types; using mm_metrics_atom_field_test_golden_results::PixelMmMetricsPerHour_field_types; using mm_metrics_reporter_test_golden_result::PixelMmMetricsPerDay_golden; using mm_metrics_reporter_test_golden_result::PixelMmMetricsPerHour_golden; const char *data_base_path = "/data/local/tmp/test/pixelstats_mm_test/data"; TEST(MmMetricsReporterTest, MmMetricsPerHourAtomFieldOffsetTypeTest) { int i = -1; uint64_t golden_result; int field_type; std::vector values; MockMmMetricsReporter mreport; const std::string data_path0 = std::string(data_base_path) + "/test_data_0"; const std::string data_path1 = std::string(data_base_path) + "/test_data_1"; // Assert failure means the test case itself has a bug. ASSERT_EQ(ARRAY_SIZE(PixelMmMetricsPerHour_golden), ARRAY_SIZE(PixelMmMetricsPerHour_field_types)); /** * In test code we use setBasePath() to read different data sets for simulating * different timing reads of a sysfs node. */ /** * aggregatePixelMmMetricsPer5Min() aggregates PSI into max, min, and avg. * For the regular code, it will be called 12 times per hour (i.e. once per 5min) * For test code we do 6 times: enough for testing. * e.g. here average = (3 x data0 + 3 x data1) / 6 == avg of data 0, 1 * The following sequence simulate regular code obtaining sysfs nodes into * values[] array (i.e. atom), ready to be sent to the server */ mreport.setBasePath(data_path0); mreport.aggregatePixelMmMetricsPer5Min(); mreport.aggregatePixelMmMetricsPer5Min(); mreport.aggregatePixelMmMetricsPer5Min(); mreport.setBasePath(data_path1); mreport.aggregatePixelMmMetricsPer5Min(); mreport.aggregatePixelMmMetricsPer5Min(); mreport.aggregatePixelMmMetricsPer5Min(); // other fields from data set #0 mreport.setBasePath(data_path0); values = mreport.genPixelMmMetricsPerHour(); // Validate the atom: compare with golden results EXPECT_EQ(values.size(), ARRAY_SIZE(PixelMmMetricsPerHour_field_types)); for (auto const &v : values) { i++; golden_result = PixelMmMetricsPerHour_golden[i]; field_type = PixelMmMetricsPerHour_field_types[i]; if (golden_result == -1) continue; // no need to test (e.g. deprecated field) EXPECT_EQ(static_cast(v.getTag()), field_type) << "type mismatch at offset " << i; EXPECT_EQ(getVendorAtomIntValue(v), golden_result) << "value mismatch at offset " << i; } } TEST(MmMetricsReporterTest, MmMetricsPerDayAtomFieldOffsetTypeTest) { int i = -1; uint64_t golden_result; int field_type; std::vector values; MockMmMetricsReporter mreport; const std::string data_path0 = std::string(data_base_path) + "/test_data_0"; const std::string data_path1 = std::string(data_base_path) + "/test_data_1"; // Assert failure means the test case itself has a bug. ASSERT_EQ(ARRAY_SIZE(PixelMmMetricsPerDay_golden), ARRAY_SIZE(PixelMmMetricsPerDay_field_types)); mreport.setBasePath(data_path0); values = mreport.genPixelMmMetricsPerDay(); // PixelMmMetricsPerDay calculatd the difference of consecutive readings. // So, it will not send values[] at the 1st read. (i.e. empty for the 1st read) EXPECT_EQ(values.size(), 0); values.clear(); mreport.setBasePath(data_path1); values = mreport.genPixelMmMetricsPerDay(); // Per Day metrics (diffs) should be calculated, values[] will be non-empty now. // number of data should be the same as the number of fields in the atom. EXPECT_EQ(values.size(), ARRAY_SIZE(PixelMmMetricsPerDay_field_types)); for (auto const &v : values) { i++; EXPECT_LT(i, ARRAY_SIZE(PixelMmMetricsPerDay_field_types)); golden_result = PixelMmMetricsPerDay_golden[i]; field_type = PixelMmMetricsPerDay_field_types[i]; if (golden_result == -1) continue; // no need to test (e.g. deprecated field) EXPECT_EQ(static_cast(v.getTag()), field_type) << "type mismatch at offset " << i; EXPECT_EQ(getVendorAtomIntValue(v), golden_result) << "value mismatch at offset " << i; } } } // namespace pixel } // namespace google } // namespace hardware } // namespace android