diff options
-rw-r--r-- | libs/binder/Android.bp | 2 | ||||
-rw-r--r-- | libs/binder/tests/Android.bp | 25 | ||||
-rw-r--r-- | libs/binder/tests/binderRpcTestTrusty.cpp | 105 | ||||
-rw-r--r-- | libs/binder/tests/binderRpcUniversalTests.cpp | 20 | ||||
-rw-r--r-- | libs/binder/trusty/binderRpcTest/manifest.json | 6 | ||||
-rw-r--r-- | libs/binder/trusty/binderRpcTest/rules.mk | 35 | ||||
-rw-r--r-- | libs/binder/trusty/build-config-usertests | 19 | ||||
-rw-r--r-- | libs/binder/trusty/include_mock/trusty-gtest.h | 21 | ||||
-rw-r--r-- | libs/binder/trusty/include_mock/trusty_ipc.h | 2 | ||||
-rw-r--r-- | libs/binder/trusty/usertests-inc.mk | 2 |
10 files changed, 227 insertions, 10 deletions
diff --git a/libs/binder/Android.bp b/libs/binder/Android.bp index cebaf17937..d027a4fc69 100644 --- a/libs/binder/Android.bp +++ b/libs/binder/Android.bp @@ -215,6 +215,8 @@ cc_library_headers { cc_defaults { name: "trusty_mock_defaults", + vendor_available: true, + host_supported: true, header_libs: [ "trusty_mock_headers", diff --git a/libs/binder/tests/Android.bp b/libs/binder/tests/Android.bp index 7006f87314..458dff3523 100644 --- a/libs/binder/tests/Android.bp +++ b/libs/binder/tests/Android.bp @@ -371,6 +371,30 @@ cc_binary { } cc_test { + name: "binderRpcTest_on_trusty_mock", + defaults: [ + "trusty_mock_defaults", + ], + + srcs: [ + "binderRpcUniversalTests.cpp", + "binderRpcTestCommon.cpp", + "binderRpcTestTrusty.cpp", + ], + + shared_libs: [ + "libbinder_on_trusty_mock", + "libbase", + "libutils", + "libcutils", + ], + + static_libs: [ + "binderRpcTestIface-cpp", + ], +} + +cc_test { name: "binderRpcTest", defaults: [ "binderRpcTest_defaults", @@ -382,6 +406,7 @@ cc_test { required: [ "libbinder_on_trusty_mock", "binderRpcTestService_on_trusty_mock", + "binderRpcTest_on_trusty_mock", ], } diff --git a/libs/binder/tests/binderRpcTestTrusty.cpp b/libs/binder/tests/binderRpcTestTrusty.cpp new file mode 100644 index 0000000000..b3bb5ebda7 --- /dev/null +++ b/libs/binder/tests/binderRpcTestTrusty.cpp @@ -0,0 +1,105 @@ +/* + * Copyright (C) 2022 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. + */ + +#define LOG_TAG "binderRpcTest" + +#include <android-base/stringprintf.h> +#include <binder/RpcTransportTipcTrusty.h> +#include <trusty-gtest.h> +#include <trusty_ipc.h> + +#include "binderRpcTestFixture.h" + +namespace android { + +// Destructors need to be defined, even if pure virtual +ProcessSession::~ProcessSession() {} + +class TrustyProcessSession : public ProcessSession { +public: + ~TrustyProcessSession() override {} + + void setCustomExitStatusCheck(std::function<void(int wstatus)> /*f*/) override { + LOG_ALWAYS_FATAL("setCustomExitStatusCheck() not supported"); + } + + void terminate() override { LOG_ALWAYS_FATAL("terminate() not supported"); } +}; + +std::string BinderRpc::PrintParamInfo(const testing::TestParamInfo<ParamType>& info) { + auto [type, security, clientVersion, serverVersion, singleThreaded, noKernel] = info.param; + auto ret = PrintToString(type) + "_clientV" + std::to_string(clientVersion) + "_serverV" + + std::to_string(serverVersion); + if (singleThreaded) { + ret += "_single_threaded"; + } + if (noKernel) { + ret += "_no_kernel"; + } + return ret; +} + +// This creates a new process serving an interface on a certain number of +// threads. +std::unique_ptr<ProcessSession> BinderRpc::createRpcTestSocketServerProcessEtc( + const BinderRpcOptions& options) { + LOG_ALWAYS_FATAL_IF(options.numIncomingConnections != 0, + "Non-zero incoming connections %zu on Trusty", + options.numIncomingConnections); + + uint32_t clientVersion = std::get<2>(GetParam()); + uint32_t serverVersion = std::get<3>(GetParam()); + + auto ret = std::make_unique<TrustyProcessSession>(); + + status_t status; + for (size_t i = 0; i < options.numSessions; i++) { + auto factory = android::RpcTransportCtxFactoryTipcTrusty::make(); + auto session = android::RpcSession::make(std::move(factory)); + + EXPECT_TRUE(session->setProtocolVersion(clientVersion)); + session->setMaxOutgoingThreads(options.numOutgoingConnections); + session->setFileDescriptorTransportMode(options.clientFileDescriptorTransportMode); + + status = session->setupPreconnectedClient({}, [&]() { + auto port = trustyIpcPort(serverVersion); + int rc = connect(port.c_str(), IPC_CONNECT_WAIT_FOR_PORT); + LOG_ALWAYS_FATAL_IF(rc < 0, "Failed to connect to service: %d", rc); + return base::unique_fd(rc); + }); + if (options.allowConnectFailure && status != OK) { + ret->sessions.clear(); + break; + } + LOG_ALWAYS_FATAL_IF(status != OK, "Failed to connect to service: %s", + statusToString(status).c_str()); + ret->sessions.push_back({session, session->getRootObject()}); + } + + return ret; +} + +INSTANTIATE_TEST_CASE_P(Trusty, BinderRpc, + ::testing::Combine(::testing::Values(SocketType::TIPC), + ::testing::Values(RpcSecurity::RAW), + ::testing::ValuesIn(testVersions()), + ::testing::ValuesIn(testVersions()), + ::testing::Values(false), ::testing::Values(true)), + BinderRpc::PrintParamInfo); + +} // namespace android + +PORT_GTEST(BinderRpcTest, "com.android.trusty.binderRpcTest"); diff --git a/libs/binder/tests/binderRpcUniversalTests.cpp b/libs/binder/tests/binderRpcUniversalTests.cpp index 2249e5ca0a..11a22b0fb6 100644 --- a/libs/binder/tests/binderRpcUniversalTests.cpp +++ b/libs/binder/tests/binderRpcUniversalTests.cpp @@ -386,11 +386,11 @@ TEST_P(BinderRpc, SameBinderEqualityWeak) { EXPECT_EQ(b, weak.promote()); } -#define expectSessions(expected, iface) \ +#define EXPECT_SESSIONS(expected, iface) \ do { \ int session; \ EXPECT_OK((iface)->getNumOpenSessions(&session)); \ - EXPECT_EQ(expected, session); \ + EXPECT_EQ(static_cast<int>(expected), session); \ } while (false) TEST_P(BinderRpc, SingleSession) { @@ -402,9 +402,9 @@ TEST_P(BinderRpc, SingleSession) { EXPECT_OK(session->getName(&out)); EXPECT_EQ("aoeu", out); - expectSessions(1, proc.rootIface); + EXPECT_SESSIONS(1, proc.rootIface); session = nullptr; - expectSessions(0, proc.rootIface); + EXPECT_SESSIONS(0, proc.rootIface); } TEST_P(BinderRpc, ManySessions) { @@ -413,24 +413,24 @@ TEST_P(BinderRpc, ManySessions) { std::vector<sp<IBinderRpcSession>> sessions; for (size_t i = 0; i < 15; i++) { - expectSessions(i, proc.rootIface); + EXPECT_SESSIONS(i, proc.rootIface); sp<IBinderRpcSession> session; EXPECT_OK(proc.rootIface->openSession(std::to_string(i), &session)); sessions.push_back(session); } - expectSessions(sessions.size(), proc.rootIface); + EXPECT_SESSIONS(sessions.size(), proc.rootIface); for (size_t i = 0; i < sessions.size(); i++) { std::string out; EXPECT_OK(sessions.at(i)->getName(&out)); EXPECT_EQ(std::to_string(i), out); } - expectSessions(sessions.size(), proc.rootIface); + EXPECT_SESSIONS(sessions.size(), proc.rootIface); while (!sessions.empty()) { sessions.pop_back(); - expectSessions(sessions.size(), proc.rootIface); + EXPECT_SESSIONS(sessions.size(), proc.rootIface); } - expectSessions(0, proc.rootIface); + EXPECT_SESSIONS(0, proc.rootIface); } TEST_P(BinderRpc, OnewayCallDoesNotWait) { @@ -483,7 +483,7 @@ TEST_P(BinderRpc, Callbacks) { cb->mCv.wait_for(_l, 1s, [&] { return !cb->mValues.empty(); }); } - EXPECT_EQ(cb->mValues.size(), 1) + EXPECT_EQ(cb->mValues.size(), 1UL) << "callIsOneway: " << callIsOneway << " callbackIsOneway: " << callbackIsOneway << " delayed: " << delayed; if (cb->mValues.empty()) continue; diff --git a/libs/binder/trusty/binderRpcTest/manifest.json b/libs/binder/trusty/binderRpcTest/manifest.json new file mode 100644 index 0000000000..d8b080f0d4 --- /dev/null +++ b/libs/binder/trusty/binderRpcTest/manifest.json @@ -0,0 +1,6 @@ +{ + "uuid": "9dbe9fb8-60fd-4bdd-af86-03e95d7ad78b", + "app_name": "binderRpcTest", + "min_heap": 163840, + "min_stack": 16384 +} diff --git a/libs/binder/trusty/binderRpcTest/rules.mk b/libs/binder/trusty/binderRpcTest/rules.mk new file mode 100644 index 0000000000..ae3949246d --- /dev/null +++ b/libs/binder/trusty/binderRpcTest/rules.mk @@ -0,0 +1,35 @@ +# Copyright (C) 2022 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. +# + +LOCAL_DIR := $(GET_LOCAL_DIR) +LIBBINDER_TESTS_DIR := frameworks/native/libs/binder/tests + +MODULE := $(LOCAL_DIR) + +MANIFEST := $(LOCAL_DIR)/manifest.json + +MODULE_SRCS += \ + $(LIBBINDER_TESTS_DIR)/binderRpcUniversalTests.cpp \ + $(LIBBINDER_TESTS_DIR)/binderRpcTestCommon.cpp \ + $(LIBBINDER_TESTS_DIR)/binderRpcTestTrusty.cpp \ + +MODULE_LIBRARY_DEPS += \ + $(LOCAL_DIR)/aidl \ + frameworks/native/libs/binder/trusty \ + frameworks/native/libs/binder/trusty/ndk \ + trusty/user/base/lib/googletest \ + trusty/user/base/lib/libstdc++-trusty \ + +include make/trusted_app.mk diff --git a/libs/binder/trusty/build-config-usertests b/libs/binder/trusty/build-config-usertests new file mode 100644 index 0000000000..d0a1fbca49 --- /dev/null +++ b/libs/binder/trusty/build-config-usertests @@ -0,0 +1,19 @@ +# Copyright (C) 2022 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. + +# This file lists userspace tests + +[ + porttest("com.android.trusty.binderRpcTest"), +] diff --git a/libs/binder/trusty/include_mock/trusty-gtest.h b/libs/binder/trusty/include_mock/trusty-gtest.h new file mode 100644 index 0000000000..046b403553 --- /dev/null +++ b/libs/binder/trusty/include_mock/trusty-gtest.h @@ -0,0 +1,21 @@ +/* + * Copyright (C) 2022 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 + +#define PORT_GTEST(suite, port) \ + int main(void) { \ + return 0; \ + } diff --git a/libs/binder/trusty/include_mock/trusty_ipc.h b/libs/binder/trusty/include_mock/trusty_ipc.h index 43ab84a424..db044c2c04 100644 --- a/libs/binder/trusty/include_mock/trusty_ipc.h +++ b/libs/binder/trusty/include_mock/trusty_ipc.h @@ -27,6 +27,8 @@ #define IPC_PORT_ALLOW_TA_CONNECT 0x1 #define IPC_PORT_ALLOW_NS_CONNECT 0x2 +#define IPC_CONNECT_WAIT_FOR_PORT 0x1 + #define IPC_HANDLE_POLL_HUP 0x1 #define IPC_HANDLE_POLL_MSG 0x2 #define IPC_HANDLE_POLL_SEND_UNBLOCKED 0x4 diff --git a/libs/binder/trusty/usertests-inc.mk b/libs/binder/trusty/usertests-inc.mk index 2f5a7f479b..13001219d4 100644 --- a/libs/binder/trusty/usertests-inc.mk +++ b/libs/binder/trusty/usertests-inc.mk @@ -14,4 +14,6 @@ # TRUSTY_USER_TESTS += \ + frameworks/native/libs/binder/trusty/binderRpcTest \ frameworks/native/libs/binder/trusty/binderRpcTest/service \ + |