From feed84d11dbf625869d3f57868dbb718881f8185 Mon Sep 17 00:00:00 2001 From: Yifan Hong Date: Wed, 13 Jan 2021 14:56:51 -0800 Subject: [PATCH] Add default impl for health storage AIDL HAL Test: VTS Bug: 177470478 Change-Id: I23c32d51d40a681eb1d56b8f9fc59f1d4caaad2a --- health/storage/aidl/default/Android.bp | 53 ++++++++++++++++++ health/storage/aidl/default/Storage.cpp | 54 +++++++++++++++++++ health/storage/aidl/default/Storage.h | 30 +++++++++++ .../aidl/default/health-storage-default.rc | 7 +++ .../aidl/default/health-storage-default.xml | 7 +++ health/storage/aidl/default/main.cpp | 37 +++++++++++++ 6 files changed, 188 insertions(+) create mode 100644 health/storage/aidl/default/Android.bp create mode 100644 health/storage/aidl/default/Storage.cpp create mode 100644 health/storage/aidl/default/Storage.h create mode 100644 health/storage/aidl/default/health-storage-default.rc create mode 100644 health/storage/aidl/default/health-storage-default.xml create mode 100644 health/storage/aidl/default/main.cpp diff --git a/health/storage/aidl/default/Android.bp b/health/storage/aidl/default/Android.bp new file mode 100644 index 0000000000..68a8ee267f --- /dev/null +++ b/health/storage/aidl/default/Android.bp @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2021 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_defaults { + name: "libhealth_storage_impl_defaults", + vendor: true, + shared_libs: [ + "libbase", + "libbinder_ndk", + "android.hardware.health.storage-unstable-ndk_platform", + ], + static_libs: [ + "libfstab", + "libhealth_storage_impl_common", + ], +} + +cc_library_static { + name: "libhealth_storage_default_impl", + defaults: ["libhealth_storage_impl_defaults"], + srcs: [ + "Storage.cpp", + ], + visibility: [ + ":__subpackages__", + "//hardware/interfaces/tests/extension/health/storage:__subpackages__", + ], +} + +cc_binary { + name: "android.hardware.health.storage-service.default", + defaults: ["libhealth_storage_impl_defaults"], + relative_install_path: "hw", + init_rc: ["health-storage-default.rc"], + vintf_fragments: ["health-storage-default.xml"], + srcs: ["main.cpp"], + static_libs: [ + "libhealth_storage_default_impl", + ], +} diff --git a/health/storage/aidl/default/Storage.cpp b/health/storage/aidl/default/Storage.cpp new file mode 100644 index 0000000000..faa4ff6e60 --- /dev/null +++ b/health/storage/aidl/default/Storage.cpp @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2021 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 "Storage.h" + +#include + +#include +#include + +using ::android::hardware::health::storage::DebugDump; +using ::android::hardware::health::storage::GarbageCollect; + +using HResult = android::hardware::health::storage::V1_0::Result; +using AResult = aidl::android::hardware::health::storage::Result; +// Ensure static_cast(any HResult) works +static_assert(static_cast(HResult::SUCCESS) == AResult::SUCCESS); +static_assert(static_cast(HResult::IO_ERROR) == AResult::IO_ERROR); +static_assert(static_cast(HResult::UNKNOWN_ERROR) == AResult::UNKNOWN_ERROR); + +namespace aidl::android::hardware::health::storage { + +ndk::ScopedAStatus Storage::garbageCollect( + int64_t timeout_seconds, const std::shared_ptr& callback) { + AResult result = static_cast(GarbageCollect(static_cast(timeout_seconds))); + if (callback != nullptr) { + auto status = callback->onFinish(result); + if (!status.isOk()) { + LOG(WARNING) << "Cannot return result " << toString(result) + << " to callback: " << status.getDescription(); + } + } + return ndk::ScopedAStatus::ok(); +} + +binder_status_t Storage::dump(int fd, const char**, uint32_t) { + DebugDump(fd); + return STATUS_OK; +} + +} // namespace aidl::android::hardware::health::storage diff --git a/health/storage/aidl/default/Storage.h b/health/storage/aidl/default/Storage.h new file mode 100644 index 0000000000..049991b679 --- /dev/null +++ b/health/storage/aidl/default/Storage.h @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2021 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 + +namespace aidl::android::hardware::health::storage { + +class Storage : public BnStorage { + ndk::ScopedAStatus garbageCollect( + int64_t timeout_seconds, + const std::shared_ptr& callback) override; + binder_status_t dump(int fd, const char** args, uint32_t num_args) override; +}; + +} // namespace aidl::android::hardware::health::storage diff --git a/health/storage/aidl/default/health-storage-default.rc b/health/storage/aidl/default/health-storage-default.rc new file mode 100644 index 0000000000..fc1cc8b3a5 --- /dev/null +++ b/health/storage/aidl/default/health-storage-default.rc @@ -0,0 +1,7 @@ +service vendor.health-storage-default /vendor/bin/hw/android.hardware.health.storage-service.default + interface aidl android.hardware.health.storage.IStorage/default + oneshot + disabled + class hal + user system + group system diff --git a/health/storage/aidl/default/health-storage-default.xml b/health/storage/aidl/default/health-storage-default.xml new file mode 100644 index 0000000000..14d4901823 --- /dev/null +++ b/health/storage/aidl/default/health-storage-default.xml @@ -0,0 +1,7 @@ + + + android.hardware.health.storage + 1 + IStorage/default + + diff --git a/health/storage/aidl/default/main.cpp b/health/storage/aidl/default/main.cpp new file mode 100644 index 0000000000..186b64c0c5 --- /dev/null +++ b/health/storage/aidl/default/main.cpp @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2021 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 + +#include "Storage.h" + +using aidl::android::hardware::health::storage::Storage; +using std::string_literals::operator""s; + +int main() { + ABinderProcess_setThreadPoolMaxThreadCount(0); + + // make a default storage service + auto storage = ndk::SharedRefBase::make(); + const std::string name = Storage::descriptor + "/default"s; + CHECK_EQ(STATUS_OK, + AServiceManager_registerLazyService(storage->asBinder().get(), name.c_str())); + + ABinderProcess_joinThreadPool(); + return EXIT_FAILURE; // should not reach +}