diff options
| author | 2023-02-10 08:34:08 +0000 | |
|---|---|---|
| committer | 2023-02-10 08:34:08 +0000 | |
| commit | 1eb3edeaa98e150613b88c8feca74109bc1a07dd (patch) | |
| tree | b72e2e41e6c616e013c1bc6339fd22af2856bd03 | |
| parent | a718db262790726fcfdf487c1f634817d14e3dcb (diff) | |
| parent | 4d9420e4a71ef080a31634ff7987fe5789889a7d (diff) | |
Merge "Revert "Revert "libbinder: Build and run binderRpcTest on Trusty"""
| -rw-r--r-- | libs/binder/Android.bp | 2 | ||||
| -rw-r--r-- | libs/binder/tests/Android.bp | 26 | ||||
| -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, 228 insertions, 10 deletions
diff --git a/libs/binder/Android.bp b/libs/binder/Android.bp index eb130de8ab..02b4de8f4c 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..e609987725 100644 --- a/libs/binder/tests/Android.bp +++ b/libs/binder/tests/Android.bp @@ -370,6 +370,31 @@ cc_binary {      ],  } +cc_binary { +    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", +        "libgtest", +    ], +} +  cc_test {      name: "binderRpcTest",      defaults: [ @@ -382,6 +407,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 \ +  |