diff options
| -rw-r--r-- | services/gpuservice/GpuService.cpp | 5 | ||||
| -rw-r--r-- | services/gpuservice/TEST_MAPPING | 7 | ||||
| -rw-r--r-- | services/gpuservice/gpustats/GpuStats.cpp | 21 | ||||
| -rw-r--r-- | services/gpuservice/gpustats/include/gpustats/GpuStats.h | 11 | ||||
| -rw-r--r-- | services/gpuservice/tests/unittests/Android.bp | 34 | ||||
| -rw-r--r-- | services/gpuservice/tests/unittests/AndroidTest.xml | 26 | ||||
| -rw-r--r-- | services/gpuservice/tests/unittests/GpuStatsTest.cpp | 257 |
7 files changed, 343 insertions, 18 deletions
diff --git a/services/gpuservice/GpuService.cpp b/services/gpuservice/GpuService.cpp index 116cd16c57..91a76f16eb 100644 --- a/services/gpuservice/GpuService.cpp +++ b/services/gpuservice/GpuService.cpp @@ -52,8 +52,9 @@ void GpuService::setGpuStats(const std::string& driverPackageName, int64_t driverBuildTime, const std::string& appPackageName, const int32_t vulkanVersion, GpuStatsInfo::Driver driver, bool isDriverLoaded, int64_t driverLoadingTime) { - mGpuStats->insert(driverPackageName, driverVersionName, driverVersionCode, driverBuildTime, - appPackageName, vulkanVersion, driver, isDriverLoaded, driverLoadingTime); + mGpuStats->insertDriverStats(driverPackageName, driverVersionName, driverVersionCode, + driverBuildTime, appPackageName, vulkanVersion, driver, + isDriverLoaded, driverLoadingTime); } status_t GpuService::getGpuStatsGlobalInfo(std::vector<GpuStatsGlobalInfo>* outStats) const { diff --git a/services/gpuservice/TEST_MAPPING b/services/gpuservice/TEST_MAPPING new file mode 100644 index 0000000000..b34535582d --- /dev/null +++ b/services/gpuservice/TEST_MAPPING @@ -0,0 +1,7 @@ +{ + "presubmit": [ + { + "name": "gpuservice_unittest" + } + ] +} diff --git a/services/gpuservice/gpustats/GpuStats.cpp b/services/gpuservice/gpustats/GpuStats.cpp index 63723b6686..71e6b973d4 100644 --- a/services/gpuservice/gpustats/GpuStats.cpp +++ b/services/gpuservice/gpustats/GpuStats.cpp @@ -74,10 +74,11 @@ static void addLoadingTime(GpuStatsInfo::Driver driver, int64_t driverLoadingTim } } -void GpuStats::insert(const std::string& driverPackageName, const std::string& driverVersionName, - uint64_t driverVersionCode, int64_t driverBuildTime, - const std::string& appPackageName, const int32_t vulkanVersion, - GpuStatsInfo::Driver driver, bool isDriverLoaded, int64_t driverLoadingTime) { +void GpuStats::insertDriverStats(const std::string& driverPackageName, + const std::string& driverVersionName, uint64_t driverVersionCode, + int64_t driverBuildTime, const std::string& appPackageName, + const int32_t vulkanVersion, GpuStatsInfo::Driver driver, + bool isDriverLoaded, int64_t driverLoadingTime) { ATRACE_CALL(); std::lock_guard<std::mutex> lock(mLock); @@ -191,6 +192,11 @@ void GpuStats::dump(const Vector<String16>& args, std::string* result) { dumpAll = false; } + if (dumpAll) { + dumpGlobalLocked(result); + dumpAppLocked(result); + } + if (argsSet.count("--clear")) { bool clearAll = true; @@ -208,13 +214,6 @@ void GpuStats::dump(const Vector<String16>& args, std::string* result) { mGlobalStats.clear(); mAppStats.clear(); } - - dumpAll = false; - } - - if (dumpAll) { - dumpGlobalLocked(result); - dumpAppLocked(result); } } diff --git a/services/gpuservice/gpustats/include/gpustats/GpuStats.h b/services/gpuservice/gpustats/include/gpustats/GpuStats.h index bdc9bf50b1..bcb9e0d7dd 100644 --- a/services/gpuservice/gpustats/include/gpustats/GpuStats.h +++ b/services/gpuservice/gpustats/include/gpustats/GpuStats.h @@ -32,11 +32,12 @@ public: GpuStats() = default; ~GpuStats() = default; - // Insert new gpu stats into global stats and app stats. - void insert(const std::string& driverPackageName, const std::string& driverVersionName, - uint64_t driverVersionCode, int64_t driverBuildTime, - const std::string& appPackageName, const int32_t vulkanVersion, - GpuStatsInfo::Driver driver, bool isDriverLoaded, int64_t driverLoadingTime); + // Insert new gpu driver stats into global stats and app stats. + void insertDriverStats(const std::string& driverPackageName, + const std::string& driverVersionName, uint64_t driverVersionCode, + int64_t driverBuildTime, const std::string& appPackageName, + const int32_t vulkanVersion, GpuStatsInfo::Driver driver, + bool isDriverLoaded, int64_t driverLoadingTime); // Insert target stats into app stats or potentially global stats as well. void insertTargetStats(const std::string& appPackageName, const uint64_t driverVersionCode, const GpuStatsInfo::Stats stats, const uint64_t value); diff --git a/services/gpuservice/tests/unittests/Android.bp b/services/gpuservice/tests/unittests/Android.bp new file mode 100644 index 0000000000..fee5bd4a56 --- /dev/null +++ b/services/gpuservice/tests/unittests/Android.bp @@ -0,0 +1,34 @@ +// Copyright 2020 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. + +cc_test { + name: "gpuservice_unittest", + test_suites: ["device-tests"], + sanitize: { + address: true, + }, + srcs: [ + "GpuStatsTest.cpp", + ], + shared_libs: [ + "libcutils", + "libgfxstats", + "libgraphicsenv", + "liblog", + "libutils", + ], + static_libs: [ + "libgmock", + ], +} diff --git a/services/gpuservice/tests/unittests/AndroidTest.xml b/services/gpuservice/tests/unittests/AndroidTest.xml new file mode 100644 index 0000000000..66f51c7489 --- /dev/null +++ b/services/gpuservice/tests/unittests/AndroidTest.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright 2020 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. +--> +<configuration description="Config for gpuservice_unittest"> + <target_preparer class="com.android.tradefed.targetprep.PushFilePreparer"> + <option name="cleanup" value="true" /> + <option name="push" value="gpuservice_unittest->/data/local/tmp/gpuservice_unittest" /> + </target_preparer> + <option name="test-suite-tag" value="apct" /> + <test class="com.android.tradefed.testtype.GTest" > + <option name="native-test-device-path" value="/data/local/tmp" /> + <option name="module-name" value="gpuservice_unittest" /> + </test> +</configuration> diff --git a/services/gpuservice/tests/unittests/GpuStatsTest.cpp b/services/gpuservice/tests/unittests/GpuStatsTest.cpp new file mode 100644 index 0000000000..276a3341d7 --- /dev/null +++ b/services/gpuservice/tests/unittests/GpuStatsTest.cpp @@ -0,0 +1,257 @@ +/* + * Copyright 2020 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. + */ + +#undef LOG_TAG +#define LOG_TAG "gpuservice_unittest" + +#include <cutils/properties.h> +#include <gmock/gmock.h> +#include <gpustats/GpuStats.h> +#include <gtest/gtest.h> +#include <utils/String16.h> +#include <utils/Vector.h> + +namespace android { +namespace { + +using testing::HasSubstr; + +// clang-format off +#define BUILTIN_DRIVER_PKG_NAME "system" +#define BUILTIN_DRIVER_VER_NAME "0" +#define BUILTIN_DRIVER_VER_CODE 0 +#define BUILTIN_DRIVER_BUILD_TIME 123 +#define UPDATED_DRIVER_PKG_NAME "updated" +#define UPDATED_DRIVER_VER_NAME "1" +#define UPDATED_DRIVER_VER_CODE 1 +#define UPDATED_DRIVER_BUILD_TIME 234 +#define VULKAN_VERSION 345 +#define CPU_VULKAN_VERSION 456 +#define OPENGLES_VERSION 567 +#define APP_PKG_NAME_1 "testapp1" +#define APP_PKG_NAME_2 "testapp2" +#define DRIVER_LOADING_TIME_1 678 +#define DRIVER_LOADING_TIME_2 789 +#define DRIVER_LOADING_TIME_3 891 + +enum InputCommand : int32_t { + DUMP_ALL = 0, + DUMP_GLOBAL = 1, + DUMP_APP = 2, + DUMP_ALL_THEN_CLEAR = 3, + DUMP_GLOBAL_THEN_CLEAR = 4, + DUMP_APP_THEN_CLEAR = 5, +}; +// clang-format on + +class GpuStatsTest : public testing::Test { +public: + GpuStatsTest() { + const ::testing::TestInfo* const test_info = + ::testing::UnitTest::GetInstance()->current_test_info(); + ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name()); + } + + ~GpuStatsTest() { + const ::testing::TestInfo* const test_info = + ::testing::UnitTest::GetInstance()->current_test_info(); + ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name()); + } + + std::string inputCommand(InputCommand cmd); + + void SetUp() override { + property_set("ro.cpuvulkan.version", std::to_string(CPU_VULKAN_VERSION).c_str()); + property_set("ro.opengles.version", std::to_string(OPENGLES_VERSION).c_str()); + mCpuVulkanVersion = property_get_int32("ro.cpuvulkan.version", CPU_VULKAN_VERSION); + mGlesVersion = property_get_int32("ro.opengles.version", OPENGLES_VERSION); + } + + std::unique_ptr<GpuStats> mGpuStats = std::make_unique<GpuStats>(); + int32_t mCpuVulkanVersion = 0; + int32_t mGlesVersion = 0; +}; + +std::string GpuStatsTest::inputCommand(InputCommand cmd) { + std::string result; + Vector<String16> args; + + switch (cmd) { + case InputCommand::DUMP_ALL: + break; + case InputCommand::DUMP_GLOBAL: + args.push_back(String16("--global")); + break; + case InputCommand::DUMP_APP: + args.push_back(String16("--app")); + break; + case InputCommand::DUMP_ALL_THEN_CLEAR: + args.push_back(String16("--clear")); + break; + case InputCommand::DUMP_GLOBAL_THEN_CLEAR: + args.push_back(String16("--global")); + args.push_back(String16("--clear")); + break; + case InputCommand::DUMP_APP_THEN_CLEAR: + args.push_back(String16("--app")); + args.push_back(String16("--clear")); + break; + } + + mGpuStats->dump(args, &result); + return result; +} + +TEST_F(GpuStatsTest, statsEmptyByDefault) { + ASSERT_TRUE(inputCommand(InputCommand::DUMP_ALL).empty()); +} + +TEST_F(GpuStatsTest, canInsertBuiltinDriverStats) { + mGpuStats->insertDriverStats(BUILTIN_DRIVER_PKG_NAME, BUILTIN_DRIVER_VER_NAME, + BUILTIN_DRIVER_VER_CODE, BUILTIN_DRIVER_BUILD_TIME, APP_PKG_NAME_1, + VULKAN_VERSION, GpuStatsInfo::Driver::GL, true, + DRIVER_LOADING_TIME_1); + + std::string expectedResult = "driverPackageName = " + std::string(BUILTIN_DRIVER_PKG_NAME); + EXPECT_THAT(inputCommand(InputCommand::DUMP_GLOBAL), HasSubstr(expectedResult)); + expectedResult = "driverVersionName = " + std::string(BUILTIN_DRIVER_VER_NAME); + EXPECT_THAT(inputCommand(InputCommand::DUMP_GLOBAL), HasSubstr(expectedResult)); + expectedResult = "driverVersionCode = " + std::to_string(BUILTIN_DRIVER_VER_CODE); + EXPECT_THAT(inputCommand(InputCommand::DUMP_GLOBAL), HasSubstr(expectedResult)); + expectedResult = "driverBuildTime = " + std::to_string(BUILTIN_DRIVER_BUILD_TIME); + EXPECT_THAT(inputCommand(InputCommand::DUMP_GLOBAL), HasSubstr(expectedResult)); + EXPECT_THAT(inputCommand(InputCommand::DUMP_GLOBAL), HasSubstr("glLoadingCount = 1")); + EXPECT_THAT(inputCommand(InputCommand::DUMP_GLOBAL), HasSubstr("glLoadingFailureCount = 0")); + expectedResult = "appPackageName = " + std::string(APP_PKG_NAME_1); + EXPECT_THAT(inputCommand(InputCommand::DUMP_APP), HasSubstr(expectedResult)); + expectedResult = "driverVersionCode = " + std::to_string(BUILTIN_DRIVER_VER_CODE); + EXPECT_THAT(inputCommand(InputCommand::DUMP_APP), HasSubstr(expectedResult)); + expectedResult = "glDriverLoadingTime: " + std::to_string(DRIVER_LOADING_TIME_1); + EXPECT_THAT(inputCommand(InputCommand::DUMP_APP), HasSubstr(expectedResult)); +} + +TEST_F(GpuStatsTest, canInsertUpdatedDriverStats) { + mGpuStats->insertDriverStats(UPDATED_DRIVER_PKG_NAME, UPDATED_DRIVER_VER_NAME, + UPDATED_DRIVER_VER_CODE, UPDATED_DRIVER_BUILD_TIME, APP_PKG_NAME_2, + VULKAN_VERSION, GpuStatsInfo::Driver::VULKAN_UPDATED, false, + DRIVER_LOADING_TIME_2); + + std::string expectedResult = "driverPackageName = " + std::string(UPDATED_DRIVER_PKG_NAME); + EXPECT_THAT(inputCommand(InputCommand::DUMP_GLOBAL), HasSubstr(expectedResult)); + expectedResult = "driverVersionName = " + std::string(UPDATED_DRIVER_VER_NAME); + EXPECT_THAT(inputCommand(InputCommand::DUMP_GLOBAL), HasSubstr(expectedResult)); + expectedResult = "driverVersionCode = " + std::to_string(UPDATED_DRIVER_VER_CODE); + EXPECT_THAT(inputCommand(InputCommand::DUMP_GLOBAL), HasSubstr(expectedResult)); + expectedResult = "driverBuildTime = " + std::to_string(UPDATED_DRIVER_BUILD_TIME); + EXPECT_THAT(inputCommand(InputCommand::DUMP_GLOBAL), HasSubstr(expectedResult)); + EXPECT_THAT(inputCommand(InputCommand::DUMP_GLOBAL), HasSubstr("vkLoadingCount = 1")); + EXPECT_THAT(inputCommand(InputCommand::DUMP_GLOBAL), HasSubstr("vkLoadingFailureCount = 1")); + expectedResult = "appPackageName = " + std::string(APP_PKG_NAME_2); + EXPECT_THAT(inputCommand(InputCommand::DUMP_APP), HasSubstr(expectedResult)); + expectedResult = "driverVersionCode = " + std::to_string(UPDATED_DRIVER_VER_CODE); + EXPECT_THAT(inputCommand(InputCommand::DUMP_APP), HasSubstr(expectedResult)); + expectedResult = "vkDriverLoadingTime: " + std::to_string(DRIVER_LOADING_TIME_2); + EXPECT_THAT(inputCommand(InputCommand::DUMP_APP), HasSubstr(expectedResult)); +} + +TEST_F(GpuStatsTest, canInsertAngleDriverStats) { + mGpuStats->insertDriverStats(UPDATED_DRIVER_PKG_NAME, UPDATED_DRIVER_VER_NAME, + UPDATED_DRIVER_VER_CODE, UPDATED_DRIVER_BUILD_TIME, APP_PKG_NAME_2, + VULKAN_VERSION, GpuStatsInfo::Driver::ANGLE, true, + DRIVER_LOADING_TIME_3); + + EXPECT_THAT(inputCommand(InputCommand::DUMP_GLOBAL), HasSubstr("angleLoadingCount = 1")); + EXPECT_THAT(inputCommand(InputCommand::DUMP_GLOBAL), HasSubstr("angleLoadingFailureCount = 0")); + std::string expectedResult = "angleDriverLoadingTime: " + std::to_string(DRIVER_LOADING_TIME_3); + EXPECT_THAT(inputCommand(InputCommand::DUMP_APP), HasSubstr(expectedResult)); +} + +TEST_F(GpuStatsTest, canDump3dApiVersion) { + mGpuStats->insertDriverStats(BUILTIN_DRIVER_PKG_NAME, BUILTIN_DRIVER_VER_NAME, + BUILTIN_DRIVER_VER_CODE, BUILTIN_DRIVER_BUILD_TIME, APP_PKG_NAME_1, + VULKAN_VERSION, GpuStatsInfo::Driver::GL, true, + DRIVER_LOADING_TIME_1); + + std::string expectedResult = "vulkanVersion = " + std::to_string(VULKAN_VERSION); + EXPECT_THAT(inputCommand(InputCommand::DUMP_GLOBAL), HasSubstr(expectedResult)); + expectedResult = "cpuVulkanVersion = " + std::to_string(mCpuVulkanVersion); + EXPECT_THAT(inputCommand(InputCommand::DUMP_GLOBAL), HasSubstr(expectedResult)); + expectedResult = "glesVersion = " + std::to_string(mGlesVersion); + EXPECT_THAT(inputCommand(InputCommand::DUMP_GLOBAL), HasSubstr(expectedResult)); +} + +TEST_F(GpuStatsTest, canNotInsertTargetStatsBeforeProperSetup) { + mGpuStats->insertTargetStats(APP_PKG_NAME_1, BUILTIN_DRIVER_VER_CODE, + GpuStatsInfo::Stats::CPU_VULKAN_IN_USE, 0); + mGpuStats->insertTargetStats(APP_PKG_NAME_1, BUILTIN_DRIVER_VER_CODE, + GpuStatsInfo::Stats::FALSE_PREROTATION, 0); + mGpuStats->insertTargetStats(APP_PKG_NAME_1, BUILTIN_DRIVER_VER_CODE, + GpuStatsInfo::Stats::GLES_1_IN_USE, 0); + + EXPECT_TRUE(inputCommand(InputCommand::DUMP_APP).empty()); +} + +TEST_F(GpuStatsTest, canInsertTargetStatsAfterProperSetup) { + mGpuStats->insertDriverStats(BUILTIN_DRIVER_PKG_NAME, BUILTIN_DRIVER_VER_NAME, + BUILTIN_DRIVER_VER_CODE, BUILTIN_DRIVER_BUILD_TIME, APP_PKG_NAME_1, + VULKAN_VERSION, GpuStatsInfo::Driver::GL, true, + DRIVER_LOADING_TIME_1); + mGpuStats->insertTargetStats(APP_PKG_NAME_1, BUILTIN_DRIVER_VER_CODE, + GpuStatsInfo::Stats::CPU_VULKAN_IN_USE, 0); + mGpuStats->insertTargetStats(APP_PKG_NAME_1, BUILTIN_DRIVER_VER_CODE, + GpuStatsInfo::Stats::FALSE_PREROTATION, 0); + mGpuStats->insertTargetStats(APP_PKG_NAME_1, BUILTIN_DRIVER_VER_CODE, + GpuStatsInfo::Stats::GLES_1_IN_USE, 0); + + EXPECT_THAT(inputCommand(InputCommand::DUMP_APP), HasSubstr("cpuVulkanInUse = 1")); + EXPECT_THAT(inputCommand(InputCommand::DUMP_APP), HasSubstr("falsePrerotation = 1")); + EXPECT_THAT(inputCommand(InputCommand::DUMP_APP), HasSubstr("gles1InUse = 1")); +} + +TEST_F(GpuStatsTest, canDumpAllBeforeClearAll) { + mGpuStats->insertDriverStats(BUILTIN_DRIVER_PKG_NAME, BUILTIN_DRIVER_VER_NAME, + BUILTIN_DRIVER_VER_CODE, BUILTIN_DRIVER_BUILD_TIME, APP_PKG_NAME_1, + VULKAN_VERSION, GpuStatsInfo::Driver::GL, true, + DRIVER_LOADING_TIME_1); + + EXPECT_FALSE(inputCommand(InputCommand::DUMP_ALL_THEN_CLEAR).empty()); + EXPECT_TRUE(inputCommand(InputCommand::DUMP_ALL).empty()); +} + +TEST_F(GpuStatsTest, canDumpGlobalBeforeClearGlobal) { + mGpuStats->insertDriverStats(BUILTIN_DRIVER_PKG_NAME, BUILTIN_DRIVER_VER_NAME, + BUILTIN_DRIVER_VER_CODE, BUILTIN_DRIVER_BUILD_TIME, APP_PKG_NAME_1, + VULKAN_VERSION, GpuStatsInfo::Driver::GL, true, + DRIVER_LOADING_TIME_1); + + EXPECT_FALSE(inputCommand(InputCommand::DUMP_GLOBAL_THEN_CLEAR).empty()); + EXPECT_TRUE(inputCommand(InputCommand::DUMP_GLOBAL).empty()); + EXPECT_FALSE(inputCommand(InputCommand::DUMP_APP).empty()); +} + +TEST_F(GpuStatsTest, canDumpAppBeforeClearApp) { + mGpuStats->insertDriverStats(BUILTIN_DRIVER_PKG_NAME, BUILTIN_DRIVER_VER_NAME, + BUILTIN_DRIVER_VER_CODE, BUILTIN_DRIVER_BUILD_TIME, APP_PKG_NAME_1, + VULKAN_VERSION, GpuStatsInfo::Driver::GL, true, + DRIVER_LOADING_TIME_1); + + EXPECT_FALSE(inputCommand(InputCommand::DUMP_APP_THEN_CLEAR).empty()); + EXPECT_TRUE(inputCommand(InputCommand::DUMP_APP).empty()); + EXPECT_FALSE(inputCommand(InputCommand::DUMP_GLOBAL).empty()); +} + +} // namespace +} // namespace android |