diff options
author | Kalesh Singh <kaleshsingh@google.com> | 2020-12-01 11:47:01 -0500 |
---|---|---|
committer | Kalesh Singh <kaleshsingh@google.com> | 2020-12-22 20:49:35 +0000 |
commit | a851f3d711357de1ae98b6629c225cf0f1996054 (patch) | |
tree | 040bb398f98c99ce2a9d00def202b295ce013a58 /memtrack | |
parent | 2528ddcab26029f419f70b48af1bc7ae41ac00b1 (diff) |
Reland: Memtrack HAL: Add stable AIDL implementation
Bug: 175021432
Test: adb shell dumpsys -l | grep android.hardware.memtrack.IMemtrack
Test: VtsHalMemtrackTargetTest
Change-Id: I686c0ecc31648dc6e58a6ab5e6ae914454111200
Diffstat (limited to 'memtrack')
17 files changed, 587 insertions, 0 deletions
diff --git a/memtrack/aidl/Android.bp b/memtrack/aidl/Android.bp new file mode 100644 index 0000000000..fe4d01bad1 --- /dev/null +++ b/memtrack/aidl/Android.bp @@ -0,0 +1,33 @@ +// Copyright (C) 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. + +aidl_interface { + name: "android.hardware.memtrack", + vendor_available: true, + srcs: ["android/hardware/memtrack/*.aidl"], + stability: "vintf", + backend: { + cpp: { + enabled: false, + }, + java: { + enabled: false, + }, + ndk: { + vndk: { + enabled: true, + }, + }, + }, +} diff --git a/memtrack/aidl/aidl_api/android.hardware.memtrack/current/android/hardware/memtrack/DeviceInfo.aidl b/memtrack/aidl/aidl_api/android.hardware.memtrack/current/android/hardware/memtrack/DeviceInfo.aidl new file mode 100644 index 0000000000..00abff9edc --- /dev/null +++ b/memtrack/aidl/aidl_api/android.hardware.memtrack/current/android/hardware/memtrack/DeviceInfo.aidl @@ -0,0 +1,23 @@ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL interface (or parcelable). Do not try to +// edit this file. It looks like you are doing that because you have modified +// an AIDL interface in a backward-incompatible way, e.g., deleting a function +// from an interface or a field from a parcelable and it broke the build. That +// breakage is intended. +// +// You must not make a backward incompatible changes to the AIDL files built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.memtrack; +@VintfStability +parcelable DeviceInfo { + int id; + @utf8InCpp String name; +} diff --git a/memtrack/aidl/aidl_api/android.hardware.memtrack/current/android/hardware/memtrack/IMemtrack.aidl b/memtrack/aidl/aidl_api/android.hardware.memtrack/current/android/hardware/memtrack/IMemtrack.aidl new file mode 100644 index 0000000000..844a1bb3d4 --- /dev/null +++ b/memtrack/aidl/aidl_api/android.hardware.memtrack/current/android/hardware/memtrack/IMemtrack.aidl @@ -0,0 +1,23 @@ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL interface (or parcelable). Do not try to +// edit this file. It looks like you are doing that because you have modified +// an AIDL interface in a backward-incompatible way, e.g., deleting a function +// from an interface or a field from a parcelable and it broke the build. That +// breakage is intended. +// +// You must not make a backward incompatible changes to the AIDL files built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.memtrack; +@VintfStability +interface IMemtrack { + android.hardware.memtrack.MemtrackRecord[] getMemory(in int pid, in android.hardware.memtrack.MemtrackType type); + android.hardware.memtrack.DeviceInfo[] getGpuDeviceInfo(); +} diff --git a/memtrack/aidl/aidl_api/android.hardware.memtrack/current/android/hardware/memtrack/MemtrackRecord.aidl b/memtrack/aidl/aidl_api/android.hardware.memtrack/current/android/hardware/memtrack/MemtrackRecord.aidl new file mode 100644 index 0000000000..09ecefc6c4 --- /dev/null +++ b/memtrack/aidl/aidl_api/android.hardware.memtrack/current/android/hardware/memtrack/MemtrackRecord.aidl @@ -0,0 +1,32 @@ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL interface (or parcelable). Do not try to +// edit this file. It looks like you are doing that because you have modified +// an AIDL interface in a backward-incompatible way, e.g., deleting a function +// from an interface or a field from a parcelable and it broke the build. That +// breakage is intended. +// +// You must not make a backward incompatible changes to the AIDL files built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.memtrack; +@VintfStability +parcelable MemtrackRecord { + int flags; + long sizeInBytes; + const int FLAG_SMAPS_ACCOUNTED = 2; + const int FLAG_SMAPS_UNACCOUNTED = 4; + const int FLAG_SHARED = 8; + const int FLAG_SHARED_PSS = 16; + const int FLAG_PRIVATE = 32; + const int FLAG_SYSTEM = 64; + const int FLAG_DEDICATED = 128; + const int FLAG_NONSECURE = 256; + const int FLAG_SECURE = 512; +} diff --git a/memtrack/aidl/aidl_api/android.hardware.memtrack/current/android/hardware/memtrack/MemtrackType.aidl b/memtrack/aidl/aidl_api/android.hardware.memtrack/current/android/hardware/memtrack/MemtrackType.aidl new file mode 100644 index 0000000000..7f3f93904f --- /dev/null +++ b/memtrack/aidl/aidl_api/android.hardware.memtrack/current/android/hardware/memtrack/MemtrackType.aidl @@ -0,0 +1,27 @@ +/////////////////////////////////////////////////////////////////////////////// +// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // +/////////////////////////////////////////////////////////////////////////////// + +// This file is a snapshot of an AIDL interface (or parcelable). Do not try to +// edit this file. It looks like you are doing that because you have modified +// an AIDL interface in a backward-incompatible way, e.g., deleting a function +// from an interface or a field from a parcelable and it broke the build. That +// breakage is intended. +// +// You must not make a backward incompatible changes to the AIDL files built +// with the aidl_interface module type with versions property set. The module +// type is used to build AIDL files in a way that they can be used across +// independently updatable components of the system. If a device is shipped +// with such a backward incompatible change, it has a high risk of breaking +// later when a module using the interface is updated, e.g., Mainline modules. + +package android.hardware.memtrack; +@Backing(type="int") @VintfStability +enum MemtrackType { + OTHER = 0, + GL = 1, + GRAPHICS = 2, + MULTIMEDIA = 3, + CAMERA = 4, + NUM_TYPES = 5, +} diff --git a/memtrack/aidl/android/hardware/memtrack/DeviceInfo.aidl b/memtrack/aidl/android/hardware/memtrack/DeviceInfo.aidl new file mode 100644 index 0000000000..bcba544061 --- /dev/null +++ b/memtrack/aidl/android/hardware/memtrack/DeviceInfo.aidl @@ -0,0 +1,27 @@ +/* + * Copyright (C) 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. + */ + +package android.hardware.memtrack; + +/* + * Contains the device name and the device id. + */ +@VintfStability +parcelable DeviceInfo { + int id; + @utf8InCpp String name; +} + diff --git a/memtrack/aidl/android/hardware/memtrack/IMemtrack.aidl b/memtrack/aidl/android/hardware/memtrack/IMemtrack.aidl new file mode 100644 index 0000000000..18587ee770 --- /dev/null +++ b/memtrack/aidl/android/hardware/memtrack/IMemtrack.aidl @@ -0,0 +1,82 @@ +/* + * Copyright (C) 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. + */ + +package android.hardware.memtrack; + +import android.hardware.memtrack.DeviceInfo; +import android.hardware.memtrack.MemtrackRecord; +import android.hardware.memtrack.MemtrackType; + +/** + * The Memory Tracker HAL is designed to return information about + * device-specific memory usage. + * The primary goal is to be able to track memory that is not + * trackable in any other way, for example texture memory that is allocated by + * a process, but not mapped in to that process's address space. + * A secondary goal is to be able to categorize memory used by a process into + * GL, graphics, etc. All memory sizes must be in real memory usage, + * accounting for stride, bit depth, rounding up to page size, etc. + * + * Constructor for the interface should be used to perform memtrack management + * setup actions and must be called once before any calls to getMemory(). + */ +@VintfStability +interface IMemtrack { + /** + * getMemory() populates MemtrackRecord vector with the sizes of memory + * plus associated flags for that memory. + * + * A process collecting memory statistics will call getMemory for each + * combination of pid and memory type. For each memory type that it + * recognizes, the HAL must fill out an array of memtrack_record + * structures breaking down the statistics of that memory type as much as + * possible. For example, + * getMemory(<pid>, GL) might return: + * { { 4096, ACCOUNTED | PRIVATE | SYSTEM }, + * { 40960, UNACCOUNTED | PRIVATE | SYSTEM }, + * { 8192, ACCOUNTED | PRIVATE | DEDICATED }, + * { 8192, UNACCOUNTED | PRIVATE | DEDICATED } } + * If the HAL cannot differentiate between SYSTEM and DEDICATED memory, it + * could return: + * { { 12288, ACCOUNTED | PRIVATE }, + * { 49152, UNACCOUNTED | PRIVATE } } + * + * Memory must not overlap between types. For example, a graphics buffer + * that has been mapped into the GPU as a surface must show up when + * GRAPHICS is requested and not when GL + * is requested. + * + * @param pid process for which memory information is requested + * @param type memory type that information is being requested about + * @return vector of MemtrackRecord containing memory information + */ + MemtrackRecord[] getMemory(in int pid, in MemtrackType type); + + /** + * getGpuDeviceInfo() populates DeviceInfo with the ID and name + * of each GPU device. + * + * For example, getGpuDeviceInfor, might return: + * { { 0, <gpu-device-name> }, + * { 1, <gpu-device-name> } } + * + * This information is used to identify GPU devices for GPU specific + * memory accounting (e.g. DMA buffer usage). + * + * @return vector of DeviceInfo populated for all GPU devices. + */ + DeviceInfo[] getGpuDeviceInfo(); +} diff --git a/memtrack/aidl/android/hardware/memtrack/MemtrackRecord.aidl b/memtrack/aidl/android/hardware/memtrack/MemtrackRecord.aidl new file mode 100644 index 0000000000..dae026ebb7 --- /dev/null +++ b/memtrack/aidl/android/hardware/memtrack/MemtrackRecord.aidl @@ -0,0 +1,41 @@ +/* + * Copyright (C) 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. + */ + +package android.hardware.memtrack; + +/* + * Each record consists of the size of the memory used by the process and + * flags indicate all the MemtrackFlags that are valid for this record. + */ +@VintfStability +parcelable MemtrackRecord { + /* Memtrack Flags */ + const int FLAG_SMAPS_ACCOUNTED = 1 << 1; + const int FLAG_SMAPS_UNACCOUNTED = 1 << 2; + const int FLAG_SHARED = 1 << 3; + const int FLAG_SHARED_PSS = 1 << 4; + const int FLAG_PRIVATE = 1 << 5; + const int FLAG_SYSTEM = 1 << 6; + const int FLAG_DEDICATED = 1 << 7; + const int FLAG_NONSECURE = 1 << 8; + const int FLAG_SECURE = 1 << 9; + + /* Bitfield indicating all flags that are valid for this record */ + int flags; + + long sizeInBytes; +} + diff --git a/memtrack/aidl/android/hardware/memtrack/MemtrackType.aidl b/memtrack/aidl/android/hardware/memtrack/MemtrackType.aidl new file mode 100644 index 0000000000..715c6bff43 --- /dev/null +++ b/memtrack/aidl/android/hardware/memtrack/MemtrackType.aidl @@ -0,0 +1,31 @@ +/* + * Copyright (C) 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. + */ + +package android.hardware.memtrack; + +/** + * Tags which define the usage of the memory buffers. + */ +@VintfStability +@Backing(type="int") +enum MemtrackType { + OTHER = 0, + GL = 1, + GRAPHICS = 2, + MULTIMEDIA = 3, + CAMERA = 4, + NUM_TYPES, +} diff --git a/memtrack/aidl/default/Android.bp b/memtrack/aidl/default/Android.bp new file mode 100644 index 0000000000..52f88c8097 --- /dev/null +++ b/memtrack/aidl/default/Android.bp @@ -0,0 +1,30 @@ +// Copyright (C) 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_binary { + name: "android.hardware.memtrack-service.example", + relative_install_path: "hw", + init_rc: ["memtrack-default.rc"], + vintf_fragments: ["memtrack-default.xml"], + vendor: true, + shared_libs: [ + "libbase", + "libbinder_ndk", + "android.hardware.memtrack-ndk_platform", + ], + srcs: [ + "main.cpp", + "Memtrack.cpp", + ], +} diff --git a/memtrack/aidl/default/Memtrack.cpp b/memtrack/aidl/default/Memtrack.cpp new file mode 100644 index 0000000000..7361719002 --- /dev/null +++ b/memtrack/aidl/default/Memtrack.cpp @@ -0,0 +1,44 @@ +/* + * Copyright (C) 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. + */ + +#include "Memtrack.h" + +namespace aidl { +namespace android { +namespace hardware { +namespace memtrack { + +ndk::ScopedAStatus Memtrack::getMemory(int pid, MemtrackType type, + std::vector<MemtrackRecord>* _aidl_return) { + if (pid < 0) { + return ndk::ScopedAStatus(AStatus_fromExceptionCode(EX_ILLEGAL_ARGUMENT)); + } + if (type < MemtrackType::OTHER || type >= MemtrackType::NUM_TYPES) { + return ndk::ScopedAStatus(AStatus_fromExceptionCode(EX_UNSUPPORTED_OPERATION)); + } + _aidl_return->clear(); + return ndk::ScopedAStatus::ok(); +} + +ndk::ScopedAStatus Memtrack::getGpuDeviceInfo(std::vector<DeviceInfo>* _aidl_return) { + _aidl_return->clear(); + return ndk::ScopedAStatus::ok(); +} + +} // namespace memtrack +} // namespace hardware +} // namespace android +} // namespace aidl diff --git a/memtrack/aidl/default/Memtrack.h b/memtrack/aidl/default/Memtrack.h new file mode 100644 index 0000000000..f2ef60e005 --- /dev/null +++ b/memtrack/aidl/default/Memtrack.h @@ -0,0 +1,39 @@ +/* + * Copyright (C) 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. + */ + +#pragma once + +#include <aidl/android/hardware/memtrack/BnMemtrack.h> +#include <aidl/android/hardware/memtrack/DeviceInfo.h> +#include <aidl/android/hardware/memtrack/MemtrackRecord.h> +#include <aidl/android/hardware/memtrack/MemtrackType.h> + +namespace aidl { +namespace android { +namespace hardware { +namespace memtrack { + +class Memtrack : public BnMemtrack { + ndk::ScopedAStatus getMemory(int pid, MemtrackType type, + std::vector<MemtrackRecord>* _aidl_return) override; + + ndk::ScopedAStatus getGpuDeviceInfo(std::vector<DeviceInfo>* _aidl_return) override; +}; + +} // namespace memtrack +} // namespace hardware +} // namespace android +} // namespace aidl diff --git a/memtrack/aidl/default/main.cpp b/memtrack/aidl/default/main.cpp new file mode 100644 index 0000000000..d063d2aeda --- /dev/null +++ b/memtrack/aidl/default/main.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (C) 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. + */ + +#include "Memtrack.h" + +#include <android-base/logging.h> +#include <android/binder_manager.h> +#include <android/binder_process.h> + +using aidl::android::hardware::memtrack::Memtrack; + +int main() { + ABinderProcess_setThreadPoolMaxThreadCount(0); + std::shared_ptr<Memtrack> memtrack = ndk::SharedRefBase::make<Memtrack>(); + + const std::string instance = std::string() + Memtrack::descriptor + "/default"; + binder_status_t status = + AServiceManager_addService(memtrack->asBinder().get(), instance.c_str()); + CHECK(status == STATUS_OK); + + ABinderProcess_joinThreadPool(); + return EXIT_FAILURE; // Unreachable +} diff --git a/memtrack/aidl/default/memtrack-default.rc b/memtrack/aidl/default/memtrack-default.rc new file mode 100644 index 0000000000..1725cd00f7 --- /dev/null +++ b/memtrack/aidl/default/memtrack-default.rc @@ -0,0 +1,4 @@ +service vendor.memtrack-default /vendor/bin/hw/android.hardware.memtrack-service.example + class hal + user nobody + group system diff --git a/memtrack/aidl/default/memtrack-default.xml b/memtrack/aidl/default/memtrack-default.xml new file mode 100644 index 0000000000..3e3e0f6c1c --- /dev/null +++ b/memtrack/aidl/default/memtrack-default.xml @@ -0,0 +1,7 @@ +<manifest version="1.0" type="device"> + <hal format="aidl"> + <name>android.hardware.memtrack</name> + <fqname>IMemtrack/default</fqname> + </hal> +</manifest> + diff --git a/memtrack/aidl/vts/Android.bp b/memtrack/aidl/vts/Android.bp new file mode 100644 index 0000000000..ea36677237 --- /dev/null +++ b/memtrack/aidl/vts/Android.bp @@ -0,0 +1,17 @@ +cc_test { + name: "VtsHalMemtrackTargetTest", + defaults: [ + "VtsHalTargetTestDefaults", + "use_libaidlvintf_gtest_helper_static", + ], + srcs: ["VtsHalMemtrackTargetTest.cpp"], + shared_libs: [ + "libbinder_ndk", + ], + static_libs: [ + "android.hardware.memtrack-unstable-ndk_platform", + ], + test_suites: [ + "vts-core", + ], +} diff --git a/memtrack/aidl/vts/VtsHalMemtrackTargetTest.cpp b/memtrack/aidl/vts/VtsHalMemtrackTargetTest.cpp new file mode 100644 index 0000000000..4d331014ba --- /dev/null +++ b/memtrack/aidl/vts/VtsHalMemtrackTargetTest.cpp @@ -0,0 +1,91 @@ +/* + * Copyright (C) 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. + */ +#include <aidl/Gtest.h> +#include <aidl/Vintf.h> + +#include <aidl/android/hardware/memtrack/DeviceInfo.h> +#include <aidl/android/hardware/memtrack/IMemtrack.h> +#include <aidl/android/hardware/memtrack/MemtrackType.h> +#include <android/binder_manager.h> +#include <android/binder_process.h> + +using aidl::android::hardware::memtrack::DeviceInfo; +using aidl::android::hardware::memtrack::IMemtrack; +using aidl::android::hardware::memtrack::MemtrackRecord; +using aidl::android::hardware::memtrack::MemtrackType; + +class MemtrackAidlTest : public testing::TestWithParam<std::string> { + public: + virtual void SetUp() override { + const auto instance = GetParam(); + ASSERT_TRUE(AServiceManager_isDeclared(instance.c_str())); + auto memtrackBinder = ndk::SpAIBinder(AServiceManager_waitForService(instance.c_str())); + memtrack_ = IMemtrack::fromBinder(memtrackBinder); + ASSERT_NE(memtrack_, nullptr); + } + + std::shared_ptr<IMemtrack> memtrack_; +}; + +TEST_P(MemtrackAidlTest, GetMemoryInvalidPid) { + int pid = -1; + MemtrackType type = MemtrackType::OTHER; + std::vector<MemtrackRecord> records; + + auto status = memtrack_->getMemory(pid, type, &records); + + EXPECT_EQ(status.getExceptionCode(), EX_ILLEGAL_ARGUMENT); +} + +TEST_P(MemtrackAidlTest, GetMemoryInvalidType) { + int pid = 1; + MemtrackType type = MemtrackType::NUM_TYPES; + std::vector<MemtrackRecord> records; + + auto status = memtrack_->getMemory(pid, type, &records); + + EXPECT_EQ(status.getExceptionCode(), EX_UNSUPPORTED_OPERATION); +} + +TEST_P(MemtrackAidlTest, GetMemory) { + int pid = 1; + MemtrackType type = MemtrackType::OTHER; + std::vector<MemtrackRecord> records; + + auto status = memtrack_->getMemory(pid, type, &records); + + EXPECT_TRUE(status.isOk()); +} + +TEST_P(MemtrackAidlTest, GetGpuDeviceInfo) { + std::vector<DeviceInfo> device_info; + + auto status = memtrack_->getGpuDeviceInfo(&device_info); + + EXPECT_TRUE(status.isOk()); +} + +GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(MemtrackAidlTest); +INSTANTIATE_TEST_SUITE_P(PerInstance, MemtrackAidlTest, + testing::ValuesIn(android::getAidlHalInstanceNames(IMemtrack::descriptor)), + android::PrintInstanceNameToString); + +int main(int argc, char** argv) { + ::testing::InitGoogleTest(&argc, argv); + ABinderProcess_setThreadPoolMaxThreadCount(1); + ABinderProcess_startThreadPool(); + return RUN_ALL_TESTS(); +} |