xref: /aosp_15_r20/frameworks/native/libs/binder/tests/binderRpcTestTrusty.cpp (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  * Copyright (C) 2022 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker  *
4*38e8c45fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker  *
8*38e8c45fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker  *
10*38e8c45fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker  * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker  */
16*38e8c45fSAndroid Build Coastguard Worker 
17*38e8c45fSAndroid Build Coastguard Worker #define LOG_TAG "binderRpcTest"
18*38e8c45fSAndroid Build Coastguard Worker 
19*38e8c45fSAndroid Build Coastguard Worker #include <binder/RpcTransportTipcTrusty.h>
20*38e8c45fSAndroid Build Coastguard Worker #include <trusty-gtest.h>
21*38e8c45fSAndroid Build Coastguard Worker #include <trusty_ipc.h>
22*38e8c45fSAndroid Build Coastguard Worker 
23*38e8c45fSAndroid Build Coastguard Worker #include "binderRpcTestFixture.h"
24*38e8c45fSAndroid Build Coastguard Worker 
25*38e8c45fSAndroid Build Coastguard Worker using android::binder::unique_fd;
26*38e8c45fSAndroid Build Coastguard Worker 
27*38e8c45fSAndroid Build Coastguard Worker namespace android {
28*38e8c45fSAndroid Build Coastguard Worker 
29*38e8c45fSAndroid Build Coastguard Worker // Destructors need to be defined, even if pure virtual
~ProcessSession()30*38e8c45fSAndroid Build Coastguard Worker ProcessSession::~ProcessSession() {}
31*38e8c45fSAndroid Build Coastguard Worker 
32*38e8c45fSAndroid Build Coastguard Worker class TrustyProcessSession : public ProcessSession {
33*38e8c45fSAndroid Build Coastguard Worker public:
~TrustyProcessSession()34*38e8c45fSAndroid Build Coastguard Worker     ~TrustyProcessSession() override {}
35*38e8c45fSAndroid Build Coastguard Worker 
setCustomExitStatusCheck(std::function<void (int wstatus)>)36*38e8c45fSAndroid Build Coastguard Worker     void setCustomExitStatusCheck(std::function<void(int wstatus)> /*f*/) override {
37*38e8c45fSAndroid Build Coastguard Worker         LOG_ALWAYS_FATAL("setCustomExitStatusCheck() not supported");
38*38e8c45fSAndroid Build Coastguard Worker     }
39*38e8c45fSAndroid Build Coastguard Worker 
terminate()40*38e8c45fSAndroid Build Coastguard Worker     void terminate() override { LOG_ALWAYS_FATAL("terminate() not supported"); }
41*38e8c45fSAndroid Build Coastguard Worker };
42*38e8c45fSAndroid Build Coastguard Worker 
newFactory(RpcSecurity rpcSecurity)43*38e8c45fSAndroid Build Coastguard Worker std::unique_ptr<RpcTransportCtxFactory> BinderRpc::newFactory(RpcSecurity rpcSecurity) {
44*38e8c45fSAndroid Build Coastguard Worker     switch (rpcSecurity) {
45*38e8c45fSAndroid Build Coastguard Worker         case RpcSecurity::RAW:
46*38e8c45fSAndroid Build Coastguard Worker             return RpcTransportCtxFactoryTipcTrusty::make();
47*38e8c45fSAndroid Build Coastguard Worker         default:
48*38e8c45fSAndroid Build Coastguard Worker             LOG_ALWAYS_FATAL("Unknown RpcSecurity %d", static_cast<int>(rpcSecurity));
49*38e8c45fSAndroid Build Coastguard Worker     }
50*38e8c45fSAndroid Build Coastguard Worker }
51*38e8c45fSAndroid Build Coastguard Worker 
52*38e8c45fSAndroid Build Coastguard Worker // This creates a new process serving an interface on a certain number of
53*38e8c45fSAndroid Build Coastguard Worker // threads.
createRpcTestSocketServerProcessEtc(const BinderRpcOptions & options)54*38e8c45fSAndroid Build Coastguard Worker std::unique_ptr<ProcessSession> BinderRpc::createRpcTestSocketServerProcessEtc(
55*38e8c45fSAndroid Build Coastguard Worker         const BinderRpcOptions& options) {
56*38e8c45fSAndroid Build Coastguard Worker     LOG_ALWAYS_FATAL_IF(std::any_of(options.numIncomingConnectionsBySession.begin(),
57*38e8c45fSAndroid Build Coastguard Worker                                     options.numIncomingConnectionsBySession.end(),
58*38e8c45fSAndroid Build Coastguard Worker                                     [](size_t n) { return n != 0; }),
59*38e8c45fSAndroid Build Coastguard Worker                         "Non-zero incoming connections on Trusty");
60*38e8c45fSAndroid Build Coastguard Worker 
61*38e8c45fSAndroid Build Coastguard Worker     RpcSecurity rpcSecurity = GetParam().security;
62*38e8c45fSAndroid Build Coastguard Worker     uint32_t clientVersion = GetParam().clientVersion;
63*38e8c45fSAndroid Build Coastguard Worker     uint32_t serverVersion = GetParam().serverVersion;
64*38e8c45fSAndroid Build Coastguard Worker 
65*38e8c45fSAndroid Build Coastguard Worker     auto ret = std::make_unique<TrustyProcessSession>();
66*38e8c45fSAndroid Build Coastguard Worker 
67*38e8c45fSAndroid Build Coastguard Worker     status_t status;
68*38e8c45fSAndroid Build Coastguard Worker     for (size_t i = 0; i < options.numSessions; i++) {
69*38e8c45fSAndroid Build Coastguard Worker         auto session = android::RpcSession::make(newFactory(rpcSecurity));
70*38e8c45fSAndroid Build Coastguard Worker 
71*38e8c45fSAndroid Build Coastguard Worker         EXPECT_TRUE(session->setProtocolVersion(clientVersion));
72*38e8c45fSAndroid Build Coastguard Worker         session->setMaxOutgoingConnections(options.numOutgoingConnections);
73*38e8c45fSAndroid Build Coastguard Worker         session->setFileDescriptorTransportMode(options.clientFileDescriptorTransportMode);
74*38e8c45fSAndroid Build Coastguard Worker 
75*38e8c45fSAndroid Build Coastguard Worker         status = session->setupPreconnectedClient({}, [&]() {
76*38e8c45fSAndroid Build Coastguard Worker             auto port = trustyIpcPort(serverVersion);
77*38e8c45fSAndroid Build Coastguard Worker             int rc = connect(port.c_str(), IPC_CONNECT_WAIT_FOR_PORT);
78*38e8c45fSAndroid Build Coastguard Worker             LOG_ALWAYS_FATAL_IF(rc < 0, "Failed to connect to service: %d", rc);
79*38e8c45fSAndroid Build Coastguard Worker             return unique_fd(rc);
80*38e8c45fSAndroid Build Coastguard Worker         });
81*38e8c45fSAndroid Build Coastguard Worker         if (options.allowConnectFailure && status != OK) {
82*38e8c45fSAndroid Build Coastguard Worker             ret->sessions.clear();
83*38e8c45fSAndroid Build Coastguard Worker             break;
84*38e8c45fSAndroid Build Coastguard Worker         }
85*38e8c45fSAndroid Build Coastguard Worker         LOG_ALWAYS_FATAL_IF(status != OK, "Failed to connect to service: %s",
86*38e8c45fSAndroid Build Coastguard Worker                             statusToString(status).c_str());
87*38e8c45fSAndroid Build Coastguard Worker         ret->sessions.push_back({session, session->getRootObject()});
88*38e8c45fSAndroid Build Coastguard Worker     }
89*38e8c45fSAndroid Build Coastguard Worker 
90*38e8c45fSAndroid Build Coastguard Worker     return ret;
91*38e8c45fSAndroid Build Coastguard Worker }
92*38e8c45fSAndroid Build Coastguard Worker 
getTrustyBinderRpcParams()93*38e8c45fSAndroid Build Coastguard Worker static std::vector<BinderRpc::ParamType> getTrustyBinderRpcParams() {
94*38e8c45fSAndroid Build Coastguard Worker     std::vector<BinderRpc::ParamType> ret;
95*38e8c45fSAndroid Build Coastguard Worker 
96*38e8c45fSAndroid Build Coastguard Worker     for (const auto& clientVersion : testVersions()) {
97*38e8c45fSAndroid Build Coastguard Worker         for (const auto& serverVersion : testVersions()) {
98*38e8c45fSAndroid Build Coastguard Worker             ret.push_back(BinderRpc::ParamType{
99*38e8c45fSAndroid Build Coastguard Worker                     .type = SocketType::TIPC,
100*38e8c45fSAndroid Build Coastguard Worker                     .security = RpcSecurity::RAW,
101*38e8c45fSAndroid Build Coastguard Worker                     .clientVersion = clientVersion,
102*38e8c45fSAndroid Build Coastguard Worker                     .serverVersion = serverVersion,
103*38e8c45fSAndroid Build Coastguard Worker                     // TODO: should we test both versions here?
104*38e8c45fSAndroid Build Coastguard Worker                     .singleThreaded = false,
105*38e8c45fSAndroid Build Coastguard Worker                     .noKernel = true,
106*38e8c45fSAndroid Build Coastguard Worker             });
107*38e8c45fSAndroid Build Coastguard Worker         }
108*38e8c45fSAndroid Build Coastguard Worker     }
109*38e8c45fSAndroid Build Coastguard Worker 
110*38e8c45fSAndroid Build Coastguard Worker     return ret;
111*38e8c45fSAndroid Build Coastguard Worker }
112*38e8c45fSAndroid Build Coastguard Worker 
113*38e8c45fSAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(Trusty, BinderRpc, ::testing::ValuesIn(getTrustyBinderRpcParams()),
114*38e8c45fSAndroid Build Coastguard Worker                          BinderRpc::PrintParamInfo);
115*38e8c45fSAndroid Build Coastguard Worker 
116*38e8c45fSAndroid Build Coastguard Worker } // namespace android
117*38e8c45fSAndroid Build Coastguard Worker 
118*38e8c45fSAndroid Build Coastguard Worker PORT_GTEST(BinderRpcTest, "com.android.trusty.binderRpcTest");
119